UNPKG

hookleton

Version:

globalize your React Hooks without fear using the Hookleton Pattern

2 lines (1 loc) 2.43 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var react=require("react");function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function _createClass(t,e,r){return e&&_defineProperties(t.prototype,e),r&&_defineProperties(t,r),t}function _slicedToArray(t,e){return _arrayWithHoles(t)||_iterableToArrayLimit(t,e)||_nonIterableRest()}function _arrayWithHoles(t){if(Array.isArray(t))return t}function _iterableToArrayLimit(t,e){if(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t)){var r=[],n=!0,o=!1,u=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done)&&(r.push(i.value),!e||r.length!==e);n=!0);}catch(t){o=!0,u=t}finally{try{n||null==a.return||a.return()}finally{if(o)throw u}}return r}}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function createHook(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;n<e;n++)r[n-1]=arguments[n];var o=new Hookleton(t,r);function u(){return o.use.apply(o,arguments)}return u.use=function(){return o._useHost.apply(o,arguments)},u.get=function(){return o.get.call(o)},u}var Hookleton=function(){function t(e,r){_classCallCheck(this,t),this._hook=e,this._arg=r,this._ctx={out:[]}}return _createClass(t,[{key:"_useHost",value:function(){return!this._ctx.up&&this._init({ctx:this._ctx,initial:arguments}),this._use(this._ctx)}},{key:"_init",value:function(t){var e=t.ctx,r=t.initial;e.up=new Map,e.arg=this._arg.length>0?this._arg:r}},{key:"_use",value:function(t){return t.out=this._hook.apply(this,t.arg),this.useHost(t)}},{key:"useHost",value:function(t){return react.useMemo(function(){return t.up.forEach(function(e){return e(t.out)})},[t.out]),t.out}},{key:"use",value:function(){return this.useNonHost(this._ctx,arguments)}},{key:"useNonHost",value:function(t){var e=_slicedToArray(react.useReducer(forceUpdate),2)[1];return react.useEffect(function(){if(t.up)return t.up.set(e,e),function(){return t.up.delete(e)};console.error("[Hookleton] missing 'Host'")},[]),t.out}},{key:"get",value:function(){return this._ctx.out}}]),t}(),forceUpdate=function(t){return~t};exports.Hookleton=Hookleton,exports.createHook=createHook;