{"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      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;AACtE,KAAI,YAAY,MAAM,SAAS,UAC7B,OAAM,MAAM,YAAY;AAG1B,OAAM,MAAM,WAAW;;AAGzB,SAAgB,cACd,OACA,QACa;AACb,SAAQ,OAAO,MAAf;EACE,KAAK,OACH,QAAO;GACL,SAAS,OAAO;GAChB,QAAQ,CAAC,GAAG,MAAM,QAAQ,OAAO,MAAM;GACxC;EAEH,KAAK,SAAS;AAEZ,OAAI,CADU,MAAM,OAAO,MAAM,MAAM,EAAE,OAAO,OAAO,QAAQ,CAE7D,QAAO;GAGT,MAAM,kBAAkB,MAAM,OAAO,QAAQ,MAAM,EAAE,OAAO,OAAO,QAAQ;AAE3E,UAAO;IACL,SAAS,gBAAgB,gBAAgB,SAAS,MAAM,MAAM;IAC9D,QAAQ;IACT;;EAEH,KAAK;AACH,OAAI,CAAC,MAAM,OAAO,OAChB,QAAO;AAGT,UAAO;IACL,SAAS,MAAM;IACf,QAAQ,EAAE;IACX;EAEH,KAAK,UAAU;GACb,MAAM,EAAE,SAAS,aAAa;GAE9B,MAAM,gBAAgB,MAAM,OAAO,KAAK,UAAU;AAChD,QAAI,MAAM,OAAO,QACf,QAAO;AAGT,QAAI,MAAM,SAAS,aAAa,MAAM,SAAS,UAC7C,QAAO;KACL,GAAG;KACH,OAAO;MACL,GAAG,MAAM;MACT,GAAG;MACJ;KACF;AAGH,QAAI,MAAM,SAAS,UACjB,QAAO;KACL,GAAG;KACH,OAAO;MACL,GAAG,MAAM;MACT,GAAG;MACH,YAAY;OACV,GAAG,MAAM,MAAM;OACf,GAAI,SAA4C;OACjD;MACF;KACF;AAGH,WAAO;KACP;GAEF,MAAM,eACJ,MAAM,SAAS,OAAO,UAClB,cAAc,MAAM,UAAU,MAAM,OAAO,QAAQ,IAAI,MAAM,UAC7D,MAAM;AAEZ,UAAO;IACL,GAAG;IACH,QAAQ;IACR,SAAS;IACV;;EAEH,QACE,QAAO"}