UNPKG

react-model

Version:

The State management library for React

2 lines (1 loc) 12.1 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("immer"),require("react")):"function"==typeof define&&define.amd?define(["exports","immer","react"],t):t((e=e||self).reactModel={},e.immer,e.react)}(this,function(e,t,n){var r="default"in t?t.default:t;function o(){return(o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,(Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a={Actions:{},AsyncState:{},Context:{__global:{}},Middlewares:{},Setter:{classSetter:void 0,functionSetter:{}},State:{},devTools:void 0,subscriptions:{},mutableState:{},gid:0,uid:0,storeId:0,currentStoreId:"0",withDevTools:!1},c={logger:{enable:!1},devtools:{enable:!1},tryCatch:{enable:!0}},s=function(e,t){try{var n=e.next;return Promise.resolve(c.tryCatch.enable?n(t).catch(function(e){return console.log(e)}):n(t))}catch(e){return Promise.reject(e)}},u=function(e,t){try{var n=function(){return Promise.resolve(s(t))},r=e.action,i=e.modelName,a=e.consumerActions,c=e.params,s=e.next,u=e.Global,l=e.type,f=function(){if("u"!==l)return Promise.resolve(r(c,o({actions:a(u.Actions[i],{modelName:i}),state:u.State[i]},u.Context.__global||{},u.Context[i]||{}))).then(function(t){e.newState=t||null});e.newState=r()}();return Promise.resolve(f&&f.then?f.then(n):n())}catch(e){return Promise.reject(e)}},l=function(e,t){try{var n=e.modelName,r=e.newState,o=e.next,i=e.Global,a=e.type;return i.Setter.functionSetter[n]&&!e.disableSelectorUpdate&&Object.keys(i.Setter.functionSetter[n]).map(function(e){var t=i.Setter.functionSetter[n][e];t&&t.selector&&!t.selectorRef&&(t.selectorRef=t.selector(i.State[n]))}),Promise.resolve(function(){if(r||"u"===a)return N(n,r||{}),Promise.resolve(o(t))}())}catch(e){return Promise.reject(e)}},f=function(e,t){try{var n=e.modelName,r=e.next,o=e.Global,i=e.__hash,a=o.Setter.functionSetter[n];return"f"===e.type&&i&&a&&a[i]&&a[i].setState&&a[i].setState(o.State[n]),Promise.resolve(r(t))}catch(e){return Promise.reject(e)}},m=function(e,t){try{var n=e.modelName,r=e.next,o=e.Global,i="u"===e.type?o.subscriptions[n]:o.subscriptions[n+"_"+e.actionName];return i&&i.forEach(function(t){t(e)}),Promise.resolve(r(t))}catch(e){return Promise.reject(e)}},d=function(e,t){try{var n=e.Global;return!0===c.logger.enable||"function"==typeof c.logger.enable&&c.logger.enable(e)?(console.group("%c "+e.modelName+" State Change %c "+(new Date).toLocaleTimeString(),"color: gray; font-weight: lighter;","color: black; font-weight: bold;"),console.log("%c Previous","color: #9E9E9E; font-weight: bold",n.State[e.modelName]),console.log("%c Action","color: #03A9F4; font-weight: bold",e.actionName,"payload: "+e.params),Promise.resolve(e.next(t)).then(function(t){return console.log("%c Next","color: #4CAF50; font-weight: bold",n.State[e.modelName]),console.groupEnd(),t})):Promise.resolve(e.next(t))}catch(e){return Promise.reject(e)}},S=function(e,t){try{var n=e.Global;return Promise.resolve(e.next(t)).then(function(t){return n.withDevTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__,n.withDevTools&&v.config.devtools.enable&&!n.devTools&&(n.devTools=window.__REDUX_DEVTOOLS_EXTENSION__,n.devTools.connect()),n.withDevTools&&c.devtools.enable&&n.devTools.send("u"===e.type&&e.disableSelectorUpdate?"store["+e.modelName+"].update":e.modelName+"_"+e.actionName,"u"===e.type?n.mutableState[e.modelName]:n.State[e.modelName],void 0,e.modelName),t})}catch(e){return Promise.reject(e)}},b=function(e,t){try{var n=e.modelName,r=e.next,o=e.Global,i=e.disableSelectorUpdate;return o.Setter.classSetter&&o.Setter.classSetter(o.State),o.Setter.functionSetter[n]&&Object.keys(o.Setter.functionSetter[n]).map(function(e){var t=o.Setter.functionSetter[n][e];if(t)if(!t.selector||i)t.setState(o.State[n]);else{var r=t.selector(o.State[n]);A(r,t.selectorRef)||(t.selectorRef=r,t.setState(o.State[n]))}}),Promise.resolve(r(t))}catch(e){return Promise.reject(e)}},p=[s,d,S,u,l,f,b,m],v={communicator:b,consoleDebugger:d,devToolsListener:S,getNewState:u,getNewStateWithCache:function(e){return void 0===e&&(e=5e3),function(t,n){try{var r=t.Global,o=t.modelName,i=t.next,a=t.actionName;return Promise.resolve(Promise.race([(0,t.action)(t.params,{actions:(0,t.consumerActions)(r.Actions[o],{modelName:o}),state:r.State[o]}),O(e,j(o,a))])).then(function(e){return t.newState=e||null,Promise.resolve(i(n))})}catch(e){return Promise.reject(e)}}},setNewState:l,stateUpdater:f,subscription:m,tryCatch:s,config:c},_=function(e,t){try{return t.next=function(e){return e.length>0?e[0](t,e.slice(1)):t.newState},Promise.resolve(e[0](t,e.slice(1)))}catch(e){return Promise.reject(e)}},h=n.createContext({}),y=h.Consumer;if(!console.group){var g=[],P="-".repeat(80);console.group=function(e){g.push(e),console.log("%c \nBEGIN GROUP: %c",P,e),console.groupEnd=function(){console.log("END GROUP: %c\n%c",g.pop(),P)}}}var w=function(e,t){var n={};return Object.keys(e).forEach(function(r){n[r]=function(e,t){return function(n,r){try{return Promise.resolve(_(p,{Global:a,action:e,actionName:e.name,consumerActions:w,middlewareConfig:r,modelName:t.modelName,newState:null,params:n,type:"o"}))}catch(e){return Promise.reject(e)}}}(e[r],t)}),n},N=function(e,t){if("function"==typeof t){var n=a.State[e];n=r(n,t),a.State=r(a.State,function(t){t[e]=n})}else a.State=r(a.State,function(n){n[e]=o({},n[e],t)});return a.State},O=function(e,t){return new Promise(function(n){return setTimeout(function(){console.log(e),n(t)},e)})},E=function(e,t){try{var n={__FROM_SERVER__:!0};return Promise.resolve(Promise.all(Object.keys(a.State).map(function(i){try{var c=t&&t.prefix||"",s=function(){if(!e||!e.modelName||i===c+e.modelName||-1!==e.modelName.indexOf(c+i)){var s=function(e){t&&t.isServer?n[i]=e:a.State=r(a.State,function(t){t[i]=o({},t[i],e)})},u=a.AsyncState[i];return u?Promise.resolve(u(e)).then(s):s({})}}();return Promise.resolve(s&&s.then?s.then(function(){}):void 0)}catch(e){return Promise.reject(e)}}))).then(function(){return t&&t.isServer?n:a.State})}catch(e){return Promise.reject(e)}},j=function(e,t){var n=localStorage.getItem("__REACT_MODELX__"+e+"_"+t);return n?JSON.parse(n):null},A=function(e,t){if(e===t)return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var o=0;o<n.length;o++)if(!Object.prototype.hasOwnProperty.call(t,n[o])||e[n[o]]!==t[n[o]])return!1;return!0};t.enableES5();var R="undefined"==typeof window?n.useEffect:n.useLayoutEffect,x=function(e,t){C(e,t,void 0)},C=function(e,t,n){Array.isArray(t)?t.forEach(function(t){a.subscriptions[e+"_"+t]||(a.subscriptions[e+"_"+t]=[]),n?a.subscriptions[e+"_"+t].push(n):a.subscriptions[e+"_"+t]=[]}):(a.subscriptions[e+"_"+t]||(a.subscriptions[e+"_"+t]=[]),n?a.subscriptions[e+"_"+t].push(n):a.subscriptions[e+"_"+t]=[])},T=function(e){return a.State[e]},M=function(e,t){void 0===t&&(t={type:"o"});var n={};return Object.keys(a.Actions[e]).forEach(function(r){return n[r]=function(n,i){try{var c=o({action:a.Actions[e][r],actionName:r,consumerActions:w,middlewareConfig:i,modelName:e,newState:null,params:n},t,{Global:a});return Promise.resolve(_(a.Middlewares[e]?a.Middlewares[e]:p,c))}catch(e){return Promise.reject(e)}}}),n},I=function(e,t){var r,o=n.useState({})[1],i=n.useRef(""),c=(r=[e],function(e){return r.reduce(function(e,t){return e&&e[t]?e[t]:null},e)})(a.mutableState),s=!!c,u=s?c.selector:t,l=s?c:T(e);if(R(function(){a.uid+=1;var t=""+a.uid;return i.current=t,a.Setter.functionSetter[e]||(a.Setter.functionSetter[e]={}),a.Setter.functionSetter[e][t]={setState:o,selector:u},function(){delete a.Setter.functionSetter[e][t]}},[]),s)return u(l);var f=M(e,{__hash:i.current,type:"f"});return[u?u(l):l,f]},G=function(e){function t(){var t;return(t=e.apply(this,arguments)||this).state=a.State,t}return i(t,e),t.prototype.render=function(){var e=this.props.children;return a.Setter.classSetter=this.setState.bind(this),n.createElement(h.Provider,{value:o({},this.state)},e)},t}(n.PureComponent);e.Consumer=y,e.Model=function(e,t,n){if(void 0!==e.state){a.storeId+=1;var i="__"+a.storeId;a.State=r(a.State,function(t){t[i]=e.state}),e.middlewares&&(a.Middlewares[i]=e.middlewares),a.Actions[i]=e.actions,a.AsyncState[i]=e.asyncState,t&&(a.Context[i]=t);var c=M(i);return{__id:i,actions:c,getState:function(){return T(i)},subscribe:function(e,t){return C(i,e,t)},unsubscribe:function(e){return x(i,e)},useStore:function(e){return I(i,e)}}}t?a.gid=1:a.gid+=1;var s="";if(a.gid>1&&(s=a.gid+"_"),e.actions){console.error("invalid model(s) schema: ",e);var u=function(e){return function(){return e}};return{__ERROR__:!0,actions:u({}),getActions:u({}),getInitialState:u({}),getState:u({}),subscribe:u(),unsubscribe:u(),useStore:u([{},{}])}}t&&!t.__FROM_SERVER__&&(a.State=r(a.State,function(e){Object.assign(e,t||{})})),n&&(a.Context.__global=n);var l={};return Object.keys(e).forEach(function(n){var i=s+n,c=e[n];if(c.__ERROR__)return console.error(i+" model's schema is invalid"),a.State=r(a.State,function(e){e[i]={}}),void(a.Actions[i]={});void 0===c.useStore?(t&&t.__FROM_SERVER__?a.State=r(a.State,function(e){e[i]=o({},c.state,t[i])}):a.State[i]||(a.State=r(a.State,function(e){e[i]=c.state})),c.middlewares&&(a.Middlewares[i]=c.middlewares),a.Actions[i]=c.actions,a.AsyncState[i]=c.asyncState):(a.State[i]&&t||(a.State=r(a.State,function(e){e[i]=e[c.__id]})),t&&t.__FROM_SERVER__&&(a.State=r(a.State,function(e){e[i]=o({},e[c.__id],t[i])})),a.Actions[i]=a.Actions[c.__id],a.AsyncState[i]=a.AsyncState[c.__id],a.Middlewares[i]=a.Middlewares[c.__id],a.Context[i]=a.Context[c.__id]),l[n]=M(i)}),{actions:l,getActions:function(e){return M(s+e)},getInitialState:function(e,t){try{return Promise.resolve(E(e,o({},t,{prefix:s})))}catch(e){return Promise.reject(e)}},getState:function(e){return T(s+e)},subscribe:function(e,t,n){return C(s+e,t,n)},unsubscribe:function(e,t){return x(s+e,t)},useStore:function(e,t){return I(s+e,t)}}},e.Provider=G,e.actionMiddlewares=p,e.connect=function(e,t,r){return function(c){return function(s){function u(){return s.apply(this,arguments)||this}return i(u,s),u.prototype.render=function(){var i=this,s=this.props,u=s.state,l=void 0===u?{}:u,f=s.actions,m=void 0===f?{}:f;return n.createElement(y,null,function(s){var u=s[""+e],f=a.Actions[e];return n.createElement(c,Object.assign({},i.props,{state:o({},l,t?t(u):u),actions:o({},m,r?r(w(f,{modelName:e})):w(f,{modelName:e}))}))})},u}(n.PureComponent)}},e.createStore=function(e,t){var n="string"==typeof e;a.storeId+=n?0:1;var r=n?e:a.storeId.toString();a.Actions[r]||(a.Actions[r]={}),a.mutableState[r]||(a.mutableState[r]={count:0});var o=function(){return a.mutableState[r].count=0,a.currentStoreId=r,a.mutableState[r].cachedResult=t?t():e(),a.mutableState[r].cachedResult};return a.mutableState[r].selector=o,{useStore:function(){return I(r,o)},getState:function(){return o()},getStore:function(){return a.mutableState[r].cachedResult},subscribe:function(e){a.subscriptions[r]||(a.subscriptions[r]=[]),a.subscriptions[r].push(e)},unsubscribe:function(e){if(a.subscriptions[r]&&e){var t=a.subscriptions[r].indexOf(e);t>=0&&a.subscriptions[r].splice(t,1)}}}},e.getInitialState=E,e.getState=T,e.middlewares=v,e.useModel=function(e){var t=a.currentStoreId,n=a.mutableState[t].count;return a.mutableState[t].count+=1,a.mutableState[t].hasOwnProperty(n)||(a.mutableState[t][n]="function"==typeof e?e():e),[a.mutableState[t][n],function(e){try{return a.mutableState[t][n]="function"==typeof e?r(a.mutableState[t][n],e):a.mutableState[t][n]&&e&&"Object"===a.mutableState[t][n].constructor.name&&"Object"===e.constructor.name?o({},a.mutableState[t][n],e):e,Promise.resolve(_(p,{Global:a,action:function(){return"function"==typeof e?a.mutableState[t][n]:e},actionName:"setter",consumerActions:w,disableSelectorUpdate:!0,middlewareConfig:{},modelName:t,newState:{},params:void 0,type:"u"}))}catch(e){return Promise.reject(e)}}]}});