sichqon
Version:
Create tunnel with your react application
43 lines (37 loc) • 1.21 kB
JavaScript
;
const React = require('react');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
const React__default = /*#__PURE__*/_interopDefaultCompat(React);
const useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.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 = React.useSyncExternalStore(subscribe, () => localState);
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, currentState);
}
};
}
exports.createTunnel = createTunnel;