{"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"}