From c5404620741c94c7827b23b8a250fbd93a074ec0 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 31 Mar 2026 01:20:10 +0530 Subject: [PATCH 01/14] feat: migrate survey page --- src/ROUTES.ts | 11 +++--- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 10 ++---- .../ExitSurvey/ExitSurveyConfirmPage.tsx | 35 ++++--------------- .../ExitSurvey/ExitSurveyReasonPage.tsx | 5 +-- src/pages/settings/InitialSettingsPage.tsx | 5 +-- .../Troubleshoot/TroubleshootPage.tsx | 5 +-- 7 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 4bb34d330b28..5bb0b577be6b 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -147,6 +147,10 @@ const DYNAMIC_ROUTES = { }), queryParams: ['fieldName', 'fieldValue', 'policyID'], }, + EXIT_SURVEY_CONFIRM: { + path: 'exit-survey/confirm', + entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.EXIT_SURVEY.REASON, SCREENS.SETTINGS.TROUBLESHOOT], + }, } as const satisfies DynamicRoutes; const ROUTES = { @@ -714,13 +718,6 @@ const ROUTES = { SETTINGS_HELP: 'settings/help', SETTINGS_EXIT_SURVEY_REASON: 'settings/exit-survey/reason', - SETTINGS_EXIT_SURVEY_CONFIRM: { - route: 'settings/exit-survey/confirm', - - // eslint-disable-next-line no-restricted-syntax -- Legacy route generation - getRoute: (backTo?: string) => getUrlWithBackToParam('settings/exit-survey/confirm', backTo), - }, - SETTINGS_SAVE_THE_WORLD: 'settings/teachersunite', KEYBOARD_SHORTCUTS: { diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index c015028a5cfe..99a351d9f165 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1200,7 +1200,7 @@ const config: LinkingOptions['config'] = { path: ROUTES.SETTINGS_EXIT_SURVEY_REASON, }, [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: { - path: ROUTES.SETTINGS_EXIT_SURVEY_CONFIRM.route, + path: DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path, }, [SCREENS.WORKSPACE.TAX_CREATE]: { path: ROUTES.WORKSPACE_TAX_CREATE.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 188347aaef5b..e2d7c6eb225a 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1209,14 +1209,8 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo: Routes; }; - [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: { - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo: Routes; - }; - [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: { - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo: Routes; - }; + [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: undefined; + [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: undefined; [SCREENS.WORKSPACE.TAX_CREATE]: { policyID: string; }; diff --git a/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx b/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx index cac1c76fa261..354ad2b93d38 100644 --- a/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx +++ b/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useEffect} from 'react'; +import React from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import Icon from '@components//Icon'; @@ -7,31 +7,27 @@ import FixedFooter from '@components/FixedFooter'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; -import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import Navigation from '@navigation/Navigation'; -import type {SettingsNavigatorParamList} from '@navigation/types'; import variables from '@styles/variables'; import {switchToOldDot} from '@userActions/ExitSurvey'; import {openOldDotLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type {ExitSurveyResponseForm} from '@src/types/form/ExitSurveyResponseForm'; import RESPONSE_INPUT_IDS from '@src/types/form/ExitSurveyResponseForm'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import ExitSurveyOffline from './ExitSurveyOffline'; -type ExitSurveyConfirmPageProps = PlatformStackScreenProps; - const exitResponseSelector = (value: OnyxEntry) => value?.[RESPONSE_INPUT_IDS.RESPONSE]; -function ExitSurveyConfirmPage({route, navigation}: ExitSurveyConfirmPageProps) { +function ExitSurveyConfirmPage() { const {translate} = useLocalize(); const {isOffline} = useNetwork(); const styles = useThemeStyles(); @@ -40,29 +36,10 @@ function ExitSurveyConfirmPage({route, navigation}: ExitSurveyConfirmPageProps) const [exitSurveyResponse] = useOnyx(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM, { selector: exitResponseSelector, }); + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path); const shouldShowQuickTips = isEmptyObject(tryNewDot) || tryNewDot?.classicRedirect?.dismissed === true || (!isEmptyObject(tryNewDot) && tryNewDot?.classicRedirect?.dismissed === undefined); - const getBackToParam = useCallback(() => { - if (isOffline) { - return ROUTES.SETTINGS; - } - if (exitSurveyResponse) { - return ROUTES.SETTINGS_EXIT_SURVEY_REASON; - } - return ROUTES.SETTINGS; - }, [isOffline, exitSurveyResponse]); - const {backTo} = route.params || {}; - useEffect(() => { - const newBackTo = getBackToParam(); - if (backTo === newBackTo) { - return; - } - navigation.setParams({ - backTo: newBackTo, - }); - }, [backTo, getBackToParam, navigation]); - return ( Navigation.goBack(backTo)} + onBackButtonPress={() => Navigation.goBack(backPath)} /> {isOffline && } diff --git a/src/pages/settings/ExitSurvey/ExitSurveyReasonPage.tsx b/src/pages/settings/ExitSurvey/ExitSurveyReasonPage.tsx index 93c85ff105df..70109a6c3651 100644 --- a/src/pages/settings/ExitSurvey/ExitSurveyReasonPage.tsx +++ b/src/pages/settings/ExitSurvey/ExitSurveyReasonPage.tsx @@ -18,12 +18,13 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import {saveResponse} from '@libs/actions/ExitSurvey'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import StatusBar from '@libs/StatusBar'; import Navigation from '@navigation/Navigation'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type {ExitSurveyResponseForm} from '@src/types/form/ExitSurveyResponseForm'; import INPUT_IDS from '@src/types/form/ExitSurveyResponseForm'; import type {Errors} from '@src/types/onyx/OnyxCommon'; @@ -47,7 +48,7 @@ function ExitSurveyReasonPage() { const submitForm = useCallback(() => { saveResponse(draftResponse); - Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_CONFIRM.getRoute(ROUTES.SETTINGS_EXIT_SURVEY_REASON)); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); }, [draftResponse]); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.CTRL_ENTER, submitForm); diff --git a/src/pages/settings/InitialSettingsPage.tsx b/src/pages/settings/InitialSettingsPage.tsx index e3120d01ce9d..e560d4c878b7 100755 --- a/src/pages/settings/InitialSettingsPage.tsx +++ b/src/pages/settings/InitialSettingsPage.tsx @@ -41,6 +41,7 @@ import {closeReactNativeApp} from '@libs/actions/HybridApp'; import {hasPartiallySetupBankAccount, hasPersonalBankAccountMissingInfo} from '@libs/BankAccountUtils'; import {hasPendingExpensifyCardAction} from '@libs/CardUtils'; import {convertToDisplayString} from '@libs/CurrencyUtils'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import useIsSidebarRouteActive from '@libs/Navigation/helpers/useIsSidebarRouteActive'; import Navigation from '@libs/Navigation/Navigation'; import {getFreeTrialText, hasSubscriptionRedDotError} from '@libs/SubscriptionUtils'; @@ -61,7 +62,7 @@ import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import NAVIGATORS from '@src/NAVIGATORS'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import {isTrackingSelector} from '@src/selectors/GPSDraftDetails'; import type {Icon as TIcon} from '@src/types/onyx/OnyxCommon'; @@ -335,7 +336,7 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_REASON); return; } - Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_CONFIRM.route); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); }); }, }), diff --git a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx index bfde7f244277..cf84aee7f2a8 100644 --- a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx +++ b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx @@ -30,6 +30,7 @@ import {openOldDotLink} from '@libs/actions/Link'; import {setShouldMaskOnyxState} from '@libs/actions/MaskOnyx'; import {openTroubleshootSettingsPage} from '@libs/actions/User'; import ExportOnyxState from '@libs/ExportOnyxState'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {SkeletonSpanReasonAttributes} from '@libs/telemetry/useSkeletonSpan'; import colors from '@styles/theme/colors'; @@ -38,7 +39,7 @@ import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import {isTrackingSelector} from '@src/selectors/GPSDraftDetails'; import type IconAsset from '@src/types/utils/IconAsset'; import type WithSentryLabel from '@src/types/utils/SentryLabel'; @@ -141,7 +142,7 @@ function TroubleshootPage() { Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_REASON); return; } - Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_CONFIRM.route); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); }); }, }), From 00e779ae7c56ab8288e69b49041629f1cf04dd9d Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 31 Mar 2026 01:26:03 +0530 Subject: [PATCH 02/14] fix: rename the component with dynamic prefix --- src/SCREENS.ts | 2 +- src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx | 2 +- src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 8029fad50622..15b61b617355 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -132,6 +132,7 @@ const SCREENS = { HELP: 'Settings_Help', DYNAMIC_VERIFY_ACCOUNT: 'Dynamic_Verify_Account', DYNAMIC_ADD_BANK_ACCOUNT_VERIFY_ACCOUNT: 'Dynamic_Add_Bank_Account_Verify_Account', + DYNAMIC_EXIT_SURVEY_CONFIRM: 'Dynamic_ExitSurvey_Confirm', PROFILE: { ROOT: 'Settings_Profile', @@ -228,7 +229,6 @@ const SCREENS = { EXIT_SURVEY: { REASON: 'Settings_ExitSurvey_Reason', RESPONSE: 'Settings_ExitSurvey_Response', - CONFIRM: 'Settings_ExitSurvey_Confirm', }, DELEGATE: { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 70b6640674e9..318b27f57c75 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -642,7 +642,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, [SCREENS.KEYBOARD_SHORTCUTS]: () => require('../../../../pages/KeyboardShortcutsPage').default, [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyReasonPage').default, - [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyConfirmPage').default, + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksChartOfAccountsPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts index 8b88d7d2b08e..a845e2ebd8ea 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts @@ -115,7 +115,7 @@ const SETTINGS_TO_RHP: Partial['config'] = { [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: { path: ROUTES.SETTINGS_EXIT_SURVEY_REASON, }, - [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: { + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: { path: DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path, }, [SCREENS.WORKSPACE.TAX_CREATE]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index e2d7c6eb225a..32ecf92a0e11 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -150,6 +150,7 @@ type SettingsNavigatorParamList = { [SCREENS.SETTINGS.LOCK.FAILED_TO_LOCK_ACCOUNT]: undefined; [SCREENS.SETTINGS.DYNAMIC_VERIFY_ACCOUNT]: undefined; [SCREENS.SETTINGS.DYNAMIC_ADD_BANK_ACCOUNT_VERIFY_ACCOUNT]: undefined; + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: undefined; [SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS]: undefined; [SCREENS.SETTINGS.WALLET.DOMAIN_CARD]: { /** cardID of selected card */ @@ -1210,7 +1211,6 @@ type SettingsNavigatorParamList = { backTo: Routes; }; [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: undefined; - [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: undefined; [SCREENS.WORKSPACE.TAX_CREATE]: { policyID: string; }; From 30bdcdedca05c85e2061b06484d54a7f1766b7ea Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 31 Mar 2026 01:32:02 +0530 Subject: [PATCH 03/14] fix: rename the component with dynamic prefix --- .../Navigation/AppNavigator/ModalStackNavigators/index.tsx | 2 +- ...rveyConfirmPage.tsx => DynamicExitSurveyConfirmPage.tsx} | 6 +++--- ...SurveyReasonPage.tsx => DynamicExitSurveyReasonPage.tsx} | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) rename src/pages/settings/ExitSurvey/{ExitSurveyConfirmPage.tsx => DynamicExitSurveyConfirmPage.tsx} (96%) rename src/pages/settings/ExitSurvey/{ExitSurveyReasonPage.tsx => DynamicExitSurveyReasonPage.tsx} (97%) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 318b27f57c75..2dc849e5dd5b 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -641,7 +641,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/Wallet/ReportCardLostPage').default, [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, [SCREENS.KEYBOARD_SHORTCUTS]: () => require('../../../../pages/KeyboardShortcutsPage').default, - [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyReasonPage').default, + [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyReasonPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: () => diff --git a/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx similarity index 96% rename from src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx rename to src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx index 354ad2b93d38..008c1c0f0bc2 100644 --- a/src/pages/settings/ExitSurvey/ExitSurveyConfirmPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx @@ -27,7 +27,7 @@ import ExitSurveyOffline from './ExitSurveyOffline'; const exitResponseSelector = (value: OnyxEntry) => value?.[RESPONSE_INPUT_IDS.RESPONSE]; -function ExitSurveyConfirmPage() { +function DynamicExitSurveyConfirmPage() { const {translate} = useLocalize(); const {isOffline} = useNetwork(); const styles = useThemeStyles(); @@ -42,7 +42,7 @@ function ExitSurveyConfirmPage() { return ( ) => value?.[INPUT_IDS.RESPONSE]; -function ExitSurveyReasonPage() { +function DynamicExitSurveyReasonPage() { const {isOffline} = useNetwork(); const [draftResponse = ''] = useOnyx(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM_DRAFT, {selector: draftResponseSelector}); const {translate} = useLocalize(); @@ -68,7 +68,7 @@ function ExitSurveyReasonPage() { ); return ( - + Navigation.goBack()} @@ -117,4 +117,4 @@ function ExitSurveyReasonPage() { ); } -export default ExitSurveyReasonPage; +export default DynamicExitSurveyReasonPage; From 21717f9c74ed6aa9226af73ea0a5b23222ce5939 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 2 Apr 2026 09:38:38 +0530 Subject: [PATCH 04/14] feat: migrate exit reason page --- src/ROUTES.ts | 7 +++++-- src/SCREENS.ts | 2 +- .../Navigation/AppNavigator/ModalStackNavigators/index.tsx | 2 +- .../Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 4 ++-- src/libs/Navigation/types.ts | 2 +- .../settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx | 4 +++- src/pages/settings/InitialSettingsPage.tsx | 2 +- src/pages/settings/Troubleshoot/TroubleshootPage.tsx | 4 ++-- 9 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index ba3eab8cfcb5..5e2f8cf5153d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -167,9 +167,13 @@ const DYNAMIC_ROUTES = { }), queryParams: ['fieldName', 'fieldValue', 'policyID'], }, + EXIT_SURVEY_REASON: { + path: 'exit-survey/reason', + entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.TROUBLESHOOT], + }, EXIT_SURVEY_CONFIRM: { path: 'exit-survey/confirm', - entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.EXIT_SURVEY.REASON, SCREENS.SETTINGS.TROUBLESHOOT], + entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON, SCREENS.SETTINGS.TROUBLESHOOT], }, } as const satisfies DynamicRoutes; @@ -727,7 +731,6 @@ const ROUTES = { SETTINGS_VACATION_DELEGATE: 'settings/profile/status/vacation-delegate', SETTINGS_TROUBLESHOOT: 'settings/troubleshoot', SETTINGS_HELP: 'settings/help', - SETTINGS_EXIT_SURVEY_REASON: 'settings/exit-survey/reason', SETTINGS_SAVE_THE_WORLD: 'settings/teachersunite', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 128dcdd49ef6..85bac192c2c8 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -132,6 +132,7 @@ const SCREENS = { DYNAMIC_VERIFY_ACCOUNT: 'Dynamic_Verify_Account', DYNAMIC_ADD_BANK_ACCOUNT_VERIFY_ACCOUNT: 'Dynamic_Add_Bank_Account_Verify_Account', DYNAMIC_EXIT_SURVEY_CONFIRM: 'Dynamic_ExitSurvey_Confirm', + DYNAMIC_EXIT_SURVEY_REASON: 'Dynamic_ExitSurvey_Reason', DYNAMIC_KEYBOARD_SHORTCUTS: 'Dynamic_Keyboard_Shortcuts', PROFILE: { @@ -227,7 +228,6 @@ const SCREENS = { }, EXIT_SURVEY: { - REASON: 'Settings_ExitSurvey_Reason', RESPONSE: 'Settings_ExitSurvey_Response', }, diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 144086b5dc8c..88034fedda9b 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -639,7 +639,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/ReimbursementAccount/EnterSignerInfo').default, [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED]: () => require('../../../../pages/settings/Wallet/ReportCardLostPage').default, [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, - [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyReasonPage').default, + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyReasonPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage').default, [SCREENS.SETTINGS.DYNAMIC_KEYBOARD_SHORTCUTS]: () => require('../../../../pages/settings/DynamicKeyboardShortcutsPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksImportPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts index f3ff130d1fbf..705f451ebc5c 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts @@ -114,7 +114,7 @@ const SETTINGS_TO_RHP: Partial['config'] = { [SCREENS.SETTINGS.SHARE_CODE]: { path: ROUTES.SETTINGS_SHARE_CODE, }, - [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: { - path: ROUTES.SETTINGS_EXIT_SURVEY_REASON, + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON]: { + path: DYNAMIC_ROUTES.EXIT_SURVEY_REASON.path, }, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: { path: DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 86b5fa047602..b241dee44bd0 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -150,6 +150,7 @@ type SettingsNavigatorParamList = { [SCREENS.SETTINGS.LOCK.FAILED_TO_LOCK_ACCOUNT]: undefined; [SCREENS.SETTINGS.DYNAMIC_VERIFY_ACCOUNT]: undefined; [SCREENS.SETTINGS.DYNAMIC_ADD_BANK_ACCOUNT_VERIFY_ACCOUNT]: undefined; + [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON]: undefined; [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: undefined; [SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS]: undefined; [SCREENS.SETTINGS.WALLET.DOMAIN_CARD]: { @@ -1197,7 +1198,6 @@ type SettingsNavigatorParamList = { /** Reason for replacing the card */ reason: ReplacementReason; }; - [SCREENS.SETTINGS.EXIT_SURVEY.REASON]: undefined; [SCREENS.SETTINGS.DYNAMIC_KEYBOARD_SHORTCUTS]: undefined; [SCREENS.WORKSPACE.TAX_CREATE]: { policyID: string; diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx index 78b811403db1..bbe0d7ebbbcc 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx @@ -8,6 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; import TextInput from '@components/TextInput'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; import useKeyboardState from '@hooks/useKeyboardState'; import useLocalize from '@hooks/useLocalize'; @@ -35,6 +36,7 @@ const draftResponseSelector = (value: OnyxEntry) => valu function DynamicExitSurveyReasonPage() { const {isOffline} = useNetwork(); const [draftResponse = ''] = useOnyx(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM_DRAFT, {selector: draftResponseSelector}); + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.EXIT_SURVEY_REASON.path); const {translate} = useLocalize(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); @@ -71,7 +73,7 @@ function DynamicExitSurveyReasonPage() { Navigation.goBack()} + onBackButtonPress={() => Navigation.goBack(backPath)} /> { if (shouldOpenSurveyReasonPage) { - Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_REASON); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_REASON.path)); return; } Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); diff --git a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx index cf84aee7f2a8..2b40202c56a6 100644 --- a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx +++ b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx @@ -39,7 +39,7 @@ import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import {isTrackingSelector} from '@src/selectors/GPSDraftDetails'; import type IconAsset from '@src/types/utils/IconAsset'; import type WithSentryLabel from '@src/types/utils/SentryLabel'; @@ -139,7 +139,7 @@ function TroubleshootPage() { resetExitSurveyForm(() => { if (shouldOpenSurveyReasonPage) { - Navigation.navigate(ROUTES.SETTINGS_EXIT_SURVEY_REASON); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_REASON.path)); return; } Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); From 735e14d6f2118b9cb4c7ce59923ad017f4b49976 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 2 Apr 2026 10:00:29 +0530 Subject: [PATCH 05/14] fix: route replacement logic for the exit-survey --- .../dynamicRoutesUtils/createDynamicRoute.ts | 9 ++++++++- tests/navigation/createDynamicRouteTests.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts b/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts index 5ab1511a9957..46cc5f02b6ca 100644 --- a/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts +++ b/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts @@ -1,6 +1,8 @@ import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import type {Route} from '@src/ROUTES'; +import findMatchingDynamicSuffix from './findMatchingDynamicSuffix'; +import getPathWithoutDynamicSuffix from './getPathWithoutDynamicSuffix'; import isDynamicRouteSuffix from './isDynamicRouteSuffix'; import splitPathAndQuery from './splitPathAndQuery'; @@ -62,7 +64,12 @@ const createDynamicRoute = (dynamicRouteSuffixWithParams: string): Route => { throw new Error(`The route name ${suffixPath} is not supported in createDynamicRoute`); } - const activeRoute = Navigation.getActiveRoute(); + let activeRoute = Navigation.getActiveRoute(); + const existingDynamicSuffix = findMatchingDynamicSuffix(activeRoute); + if (existingDynamicSuffix) { + activeRoute = getPathWithoutDynamicSuffix(activeRoute, existingDynamicSuffix); + } + return combinePathAndSuffix(activeRoute, dynamicRouteSuffixWithParams); }; diff --git a/tests/navigation/createDynamicRouteTests.ts b/tests/navigation/createDynamicRouteTests.ts index 9acbfff65972..7ecdef01078d 100644 --- a/tests/navigation/createDynamicRouteTests.ts +++ b/tests/navigation/createDynamicRouteTests.ts @@ -18,6 +18,8 @@ jest.mock('@src/ROUTES', () => ({ INVITE: {path: 'invite'}, FILTERS: {path: 'filters'}, ADDRESS_COUNTRY: {path: 'country', getRoute: (country: string) => `country?country=${country}`}, + EXIT_SURVEY_REASON: {path: 'exit-survey/reason'}, + EXIT_SURVEY_CONFIRM: {path: 'exit-survey/confirm'}, }, })); @@ -41,6 +43,18 @@ describe('createDynamicRoute', () => { expect(mockGetActiveRoute).toHaveBeenCalled(); }); + it('should replace an existing dynamic suffix when navigating to another dynamic route (e.g. exit survey reason → confirm)', () => { + const activeRoute = 'settings/exit-survey/reason'; + const suffix = 'exit-survey/confirm'; + const expectedPath = 'settings/exit-survey/confirm'; + + mockGetActiveRoute.mockReturnValue(activeRoute); + + const result = createDynamicRoute(suffix as unknown as DynamicRouteSuffix); + + expect(result).toBe(expectedPath); + }); + it('should append suffix and preserve query parameters at the end', () => { const activeRoute = 'report/123?sortBy=date'; const suffix = 'details'; From e779f4f5ff0fdeb281578794b3b3303dc846750d Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Sun, 5 Apr 2026 20:41:21 +0530 Subject: [PATCH 06/14] fix: remove screen.root --- src/ROUTES.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 0adcc97cca90..cf6d36b5b31d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -169,11 +169,11 @@ const DYNAMIC_ROUTES = { }, EXIT_SURVEY_REASON: { path: 'exit-survey/reason', - entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.TROUBLESHOOT], + entryScreens: [SCREENS.SETTINGS.TROUBLESHOOT], }, EXIT_SURVEY_CONFIRM: { path: 'exit-survey/confirm', - entryScreens: [SCREENS.SETTINGS.ROOT, SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON, SCREENS.SETTINGS.TROUBLESHOOT], + entryScreens: [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON, SCREENS.SETTINGS.TROUBLESHOOT], }, } as const satisfies DynamicRoutes; From 6cf01a6cc92dd323f835054aca6b5068fd82b5bd Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Mon, 6 Apr 2026 00:01:23 +0530 Subject: [PATCH 07/14] fix: update route --- .../helpers/dynamicRoutesUtils/createDynamicRoute.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts b/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts index 46cc5f02b6ca..5ab1511a9957 100644 --- a/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts +++ b/src/libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute.ts @@ -1,8 +1,6 @@ import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import type {Route} from '@src/ROUTES'; -import findMatchingDynamicSuffix from './findMatchingDynamicSuffix'; -import getPathWithoutDynamicSuffix from './getPathWithoutDynamicSuffix'; import isDynamicRouteSuffix from './isDynamicRouteSuffix'; import splitPathAndQuery from './splitPathAndQuery'; @@ -64,12 +62,7 @@ const createDynamicRoute = (dynamicRouteSuffixWithParams: string): Route => { throw new Error(`The route name ${suffixPath} is not supported in createDynamicRoute`); } - let activeRoute = Navigation.getActiveRoute(); - const existingDynamicSuffix = findMatchingDynamicSuffix(activeRoute); - if (existingDynamicSuffix) { - activeRoute = getPathWithoutDynamicSuffix(activeRoute, existingDynamicSuffix); - } - + const activeRoute = Navigation.getActiveRoute(); return combinePathAndSuffix(activeRoute, dynamicRouteSuffixWithParams); }; From ae532139ec73dcbb2ba1e32785dd60868aa9774f Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Mon, 6 Apr 2026 00:09:33 +0530 Subject: [PATCH 08/14] fix: spell error --- cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell.json b/cspell.json index 1520c484dd61..0485fc658882 100644 --- a/cspell.json +++ b/cspell.json @@ -552,6 +552,7 @@ "phonenumber", "Picklist", "picklists", + "PINATM", "PINGPONG", "pkill", "Pluginfile", From 4331bdcc3b18ac4863dcfe8db48f73ea8d614406 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 7 Apr 2026 11:58:32 +0530 Subject: [PATCH 09/14] fix: remove unwanted test --- tests/navigation/createDynamicRouteTests.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/navigation/createDynamicRouteTests.ts b/tests/navigation/createDynamicRouteTests.ts index 7ecdef01078d..9acbfff65972 100644 --- a/tests/navigation/createDynamicRouteTests.ts +++ b/tests/navigation/createDynamicRouteTests.ts @@ -18,8 +18,6 @@ jest.mock('@src/ROUTES', () => ({ INVITE: {path: 'invite'}, FILTERS: {path: 'filters'}, ADDRESS_COUNTRY: {path: 'country', getRoute: (country: string) => `country?country=${country}`}, - EXIT_SURVEY_REASON: {path: 'exit-survey/reason'}, - EXIT_SURVEY_CONFIRM: {path: 'exit-survey/confirm'}, }, })); @@ -43,18 +41,6 @@ describe('createDynamicRoute', () => { expect(mockGetActiveRoute).toHaveBeenCalled(); }); - it('should replace an existing dynamic suffix when navigating to another dynamic route (e.g. exit survey reason → confirm)', () => { - const activeRoute = 'settings/exit-survey/reason'; - const suffix = 'exit-survey/confirm'; - const expectedPath = 'settings/exit-survey/confirm'; - - mockGetActiveRoute.mockReturnValue(activeRoute); - - const result = createDynamicRoute(suffix as unknown as DynamicRouteSuffix); - - expect(result).toBe(expectedPath); - }); - it('should append suffix and preserve query parameters at the end', () => { const activeRoute = 'report/123?sortBy=date'; const suffix = 'details'; From bd3b367708d80227fdb985d16eb8784745d9bdc9 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 9 Apr 2026 23:52:15 +0530 Subject: [PATCH 10/14] fix: reorder --- src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 8df24a6eaaf6..47dd003d73cf 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -643,9 +643,9 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/ReimbursementAccount/EnterSignerInfo').default, [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED]: () => require('../../../../pages/settings/Wallet/ReportCardLostPage').default, [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, + [SCREENS.SETTINGS.DYNAMIC_KEYBOARD_SHORTCUTS]: () => require('../../../../pages/settings/DynamicKeyboardShortcutsPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyReasonPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage').default, - [SCREENS.SETTINGS.DYNAMIC_KEYBOARD_SHORTCUTS]: () => require('../../../../pages/settings/DynamicKeyboardShortcutsPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: () => require('../../../../pages/workspace/accounting/qbo/import/QuickbooksChartOfAccountsPage').default, From b834e5811d4e2386758793b219b3dc9d847602d0 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 16 Apr 2026 02:43:13 +0530 Subject: [PATCH 11/14] fix: route navigation --- .../DynamicExitSurveyConfirmPage.tsx | 19 ++++++++++++++++--- .../DynamicExitSurveyReasonPage.tsx | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx index 008c1c0f0bc2..bc5c4fc8f0e6 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useMemo} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import Icon from '@components//Icon'; @@ -19,7 +19,8 @@ import {switchToOldDot} from '@userActions/ExitSurvey'; import {openOldDotLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {DYNAMIC_ROUTES} from '@src/ROUTES'; +import type {Route} from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import type {ExitSurveyResponseForm} from '@src/types/form/ExitSurveyResponseForm'; import RESPONSE_INPUT_IDS from '@src/types/form/ExitSurveyResponseForm'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; @@ -36,7 +37,19 @@ function DynamicExitSurveyConfirmPage() { const [exitSurveyResponse] = useOnyx(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM, { selector: exitResponseSelector, }); - const backPath = useDynamicBackPath(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path); + const parentBackPath = useDynamicBackPath(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path); + const backPath: Route = useMemo(() => { + if (isOffline || !exitSurveyResponse) { + return ROUTES.SETTINGS; + } + + const reasonPathSuffix = DYNAMIC_ROUTES.EXIT_SURVEY_REASON.path; + if (parentBackPath.endsWith(reasonPathSuffix)) { + return parentBackPath; + } + + return `${parentBackPath.replace(/\/+$/, '')}/${reasonPathSuffix}` as Route; + }, [isOffline, exitSurveyResponse, parentBackPath]); const shouldShowQuickTips = isEmptyObject(tryNewDot) || tryNewDot?.classicRedirect?.dismissed === true || (!isEmptyObject(tryNewDot) && tryNewDot?.classicRedirect?.dismissed === undefined); diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx index bbe0d7ebbbcc..789c95602bc5 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx @@ -50,7 +50,7 @@ function DynamicExitSurveyReasonPage() { const submitForm = useCallback(() => { saveResponse(draftResponse); - Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path)); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path), { forceReplace: true}); }, [draftResponse]); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.CTRL_ENTER, submitForm); From 18d1dd1c3ba7e9a52d49877951bc766c040d6ea9 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 16 Apr 2026 02:46:22 +0530 Subject: [PATCH 12/14] fix: lint error --- src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx index 789c95602bc5..43c860112258 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx @@ -50,7 +50,7 @@ function DynamicExitSurveyReasonPage() { const submitForm = useCallback(() => { saveResponse(draftResponse); - Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path), { forceReplace: true}); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path), {forceReplace: true}); }, [draftResponse]); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.CTRL_ENTER, submitForm); From 82432197c302004d7236886d6be368d8bd9ce3bb Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Thu, 16 Apr 2026 02:49:03 +0530 Subject: [PATCH 13/14] fix: update order --- .../settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx index bc5c4fc8f0e6..7c9287ec053c 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx @@ -37,6 +37,9 @@ function DynamicExitSurveyConfirmPage() { const [exitSurveyResponse] = useOnyx(ONYXKEYS.FORMS.EXIT_SURVEY_RESPONSE_FORM, { selector: exitResponseSelector, }); + const shouldShowQuickTips = + isEmptyObject(tryNewDot) || tryNewDot?.classicRedirect?.dismissed === true || (!isEmptyObject(tryNewDot) && tryNewDot?.classicRedirect?.dismissed === undefined); + const parentBackPath = useDynamicBackPath(DYNAMIC_ROUTES.EXIT_SURVEY_CONFIRM.path); const backPath: Route = useMemo(() => { if (isOffline || !exitSurveyResponse) { @@ -50,9 +53,7 @@ function DynamicExitSurveyConfirmPage() { return `${parentBackPath.replace(/\/+$/, '')}/${reasonPathSuffix}` as Route; }, [isOffline, exitSurveyResponse, parentBackPath]); - const shouldShowQuickTips = - isEmptyObject(tryNewDot) || tryNewDot?.classicRedirect?.dismissed === true || (!isEmptyObject(tryNewDot) && tryNewDot?.classicRedirect?.dismissed === undefined); - + return ( Date: Thu, 16 Apr 2026 03:07:15 +0530 Subject: [PATCH 14/14] fix: lint fixes --- src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx index 7c9287ec053c..d982de502ae3 100644 --- a/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx +++ b/src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx @@ -53,7 +53,7 @@ function DynamicExitSurveyConfirmPage() { return `${parentBackPath.replace(/\/+$/, '')}/${reasonPathSuffix}` as Route; }, [isOffline, exitSurveyResponse, parentBackPath]); - + return (