UNPKG

r-magnet

Version:

A state management library for React

3 lines (2 loc) 4.09 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).RMagnet={},e.React)}(this,(function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(t);const c="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?r.default.useLayoutEffect:r.default.useEffect,a=r.default.createContext(null);function o(){return r.default.useContext(a)}const u=function(e=a){const t=e===a?o:()=>r.default.useContext(e);return function(){return t()}}();function s(e,t,n){let r=Number(new Date).toString()+Math.random();return n.set(r,((n,r,c)=>{e.includes(c.type)&&t(c,r,n)})),{unsubscribe:()=>{n.delete(r)}}}function i(e,t){const n=u();c((()=>{const r=s((Array.isArray(e)?e:[e]).map((e=>e._$atype)),t,n.__effectMap);return()=>{r.unsubscribe()}}),[])}function d(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function f(e,t){if(d(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++)if(!Object.prototype.hasOwnProperty.call(t,n[r])||!d(e[n[r]],t[n[r]]))return!1;return!0}function l(e){const t=t=>this.dispatch({type:e,payload:t});return t._$atype=e,t}function p(e){return function(t){if(!t.name)throw new Error("`name` is a required option for reducer");const n=t.reducers||{},r={},c=t.effects||{},a=new RegExp(`^${t.name}.+(?:request|success|failure)$`,"i");function o(e=t.initialState,r){return"function"==typeof n[r.type]?n[r.type](e,r):a.test(r.type)?Object.assign(Object.assign({},e),{[r.key]:r.data}):e}Object.keys(n).map((c=>{const a=`${t.name}_${c}`;n[a]=n[c],n[c]=void 0,r[c]=e.createAction(a)}));return Object.keys(c).map((n=>{const a=c[n];r[n]=r=>e.dispatch((()=>{return a({payload:r},(c=n,o=e.getState,(n,r)=>{const a=o()[t.name][n].data;e.dispatch({type:`${t.name}_${c}_request`,key:n,data:{loading:!0,data:a,error:null}}),Promise.resolve(r).then((r=>e.dispatch({type:`${t.name}_${c}_success`,key:n,data:{loading:!1,data:r,error:null}}))).catch((r=>e.dispatch({type:`${t.name}_${c}_failure`,key:n,data:{loading:!1,data:a,error:r.message?r.message:r}})))}),e.getState,e.dispatch);var c,o}))})),e.addReducer(t.name,o,t.initialState),{name:t.name,actions:r,reducer:o}}}function y(e){return function(t,n){return s((Array.isArray(t)?t:[t]).map((e=>e._$atype)),n,e)}}function b(e){return function(...t){let n=t.map((e=>e._$atype));return{debounce:t=>({effect:r=>s(n,function(e,t=300){let n;return(...r)=>{clearTimeout(n),n=setTimeout((()=>{e.apply(this,r)}),t)}}(r,t),e)}),effect:t=>s(n,t,e)}}}e.Provider=({store:e,context:t,children:n})=>{c((()=>()=>{null==e||e.dispose()}),[e]);const o=t||a;return r.default.createElement(o.Provider,{value:e},n)},e.createStore=function(){return function(e){const t=new Set;let n=e;const r=new Map,c=new Map;function a(e){t.forEach((t=>t(n,e)))}const o={getState:()=>n,subscribe:e=>(t.add(e),()=>t.delete(e)),dispatch(e){if("function"==typeof e)return void e();let t=!1;r.forEach(((r,c)=>{const a=n[c],o=r(a,e);o!==a&&(n[c]=o,t=!0)})),t&&(n=Object.assign({},n),a(e)),c.forEach((t=>t(o.dispatch,o.getState,e)))},addReducer(e,t,c){r.set(e,t),n=Object.assign(Object.assign({},n),{[e]:c}),a()},dispose(){},createAction:l};return{getState:o.getState,dispose:o.dispose,createAction:o.createAction,createReducer:p(o),on:b(c),createEffect:y(c),subscribe:o.subscribe,__effectMap:c,dispatch:o.dispatch,addReducer:o.addReducer}}({})},e.useEmEffect=i,e.useSelector=function(e=(e=>e),n=f){const r=u(),[a,o]=t.useState(e(r.getState()));let s=null;return c((()=>r.subscribe((t=>{const r=e(t);n(r,s)||(o(r),s=r)}))),[r]),a},e.useSelectorByActions=function(e,n,r=f){const c=u(),[a,o]=t.useState(n(c.getState()));let s=a;return i(e,(()=>{const e=n(c.getState());r(e,s)||(o(e),s=e)})),a},e.useStore=u,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=index.umd.production.min.js.map