import type { ReactNode } from 'react'; import { useCallback, useContext } from 'react'; import { ACTIONS } from './constants'; import { PortalDispatchContext } from './contexts'; export const usePortal = (hostName = 'root') => { const dispatch = useContext(PortalDispatchContext); if (dispatch === null) { throw new Error("You must add 'PortalProvider' to the root component."); } const registerHost = useCallback(() => { dispatch({ type: ACTIONS.REGISTER_HOST, hostName, }); }, []); const deregisterHost = useCallback(() => { dispatch({ type: ACTIONS.DEREGISTER_HOST, hostName, }); }, []); const addUpdatePortal = useCallback((name: string, node: ReactNode) => { dispatch({ type: ACTIONS.ADD_UPDATE_PORTAL, hostName, portalName: name, node, }); }, []); const removePortal = useCallback((name: string) => { dispatch({ type: ACTIONS.REMOVE_PORTAL, hostName, portalName: name, }); }, []); return { registerHost, deregisterHost, addPortal: addUpdatePortal, updatePortal: addUpdatePortal, removePortal, }; };