From 913403c4b746fd11b201aede4dd7c47e1f592e27 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 11 Apr 2025 16:23:17 +0300 Subject: [PATCH 01/16] Add QBD to company card export --- src/ROUTES.ts | 12 +++- src/libs/Navigation/types.ts | 3 + ...ksDesktopCompanyCardExpenseAccountPage.tsx | 8 ++- .../export/QuickbooksDesktopExportPage.tsx | 19 +++++-- ...ktopPreferredExporterConfigurationPage.tsx | 22 +++++--- src/pages/workspace/companyCards/utils.tsx | 55 +++++++++++++++++++ 6 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 203abf7cb0a8..bd694b74c95b 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1045,7 +1045,8 @@ 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) => + 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', @@ -1057,7 +1058,7 @@ const ROUTES = { }, 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) => 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', @@ -1073,7 +1074,12 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export` as const, + getRoute: (policyID: string | undefined, backTo?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT route'); + } + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export` as const, backTo, false); + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_SETUP_MODAL: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/setup-modal', diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 8a4cdc29ed31..a5230ac45569 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -462,6 +462,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_ADVANCED]: { policyID: string; @@ -471,6 +472,7 @@ type SettingsNavigatorParamList = { }; [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; @@ -483,6 +485,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_SETUP_MODAL]: { policyID: string; diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx index 75ad8a86eff5..153b5e4f127c 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 * as ConnectionUtils from '@libs/ConnectionUtils'; import * as ErrorUtils from '@libs/ErrorUtils'; import * as PolicyUtils 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); @@ -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) => ( >(); + 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 = shouldShowVendorMenuItems && backTo; + const activeRoute = Navigation.getActiveRoute(); + 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, activeRoute)), // 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 +47,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, activeRoute)), 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, activeRoute)), title: qbdConfig?.export.reimbursable ? translate(`workspace.qbd.accounts.${qbdConfig?.export.reimbursable}`) : undefined, subscribedSettings: [ CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE, @@ -54,7 +63,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, activeRoute)), 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,7 +92,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { contentContainerStyle={styles.pb2} titleStyle={styles.ph5} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={() => Navigation.goBack()} + onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} > {menuItems.map((menuItem) => ( >(); + 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/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index 99e4ff731271..b065f90c5e46 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,59 @@ 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 qboConfig = nonReimbursableExpenses ?? reimbursableExpenses; + switch (qboConfig) { + 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 = !!( + defaultAccount && + (!companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit || + companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) + ); + 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; } From 9a26ace623e3348d2b4ddfbd6ac221faa36221da Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 11 Apr 2025 16:26:28 +0300 Subject: [PATCH 02/16] naming --- src/pages/workspace/companyCards/utils.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index b065f90c5e46..1934d77ba879 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -309,8 +309,8 @@ function getExportMenuItem( const defaultAccount = exportQBD?.nonReimbursableAccount ?? exportQBD?.reimbursableAccount; let isDefaultTitle = false; let exportType: ValueOf | undefined; - const qboConfig = nonReimbursableExpenses ?? reimbursableExpenses; - switch (qboConfig) { + 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: From b7b6faa97dfa1f069cdd75054d3d3cef1b42c072 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 14 Apr 2025 11:40:48 +0300 Subject: [PATCH 03/16] add more backTo routes --- src/ROUTES.ts | 4 ++-- src/libs/Navigation/types.ts | 2 ++ .../QuickbooksDesktopExportDateSelectPage.tsx | 21 ++++++++++++------- ...topOutOfPocketExpenseConfigurationPage.tsx | 9 +++++++- ...ktopPreferredExporterConfigurationPage.tsx | 6 +++--- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index bd694b74c95b..fd2db1f95844 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1054,7 +1054,7 @@ 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) => 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', @@ -1062,7 +1062,7 @@ const ROUTES = { }, 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) => 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', diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index a5230ac45569..674527151fa2 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -469,6 +469,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_PREFERRED_EXPORTER]: { policyID: string; @@ -479,6 +480,7 @@ type SettingsNavigatorParamList = { }; [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; 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/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx index 1c0372aa8715..127d17083a60 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'; @@ -10,6 +11,8 @@ import * as ErrorUtils from '@libs/ErrorUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; 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'; @@ -17,6 +20,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 = { @@ -39,6 +43,9 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli const policyID = policy?.id ?? '-1'; 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; @@ -96,7 +103,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) => ( Date: Mon, 14 Apr 2025 14:00:26 +0300 Subject: [PATCH 04/16] lint --- ...ksDesktopCompanyCardExpenseAccountPage.tsx | 26 +++++++++---------- .../export/QuickbooksDesktopExportPage.tsx | 6 ++--- ...topOutOfPocketExpenseConfigurationPage.tsx | 19 +++++++------- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx index 153b5e4f127c..500c65c718a9 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx @@ -7,10 +7,10 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback'; import useAccordionAnimation from '@hooks/useAccordionAnimation'; 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 {updateQuickbooksDesktopShouldAutoCreateVendor} from '@libs/actions/connections/QuickbooksDesktop'; +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'; @@ -55,10 +55,10 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn }, { title: accountName, - description: ConnectionUtils.getQBDNonReimbursableExportAccountType(nonReimbursable), + description: getQBDNonReimbursableExportAccountType(nonReimbursable), onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT.getRoute(policyID)), subscribedSettings: [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_ACCOUNT], - keyForList: ConnectionUtils.getQBDNonReimbursableExportAccountType(nonReimbursable), + keyForList: getQBDNonReimbursableExportAccountType(nonReimbursable), }, ]; @@ -78,13 +78,13 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn {sections.map((section) => ( @@ -98,12 +98,12 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn switchAccessibilityLabel={translate('workspace.qbd.defaultVendorDescription')} wrapperStyle={[styles.ph5, styles.mb3, styles.mt1]} isActive={!!qbdConfig?.shouldAutoCreateVendor} - pendingAction={PolicyUtils.settingsPendingAction( + pendingAction={settingsPendingAction( [CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR, CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE], qbdConfig?.pendingFields, )} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR)} - onToggle={(isOn) => QuickbooksDesktop.updateQuickbooksDesktopShouldAutoCreateVendor(policyID, isOn)} + errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR)} + onToggle={(isOn) => updateQuickbooksDesktopShouldAutoCreateVendor(policyID, isOn)} onCloseError={() => clearQBDErrorField(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR)} /> @@ -112,7 +112,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn isToggleTriggered={shouldAnimateAccordionSection} > Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT.getRoute(policyID))} brickRoadIndicator={ - PolicyUtils.areSettingsInErrorFields([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_BILL_DEFAULT_VENDOR], qbdConfig?.errorFields) + areSettingsInErrorFields([CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE_BILL_DEFAULT_VENDOR], qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined } diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index fe6c1d19f83f..7153cf1f0cc2 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -7,7 +7,7 @@ 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 Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -97,7 +97,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { {menuItems.map((menuItem) => ( ))} diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx index 127d17083a60..d99e06420d72 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx @@ -6,10 +6,9 @@ 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 {settingsPendingAction, areSettingsInErrorFields} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -77,8 +76,8 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT.getRoute(policyID)), 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 @@ -87,8 +86,8 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli description: accountDescription, onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT.getRoute(policyID)), 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, }, ]; @@ -129,8 +128,8 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli shouldPlaceSubtitleBelowSwitch wrapperStyle={[styles.mv3, styles.ph5]} isActive={!!qbdConfig?.markChecksToBePrinted} - onToggle={() => QuickbooksDesktop.updateQuickbooksDesktopMarkChecksToBePrinted(policyID, !qbdConfig?.markChecksToBePrinted)} - errors={ErrorUtils.getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.MARK_CHECKS_TO_BE_PRINTED)} + onToggle={() => 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)} /> From 280460b849f3b14168d2a58305d325eba1ef9e43 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 14 Apr 2025 15:29:24 +0300 Subject: [PATCH 05/16] checks --- .../accounting/qbd/export/QuickbooksDesktopExportPage.tsx | 4 ++-- .../QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index 7153cf1f0cc2..33ebc5385bac 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -13,7 +13,7 @@ import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/t 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'; @@ -112,7 +112,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { {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/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx index d99e06420d72..ccb71b2861e4 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx @@ -8,7 +8,7 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {updateQuickbooksDesktopMarkChecksToBePrinted} from '@libs/actions/connections/QuickbooksDesktop'; import {getLatestErrorField} from '@libs/ErrorUtils'; -import {settingsPendingAction, areSettingsInErrorFields} from '@libs/PolicyUtils'; +import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; From bf47d24bfffcd84776bcdb66859b6946efe9f9c9 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 14 Apr 2025 16:33:36 +0300 Subject: [PATCH 06/16] esling rules --- src/ROUTES.ts | 64 ++++++++++++++++--- ...ksDesktopCompanyCardExpenseAccountPage.tsx | 16 ++++- .../export/QuickbooksDesktopExportPage.tsx | 2 +- ...topOutOfPocketExpenseConfigurationPage.tsx | 16 ++++- 4 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index fd2db1f95844..d2fb066bb90d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1033,20 +1033,39 @@ 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) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/account-select` as const, + getRoute: (policyID?: 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; + }, }, 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) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/card-select` as const, + getRoute: (policyID?: 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; + }, }, 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) => `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/default-vendor-select` as const, + getRoute: (policyID?: string) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_DEFAULT_VENDOR_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account/default-vendor-select` as const; + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account', - getRoute: (policyID: string, backTo?: string) => - getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/company-card-expense-account` as const, backTo), + 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/company-card-expense-account` as const, backTo); + }, }, WORKSPACE_ACCOUNTING_QUICKBOOKS_DESKTOP_ADVANCED: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/advanced', @@ -1054,23 +1073,48 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/date-select', - getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/date-select` as const, backTo), + 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, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/preferred-exporter` as const, backTo), + 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, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense` as const, backTo), + 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` 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) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/account-select` as const; + }, }, 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) => { + if (!policyID) { + Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT route'); + } + return `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select` as const; + }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export', diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx index 500c65c718a9..4e20e51ef7a3 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx @@ -26,7 +26,7 @@ import type SCREENS from '@src/SCREENS'; function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const {vendors} = policy?.connections?.quickbooksDesktop?.data ?? {}; const nonReimbursableBillDefaultVendorObject = vendors?.find((vendor) => vendor.id === qbdConfig?.export?.nonReimbursableBillDefaultVendor); @@ -103,8 +103,18 @@ function QuickbooksDesktopCompanyCardExpenseAccountPage({policy}: WithPolicyConn qbdConfig?.pendingFields, )} errors={getLatestErrorField(qbdConfig, CONST.QUICKBOOKS_DESKTOP_CONFIG.SHOULD_AUTO_CREATE_VENDOR)} - onToggle={(isOn) => 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); + }} /> >(); @@ -128,10 +128,20 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli shouldPlaceSubtitleBelowSwitch wrapperStyle={[styles.mv3, styles.ph5]} isActive={!!qbdConfig?.markChecksToBePrinted} - onToggle={() => updateQuickbooksDesktopMarkChecksToBePrinted(policyID, !qbdConfig?.markChecksToBePrinted)} + 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); + }} /> )} From 8e3c9d859bbd2a6a5db3b7dd88a41ebc4a4ac30e Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 15 Apr 2025 18:00:17 +0300 Subject: [PATCH 07/16] test with mock data + refactoring --- src/ROUTES.ts | 16 +++++----- src/libs/Navigation/types.ts | 4 +++ ...ksDesktopCompanyCardExpenseAccountPage.tsx | 4 +-- ...ompanyCardExpenseAccountSelectCardPage.tsx | 28 ++++++++++------ ...topCompanyCardExpenseAccountSelectPage.tsx | 32 ++++++++++++------- .../export/QuickbooksDesktopExportPage.tsx | 7 +++- ...topOutOfPocketExpenseAccountSelectPage.tsx | 28 ++++++++++------ ...topOutOfPocketExpenseConfigurationPage.tsx | 4 +-- ...ktopOutOfPocketExpenseEntitySelectPage.tsx | 28 ++++++++++------ src/pages/workspace/companyCards/utils.tsx | 5 ++- 10 files changed, 102 insertions(+), 54 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index d2fb066bb90d..d3f368661953 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1033,20 +1033,20 @@ 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) => { + 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) => { + 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: { @@ -1100,20 +1100,20 @@ const ROUTES = { }, 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) => { + 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 `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/account-select` as const; + 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) => { + 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 `settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select` as const; + return getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select` as const, backTo); }, }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 674527151fa2..f98fe4aa62e2 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -453,9 +453,11 @@ 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; @@ -477,6 +479,7 @@ type SettingsNavigatorParamList = { }; [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; @@ -484,6 +487,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_EXPORT]: { policyID: string; diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx index 4e20e51ef7a3..ed795fa70f9e 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountPage.tsx @@ -48,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'), @@ -56,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), }, diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx index 8b7ea59bac80..4557445f8cd5 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.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,15 +6,18 @@ 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 {updateQuickbooksCompanyCardExpenseAccount} 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 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, QBDNonReimbursableExportAccountType} from '@src/types/onyx/Policy'; type MenuItem = ListItem & { @@ -31,6 +35,8 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With const nonReimbursable = qbdConfig?.export?.nonReimbursable; const nonReimbursableAccount = qbdConfig?.export?.nonReimbursableAccount; const nonReimbursableBillDefaultVendor = qbdConfig?.export?.nonReimbursableBillDefaultVendor; + const route = useRoute>(); + const backTo = route.params?.backTo; const sections = useMemo(() => { const options: MenuItem[] = [ @@ -62,10 +68,14 @@ 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( + updateQuickbooksCompanyCardExpenseAccount( policyID, { [CONST.QUICKBOOKS_DESKTOP_CONFIG.NON_REIMBURSABLE]: row.value, @@ -79,9 +89,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..ce6280979547 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 & { @@ -32,6 +36,8 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPoli 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); + 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/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index 9dd5ba79f6ae..7f794b7c9ef2 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -33,7 +33,12 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { [qbdConfig?.export?.nonReimbursable], ); - const shouldGoBackToSpecificRoute = shouldShowVendorMenuItems && backTo; + const shouldShowCheckMenuItems = useMemo( + () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CHECK, + [qbdConfig?.export?.nonReimbursable], + ); + + const shouldGoBackToSpecificRoute = shouldShowCheckMenuItems && backTo; const activeRoute = Navigation.getActiveRoute(); const menuItems = [ diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx index 936ce29fe2a1..6f46eabbd642 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; @@ -66,14 +72,18 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli const policyID = policy?.id ?? '-1'; + 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); + 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 064ec53eeed9..e2d43f414eb5 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseConfigurationPage.tsx @@ -73,7 +73,7 @@ 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: settingsPendingAction(accountOrExportDestination, qbdConfig?.pendingFields), @@ -84,7 +84,7 @@ function QuickbooksDesktopOutOfPocketExpenseConfigurationPage({policy}: WithPoli // 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: settingsPendingAction(account, qbdConfig?.pendingFields), brickRoadIndicator: areSettingsInErrorFields(account, qbdConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx index 930d26f0a796..83017bbea85c 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 & { @@ -29,6 +33,12 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const reimbursable = qbdConfig?.export.reimbursable; const hasErrors = !!qbdConfig?.errorFields?.reimbursable; const policyID = policy?.id ?? '-1'; + 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( () => [ @@ -65,7 +75,7 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const selectExportEntity = useCallback( (row: MenuItem) => { if (row.value !== reimbursable) { - QuickbooksDesktop.updateQuickbooksDesktopExpensesExportDestination( + updateQuickbooksDesktopExpensesExportDestination( policyID, { [CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: row.value, @@ -77,9 +87,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 +100,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/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index 1934d77ba879..5d72941f9b14 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -317,9 +317,8 @@ function getExportMenuItem( case CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD: { data = creditCardAccounts ?? []; isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit || - companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) + 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; From 54be622bb2665e1868971dea2292d24b95e195a6 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 15 Apr 2025 18:15:29 +0300 Subject: [PATCH 08/16] eslint fixes --- ...ickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx | 4 ++-- .../QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx | 4 ++-- .../QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx | 4 ++-- .../QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx index 4557445f8cd5..f60be4a2b12e 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx @@ -29,7 +29,7 @@ type MenuItem = ListItem & { function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; const qbdConfig = policy?.connections?.quickbooksDesktop?.config; const {creditCardAccounts, payableAccounts, vendors, bankAccounts} = policy?.connections?.quickbooksDesktop?.data ?? {}; const nonReimbursable = qbdConfig?.export?.nonReimbursable; @@ -74,7 +74,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With const selectExportCompanyCard = useCallback( (row: MenuItem) => { - if (row.value !== nonReimbursable) { + if (row.value !== nonReimbursable && policyID) { updateQuickbooksCompanyCardExpenseAccount( policyID, { diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx index ce6280979547..c6b85f51384d 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectPage.tsx @@ -32,7 +32,7 @@ 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; @@ -57,7 +57,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectPage({policy}: WithPoli const selectExportAccount = useCallback( (row: CardListItem) => { - if (row.value.id !== nonReimbursableAccount) { + if (row.value.id !== nonReimbursableAccount && policyID) { updateQuickbooksDesktopNonReimbursableExpensesAccount(policyID, row.value.id, nonReimbursableAccount); } goBack(); diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx index 6f46eabbd642..f1508836ffee 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseAccountSelectPage.tsx @@ -70,7 +70,7 @@ 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))); @@ -78,7 +78,7 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli const selectExportAccount = useCallback( (row: CardListItem) => { - if (row.value.id !== qbdConfig?.export?.reimbursableAccount) { + if (row.value.id !== qbdConfig?.export?.reimbursableAccount && policyID) { updateQuickbooksDesktopReimbursableExpensesAccount(policyID, row.value.id, qbdConfig?.export?.reimbursableAccount); } goBack(); diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx index 83017bbea85c..719e606af14d 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx @@ -32,7 +32,7 @@ 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; @@ -74,7 +74,7 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const selectExportEntity = useCallback( (row: MenuItem) => { - if (row.value !== reimbursable) { + if (row.value !== reimbursable && policyID) { updateQuickbooksDesktopExpensesExportDestination( policyID, { From f15dca24ebab91481b95597ae4e7a156774b300e Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 15 Apr 2025 18:27:33 +0300 Subject: [PATCH 09/16] eslint --- ...ckbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx | 5 +++-- .../QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx index f60be4a2b12e..cbde87510c42 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx @@ -74,12 +74,13 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With const selectExportCompanyCard = useCallback( (row: MenuItem) => { - if (row.value !== nonReimbursable && policyID) { + const account = row.accounts.at(0)?.id; + if (row.value !== nonReimbursable && policyID && account) { 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, }, { diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx index 719e606af14d..9d24494f5949 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx @@ -74,12 +74,13 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic const selectExportEntity = useCallback( (row: MenuItem) => { - if (row.value !== reimbursable && policyID) { + const account = row?.accounts?.at(0)?.id; + if (row.value !== reimbursable && policyID && account) { 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, From 7a89f32c9a4276d58077926bc84728d5bd49a713 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 15 Apr 2025 19:13:05 +0300 Subject: [PATCH 10/16] naming in log warn --- src/ROUTES.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index c7830989d706..d361e9531da9 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1070,7 +1070,7 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account', getRoute: (policyID?: string, backTo?: string) => { if (!policyID) { - Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_DATE_SELECT route'); + 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); }, @@ -1101,7 +1101,7 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense', 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'); + 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); }, @@ -1119,7 +1119,7 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select', 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'); + 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/entity-select` as const, backTo); }, From b6e99f0b93c19598c8010b8623b0a546bb7a5d6d Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 16 Apr 2025 17:03:10 +0300 Subject: [PATCH 11/16] fix going back logic for check --- .../helpers/replaceCompanyCardsRoute.ts | 6 ++++++ .../qbd/export/QuickbooksDesktopExportPage.tsx | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/libs/Navigation/helpers/replaceCompanyCardsRoute.ts 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/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index 7f794b7c9ef2..0864487d0056 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.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'; @@ -8,6 +8,7 @@ import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; +import replaceCompanyCardsRoute from '@navigation/helpers/replaceCompanyCardsRoute'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -27,6 +28,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { const errorFields = qbdConfig?.errorFields; const route = useRoute>(); const backTo = route?.params?.backTo; + const feature = CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards; const shouldShowVendorMenuItems = useMemo( () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL, @@ -38,9 +40,17 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { [qbdConfig?.export?.nonReimbursable], ); - const shouldGoBackToSpecificRoute = shouldShowCheckMenuItems && backTo; const activeRoute = Navigation.getActiveRoute(); + const goBack = useCallback(() => { + if (!(shouldShowCheckMenuItems && backTo?.includes(feature.alias))) { + return Navigation.goBack(); + } + // If user changed nonReimbursable to check - we should move user directly to card detail page instead of moving back to select accounts screen + const companyCardDetailsPage = replaceCompanyCardsRoute(backTo); + return Navigation.goBack(companyCardDetailsPage); + }, [backTo, feature.alias, shouldShowCheckMenuItems]); + const menuItems = [ { description: translate('workspace.accounting.preferredExporter'), @@ -97,7 +107,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { contentContainerStyle={styles.pb2} titleStyle={styles.ph5} connectionName={CONST.POLICY.CONNECTIONS.NAME.QBD} - onBackButtonPress={shouldGoBackToSpecificRoute ? () => Navigation.goBack(backTo) : undefined} + onBackButtonPress={goBack} > {menuItems.map((menuItem) => ( Date: Thu, 17 Apr 2025 15:25:38 +0300 Subject: [PATCH 12/16] and flow to correctly get back to card details flow --- .../helpers/goBackFromExportConnection.ts | 19 +++++++++++++++++++ .../intacct/export/SageIntacctExportPage.tsx | 11 ++++++++--- .../NetSuiteExportConfigurationPage.tsx | 14 +++++++++----- .../export/QuickbooksDesktopExportPage.tsx | 14 ++++---------- .../QuickbooksExportConfigurationPage.tsx | 10 +++++++--- .../export/XeroExportConfigurationPage.tsx | 11 ++++++++--- 6 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 src/libs/Navigation/helpers/goBackFromExportConnection.ts 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/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/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index 0864487d0056..0fb5e30a60ae 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -8,7 +8,7 @@ import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; -import replaceCompanyCardsRoute from '@navigation/helpers/replaceCompanyCardsRoute'; +import goBackFromExportConnection from '@navigation/helpers/goBackFromExportConnection'; import Navigation from '@navigation/Navigation'; import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -28,14 +28,13 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { const errorFields = qbdConfig?.errorFields; const route = useRoute>(); const backTo = route?.params?.backTo; - const feature = CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards; const shouldShowVendorMenuItems = useMemo( () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL, [qbdConfig?.export?.nonReimbursable], ); - const shouldShowCheckMenuItems = useMemo( + const shouldGoBackToSpecificRoute = useMemo( () => qbdConfig?.export?.nonReimbursable === CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CHECK, [qbdConfig?.export?.nonReimbursable], ); @@ -43,13 +42,8 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { const activeRoute = Navigation.getActiveRoute(); const goBack = useCallback(() => { - if (!(shouldShowCheckMenuItems && backTo?.includes(feature.alias))) { - return Navigation.goBack(); - } - // If user changed nonReimbursable to check - we should move user directly to card detail page instead of moving back to select accounts screen - const companyCardDetailsPage = replaceCompanyCardsRoute(backTo); - return Navigation.goBack(companyCardDetailsPage); - }, [backTo, feature.alias, shouldShowCheckMenuItems]); + return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); + }, [backTo, shouldGoBackToSpecificRoute]); const menuItems = [ { 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} From fff40c6a318e04a2af30df94b1f3bf2076c97259 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 22 Apr 2025 11:38:22 +0300 Subject: [PATCH 13/16] change checks for export type --- ...ateQuickbooksDesktopExpensesExportDestinationTypeParams.ts | 2 +- src/libs/actions/connections/QuickbooksDesktop.ts | 4 ++-- .../QuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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/actions/connections/QuickbooksDesktop.ts b/src/libs/actions/connections/QuickbooksDesktop.ts index 07c8c660fc13..346b7a2d2f94 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 { const account = row?.accounts?.at(0)?.id; - if (row.value !== reimbursable && policyID && account) { + if (row.value !== reimbursable && policyID) { updateQuickbooksDesktopExpensesExportDestination( policyID, { From f8d5e2356bd3228b7be5162d362c5afc655a7ac2 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 22 Apr 2025 11:43:17 +0300 Subject: [PATCH 14/16] change types and if condition --- ...ateQuickbooksDesktopCompanyCardExpenseAccountTypeParams.ts | 2 +- src/libs/actions/connections/QuickbooksDesktop.ts | 4 ++-- ...ickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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/actions/connections/QuickbooksDesktop.ts b/src/libs/actions/connections/QuickbooksDesktop.ts index 346b7a2d2f94..3e96010f5393 100644 --- a/src/libs/actions/connections/QuickbooksDesktop.ts +++ b/src/libs/actions/connections/QuickbooksDesktop.ts @@ -347,14 +347,14 @@ 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/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx index cbde87510c42..51920d8da0dc 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx @@ -75,7 +75,7 @@ function QuickbooksDesktopCompanyCardExpenseAccountSelectCardPage({policy}: With const selectExportCompanyCard = useCallback( (row: MenuItem) => { const account = row.accounts.at(0)?.id; - if (row.value !== nonReimbursable && policyID && account) { + if (row.value !== nonReimbursable && policyID) { updateQuickbooksCompanyCardExpenseAccount( policyID, { From c0536ff14d305a232e863ab1ccd9e8e77e5f2034 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 22 Apr 2025 13:40:57 +0300 Subject: [PATCH 15/16] switch to direct navigation call --- .../qbd/export/QuickbooksDesktopExportPage.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx index 0fb5e30a60ae..0424150b9d77 100644 --- a/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx +++ b/src/pages/workspace/accounting/qbd/export/QuickbooksDesktopExportPage.tsx @@ -39,8 +39,6 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { [qbdConfig?.export?.nonReimbursable], ); - const activeRoute = Navigation.getActiveRoute(); - const goBack = useCallback(() => { return goBackFromExportConnection(shouldGoBackToSpecificRoute, backTo); }, [backTo, shouldGoBackToSpecificRoute]); @@ -48,7 +46,7 @@ function QuickbooksDesktopExportPage({policy}: WithPolicyConnectionsProps) { const menuItems = [ { description: translate('workspace.accounting.preferredExporter'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_PREFERRED_EXPORTER.getRoute(policyID, activeRoute)), + 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, @@ -56,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, activeRoute)), + 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, activeRoute)), + 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, @@ -72,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, activeRoute)), + 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: [ From 311015a7020e99bbff0d75a106cde7f460bd98ec Mon Sep 17 00:00:00 2001 From: narefyev91 Date: Wed, 23 Apr 2025 15:39:13 +0300 Subject: [PATCH 16/16] Update ROUTES.ts Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- src/ROUTES.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 2bf2b042bbdc..bf71521eeb7d 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1120,7 +1120,7 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/quickbooks-desktop/export/out-of-pocket-expense/entity-select', 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'); + 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); },