import clsx from "clsx" import React, { ReactNode, useContext, useReducer } from "react" import Button from "../../fundamentals/button" import UTurnIcon from "../../fundamentals/icons/u-turn-icon" import Modal, { ModalProps } from "../../molecules/modal" enum LayeredModalActions { PUSH, POP, RESET, } export type LayeredModalScreen = { title: string subtitle?: string onBack: () => void onConfirm?: () => void view: ReactNode } export type ILayeredModalContext = { screens: LayeredModalScreen[] push: (screen: LayeredModalScreen) => void pop: () => void reset: () => void } const defaultContext: ILayeredModalContext = { screens: [], push: (screen) => {}, pop: () => {}, reset: () => {}, } export const LayeredModalContext = React.createContext(defaultContext) const reducer = (state, action) => { switch (action.type) { case LayeredModalActions.PUSH: { return { ...state, screens: [...state.screens, action.payload] } } case LayeredModalActions.POP: { return { ...state, screens: state.screens.slice(0, -1) } } case LayeredModalActions.RESET: { return { ...state, screens: [] } } } } type LayeredModalProps = { context: ILayeredModalContext } & ModalProps export const LayeredModalProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, defaultContext) return ( { dispatch({ type: LayeredModalActions.PUSH, payload: screen }) }, pop: () => { dispatch({ type: LayeredModalActions.POP }) }, reset: () => { dispatch({ type: LayeredModalActions.RESET }) }, }} > {children} ) } const LayeredModal: React.FC = ({ context, children, handleClose, open, isLargeModal = true, }) => { const emptyScreensAndClose = () => { context.reset() handleClose() } const screen = context.screens[context.screens.length - 1] return ( {screen ? ( <>

{screen.title}

{screen.subtitle && ( ({screen.subtitle}) )}
{screen.view} ) : ( <> )}
{children}
) } export const useLayeredModal = () => { const context = useContext(LayeredModalContext) if (context === null) { throw new Error( "useLayeredModal must be used within a LayeredModalProvider" ) } return context } export default LayeredModal