import { useState } from "react"; export { default as Dialog } from "./Dialog"; export { default as FullPageDialog } from "./FullPageDialog"; export { default as OperationDialog } from "./OperationDialog"; export { default as ConfirmDialog } from "./ConfirmDialog"; export { default as DialogContainer } from "./DialogContainer"; type DialogMap = { [K in D]: V; }; type DialogKeyMap = DialogMap; type DialogPropsMap = DialogMap< D, { key: number | string; open: boolean; onClose: () => void } >; export function useDialog( dialogs: D[], options?: { initDialog?: D | null; onClose?: { [K in D]?: () => void; }; }, ): { dialog: D | null; switchDialog: (newDialog: D | null) => void; dialogPropsMap: DialogPropsMap; createDialogSwitch: (newDialog: D | null) => () => void; } { const [dialog, setDialog] = useState(options?.initDialog ?? null); const [dialogKeys, setDialogKeys] = useState>( () => Object.fromEntries(dialogs.map((d) => [d, 0])) as DialogKeyMap, ); const switchDialog = (newDialog: D | null) => { if (dialog !== null) { setDialogKeys({ ...dialogKeys, [dialog]: dialogKeys[dialog] + 1 }); } setDialog(newDialog); }; return { dialog, switchDialog, dialogPropsMap: Object.fromEntries( dialogs.map((d) => [ d, { key: `${d}-${dialogKeys[d]}`, open: dialog === d, onClose: () => { switchDialog(null); options?.onClose?.[d]?.(); }, }, ]), ) as DialogPropsMap, createDialogSwitch: (newDialog: D | null) => () => switchDialog(newDialog), }; }