import React, { ReactElement, createContext, useContext, useState } from "react"; import { ControlStatusProps } from "../../common/controls.type"; import Popup, { PopupProps } from "."; interface PopupContextProps extends ControlStatusProps { show: (popup: PopupProps) => any; } const PopupContext = createContext({ show: (popup) => {}, }); export const usePopupContext = () => useContext(PopupContext); export const usePopup = () => { const { show } = usePopupContext(); return (popup: PopupProps) => { return new Promise((resolve, reject) => { show({ ...popup, onClose: (result: T) => { resolve(result); } }); }); }; } export const PopupProvider = ({ children }: { children: React.ReactNode | React.ReactElement | React.ReactElement[] }) => { const [items, setItems] = useState([]); const show = (popup: PopupProps) => { setItems((value) => [...value, popup]); } const close = (index: number) => { setItems((value) => { value.splice(index, 1); return [...value]; }); }; return <> {children} {items.map((item, index) => { close(index); if(item.onClose){ item.onClose(result); } }} />)} ; }