2023-10-17 09:06:09 -04:00

73 lines
1.5 KiB
TypeScript

"use client";
import Modal from ".";
import {
ReactElement,
ReactNode,
createContext,
useContext,
useState,
} from "react";
export enum Modals {}
type ModalsType = {
[key in Modals]: (props: any) => JSX.Element;
};
const ModalOptions: ModalsType = {};
type ModalProps = ReactElement | Modals;
type ModalContextProps = {
show: (content: ModalProps) => void;
swap: (content: ModalProps) => void;
hide: () => void;
};
const ModalContext = createContext<ModalContextProps | undefined>(undefined);
export function ModalProvider({ children }: { children: ReactNode }) {
const [modalContent, setModalContent] = useState<ReactNode | null>(null);
const [showModal, setShowModal] = useState(false);
const show = (content: ModalProps) => {
if (typeof content === "string" && ModalOptions[content]) {
setModalContent(ModalOptions[content]);
} else {
setModalContent(content);
}
setShowModal(true);
};
const swap = (content: ModalProps) => {
hide();
setTimeout(() => {
show(content);
}, 300);
};
const hide = () => {
setShowModal(false);
setTimeout(() => {
setModalContent(null);
}, 300); // Adjust this timeout as per your transition duration
};
return (
<ModalContext.Provider value={{ show, hide, swap }}>
{children}
{showModal && (
<Modal showModal={showModal} setShowModal={setShowModal}>
{modalContent}
</Modal>
)}
</ModalContext.Provider>
);
}
export function useModal() {
return useContext(ModalContext);
}