import { useCallback, useEffect, useMemo, useState } from 'react'; import type { ReactNode } from 'react'; import { useStatusToast } from '../lib/context/StatusToastContext'; import TagsPanel from '../tags/TagsPanel'; import CorrespondentsPanel, { CorrespondentsPanelProps } from '../correspondents/CorrespondentsPanel'; import PanelHeader from '../components/PanelHeader'; import { CloseIcon } from '../components/icons'; import { CORRESPONDENTS_MODAL, TAGS_MODAL } from '../constants/app'; import type { Tag, Correspondent } from '../types/documents'; import type CorrespondentManager from '../lib/assets/CorrespondentManager'; import type { Identifier } from '../types/identifiers'; interface UseManagementModalsArgs { locationPathname?: string; tags?: Tag[]; refreshTags?: () => void | Promise; onTagCreate?: (...args: any[]) => void | Promise; onTagUpdate?: (...args: any[]) => void | Promise; onTagDelete?: (...args: any[]) => void | Promise; correspondents?: Correspondent[]; correspondentLookupById?: Map | null; correspondentLookupByName?: Map | null; refreshCorrespondents?: () => void | Promise; onCorrespondentCreate?: (...args: any[]) => void | Promise; onCorrespondentUpdate?: (...args: any[]) => void | Promise; onCorrespondentDelete?: (...args: any[]) => void | Promise; correspondentManager?: CorrespondentManager | null; } 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, }: UseManagementModalsArgs): UseManagementModalsResult => { const { showToast } = useStatusToast(); 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()} > )} />
); }, [ activeModal, closeActiveModal, onTagCreate, onTagDelete, onTagUpdate, refreshTags, showToast, tags, ]); const handleCorrespondentCreateSafe = useCallback( async (payload) => { if (!onCorrespondentCreate) { return undefined; } return onCorrespondentCreate(payload) ?? undefined; }, [onCorrespondentCreate], ); const handleCorrespondentUpdateSafe = useCallback( async (id, payload) => { if (!onCorrespondentUpdate) { return; } await onCorrespondentUpdate(id, payload); }, [onCorrespondentUpdate], ); const handleCorrespondentDeleteSafe = useCallback( async (id) => { if (!onCorrespondentDelete) { return; } await onCorrespondentDelete(id); }, [onCorrespondentDelete], ); const correspondentsModal = useMemo(() => { if (activeModal !== CORRESPONDENTS_MODAL) { return null; } return (
event.stopPropagation()} > )} />
); }, [ activeModal, closeActiveModal, correspondents, handleCorrespondentCreateSafe, handleCorrespondentDeleteSafe, handleCorrespondentUpdateSafe, refreshCorrespondents, showToast, ]); const managementModals = ( <> {tagModal} {correspondentsModal} ); return { managementModals, openTagsModal, openCorrespondentsModal, closeActiveModal, activeModal, }; };