import * as React from "react"; import { useList } from "react-use"; import { useRequiredContext } from "../use-required-context"; import Modal, { ModalProps } from "./modal"; export interface ModalProviderProps { children?: React.ReactNode; } type ModalContentProps = { close: () => void }; interface ModalConfig extends ModalProps { content?: React.ReactNode | ((props: ModalContentProps) => React.ReactNode); } const ModalContext = React.createContext<{ render: (el: ModalConfig) => void; } | null>(null); ModalContext.displayName = ""; export const useModalContext = () => { return useRequiredContext(ModalContext); }; const ModalProvider: React.VoidFunctionComponent = ({ children, }) => { const counter = React.useRef(0); const [modals, { push, removeAt, updateAt }] = useList< ModalConfig & { id: number } >([]); const removeModalAt = (index: number) => { updateAt(index, { ...modals[index], visible: false }); setTimeout(() => { removeAt(index); }, 500); }; return ( { push({ ...props, id: counter.current++ }); }, }} > {children} {modals.map((props, i) => ( removeModalAt(i) }) : props.content } onOk={() => { props.onOk?.(); removeModalAt(i); }} onCancel={() => { props.onCancel?.(); removeModalAt(i); }} /> ))} ); }; export default ModalProvider;