diff --git a/packages/core/src/history.ts b/packages/core/src/history.ts index 361a8345f..1cd980de1 100644 --- a/packages/core/src/history.ts +++ b/packages/core/src/history.ts @@ -11,6 +11,8 @@ class History { public preserveUrl = false protected current: Partial = {} protected queue: (() => Promise)[] = [] + // We need initialState for `restore` + protected initialState: Partial | null = null public remember(data: unknown, key: string): void { this.replaceState({ @@ -24,7 +26,7 @@ class History { public restore(key: string): unknown { if (!isServer) { - return this.getState<{ [key: string]: any }>(this.rememberedState, {})?.[key] + return this.initialState?.[this.rememberedState]?.[key] } } @@ -77,7 +79,11 @@ class History { throw new Error('Unable to decrypt history') } - this.current = data ?? {} + if (this.initialState === null) { + this.initialState = data ?? undefined + } else { + this.current = data ?? {} + } return data }) diff --git a/tests/deferred-props.spec.ts b/tests/deferred-props.spec.ts index ef40288ef..f8691e982 100644 --- a/tests/deferred-props.spec.ts +++ b/tests/deferred-props.spec.ts @@ -36,3 +36,29 @@ test('can load deferred props', async ({ page }) => { await expect(page.getByText('qux value')).toBeVisible() await expect(page.getByText('both baz value and qux value')).toBeVisible() }) + +test('we are not caching deferred props after reload', async ({ page }) => { + await page.goto('/deferred-props/page-1') + + await expect(page.getByText('Loading foo...')).toBeVisible() + await expect(page.getByText('Loading bar...')).toBeVisible() + + await page.waitForResponse(page.url()) + + await expect(page.getByText('Loading foo...')).not.toBeVisible() + await expect(page.getByText('Loading bar...')).not.toBeVisible() + await expect(page.getByText('foo value')).toBeVisible() + await expect(page.getByText('bar value')).toBeVisible() + + await page.reload() + + await expect(page.getByText('Loading foo...')).toBeVisible() + await expect(page.getByText('Loading bar...')).toBeVisible() + + await page.waitForResponse(page.url()) + + await expect(page.getByText('Loading foo...')).not.toBeVisible() + await expect(page.getByText('Loading bar...')).not.toBeVisible() + await expect(page.getByText('foo value')).toBeVisible() + await expect(page.getByText('bar value')).toBeVisible() +})