UNPKG

state-in-url

Version:

Store state in URL as in object, types and structure are preserved, with TS validation. Same API as React.useState, wthout any hasssle or boilerplate. Next.js@14-15, react-router@6-7, and remix@2.

2 lines (1 loc) 1 kB
"use strict";var b=require("react");var r=require("../subscribers.js");var M=require("../useInsertionEffect.js");var o=require("../utils.js");function g(u){return u&&u.__esModule?u:{default:u}}var a=g(b);function v(u,n){const t=a.default.useRef(u);const[i,c]=a.default.useState(()=>{if(o.isSSR){return n?n?.():t.current}const e=r.stateMap.get(t.current);if(!e){const s=n?.()||t.current;r.stateMap.set(t.current,s);return s}else{return e}});const l=a.default.useCallback(e=>{const s=r.stateMap.get(t.current);const p=typeof e==="function";const f=p?e(s,u):{...s,...e};if(o.isEqual(s,f))return void 0;r.stateMap.set(t.current,f);r.subscribers.get(t.current).forEach(S=>S())},[]);M.useInsertionEffect(()=>{const e=()=>{c(r.stateMap.get(t.current)||t.current)};return r.subscribers.add(t.current,e)},[]);a.default.useEffect(()=>{c(e=>r.stateMap.get(t.current)??e)},[]);const d=a.default.useCallback(()=>r.stateMap.get(t.current)||t.current,[]);return{state:i,getState:d,setState:l}}exports.useSharedState=v;