react-singleton-hook
Version:
Share custom hook state across all components
2 lines (1 loc) • 3.19 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","react-dom"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).ReactSingletonHook={},e.React,e.ReactDOM)}(this,(function(e,n,t){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=o(n);function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var n=1;arguments.length>n;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e}).apply(this,arguments)}var i,a=function(e){var t=e.useHookBody,o=e.applyStateChange,r=n.useRef(e.initValue);if("function"!=typeof t)throw Error("function expected as hook body parameter. got "+typeof t);var u=t();return n.useLayoutEffect((function(){r.current!==u&&(r.current=u,o(u))}),[o,u]),null};i=o(t).default.createRoot;var f=function(e){console&&console.warn&&console.warn(e)},l="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this,c=1,s=!1,d=!1,p=[],g=[],y=function(){g.forEach((function(e){return e()}))},m=function(e){var t=e.automaticContainerInternalUseOnly,o=n.useState([]),i=o[0],l=o[1],c=n.useRef();return c.current=i,t||!1!==s||(d=!0),n.useEffect((function(){var e=!0;function n(){if(e)return g[0]!==n?(t||!0!==s||f("SingletonHooksContainer is mounted after some singleton hook has been used.Your SingletonHooksContainer will not be used in favor of internal one."),void l((function(e){return[]}))):void l([].concat(p))}return g.push(n),y(),function(){e=!1,c.current.length>0&&f("SingletonHooksContainer is unmounted, but it has active singleton hooks. They will be reevaluated once SingletonHooksContainer is mounted again"),g.splice(g.indexOf(n),1),y()}}),[t]),r.default.createElement(r.default.Fragment,null,i.map((function(e){return r.default.createElement(a,u({},e.hook,{key:e.key}))})))},h=function(e){var n=c++;return p.push({hook:e,key:n}),0===g.length&&!1===d&&(s=!0,function(e){if(l.document&&l.document.createElement){var n=l.document.createElement("div");i(n).render(r.default.createElement(e,{automaticContainerInternalUseOnly:!0}))}else f("Can not mount SingletonHooksContainer on server side. Did you manage to run useEffect on server? Please mount SingletonHooksContainer into your components tree manually.")}(m)),y(),function(){p.splice(p.findIndex((function(e){return e.key===n})),1),y()}},v=function(e,o,r){void 0===r&&(r={});var u=!1,i=void 0,a=!1,f=void 0,l=[],c=r.unmountIfNoConsumers,s=void 0!==c&&c,d=function(e){f=e,t.unstable_batchedUpdates((function(){return l.forEach((function(n){return n(e)}))}))},p=function(){return a||(f="function"==typeof e?e():e,a=!0),f};return function(){var t=n.useState(p),r=t[0],a=t[1];return n.useEffect((function(){return u||(u=!0,i=h({initValue:e,useHookBody:o,applyStateChange:d})),l.push(a),f!==r&&a(f),function(){l.splice(l.indexOf(a),1),0===l.length&&s&&(i(),u=!1)}}),[]),r}},b={singletonHook:v,SingletonHooksContainer:m};e.SingletonHooksContainer=m,e.default=b,e.singletonHook=v,Object.defineProperty(e,"__esModule",{value:!0})}));