Skip to content

Commit b21f205

Browse files
committed
feat: Add preserveUrl option.
1 parent 683155c commit b21f205

File tree

8 files changed

+65
-4
lines changed

8 files changed

+65
-4
lines changed

packages/core/src/router.ts

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

166-
protected locationVisit(url: URL, preserveScroll: LocationVisit['preserveScroll']): boolean | void {
166+
protected locationVisit(url: URL, preserveScroll: LocationVisit['preserveScroll'], preserveUrl: LocationVisit['preserveUrl']): boolean | void {
167167
try {
168-
const locationVisit: LocationVisit = { preserveScroll }
168+
const locationVisit: LocationVisit = { preserveScroll, preserveUrl }
169169
window.sessionStorage.setItem('inertiaLocationVisit', JSON.stringify(locationVisit))
170170
window.location.href = url.href
171171
if (urlWithoutHash(window.location).href === urlWithoutHash(url).href) {
@@ -190,7 +190,11 @@ export class Router {
190190
page.url += window.location.hash
191191
page.rememberedState = window.history.state?.rememberedState ?? {}
192192
page.scrollRegions = window.history.state?.scrollRegions ?? []
193-
this.setPage(page, { preserveScroll: locationVisit.preserveScroll, preserveState: true }).then(() => {
193+
this.setPage(page, {
194+
preserveScroll: locationVisit.preserveScroll,
195+
preserveUrl: locationVisit.preserveUrl,
196+
preserveState: true,
197+
}).then(() => {
194198
if (locationVisit.preserveScroll) {
195199
this.restoreScrollPositions()
196200
}
@@ -260,6 +264,7 @@ export class Router {
260264
replace = false,
261265
preserveScroll = false,
262266
preserveState = false,
267+
preserveUrl = false,
263268
only = [],
264269
except = [],
265270
headers = {},
@@ -295,6 +300,7 @@ export class Router {
295300
replace,
296301
preserveScroll,
297302
preserveState,
303+
preserveUrl,
298304
only,
299305
except,
300306
headers,
@@ -394,6 +400,7 @@ export class Router {
394400
}
395401
preserveScroll = this.resolvePreserveOption(preserveScroll, pageResponse) as boolean
396402
preserveState = this.resolvePreserveOption(preserveState, pageResponse)
403+
preserveUrl = this.resolvePreserveOption(preserveUrl, pageResponse) as boolean
397404
if (preserveState && window.history.state?.rememberedState && pageResponse.component === this.page.component) {
398405
pageResponse.rememberedState = window.history.state.rememberedState
399406
}
@@ -424,7 +431,7 @@ export class Router {
424431
if (requestUrl.hash && !locationUrl.hash && urlWithoutHash(requestUrl).href === locationUrl.href) {
425432
locationUrl.hash = requestUrl.hash
426433
}
427-
this.locationVisit(locationUrl, preserveScroll === true)
434+
this.locationVisit(locationUrl, preserveScroll === true, preserveUrl === true)
428435
} else if (error.response) {
429436
if (fireInvalidEvent(error.response)) {
430437
modal.show(error.response.data)
@@ -458,19 +465,27 @@ export class Router {
458465
replace = false,
459466
preserveScroll = false,
460467
preserveState = false,
468+
preserveUrl = false,
461469
}: {
462470
visitId?: VisitId
463471
replace?: boolean
464472
preserveScroll?: PreserveStateOption
465473
preserveState?: PreserveStateOption
474+
preserveUrl?: PreserveStateOption
466475
} = {},
467476
): Promise<void> {
468477
return Promise.resolve(this.resolveComponent(page.component)).then((component) => {
469478
if (visitId === this.visitId) {
470479
page.scrollRegions = page.scrollRegions || []
471480
page.rememberedState = page.rememberedState || {}
472481
replace = replace || hrefToUrl(page.url).href === window.location.href
482+
483+
if (preserveUrl) {
484+
page.url = window.location.href
485+
}
486+
473487
replace ? this.replaceState(page) : this.pushState(page)
488+
474489
this.swapComponent({ component, page, preserveState }).then(() => {
475490
if (!preserveScroll) {
476491
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
except: Array<string>
7476
headers: Record<string, string>

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
except?: string[]
@@ -48,6 +49,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
4849
method = 'get',
4950
preserveScroll = false,
5051
preserveState = null,
52+
preserveUrl = false,
5153
replace = false,
5254
only = [],
5355
except = [],
@@ -78,6 +80,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
7880
method,
7981
preserveScroll,
8082
preserveState: preserveState ?? method !== 'get',
83+
preserveUrl,
8184
replace,
8285
only,
8386
except,
@@ -99,6 +102,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
99102
method,
100103
preserveScroll,
101104
preserveState,
105+
preserveUrl,
102106
replace,
103107
only,
104108
except,

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
except?: string[]
@@ -63,6 +64,10 @@ const Link: InertiaLink = {
6364
type: Boolean,
6465
default: null,
6566
},
67+
preserveUrl: {
68+
type: Boolean,
69+
default: false,
70+
},
6671
only: {
6772
type: Array,
6873
default: () => [],
@@ -131,6 +136,7 @@ const Link: InertiaLink = {
131136
replace: props.replace,
132137
preserveScroll: props.preserveScroll,
133138
preserveState: props.preserveState ?? method !== 'get',
139+
preserveUrl: props.preserveUrl,
134140
only: props.only,
135141
except: props.except,
136142
headers: props.headers,
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
except?: string[]
@@ -56,6 +57,10 @@ const Link: InertiaLink = defineComponent({
5657
type: Boolean,
5758
default: null,
5859
},
60+
preserveUrl: {
61+
type: Boolean,
62+
default: false,
63+
},
5964
only: {
6065
type: Array<string>,
6166
default: () => [],
@@ -100,6 +105,7 @@ const Link: InertiaLink = defineComponent({
100105
replace: props.replace,
101106
preserveScroll: props.preserveScroll,
102107
preserveState: props.preserveState ?? method !== 'get',
108+
preserveUrl: props.preserveUrl,
103109
only: props.only,
104110
except: props.except,
105111
headers: props.headers,

0 commit comments

Comments
 (0)