import { createContext, useContext, useMemo, useReducer } from "react"; import { MuiModalChildren } from "../Components/modal/Modal"; import { ExternalLinkModal } from "../Components/modal/ExternalLinkModal"; import { callAll } from "../lib/callAll"; import { basicReducer, BasicReducer } from "../lib/basicReducer"; interface ProviderProps { children: React.ReactNode; } interface ContextModal { component: MuiModalChildren | null; variant?: "modal" | "popup"; preventDismiss?: boolean; onClose?: () => void; } export type ModalType = "none" | "externalLink"; const modals: Record = { none: { component: null, }, externalLink: { component: , }, }; type Optional = Pick, K> & Omit; export interface ModalState { type: ModalType; state: T | null; } interface ModalContextType { modal: ModalState; modals: Record; state: T | null; openModal: (modal: Optional, "state">) => void; closeModal: () => void; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const ModalContext = createContext>( {} as ModalContextType ); ModalContext.displayName = "ModalContext"; // eslint-disable-next-line react/function-component-definition function ModalProvider({ children, ...props }: ProviderProps) { const [modal, openModal] = useReducer>>( basicReducer, { state: null, type: "none", } ); const value = useMemo( () => ({ modals, modal, state: modal.state, openModal, closeModal: callAll(modals[modal.type]?.onClose, () => openModal({ type: "none", state: null }) ), }), [modal, openModal] ); return ( {children} ); } function useModal() { const context = useContext>(ModalContext); if (context === undefined) { throw new Error("useModal must be used within a ModalProvider"); } return context; } export { ModalProvider, useModal };