UNPKG

react-model

Version:

The State management library for React

2 lines (1 loc) 11.2 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,r){var n="default"in t?t.default:t;function o(){return(o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}var i={Actions:{},AsyncState:{},Context:{__global:{}},Middlewares:{},Setter:{classSetter:void 0,functionSetter:{}},State:{},devTools:void 0,subscriptions:{},mutableState:{},uid:0,storeId:0,currentStoreId:"0",withDevTools:!1},c={logger:{enable:!1},devtools:{enable:!1},tryCatch:{enable:!0}},s=function(e,t){try{var r=e.next;return Promise.resolve(c.tryCatch.enable?r(t).catch(function(e){return console.log(e)}):r(t))}catch(e){return Promise.reject(e)}},u=function(e,t){try{var r=function(){return Promise.resolve(s(t))},n=e.action,a=e.modelName,i=e.consumerActions,c=e.params,s=e.next,u=e.Global,l=e.type,f=function(){if("u"!==l)return Promise.resolve(n(c,o({actions:i(u.Actions[a],{modelName:a}),state:u.State[a]},u.Context.__global||{},u.Context[a]||{}))).then(function(t){e.newState=t||null});e.newState=n()}();return Promise.resolve(f&&f.then?f.then(r):r())}catch(e){return Promise.reject(e)}},l=function(e,t){try{var r=e.modelName,n=e.newState,o=e.next,a=e.Global,i=e.type;return a.Setter.functionSetter[r]&&!e.disableSelectorUpdate&&Object.keys(a.Setter.functionSetter[r]).map(function(e){var t=a.Setter.functionSetter[r][e];t&&t.selector&&!t.selectorRef&&(t.selectorRef=t.selector(a.State[r]))}),Promise.resolve(function(){if(n||"u"===i)return N(r,n||{}),Promise.resolve(o(t))}())}catch(e){return Promise.reject(e)}},f=function(e,t){try{var r=e.modelName,n=e.next,o=e.Global,a=e.__hash,i=o.Setter.functionSetter[r];return"f"===e.type&&a&&i&&i[a]&&i[a].setState&&i[a].setState(o.State[r]),Promise.resolve(n(t))}catch(e){return Promise.reject(e)}},m=function(e,t){try{var r=e.next,n=e.Global.subscriptions[e.modelName+"_"+e.actionName];return n&&n.forEach(function(t){t(e)}),Promise.resolve(r(t))}catch(e){return Promise.reject(e)}},S=function(e,t){try{var r=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",r.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",r.State[e.modelName]),console.groupEnd(),t})):Promise.resolve(e.next(t))}catch(e){return Promise.reject(e)}},d=function(e,t){try{var r=e.Global;return Promise.resolve(e.next(t)).then(function(t){return r.withDevTools&&c.devtools.enable&&r.devTools.send(e.modelName+"_"+e.actionName,r.State),t})}catch(e){return Promise.reject(e)}},v=function(e,t){try{var r=e.modelName,n=e.next,o=e.Global,a=e.disableSelectorUpdate;return o.Setter.classSetter&&o.Setter.classSetter(o.State),o.Setter.functionSetter[r]&&Object.keys(o.Setter.functionSetter[r]).map(function(e){var t=o.Setter.functionSetter[r][e];if(t)if(!t.selector||a)t.setState(o.State[r]);else{var n=t.selector(o.State[r]);A(n,t.selectorRef)||(t.selectorRef=n,t.setState(o.State[r]))}}),Promise.resolve(n(t))}catch(e){return Promise.reject(e)}},b=[s,S,d,u,l,f,v,m],p={communicator:v,consoleDebugger:S,devToolsListener:d,getNewState:u,getNewStateWithCache:function(e){return void 0===e&&(e=5e3),function(t,r){try{var n=t.Global,o=t.modelName,a=t.next,i=t.actionName;return Promise.resolve(Promise.race([(0,t.action)(t.params,{actions:(0,t.consumerActions)(n.Actions[o],{modelName:o}),state:n.State[o]}),E(e,O(o,i))])).then(function(e){return t.newState=e||null,Promise.resolve(a(r))})}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=r.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 r={};return Object.keys(e).forEach(function(n){r[n]=function(e,t){return function(r,n){try{return Promise.resolve(_(b,{Global:i,action:e,actionName:e.name,consumerActions:w,middlewareConfig:n,modelName:t.modelName,newState:null,params:r,type:"o"}))}catch(e){return Promise.reject(e)}}}(e[n],t)}),r},N=function(e,t){if("function"==typeof t){var r=i.State[e];r=n(r,t),i.State=n(i.State,function(t){t[e]=r})}else i.State=n(i.State,function(r){r[e]=o({},r[e],t)});return i.State},E=function(e,t){return new Promise(function(r){return setTimeout(function(){console.log(e),r(t)},e)})},j=function(e,t){try{var r={__FROM_SERVER__:!0};return Promise.resolve(Promise.all(Object.keys(i.State).map(function(a){try{var c=function(){if(!e||!e.modelName||a===e.modelName||-1!==e.modelName.indexOf(a)){var c=function(e){t&&t.isServer?r[a]=e:i.State=n(i.State,function(t){t[a]=o({},t[a],e)})},s=i.AsyncState[a];return s?Promise.resolve(s(e)).then(c):c({})}}();return Promise.resolve(c&&c.then?c.then(function(){}):void 0)}catch(e){return Promise.reject(e)}}))).then(function(){return t&&t.isServer?r:i.State})}catch(e){return Promise.reject(e)}},O=function(e,t){var r=localStorage.getItem("__REACT_MODELX__"+e+"_"+t);return r?JSON.parse(r):null},A=function(e,t){if(e===t)return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(var o=0;o<r.length;o++)if(!Object.prototype.hasOwnProperty.call(t,r[o])||e[r[o]]!==t[r[o]])return!1;return!0};t.enableES5();var R=function(e,t){x(e,t,void 0)},x=function(e,t,r){Array.isArray(t)?t.forEach(function(t){i.subscriptions[e+"_"+t]||(i.subscriptions[e+"_"+t]=[]),r?i.subscriptions[e+"_"+t].push(r):i.subscriptions[e+"_"+t]=[]}):(i.subscriptions[e+"_"+t]||(i.subscriptions[e+"_"+t]=[]),r?i.subscriptions[e+"_"+t].push(r):i.subscriptions[e+"_"+t]=[])},C=function(e){return i.State[e]},M=function(e,t){void 0===t&&(t={type:"o"});var r={};return Object.keys(i.Actions[e]).forEach(function(n){return r[n]=function(r,a){try{var c=o({action:i.Actions[e][n],actionName:n,consumerActions:w,middlewareConfig:a,modelName:e,newState:null,params:r},t,{Global:i});return Promise.resolve(_(i.Middlewares[e]?i.Middlewares[e]:b,c))}catch(e){return Promise.reject(e)}}}),r},T=function(e,t){var n,o=r.useState({})[1],a=r.useRef(""),c=(n=[e],function(e){return n.reduce(function(e,t){return e&&e[t]?e[t]:null},e)})(i.mutableState),s=!!c,u=s?c.selector:t,l=s?c:C(e);if(r.useLayoutEffect(function(){i.uid+=1;var t=""+i.uid;return a.current=t,i.Setter.functionSetter[e]||(i.Setter.functionSetter[e]={}),i.Setter.functionSetter[e][t]={setState:o,selector:u},function(){delete i.Setter.functionSetter[e][t]}},[]),s)return u(l);var f=M(e,{__hash:a.current,type:"f"});return[u?u(l):l,f]},I=function(e){function t(){var t;return(t=e.apply(this,arguments)||this).state=i.State,t}return a(t,e),t.prototype.render=function(){var e=this.props.children;return i.Setter.classSetter=this.setState.bind(this),r.createElement(h.Provider,{value:o({},this.state)},e)},t}(r.PureComponent);e.Consumer=y,e.Model=function(e,t,r){if(void 0!==e.state){i.storeId+=1;var a="__"+i.storeId;i.State=n(i.State,function(t){t[a]=e.state}),e.middlewares&&(i.Middlewares[a]=e.middlewares),i.Actions[a]=e.actions,i.AsyncState[a]=e.asyncState,t&&(i.Context[a]=t);var c=M(a);return{__id:a,actions:c,getState:function(){return C(a)},subscribe:function(e,t){return x(a,e,t)},unsubscribe:function(e){return R(a,e)},useStore:function(e){return T(a,e)}}}if(e.actions){console.error("invalid model(s) schema: ",e);var s=function(e){return function(){return e}};return{__ERROR__:!0,actions:s({}),getActions:s({}),getInitialState:s({}),getState:s({}),subscribe:s(),unsubscribe:s(),useStore:s([{},{}])}}t&&!t.__FROM_SERVER__&&(i.State=n(i.State,function(e){Object.assign(e,t||{})})),r&&(i.Context.__global=r),Object.keys(e).forEach(function(r){var a=e[r];if(a.__ERROR__)return console.error(r+" model's schema is invalid"),i.State=n(i.State,function(e){e[r]={}}),void(i.Actions[r]={});void 0===a.useStore?(t&&t.__FROM_SERVER__?i.State=n(i.State,function(e){e[r]=o({},a.state,t[r])}):i.State[r]||(i.State=n(i.State,function(e){e[r]=a.state})),a.middlewares&&(i.Middlewares[r]=a.middlewares),i.Actions[r]=a.actions,i.AsyncState[r]=a.asyncState):(i.State[r]&&t||(i.State=n(i.State,function(e){e[r]=e[a.__id]})),t&&t.__FROM_SERVER__&&(i.State=n(i.State,function(e){e[r]=o({},e[a.__id],t[r])})),i.Actions[r]=i.Actions[a.__id],i.AsyncState[r]=i.AsyncState[a.__id],i.Middlewares[r]=i.Middlewares[a.__id],i.Context[r]=i.Context[a.__id])});var u=Object.keys(e).reduce(function(e,t){var r;return o({},e,((r={})[t]=M(t),r))},{});return i.withDevTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__,i.withDevTools&&p.config.devtools.enable&&(i.devTools=window.__REDUX_DEVTOOLS_EXTENSION__,i.devTools.connect()),{actions:u,getActions:M,getInitialState:j,getState:C,subscribe:x,unsubscribe:R,useStore:T}},e.Provider=I,e.actionMiddlewares=b,e.connect=function(e,t,n){return function(c){return function(s){function u(){return s.apply(this,arguments)||this}return a(u,s),u.prototype.render=function(){var a=this,s=this.props,u=s.state,l=void 0===u?{}:u,f=s.actions,m=void 0===f?{}:f;return r.createElement(y,null,function(s){var u=s[""+e],f=i.Actions[e];return r.createElement(c,Object.assign({},a.props,{state:o({},l,t?t(u):u),actions:o({},m,n?n(w(f,{modelName:e})):w(f,{modelName:e}))}))})},u}(r.PureComponent)}},e.createStore=function(e,t){var r="string"==typeof e;i.storeId+=r?0:1;var n=r?e:i.storeId.toString();i.Actions[n]||(i.Actions[n]={}),i.mutableState[n]||(i.mutableState[n]={count:0});var o=function(){return i.mutableState[n].count=0,i.currentStoreId=n,t?t():e()};return i.mutableState[n].selector=o,{useStore:function(){return T(n,o)},getState:function(){return o()}}},e.getInitialState=j,e.getState=C,e.middlewares=p,e.useModel=function(e){var t=i.currentStoreId,r=i.mutableState[t].count;return i.mutableState[t].count+=1,i.mutableState[t].hasOwnProperty(r)||(i.mutableState[t][r]="function"==typeof e?e():e),[i.mutableState[t][r],function(e){try{return i.mutableState[t][r]="function"==typeof e?n(i.mutableState[t][r],e):"object"==typeof i.mutableState[t][r]&&"object"==typeof e?o({},i.mutableState[t][r],e):e,Promise.resolve(_(b,{Global:i,action:function(){return"function"==typeof e?i.mutableState[t][r]:e},actionName:"setter",consumerActions:w,disableSelectorUpdate:!0,middlewareConfig:{},modelName:t,newState:{},params:void 0,type:"u"}))}catch(e){return Promise.reject(e)}}]}});