diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 44ff6908fd2f..590748d4e9a5 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -465,10 +465,6 @@ const ROUTES = { return getUrlWithBackToParam(baseRoute, backTo); }, }, - SET_DEFAULT_WORKSPACE: { - route: 'set-default-workspace', - getRoute: (navigateTo?: string) => (navigateTo ? (`set-default-workspace?navigateTo=${encodeURIComponent(navigateTo)}` as const) : ('set-default-workspace' as const)), - }, REPORT: 'r', REPORT_WITH_ID: { route: 'r/:reportID?/:reportActionID?', @@ -906,6 +902,10 @@ const ROUTES = { return getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${reportID}/edit${shouldTurnOffSelectionMode ? '?shouldTurnOffSelectionMode=true' : ''}`, backTo); }, }, + SET_DEFAULT_WORKSPACE: { + route: 'set-default-workspace', + getRoute: (navigateTo?: string) => (navigateTo ? (`set-default-workspace?navigateTo=${encodeURIComponent(navigateTo)}` as const) : ('set-default-workspace' as const)), + }, SETTINGS_TAGS_ROOT: { route: 'settings/:policyID/tags', getRoute: (policyID: string | undefined, backTo = '') => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 5811bf7e08f6..f29c6c91d7b6 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -404,9 +404,7 @@ const SCREENS = { ROOT: 'NewReportWorkspaceSelection_Root', }, - SET_DEFAULT_WORKSPACE: { - ROOT: 'SetDefaultWorkspace_Root', - }, + SET_DEFAULT_WORKSPACE: 'SetDefaultWorkspace', REPORT_DETAILS: { ROOT: 'Report_Details_Root', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index bdc9bebdbf54..4d3528d985d1 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -37,7 +37,6 @@ import type { SearchAdvancedFiltersParamList, SearchReportParamList, SearchSavedSearchParamList, - SetDefaultWorkspaceNavigatorParamList, SettingsNavigatorParamList, ShareNavigatorParamList, SignInNavigatorParamList, @@ -185,6 +184,7 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator require('../../../../pages/iou/request/DistanceRequestStartPage').default, [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MAP]: () => require('../../../../pages/iou/request/step/IOURequestStepDistanceMap').default, [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL]: () => require('../../../../pages/iou/request/step/IOURequestStepDistanceManual').default, + [SCREENS.SET_DEFAULT_WORKSPACE]: () => require('../../../../pages/SetDefaultWorkspacePage').default, }); const TravelModalStackNavigator = createModalStackNavigator({ @@ -213,10 +213,6 @@ const NewReportWorkspaceSelectionModalStackNavigator = createModalStackNavigator [SCREENS.NEW_REPORT_WORKSPACE_SELECTION.ROOT]: () => require('../../../../pages/NewReportWorkspaceSelectionPage').default, }); -const SetDefaultWorkspaceModalStackNavigator = createModalStackNavigator({ - [SCREENS.SET_DEFAULT_WORKSPACE.ROOT]: () => require('../../../../pages/SetDefaultWorkspacePage').default, -}); - const ReportDetailsModalStackNavigator = createModalStackNavigator({ [SCREENS.REPORT_DETAILS.ROOT]: () => require('../../../../pages/ReportDetailsPage').default, [SCREENS.REPORT_DETAILS.SHARE_CODE]: () => require('../../../../pages/home/report/ReportDetailsShareCodePage').default, @@ -933,7 +929,6 @@ export { ReferralModalStackNavigator, TravelModalStackNavigator, NewReportWorkspaceSelectionModalStackNavigator, - SetDefaultWorkspaceModalStackNavigator, ReportDescriptionModalStackNavigator, ReportDetailsModalStackNavigator, ReportChangeWorkspaceModalStackNavigator, diff --git a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx index 6c6e525903b3..b26e7972c1ce 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx @@ -107,10 +107,6 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) { name={SCREENS.RIGHT_MODAL.NEW_REPORT_WORKSPACE_SELECTION} component={ModalStackNavigators.NewReportWorkspaceSelectionModalStackNavigator} /> - ['config'] = { [SCREENS.NEW_REPORT_WORKSPACE_SELECTION.ROOT]: ROUTES.NEW_REPORT_WORKSPACE_SELECTION.route, }, }, - [SCREENS.RIGHT_MODAL.SET_DEFAULT_WORKSPACE]: { - screens: { - [SCREENS.SET_DEFAULT_WORKSPACE.ROOT]: ROUTES.SET_DEFAULT_WORKSPACE.route, - }, - }, [SCREENS.RIGHT_MODAL.REPORT_DETAILS]: { screens: { [SCREENS.REPORT_DETAILS.ROOT]: ROUTES.REPORT_WITH_ID_DETAILS.route, @@ -1432,6 +1427,7 @@ const config: LinkingOptions['config'] = { path: ROUTES.SPLIT_EXPENSE_EDIT.route, exact: true, }, + [SCREENS.SET_DEFAULT_WORKSPACE]: ROUTES.SET_DEFAULT_WORKSPACE.route, }, }, [SCREENS.RIGHT_MODAL.TRANSACTION_DUPLICATE]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 873d60e713db..85526fc81ac4 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1359,12 +1359,6 @@ type NewReportWorkspaceSelectionNavigatorParamList = { }; }; -type SetDefaultWorkspaceNavigatorParamList = { - [SCREENS.SET_DEFAULT_WORKSPACE.ROOT]: { - navigateTo?: Routes; - }; -}; - type ReportDetailsNavigatorParamList = { [SCREENS.REPORT_DETAILS.ROOT]: { reportID: string; @@ -1814,6 +1808,9 @@ type MoneyRequestNavigatorParamList = { backToReport?: string; reportActionID?: string; }; + [SCREENS.SET_DEFAULT_WORKSPACE]: { + navigateTo?: Routes; + }; }; type WorkspaceConfirmationNavigatorParamList = { @@ -2052,7 +2049,6 @@ type RightModalNavigatorParamList = { [SCREENS.RIGHT_MODAL.PROFILE]: NavigatorScreenParams; [SCREENS.SETTINGS.SHARE_CODE]: undefined; [SCREENS.RIGHT_MODAL.NEW_REPORT_WORKSPACE_SELECTION]: NavigatorScreenParams; - [SCREENS.RIGHT_MODAL.SET_DEFAULT_WORKSPACE]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.REPORT_DETAILS]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.REPORT_CHANGE_WORKSPACE]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.REPORT_SETTINGS]: NavigatorScreenParams; @@ -2746,7 +2742,6 @@ export type { ReimbursementAccountNavigatorParamList, ReimbursementAccountEnterSignerInfoNavigatorParamList, NewReportWorkspaceSelectionNavigatorParamList, - SetDefaultWorkspaceNavigatorParamList, ReportDescriptionNavigatorParamList, ReportDetailsNavigatorParamList, ReportChangeWorkspaceNavigatorParamList, diff --git a/src/pages/SetDefaultWorkspacePage.tsx b/src/pages/SetDefaultWorkspacePage.tsx index 20288e4473a9..ab0c61cc30de 100644 --- a/src/pages/SetDefaultWorkspacePage.tsx +++ b/src/pages/SetDefaultWorkspacePage.tsx @@ -15,14 +15,13 @@ import useWorkspaceList from '@hooks/useWorkspaceList'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SetDefaultWorkspaceNavigatorParamList} from '@libs/Navigation/types'; -import {hasEnabledOptions} from '@libs/OptionsListUtils'; import {isPaidGroupPolicy} from '@libs/PolicyUtils'; +import type {MoneyRequestNavigatorParamList} from '@navigation/types'; import {setNameValuePair} from '@userActions/User'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; -type SetDefaultWorkspacePageProps = PlatformStackScreenProps; +type SetDefaultWorkspacePageProps = PlatformStackScreenProps; function SetDefaultWorkspacePage({route}: SetDefaultWorkspacePageProps) { const {navigateTo} = route.params ?? {}; @@ -32,7 +31,6 @@ function SetDefaultWorkspacePage({route}: SetDefaultWorkspacePageProps) { const {translate, localeCompare} = useLocalize(); const [policies, fetchStatus] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false}); - const [allPolicyCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_CATEGORIES, {canBeMissing: false}); const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: false}); const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: false}); @@ -47,11 +45,13 @@ function SetDefaultWorkspacePage({route}: SetDefaultWorkspacePageProps) { Log.hmmm(`[SetDefaultWorkspacePage] navigateTo is undefined. Cannot navigate after setting default workspace to ${selectedPolicyID}`); return; } - const policyCategories = allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${selectedPolicyID}`]; + + const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${selectedPolicyID}`]; // eslint-disable-next-line rulesdir/no-default-id-values setNameValuePair(ONYXKEYS.NVP_ACTIVE_POLICY_ID, selectedPolicyID, activePolicyID ?? ''); - if (hasEnabledOptions(policyCategories ?? {})) { + + if (policy?.areCategoriesEnabled) { Navigation.navigate(navigateTo); return; } diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 3bfbe695b8f4..ffe8194ea811 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -11,7 +11,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; import LocationPermissionModal from '@components/LocationPermissionModal'; import MoneyRequestConfirmationList from '@components/MoneyRequestConfirmationList'; -import {usePersonalDetails} from '@components/OnyxListItemProvider'; +import {usePersonalDetails, usePolicyCategories} from '@components/OnyxListItemProvider'; import PrevNextButtons from '@components/PrevNextButtons'; import ScreenWrapper from '@components/ScreenWrapper'; import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; @@ -116,6 +116,7 @@ function IOURequestStepConfirmation({ }: IOURequestStepConfirmationProps) { const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); + const allPolicyCategories = usePolicyCategories(); const [isRemoveConfirmModalVisible, setRemoveConfirmModalVisible] = useState(false); const [optimisticTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, { @@ -175,7 +176,6 @@ function IOURequestStepConfirmation({ const policyID = isCreatingTrackExpense || isUnreported ? policyForMovingExpensesID : getIOURequestPolicyID(transaction, report); const isDraftPolicy = policy === policyDraft; - const [policyCategoriesReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${realPolicyID}`, {canBeMissing: true}); const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT}${draftPolicyID}`, {canBeMissing: true}); const [policyRecentlyUsedCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${realPolicyID}`, {canBeMissing: true}); const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${realPolicyID}`, {canBeMissing: true}); @@ -184,7 +184,18 @@ function IOURequestStepConfirmation({ const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); const [recentlyUsedDestinations] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS}${realPolicyID}`, {canBeMissing: true}); - const policyCategories = policyCategoriesReal ?? policyCategoriesDraft; + const policyCategories = useMemo(() => { + if (isDraftPolicy && draftPolicyID) { + return policyCategoriesDraft; + } + + if (realPolicyID) { + return allPolicyCategories?.[`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${realPolicyID}`]; + } + + return undefined; + }, [allPolicyCategories, realPolicyID, policyCategoriesDraft, draftPolicyID, isDraftPolicy]); + const receiverParticipant: Participant | InvoiceReceiver | undefined = transaction?.participants?.find((participant) => participant?.accountID) ?? report?.invoiceReceiver; const receiverAccountID = receiverParticipant && 'accountID' in receiverParticipant && receiverParticipant.accountID ? receiverParticipant.accountID : CONST.DEFAULT_NUMBER_ID; const receiverType = getReceiverType(receiverParticipant); @@ -264,19 +275,30 @@ function IOURequestStepConfirmation({ }, []); useEffect(() => { - if (isCreatingTrackExpense && policyForMovingExpensesID !== undefined && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { - openDraftWorkspaceRequest(policyForMovingExpensesID); + if (!isCreatingTrackExpense || policyForMovingExpensesID === undefined) { + return; } - const policyExpenseChat = participants?.find((participant) => participant.isPolicyExpenseChat); - if (policyExpenseChat?.policyID && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { - openDraftWorkspaceRequest(policyExpenseChat.policyID); + openDraftWorkspaceRequest(policyForMovingExpensesID); + }, [isCreatingTrackExpense, policy?.pendingAction, policyForMovingExpensesID]); + + const policyExpenseChatPolicyID = useMemo(() => { + return participants?.find((participant) => participant.isPolicyExpenseChat)?.policyID; + }, [participants]); + + const senderPolicyID = useMemo(() => { + return participants?.find((participant) => !!participant && 'isSender' in participant && participant.isSender)?.policyID; + }, [participants]); + + useEffect(() => { + if (policyExpenseChatPolicyID && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { + openDraftWorkspaceRequest(policyExpenseChatPolicyID); + return; } - const senderPolicyParticipant = participants?.find((participant) => !!participant && 'isSender' in participant && participant.isSender); - if (senderPolicyParticipant?.policyID && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { - openDraftWorkspaceRequest(senderPolicyParticipant.policyID); + if (senderPolicyID && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) { + openDraftWorkspaceRequest(senderPolicyID); } - }, [isCreatingTrackExpense, isOffline, participants, policy?.pendingAction, policyForMovingExpensesID]); + }, [isOffline, policy?.pendingAction, policyExpenseChatPolicyID, senderPolicyID]); const defaultBillable = !!policy?.defaultBillable; useEffect(() => { @@ -324,6 +346,15 @@ function IOURequestStepConfirmation({ useEffect(() => { transactions.forEach((item) => { if (!item.category) { + // If the expense had his category cleared due to unsaved changes (i.e. changing to recipient to one that does not have category) + // then we should reset the category to it's last saved value + const existingCategory = existingTransaction?.category; + if (existingCategory) { + const isExistingCategoryEnabled = policyCategories?.[existingCategory]?.enabled; + if (isExistingCategoryEnabled) { + setMoneyRequestCategory(item.transactionID, existingCategory, policy?.id); + } + } return; }