Skip to content

Preserve deep-linked report route during onboarding guard redirect#86390

Open
MelvinBot wants to merge 12 commits intomainfrom
claude-preserveDeepLinkDuringOnboardingRedirect-v2
Open

Preserve deep-linked report route during onboarding guard redirect#86390
MelvinBot wants to merge 12 commits intomainfrom
claude-preserveDeepLinkDuringOnboardingRedirect-v2

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

@MelvinBot MelvinBot commented Mar 26, 2026

Explanation of Change

This is a re-creation of the reverted PR #85556 with identical changes.

When an unauthenticated user visits a direct report deep link (e.g., /r/7075912447943023), signs in as a new account, and gets redirected to onboarding, the deep-linked report route is lost. This happens because handleNavigationGuards in RootStackRouter.ts completely replaces the navigation state when the OnboardingGuard fires a REDIRECT — the state becomes [Home, OnboardingModalNavigator] instead of preserving the existing report route.

This PR modifies handleNavigationGuards so that when a REDIRECT adds a modal route (like the OnboardingModalNavigator), the existing fullscreen/base routes (like the deep-linked report) are preserved instead of being replaced with Home. The navigation state becomes [ReportsSplitNavigator(deep-linked report), OnboardingModalNavigator], so when onboarding completes and the modal is dismissed, the user lands on their deep-linked report.

When no existing fullscreen routes are present or the redirect doesn't include modal routes, the behavior falls back to the previous logic.

Fixed Issues

$ #85242
PROPOSAL: #85242 (comment)

Tests

  1. Go to https://dev.new.expensify.com/r/7075912447943023 while signed out
  2. Click "Sign in"
  3. Enter a new email and sign up as a new account
  4. Select the "Something else" option for onboarding
  5. Complete the onboarding flow
  6. Verify that after onboarding, you land on the deep-linked report room instead of the home page
  • Verify that no errors appear in the JS console

Offline tests

N/A - This change affects navigation state during the sign-in/onboarding flow which requires network connectivity.

QA Steps

  1. Go to https://staging.new.expensify.com/r/7075912447943023 while signed out
  2. Click "Sign in"
  3. Enter a new email and sign up as a new account
  4. Select the "Something else" option for onboarding
  5. Complete the onboarding flow
  6. Verify that after onboarding, you land on the deep-linked report room instead of the home page
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

When the OnboardingGuard fires a REDIRECT, handleNavigationGuards was
replacing the entire navigation state with [Home, OnboardingModalNavigator].
This discarded any existing fullscreen routes, including a deep-linked
report that the user was trying to access before signing in.

Now we separate the redirect state into fullscreen (base) and modal routes.
If the current state already has fullscreen routes and the redirect adds
modal routes, we preserve the existing fullscreen routes and layer the
modal routes on top. This means the navigation state becomes
[ReportsSplitNavigator(deep-linked report), OnboardingModalNavigator]
instead of [Home, OnboardingModalNavigator], so when onboarding completes
and the modal is dismissed, the user lands on their deep-linked report.

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@bernhardoj
Copy link
Copy Markdown
Contributor

Hold on #85660 (comment)

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot please merge with main

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23635905944

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot please merge with the main branch

…nkDuringOnboardingRedirect-v2

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Successfully merged main into this branch. The merge brought in 301 changed files with no conflicts.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The failing check (test (job 1)) is unrelated to this PR.

Analysis: The test tests/unit/CardFeedUtilsTest.ts failed with a SIGSEGV (segmentation fault) — a jest worker process was killed by the OS, likely due to memory pressure in CI. This is a flaky infrastructure issue, not a code error. All 1140 tests that actually ran passed successfully.

Evidence: This PR only changes RootStackRouter.ts and handleNavigationGuardRedirect.test.ts (navigation code). The crashing test (CardFeedUtilsTest.ts) is in a completely different domain (card feed utilities) and has no relation to the PR's changes. The navigation guard test added by this PR (handleNavigationGuardRedirect.test.ts) passed successfully.

