// ECO-PANNEAU.FR - _react/clients/_clients_address_book.jsx window.pano_AddressBookModal = ({ data, showToast, refreshData, openLocalDialog, closeCurrentLayer, activeDialog, onClose }) => { // ZÉRO-DETTE : Utilisation du Hook abstrait const { isMounted, safeFetch } = window.pano_useSafeFetch(); const { useState } = React; const [isSaving, setIsSaving] = useState(false); const [confirmConfig, setConfirmConfig] = useState(null); const [activeTab, setActiveTab] = useState('contacts'); // 'contacts' ou 'blocked' // 1. - Composants et Icônes const { UsersIcon, Trash2Icon, ShieldIcon, UnlockIcon } = window.pano_getIcons(); const { Button, ConfirmModal, CardGrid, DataCard, Modal } = window.pano_getComponents(); const teamHistory = data.team || []; // Séparation logique des contacts const normalContacts = teamHistory.filter(tm => tm.status !== 'blocked'); const blockedContacts = teamHistory.filter(tm => tm.status === 'blocked'); // 2. - Actions métier const handleRemoveGlobalCollaborator = (targetEmail) => { setConfirmConfig({ title: "Supprimer le contact", message: "Voulez-vous supprimer définitivement ce contact de votre carnet d'adresses et de votre historique ?", confirmText: "Supprimer", cancelText: "Annuler", isDestructive: true, onConfirm: async () => { closeCurrentLayer(); const d = await safeFetch('clients/team/remove', { body: { email: targetEmail }, setLoading: setIsSaving, successMessage: "Contact supprimé de l'historique." }); if (!isMounted.current) return; if (d && refreshData) refreshData(); } }); openLocalDialog('confirm_address_book'); }; const handleUnblockContact = (targetHash) => { setConfirmConfig({ title: "Débloquer le contact", message: "Ce contact pourra à nouveau vous envoyer des messages. Confirmer le déblocage ?", confirmText: "Débloquer", cancelText: "Annuler", onConfirm: async () => { closeCurrentLayer(); const d = await safeFetch('address_book/unblock', { body: { target_hash: targetHash }, setLoading: setIsSaving, successMessage: "Contact débloqué avec succès." }); if (!isMounted.current) return; if (d && refreshData) refreshData(); } }); openLocalDialog('confirm_address_book'); }; // 3. - Rendu UI return ( ( )} >
{activeTab === 'contacts' && (
Cet onglet liste l'intégralité des collaborateurs passés ou présents. La gestion de leurs droits d'accès s'effectue individuellement pour chaque panneau.
{normalContacts.length === 0 ? (
{UsersIcon && }

Aucun contact dans votre carnet.

) : ( {[...normalContacts].sort((a,b) => (a.company || '').localeCompare(b.company || '')).map((member, i) => (
Société / Contact

{member.company}

{member.name}

Panneaux {member.active_panels > 0 ? ( {window.pano_formatPlural(member.active_panels, 'Actif', 'Actifs')} ) : ( Aucun )}
E-mail {member.email}
))}
)}
)} {activeTab === 'blocked' && (
Ces utilisateurs ont été bloqués. Ils ne peuvent plus vous envoyer de messages via les conversations riverains ou via vos panneaux.
{blockedContacts.length === 0 ? (
{ShieldIcon && }

Aucun contact bloqué.

) : ( {[...blockedContacts].map((member, i) => (
Contact bloqué

{member.company}

{member.name}

))}
)}
)}
{activeDialog === 'confirm_address_book' && confirmConfig && ConfirmModal && ( { setConfirmConfig(null); closeCurrentLayer(); }} /> )}
); };