Skip to content

Commit 18bd290

Browse files
authored
Merge pull request Expensify#64131 from nyomanjyotisa/issue-63842
2 parents 894ea88 + 9aeb2c7 commit 18bd290

7 files changed

Lines changed: 74 additions & 21 deletions

File tree

src/ROUTES.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,11 +1393,11 @@ const ROUTES = {
13931393
},
13941394
WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS: {
13951395
route: 'workspaces/:policyID/accounting/:connection/card-reconciliation/account',
1396-
getRoute: (policyID: string | undefined, connection?: ValueOf<typeof CONST.POLICY.CONNECTIONS.ROUTE>) => {
1396+
getRoute: (policyID: string | undefined, connection?: ValueOf<typeof CONST.POLICY.CONNECTIONS.ROUTE>, backTo?: string) => {
13971397
if (!policyID) {
13981398
Log.warn('Invalid policyID is used to build the WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS route');
13991399
}
1400-
return `workspaces/${policyID}/accounting/${connection as string}/card-reconciliation/account` as const;
1400+
return getUrlWithBackToParam(`workspaces/${policyID}/accounting/${connection as string}/card-reconciliation/account` as const, backTo);
14011401
},
14021402
},
14031403
WORKSPACE_CATEGORIES: {

src/libs/actions/connections/index.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
1414

1515
type ConnectionNameExceptNetSuite = Exclude<ConnectionName, typeof CONST.POLICY.CONNECTIONS.NAME.NETSUITE>;
1616

17-
function removePolicyConnection(policyID: string, connectionName: PolicyConnectionName) {
17+
function removePolicyConnection(policy: Policy, connectionName: PolicyConnectionName) {
18+
const policyID = policy.id;
19+
const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID;
20+
1821
const optimisticData: OnyxUpdate[] = [
1922
{
2023
onyxMethod: Onyx.METHOD.MERGE,
@@ -30,13 +33,20 @@ function removePolicyConnection(policyID: string, connectionName: PolicyConnecti
3033
key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`,
3134
value: null,
3235
},
36+
{
37+
onyxMethod: Onyx.METHOD.SET,
38+
key: `${ONYXKEYS.COLLECTION.EXPENSIFY_CARD_CONTINUOUS_RECONCILIATION_CONNECTION}${workspaceAccountID}`,
39+
value: null,
40+
},
41+
{
42+
onyxMethod: Onyx.METHOD.SET,
43+
key: `${ONYXKEYS.COLLECTION.EXPENSIFY_CARD_USE_CONTINUOUS_RECONCILIATION}${workspaceAccountID}`,
44+
value: null,
45+
},
3346
];
3447

3548
const successData: OnyxUpdate[] = [];
3649
const failureData: OnyxUpdate[] = [];
37-
// This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
38-
// eslint-disable-next-line deprecation/deprecation
39-
const policy = PolicyUtils.getPolicy(policyID);
4050
const supportedConnections: PolicyConnectionName[] = [CONST.POLICY.CONNECTIONS.NAME.QBO, CONST.POLICY.CONNECTIONS.NAME.XERO];
4151

4252
if (PolicyUtils.isCollectPolicy(policy) && supportedConnections.includes(connectionName)) {

src/pages/workspace/accounting/AccountingContext.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {MutableRefObject, RefObject} from 'react';
1+
import type {RefObject} from 'react';
22
import React, {useContext, useMemo, useRef, useState} from 'react';
33
import type {View} from 'react-native';
44
import type {OnyxEntry} from 'react-native-onyx';
@@ -30,15 +30,15 @@ type AccountingContextType = {
3030
/*
3131
* This stores refs to integration buttons, so the PopoverMenu can be positioned correctly
3232
*/
33-
popoverAnchorRefs: RefObject<Record<string, MutableRefObject<View | null>>>;
33+
popoverAnchorRefs: RefObject<Record<string, RefObject<View | null>>>;
3434
};
3535

3636
const popoverAnchorRefsInitialValue = Object.values(CONST.POLICY.CONNECTIONS.NAME).reduce(
3737
(acc, key) => {
3838
acc[key] = {current: null};
3939
return acc;
4040
},
41-
{} as Record<ConnectionName, MutableRefObject<View | null>>,
41+
{} as Record<ConnectionName, RefObject<View | null>>,
4242
);
4343

4444
const defaultAccountingContext = {
@@ -56,7 +56,7 @@ type AccountingContextProviderProps = ChildrenProps & {
5656
};
5757

5858
function AccountingContextProvider({children, policy}: AccountingContextProviderProps) {
59-
const popoverAnchorRefs = useRef<Record<string, MutableRefObject<View | null>>>(defaultAccountingContext.popoverAnchorRefs.current);
59+
const popoverAnchorRefs = useRef<Record<string, RefObject<View | null>>>(defaultAccountingContext.popoverAnchorRefs.current);
6060
const [activeIntegration, setActiveIntegration] = useState<ActiveIntegrationState>();
6161
const {translate} = useLocalize();
6262
const policyID = policy?.id;
@@ -139,7 +139,7 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider
139139
if (!policyID || !activeIntegration?.integrationToDisconnect) {
140140
return;
141141
}
142-
removePolicyConnection(policyID, activeIntegration?.integrationToDisconnect);
142+
removePolicyConnection(policy, activeIntegration?.integrationToDisconnect);
143143
closeConfirmationModal();
144144
}}
145145
integrationToConnect={activeIntegration?.name}

src/pages/workspace/accounting/PolicyAccountingPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) {
630630
isVisible={isDisconnectModalOpen}
631631
onConfirm={() => {
632632
if (connectedIntegration && policyID) {
633-
removePolicyConnection(policyID, connectedIntegration);
633+
removePolicyConnection(policy, connectedIntegration);
634634
}
635635
setIsDisconnectModalOpen(false);
636636
}}

src/pages/workspace/accounting/reconciliation/CardReconciliationPage.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useCallback, useMemo} from 'react';
1+
import React, {useCallback, useEffect, useMemo} from 'react';
22
import HeaderWithBackButton from '@components/HeaderWithBackButton';
33
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
44
import ScreenWrapper from '@components/ScreenWrapper';
@@ -10,6 +10,7 @@ import useLocalize from '@hooks/useLocalize';
1010
import useOnyx from '@hooks/useOnyx';
1111
import useThemeStyles from '@hooks/useThemeStyles';
1212
import {getConnectionNameFromRouteParam} from '@libs/AccountingUtils';
13+
import {openPolicyAccountingPage} from '@libs/actions/PolicyConnections';
1314
import {isExpensifyCardFullySetUp} from '@libs/CardUtils';
1415
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
1516
import Navigation from '@navigation/Navigation';
@@ -107,6 +108,20 @@ function CardReconciliationPage({policy, route}: CardReconciliationPageProps) {
107108
}
108109
}, [connection, policyID]);
109110

111+
const fetchPolicyAccountingData = useCallback(() => {
112+
if (!policyID) {
113+
return;
114+
}
115+
openPolicyAccountingPage(policyID);
116+
}, [policyID]);
117+
118+
useEffect(() => {
119+
if (isContinuousReconciliationOn !== undefined) {
120+
return;
121+
}
122+
fetchPolicyAccountingData();
123+
}, [isContinuousReconciliationOn, fetchPolicyAccountingData]);
124+
110125
return (
111126
<AccessOrNotFoundWrapper
112127
policyID={policyID}

src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useMemo} from 'react';
1+
import React, {useCallback, useMemo} from 'react';
22
import ConnectionLayout from '@components/ConnectionLayout';
33
import SelectionList from '@components/SelectionList';
44
import RadioListItem from '@components/SelectionList/RadioListItem';
@@ -19,22 +19,28 @@ import {updateSettlementAccount} from '@userActions/Card';
1919
import CONST from '@src/CONST';
2020
import ONYXKEYS from '@src/ONYXKEYS';
2121
import ROUTES from '@src/ROUTES';
22+
import type {Route} from '@src/ROUTES';
2223
import type SCREENS from '@src/SCREENS';
2324
import {isEmptyObject} from '@src/types/utils/EmptyObject';
2425

2526
type ReconciliationAccountSettingsPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.ACCOUNTING.RECONCILIATION_ACCOUNT_SETTINGS>;
2627

28+
type ReconciliationAccountSettingsPageRouteParams = {
29+
backTo?: Route;
30+
};
31+
2732
function ReconciliationAccountSettingsPage({route}: ReconciliationAccountSettingsPageProps) {
2833
const {policyID, connection} = route.params;
34+
const {backTo} = route.params as ReconciliationAccountSettingsPageRouteParams;
2935

3036
const styles = useThemeStyles();
3137
const {translate} = useLocalize();
3238

3339
const connectionName = getConnectionNameFromRouteParam(connection);
3440
const defaultFundID = useDefaultFundID(policyID);
3541

36-
const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST);
37-
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`);
42+
const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
43+
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`, {canBeMissing: true});
3844
const paymentBankAccountID = cardSettings?.paymentBankAccountID;
3945

4046
const selectedBankAccount = useMemo(() => bankAccountList?.[paymentBankAccountID?.toString() ?? ''], [paymentBankAccountID, bankAccountList]);
@@ -58,9 +64,13 @@ function ReconciliationAccountSettingsPage({route}: ReconciliationAccountSetting
5864
return [{data}];
5965
}, [bankAccountList, paymentBankAccountID]);
6066

67+
const goBack = useCallback(() => {
68+
Navigation.goBack(backTo ?? ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.getRoute(policyID, connection));
69+
}, [policyID, backTo, connection]);
70+
6171
const selectBankAccount = (newBankAccountID?: number) => {
6272
updateSettlementAccount(domainName, defaultFundID, policyID, newBankAccountID, paymentBankAccountID);
63-
Navigation.goBack(ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.getRoute(policyID, connection));
73+
goBack();
6474
};
6575

6676
return (
@@ -73,7 +83,7 @@ function ReconciliationAccountSettingsPage({route}: ReconciliationAccountSetting
7383
contentContainerStyle={[styles.flex1, styles.pb2]}
7484
connectionName={connectionName}
7585
shouldUseScrollView={false}
76-
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.getRoute(policyID, connection))}
86+
onBackButtonPress={goBack}
7787
>
7888
<Text style={[styles.textNormal, styles.mb5, styles.ph5]}>{translate('workspace.accounting.chooseReconciliationAccount.chooseBankAccount')}</Text>
7989
<Text style={[styles.textNormal, styles.mb6, styles.ph5]}>

src/pages/workspace/expensifyCard/WorkspaceSettlementAccountPage.tsx

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useMemo} from 'react';
1+
import React, {useCallback, useEffect, useMemo} from 'react';
22
import {View} from 'react-native';
33
import HeaderWithBackButton from '@components/HeaderWithBackButton';
44
import Icon from '@components/Icon';
@@ -14,6 +14,7 @@ import useLocalize from '@hooks/useLocalize';
1414
import useOnyx from '@hooks/useOnyx';
1515
import useThemeStyles from '@hooks/useThemeStyles';
1616
import {getRouteParamForConnection} from '@libs/AccountingUtils';
17+
import {openPolicyAccountingPage} from '@libs/actions/PolicyConnections';
1718
import {getLastFourDigits} from '@libs/BankAccountUtils';
1819
import {getEligibleBankAccountsForCard} from '@libs/CardUtils';
1920
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -38,6 +39,7 @@ function WorkspaceSettlementAccountPage({route}: WorkspaceSettlementAccountPageP
3839
const policyID = route.params?.policyID;
3940
const defaultFundID = useDefaultFundID(policyID);
4041

42+
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
4143
const [bankAccountsList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: true});
4244
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${defaultFundID}`, {canBeMissing: true});
4345
const [isUsingContinuousReconciliation] = useOnyx(`${ONYXKEYS.COLLECTION.EXPENSIFY_CARD_USE_CONTINUOUS_RECONCILIATION}${defaultFundID}`, {canBeMissing: true});
@@ -55,6 +57,22 @@ function WorkspaceSettlementAccountPage({route}: WorkspaceSettlementAccountPageP
5557

5658
const domainName = cardSettings?.domainName ?? getDomainNameForPolicy(policyID);
5759

60+
const hasActiveAccountingConnection = !!(policy?.connections && Object.keys(policy.connections).length > 0);
61+
62+
const fetchPolicyAccountingData = useCallback(() => {
63+
if (!policyID) {
64+
return;
65+
}
66+
openPolicyAccountingPage(policyID);
67+
}, [policyID]);
68+
69+
useEffect(() => {
70+
if (!cardSettings || !hasActiveAccountingConnection || isUsingContinuousReconciliation !== undefined || reconciliationConnection !== undefined) {
71+
return;
72+
}
73+
fetchPolicyAccountingData();
74+
}, [cardSettings, hasActiveAccountingConnection, isUsingContinuousReconciliation, reconciliationConnection, fetchPolicyAccountingData]);
75+
5876
const data = useMemo(() => {
5977
const options = eligibleBankAccounts.map((bankAccount) => {
6078
const bankName = (bankAccount.accountData?.addressName ?? '') as BankName;
@@ -142,11 +160,11 @@ function WorkspaceSettlementAccountPage({route}: WorkspaceSettlementAccountPageP
142160
listHeaderContent={
143161
<>
144162
<Text style={[styles.mh5, styles.mv4]}>{translate('workspace.expensifyCard.settlementAccountDescription')}</Text>
145-
{!!isUsingContinuousReconciliation && (
163+
{!!isUsingContinuousReconciliation && !!connectionParam && hasActiveAccountingConnection && (
146164
<View style={[styles.renderHTML, styles.mh5, styles.mb6]}>
147165
<RenderHTML
148166
html={translate('workspace.expensifyCard.settlementAccountInfo', {
149-
reconciliationAccountSettingsLink: `${environmentURL}/${ROUTES.WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS.getRoute(policyID, connectionParam)}`,
167+
reconciliationAccountSettingsLink: `${environmentURL}/${ROUTES.WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS.getRoute(policyID, connectionParam, Navigation.getActiveRoute())}`,
150168
accountNumber: `${CONST.MASKED_PAN_PREFIX}${getLastFourDigits(paymentBankAccountNumber)}`,
151169
})}
152170
/>

0 commit comments

Comments
 (0)