import { and, isNil, not } from 'ramda'; import { type Dispatch, type SetStateAction, useState } from 'react'; interface UnsavedDialogOpened { action: () => void; } interface PanelSubmitForm { submitForm: () => Promise; } interface Props { isValidForm: boolean; } interface UseUnsavedChanges { closeUnsavedDialog: () => void; discardUnsavedDialog: () => void; openUnsavedDialog: (action: () => void) => void; panelSubmitForm: PanelSubmitForm | null; savePanelChanges: () => void; setPanelSubmitForm: Dispatch>; setUnsavedDialogOpened: Dispatch>; unsavedDialogOpened: UnsavedDialogOpened | null; } const useUnsavedChanges = ({ isValidForm }: Props): UseUnsavedChanges => { const [unsavedDialogOpened, setUnsavedDialogOpened] = useState(null); const [panelSubmitForm, setPanelSubmitForm] = useState(null); const openUnsavedDialog = (action: () => void): void => { setUnsavedDialogOpened({ action }); }; const discardUnsavedDialog = (): void => { if (isNil(unsavedDialogOpened)) { return; } unsavedDialogOpened.action(); setUnsavedDialogOpened(null); }; const closeUnsavedDialog = (): void => { setUnsavedDialogOpened(null); }; const savePanelChanges = (): void => { if (and(isNil(panelSubmitForm), not(isValidForm))) { setUnsavedDialogOpened(null); return; } panelSubmitForm?.submitForm().then(() => { unsavedDialogOpened?.action(); }); }; return { closeUnsavedDialog, discardUnsavedDialog, openUnsavedDialog, panelSubmitForm, savePanelChanges, setPanelSubmitForm, setUnsavedDialogOpened, unsavedDialogOpened }; }; export default useUnsavedChanges;