From 9392a19b3863bc73469ceaf32ae5aa686b5845c5 Mon Sep 17 00:00:00 2001 From: asmyshlyaev177 Date: Thu, 30 Jan 2025 12:42:40 +0400 Subject: [PATCH] fix: reset state independent from URL in 'reset' cb --- .../useUrlStateBase/useUrlStateBase.test.ts | 24 +++++++++++++++++++ .../useUrlStateBase/useUrlStateBase.ts | 7 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/urlstate/useUrlStateBase/useUrlStateBase.test.ts b/packages/urlstate/useUrlStateBase/useUrlStateBase.test.ts index ff8d7cb..33d657c 100644 --- a/packages/urlstate/useUrlStateBase/useUrlStateBase.test.ts +++ b/packages/urlstate/useUrlStateBase/useUrlStateBase.test.ts @@ -499,6 +499,30 @@ describe('useUrlStateBase', () => { expect(result.current.state).toStrictEqual(shape); }); + test('reset state independent from URL', async () => { + vi.useFakeTimers({ + toFake: ['setTimeout'] + }); + vi.mocked(utils).isSSR = false; + + const { result } = renderHook(() => useUrlStateBase(shape, router)); + + act(() => { + result.current.updateState({ str: 'test'}); + }) + expect(result.current.state).toStrictEqual({...shape, str: 'test' }); + + act(() => { + result.current.reset(); + }) + await vi.advanceTimersByTime(700); + await vi.advanceTimersByTime(700); + + expect(router.replace).not.toHaveBeenCalled() + expect(router.push).not.toHaveBeenCalledTimes(1) + expect(result.current.state).toStrictEqual(shape); + }); + test('with replace', async () => { vi.useFakeTimers({ toFake: ['setTimeout'] diff --git a/packages/urlstate/useUrlStateBase/useUrlStateBase.ts b/packages/urlstate/useUrlStateBase/useUrlStateBase.ts index d332c7e..e852598 100644 --- a/packages/urlstate/useUrlStateBase/useUrlStateBase.ts +++ b/packages/urlstate/useUrlStateBase/useUrlStateBase.ts @@ -91,14 +91,15 @@ export function useUrlStateBase( ...getState(), ...value, }; + + setState(newVal); + const qStr = stringify(newVal, getOtherParams(defaultState)); const newUrl = `${window.location.pathname}${qStr.length ? "?" : ""}${qStr}${window.location.hash}`; const currUrl = `${window.location.pathname}${window.location.search}${window.location.hash}`; if (newUrl === currUrl) return; - setState(newVal); - const { replace, ..._rest } = options || {}; queue.current.push([replace ? "replace" : "push", newUrl, _rest]); @@ -123,7 +124,7 @@ export function useUrlStateBase( (options?: Options) => { updateUrl(defaultState, options); }, - [updateUrl], + [updateUrl, setState], ); return {