All files / components/componentOffre OffresManagement.tsx

16.32% Statements 8/49
0% Branches 0/11
0% Functions 0/9
16.66% Lines 8/48

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141    1x 1x 1x   1x 1x 1x 1x   1x                                                                                                                                                                                                                                                                  
'use client';
 
import { useState } from 'react';
import { useOffresManagement } from '@/hooks/useOffreManagement';
import { useSessionExpiry } from '@/hooks/useSessionExpiry';
import { Offre } from '@/types/offre/offre';
import Notification from '@/components/notification';
import OffresHeader from "@/components/componentOffre/OffresHeader";
import OffreModal from "@/components/componentOffre/OffresModal";
import OffresTable from "@/components/componentOffre/OffresTable";
 
export default function OffresManagement() {
  useSessionExpiry();
 
  const {
    offres,
    loading,
    error,
    formLoading,
    createOffre,
    updateOffre,
    deleteOffre,
    setFormNotification,
  } = useOffresManagement();
 
  const [showModal, setShowModal] = useState(false);
  const [editingOffre, setEditingOffre] = useState<Offre | null>(null);
  const [notification, setNotification] = useState<{
    message: string;
    type: 'success' | 'error' | 'info';
  } | null>(null);
 
  const handleOpenModal = (offre?: Offre) => {
    setEditingOffre(offre || null);
    setShowModal(true);
  };
 
  const handleSaveOffre = async (offreData: Offre) => {
    try {
      let successMessage = '';
 
      if (editingOffre) {
        await updateOffre(editingOffre.id, offreData);
        successMessage = 'Offre modifiée avec succès';
      } else {
        await createOffre(offreData);
        successMessage = 'Offre créée avec succès';
      }
 
      // Fermer la modal
      setShowModal(false);
      setEditingOffre(null);
 
      // Afficher directement la notification de succès
      setNotification({
        message: successMessage,
        type: 'success'
      });
    } catch (err) {
      console.error(err);
      // En cas d'erreur, fermer la modal et afficher l'erreur
      setShowModal(false);
      setEditingOffre(null);
      setNotification({
        message: 'Erreur lors de la sauvegarde',
        type: 'error'
      });
    }
  };
 
  const handleDeleteOffre = async (id: number) => {
    // Trouver l'offre à supprimer pour afficher son nom dans la confirmation
    const offreToDelete = offres.find(offre => offre.id === id);
    const offreName = offreToDelete ? offreToDelete.libelle : 'cette offre';
 
    // Demander confirmation avant suppression
    Iif (window.confirm(`Êtes-vous sûr de vouloir supprimer l'offre "${offreName}" ?`)) {
      try {
        await deleteOffre(id);
        // Afficher directement la notification de succès
        setNotification({
          message: 'Offre supprimée avec succès',
          type: 'success'
        });
      } catch (err) {
        console.error(err);
        // Afficher la notification d'erreur
        setNotification({
          message: 'Erreur lors de la suppression',
          type: 'error'
        });
      }
    }
  };
 
  const handleCloseModal = () => {
    setShowModal(false);
    setEditingOffre(null);
    // Nettoyer formNotification sans l'afficher (cas d'annulation)
    setFormNotification(null);
  };
 
  return (
    <div className="min-h-screen bg-base-200">
      {/* Header */}
      <OffresHeader
        onCreateClick={() => handleOpenModal()}
      />
 
      {/* Main Content */}
      <main className="max-w-7xl mx-auto py-8 px-4 sm:px-6 lg:px-8">
        {/* Offres Table */}
        <OffresTable
          offres={offres}
          loading={loading}
          onDelete={handleDeleteOffre}
          onEdit={(offre: Offre) => handleOpenModal(offre)}
          error={error}
        />
      </main>
 
      <OffreModal
        isOpen={showModal}
        onClose={handleCloseModal}
        onSave={handleSaveOffre}
        loading={formLoading}
        offre={editingOffre || undefined}
      />
 
      {notification && (
        <Notification
          message={notification.message}
          type={notification.type}
          onClose={() => setNotification(null)}
          duration={1000}
        />
      )}
    </div>
  );
}