UNPKG

sichqon

Version:

Create tunnel with your react application

37 lines (34 loc) 1.02 kB
import React, { useSyncExternalStore, useLayoutEffect, useEffect } from 'react'; const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect; function createTunnel() { let localState = []; let listeners = []; function subscribe(listener) { listeners = [...listeners, listener]; return () => { listeners = listeners.filter((l) => l !== listener); }; } function notifyListeners() { for (const listener of listeners) { listener(); } } return { In({ children }) { useIsomorphicLayoutEffect(() => { localState = [...localState, children]; notifyListeners(); return () => { localState = localState.filter((c) => c !== children); }; }, [children]); return null; }, Out() { const currentState = useSyncExternalStore(subscribe, () => localState); return /* @__PURE__ */ React.createElement(React.Fragment, null, currentState); } }; } export { createTunnel };