Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/core/src/history.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ class History {

protected getPageData(page: Page): Promise<Page | ArrayBuffer> {
return new Promise((resolve) => {
if (page.temporaryProps) {
page.temporaryProps.forEach((key) => { delete page.props[key] })
}
return page.encryptHistory ? encryptHistory(page).then(resolve) : resolve(page)
})
}
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ export interface Page<SharedProps extends PageProps = PageProps> {
mergeProps?: string[]
deepMergeProps?: string[]
matchPropsOn?: string[]
temporaryProps?: string[]

/** @internal */
rememberedState: Record<string, unknown>
Expand Down
18 changes: 18 additions & 0 deletions packages/react/test-app/Pages/TemporaryProps.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Link } from '@inertiajs/react'

export default function TemporaryProps({
regular,
tmp,
}: {
regular?: number
tmp?: number
}) {
return (
<>
<div>regular is {regular ?? 'undefined'}</div>
<div>tmp is {tmp ?? 'undefined'}</div>

<Link href="/">homepage</Link>
</>
)
}
10 changes: 10 additions & 0 deletions packages/svelte/test-app/Pages/TemporaryProps.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<script lang="ts">
import { Link } from '@inertiajs/svelte'

export let regular: number | undefined
export let tmp: number | undefined
</script>

<div>regular is {regular ?? 'undefined'}</div>
<div>tmp is {tmp ?? 'undefined'}</div>
<Link href="/">homepage</Link>
14 changes: 14 additions & 0 deletions packages/vue3/test-app/Pages/TemporaryProps.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<script setup lang="ts">
import { Link } from '@inertiajs/vue3'

defineProps<{
regular?: number
tmp?: number
}>()
</script>

<template>
<div>regular is {{ regular ?? 'undefined' }}</div>
<div>tmp is {{ tmp ?? 'undefined' }}</div>
<Link href="/">homepage</Link>
</template>
11 changes: 11 additions & 0 deletions tests/app/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -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, {
Expand Down
19 changes: 19 additions & 0 deletions tests/temporary-props.spec.ts
Original file line number Diff line number Diff line change
@@ -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()
})