importtype{ProviderasProps}from"@/root.config";import{createContext,useContext,useState}from"react";import{Modal,SidePanel}from"../components/base";import{APP_PROVIDER_TYPE}from"../utils";constAppContext=createContext<Props.AppContextProps|undefined>(undefined);exportconstAppProvider=({children}:Props.ProviderProps)=>{const[stack,setStack]=useState<{id:Props.BaseProps["id"];type:Props.BaseProps["type"];content?:Props.BaseProps["providerContent"];options?:Props.BaseProps["options"];}[]>([]);constopen=(type:Props.BaseProps["type"],content?:Props.BaseProps["providerContent"],options?:Props.BaseProps["options"],)=>{constid=Math.random().toString();setStack((prev)=>[...prev,{id,type,content,options}]);};constclose=(id:Props.BaseProps["id"])=>{setStack((prev)=>prev.filter((i)=>i.id!==id));};return (<AppContext.Providervalue={{open,close}}>{children}{stack.map((item)=>(<divkey={item.id}>{item.type===APP_PROVIDER_TYPE.MODAL&&(<Modaloptions={item.options||{}}onClose={()=>close(item.id)}>{item.content&&item.content({close:()=>close(item.id),})}</Modal>)}{item.type===APP_PROVIDER_TYPE.SIDE_PANEL&&(<SidePaneloptions={item.options||{}}onClose={()=>close(item.id)}>{item.content?.({close:()=>close(item.id),})}</SidePanel>)}</div>))}</AppContext.Provider>);};exportconstuseAppProvider=()=>{constcontext=useContext(AppContext);if (!context)thrownewError("useApp must be used within AppProviders");returncontext;};
Top comments (0)