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.35 kB
"use strict";var g=require("react");var p=require("next/navigation");var d=require("../../parseSPObj.js");var k=require("../../useUrlStateBase/useUrlStateBase.js");var s=require("../../utils.js");function q(t){return t&&t.__esModule?t:{default:t}}var a=q(g);function M(t,r){const u=a.default.useMemo(()=>r?.useHistory===void 0?true:!!r?.useHistory,[]);const l=p.useRouter();const S=a.default.useMemo(()=>({push:(...e)=>{if(u){s.routerHistory.push(...e)}else{l.push(...e)}},replace:(...e)=>{if(u){s.routerHistory.replace(...e)}else{l.replace(...e)}}}),[l]);const{state:U,updateState:o,updateUrl:n,reset:c,getState:m,pendingUrlUpdate:v}=k.useUrlStateBase(t,S,({parse:e})=>{return s.isSSR?d.parseSPObj(s.filterUnknownParams(t,r?.searchParams),t):e(s.filterUnknownParamsClient(t,r?.searchParams||s.getSearch()))});const i=p.useSearchParams();a.default.useEffect(()=>{if(!v()){o(s.filterUnknownParams(t,d.parseSPObj(Object.fromEntries([...i.entries()]),t)))}},[i]);const f=a.default.useMemo(()=>{const e={..._};if(r?.scroll!==void 0)e.scroll=r.scroll;if(r?.replace!==void 0)e.replace=r.replace;return e},[r?.scroll,r?.replace]);const P=a.default.useCallback((e,b)=>n(e,{...f,...b}),[n]);const h=a.default.useCallback(e=>{c({...f,...e})},[c]);return{setState:o,setUrl:P,urlState:U,reset:h,getState:m}}const _={replace:true,scroll:false};exports.useUrlState=M;