import { useCallback, useEffect, useMemo, useState } from 'react'; import type { ReactNode } from 'react'; import TagsPanel from '../tags/TagsPanel'; import CorrespondentsPanel, { CorrespondentsPanelProps } from '../correspondents/CorrespondentsPanel'; import PanelHeader from '../ui/PanelHeader'; const TAGS_MODAL = 'tags'; const CORRESPONDENTS_MODAL = 'correspondents'; interface TagRecord { id?: string | number; label?: string; [key: string]: unknown; } interface CorrespondentRecord { id?: string | number; name?: string; [key: string]: unknown; } interface UseManagementModalsArgs { locationPathname?: string; tags?: TagRecord[]; refreshTags?: () => void | Promise; onTagCreate?: (...args: any[]) => void | Promise; onTagUpdate?: (...args: any[]) => void | Promise; onTagDelete?: (...args: any[]) => void | Promise; correspondents?: CorrespondentRecord[]; refreshCorrespondents?: () => void | Promise; onCorrespondentCreate?: (...args: any[]) => void | Promise; onCorrespondentUpdate?: (...args: any[]) => void | Promise; onCorrespondentDelete?: (...args: any[]) => void | Promise; setStatusMessage?: (message: string, variant?: string) => void; } interface UseManagementModalsResult { managementModals: ReactNode; openTagsModal: () => void; openCorrespondentsModal: () => void; closeActiveModal: () => void; activeModal: string | null; } export const useManagementModals = ({ locationPathname, tags = [], refreshTags, onTagCreate, onTagUpdate, onTagDelete, correspondents = [], refreshCorrespondents, onCorrespondentCreate, onCorrespondentUpdate, onCorrespondentDelete, setStatusMessage, }: UseManagementModalsArgs): UseManagementModalsResult => { const [activeModal, setActiveModal] = useState(null); const openTagsModal = useCallback(() => setActiveModal(TAGS_MODAL), []); const openCorrespondentsModal = useCallback( () => setActiveModal(CORRESPONDENTS_MODAL), [], ); const closeActiveModal = useCallback(() => setActiveModal(null), []); useEffect(() => { setActiveModal(null); }, [locationPathname]); useEffect(() => { if (!activeModal) { return undefined; } const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { event.preventDefault(); setActiveModal(null); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [activeModal]); const tagModal = useMemo(() => { if (activeModal !== TAGS_MODAL) { return null; } return (
event.stopPropagation()} > Close )} />
); }, [ activeModal, closeActiveModal, onTagCreate, onTagDelete, onTagUpdate, refreshTags, setStatusMessage, tags, ]); const handleCorrespondentCreateSafe = useCallback( async (payload) => { if (typeof onCorrespondentCreate !== 'function') { return undefined; } return onCorrespondentCreate(payload) ?? undefined; }, [onCorrespondentCreate], ); const handleCorrespondentUpdateSafe = useCallback( async (id, payload) => { if (typeof onCorrespondentUpdate !== 'function') { return; } await onCorrespondentUpdate(id, payload); }, [onCorrespondentUpdate], ); const handleCorrespondentDeleteSafe = useCallback( async (id) => { if (typeof onCorrespondentDelete !== 'function') { return; } await onCorrespondentDelete(id); }, [onCorrespondentDelete], ); const correspondentsModal = useMemo(() => { if (activeModal !== CORRESPONDENTS_MODAL) { return null; } return (
event.stopPropagation()} > Close )} />
); }, [ activeModal, closeActiveModal, correspondents, handleCorrespondentCreateSafe, handleCorrespondentDeleteSafe, handleCorrespondentUpdateSafe, refreshCorrespondents, setStatusMessage, ]); const managementModals = ( <> {tagModal} {correspondentsModal} ); return { managementModals, openTagsModal, openCorrespondentsModal, closeActiveModal, activeModal, }; }; export default useManagementModals;