Skip to content

Commit 75d61b7

Browse files
chore(release): 5.0.0 [skip ci]
# [5.0.0](v4.3.3...v5.0.0) (2025-06-16) ### Code Refactoring * remove deprecated params format ([bd24bf9](bd24bf9)) ### Features * **remix:** example for remix@2 with SSR ([8f0bd48](8f0bd48)) ### BREAKING CHANGES * old format `useUrlState(allParamsObj)` is removed. Use format described in a documentation, it uses new format for a while.
1 parent 8f0bd48 commit 75d61b7

File tree

14 files changed

+110
-61
lines changed

14 files changed

+110
-61
lines changed

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
# [5.0.0](https://github.com/asmyshlyaev177/state-in-url/compare/v4.3.3...v5.0.0) (2025-06-16)
2+
3+
4+
### Code Refactoring
5+
6+
* remove deprecated params format ([bd24bf9](https://github.com/asmyshlyaev177/state-in-url/commit/bd24bf95b30a9ed62ad9a4436cac3dbd08fb5d8a))
7+
8+
9+
### Features
10+
11+
* **remix:** example for remix@2 with SSR ([8f0bd48](https://github.com/asmyshlyaev177/state-in-url/commit/8f0bd48d2d370754793c7ea112ddcec6c6c11635))
12+
13+
14+
### BREAKING CHANGES
15+
16+
* old format `useUrlState(allParamsObj)` is removed. Use format described in a
17+
documentation, it uses new format for a while.
18+
119
## [4.3.3](https://github.com/asmyshlyaev177/state-in-url/compare/v4.3.2...v4.3.3) (2025-06-07)
220

321

dist/next/useUrlState/useUrlState.d.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,5 @@
11
import { useRouter } from "next/navigation";
22
import { type JSONCompatible } from "../../utils";
3-
/**
4-
* @deprecated .
5-
* * use format `useUrlState(defaultState, { ...otherParams })`
6-
*
7-
* .
8-
*/
9-
export declare function useUrlState<T extends JSONCompatible>({ defaultState: T, searchParams, replace, scroll, useHistory, }: OldParams<T>): {
10-
/**
11-
* @deprecated use `urlState`
12-
*/
13-
state: T;
14-
urlState: T;
15-
/**
16-
* @deprecated use `setState`
17-
*/
18-
updateState: (value: Partial<T> | ((currState: T) => T)) => void;
19-
setState: (value: Partial<T> | ((currState: T) => T)) => void;
20-
/**
21-
* @deprecated use `setUrl`
22-
*/
23-
updateUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
24-
setUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
25-
};
263
/**
274
* NextJS hook. Returns `urlState`, `setState`, and `setUrl` functions
285
*
@@ -103,13 +80,6 @@ type RouterOptions = NonNullable<Parameters<Router["push"]>[1] | Parameters<Rout
10380
interface Options extends RouterOptions {
10481
replace?: boolean;
10582
}
106-
interface OldParams<T> {
107-
defaultState: T;
108-
searchParams?: object;
109-
replace?: boolean;
110-
scroll?: boolean;
111-
useHistory?: boolean;
112-
}
11383
type Params = {
11484
searchParams?: object;
11585
replace?: boolean;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import a from"react";import{useRouter as C,useSearchParams as H}from"next/navigation";import{parseSPObj as d}from"../../parseSPObj.mjs";import{useUrlStateBase as g}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as U,filterUnknownParams as h,isSSR as v,filterUnknownParamsClient as w}from"../../utils.mjs";function E(t,r){const s="defaultState"in t?t.defaultState:t;const u="defaultState"in t?t.searchParams:r?.searchParams;const l="defaultState"in t?t.useHistory:r?.useHistory;const P="defaultState"in t?{scroll:t.scroll,replace:t.replace}:{scroll:r?.scroll,replace:r?.replace};const o=C();const b=a.useMemo(()=>({push:(...e)=>{if(l===void 0?true:!!l){U.push(...e)}else{o.push(...e)}},replace:(...e)=>{if(l===void 0?true:!!l){U.replace(...e)}else{o.replace(...e)}}}),[o]);const{state:n,updateState:c,updateUrl:i,reset:p,getState:k}=g(s,b,({parse:e})=>{return v?d(h(s,u),s):e(w(s,u))});const f=a.useMemo(()=>({...M,...P}),[]);const m=a.useCallback((e,j)=>i(e,{...f,...j}),[i]);const S=H();a.useLayoutEffect(()=>{c(h(s,d(Object.fromEntries([...S.entries()]),s)))},[S]);const y=a.useCallback(e=>{p({...f,...e})},[p]);return{setState:c,updateState:c,setUrl:m,updateUrl:m,urlState:n,state:n,reset:y,getState:k}}const M={replace:true,scroll:false};export{E as useUrlState};
1+
import s from"react";import{useRouter as k,useSearchParams as C}from"next/navigation";import{parseSPObj as p}from"../../parseSPObj.mjs";import{useUrlStateBase as y}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as m,filterUnknownParams as f,isSSR as g,filterUnknownParamsClient as j}from"../../utils.mjs";function v(t,r){const a=r?.useHistory;const o=k();const S=s.useMemo(()=>({push:(...e)=>{if(a===void 0?true:!!a){m.push(...e)}else{o.push(...e)}},replace:(...e)=>{if(a===void 0?true:!!a){m.replace(...e)}else{o.replace(...e)}}}),[o]);const{state:h,updateState:l,updateUrl:c,reset:u,getState:P}=y(t,S,({parse:e})=>{return g?p(f(t,r?.searchParams),t):e(j(t,r?.searchParams))});const n=s.useMemo(()=>({...w,scroll:r?.scroll,replace:r?.replace}),[]);const U=s.useCallback((e,d)=>c(e,{...n,...d}),[c]);const i=C();s.useLayoutEffect(()=>{l(f(t,p(Object.fromEntries([...i.entries()]),t)))},[i]);const b=s.useCallback(e=>{u({...n,...e})},[u]);return{setState:l,setUrl:U,urlState:h,reset:b,getState:P}}const w={replace:true,scroll:false};export{v as useUrlState};

dist/react-router/useUrlState/useUrlState.d.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,5 @@
11
import { type NavigateOptions } from "react-router-dom";
22
import { type JSONCompatible } from "../../utils";
3-
/**
4-
* @deprecated .
5-
* * use format `useUrlState(defaultState, { ...otherParams })`
6-
*
7-
* .
8-
*/
9-
export declare function useUrlState<T extends JSONCompatible>({ defaultState: T, searchParams, replace, useHistory, }: OldParams<T>): {
10-
/**
11-
* @deprecated use `urlState`
12-
*/
13-
state: T;
14-
urlState: T;
15-
/**
16-
* @deprecated use `setState`
17-
*/
18-
updateState: (value: Partial<T> | ((currState: T) => T)) => void;
19-
setState: (value: Partial<T> | ((currState: T) => T)) => void;
20-
updateUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
21-
setUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
22-
};
233
/**
244
* React-router hook. Returns `urlState`, `setState`, and `setUrl` functions
255
*
@@ -94,12 +74,6 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
9474
[key: string]: unknown;
9575
}) => void;
9676
};
97-
type OldParams<T> = {
98-
defaultState: T;
99-
useHistory?: boolean;
100-
searchParams?: object;
101-
replace?: boolean;
102-
} & NavigateOptions;
10377
interface Params extends NavigateOptions {
10478
useHistory?: boolean;
10579
searchParams?: object;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import a from"react";import{useNavigate as H,useSearchParams as g,useHref as k}from"react-router-dom";import{parseSPObj as P}from"../../parseSPObj.mjs";import{useUrlStateBase as h}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as y,filterUnknownParamsClient as C,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function E(t,l){const r="defaultState"in t?t.defaultState:t;const m="defaultState"in t?t.useHistory:l?.useHistory;const d="defaultState"in t?{replace:t.replace,preventScrollReset:t.preventScrollReset}:{replace:l?.replace,preventScrollReset:l?.preventScrollReset};const o=a.useMemo(()=>({...M,...d}),[]);const n=H();const U=a.useMemo(()=>m?y:{replace:(e,s)=>n(e,{...o,...s}),push:(e,s)=>n(e,{...o,...s})},[n]);const[c]=g();const v=k("/");const{state:p,updateState:u,updateUrl:i,getState:R,reset:S}=h(r,U,({parse:e})=>e(C(r,c.entries())),v);const f=a.useCallback((e,s)=>i(e,{...o,...s}),[i]);a.useEffect(()=>{u(j(r,w(r,P(Object.fromEntries([...c.entries()]),r))))},[c]);const b=a.useCallback(e=>{S({...o,...e})},[S]);return{setState:u,updateState:u,setUrl:f,updateUrl:f,urlState:p,state:p,reset:b,getState:R}}const M={replace:true,preventScrollReset:true};export{E as useUrlState};
1+
import s from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"react-router-dom";import{parseSPObj as h}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as H,filterUnknownParamsClient as R,assignValue as d,filterUnknownParams as j}from"../../utils.mjs";function w(t,a){const i=a?.useHistory;const o=s.useMemo(()=>({...y,replace:a?.replace,preventScrollReset:a?.preventScrollReset}),[]);const n=g();const m=s.useMemo(()=>i?H:{replace:(e,r)=>n(e,{...o,...r}),push:(e,r)=>n(e,{...o,...r})},[n]);const[c]=k();const f=P("/");const{state:S,updateState:l,updateUrl:u,getState:U,reset:p}=C(t,m,({parse:e})=>e(R(t,c.entries())),f);const b=s.useCallback((e,r)=>u(e,{...o,...r}),[u]);s.useEffect(()=>{l(d(t,j(t,h(Object.fromEntries([...c.entries()]),t))))},[c]);const v=s.useCallback(e=>{p({...o,...e})},[p]);return{setState:l,setUrl:b,urlState:S,reset:v,getState:U}}const y={replace:true,preventScrollReset:true};export{w as useUrlState};

dist/remix/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { useUrlState } from "./useUrlState";

dist/remix/index.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import{useUrlState as t}from"./useUrlState/useUrlState.mjs";export{t as useUrlState};

dist/remix/useUrlState/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { useUrlState } from "./useUrlState";

dist/remix/useUrlState/index.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import{useUrlState as t}from"./useUrlState.mjs";export{t as useUrlState};
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { type NavigateOptions } from "react-router-dom";
2+
import { type JSONCompatible } from "../../utils";
3+
/**
4+
* Remix hook. Returns `urlState`, `setState`, and `setUrl` functions
5+
*
6+
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
7+
* @param {Object} params - Object with other parameters
8+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react_router.NavigateOptions.html)
9+
* @param {boolean} params.replace replace URL or push, default `true`
10+
* @param {boolean} params.useHistory use window.history for navigation, default `false`
11+
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
12+
* @returns {Object} [result] State and callbacks
13+
* @returns {Object} [result.state] - current state object
14+
* @returns {Function} [result.setUrl] - function to update state and url
15+
* @returns {Function} [result.setState] - function to update state only
16+
* @returns {Function} [result.reset] - function to reset state and url to default
17+
* * Example:
18+
* ```ts
19+
* export const form = { name: '', age: 0 };
20+
* const { urlState, setState, setUrl } = useUrlState(form, { replace: false, preventScrollReset: false });
21+
*
22+
* setState({ name: 'test' });
23+
* setUrl({ name: 'test' }, { replace: true });
24+
* // similar to React.useState
25+
* setUrl(curr => ({ ...curr, name: 'test' }), { replace: true });
26+
* // reset state and url
27+
* reset();
28+
* reset({ replace: true });
29+
* // same as setState(form) with setUrl(form)
30+
* ```
31+
*
32+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState}
33+
*/
34+
export declare function useUrlState<T extends JSONCompatible>(defaultState: T, params?: Params): {
35+
/**
36+
* State object. Don't mutate directly, use `setState` or `setUrl`
37+
*/
38+
urlState: T;
39+
/**
40+
* * Example:
41+
* ```ts
42+
* setState({ name: 'test' });
43+
* // or
44+
* setState(curr => ({ ...curr, name: 'test' }) );
45+
* ```
46+
*
47+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#updatestate}
48+
*/
49+
setState: (value: Partial<T> | ((currState: T) => T)) => void;
50+
/**
51+
* * Example:
52+
* ```ts
53+
* setUrl({ name: 'test' });
54+
* // or
55+
* setUrl(curr => ({ ...curr, name: 'test' }), { replace: true } );
56+
* // can pass optional React-Router `NavigateOptions`
57+
* setUrl(curr => ({ ...curr, name: 'test' }), { preventScrollReset: false } );
58+
* ```
59+
*
60+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#updateurl}
61+
*/
62+
setUrl: (value?: Partial<T> | ((currState: T) => T), options?: Params) => void;
63+
/**
64+
* * Example:
65+
* ```ts
66+
* reset();
67+
* // or
68+
* reset({ replace: false, preventScrollReset: false })
69+
* ```
70+
*
71+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#reset}
72+
*/
73+
reset: (options?: NavigateOptions & {
74+
[key: string]: unknown;
75+
}) => void;
76+
};
77+
interface Params extends NavigateOptions {
78+
useHistory?: boolean;
79+
searchParams?: object;
80+
replace?: boolean;
81+
}
82+
export {};

0 commit comments

Comments
 (0)