diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 7f19d63cf607..bf71521eeb7d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1042,25 +1042,25 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account/account-select', - getRoute: (policyID: string | undefined) => { + getRoute: (policyID?: string, backTo?: string) => { if (!policyID) { Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT route'); } - return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/account-select` as const; + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/account-select` as const, backTo); }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account/card-select', - getRoute: (policyID: string | undefined) => { + getRoute: (policyID?: string, backTo?: string) => { if (!policyID) { Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_SELECT route'); } - return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/card-select` as const; + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/card-select` as const, backTo); }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account/default-vendor-select', - getRoute: (policyID: string | undefined) => { + getRoute: (policyID?: string) => { if (!policyID) { Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT route'); } @@ -1069,7 +1069,12 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account` as const, backTo); + }, }, WORKSPACE_ACCOUNTING_QUICKBOOKS_DESKTOP_ADVANCED: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/advanced', @@ -1077,31 +1082,56 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/date-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/date-select` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/date-select` as const, backTo); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_PREFERRED_EXPORTER: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/preferred-exporter', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/preferred-exporter` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_PREFERRED_EXPORTER route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/preferred-exporter` as const, backTo); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense` as const, backTo); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense/account-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/account-select` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/account-select` as const, backTo); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select` as const, + getRoute: (policyID?: string, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select` as const, backTo); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export', - getRoute: (policyID: string | undefined) => { + getRoute: (policyID: string | undefined, backTo?: string) => { if (!policyID) { Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT route'); } - return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export` as const; + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export` as const, backTo, false); }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_SETUP_MODAL: { diff --git a/src/libs/API/parameters/UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams.ts b/src/libs/API/parameters/UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams.ts index 6d43fe03670c..09a7a15feef0 100644 --- a/src/libs/API/parameters/UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams.ts +++ b/src/libs/API/parameters/UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams.ts @@ -3,7 +3,7 @@ import type {QBDNonReimbursableExportAccountType} from '@src/types/onyx/Policy'; type UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams = { policyID: string; nonReimbursableExpensesExportDestination: QBDNonReimbursableExportAccountType; - nonReimbursableExpensesAccount: string; + nonReimbursableExpensesAccount?: string; nonReimbursableBillDefaultVendor: string; idempotencyKey: string; }; diff --git a/src/libs/API/parameters/UpdateQuickbooksDesktopExpensesExportDestinationTypeParams.ts b/src/libs/API/parameters/UpdateQuickbooksDesktopExpensesExportDestinationTypeParams.ts index d59d4013a2b3..b93fd24c6453 100644 --- a/src/libs/API/parameters/UpdateQuickbooksDesktopExpensesExportDestinationTypeParams.ts +++ b/src/libs/API/parameters/UpdateQuickbooksDesktopExpensesExportDestinationTypeParams.ts @@ -3,7 +3,7 @@ import type {QBDReimbursableExportAccountType} from '@src/types/onyx/Policy'; type UpdateQuickbooksDesktopExpensesExportDestinationTypeParams = { policyID: string; reimbursableExpensesExportDestination: QBDReimbursableExportAccountType; - reimbursableExpensesAccount: string; + reimbursableExpensesAccount?: string; idempotencyKey: string; }; diff --git a/src/libs/Navigation/helpers/goBackFromExportConnection.ts b/src/libs/Navigation/helpers/goBackFromExportConnection.ts new file mode 100644 index 000000000000..e78a572d51c5 --- /dev/null +++ b/src/libs/Navigation/helpers/goBackFromExportConnection.ts @@ -0,0 +1,19 @@ +import Navigation from '@libs/Navigation/Navigation'; +import CONST from '@src/CONST'; +import replaceCompanyCardsRoute from './replaceCompanyCardsRoute'; + +/** + * If export company card value is changed to unsupported - we should redirect user directly to card details view + * If not, just regular go back + */ +function goBackFromExportConnection(shouldGoBackToSpecificRoute: boolean, backTo?: string) { + const feature = CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards; + + if (!(shouldGoBackToSpecificRoute && backTo?.includes(feature.alias))) { + return Navigation.goBack(); + } + const companyCardDetailsPage = replaceCompanyCardsRoute(backTo); + return Navigation.goBack(companyCardDetailsPage); +} + +export default goBackFromExportConnection; diff --git a/src/libs/Navigation/helpers/replaceCompanyCardsRoute.ts b/src/libs/Navigation/helpers/replaceCompanyCardsRoute.ts new file mode 100644 index 000000000000..8df2aa4f050d --- /dev/null +++ b/src/libs/Navigation/helpers/replaceCompanyCardsRoute.ts @@ -0,0 +1,6 @@ +import type {Route as Routes} from '@src/ROUTES'; + +const replaceCompanyCardsRoute = (route: string): Routes => { + return route?.replace(/\/edit\/export$/, '') as Routes; +}; +export default replaceCompanyCardsRoute; diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 154224459501..abf2dbdee6a9 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -458,36 +458,45 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_COMPANY_CARD_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT]: { policyID: string; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_ADVANCED]: { policyID: string; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_PREFERRED_EXPORTER]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_SETUP_MODAL]: { policyID: string; diff --git a/src/libs/actions/connections/QuickbooksDesktop.ts b/src/libs/actions/connections/QuickbooksDesktop.ts index 07c8c660fc13..3e96010f5393 100644 --- a/src/libs/actions/connections/QuickbooksDesktop.ts +++ b/src/libs/actions/connections/QuickbooksDesktop.ts @@ -329,7 +329,7 @@ function getQuickbooksDesktopCodatSetupLink(policyID: string) { return API.makeRequestWithSideEffects(SIDE_EFFECT_REQUEST_COMMANDS.CONNECT_POLICY_TO_QUICKBOOKS_DESKTOP, params); } -function updateQuickbooksDesktopExpensesExportDestination( +function updateQuickbooksDesktopExpensesExportDestination( policyID: string, configUpdate: TConfigUpdate, configCurrentData: Partial, @@ -339,7 +339,7 @@ function updateQuickbooksDesktopExpensesExportDestination(policyID: string, configUpdate: TConfigUpdate, configCurrentData: Partial) { const onyxData = buildOnyxDataForMultipleQuickbooksExportConfigurations(policyID, configUpdate, configCurrentData); const parameters: UpdateQuickbooksDesktopCompanyCardExpenseAccountTypeParams = { policyID, nonReimbursableExpensesExportDestination: configUpdate.nonReimbursable, - nonReimbursableExpensesAccount: configUpdate.nonReimbursableAccount, + nonReimbursableExpensesAccount: configUpdate?.nonReimbursableAccount, nonReimbursableBillDefaultVendor: configUpdate.nonReimbursableBillDefaultVendor, idempotencyKey: String(CONST.QUICKBOOKS_CONFIG.NON_REIMBURSABLE_EXPENSES_EXPORT_DESTINATION), }; diff --git a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx index 9bbd0c3fadf4..54423fab0250 100644 --- a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx +++ b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx @@ -1,5 +1,5 @@ import {useRoute} from '@react-navigation/native'; -import React, {useMemo} from 'react'; +import React, {useCallback, useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -7,6 +7,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {areSettingsInErrorFields, getCurrentSageIntacctEntityName, settingsPendingAction} from '@libs/PolicyUtils'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; @@ -22,7 +23,11 @@ function SageIntacctExportPage({policy}: WithPolicyProps) { const route = useRoute>(); const backTo = route?.params?.backTo; const {export: exportConfig, pendingFields, errorFields} = policy?.connections?.intacct?.config ?? {}; - const shouldGoBackToSpecificRoute = exportConfig?.reimbursable === CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.EXPENSE_REPORT && backTo; + const shouldGoBackToSpecificRoute = exportConfig?.reimbursable === CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.EXPENSE_REPORT; + + const goBack = useCallback(() => { + return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); + }, [backTo, shouldGoBackToSpecificRoute]); const sections = useMemo( () => [ @@ -72,7 +77,7 @@ function SageIntacctExportPage({policy}: WithPolicyProps) { title="workspace.sageIntacct.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]} policyID={policyID} - onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} + onBackButtonPress={goBack} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx index 722712adf84c..5e5a3d5ea352 100644 --- a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx @@ -1,5 +1,5 @@ import {useRoute} from '@react-navigation/native'; -import React, {useMemo} from 'react'; +import React, {useCallback, useMemo} from 'react'; import {View} from 'react-native'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -17,6 +17,7 @@ import { findSelectedTaxAccountWithDefaultSelect, settingsPendingAction, } from '@libs/PolicyUtils'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; import type {DividerLineItem, MenuItem, ToggleItem} from '@pages/workspace/accounting/netsuite/types'; @@ -52,9 +53,12 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const config = policy?.connections?.netsuite?.options.config; const shouldGoBackToSpecificRoute = // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - (config?.reimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT || - config?.nonreimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT) && - backTo; + config?.reimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT || + config?.nonreimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT; + + const goBack = useCallback(() => { + return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); + }, [backTo, shouldGoBackToSpecificRoute]); const {subsidiaryList, receivableList, taxAccountsList, items} = policy?.connections?.netsuite?.options?.data ?? {}; const selectedSubsidiary = useMemo(() => (subsidiaryList ?? []).find((subsidiary) => subsidiary.internalID === config?.subsidiaryID), [subsidiaryList, config?.subsidiaryID]); @@ -209,7 +213,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title="workspace.netsuite.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} - onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} + onBackButtonPress={goBack} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx index 074934a1ebf2..493de1b32ec1 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import Accordion from '@components/Accordion'; import ConnectionLayout from '@components/ConnectionLayout'; @@ -11,6 +12,8 @@ import {getQBDNonReimbursableExportAccountType} from '@libs/ConnectionUtils'; import {getLatestErrorField} from '@libs/ErrorUtils'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import {getQBDReimbursableAccounts} from '@pages/workspace/accounting/utils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; @@ -18,6 +21,7 @@ import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOpt import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); @@ -28,6 +32,8 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn const nonReimbursableBillDefaultVendorObject = vendors?.find((vendor) => vendor.id === qbdConfig?.export?.nonReimbursableBillDefaultVendor); const nonReimbursable = qbdConfig?.export?.nonReimbursable; const nonReimbursableAccount = qbdConfig?.export?.nonReimbursableAccount; + const route = useRoute>(); + const backTo = route.params?.backTo; const accountName = useMemo(() => { const qbdReimbursableAccounts = getQBDReimbursableAccounts(policy?.connections?.quickbooksDesktop, nonReimbursable); @@ -42,7 +48,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn { title: nonReimbursable ? translate(`workspace.qbd.accounts.${nonReimbursable}`) : undefined, description: translate('workspace.accounting.exportAs'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_SELECT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_SELECT.getRoute(policyID, Navigation.getActiveRoute())), hintText: nonReimbursable ? translate(`workspace.qbd.accounts.${nonReimbursable}Description`) : undefined, subscribedSettings: [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE], keyForList: translate('workspace.accounting.exportAs'), @@ -50,7 +56,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn { title: accountName, description: getQBDNonReimbursableExportAccountType(nonReimbursable), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT.getRoute(policyID, Navigation.getActiveRoute())), subscribedSettings: [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT], keyForList: getQBDNonReimbursableExportAccountType(nonReimbursable), }, @@ -67,7 +73,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn contentContainerStyle={styles.pb2} titleStyle={styles.ph5} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID))} + onBackButtonPress={() => Navigation.goBack(backTo ?? ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID))} > {sections.map((section) => ( updateQuickbooksDesktopShouldAutoCreateVendor(policyID, isOn)} - onCloseError={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR)} + onToggle={(isOn) => { + if (!policyID) { + return; + } + updateQuickbooksDesktopShouldAutoCreateVendor(policyID, isOn); + }} + onCloseError={() => { + if (!policyID) { + return; + } + clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR); + }} /> >(); + const backTo = route.params?.backTo; const sections = useMemo(() => { const options: MenuItem[] = [ @@ -62,14 +68,19 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With return [{data: options}]; }, [translate, nonReimbursable, creditCardAccounts, bankAccounts, payableAccounts, vendors]); + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? (policyID && ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID))); + }, [backTo, policyID]); + const selectExportCompanyCard = useCallback( (row: MenuItem) => { - if (row.value !== nonReimbursable) { - QuickbooksDesktop.updateQuickbooksCompanyCardExpenseAccount( + const account = row.accounts.at(0)?.id; + if (row.value !== nonReimbursable && policyID) { + updateQuickbooksCompanyCardExpenseAccount( policyID, { [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE]: row.value, - [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT]: row.accounts.at(0)?.id ?? '', + [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT]: account, [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_BILL_DEFAULT_VENDOR]: row.defaultVendor, }, { @@ -79,9 +90,9 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With }, ); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID)); + goBack(); }, - [nonReimbursable, nonReimbursableAccount, nonReimbursableBillDefaultVendor, policyID], + [nonReimbursable, nonReimbursableAccount, nonReimbursableBillDefaultVendor, policyID, goBack], ); return ( mode.isSelected)?.keyForList} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID))} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE)} + onBackButtonPress={goBack} + errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE)} errorRowStyles={[styles.ph5, styles.pv3]} - pendingAction={PolicyUtils.settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE], qbdConfig?.pendingFields)} + pendingAction={settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE], qbdConfig?.pendingFields)} onClose={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE)} /> ); diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx index c184f13f08c0..c6b85f51384d 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import BlockingView from '@components/BlockingViews/BlockingView'; import * as Illustrations from '@components/Icon/Illustrations'; @@ -7,11 +8,13 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop'; -import * as ConnectionUtils from '@libs/ConnectionUtils'; -import * as ErrorUtils from '@libs/ErrorUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {updateQuickbooksDesktopNonReimbursableExpensesAccount} from '@libs/actions/connections/QuickbooksDesktop'; +import {getQBDNonReimbursableExportAccountType} from '@libs/ConnectionUtils'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import {getQBDReimbursableAccounts} from '@pages/workspace/accounting/utils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; @@ -19,6 +22,7 @@ import variables from '@styles/variables'; import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {Account} from '@src/types/onyx/Policy'; type CardListItem = ListItem & { @@ -28,10 +32,12 @@ type CardListItem = ListItem & { function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const nonReimbursable = qbdConfig?.export?.nonReimbursable; const nonReimbursableAccount = qbdConfig?.export?.nonReimbursableAccount; + const route = useRoute>(); + const backTo = route.params?.backTo; const data: CardListItem[] = useMemo(() => { const accounts = getQBDReimbursableAccounts(policy?.connections?.quickbooksDesktop, nonReimbursable); @@ -45,14 +51,18 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPoli })); }, [policy?.connections?.quickbooksDesktop, nonReimbursable, nonReimbursableAccount]); + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? (policyID && ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID))); + }, [policyID, backTo]); + const selectExportAccount = useCallback( (row: CardListItem) => { - if (row.value.id !== nonReimbursableAccount) { - QuickbooksDesktop.updateQuickbooksDesktopNonReimbursableExpensesAccount(policyID, row.value.id, nonReimbursableAccount); + if (row.value.id !== nonReimbursableAccount && policyID) { + updateQuickbooksDesktopNonReimbursableExpensesAccount(policyID, row.value.id, nonReimbursableAccount); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID)); + goBack(); }, - [nonReimbursableAccount, policyID], + [nonReimbursableAccount, policyID, goBack], ); const listEmptyContent = useMemo( @@ -74,7 +84,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPoli accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.CONTROL]} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} displayName={QuickbooksDesktopCompanyCardExpenseAccountSelectPage.displayName} - headerTitleAlreadyTranslated={ConnectionUtils.getQBDNonReimbursableExportAccountType(nonReimbursable)} + headerTitleAlreadyTranslated={getQBDNonReimbursableExportAccountType(nonReimbursable)} headerContent={nonReimbursable ? {translate(`workspace.qbd.accounts.${nonReimbursable}AccountDescription`)} : null} sections={data.length ? [{data}] : []} listItem={RadioListItem} @@ -83,10 +93,10 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPoli initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} listEmptyContent={listEmptyContent} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID))} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT)} + onBackButtonPress={goBack} + errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT)} errorRowStyles={[styles.ph5, styles.pv3]} - pendingAction={PolicyUtils.settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} + pendingAction={settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} onClose={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT)} /> ); diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportDateSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportDateSelectPage.tsx index d6a02c8287d2..20104fa61613 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportDateSelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportDateSelectPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import type {ValueOf} from 'type-fest'; import RadioListItem from '@components/SelectionList/RadioListItem'; @@ -10,11 +11,14 @@ import {updateQuickbooksDesktopExportDate} from '@libs/actions/connections/Quick import {getLatestErrorField} from '@libs/ErrorUtils'; import {settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; type CardListItem = ListItem & { value: ValueOf; @@ -25,6 +29,8 @@ function QuickbooksDesktopExportDateSelectPage({policy}: WithPolicyConnectionsPr const policyID = policy?.id; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const exportDate = qbdConfig?.export?.exportDate; + const route = useRoute>(); + const backTo = route.params.backTo; const data: CardListItem[] = useMemo( () => @@ -38,6 +44,10 @@ function QuickbooksDesktopExportDateSelectPage({policy}: WithPolicyConnectionsPr [exportDate, translate], ); + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); + }, [policyID, backTo]); + const selectExportDate = useCallback( (row: CardListItem) => { if (!policyID) { @@ -46,9 +56,9 @@ function QuickbooksDesktopExportDateSelectPage({policy}: WithPolicyConnectionsPr if (row.value !== exportDate) { updateQuickbooksDesktopExportDate(policyID, row.value, exportDate); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); + goBack(); }, - [policyID, exportDate], + [policyID, exportDate, goBack], ); return ( @@ -60,12 +70,7 @@ function QuickbooksDesktopExportDateSelectPage({policy}: WithPolicyConnectionsPr sections={[{data}]} listItem={RadioListItem} headerContent={{translate('workspace.qbd.exportDate.description')}} - onBackButtonPress={() => { - if (!policyID) { - return; - } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); - }} + onBackButtonPress={goBack} onSelectRow={selectExportDate} initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} title="workspace.qbd.exportDate.label" diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index ff8547952155..0424150b9d77 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -1,4 +1,5 @@ -import React, {useMemo} from 'react'; +import {useRoute} from '@react-navigation/native'; +import React, {useCallback, useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -6,31 +7,46 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; -import * as Link from '@userActions/Link'; +import {openExternalLink} from '@userActions/Link'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; const policyOwner = policy?.owner ?? ''; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const errorFields = qbdConfig?.errorFields; + const route = useRoute>(); + const backTo = route?.params?.backTo; const shouldShowVendorMenuItems = useMemo( () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL, [qbdConfig?.export?.nonReimbursable], ); + const shouldGoBackToSpecificRoute = useMemo( + () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CHECK, + [qbdConfig?.export?.nonReimbursable], + ); + + const goBack = useCallback(() => { + return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); + }, [backTo, shouldGoBackToSpecificRoute]); + const menuItems = [ { description: translate('workspace.accounting.preferredExporter'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_PREFERRED_EXPORTER.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_PREFERRED_EXPORTER.getRoute(policyID, Navigation.getActiveRoute())), // We use the logical OR (||) here instead of ?? because `exporter` could be an empty string // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing title: qbdConfig?.export?.exporter || policyOwner, @@ -38,13 +54,13 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { }, { description: translate('workspace.qbd.date'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT.getRoute(policyID, Navigation.getActiveRoute())), title: qbdConfig?.export?.exportDate ? translate(`workspace.qbd.exportDate.values.${qbdConfig?.export.exportDate}.label`) : undefined, subscribedSettings: [CONST.QUICKBOOKS_DESKTOP_CONFIG.EXPORT_DATE], }, { description: translate('workspace.accounting.exportOutOfPocket'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID, Navigation.getActiveRoute())), title: qbdConfig?.export.reimbursable ? translate(`workspace.qbd.accounts.${qbdConfig?.export.reimbursable}`) : undefined, subscribedSettings: [ CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE, @@ -54,7 +70,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { }, { description: translate('workspace.accounting.exportCompanyCard'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID, Navigation.getActiveRoute())), brickRoadIndicator: qbdConfig?.errorFields?.exportCompanyCard ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, title: qbdConfig?.export?.nonReimbursable ? translate(`workspace.qbd.accounts.${qbdConfig?.export?.nonReimbursable}`) : undefined, subscribedSettings: [ @@ -83,12 +99,12 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { contentContainerStyle={styles.pb2} titleStyle={styles.ph5} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack()} + onBackButtonPress={goBack} > {menuItems.map((menuItem) => ( ))} {translate('workspace.qbd.deepDiveExpensifyCard')} Link.openExternalLink(CONST.DEEP_DIVE_EXPENSIFY_CARD)} + onPress={() => openExternalLink(CONST.DEEP_DIVE_EXPENSIFY_CARD)} style={[styles.mutedNormalTextLabel, styles.link]} > {` ${translate('workspace.qbd.deepDiveExpensifyCardIntegration')}`} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx index 936ce29fe2a1..f1508836ffee 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import BlockingView from '@components/BlockingViews/BlockingView'; import * as Illustrations from '@components/Icon/Illustrations'; @@ -7,10 +8,12 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop'; -import * as ErrorUtils from '@libs/ErrorUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {updateQuickbooksDesktopReimbursableExpensesAccount} from '@libs/actions/connections/QuickbooksDesktop'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import {getQBDReimbursableAccounts} from '@pages/workspace/accounting/utils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; @@ -19,6 +22,7 @@ import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {Account} from '@src/types/onyx/Policy'; type CardListItem = ListItem & { @@ -28,6 +32,8 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli const {translate} = useLocalize(); const styles = useThemeStyles(); const qbdConfig = policy?.connections?.quickbooksDesktop?.config; + const route = useRoute>(); + const backTo = route.params?.backTo; const [title, description] = useMemo(() => { let titleText: TranslationPaths | undefined; @@ -64,16 +70,20 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli })); }, [policy?.connections?.quickbooksDesktop, qbdConfig?.export?.reimbursableAccount]); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; + + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? (policyID && ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID))); + }, [policyID, backTo]); const selectExportAccount = useCallback( (row: CardListItem) => { - if (row.value.id !== qbdConfig?.export?.reimbursableAccount) { - QuickbooksDesktop.updateQuickbooksDesktopReimbursableExpensesAccount(policyID, row.value.id, qbdConfig?.export?.reimbursableAccount); + if (row.value.id !== qbdConfig?.export?.reimbursableAccount && policyID) { + updateQuickbooksDesktopReimbursableExpensesAccount(policyID, row.value.id, qbdConfig?.export?.reimbursableAccount); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID)); + goBack(); }, - [qbdConfig?.export?.reimbursableAccount, policyID], + [qbdConfig?.export?.reimbursableAccount, policyID, goBack], ); const listEmptyContent = useMemo( @@ -99,13 +109,13 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli sections={data.length ? [{data}] : []} listItem={RadioListItem} headerContent={{description}} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID))} + onBackButtonPress={goBack} onSelectRow={selectExportAccount} initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} title={title} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - pendingAction={PolicyUtils.settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT)} + pendingAction={settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} + errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT)} errorRowStyles={[styles.ph5, styles.pv3]} onClose={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT)} listEmptyContent={listEmptyContent} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx index 1c0372aa8715..e2d43f414eb5 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import type {ValueOf} from 'type-fest'; import ConnectionLayout from '@components/ConnectionLayout'; @@ -5,11 +6,12 @@ import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop'; -import * as ErrorUtils from '@libs/ErrorUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import {settingsPendingAction} from '@libs/PolicyUtils'; +import {updateQuickbooksDesktopMarkChecksToBePrinted} from '@libs/actions/connections/QuickbooksDesktop'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import {getQBDReimbursableAccounts} from '@pages/workspace/accounting/utils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; @@ -17,6 +19,7 @@ import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOpt import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {PendingAction} from '@src/types/onyx/OnyxCommon'; type QBDSectionType = { @@ -36,9 +39,12 @@ const markChecksToBePrintedOrExportDestination = [CONST.QUICKBOOKS_DESKTOP_CONFI function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const reimbursable = qbdConfig?.export.reimbursable; + const route = useRoute>(); + const backTo = route.params?.backTo; + const [exportHintText, accountDescription, accountsList] = useMemo(() => { let hintText: string | undefined; let description: string | undefined; @@ -67,21 +73,21 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli { title: reimbursable ? translate(`workspace.qbd.accounts.${reimbursable}`) : undefined, description: translate('workspace.accounting.exportAs'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT.getRoute(policyID, Navigation.getActiveRoute())), hintText: exportHintText, subscribedSettings: accountOrExportDestination, - pendingAction: PolicyUtils.settingsPendingAction(accountOrExportDestination, qbdConfig?.pendingFields), - brickRoadIndicator: PolicyUtils.areSettingsInErrorFields(accountOrExportDestination, qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, + pendingAction: settingsPendingAction(accountOrExportDestination, qbdConfig?.pendingFields), + brickRoadIndicator: areSettingsInErrorFields(accountOrExportDestination, qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, { // We use the logical OR (||) here instead of ?? because `reimbursableAccount` can be an empty string // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing title: accountsList.find(({id}) => qbdConfig?.export.reimbursableAccount === id)?.name || accountsList.at(0)?.name || translate('workspace.qbd.notConfigured'), description: accountDescription, - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT.getRoute(policyID)), + onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT.getRoute(policyID, Navigation.getActiveRoute())), subscribedSettings: account, - pendingAction: PolicyUtils.settingsPendingAction(account, qbdConfig?.pendingFields), - brickRoadIndicator: PolicyUtils.areSettingsInErrorFields(account, qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, + pendingAction: settingsPendingAction(account, qbdConfig?.pendingFields), + brickRoadIndicator: areSettingsInErrorFields(account, qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, ]; @@ -96,7 +102,7 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli contentContainerStyle={styles.pb2} titleStyle={styles.ph5} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID))} + onBackButtonPress={() => Navigation.goBack(backTo ?? ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID))} > {sections.map((section, index) => ( QuickbooksDesktop.updateQuickbooksDesktopMarkChecksToBePrinted(policyID, !qbdConfig?.markChecksToBePrinted)} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.MARK_CHECKS_TO_BE_PRINTED)} + onToggle={() => { + if (!policyID) { + return; + } + updateQuickbooksDesktopMarkChecksToBePrinted(policyID, !qbdConfig?.markChecksToBePrinted); + }} + errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.MARK_CHECKS_TO_BE_PRINTED)} pendingAction={settingsPendingAction(markChecksToBePrintedOrExportDestination, qbdConfig?.pendingFields)} - onCloseError={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.MARK_CHECKS_TO_BE_PRINTED)} + onCloseError={() => { + if (!policyID) { + return; + } + clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.MARK_CHECKS_TO_BE_PRINTED); + }} /> )} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx index 930d26f0a796..a0f2cc87f3ce 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import RadioListItem from '@components/SelectionList/RadioListItem'; import type {ListItem} from '@components/SelectionList/types'; @@ -5,16 +6,19 @@ import SelectionScreen from '@components/SelectionScreen'; import type {SelectorType} from '@components/SelectionScreen'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop'; -import * as ErrorUtils from '@libs/ErrorUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {updateQuickbooksDesktopExpensesExportDestination} from '@libs/actions/connections/QuickbooksDesktop'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import {getQBDReimbursableAccounts} from '@pages/workspace/accounting/utils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type {Account, QBDReimbursableExportAccountType} from '@src/types/onyx/Policy'; type MenuItem = ListItem & { @@ -28,7 +32,13 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const reimbursable = qbdConfig?.export.reimbursable; const hasErrors = !!qbdConfig?.errorFields?.reimbursable; - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; + const route = useRoute>(); + const backTo = route.params?.backTo; + + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? (policyID && ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID))); + }, [policyID, backTo]); const data: MenuItem[] = useMemo( () => [ @@ -64,12 +74,13 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const selectExportEntity = useCallback( (row: MenuItem) => { - if (row.value !== reimbursable) { - QuickbooksDesktop.updateQuickbooksDesktopExpensesExportDestination( + const account = row?.accounts?.at(0)?.id; + if (row.value !== reimbursable && policyID) { + updateQuickbooksDesktopExpensesExportDestination( policyID, { [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: row.value, - [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: row.accounts.at(0)?.id ?? '', + [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: account, }, { [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: reimbursable, @@ -77,9 +88,9 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic }, ); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID)); + goBack(); }, - [reimbursable, policyID, qbdConfig?.export?.reimbursableAccount], + [reimbursable, policyID, qbdConfig?.export?.reimbursableAccount, goBack], ); return ( @@ -90,19 +101,19 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic displayName={QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.displayName} sections={sections} listItem={RadioListItem} - onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID))} + onBackButtonPress={goBack} onSelectRow={(selection: SelectorType) => selectExportEntity(selection as MenuItem)} shouldSingleExecuteRowSelect initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} title="workspace.accounting.exportAs" connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - pendingAction={PolicyUtils.settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} + pendingAction={settingsPendingAction([CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT], qbdConfig?.pendingFields)} errors={ hasErrors && reimbursable ? { [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: translate(`workspace.qbd.accounts.${reimbursable}Error`), } - : ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE) + : getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE) } errorRowStyles={[styles.ph5, styles.pv3]} onClose={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE)} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopPreferredExporterConfigurationPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopPreferredExporterConfigurationPage.tsx index 68332977c3f4..2d699085a36e 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopPreferredExporterConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopPreferredExporterConfigurationPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; import RadioListItem from '@components/SelectionList/RadioListItem'; import type {ListItem} from '@components/SelectionList/types'; @@ -10,11 +11,14 @@ import {updateQuickbooksDesktopPreferredExporter} from '@libs/actions/connection import {getLatestErrorField} from '@libs/ErrorUtils'; import {getAdminEmployees, isExpensifyTeam, settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import {clearQBDErrorField} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; type CardListItem = ListItem & { value: string; @@ -27,8 +31,15 @@ function QuickbooksDesktopPreferredExporterConfigurationPage({policy}: WithPolic const exporters = getAdminEmployees(policy); const {login: currentUserLogin} = useCurrentUserPersonalDetails(); const currentExporter = qbdConfig?.export?.exporter; + const route = useRoute>(); + const backTo = route.params?.backTo; const policyID = policy?.id; + + const goBack = useCallback(() => { + Navigation.goBack(backTo ?? ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); + }, [policyID, backTo]); + const data: CardListItem[] = useMemo( () => exporters?.reduce((options, exporter) => { @@ -61,9 +72,9 @@ function QuickbooksDesktopPreferredExporterConfigurationPage({policy}: WithPolic if (row.value !== currentExporter) { updateQuickbooksDesktopPreferredExporter(policyID, row.value, currentExporter); } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); + goBack(); }, - [currentExporter, policyID], + [currentExporter, goBack, policyID], ); const headerContent = useMemo( @@ -85,12 +96,7 @@ function QuickbooksDesktopPreferredExporterConfigurationPage({policy}: WithPolic sections={[{data}]} listItem={RadioListItem} headerContent={headerContent} - onBackButtonPress={() => { - if (!policyID) { - return; - } - Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID)); - }} + onBackButtonPress={goBack} onSelectRow={selectExporter} shouldSingleExecuteRowSelect initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} diff --git a/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx b/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx index eeabcbc74a6c..9a3a26db7f8a 100644 --- a/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx @@ -1,5 +1,5 @@ import {useRoute} from '@react-navigation/native'; -import React, {useMemo} from 'react'; +import React, {useCallback, useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -9,6 +9,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {shouldShowQBOReimbursableExportDestinationAccountError} from '@libs/actions/connections/QuickbooksOnline'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -33,7 +34,10 @@ function QuickbooksExportConfigurationPage({policy}: WithPolicyConnectionsProps) () => qboConfig?.nonReimbursableExpensesExportDestination === CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL, [qboConfig?.nonReimbursableExpensesExportDestination], ); - const shouldGoBackToSpecificRoute = shouldShowVendorMenuItems && backTo; + + const goBack = useCallback(() => { + return goBackFromExportConnection(shouldShowVendorMenuItems, backTo); + }, [backTo, shouldShowVendorMenuItems]); const menuItems = [ { @@ -91,7 +95,7 @@ function QuickbooksExportConfigurationPage({policy}: WithPolicyConnectionsProps) title="workspace.qbo.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} - onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} + onBackButtonPress={goBack} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx b/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx index 8bf7c2ff9ff3..62c77689b2cc 100644 --- a/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx @@ -1,5 +1,5 @@ import {useRoute} from '@react-navigation/native'; -import React, {useMemo} from 'react'; +import React, {useCallback, useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -7,6 +7,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {areSettingsInErrorFields, getCurrentXeroOrganizationName, settingsPendingAction} from '@libs/PolicyUtils'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; @@ -24,7 +25,11 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const policyOwner = policy?.owner ?? ''; const {export: exportConfiguration, errorFields, pendingFields} = policy?.connections?.xero?.config ?? {}; - const shouldGoBackToSpecificRoute = !exportConfiguration?.nonReimbursableAccount && backTo; + const shouldGoBackToSpecificRoute = !exportConfiguration?.nonReimbursableAccount; + + const goBack = useCallback(() => { + return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); + }, [backTo, shouldGoBackToSpecificRoute]); const {bankAccounts} = policy?.connections?.xero?.data ?? {}; const selectedBankAccountName = useMemo(() => { @@ -94,7 +99,7 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title="workspace.xero.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} - onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} + onBackButtonPress={goBack} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index 99e4ff731271..5d72941f9b14 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -42,6 +42,8 @@ function getExportMenuItem( const config = policy?.connections?.netsuite?.options.config; const {bankAccounts} = policy?.connections?.xero?.data ?? {}; const {creditCards, bankAccounts: quickbooksOnlineBankAccounts} = policy?.connections?.quickbooksOnline?.data ?? {}; + const {creditCardAccounts} = policy?.connections?.quickbooksDesktop?.data ?? {}; + const {export: exportQBD} = policy?.connections?.quickbooksDesktop?.config ?? {}; switch (connectionName) { case CONST.POLICY.CONNECTIONS.NAME.QBO: { @@ -293,6 +295,58 @@ function getExportMenuItem( data, }; } + case CONST.POLICY.CONNECTIONS.NAME.QBD: { + const nonReimbursableExpenses = exportQBD?.nonReimbursable; + const reimbursableExpenses = exportQBD?.reimbursable; + const typeNonReimbursable = nonReimbursableExpenses ? translate(`workspace.qbd.accounts.${nonReimbursableExpenses}`) : undefined; + const typeReimbursable = reimbursableExpenses ? translate(`workspace.qbd.accounts.${reimbursableExpenses}`) : undefined; + const type = typeNonReimbursable ?? typeReimbursable; + const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', {integration: currentConnectionName, type}) : undefined; + let data: Account[]; + let shouldShowMenuItem = nonReimbursableExpenses !== CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CHECK; + let title: string | undefined = ''; + let selectedAccount: string | undefined = ''; + const defaultAccount = exportQBD?.nonReimbursableAccount ?? exportQBD?.reimbursableAccount; + let isDefaultTitle = false; + let exportType: ValueOf | undefined; + const qbdConfig = nonReimbursableExpenses ?? reimbursableExpenses; + switch (qbdConfig) { + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.JOURNAL_ENTRY: + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK: + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.VENDOR_BILL: + case CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD: { + data = creditCardAccounts ?? []; + isDefaultTitle = !!( + companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || + (defaultAccount && !companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit) + ); + title = isDefaultTitle ? defaultCard : companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit; + selectedAccount = companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit ?? defaultAccount; + exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_QUICKBOOKS_DESKTOP_EXPORT_ACCOUNT_CREDIT; + break; + } + default: + shouldShowMenuItem = false; + data = []; + } + + const resultData = data.length > 0 ? [defaultMenuItem, ...data] : data; + + return { + description, + title, + exportType, + shouldShowMenuItem, + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT.getRoute(policyID, backTo)), + data: resultData.map((card) => ({ + value: card.name, + text: card.name, + keyForList: card.name, + isSelected: isDefaultTitle ? card.name === defaultCard : card.name === selectedAccount, + })), + }; + } + default: return undefined; }