Skip to content

Commit 9367a97

Browse files
committed
chore: update beforeResolve guards
1 parent 591be56 commit 9367a97

File tree

3 files changed

+40
-31
lines changed

3 files changed

+40
-31
lines changed

packages/router/src/navigation-api/index.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ export function createNavigationApiRouter(
860860
}
861861

862862
beforeResolveTransitionGuard = this.beforeResolve(
863-
(to, from, next, info) => {
863+
async (to, from, next, info) => {
864864
const transitionMode =
865865
to.meta.viewTransition ?? defaultTransitionSetting
866866
if (
@@ -871,7 +871,6 @@ export function createNavigationApiRouter(
871871
window.matchMedia('(prefers-reduced-motion: reduce)').matches) ||
872872
!isChangingPage(to, from)
873873
) {
874-
next(true)
875874
return
876875
}
877876

@@ -882,14 +881,12 @@ export function createNavigationApiRouter(
882881

883882
const transition = document.startViewTransition(() => promise)
884883

885-
options.onStart?.(transition)
884+
await options.onStart?.(transition)
886885
transition.finished
887886
.then(() => options.onFinished?.(transition))
888887
.catch(() => options.onAborted?.(transition))
889888
.finally(resetTransitionState)
890889

891-
next(true)
892-
893890
return promise
894891
}
895892
)

packages/router/src/router.ts

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,33 +1438,41 @@ function enableViewTransition(router: Router, options: RouterViewTransition) {
14381438

14391439
window.addEventListener('popstate', popStateListener)
14401440

1441-
const beforeResolveTransitionGuard = router.beforeResolve((to, from) => {
1442-
const transitionMode = to.meta.viewTransition ?? defaultTransitionSetting
1443-
if (
1444-
hasUAVisualTransition ||
1445-
transitionMode === false ||
1446-
(transitionMode !== 'always' &&
1447-
window.matchMedia('(prefers-reduced-motion: reduce)').matches) ||
1448-
!isChangingPage(to, from)
1449-
) {
1450-
return
1451-
}
1441+
const beforeResolveTransitionGuard = router.beforeResolve(
1442+
async (to, from) => {
1443+
const transitionMode = to.meta.viewTransition ?? defaultTransitionSetting
1444+
if (
1445+
hasUAVisualTransition ||
1446+
transitionMode === false ||
1447+
(transitionMode !== 'always' &&
1448+
window.matchMedia('(prefers-reduced-motion: reduce)').matches) ||
1449+
!isChangingPage(to, from)
1450+
) {
1451+
return
1452+
}
14521453

1453-
const promise = new Promise<void>((resolve, reject) => {
1454-
finishTransition = resolve
1455-
abortTransition = reject
1456-
})
1454+
const promise = new Promise<void>((resolve, reject) => {
1455+
finishTransition = resolve
1456+
abortTransition = reject
1457+
})
14571458

1458-
const transition = document.startViewTransition(() => promise)
1459+
let changeRoute: () => void
1460+
const ready = new Promise<void>(resolve => (changeRoute = resolve))
14591461

1460-
options.onStart?.(transition)
1461-
transition.finished
1462-
.then(() => options.onFinished?.(transition))
1463-
.catch(() => options.onAborted?.(transition))
1464-
.finally(resetTransitionState)
1462+
const transition = document.startViewTransition(() => {
1463+
changeRoute()
1464+
return promise
1465+
})
14651466

1466-
return promise
1467-
})
1467+
await options.onStart?.(transition)
1468+
transition.finished
1469+
.then(() => options.onFinished?.(transition))
1470+
.catch(() => options.onAborted?.(transition))
1471+
.finally(resetTransitionState)
1472+
1473+
return ready
1474+
}
1475+
)
14681476

14691477
const afterEachTransitionGuard = router.afterEach(() => {
14701478
finishTransition?.()

packages/router/src/transition.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ export function injectTransitionMode(): TransitionMode {
1111
return inject(transitionModeKey, 'auto')
1212
}
1313

14+
export type RouteViewTransitionHook = (
15+
transition: ViewTransition
16+
) => void | Promise<void>
17+
1418
export interface RouterViewTransition {
1519
defaultViewTransition?: boolean | 'always'
1620
/** Hook called right after the view transition starts */
17-
onStart?: (transition: ViewTransition) => void
21+
onStart?: RouteViewTransitionHook
1822
/** Hook called when the view transition animation is finished */
19-
onFinished?: (transition: ViewTransition) => void
23+
onFinished?: RouteViewTransitionHook
2024
/** Hook called if the transition is aborted */
21-
onAborted?: (transition: ViewTransition) => void
25+
onAborted?: RouteViewTransitionHook
2226
}

0 commit comments

Comments
 (0)