diff --git a/packages/core/src/history.ts b/packages/core/src/history.ts index 3393295a5..65de7e358 100644 --- a/packages/core/src/history.ts +++ b/packages/core/src/history.ts @@ -66,6 +66,9 @@ class History { protected getPageData(page: Page): Promise { return new Promise((resolve) => { + if (page.temporaryProps) { + page.temporaryProps.forEach((key) => { delete page.props[key] }) + } return page.encryptHistory ? encryptHistory(page).then(resolve) : resolve(page) }) } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 46fcc7f1b..407fa5f76 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -117,6 +117,7 @@ export interface Page { mergeProps?: string[] deepMergeProps?: string[] matchPropsOn?: string[] + temporaryProps?: string[] /** @internal */ rememberedState: Record diff --git a/packages/react/test-app/Pages/TemporaryProps.tsx b/packages/react/test-app/Pages/TemporaryProps.tsx new file mode 100644 index 000000000..8ea098616 --- /dev/null +++ b/packages/react/test-app/Pages/TemporaryProps.tsx @@ -0,0 +1,18 @@ +import { Link } from '@inertiajs/react' + +export default function TemporaryProps({ + regular, + tmp, +}: { + regular?: number + tmp?: number +}) { + return ( + <> +
regular is {regular ?? 'undefined'}
+
tmp is {tmp ?? 'undefined'}
+ + homepage + + ) +} diff --git a/packages/svelte/test-app/Pages/TemporaryProps.svelte b/packages/svelte/test-app/Pages/TemporaryProps.svelte new file mode 100644 index 000000000..be790ce77 --- /dev/null +++ b/packages/svelte/test-app/Pages/TemporaryProps.svelte @@ -0,0 +1,10 @@ + + +
regular is {regular ?? 'undefined'}
+
tmp is {tmp ?? 'undefined'}
+homepage diff --git a/packages/vue3/test-app/Pages/TemporaryProps.vue b/packages/vue3/test-app/Pages/TemporaryProps.vue new file mode 100644 index 000000000..c233f3a0c --- /dev/null +++ b/packages/vue3/test-app/Pages/TemporaryProps.vue @@ -0,0 +1,14 @@ + + + diff --git a/tests/app/server.js b/tests/app/server.js index 0a8c769e6..64a9010b1 100644 --- a/tests/app/server.js +++ b/tests/app/server.js @@ -285,6 +285,17 @@ app.get('/history/version/:pageNumber', (req, res) => { }) }) +app.get('/temporary-props', (req, res) => { + inertia.render(req, res, { + component: 'TemporaryProps', + props: { + regular: 1, + tmp: 1, + }, + temporaryProps: ['tmp'] + }) +}) + app.get('/when-visible', (req, res) => { const page = () => inertia.render(req, res, { diff --git a/tests/temporary-props.spec.ts b/tests/temporary-props.spec.ts new file mode 100644 index 000000000..2cad335f4 --- /dev/null +++ b/tests/temporary-props.spec.ts @@ -0,0 +1,19 @@ +import { expect, test } from '@playwright/test' + +test('temporary props disappear after partial reload and remain absent on back', async ({ page }) => { + await page.goto('/temporary-props') + + // Initially, both props are present + await expect(page.getByText('regular is 1')).toBeVisible() + await expect(page.getByText('tmp is 1')).toBeVisible() + + // Navigate away and then go back to ensure history state doesn't contain tmp + await page.getByRole('link', { name: 'homepage' }).click() + await page.waitForURL('/') + await page.goBack() + await page.waitForURL('/temporary-props') + + await expect(page.getByText('regular is 1')).toBeVisible() + // tmp should be absent when pulled from history + await expect(page.getByText('tmp is undefined')).toBeVisible() +})