Re-running the failing job should resolve this.

@bernhardoj
Copy link
Copy Markdown
Contributor

bernhardoj commented Mar 27, 2026

@MelvinBot mark this PR as ready

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23638630176

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot mark this PR as ready

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23638673642

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot mark this PR as ready

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23639248265

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot mark this PR as ready

@MelvinBot MelvinBot marked this pull request as ready for review March 27, 2026 10:53
@MelvinBot MelvinBot requested a review from a team as a code owner March 27, 2026 10:53
@melvin-bot melvin-bot Bot requested a review from bernhardoj March 27, 2026 10:53
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done! This PR has been marked as ready for review.

@melvin-bot melvin-bot Bot requested review from heyjennahay and removed request for a team March 27, 2026 10:53
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented Mar 27, 2026

@bernhardoj Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot melvin-bot Bot removed the request for review from a team March 27, 2026 10:53
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ed1c51ff6e

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +101 to +102
if (redirectRoute && state.routes[state.index]?.name === redirectRoute.name) {
return state;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Compare full redirect target before short-circuiting

This early return only compares the top-level route name, so redirects to different onboarding steps are treated as duplicates once OnboardingModalNavigator is focused. OnboardingGuard computes step-specific redirect paths (e.g., purpose vs employees) but they share the same root navigator name; returning state here skips the reset and also bypasses downstream action handling, which can leave users stuck on an outdated onboarding step instead of being redirected to the newly required one.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I really think this is unneeded as well as wrong.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need this, otherwise multiple onboarding modal will be added when we refresh the app. (multiple navigation actions are fired).

I wanna test comparing findFocusedRoute(state).name === findFocusedRoute(redirectState).name, but got distracted with other things and forget to come back to this 🤦

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong this change BTW caused a regression. If you proceed up to accounting stage of onboarding(selecting manage teams) and deeplink to purpose page you are now not correctly redirected to oboarding-account page.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanna test comparing findFocusedRoute(state).name === findFocusedRoute(redirectState).name, but got distracted with other things and forget to come back to this

Yep, that's why I say this ^. If we use findFocusedRoute(state).name === findFocusedRoute(redirectState).name, then that won't happen. But there is another problem.

When we open onboarding/purpose by changing the URL, the root state will be [Home, OnboardingModalNavigator (with the onboarding purpose screen)], then the REDIRECT guard will add another OnboardingModalNavigator, so we have 2 OnboardingModalNavigator on the stack, which we don't want.

// append only the redirect target on top of the existing routes so the user returns
// to them after the redirect screen is dismissed. Otherwise (fresh app with no stack),
// use the full redirect state which includes the base route (e.g., Home).
const routes = hasExistingFullScreenRoute && redirectRoute ? [...state.routes, redirectRoute] : redirectState.routes;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve stack only for modal redirects

This condition preserves the existing stack for any redirect as long as a fullscreen route exists, but OnboardingGuard also issues non-modal redirects to ROUTES.HOME for completed users. In those cases the new behavior pushes Home on top of prior routes instead of replacing the stack, so back navigation can return users to pre-redirect screens that the guard intended to exit. The stack-preservation path should be gated to modal redirect targets only.

Useful? React with 👍 / 👎.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The failing checks are unrelated to this PR's changes.

test (job 1) failure: tests/unit/CardFeedUtilsTest.ts crashed with SIGSEGV (segmentation fault in the jest worker process). This is a flaky infrastructure issue, not a code problem. This PR only modifies RootStackRouter.ts and handleNavigationGuardRedirect.test.ts — the CardFeedUtilsTest is completely unrelated.

checklist failure: This is the PR Reviewer Checklist, which is expected to fail until a reviewer completes it.

A re-run of the test job should resolve the test (job 1) failure.

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot can you create an ad-hoc build, please?

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Sorry, creating ad-hoc builds is outside my capabilities. You can trigger an ad-hoc build manually through the GitHub Actions workflow or by asking someone with access to the build pipeline.

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot let's update the code from line 97 to 116 with this code:

const isModalRedirect = redirectState.routes.some((route) => isModalGuardRedirectTarget(route.name));

let resetRoutes: typeof redirectState.routes = redirectState.routes;
if (isModalRedirect) {
    const redirectRoute = redirectState.routes.at(-1);
    const existingFullScreenRoute = state.routes.find((route) => isFullScreenName(route.name));
    // When the current stack already has a fullscreen route (e.g., a deep-linked report),
    // append only the redirect target on top of the existing routes so the user returns
    // to them after the redirect screen is dismissed. Otherwise (fresh app with no stack),
    // use the full redirect state which includes the base route (e.g., Home).
    resetRoutes = existingFullScreenRoute && redirectRoute ? [existingFullScreenRoute, redirectRoute] as typeof redirectState.routes : redirectState.routes;
}

const resetAction = CommonActions.reset({
    index: resetRoutes.length - 1,
    routes: resetRoutes,
} as PartialState<NavigationState>);

Then, please add this right above the handleNavigationGuards function.

const MODAL_GUARD_REDIRECT_TARGETS = new Set<string>([NAVIGATORS.ONBOARDING_MODAL_NAVIGATOR, NAVIGATORS.MIGRATED_USER_MODAL_NAVIGATOR]);

function isModalGuardRedirectTarget(name: string) {
    return MODAL_GUARD_REDIRECT_TARGETS.has(name);
}

Co-authored-by: bernhardoj <nicholausbernhard@gmail.com>
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done! I've applied both changes:

  1. Added MODAL_GUARD_REDIRECT_TARGETS set and isModalGuardRedirectTarget helper above handleNavigationGuards
  2. Updated the redirect logic (lines 97-116) to use isModalRedirect check — only preserving existing routes for modal guard redirect targets, and using find instead of some to get the actual existing fullscreen route

Commit: 71716c7

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot please update the unit test

Co-authored-by: bernhardoj <nicholausbernhard@gmail.com>
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Updated the unit test to match the new modal-only redirect preservation logic:

  • Replaced the "should not duplicate the redirect target" test (which tested the removed duplicate-detection check) with a new test: "should use the full redirect state for non-modal redirects even when fullscreen routes exist" — verifies that non-modal redirects (e.g., to SettingsSplitNavigator) use the full redirect state without preserving existing routes.
  • All 5 tests pass.

Commit: 4b4ac60

MelvinBot and others added 2 commits April 7, 2026 09:29
Prevent duplicate navigation state when the guard fires a REDIRECT
to a route that is already focused (e.g. OnboardingModalNavigator).
Return the current state unchanged instead of creating a new route.

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
…oardingRedirect-v2' into claude-preserveDeepLinkDuringOnboardingRedirect-v2

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing check: the handleNavigationGuards function in RootStackRouter.ts was creating a duplicate redirect route when the redirect target was already the focused route. Added an early return that skips the redirect when redirectTarget.name === focusedRoute.name, returning the current state unchanged.

Note: the remote branch also had a commit that replaced the original failing test with a different test case. Both changes have been merged.

@bernhardoj
Copy link
Copy Markdown
Contributor

bernhardoj commented Apr 7, 2026

@FitseTLT I think it's not possible to cover all cases with a generic solution, so I borrowed some code from #86856 to focus only on the modal guard.

I think the reason #86258 can happen is that we append the existing routes with the onboarding navigator, and somehow, there is another modal screen with the Expensify title logo behind the onboarding navigator.
[Home, Unidentified modal screen, OnboardingModalNavigator]

Not sure why it could happen, but it's not happening anymore, and to prevent that from happening in the future, I decided to not append the existing route, but rather, conditionally put either Home or the existing full-screen route as the first route.
[Home/existing full screen route, OnboardingModalNavigator]

(what's left to fix is #86390 (comment))

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 7, 2026

Codecov Report

❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.

Files with missing lines Coverage Δ
...igator/createRootStackNavigator/RootStackRouter.ts 86.30% <100.00%> (+13.99%) ⬆️
src/libs/navigateAfterOnboarding.ts 68.75% <ø> (-1.84%) ⬇️
... and 9 files with indirect coverage changes

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot please revert the commit a9d22dc

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Reverted commit a9d22dc ("Fix: skip redirect when target is already the focused route") as requested.

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot let's remove navigating to HOME in navigateAfterOnboarding function at navigateAfterOnboarding.ts file

When no specific report is found after onboarding, stop navigating
to HOME and let the modal dismissal handle the default behavior.

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Removed the Navigation.navigate(ROUTES.HOME) fallback from navigateAfterOnboarding. When no specific report is found, the function now simply does nothing and lets the modal dismissal handle the default behavior.

@bernhardoj
Copy link
Copy Markdown
Contributor

@MelvinBot please also update the test step to include selecting "Something else" option for onboarding, before step 4.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Updated the Tests and QA Steps sections to include selecting the "Something else" option for onboarding as step 4, before completing the onboarding flow.

@FitseTLT
Copy link
Copy Markdown
Contributor

FitseTLT commented Apr 9, 2026

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c58257cbd4

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

let resetRoutes: typeof redirectState.routes = redirectState.routes;
if (isModalRedirect) {
const redirectRoute = redirectState.routes.at(-1);
const existingFullScreenRoute = state.routes.find((route) => isFullScreenName(route.name));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the active fullscreen route for modal redirects

Using state.routes.find(...) here preserves the first fullscreen route in the stack, not the currently active one. This stack can contain multiple fullscreen routes (e.g., via handlePushFullscreenAction), so when a guard redirects to onboarding/migrated-user modal, the reset may become [oldFullscreen, modal] and dismissing the modal drops users onto an older screen instead of the screen they were on. Pick the last fullscreen route (the route directly under the modal) when building resetRoutes.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this is correct @bernhardoj

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot please fix this

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — changed state.routes.find(...) to state.routes.findLast(...) so the most recently active fullscreen route is preserved instead of the first one in the stack.

Comment on lines -72 to -74
} else {
// Navigate to home to trigger guard evaluation
Navigation.navigate(ROUTES.HOME);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to fix what I wrote here: #86390 (comment)

(I asked if it safe to remove it here)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But the comment above the code says:

// Navigate to home to trigger guard evaluation

So our guard code change will handle it. NO?

Copy link
Copy Markdown
Contributor

@bernhardoj bernhardoj Apr 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's for test drive modal guard, which doesn't exist anymore.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand how the problem you explained here relates with the scope of this pr. Is there any specific circumstance that this code makes the expected result of this pr fail?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the 6th step

Verify that after onboarding, you land on the deep-linked report room instead of the home page

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But without this change I was able to land on the report. Are u saying for specific onboarding flow? For instance, the manage teams flow landed on the admin's room but I thought that was expected.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you test choosing Something else and complete the onboarding?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I couldn't test because of a new bug on main here

When multiple fullscreen routes exist in the stack, find() picks the
first one which may be stale. Using findLast() preserves the most
recently active fullscreen route so dismissing the redirect modal
returns users to the correct screen.

Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
@FitseTLT
Copy link
Copy Markdown
Contributor

@MelvinBot assign me and merge main

@FitseTLT
Copy link
Copy Markdown
Contributor

@MelvinBot merge main

…nkDuringOnboardingRedirect-v2

Co-authored-by: Fitsum Abebe <FitseTLT@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Assigned FitseTLT and merged main into this branch.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

⚠️ MelvinBot CI Fix Loop Detected

MelvinBot has made 12 consecutive commits trying to fix CI failures. Automatic CI fix dispatches are now paused for this PR.

Next steps: A human should review the recent commits and resolve the conflicting CI errors manually.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The branch is already up to date with main — no merge needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants