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>
);
}
|