Skip to content

Commit 24cde3c

Browse files
committed
feat: Add preserveUrl option.
1 parent ca7e7cb commit 24cde3c

File tree

9 files changed

+67
-4
lines changed

9 files changed

+67
-4
lines changed

packages/core/src/router.ts

+19-4
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ export class Router {
162162
})
163163
}
164164

165-
protected locationVisit(url: URL, preserveScroll: LocationVisit['preserveScroll']): boolean | void {
165+
protected locationVisit(url: URL, preserveScroll: LocationVisit['preserveScroll'], preserveUrl: LocationVisit['preserveUrl']): boolean | void {
166166
try {
167-
const locationVisit: LocationVisit = { preserveScroll }
167+
const locationVisit: LocationVisit = { preserveScroll, preserveUrl }
168168
window.sessionStorage.setItem('inertiaLocationVisit', JSON.stringify(locationVisit))
169169
window.location.href = url.href
170170
if (urlWithoutHash(window.location).href === urlWithoutHash(url).href) {
@@ -189,7 +189,11 @@ export class Router {
189189
page.url += window.location.hash
190190
page.rememberedState = window.history.state?.rememberedState ?? {}
191191
page.scrollRegions = window.history.state?.scrollRegions ?? []
192-
this.setPage(page, { preserveScroll: locationVisit.preserveScroll, preserveState: true }).then(() => {
192+
this.setPage(page, {
193+
preserveScroll: locationVisit.preserveScroll,
194+
preserveUrl: locationVisit.preserveUrl,
195+
preserveState: true,
196+
}).then(() => {
193197
if (locationVisit.preserveScroll) {
194198
this.restoreScrollPositions()
195199
}
@@ -259,6 +263,7 @@ export class Router {
259263
replace = false,
260264
preserveScroll = false,
261265
preserveState = false,
266+
preserveUrl = false,
262267
only = [],
263268
headers = {},
264269
errorBag = '',
@@ -293,6 +298,7 @@ export class Router {
293298
replace,
294299
preserveScroll,
295300
preserveState,
301+
preserveUrl,
296302
only,
297303
headers,
298304
errorBag,
@@ -378,6 +384,7 @@ export class Router {
378384
}
379385
preserveScroll = this.resolvePreserveOption(preserveScroll, pageResponse) as boolean
380386
preserveState = this.resolvePreserveOption(preserveState, pageResponse)
387+
preserveUrl = this.resolvePreserveOption(preserveUrl, pageResponse) as boolean
381388
if (preserveState && window.history.state?.rememberedState && pageResponse.component === this.page.component) {
382389
pageResponse.rememberedState = window.history.state.rememberedState
383390
}
@@ -408,7 +415,7 @@ export class Router {
408415
if (requestUrl.hash && !locationUrl.hash && urlWithoutHash(requestUrl).href === locationUrl.href) {
409416
locationUrl.hash = requestUrl.hash
410417
}
411-
this.locationVisit(locationUrl, preserveScroll === true)
418+
this.locationVisit(locationUrl, preserveScroll === true, preserveUrl === true)
412419
} else if (error.response) {
413420
if (fireInvalidEvent(error.response)) {
414421
modal.show(error.response.data)
@@ -442,19 +449,27 @@ export class Router {
442449
replace = false,
443450
preserveScroll = false,
444451
preserveState = false,
452+
preserveUrl = false,
445453
}: {
446454
visitId?: VisitId
447455
replace?: boolean
448456
preserveScroll?: PreserveStateOption
449457
preserveState?: PreserveStateOption
458+
preserveUrl?: PreserveStateOption
450459
} = {},
451460
): Promise<void> {
452461
return Promise.resolve(this.resolveComponent(page.component)).then((component) => {
453462
if (visitId === this.visitId) {
454463
page.scrollRegions = page.scrollRegions || []
455464
page.rememberedState = page.rememberedState || {}
456465
replace = replace || hrefToUrl(page.url).href === window.location.href
466+
467+
if (preserveUrl) {
468+
page.url = window.location.href
469+
}
470+
457471
replace ? this.replaceState(page) : this.pushState(page)
472+
458473
this.swapComponent({ component, page, preserveState }).then(() => {
459474
if (!preserveScroll) {
460475
this.resetScrollPositions()

packages/core/src/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export type Progress = AxiosProgressEvent
6161

6262
export type LocationVisit = {
6363
preserveScroll: boolean
64+
preserveUrl: boolean
6465
}
6566

6667
export type Visit = {
@@ -69,6 +70,7 @@ export type Visit = {
6970
replace: boolean
7071
preserveScroll: PreserveStateOption
7172
preserveState: PreserveStateOption
73+
preserveUrl: PreserveStateOption
7274
only: Array<string>
7375
headers: Record<string, string>
7476
errorBag: string | null

packages/react/src/Link.ts

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ interface BaseInertiaLinkProps {
2020
onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void
2121
preserveScroll?: PreserveStateOption
2222
preserveState?: PreserveStateOption
23+
preserveUrl?: PreserveStateOption
2324
replace?: boolean
2425
only?: string[]
2526
onCancelToken?: (cancelToken: import('axios').CancelTokenSource) => void
@@ -47,6 +48,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
4748
method = 'get',
4849
preserveScroll = false,
4950
preserveState = null,
51+
preserveUrl = false,
5052
replace = false,
5153
only = [],
5254
headers = {},
@@ -76,6 +78,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
7678
method,
7779
preserveScroll,
7880
preserveState: preserveState ?? method !== 'get',
81+
preserveUrl,
7982
replace,
8083
only,
8184
headers,
@@ -96,6 +99,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
9699
method,
97100
preserveScroll,
98101
preserveState,
102+
preserveUrl,
99103
replace,
100104
only,
101105
headers,

packages/svelte/src/Link.svelte

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
export let replace = false
1010
export let preserveScroll = false
1111
export let preserveState = null
12+
export let preserveUrl = false
1213
export let only = []
1314
export let headers = {}
1415
export let queryStringArrayFormat = 'brackets'
@@ -32,6 +33,7 @@
3233
replace,
3334
preserveScroll,
3435
preserveState: preserveState ?? method !== 'get',
36+
preserveUrl,
3537
only,
3638
headers,
3739
queryStringArrayFormat,

packages/vue2/src/link.ts

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface InertiaLinkProps {
1818
onClick?: (event: MouseEvent) => void
1919
preserveScroll?: PreserveStateOption
2020
preserveState?: PreserveStateOption
21+
preserveUrl?: PreserveStateOption
2122
replace?: boolean
2223
only?: string[]
2324
onCancelToken?: (cancelToken: import('axios').CancelTokenSource) => void
@@ -62,6 +63,10 @@ const Link: InertiaLink = {
6263
type: Boolean,
6364
default: null,
6465
},
66+
preserveUrl: {
67+
type: Boolean,
68+
default: false,
69+
},
6570
only: {
6671
type: Array,
6772
default: () => [],
@@ -126,6 +131,7 @@ const Link: InertiaLink = {
126131
replace: props.replace,
127132
preserveScroll: props.preserveScroll,
128133
preserveState: props.preserveState ?? method !== 'get',
134+
preserveUrl: props.preserveUrl,
129135
only: props.only,
130136
headers: props.headers,
131137
// @ts-expect-error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<template>
2+
<div>
3+
<span @click="preserve" class="preserve">Preserve Url</span>
4+
</div>
5+
</template>
6+
<script>
7+
export default {
8+
methods: {
9+
preserve() {
10+
this.$inertia.get('/visits/preserve-url?page=2', {}, {
11+
preserveUrl: true,
12+
})
13+
},
14+
}
15+
}
16+
</script>

packages/vue2/tests/app/server.js

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ app.get('/visits/headers/version', (req, res) =>
9797
inertia.render(req, res, { component: 'Visits/Headers', version: 'example-version-header' }),
9898
)
9999

100+
app.all('/visits/preserve-url', (req, res) =>
101+
inertia.render(req, res, { component: 'Visits/PreserveUrl' }))
102+
100103
app.post('/remember/form-helper/default', (req, res) =>
101104
inertia.render(req, res, {
102105
component: 'Remember/FormHelper/Default',

packages/vue2/tests/cypress/integration/manual-visits.test.js

+9
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,15 @@ describe('Manual Visits', () => {
12091209
})
12101210
})
12111211

1212+
describe('Preserve url', () => {
1213+
it('does preserves the url if the perserveUrl flag is passed', () => {
1214+
cy.visit('/visits/preserve-url')
1215+
1216+
cy.get('.preserve').click()
1217+
cy.url().should('eq', Cypress.config().baseUrl + '/visits/preserve-url')
1218+
});
1219+
})
1220+
12121221
describe('URL fragment navigation (& automatic scrolling)', () => {
12131222
/** @see https://github.com/inertiajs/inertia/pull/257 */
12141223

packages/vue3/src/link.ts

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface InertiaLinkProps {
1010
onClick?: (event: MouseEvent) => void
1111
preserveScroll?: boolean | ((props: PageProps) => boolean)
1212
preserveState?: boolean | ((props: PageProps) => boolean) | null
13+
preserveUrl?: boolean | ((props: PageProps) => boolean)
1314
replace?: boolean
1415
only?: string[]
1516
onCancelToken?: (cancelToken: import('axios').CancelTokenSource) => void
@@ -55,6 +56,10 @@ const Link: InertiaLink = defineComponent({
5556
type: Boolean,
5657
default: null,
5758
},
59+
preserveUrl: {
60+
type: Boolean,
61+
default: false,
62+
},
5863
only: {
5964
type: Array<string>,
6065
default: () => [],
@@ -95,6 +100,7 @@ const Link: InertiaLink = defineComponent({
95100
replace: props.replace,
96101
preserveScroll: props.preserveScroll,
97102
preserveState: props.preserveState ?? method !== 'get',
103+
preserveUrl: props.preserveUrl,
98104
only: props.only,
99105
headers: props.headers,
100106
// @ts-expect-error

0 commit comments

Comments
 (0)