Update useAwaitableNavigate to handle navigations between pages reliably#2889
Update useAwaitableNavigate to handle navigations between pages reliably#2889nikosdouvlis wants to merge 2 commits intorelease/v4from
Conversation
🦋 Changeset detectedLatest commit: 86eb801 The changes in this PR will be included in the next version bump. This PR includes changesets to release 4 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
ccc301f to
91efa8f
Compare
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.v91efa8f --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.v91efa8f --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.v91efa8f --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.v91efa8f --save-exact |
91efa8f to
c9a521b
Compare
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.vc9a521b --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.vc9a521b --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.vc9a521b --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.vc9a521b --save-exact |
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.vc9a521b --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.vc9a521b --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.vc9a521b --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.vc9a521b --save-exact |
c9a521b to
41e6fdb
Compare
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.v6eb1bf8 --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.v6eb1bf8 --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.v6eb1bf8 --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.v6eb1bf8 --save-exact |
6eb1bf8 to
1d4dfe6
Compare
| * https://nextjs.org/docs/app/building-your-application/caching#invalidation-1 | ||
| */ | ||
| export const invalidateCacheAction = async () => { | ||
| cookies().delete(`__clerk_random_cookie_${Date.now()}`); |
There was a problem hiding this comment.
❓ According to the docs linked, calling router.refresh() will clear the cache. Why do we need to use the cookies approach?
There was a problem hiding this comment.
According to the docs, router.refresh() invalidates the cache for the current router not for all routes. If we are at '/path' and the '/' route is cached, navigating to / will use the cached payload even after firing refresh()
See: https://nextjs.org/docs/app/building-your-application/caching#invalidation-1
There was a problem hiding this comment.
Interesting, I read it as it invalidates the router cache, not just for the current route, but if what you have here works or addresses some issue you experienced with router.refresh() then lgtm 😀
| clerkNavRef.current = (to, opts) => { | ||
| return new Promise<void>(res => { | ||
| clerkNavPromiseBuffer.current.push(res); | ||
| startTransition(() => { |
There was a problem hiding this comment.
I believe removing the transition here will re-introduce the original issue, which is that state updates were happening during the router transition, or that the setActive call was not completing at all because of the navigation triggered by onBeforeSetActive.
Is there a way we can retain the use of the transition while keeping the buffer on the window?
There was a problem hiding this comment.
We'll most likely keep using the transition API - this is removed temporarily so I can cut a snapshot version for testing
There was a problem hiding this comment.
setActive call was not completing at all because of the navigation triggered by onBeforeSetActive
Regarding this one, I never managed to reproduce a failed setActive because of us not listening to isPending
I think the issue was caused by the components being unmounted during navigation but I do agree that keep using transition state is the way to go here
| router.refresh(); | ||
| router.push(window.location.href); | ||
| } | ||
| return invalidateCacheAction(); |
There was a problem hiding this comment.
Wouldn't we want to invalidate the router cache in onAfterSetActive? Why in before?
There was a problem hiding this comment.
We want to invalidate the router cache before a navigation occurs, otherwise the navigation might not fire atll . Currently, the order is: setActive > onBeforeSetActive > beforeEmit() > onAfterSetActive
1d4dfe6 to
40af74c
Compare
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.v40af74c --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.v40af74c --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.v40af74c --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.v40af74c --save-exact |
…tween pages reliably We need to use window to store the reference to the buffer, as ClerkProvider might be unmounted and remounted during navigations. If we use a ref, it will be reset when ClerkProvider is unmounted
40af74c to
5470ea6
Compare
…tween pages reliably We need to use window to store the reference to the buffer, as ClerkProvider might be unmounted and remounted during navigations. If we use a ref, it will be reset when ClerkProvider is unmounted
|
!snapshot |
|
Hey @nikosdouvlis - the snapshot version command generated the following package versions:
Tip: Use the snippet copy button below to quickly install the required packages. npm i @clerk/chrome-extension@0.6.12-snapshot.v86eb801 --save-exact
npm i @clerk/clerk-js@4.70.2-snapshot.v86eb801 --save-exact
npm i @clerk/clerk-expo@0.20.7-snapshot.v86eb801 --save-exact
npm i @clerk/nextjs@4.29.9-snapshot.v86eb801 --save-exact |
|
This released was included in the v5 beta release and so far everything seems to be working as expected. However, we've had no other reports for unexpected behavior in v4. GIven that this fix could introduce breaking behavior for v4 apps, even if extremely unlikely, I'm closing this for now. We will merge and release if we receive any other reports. |
We need to use window to store the reference to the buffer, as ClerkProvider might be unmounted and remounted during navigations. If we use a ref, it will be reset when ClerkProvider is unmounted
Description
Checklist
npm testruns as expected.npm run buildruns as expected.Type of change