UNPKG

@mantine/modals

Version:

Modals manager based on Mantine components

1 lines 4.26 kB
{"version":3,"file":"reducer.cjs","names":[],"sources":["../src/reducer.ts"],"sourcesContent":["import { ModalSettings, ModalState, OpenContextModal } from './context';\n\ninterface ModalsState {\n modals: ModalState[];\n\n /**\n * Modal that is currently open or was the last open one.\n * Keeping the last one is necessary for providing a clean exit transition.\n */\n current: ModalState | null;\n}\n\ninterface OpenAction {\n type: 'OPEN';\n modal: ModalState;\n}\n\ninterface CloseAction {\n type: 'CLOSE';\n modalId: string;\n canceled?: boolean;\n}\n\ninterface CloseAllAction {\n type: 'CLOSE_ALL';\n canceled?: boolean;\n}\n\ninterface UpdateAction {\n type: 'UPDATE';\n modalId: string;\n newProps: Partial<ModalSettings>;\n}\n\nexport function handleCloseModal(modal: ModalState, canceled?: boolean) {\n if (canceled && modal.type === 'confirm') {\n modal.props.onCancel?.();\n }\n\n modal.props.onClose?.();\n}\n\nexport function modalsReducer(\n state: ModalsState,\n action: OpenAction | CloseAction | CloseAllAction | UpdateAction\n): ModalsState {\n switch (action.type) {\n case 'OPEN': {\n if (state.modals.some((modal) => modal.id === action.modal.id)) {\n return state;\n }\n return {\n current: action.modal,\n modals: [...state.modals, action.modal],\n };\n }\n case 'CLOSE': {\n const modal = state.modals.find((m) => m.id === action.modalId);\n if (!modal) {\n return state;\n }\n\n const remainingModals = state.modals.filter((m) => m.id !== action.modalId);\n\n return {\n current: remainingModals[remainingModals.length - 1] || state.current,\n modals: remainingModals,\n };\n }\n case 'CLOSE_ALL': {\n if (!state.modals.length) {\n return state;\n }\n\n return {\n current: state.current,\n modals: [],\n };\n }\n case 'UPDATE': {\n const { modalId, newProps } = action;\n\n const updatedModals = state.modals.map((modal) => {\n if (modal.id !== modalId) {\n return modal;\n }\n\n if (modal.type === 'content' || modal.type === 'confirm') {\n return {\n ...modal,\n props: {\n ...modal.props,\n ...newProps,\n },\n };\n }\n\n if (modal.type === 'context') {\n return {\n ...modal,\n props: {\n ...modal.props,\n ...newProps,\n innerProps: {\n ...modal.props.innerProps,\n ...(newProps as Partial<OpenContextModal<any>>).innerProps,\n },\n },\n };\n }\n\n return modal;\n });\n\n const currentModal =\n state.current?.id === modalId\n ? updatedModals.find((modal) => modal.id === modalId) || state.current\n : state.current;\n\n return {\n ...state,\n modals: updatedModals,\n current: currentModal,\n };\n }\n default: {\n return state;\n }\n }\n}\n"],"mappings":";;AAkCA,SAAgB,iBAAiB,OAAmB,UAAoB;CACtE,IAAI,YAAY,MAAM,SAAS,WAC7B,MAAM,MAAM,WAAW;CAGzB,MAAM,MAAM,UAAU;AACxB;AAEA,SAAgB,cACd,OACA,QACa;CACb,QAAQ,OAAO,MAAf;EACE,KAAK;GACH,IAAI,MAAM,OAAO,MAAM,UAAU,MAAM,OAAO,OAAO,MAAM,EAAE,GAC3D,OAAO;GAET,OAAO;IACL,SAAS,OAAO;IAChB,QAAQ,CAAC,GAAG,MAAM,QAAQ,OAAO,KAAK;GACxC;EAEF,KAAK,SAAS;GAEZ,IAAI,CADU,MAAM,OAAO,MAAM,MAAM,EAAE,OAAO,OAAO,OAC9C,GACP,OAAO;GAGT,MAAM,kBAAkB,MAAM,OAAO,QAAQ,MAAM,EAAE,OAAO,OAAO,OAAO;GAE1E,OAAO;IACL,SAAS,gBAAgB,gBAAgB,SAAS,MAAM,MAAM;IAC9D,QAAQ;GACV;EACF;EACA,KAAK;GACH,IAAI,CAAC,MAAM,OAAO,QAChB,OAAO;GAGT,OAAO;IACL,SAAS,MAAM;IACf,QAAQ,CAAC;GACX;EAEF,KAAK,UAAU;GACb,MAAM,EAAE,SAAS,aAAa;GAE9B,MAAM,gBAAgB,MAAM,OAAO,KAAK,UAAU;IAChD,IAAI,MAAM,OAAO,SACf,OAAO;IAGT,IAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAC7C,OAAO;KACL,GAAG;KACH,OAAO;MACL,GAAG,MAAM;MACT,GAAG;KACL;IACF;IAGF,IAAI,MAAM,SAAS,WACjB,OAAO;KACL,GAAG;KACH,OAAO;MACL,GAAG,MAAM;MACT,GAAG;MACH,YAAY;OACV,GAAG,MAAM,MAAM;OACf,GAAI,SAA4C;MAClD;KACF;IACF;IAGF,OAAO;GACT,CAAC;GAED,MAAM,eACJ,MAAM,SAAS,OAAO,UAClB,cAAc,MAAM,UAAU,MAAM,OAAO,OAAO,KAAK,MAAM,UAC7D,MAAM;GAEZ,OAAO;IACL,GAAG;IACH,QAAQ;IACR,SAAS;GACX;EACF;EACA,SACE,OAAO;CAEX;AACF"}