UNPKG

react-constore

Version:

Lightweight and efficient state management for React with TypeScript support

1 lines 2.05 kB
import {useState,useRef,useEffect,useCallback}from'react';var p=(r,t)=>{if(r===t)return true;if(r==null||t==null)return r===t;if(typeof r!=typeof t)return false;if(Array.isArray(r)&&Array.isArray(t))return r.length===t.length&&r.every((a,l)=>p(a,t[l]));if(Array.isArray(r)||Array.isArray(t))return false;if(r instanceof Date&&t instanceof Date)return r.getTime()===t.getTime();if(r instanceof Date||t instanceof Date)return false;if(typeof r=="object"){let a=Object.keys(r),l=Object.keys(t);return a.length===l.length&&a.every(T=>Object.prototype.hasOwnProperty.call(t,T)&&p(r[T],t[T]))}return false};var v=r=>{let t=typeof r=="function"?r():r,a=new Map,l=new Set,T="",j=e=>{e.length!==0&&(T=e.join(","),e.forEach(s=>{let n=a.get(s);n&&n.forEach(o=>o(t[s],t));}),l.forEach(s=>s(t)));};function x(e){return e===void 0?t:t[e]}let S=e=>{let s=typeof e=="function"?e(t):e;if(!s||typeof s!="object")return;let n=[],o=false;Object.keys(s).forEach(i=>{p(t[i],s[i])||(n.push(i),o=true);}),o&&(t={...t,...s},j(n));},K=(e,s)=>{if(typeof e=="function")return l.add(e),()=>l.delete(e);let n=e;return a.has(n)||a.set(n,new Set),a.get(n).add(s),()=>{let o=a.get(n);o&&(o.delete(s),o.size===0&&a.delete(n));}};return {getState:x,setState:S,subscribe:K,useStore:()=>{let[e,s]=useState(t);return useEffect(()=>(s(t),K(s)),[]),{state:e,setState:S,changedKey:T}},useStoreKey:e=>{let[s,n]=useState(t[e]),o=useRef(true);useEffect(()=>{n(t[e]);let u=K(e,y=>{o.current&&n(y);});return ()=>{o.current=false,u();}},[e]);let i=useCallback(u=>{S(y=>({[e]:typeof u=="function"?u(y[e]):u}));},[e]);return [s,i]},useStoreKeys:e=>{let s=e.join(","),n=()=>{let f={};return e.forEach(c=>{f[c]=t[c];}),f},[o,i]=useState(n),u=useRef(true);useEffect(()=>{i(n());let f=e.map(c=>K(c,()=>{u.current&&i(g=>({...g,[c]:t[c]}));}));return ()=>{u.current=false,f.forEach(c=>c());}},[s]);let y=useCallback(f=>{let c=typeof f=="function"?f(o):f,g=Object.keys(c).reduce((A,d)=>(e.includes(d)&&(A[d]=c[d]),A),{});Object.keys(g).length>0&&S(g);},[s,o]);return [o,y]}}},E=v;export{E as default};