diff --git a/src/CONST.ts b/src/CONST.ts index 9ee9ec4d9147..9cdf8810c400 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -2097,6 +2097,9 @@ const CONST = { ACCESS_VARIANTS: { CREATE: 'create', }, + PAGE_INDEX: { + CONFIRM: 'confirm', + }, PAYMENT_SELECTED: { BBA: 'BBA', PBA: 'PBA', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index c0ec944b71e1..6ed67c0d312a 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -74,7 +74,7 @@ const ROUTES = { SUBMIT_EXPENSE: 'submit-expense', FLAG_COMMENT: { route: 'flag/:reportID/:reportActionID', - getRoute: (reportID: string, reportActionID: string) => `flag/${reportID}/${reportActionID}` as const, + getRoute: (reportID: string, reportActionID: string, backTo?: string) => getUrlWithBackToParam(`flag/${reportID}/${reportActionID}` as const, backTo), }, CHAT_FINDER: 'chat-finder', PROFILE: { @@ -287,11 +287,11 @@ const ROUTES = { }, EDIT_REPORT_FIELD_REQUEST: { route: 'r/:reportID/edit/policyField/:policyID/:fieldID', - getRoute: (reportID: string, policyID: string, fieldID: string) => `r/${reportID}/edit/policyField/${policyID}/${fieldID}` as const, + getRoute: (reportID: string, policyID: string, fieldID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/edit/policyField/${policyID}/${fieldID}` as const, backTo), }, REPORT_WITH_ID_DETAILS_SHARE_CODE: { route: 'r/:reportID/details/shareCode', - getRoute: (reportID: string) => `r/${reportID}/details/shareCode` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/details/shareCode` as const, backTo), }, ATTACHMENTS: { route: 'attachment', @@ -300,19 +300,19 @@ const ROUTES = { }, REPORT_PARTICIPANTS: { route: 'r/:reportID/participants', - getRoute: (reportID: string) => `r/${reportID}/participants` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/participants` as const, backTo), }, REPORT_PARTICIPANTS_INVITE: { route: 'r/:reportID/participants/invite', - getRoute: (reportID: string) => `r/${reportID}/participants/invite` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/participants/invite` as const, backTo), }, REPORT_PARTICIPANTS_DETAILS: { route: 'r/:reportID/participants/:accountID', - getRoute: (reportID: string, accountID: number) => `r/${reportID}/participants/${accountID}` as const, + getRoute: (reportID: string, accountID: number, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/participants/${accountID}` as const, backTo), }, REPORT_PARTICIPANTS_ROLE_SELECTION: { route: 'r/:reportID/participants/:accountID/role', - getRoute: (reportID: string, accountID: number) => `r/${reportID}/participants/${accountID}/role` as const, + getRoute: (reportID: string, accountID: number, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/participants/${accountID}/role` as const, backTo), }, REPORT_WITH_ID_DETAILS: { route: 'r/:reportID/details', @@ -320,65 +320,65 @@ const ROUTES = { }, REPORT_WITH_ID_DETAILS_EXPORT: { route: 'r/:reportID/details/export/:connectionName', - getRoute: (reportID: string, connectionName: ConnectionName) => `r/${reportID}/details/export/${connectionName}` as const, + getRoute: (reportID: string, connectionName: ConnectionName, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/details/export/${connectionName}` as const, backTo), }, REPORT_SETTINGS: { route: 'r/:reportID/settings', - getRoute: (reportID: string) => `r/${reportID}/settings` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings` as const, backTo), }, REPORT_SETTINGS_NAME: { route: 'r/:reportID/settings/name', - getRoute: (reportID: string) => `r/${reportID}/settings/name` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/name` as const, backTo), }, REPORT_SETTINGS_NOTIFICATION_PREFERENCES: { route: 'r/:reportID/settings/notification-preferences', - getRoute: (reportID: string) => `r/${reportID}/settings/notification-preferences` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/notification-preferences` as const, backTo), }, REPORT_SETTINGS_WRITE_CAPABILITY: { route: 'r/:reportID/settings/who-can-post', - getRoute: (reportID: string) => `r/${reportID}/settings/who-can-post` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/who-can-post` as const, backTo), }, REPORT_SETTINGS_VISIBILITY: { route: 'r/:reportID/settings/visibility', - getRoute: (reportID: string) => `r/${reportID}/settings/visibility` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/visibility` as const, backTo), }, SPLIT_BILL_DETAILS: { route: 'r/:reportID/split/:reportActionID', - getRoute: (reportID: string, reportActionID: string) => `r/${reportID}/split/${reportActionID}` as const, + getRoute: (reportID: string, reportActionID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/split/${reportActionID}` as const, backTo), }, TASK_TITLE: { route: 'r/:reportID/title', - getRoute: (reportID: string) => `r/${reportID}/title` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/title` as const, backTo), }, REPORT_DESCRIPTION: { route: 'r/:reportID/description', - getRoute: (reportID: string) => `r/${reportID}/description` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/description` as const, backTo), }, TASK_ASSIGNEE: { route: 'r/:reportID/assignee', - getRoute: (reportID: string) => `r/${reportID}/assignee` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/assignee` as const, backTo), }, PRIVATE_NOTES_LIST: { route: 'r/:reportID/notes', - getRoute: (reportID: string) => `r/${reportID}/notes` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/notes` as const, backTo), }, PRIVATE_NOTES_EDIT: { route: 'r/:reportID/notes/:accountID/edit', - getRoute: (reportID: string, accountID: string | number) => `r/${reportID}/notes/${accountID}/edit` as const, + getRoute: (reportID: string, accountID: string | number, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/notes/${accountID}/edit` as const, backTo), }, ROOM_MEMBERS: { route: 'r/:reportID/members', - getRoute: (reportID: string) => `r/${reportID}/members` as const, + getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/members` as const, backTo), }, ROOM_MEMBER_DETAILS: { route: 'r/:reportID/members/:accountID', - getRoute: (reportID: string, accountID: string | number) => `r/${reportID}/members/${accountID}` as const, + getRoute: (reportID: string, accountID: string | number, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/members/${accountID}` as const, backTo), }, ROOM_INVITE: { route: 'r/:reportID/invite/:role?', - getRoute: (reportID: string, role?: string) => { + getRoute: (reportID: string, role?: string, backTo?: string) => { const route = role ? (`r/${reportID}/invite/${role}` as const) : (`r/${reportID}/invite` as const); - return route; + return getUrlWithBackToParam(route, backTo); }, }, MONEY_REQUEST_HOLD_REASON: { @@ -406,9 +406,9 @@ const ROUTES = { `${action as string}/${iouType as string}/confirmation/${transactionID}/${reportID}${participantsAutoAssigned ? '?participantsAutoAssigned=true' : ''}` as const, }, MONEY_REQUEST_STEP_AMOUNT: { - route: ':action/:iouType/amount/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}`, backTo), + route: ':action/:iouType/amount/:transactionID/:reportID/:pageIndex?', + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex: string, backTo = '') => + getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}/${pageIndex}`, backTo), }, MONEY_REQUEST_STEP_TAX_RATE: { route: ':action/:iouType/taxRate/:transactionID/:reportID?', @@ -536,12 +536,27 @@ const ROUTES = { IOU_SEND_ADD_DEBIT_CARD: 'pay/new/add-debit-card', IOU_SEND_ENABLE_PAYMENTS: 'pay/new/enable-payments', - NEW_TASK: 'new/task', - NEW_TASK_ASSIGNEE: 'new/task/assignee', + NEW_TASK: { + route: 'new/task', + getRoute: (backTo?: string) => getUrlWithBackToParam('new/task', backTo), + }, + NEW_TASK_ASSIGNEE: { + route: 'new/task/assignee', + getRoute: (backTo?: string) => getUrlWithBackToParam('new/task/assignee', backTo), + }, NEW_TASK_SHARE_DESTINATION: 'new/task/share-destination', - NEW_TASK_DETAILS: 'new/task/details', - NEW_TASK_TITLE: 'new/task/title', - NEW_TASK_DESCRIPTION: 'new/task/description', + NEW_TASK_DETAILS: { + route: 'new/task/details', + getRoute: (backTo?: string) => getUrlWithBackToParam('new/task/details', backTo), + }, + NEW_TASK_TITLE: { + route: 'new/task/title', + getRoute: (backTo?: string) => getUrlWithBackToParam('new/task/title', backTo), + }, + NEW_TASK_DESCRIPTION: { + route: 'new/task/description', + getRoute: (backTo?: string) => getUrlWithBackToParam('new/task/description', backTo), + }, TEACHERS_UNITE: 'settings/teachersunite', I_KNOW_A_TEACHER: 'settings/teachersunite/i-know-a-teacher', @@ -1097,7 +1112,10 @@ const ROUTES = { route: 'referral/:contentType', getRoute: (contentType: string, backTo?: string) => getUrlWithBackToParam(`referral/${contentType}`, backTo), }, - PROCESS_MONEY_REQUEST_HOLD: 'hold-expense-educational', + PROCESS_MONEY_REQUEST_HOLD: { + route: 'hold-expense-educational', + getRoute: (backTo?: string) => getUrlWithBackToParam('hold-expense-educational', backTo), + }, TRAVEL_MY_TRIPS: 'travel', TRAVEL_TCS: 'travel/terms', TRACK_TRAINING_MODAL: 'track-training', @@ -1126,39 +1144,39 @@ const ROUTES = { }, TRANSACTION_DUPLICATE_REVIEW_PAGE: { route: 'r/:threadReportID/duplicates/review', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE: { route: 'r/:threadReportID/duplicates/review/merchant', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/merchant` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/merchant` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE: { route: 'r/:threadReportID/duplicates/review/category', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/category` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/category` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE: { route: 'r/:threadReportID/duplicates/review/tag', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/tag` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/tag` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE: { route: 'r/:threadReportID/duplicates/review/tax-code', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/tax-code` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/tax-code` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE: { route: 'r/:threadReportID/duplicates/review/description', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/description` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/description` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE: { route: 'r/:threadReportID/duplicates/review/reimbursable', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/reimbursable` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/reimbursable` as const, backTo), }, TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE: { route: 'r/:threadReportID/duplicates/review/billable', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review/billable` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/billable` as const, backTo), }, TRANSACTION_DUPLICATE_CONFIRMATION_PAGE: { route: 'r/:threadReportID/duplicates/confirm', - getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/confirm` as const, + getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/confirm` as const, backTo), }, POLICY_ACCOUNTING_XERO_IMPORT: { route: 'settings/workspaces/:policyID/accounting/xero/import', diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index 1cd1bfb36d83..07845eca37ba 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -79,10 +79,15 @@ function AvatarWithDisplayName({ actorAccountID.current = parentReportAction?.actorAccountID ?? -1; }, [parentReportActions, report]); + const goToDetailsPage = useCallback(() => { + ReportUtils.navigateToDetailsPage(report, Navigation.getReportRHPActiveRoute()); + }, [report]); + const showActorDetails = useCallback(() => { // We should navigate to the details page if the report is a IOU/expense report if (shouldEnableDetailPageNavigation) { - return ReportUtils.navigateToDetailsPage(report); + goToDetailsPage(); + return; } if (ReportUtils.isExpenseReport(report) && report?.ownerAccountID) { @@ -107,7 +112,7 @@ function AvatarWithDisplayName({ // Report detail route is added as fallback but based on the current implementation this route won't be executed Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); } - }, [report, shouldEnableDetailPageNavigation]); + }, [report, shouldEnableDetailPageNavigation, goToDetailsPage]); const headerView = ( @@ -172,7 +177,7 @@ function AvatarWithDisplayName({ return ( ReportUtils.navigateToDetailsPage(report)} + onPress={goToDetailsPage} style={[styles.flexRow, styles.alignItemsCenter, styles.flex1]} accessibilityLabel={title} role={CONST.ROLE.BUTTON} diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx index 6acef20cd833..c66b8ae13ee9 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx @@ -61,7 +61,7 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona accountID = parseInt(htmlAttribAccountID, 10); mentionDisplayText = LocalePhoneNumber.formatPhoneNumber(user?.login ?? '') || PersonalDetailsUtils.getDisplayNameOrDefault(user); mentionDisplayText = getShortMentionIfFound(mentionDisplayText, htmlAttributeAccountID, user?.login ?? ''); - navigationRoute = ROUTES.PROFILE.getRoute(htmlAttribAccountID); + navigationRoute = ROUTES.PROFILE.getRoute(htmlAttribAccountID, Navigation.getReportRHPActiveRoute()); } else if ('data' in tnodeClone && !isEmptyObject(tnodeClone.data)) { // We need to remove the LTR unicode and leading @ from data as it is not part of the login mentionDisplayText = tnodeClone.data.replace(CONST.UNICODE.LTR, '').slice(1); @@ -69,7 +69,7 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona asMutable(tnodeClone).data = tnodeClone.data.replace(mentionDisplayText, Str.removeSMSDomain(getShortMentionIfFound(mentionDisplayText, htmlAttributeAccountID))); accountID = PersonalDetailsUtils.getAccountIDsByLogins([mentionDisplayText])?.[0]; - navigationRoute = ROUTES.PROFILE.getRoute(accountID, undefined, mentionDisplayText); + navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute(), mentionDisplayText); mentionDisplayText = Str.removeSMSDomain(mentionDisplayText); } else { // If neither an account ID or email is provided, don't render anything @@ -94,7 +94,11 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona }} onPress={(event) => { event.preventDefault(); - Navigation.navigate(navigationRoute); + if (!isEmpty(htmlAttribAccountID)) { + Navigation.navigate(ROUTES.PROFILE.getRoute(htmlAttribAccountID, Navigation.getReportRHPActiveRoute())); + return; + } + Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute(), mentionDisplayText)); }} role={CONST.ROLE.LINK} accessibilityLabel={`/${navigationRoute}`} diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index d5570cb18872..b1340531c7f2 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -4,6 +4,7 @@ import type {OnyxEntry} from 'react-native-onyx'; import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import * as CurrencyUtils from '@libs/CurrencyUtils'; @@ -53,14 +54,12 @@ type MoneyReportHeaderProps = { // eslint-disable-next-line react/no-unused-prop-types transactionThreadReportID?: string | null; - /** Whether we should display the header as in narrow layout */ - shouldUseNarrowLayout?: boolean; - /** Method to trigger when pressing close button of the header */ onBackButtonPress: () => void; }; -function MoneyReportHeader({policy, report: moneyRequestReport, transactionThreadReportID, reportActions, shouldUseNarrowLayout = false, onBackButtonPress}: MoneyReportHeaderProps) { +function MoneyReportHeader({policy, report: moneyRequestReport, transactionThreadReportID, reportActions, onBackButtonPress}: MoneyReportHeaderProps) { + const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout(); const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID ?? '-1'}`); const [nextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${moneyRequestReport?.reportID ?? '-1'}`); const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`); @@ -255,14 +254,14 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea return; } - if (shouldUseNarrowLayout) { - if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD) { + if (isSmallScreenWidth) { + if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD.route) { Navigation.goBack(); } } else { - Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD); + Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD.getRoute(Navigation.getReportRHPActiveRoute())); } - }, [shouldUseNarrowLayout, shouldShowHoldMenu]); + }, [isSmallScreenWidth, shouldShowHoldMenu]); const handleHoldRequestClose = () => { IOU.dismissHoldUseExplanation(); @@ -426,7 +425,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea danger shouldEnableNewFocusManagement /> - {shouldUseNarrowLayout && shouldShowHoldMenu && ( + {isSmallScreenWidth && shouldShowHoldMenu && ( { - const activeRoute = Navigation.getActiveRouteWithoutParams(); + const activeRoute = Navigation.getActiveRoute(); if (option.isSelfDM) { Navigation.navigate(ROUTES.PROFILE.getRoute(currentUserPersonalDetails.accountID, activeRoute)); diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index 62e4f1e8b589..e6b957f16b60 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -299,7 +299,7 @@ function MoneyRequestConfirmationListFooter({ return; } - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams())); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(action, iouType, transactionID, reportID, CONST.IOU.PAGE_INDEX.CONFIRM, Navigation.getActiveRoute())); }} style={[styles.moneyRequestMenuItem, styles.mt2]} titleStyle={styles.moneyRequestConfirmationAmount} @@ -326,9 +326,7 @@ function MoneyRequestConfirmationListFooter({ title={iouComment} description={translate('common.description')} onPress={() => { - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams(), reportActionID), - ); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID)); }} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} @@ -404,7 +402,7 @@ function MoneyRequestConfirmationListFooter({ style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} onPress={() => { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams())); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute())); }} disabled={didConfirm} interactive={!isReadOnly} @@ -428,7 +426,7 @@ function MoneyRequestConfirmationListFooter({ style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} onPress={() => { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams(), reportActionID)); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID)); }} disabled={didConfirm} interactive={!isReadOnly} @@ -447,9 +445,7 @@ function MoneyRequestConfirmationListFooter({ title={iouCategory} description={translate('common.category')} numberOfLinesTitle={2} - onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams(), reportActionID)) - } + onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID))} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} disabled={didConfirm} @@ -472,9 +468,7 @@ function MoneyRequestConfirmationListFooter({ description={name} numberOfLinesTitle={2} onPress={() => - Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_TAG.getRoute(action, iouType, index, transactionID, reportID, Navigation.getActiveRouteWithoutParams(), reportActionID), - ) + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAG.getRoute(action, iouType, index, transactionID, reportID, Navigation.getActiveRoute(), reportActionID)) } style={[styles.moneyRequestMenuItem]} disabled={didConfirm} @@ -495,7 +489,7 @@ function MoneyRequestConfirmationListFooter({ description={taxRates?.name} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} - onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams()))} + onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()))} disabled={didConfirm} interactive={canModifyTaxFields} /> @@ -512,7 +506,7 @@ function MoneyRequestConfirmationListFooter({ description={translate('iou.taxAmount')} style={[styles.moneyRequestMenuItem]} titleStyle={styles.flex1} - onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams()))} + onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()))} disabled={didConfirm} interactive={canModifyTaxFields} /> diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index ab7004ce4d17..d2db257dc776 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -4,6 +4,7 @@ import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; @@ -35,14 +36,12 @@ type MoneyRequestHeaderProps = { /** The report action the transaction is tied to from the parent report */ parentReportAction: OnyxEntry; - /** Whether we should display the header as in narrow layout */ - shouldUseNarrowLayout?: boolean; - /** Method to trigger when pressing close button of the header */ onBackButtonPress: () => void; }; -function MoneyRequestHeader({report, parentReportAction, policy, shouldUseNarrowLayout = false, onBackButtonPress}: MoneyRequestHeaderProps) { +function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPress}: MoneyRequestHeaderProps) { + const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout(); const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID ?? '-1'}`); const [transaction] = useOnyx( `${ONYXKEYS.COLLECTION.TRANSACTION}${ @@ -107,14 +106,14 @@ function MoneyRequestHeader({report, parentReportAction, policy, shouldUseNarrow return; } - if (shouldUseNarrowLayout) { - if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD) { + if (isSmallScreenWidth) { + if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD.route) { Navigation.goBack(); } } else { - Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD); + Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD.getRoute(Navigation.getReportRHPActiveRoute())); } - }, [shouldUseNarrowLayout, shouldShowHoldMenu]); + }, [isSmallScreenWidth, shouldShowHoldMenu]); const handleHoldRequestClose = () => { IOU.dismissHoldUseExplanation(); @@ -152,7 +151,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, shouldUseNarrow text={translate('iou.reviewDuplicates')} style={[styles.p0, styles.ml2]} onPress={() => { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.getRoute(reportID ?? '')); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.getRoute(reportID ?? '', Navigation.getReportRHPActiveRoute())); }} /> )} @@ -174,7 +173,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, shouldUseNarrow text={translate('iou.reviewDuplicates')} style={[styles.w100, styles.pr0]} onPress={() => { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.getRoute(reportID ?? '')); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.getRoute(reportID ?? '', Navigation.getReportRHPActiveRoute())); }} /> @@ -188,7 +187,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, shouldUseNarrow )} - {shouldUseNarrowLayout && shouldShowHoldMenu && ( + {isSmallScreenWidth && shouldShowHoldMenu && ( PromotedAction> & { - message: (params: {reportID?: string; accountID?: number; login?: string}) => PromotedAction; + [CONST.PROMOTED_ACTIONS.SHARE]: (report: OnyxReport, backTo?: string) => PromotedAction; } & { - hold: (params: { + [CONST.PROMOTED_ACTIONS.MESSAGE]: (params: {reportID?: string; accountID?: number; login?: string}) => PromotedAction; +} & { + [CONST.PROMOTED_ACTIONS.HOLD]: (params: { isTextHold: boolean; reportAction: ReportAction | undefined; reportID?: string; @@ -43,9 +45,9 @@ const PromotedActions = { key: CONST.PROMOTED_ACTIONS.PIN, ...HeaderUtils.getPinMenuItem(report), }), - share: (report) => ({ + share: (report, backTo) => ({ key: CONST.PROMOTED_ACTIONS.SHARE, - ...HeaderUtils.getShareMenuItem(report), + ...HeaderUtils.getShareMenuItem(report, backTo), }), join: (report) => ({ key: CONST.PROMOTED_ACTIONS.JOIN, diff --git a/src/components/ReportActionItem/MoneyReportView.tsx b/src/components/ReportActionItem/MoneyReportView.tsx index 8546aa8165c9..19ee17bba3b4 100644 --- a/src/components/ReportActionItem/MoneyReportView.tsx +++ b/src/components/ReportActionItem/MoneyReportView.tsx @@ -127,7 +127,16 @@ function MoneyReportView({report, policy, isCombinedReport = false, shouldShowTo Navigation.navigate(ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute(report.reportID, report.policyID ?? '-1', reportField.fieldID))} + onPress={() => + Navigation.navigate( + ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute( + report.reportID, + report.policyID ?? '-1', + reportField.fieldID, + Navigation.getReportRHPActiveRoute(), + ), + ) + } shouldShowRightIcon disabled={isFieldDisabled} wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 15f9cee3705c..af54e2940d3f 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -89,7 +89,7 @@ function MoneyRequestAction({ const onMoneyRequestPreviewPressed = () => { if (isSplitBillAction) { const reportActionID = action.reportActionID ?? '-1'; - Navigation.navigate(ROUTES.SPLIT_BILL_DETAILS.getRoute(chatReportID, reportActionID)); + Navigation.navigate(ROUTES.SPLIT_BILL_DETAILS.getRoute(chatReportID, reportActionID, Navigation.getReportRHPActiveRoute())); return; } diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index f2460cae71ed..6aa047052e14 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -283,24 +283,25 @@ function MoneyRequestPreviewContent({ ); const navigateToReviewFields = () => { + const backTo = route.params.backTo; const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(reviewingTransactionID); Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID ?? ''}); if ('merchant' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('category' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('tag' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('description' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('taxCode' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('billable' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(route.params?.threadReportID, backTo)); } else if ('reimbursable' in comparisonResult.change) { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(route.params?.threadReportID, backTo)); } else { - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(route.params?.threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(route.params?.threadReportID, backTo)); } }; diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 9559a19d08a6..549fd55ac1bb 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -328,7 +328,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEditDistance} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } /> @@ -340,7 +348,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEditDistanceRate} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={getErrorForField('customUnitRateID') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={getErrorForField('customUnitRateID')} @@ -355,7 +371,17 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals interactive={canEditDistance} shouldShowRightIcon={canEditDistance} titleStyle={styles.flex1} - onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1'))} + onPress={() => + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) + } /> ); @@ -423,7 +449,16 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEdit} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAG.getRoute(CONST.IOU.ACTION.EDIT, iouType, orderWeight, transaction?.transactionID ?? '', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_TAG.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + orderWeight, + transaction?.transactionID ?? '', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={tagError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={tagError} @@ -500,7 +535,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1', - Navigation.getActiveRouteWithoutParams(), + Navigation.getReportRHPActiveRoute(), ), ) } @@ -518,7 +553,16 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals interactive={canEditAmount} shouldShowRightIcon={canEditAmount} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + '', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={getErrorForField('amount') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={getErrorForField('amount')} @@ -533,7 +577,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEdit} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} brickRoadIndicator={getErrorForField('comment') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} @@ -552,7 +604,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEditMerchant} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } wrapperStyle={[styles.taskDescriptionMenuItem]} brickRoadIndicator={getErrorForField('merchant') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} @@ -569,7 +629,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEditDate} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1' ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DATE.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1' ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={getErrorForField('date') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={getErrorForField('date')} @@ -584,7 +652,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEdit} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={getErrorForField('category') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={getErrorForField('category')} @@ -611,7 +687,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals shouldShowRightIcon={canEditTaxFields} titleStyle={styles.flex1} onPress={() => - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1')) + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), + ) } brickRoadIndicator={getErrorForField('tax') ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} errorText={getErrorForField('tax')} @@ -628,7 +712,13 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals titleStyle={styles.flex1} onPress={() => Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID ?? '-1', report?.reportID ?? '-1'), + ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute( + CONST.IOU.ACTION.EDIT, + iouType, + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', + Navigation.getReportRHPActiveRoute(), + ), ) } /> diff --git a/src/components/ReportActionItem/TaskView.tsx b/src/components/ReportActionItem/TaskView.tsx index 2822e34a3d04..9a2906aa7d62 100644 --- a/src/components/ReportActionItem/TaskView.tsx +++ b/src/components/ReportActionItem/TaskView.tsx @@ -81,7 +81,7 @@ function TaskView({report, ...props}: TaskViewProps) { (e.currentTarget as HTMLElement).blur(); } - Navigation.navigate(ROUTES.TASK_TITLE.getRoute(report.reportID)); + Navigation.navigate(ROUTES.TASK_TITLE.getRoute(report.reportID, Navigation.getReportRHPActiveRoute())); })} style={({pressed}) => [ styles.ph5, @@ -144,7 +144,7 @@ function TaskView({report, ...props}: TaskViewProps) { shouldRenderAsHTML description={translate('task.description')} title={report.description ?? ''} - onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID, Navigation.getReportRHPActiveRoute()))} shouldShowRightIcon={isOpen} disabled={disableState} wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]} @@ -162,7 +162,7 @@ function TaskView({report, ...props}: TaskViewProps) { iconType={CONST.ICON_TYPE_AVATAR} avatarSize={CONST.AVATAR_SIZE.SMALLER} titleStyle={styles.assigneeTextStyle} - onPress={() => Navigation.navigate(ROUTES.TASK_ASSIGNEE.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.TASK_ASSIGNEE.getRoute(report.reportID, Navigation.getReportRHPActiveRoute()))} shouldShowRightIcon={isOpen} disabled={disableState} wrapperStyle={[styles.pv2]} @@ -174,7 +174,7 @@ function TaskView({report, ...props}: TaskViewProps) { ) : ( Navigation.navigate(ROUTES.TASK_ASSIGNEE.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.TASK_ASSIGNEE.getRoute(report.reportID, Navigation.getReportRHPActiveRoute()))} shouldShowRightIcon={isOpen} disabled={disableState} wrapperStyle={[styles.pv2]} diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index 96f705ea2d52..68f060d22e6c 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -57,7 +57,7 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP return; } - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, Navigation.getReportRHPActiveRoute())); }; const welcomeHeroText = useMemo(() => { @@ -113,11 +113,12 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP (welcomeMessage?.messageHtml ? ( { + const activeRoute = Navigation.getReportRHPActiveRoute(); if (ReportUtils.canEditReportDescription(report, policy)) { - Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? '-1')); + Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? '-1', activeRoute)); return; } - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1')); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1', activeRoute)); }} style={styles.renderHTML} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} @@ -161,7 +162,7 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP ) : ( Navigation.navigate(ROUTES.PROFILE.getRoute(accountID))} + onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute()))} suppressHighlighting > {displayName} diff --git a/src/hooks/useReviewDuplicatesNavigation.tsx b/src/hooks/useReviewDuplicatesNavigation.tsx index e14731024c17..de905647e440 100644 --- a/src/hooks/useReviewDuplicatesNavigation.tsx +++ b/src/hooks/useReviewDuplicatesNavigation.tsx @@ -3,50 +3,86 @@ import Navigation from '@libs/Navigation/Navigation'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -type StepName = 'description' | 'merchant' | 'category' | 'billable' | 'tag' | 'taxCode' | 'reimbursable'; +type StepName = 'description' | 'merchant' | 'category' | 'billable' | 'tag' | 'taxCode' | 'reimbursable' | 'confirmation'; -function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: StepName, threadReportID: string) { - const [nextScreen, setNextScreen] = useState(currentScreenName); +function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: StepName, threadReportID: string, backTo?: string) { + const [nextScreen, setNextScreen] = useState(); + const [prevScreen, setPrevScreen] = useState(); const [currentScreenIndex, setCurrentScreenIndex] = useState(0); const intersection = useMemo(() => CONST.REVIEW_DUPLICATES_ORDER.filter((element) => stepNames.includes(element)), [stepNames]); useEffect(() => { + if (currentScreenName === 'confirmation') { + setPrevScreen(intersection[intersection.length - 1] ?? ''); + return; + } const currentIndex = intersection.indexOf(currentScreenName); const nextScreenIndex = currentIndex + 1; + const prevScreenIndex = currentIndex - 1; setCurrentScreenIndex(currentIndex); setNextScreen(intersection[nextScreenIndex] ?? ''); + setPrevScreen(intersection[prevScreenIndex] ?? ''); }, [currentScreenName, intersection]); + const goBack = () => { + switch (prevScreen) { + case 'merchant': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(threadReportID, backTo)); + break; + case 'category': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(threadReportID, backTo)); + break; + case 'tag': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID, backTo)); + break; + case 'description': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID, backTo)); + break; + case 'taxCode': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID, backTo)); + break; + case 'reimbursable': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID, backTo)); + break; + case 'billable': + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID, backTo)); + break; + default: + Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_PAGE.getRoute(threadReportID, backTo)); + break; + } + }; + const navigateToNextScreen = () => { switch (nextScreen) { case 'merchant': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_MERCHANT_PAGE.getRoute(threadReportID, backTo)); break; case 'category': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_CATEGORY_PAGE.getRoute(threadReportID, backTo)); break; case 'tag': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID, backTo)); break; case 'description': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID, backTo)); break; case 'taxCode': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID, backTo)); break; case 'reimbursable': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID, backTo)); break; case 'billable': - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID, backTo)); break; default: - Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(threadReportID)); + Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(threadReportID, backTo)); break; } }; - return {navigateToNextScreen, currentScreenIndex}; + return {navigateToNextScreen, goBack, currentScreenIndex}; } export default useReviewDuplicatesNavigation; diff --git a/src/libs/HeaderUtils.ts b/src/libs/HeaderUtils.ts index 03c582d6b16b..b31d59804c51 100644 --- a/src/libs/HeaderUtils.ts +++ b/src/libs/HeaderUtils.ts @@ -17,11 +17,11 @@ function getPinMenuItem(report: OnyxReport): ThreeDotsMenuItem { }; } -function getShareMenuItem(report: OnyxReport): ThreeDotsMenuItem { +function getShareMenuItem(report: OnyxReport, backTo?: string): ThreeDotsMenuItem { return { icon: Expensicons.QrCode, text: Localize.translateLocal('common.share'), - onSelected: () => Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_SHARE_CODE.getRoute(report?.reportID ?? '')), + onSelected: () => Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_SHARE_CODE.getRoute(report?.reportID ?? '', backTo)), }; } diff --git a/src/libs/Navigation/Navigation.ts b/src/libs/Navigation/Navigation.ts index 4c61b953f572..d5e9c5229a89 100644 --- a/src/libs/Navigation/Navigation.ts +++ b/src/libs/Navigation/Navigation.ts @@ -20,6 +20,7 @@ import getTopmostBottomTabRoute from './getTopmostBottomTabRoute'; import getTopmostCentralPaneRoute from './getTopmostCentralPaneRoute'; import originalGetTopmostReportActionId from './getTopmostReportActionID'; import originalGetTopmostReportId from './getTopmostReportId'; +import isReportOpenInRHP from './isReportOpenInRHP'; import linkingConfig from './linkingConfig'; import getMatchingBottomTabRouteForState from './linkingConfig/getMatchingBottomTabRouteForState'; import linkTo from './linkTo'; @@ -157,6 +158,13 @@ function getActiveRoute(): string { return ''; } +function getReportRHPActiveRoute(): string { + if (isReportOpenInRHP(navigationRef.getRootState())) { + return getActiveRoute(); + } + return ''; +} + /** * Check whether the passed route is currently Active or not. * @@ -419,6 +427,7 @@ export default { isActiveRoute, getActiveRoute, getActiveRouteWithoutParams, + getReportRHPActiveRoute, closeAndNavigate, goBack, isNavigationReady, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index f90ddbe2f818..926988769494 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -955,12 +955,12 @@ const config: LinkingOptions['config'] = { }, [SCREENS.RIGHT_MODAL.NEW_TASK]: { screens: { - [SCREENS.NEW_TASK.ROOT]: ROUTES.NEW_TASK, - [SCREENS.NEW_TASK.TASK_ASSIGNEE_SELECTOR]: ROUTES.NEW_TASK_ASSIGNEE, + [SCREENS.NEW_TASK.ROOT]: ROUTES.NEW_TASK.route, + [SCREENS.NEW_TASK.TASK_ASSIGNEE_SELECTOR]: ROUTES.NEW_TASK_ASSIGNEE.route, [SCREENS.NEW_TASK.TASK_SHARE_DESTINATION_SELECTOR]: ROUTES.NEW_TASK_SHARE_DESTINATION, - [SCREENS.NEW_TASK.DETAILS]: ROUTES.NEW_TASK_DETAILS, - [SCREENS.NEW_TASK.TITLE]: ROUTES.NEW_TASK_TITLE, - [SCREENS.NEW_TASK.DESCRIPTION]: ROUTES.NEW_TASK_DESCRIPTION, + [SCREENS.NEW_TASK.DETAILS]: ROUTES.NEW_TASK_DETAILS.route, + [SCREENS.NEW_TASK.TITLE]: ROUTES.NEW_TASK_TITLE.route, + [SCREENS.NEW_TASK.DESCRIPTION]: ROUTES.NEW_TASK_DESCRIPTION.route, }, }, [SCREENS.RIGHT_MODAL.TEACHERS_UNITE]: { @@ -1125,7 +1125,7 @@ const config: LinkingOptions['config'] = { }, [SCREENS.RIGHT_MODAL.PROCESS_MONEY_REQUEST_HOLD]: { screens: { - [SCREENS.PROCESS_MONEY_REQUEST_HOLD_ROOT]: ROUTES.PROCESS_MONEY_REQUEST_HOLD, + [SCREENS.PROCESS_MONEY_REQUEST_HOLD_ROOT]: ROUTES.PROCESS_MONEY_REQUEST_HOLD.route, }, }, [SCREENS.RIGHT_MODAL.TRAVEL]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 1326a0c86709..39cc50affaa7 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -829,53 +829,87 @@ type ProfileNavigatorParamList = { }; type ReportDetailsNavigatorParamList = { - [SCREENS.REPORT_DETAILS.ROOT]: undefined; + [SCREENS.REPORT_DETAILS.ROOT]: { + reportID: string; + backTo?: Routes; + }; [SCREENS.REPORT_DETAILS.SHARE_CODE]: { reportID: string; + backTo?: Routes; }; [SCREENS.REPORT_DETAILS.EXPORT]: { reportID: string; policyID: string; connectionName: ConnectionName; + backTo?: Routes; }; }; type ReportSettingsNavigatorParamList = { - [SCREENS.REPORT_SETTINGS.ROOT]: {reportID: string}; - [SCREENS.REPORT_SETTINGS.NAME]: {reportID: string}; - [SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: {reportID: string}; - [SCREENS.REPORT_SETTINGS.WRITE_CAPABILITY]: {reportID: string}; + [SCREENS.REPORT_SETTINGS.ROOT]: { + reportID: string; + backTo?: Routes; + }; + [SCREENS.REPORT_SETTINGS.NAME]: { + reportID: string; + backTo?: Routes; + }; + [SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: { + reportID: string; + backTo?: Routes; + }; + [SCREENS.REPORT_SETTINGS.WRITE_CAPABILITY]: { + reportID: string; + backTo?: Routes; + }; [SCREENS.REPORT_SETTINGS.VISIBILITY]: { reportID: string; + backTo?: Routes; }; }; type ReportDescriptionNavigatorParamList = { - [SCREENS.REPORT_DESCRIPTION_ROOT]: {reportID: string}; + [SCREENS.REPORT_DESCRIPTION_ROOT]: { + reportID: string; + backTo?: Routes; + }; }; type ParticipantsNavigatorParamList = { - [SCREENS.REPORT_PARTICIPANTS.ROOT]: {reportID: string}; - [SCREENS.REPORT_PARTICIPANTS.INVITE]: {reportID: string}; + [SCREENS.REPORT_PARTICIPANTS.ROOT]: { + reportID: string; + backTo?: Routes; + }; + [SCREENS.REPORT_PARTICIPANTS.INVITE]: { + reportID: string; + backTo?: Routes; + }; [SCREENS.REPORT_PARTICIPANTS.DETAILS]: { reportID: string; accountID: string; + backTo?: Routes; }; [SCREENS.REPORT_PARTICIPANTS.ROLE]: { reportID: string; accountID: string; + backTo?: Routes; }; }; type RoomMembersNavigatorParamList = { - [SCREENS.ROOM_MEMBERS.ROOT]: {reportID: string}; + [SCREENS.ROOM_MEMBERS.ROOT]: { + reportID: string; + backTo?: Routes; + }; [SCREENS.ROOM_MEMBERS.INVITE]: { reportID: string; role?: 'accountant'; + backTo?: Routes; }; [SCREENS.ROOM_MEMBERS.DETAILS]: { reportID: string; accountID: string; + backTo?: Routes; }; }; @@ -989,6 +1023,7 @@ type MoneyRequestNavigatorParamList = { backTo: never; action: never; currency: never; + pageIndex?: string; }; [SCREENS.MONEY_REQUEST.START]: { iouType: IOUType; @@ -1002,6 +1037,7 @@ type MoneyRequestNavigatorParamList = { transactionID: string; backTo: Routes; action: IOUAction; + pageIndex?: string; currency?: string; }; [SCREENS.MONEY_REQUEST.STEP_DISTANCE_RATE]: { @@ -1040,12 +1076,22 @@ type MoneyRequestNavigatorParamList = { }; type NewTaskNavigatorParamList = { - [SCREENS.NEW_TASK.ROOT]: undefined; - [SCREENS.NEW_TASK.TASK_ASSIGNEE_SELECTOR]: undefined; + [SCREENS.NEW_TASK.ROOT]: { + backTo?: Routes; + }; + [SCREENS.NEW_TASK.TASK_ASSIGNEE_SELECTOR]: { + backTo?: Routes; + }; [SCREENS.NEW_TASK.TASK_SHARE_DESTINATION_SELECTOR]: undefined; - [SCREENS.NEW_TASK.DETAILS]: undefined; - [SCREENS.NEW_TASK.TITLE]: undefined; - [SCREENS.NEW_TASK.DESCRIPTION]: undefined; + [SCREENS.NEW_TASK.DETAILS]: { + backTo?: Routes; + }; + [SCREENS.NEW_TASK.TITLE]: { + backTo?: Routes; + }; + [SCREENS.NEW_TASK.DESCRIPTION]: { + backTo?: Routes; + }; }; type TeachersUniteNavigatorParamList = { @@ -1056,9 +1102,12 @@ type TeachersUniteNavigatorParamList = { }; type TaskDetailsNavigatorParamList = { - [SCREENS.TASK.TITLE]: undefined; + [SCREENS.TASK.TITLE]: { + backTo?: Routes; + }; [SCREENS.TASK.ASSIGNEE]: { reportID: string; + backTo?: Routes; }; }; @@ -1070,6 +1119,7 @@ type SplitDetailsNavigatorParamList = { [SCREENS.SPLIT_DETAILS.ROOT]: { reportID: string; reportActionID: string; + backTo?: Routes; }; [SCREENS.SPLIT_DETAILS.EDIT_REQUEST]: { field: string; @@ -1103,11 +1153,17 @@ type FlagCommentNavigatorParamList = { [SCREENS.FLAG_COMMENT_ROOT]: { reportID: string; reportActionID: string; + backTo?: Routes; }; }; type EditRequestNavigatorParamList = { - [SCREENS.EDIT_REQUEST.REPORT_FIELD]: undefined; + [SCREENS.EDIT_REQUEST.REPORT_FIELD]: { + fieldID: string; + reportID: string; + policyID: string; + backTo?: Routes; + }; }; type SignInNavigatorParamList = { @@ -1130,37 +1186,48 @@ type ProcessMoneyRequestHoldNavigatorParamList = { }; type PrivateNotesNavigatorParamList = { - [SCREENS.PRIVATE_NOTES.LIST]: undefined; + [SCREENS.PRIVATE_NOTES.LIST]: { + backTo?: Routes; + }; [SCREENS.PRIVATE_NOTES.EDIT]: { reportID: string; accountID: string; + backTo?: Routes; }; }; type TransactionDuplicateNavigatorParamList = { [SCREENS.TRANSACTION_DUPLICATE.REVIEW]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.MERCHANT]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.CATEGORY]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.TAG]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: { threadReportID: string; + backTo?: Routes; }; [SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: { threadReportID: string; + backTo?: Routes; }; }; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 5c0451f2ea01..66e99a3779a7 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3920,34 +3920,34 @@ function getParentNavigationSubtitle(report: OnyxEntry, invoiceReceiverP /** * Navigate to the details page of a given report */ -function navigateToDetailsPage(report: OnyxEntry) { +function navigateToDetailsPage(report: OnyxEntry, backTo?: string) { const isSelfDMReport = isSelfDM(report); const isOneOnOneChatReport = isOneOnOneChat(report); const participantAccountID = getParticipantsAccountIDsForDisplay(report); if (isSelfDMReport || isOneOnOneChatReport) { - Navigation.navigate(ROUTES.PROFILE.getRoute(participantAccountID[0])); + Navigation.navigate(ROUTES.PROFILE.getRoute(participantAccountID[0], backTo)); return; } if (report?.reportID) { - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID)); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID, backTo)); } } /** * Go back to the details page of a given report */ -function goBackToDetailsPage(report: OnyxEntry) { +function goBackToDetailsPage(report: OnyxEntry, backTo?: string) { const isOneOnOneChatReport = isOneOnOneChat(report); const participantAccountID = getParticipantsAccountIDsForDisplay(report); if (isOneOnOneChatReport) { - Navigation.navigate(ROUTES.PROFILE.getRoute(participantAccountID[0])); + Navigation.goBack(ROUTES.PROFILE.getRoute(participantAccountID[0], backTo)); return; } - Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(report?.reportID ?? '-1')); + Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(report?.reportID ?? '-1', backTo)); } function navigateBackAfterDeleteTransaction(backRoute: Route | undefined, isFromRHP?: boolean) { @@ -3970,7 +3970,7 @@ function navigateBackAfterDeleteTransaction(backRoute: Route | undefined, isFrom /** * Go back to the previous page from the edit private page of a given report */ -function goBackFromPrivateNotes(report: OnyxEntry, session: OnyxEntry) { +function goBackFromPrivateNotes(report: OnyxEntry, session: OnyxEntry, backTo?: string) { if (isEmpty(report) || isEmpty(session) || !session.accountID) { return; } @@ -3979,16 +3979,16 @@ function goBackFromPrivateNotes(report: OnyxEntry, session: OnyxEntry, session: OnyxEntry) { +function navigateToPrivateNotes(report: OnyxEntry, session: OnyxEntry, backTo?: string) { if (isEmpty(report) || isEmpty(session) || !session.accountID) { return; } const currentUserPrivateNote = report.privateNotes?.[session.accountID]?.note ?? ''; if (isEmpty(currentUserPrivateNote)) { - Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, session.accountID)); + Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, session.accountID, backTo)); return; } - Navigation.navigate(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID)); + Navigation.navigate(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID, backTo)); } /** diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index b038f16d003d..a8911cefa903 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -1705,15 +1705,11 @@ function updateNotificationPreference( reportID: string, previousValue: NotificationPreference | undefined, newValue: NotificationPreference, - navigate: boolean, parentReportID?: string, parentReportActionID?: string, - report?: OnyxEntry, ) { + // No change needed if (previousValue === newValue) { - if (navigate && !isEmptyObject(report) && report.reportID) { - ReportUtils.goBackToDetailsPage(report); - } return; } @@ -1761,9 +1757,6 @@ function updateNotificationPreference( const parameters: UpdateReportNotificationPreferenceParams = {reportID, notificationPreference: newValue}; API.write(WRITE_COMMANDS.UPDATE_REPORT_NOTIFICATION_PREFERENCE, parameters, {optimisticData, failureData}); - if (navigate && !isEmptyObject(report)) { - ReportUtils.goBackToDetailsPage(report); - } } function updateRoomVisibility(reportID: string, previousValue: RoomVisibility | undefined, newValue: RoomVisibility) { @@ -1805,9 +1798,9 @@ function toggleSubscribeToChildReport(childReportID = '-1', parentReportAction: openReport(childReportID); const parentReportActionID = parentReportAction?.reportActionID ?? '-1'; if (!prevNotificationPreference || prevNotificationPreference === CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN) { - updateNotificationPreference(childReportID, prevNotificationPreference, CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, false, parentReportID, parentReportActionID); + updateNotificationPreference(childReportID, prevNotificationPreference, CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, parentReportID, parentReportActionID); } else { - updateNotificationPreference(childReportID, prevNotificationPreference, CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, false, parentReportID, parentReportActionID); + updateNotificationPreference(childReportID, prevNotificationPreference, CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, parentReportID, parentReportActionID); } } else { const participantAccountIDs = [...new Set([currentUserAccountID, Number(parentReportAction?.actorAccountID)])]; @@ -1831,7 +1824,7 @@ function toggleSubscribeToChildReport(childReportID = '-1', parentReportAction: openReport(newChat.reportID, '', participantLogins, newChat, parentReportAction.reportActionID); const notificationPreference = prevNotificationPreference === CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN ? CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS : CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN; - updateNotificationPreference(newChat.reportID, prevNotificationPreference, notificationPreference, false, parentReportID, parentReportAction?.reportActionID); + updateNotificationPreference(newChat.reportID, prevNotificationPreference, notificationPreference, parentReportID, parentReportAction?.reportActionID); } } @@ -2052,9 +2045,8 @@ function deleteReportField(reportID: string, reportField: PolicyReportField) { } function updateDescription(reportID: string, previousValue: string, newValue: string) { - // No change needed, navigate back + // No change needed if (previousValue === newValue) { - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)); return; } @@ -2120,12 +2112,11 @@ function updateDescription(reportID: string, previousValue: string, newValue: st const parameters: UpdateRoomDescriptionParams = {reportID, description: parsedDescription, reportActionID: optimisticDescriptionUpdatedReportAction.reportActionID}; API.write(WRITE_COMMANDS.UPDATE_ROOM_DESCRIPTION, parameters, {optimisticData, failureData, successData}); - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)); } -function updateWriteCapabilityAndNavigate(report: Report, newValue: WriteCapability) { +function updateWriteCapability(report: Report, newValue: WriteCapability) { + // No change needed if (report.writeCapability === newValue) { - Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(report.reportID)); return; } @@ -2147,8 +2138,6 @@ function updateWriteCapabilityAndNavigate(report: Report, newValue: WriteCapabil const parameters: UpdateReportWriteCapabilityParams = {reportID: report.reportID, writeCapability: newValue}; API.write(WRITE_COMMANDS.UPDATE_REPORT_WRITE_CAPABILITY, parameters, {optimisticData, failureData}); - // Return to the report settings page since this field utilizes push-to-page - Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(report.reportID)); } /** @@ -2314,13 +2303,12 @@ function navigateToConciergeChatAndDeleteReport(reportID: string, shouldPopToTop * @param policyRoomReport The policy room report * @param policyRoomName The updated name for the policy room */ -function updatePolicyRoomNameAndNavigate(policyRoomReport: Report, policyRoomName: string) { +function updatePolicyRoomName(policyRoomReport: Report, policyRoomName: string) { const reportID = policyRoomReport.reportID; const previousName = policyRoomReport.reportName; - // No change needed, navigate back + // No change needed if (previousName === policyRoomName) { - Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(reportID)); return; } @@ -2386,7 +2374,6 @@ function updatePolicyRoomNameAndNavigate(policyRoomReport: Report, policyRoomNam }; API.write(WRITE_COMMANDS.UPDATE_POLICY_ROOM_NAME, parameters, {optimisticData, successData, failureData}); - Navigation.goBack(ROUTES.REPORT_SETTINGS.getRoute(reportID)); } /** @@ -2758,10 +2745,8 @@ function joinRoom(report: OnyxEntry) { report.reportID, ReportUtils.getReportNotificationPreference(report), CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS, - false, report.parentReportID, report.parentReportActionID, - report, ); } @@ -4100,7 +4085,7 @@ export { addComment, addAttachment, updateDescription, - updateWriteCapabilityAndNavigate, + updateWriteCapability, updateNotificationPreference, subscribeToReportTypingEvents, subscribeToReportLeavingEvents, @@ -4129,7 +4114,7 @@ export { navigateToAndOpenReportWithAccountIDs, navigateToAndOpenChildReport, toggleSubscribeToChildReport, - updatePolicyRoomNameAndNavigate, + updatePolicyRoomName, clearPolicyRoomNameErrors, clearIOUError, subscribeToNewActionEvent, diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 41ccfee1786b..08568b6d5a02 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -18,6 +18,7 @@ import playSound, {SOUNDS} from '@libs/Sound'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type {Route} from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import type {Icon} from '@src/types/onyx/OnyxCommon'; import type {ReportActions} from '@src/types/onyx/ReportAction'; @@ -846,7 +847,7 @@ function clearOutTaskInfoAndNavigate(reportID?: string, chatReport?: OnyxEntry) { /** * Closes the current open task modal and clears out the task info from the store. */ -function dismissModalAndClearOutTaskInfo() { - Navigation.closeRHPFlow(); +function dismissModalAndClearOutTaskInfo(backTo?: Route) { + if (backTo) { + Navigation.goBack(backTo); + } else { + Navigation.closeRHPFlow(); + } clearOutTaskInfo(); } diff --git a/src/pages/EditReportFieldPage.tsx b/src/pages/EditReportFieldPage.tsx index 5690d3202136..ec4ce6568f70 100644 --- a/src/pages/EditReportFieldPage.tsx +++ b/src/pages/EditReportFieldPage.tsx @@ -1,3 +1,4 @@ +import type {StackScreenProps} from '@react-navigation/stack'; import {Str} from 'expensify-common'; import React, {useState} from 'react'; import {withOnyx} from 'react-native-onyx'; @@ -14,9 +15,12 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import isSearchTopmostCentralPane from '@libs/Navigation/isSearchTopmostCentralPane'; import Navigation from '@libs/Navigation/Navigation'; +import type {EditRequestNavigatorParamList} from '@libs/Navigation/types'; import * as ReportUtils from '@libs/ReportUtils'; import * as ReportActions from '@src/libs/actions/Report'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {Policy, Report} from '@src/types/onyx'; import EditReportFieldDate from './EditReportFieldDate'; import EditReportFieldDropdown from './EditReportFieldDropdown'; @@ -30,26 +34,12 @@ type EditReportFieldPageOnyxProps = { policy: OnyxEntry; }; -type EditReportFieldPageProps = EditReportFieldPageOnyxProps & { - /** Route from navigation */ - route: { - /** Params from the route */ - params: { - /** Which field we are editing */ - fieldID: string; - - /** reportID for the expense report */ - reportID: string; - - /** policyID for the expense report */ - policyID: string; - }; - }; -}; +type EditReportFieldPageProps = EditReportFieldPageOnyxProps & StackScreenProps; function EditReportFieldPage({route, policy, report}: EditReportFieldPageProps) { const {windowWidth} = useWindowDimensions(); const styles = useThemeStyles(); + const backTo = route.params.backTo; const fieldKey = ReportUtils.getReportFieldKey(route.params.fieldID); const reportField = report?.fieldList?.[fieldKey] ?? policy?.fieldList?.[fieldKey]; const policyField = policy?.fieldList?.[fieldKey] ?? reportField; @@ -71,11 +61,19 @@ function EditReportFieldPage({route, policy, report}: EditReportFieldPageProps) ); } + const goBack = () => { + if (isReportFieldTitle) { + Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo)); + return; + } + Navigation.goBack(backTo); + }; + const handleReportFieldChange = (form: FormOnyxValues) => { const value = form[fieldKey]; if (isReportFieldTitle) { ReportActions.updateReportName(report.reportID, value, report.reportName ?? ''); - Navigation.goBack(); + goBack(); } else { ReportActions.updateReportField(report.reportID, {...reportField, value: value === '' ? null : value}, reportField); Navigation.dismissModal(isSearchTopmostCentralPane() ? undefined : report?.reportID); @@ -111,6 +109,7 @@ function EditReportFieldPage({route, policy, report}: EditReportFieldPageProps) threeDotsMenuItems={menuItems} shouldShowThreeDotsButton={!!menuItems?.length} threeDotsAnchorPosition={styles.threeDotsPopoverOffsetNoCloseButton(windowWidth)} + onBackButtonPress={goBack} /> {({safeAreaPaddingBottomStyle}) => ( - + Navigation.goBack(route.params.backTo)} + /> >>; function InviteReportParticipantsPage({betas, personalDetails, report, didScreenTransitionEnd}: InviteReportParticipantsPageProps) { + const route = useRoute>(); const {options, areOptionsInitialized} = useOptionsList({ shouldInitialize: didScreenTransitionEnd, }); @@ -163,7 +168,7 @@ function InviteReportParticipantsPage({betas, personalDetails, report, didScreen const validate = useCallback(() => selectedOptions.length > 0, [selectedOptions]); const reportID = report.reportID; - const backRoute = useMemo(() => ROUTES.REPORT_PARTICIPANTS.getRoute(reportID), [reportID]); + const backRoute = useMemo(() => ROUTES.REPORT_PARTICIPANTS.getRoute(reportID, route.params.backTo), [reportID, route.params.backTo]); const reportName = useMemo(() => ReportUtils.getGroupChatName(undefined, true, report), [report]); const inviteUsers = useCallback(() => { if (!validate()) { diff --git a/src/pages/PrivateNotes/PrivateNotesEditPage.tsx b/src/pages/PrivateNotes/PrivateNotesEditPage.tsx index 1779fe8e085e..ac8eb7f862b6 100644 --- a/src/pages/PrivateNotes/PrivateNotesEditPage.tsx +++ b/src/pages/PrivateNotes/PrivateNotesEditPage.tsx @@ -47,6 +47,7 @@ type PrivateNotesEditPageProps = WithReportAndPrivateNotesOrNotFoundProps & }; function PrivateNotesEditPage({route, personalDetailsList, report, session}: PrivateNotesEditPageProps) { + const backTo = route.params.backTo; const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -102,9 +103,9 @@ function PrivateNotesEditPage({route, personalDetailsList, report, session}: Pri Keyboard.dismiss(); if (!Object.values({...report.privateNotes, [route.params.accountID]: {note: editedNote}}).some((item) => item.note)) { - ReportUtils.navigateToDetailsPage(report); + ReportUtils.navigateToDetailsPage(report, backTo); } else { - Navigation.goBack(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID)); + Navigation.goBack(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID, backTo)); } }; @@ -116,7 +117,7 @@ function PrivateNotesEditPage({route, personalDetailsList, report, session}: Pri > ReportUtils.goBackFromPrivateNotes(report, session)} + onBackButtonPress={() => ReportUtils.goBackFromPrivateNotes(report, session, backTo)} shouldShowBackButton onCloseButtonPress={() => Navigation.dismissModal()} /> diff --git a/src/pages/PrivateNotes/PrivateNotesListPage.tsx b/src/pages/PrivateNotes/PrivateNotesListPage.tsx index 055bba42c552..cc7ee9f54daa 100644 --- a/src/pages/PrivateNotes/PrivateNotesListPage.tsx +++ b/src/pages/PrivateNotes/PrivateNotesListPage.tsx @@ -1,3 +1,5 @@ +import type {RouteProp} from '@react-navigation/native'; +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; @@ -11,11 +13,13 @@ import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; +import type {PrivateNotesNavigatorParamList} from '@libs/Navigation/types'; import type {WithReportAndPrivateNotesOrNotFoundProps} from '@pages/home/report/withReportAndPrivateNotesOrNotFound'; import withReportAndPrivateNotesOrNotFound from '@pages/home/report/withReportAndPrivateNotesOrNotFound'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {PersonalDetailsList, Report} from '@src/types/onyx'; type PrivateNotesListPageOnyxProps = { @@ -40,6 +44,8 @@ type NoteListItem = { }; function PrivateNotesListPage({report, personalDetailsList, session}: PrivateNotesListPageProps) { + const route = useRoute>(); + const backTo = route.params.backTo; const styles = useThemeStyles(); const {translate} = useLocalize(); const getAttachmentValue = useCallback((item: NoteListItem) => ({reportID: item.reportID, accountID: Number(item.accountID), type: CONST.ATTACHMENT_TYPE.NOTE}), []); @@ -77,13 +83,13 @@ function PrivateNotesListPage({report, personalDetailsList, session}: PrivateNot reportID: report.reportID, accountID, title: Number(session?.accountID) === Number(accountID) ? translate('privateNotes.myNote') : personalDetailsList?.[accountID]?.login ?? '', - action: () => Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, accountID)), + action: () => Navigation.navigate(ROUTES.PRIVATE_NOTES_EDIT.getRoute(report.reportID, accountID, backTo)), brickRoadIndicator: privateNoteBrickRoadIndicator(Number(accountID)), note: privateNote?.note ?? '', disabled: Number(session?.accountID) !== Number(accountID), }; }); - }, [report, personalDetailsList, session, translate]); + }, [report, personalDetailsList, session, translate, backTo]); return ( Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo))} onCloseButtonPress={() => Navigation.dismissModal()} /> {translate('privateNotes.personalNoteMessage')} diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index 2b732bb5506a..0d47e3fd8f35 100755 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -277,7 +277,7 @@ function ProfilePage({route}: ProfilePageProps) { shouldShowRightIcon title={notificationPreference} description={translate('notificationPreferencesPage.label')} - onPress={() => Navigation.navigate(ROUTES.REPORT_SETTINGS_NOTIFICATION_PREFERENCES.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.REPORT_SETTINGS_NOTIFICATION_PREFERENCES.getRoute(report.reportID, navigateBackTo))} /> )} {!isEmptyObject(report) && report.reportID && !isCurrentUser && ( @@ -285,7 +285,7 @@ function ProfilePage({route}: ProfilePageProps) { title={`${translate('privateNotes.title')}`} titleStyle={styles.flex1} icon={Expensicons.Pencil} - onPress={() => ReportUtils.navigateToPrivateNotes(report, session)} + onPress={() => ReportUtils.navigateToPrivateNotes(report, session, navigateBackTo)} wrapperStyle={styles.breakAll} shouldShowRightIcon brickRoadIndicator={ReportActions.hasErrorInPrivateNotes(report) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index d0049dfe5865..66c61b134aef 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -74,10 +74,11 @@ const CASES = { type CaseID = ValueOf; -function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { +function ReportDetailsPage({policies, report, route}: ReportDetailsPageProps) { const {translate} = useLocalize(); const {isOffline} = useNetwork(); const styles = useThemeStyles(); + const backTo = route.params.backTo; // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here. /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ @@ -315,9 +316,9 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { shouldShowRightIcon: true, action: () => { if (shouldOpenRoomMembersPage) { - Navigation.navigate(ROUTES.ROOM_MEMBERS.getRoute(report?.reportID ?? '-1')); + Navigation.navigate(ROUTES.ROOM_MEMBERS.getRoute(report?.reportID ?? '-1', backTo)); } else { - Navigation.navigate(ROUTES.REPORT_PARTICIPANTS.getRoute(report?.reportID ?? '-1')); + Navigation.navigate(ROUTES.REPORT_PARTICIPANTS.getRoute(report?.reportID ?? '-1', backTo)); } }, }); @@ -342,7 +343,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { isAnonymousAction: false, shouldShowRightIcon: true, action: () => { - Navigation.navigate(ROUTES.REPORT_SETTINGS.getRoute(report?.reportID ?? '-1')); + Navigation.navigate(ROUTES.REPORT_SETTINGS.getRoute(report?.reportID ?? '-1', backTo)); }, }); } @@ -355,7 +356,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { icon: Expensicons.Pencil, isAnonymousAction: false, shouldShowRightIcon: true, - action: () => ReportUtils.navigateToPrivateNotes(report, session), + action: () => ReportUtils.navigateToPrivateNotes(report, session, backTo), brickRoadIndicator: Report.hasErrorInPrivateNotes(report) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }); } @@ -410,7 +411,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { icon: Expensicons.Upload, isAnonymousAction: false, action: () => { - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_EXPORT.getRoute(report?.reportID ?? '', connectedIntegration)); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_EXPORT.getRoute(report?.reportID ?? '', connectedIntegration, backTo)); }, }); } @@ -470,6 +471,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { isDebugModeEnabled, unapproveExpenseReportOrShowModal, isExpenseReport, + backTo, ]); const displayNamesWithTooltips = useMemo(() => { @@ -577,10 +579,10 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { result.push(PromotedActions.pin(report)); } - result.push(PromotedActions.share(report)); + result.push(PromotedActions.share(report, backTo)); return result; - }, [report, moneyRequestAction, canJoin, isExpenseReport, shouldShowHoldAction, canHoldUnholdReportAction.canHoldRequest, transactionThreadReportID, isDelegateAccessRestricted]); + }, [report, moneyRequestAction, canJoin, isExpenseReport, shouldShowHoldAction, canHoldUnholdReportAction.canHoldRequest, transactionThreadReportID, isDelegateAccessRestricted, backTo]); const nameSectionExpenseIOU = ( @@ -642,7 +644,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { shouldCheckActionAllowedOnPress={false} description={!shouldDisableRename ? roomDescription : ''} furtherDetails={chatRoomSubtitle && !isGroupChat ? additionalRoomDetails : ''} - onPress={() => Navigation.navigate(ROUTES.REPORT_SETTINGS_NAME.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.REPORT_SETTINGS_NAME.getRoute(report.reportID, backTo))} /> @@ -687,7 +689,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { titleStyle={styles.newKansasLarge} shouldCheckActionAllowedOnPress={false} description={Str.UCFirst(titleField.name)} - onPress={() => Navigation.navigate(ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute(report.reportID, report.policyID ?? '-1', titleField.fieldID ?? '-1'))} + onPress={() => Navigation.navigate(ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute(report.reportID, report.policyID ?? '-1', titleField.fieldID ?? '-1', backTo))} furtherDetailsComponent={nameSectionFurtherDetailsContent} /> @@ -722,7 +724,10 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { return ( - + Navigation.goBack(backTo)} + /> {renderedAvatar} @@ -744,7 +749,7 @@ function ReportDetailsPage({policies, report}: ReportDetailsPageProps) { characterLimit={100} shouldCheckActionAllowedOnPress={false} description={translate('reportDescriptionPage.roomDescription')} - onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID))} + onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID, Navigation.getActiveRoute()))} /> )} diff --git a/src/pages/ReportParticipantDetailsPage.tsx b/src/pages/ReportParticipantDetailsPage.tsx index 6ff710cf23b0..db978b70cad8 100644 --- a/src/pages/ReportParticipantDetailsPage.tsx +++ b/src/pages/ReportParticipantDetailsPage.tsx @@ -49,7 +49,7 @@ function ReportParticipantDetails({personalDetails, report, route}: ReportPartic const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = React.useState(false); const accountID = Number(route.params.accountID); - const backTo = ROUTES.REPORT_PARTICIPANTS.getRoute(report?.reportID ?? '-1'); + const backTo = ROUTES.REPORT_PARTICIPANTS.getRoute(report?.reportID ?? '-1', route.params.backTo); const member = report?.participants?.[accountID]; const details = personalDetails?.[accountID] ?? ({} as PersonalDetails); @@ -68,8 +68,8 @@ function ReportParticipantDetails({personalDetails, report, route}: ReportPartic }, [accountID]); const openRoleSelectionModal = useCallback(() => { - Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_ROLE_SELECTION.getRoute(report.reportID, accountID)); - }, [accountID, report.reportID]); + Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_ROLE_SELECTION.getRoute(report.reportID, accountID, route.params.backTo)); + }, [accountID, report.reportID, route.params.backTo]); if (!member) { return ; diff --git a/src/pages/ReportParticipantRoleSelectionPage.tsx b/src/pages/ReportParticipantRoleSelectionPage.tsx index d2fb5ca365a0..17b84e8903ea 100644 --- a/src/pages/ReportParticipantRoleSelectionPage.tsx +++ b/src/pages/ReportParticipantRoleSelectionPage.tsx @@ -30,7 +30,7 @@ function ReportParticipantRoleSelectionPage({report, route}: ReportParticipantRo const styles = useThemeStyles(); const accountID = Number(route?.params?.accountID) ?? -1; - const backTo = ROUTES.REPORT_PARTICIPANTS_DETAILS.getRoute(report?.reportID ?? '-1', accountID); + const backTo = ROUTES.REPORT_PARTICIPANTS_DETAILS.getRoute(report?.reportID ?? '-1', accountID, route.params.backTo); const member = report.participants?.[accountID]; if (!member) { diff --git a/src/pages/ReportParticipantsPage.tsx b/src/pages/ReportParticipantsPage.tsx index 8ce9ec4d09a4..579e6f7ec104 100755 --- a/src/pages/ReportParticipantsPage.tsx +++ b/src/pages/ReportParticipantsPage.tsx @@ -1,4 +1,5 @@ import {useIsFocused} from '@react-navigation/native'; +import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import type {TextInput} from 'react-native'; @@ -28,18 +29,22 @@ import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode'; import * as Report from '@libs/actions/Report'; import * as UserSearchPhraseActions from '@libs/actions/RoomMembersUserSearchPhrase'; import Navigation from '@libs/Navigation/Navigation'; +import type {ParticipantsNavigatorParamList} from '@libs/Navigation/types'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {WithReportOrNotFoundProps} from './home/report/withReportOrNotFound'; import withReportOrNotFound from './home/report/withReportOrNotFound'; type MemberOption = Omit & {accountID: number}; -function ReportParticipantsPage({report}: WithReportOrNotFoundProps) { +type ReportParticipantsPageProps = WithReportOrNotFoundProps & StackScreenProps; +function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) { + const backTo = route.params.backTo; const [selectedMembers, setSelectedMembers] = useState([]); const [removeMembersConfirmModalVisible, setRemoveMembersConfirmModalVisible] = useState(false); const {translate, formatPhoneNumber} = useLocalize(); @@ -192,8 +197,8 @@ function ReportParticipantsPage({report}: WithReportOrNotFoundProps) { * Open the modal to invite a user */ const inviteUser = useCallback(() => { - Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_INVITE.getRoute(report.reportID)); - }, [report]); + Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_INVITE.getRoute(report.reportID, backTo)); + }, [report, backTo]); /** * Remove selected users from the workspace @@ -330,12 +335,12 @@ function ReportParticipantsPage({report}: WithReportOrNotFoundProps) { const openMemberDetails = useCallback( (item: MemberOption) => { if (isGroupChat && isCurrentUserAdmin) { - Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_DETAILS.getRoute(report.reportID, item.accountID)); + Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_DETAILS.getRoute(report.reportID, item.accountID, backTo)); return; } - Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID)); + Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID, Navigation.getActiveRoute())); }, - [report, isCurrentUserAdmin, isGroupChat], + [report, isCurrentUserAdmin, isGroupChat, backTo], ); const headerTitle = useMemo(() => { if ( @@ -377,7 +382,7 @@ function ReportParticipantsPage({report}: WithReportOrNotFoundProps) { if (report) { setSearchValue(''); - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); + Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo)); } }} guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_MEMBERS} diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index 6589a73c88e8..a70f17d1468c 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -1,4 +1,5 @@ -import {useFocusEffect} from '@react-navigation/native'; +import type {RouteProp} from '@react-navigation/native'; +import {useFocusEffect, useRoute} from '@react-navigation/native'; import React, {useCallback, useRef, useState} from 'react'; import {View} from 'react-native'; import type {OnyxCollection} from 'react-native-onyx'; @@ -13,6 +14,8 @@ import TextInput from '@components/TextInput'; import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import type {ReportDescriptionNavigatorParamList} from '@libs/Navigation/types'; import Parser from '@libs/Parser'; import * as ReportUtils from '@libs/ReportUtils'; import updateMultilineInputRange from '@libs/updateMultilineInputRange'; @@ -20,6 +23,8 @@ import variables from '@styles/variables'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/ReportDescriptionForm'; import type * as OnyxTypes from '@src/types/onyx'; @@ -32,6 +37,8 @@ type RoomDescriptionPageProps = { }; function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { + const route = useRoute>(); + const backTo = route.params.backTo; const styles = useThemeStyles(); const [description, setDescription] = useState(() => Parser.htmlToMarkdown(report?.description ?? '')); const reportDescriptionInputRef = useRef(null); @@ -43,9 +50,17 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { setDescription(value); }, []); + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); + }, [report.reportID, backTo]); + const submitForm = useCallback(() => { - Report.updateDescription(report.reportID, report?.description ?? '', description.trim()); - }, [report.reportID, report.description, description]); + const previousValue = report?.description ?? ''; + const newValue = description.trim(); + + Report.updateDescription(report.reportID, previousValue, newValue); + goBack(); + }, [report.reportID, report.description, description, goBack]); useFocusEffect( useCallback(() => { @@ -68,7 +83,10 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { includeSafeAreaPaddingBottom={false} testID={RoomDescriptionPage.displayName} > - + {canEdit && ( ReportUtils.getReportName(report), [report]); const inviteUsers = useCallback(() => { HttpUtils.cancelPendingRequests(READ_COMMANDS.SEARCH_FOR_REPORTS); diff --git a/src/pages/RoomMemberDetailsPage.tsx b/src/pages/RoomMemberDetailsPage.tsx index 8b2e89024d8c..475cf37a8847 100644 --- a/src/pages/RoomMemberDetailsPage.tsx +++ b/src/pages/RoomMemberDetailsPage.tsx @@ -38,7 +38,7 @@ function RoomMemberDetailsPage({report, route}: RoomMemberDetailsPagePageProps) const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = React.useState(false); const accountID = Number(route.params.accountID); - const backTo = ROUTES.ROOM_MEMBERS.getRoute(report?.reportID ?? '-1'); + const backTo = ROUTES.ROOM_MEMBERS.getRoute(report?.reportID ?? '-1', route.params.backTo); const member = report?.participants?.[accountID]; const details = personalDetails?.[accountID] ?? ({} as PersonalDetails); diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index 19e631098e40..765c738bc574 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -1,4 +1,5 @@ -import {useIsFocused} from '@react-navigation/native'; +import type {RouteProp} from '@react-navigation/native'; +import {useIsFocused, useRoute} from '@react-navigation/native'; import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {View} from 'react-native'; @@ -55,6 +56,7 @@ type RoomMembersPageProps = WithReportOrNotFoundProps & StackScreenProps; function RoomMembersPage({report, session, policies}: RoomMembersPageProps) { + const route = useRoute>(); const styles = useThemeStyles(); const {formatPhoneNumber, translate} = useLocalize(); const [selectedMembers, setSelectedMembers] = useState([]); @@ -65,6 +67,7 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) { const personalDetails = usePersonalDetails() || CONST.EMPTY_OBJECT; const policy = useMemo(() => policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? ''}`], [policies, report?.policyID]); const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(report), [report]); + const backTo = route.params.backTo; const isFocusedScreen = useIsFocused(); const {isOffline} = useNetwork(); @@ -113,8 +116,8 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) { return; } setSearchValue(''); - Navigation.navigate(ROUTES.ROOM_INVITE.getRoute(report.reportID)); - }, [report, setSearchValue]); + Navigation.navigate(ROUTES.ROOM_INVITE.getRoute(report.reportID, undefined, backTo)); + }, [report, setSearchValue, backTo]); /** * Remove selected users from the room @@ -311,9 +314,9 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) { /** Opens the room member details page */ const openRoomMemberDetails = useCallback( (item: ListItem) => { - Navigation.navigate(ROUTES.ROOM_MEMBER_DETAILS.getRoute(report.reportID, item?.accountID ?? -1)); + Navigation.navigate(ROUTES.ROOM_MEMBER_DETAILS.getRoute(report.reportID, item?.accountID ?? -1, backTo)); }, - [report], + [report, backTo], ); const selectionModeHeader = selectionMode?.isEnabled && isSmallScreenWidth; @@ -345,7 +348,7 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) { } subtitleKey={isEmptyObject(report) ? undefined : 'roomMembersPage.notAuthorized'} onBackButtonPress={() => { - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); + Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo)); }} > {headerButtons} diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index e11e99a6e852..18f6c5960b5e 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -19,6 +19,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import Clipboard from '@libs/Clipboard'; import Navigation from '@libs/Navigation/Navigation'; +import type {BackToParams} from '@libs/Navigation/types'; import * as ReportUtils from '@libs/ReportUtils'; import * as Url from '@libs/Url'; import * as UserUtils from '@libs/UserUtils'; @@ -34,7 +35,7 @@ type ShareCodePageOnyxProps = { policy?: OnyxEntry; }; -type ShareCodePageProps = ShareCodePageOnyxProps; +type ShareCodePageProps = ShareCodePageOnyxProps & BackToParams; /** * When sharing a policy (workspace) only return user avatar that is user defined. Default ws avatars have separate logic. @@ -53,7 +54,7 @@ function getLogoForWorkspace(report: OnyxEntry, policy?: OnyxEntry Navigation.goBack(isReport ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID) : undefined)} + onBackButtonPress={() => Navigation.goBack(isReport ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID, backTo) : undefined)} shouldShowBackButton /> @@ -146,7 +147,7 @@ function ShareCodePage({report, policy}: ShareCodePageProps) { Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE, Navigation.getActiveRouteWithoutParams()))} + onPress={() => Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE, Navigation.getActiveRoute()))} shouldShowRightIcon /> diff --git a/src/pages/TransactionDuplicate/Confirmation.tsx b/src/pages/TransactionDuplicate/Confirmation.tsx index 9830ea2a8745..15217e215ad4 100644 --- a/src/pages/TransactionDuplicate/Confirmation.tsx +++ b/src/pages/TransactionDuplicate/Confirmation.tsx @@ -15,6 +15,7 @@ import ScrollView from '@components/ScrollView'; import {ShowContextMenuContext} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import useReviewDuplicatesNavigation from '@hooks/useReviewDuplicatesNavigation'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; @@ -36,6 +37,9 @@ function Confirmation() { const route = useRoute>(); const [reviewDuplicates, reviewDuplicatesResult] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); const transaction = useMemo(() => TransactionUtils.buildNewTransactionAfterReviewingDuplicates(reviewDuplicates), [reviewDuplicates]); + const transactionID = TransactionUtils.getTransactionID(route.params.threadReportID ?? ''); + const compareResult = TransactionUtils.compareDuplicateTransactionFields(transactionID); + const {goBack} = useReviewDuplicatesNavigation(Object.keys(compareResult.change ?? {}), 'confirmation', route.params.threadReportID, route.params.backTo); const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`); const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction?.reportID}`); const reportAction = Object.values(reportActions ?? {}).find( @@ -83,7 +87,10 @@ function Confirmation() { {({safeAreaPaddingBottomStyle}) => ( - + - + Navigation.goBack(route.params.backTo)} + />