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;