Skip to content

Commit 7ff0657

Browse files
Refactored Onyx.connect in
1 parent a4b094a commit 7ff0657

3 files changed

Lines changed: 21 additions & 64 deletions

File tree

src/libs/actions/IOU.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
228228
import {clearByKey as clearPdfByOnyxKey} from './CachedPDFPaths';
229229
import {buildOptimisticPolicyRecentlyUsedCategories, getPolicyCategoriesData} from './Policy/Category';
230230
import {buildAddMembersToWorkspaceOnyxData, buildUpdateWorkspaceMembersRoleOnyxData} from './Policy/Member';
231-
import {buildOptimisticPolicyRecentlyUsedDestinations} from './Policy/PerDiem';
232231
import {buildOptimisticRecentlyUsedCurrencies, buildPolicyData, generatePolicyID} from './Policy/Policy';
233232
import {buildOptimisticPolicyRecentlyUsedTags, getPolicyTagsData} from './Policy/Tag';
234233
import type {GuidedSetupData} from './Report';
@@ -409,6 +408,10 @@ type BasePolicyParams = {
409408
policyCategories?: OnyxEntry<OnyxTypes.PolicyCategories>;
410409
};
411410

411+
type RecentlyUsedParams = {
412+
destinations?: OnyxEntry<OnyxTypes.RecentlyUsedCategories>;
413+
};
414+
412415
type RequestMoneyParticipantParams = {
413416
payeeEmail: string | undefined;
414417
payeeAccountID: number;
@@ -419,6 +422,7 @@ type PerDiemExpenseInformation = {
419422
report: OnyxEntry<OnyxTypes.Report>;
420423
participantParams: RequestMoneyParticipantParams;
421424
policyParams?: BasePolicyParams;
425+
recentlyUsedParams?: RecentlyUsedParams;
422426
transactionParams: PerDiemExpenseTransactionParams;
423427
};
424428

@@ -427,6 +431,7 @@ type PerDiemExpenseInformationParams = {
427431
transactionParams: PerDiemExpenseTransactionParams;
428432
participantParams: RequestMoneyParticipantParams;
429433
policyParams?: BasePolicyParams;
434+
recentlyUsedParams?: RecentlyUsedParams;
430435
moneyRequestReportID?: string;
431436
};
432437

@@ -3563,9 +3568,10 @@ function computeDefaultPerDiemExpenseComment(customUnit: TransactionCustomUnit,
35633568
* it creates optimistic versions of them and uses those instead
35643569
*/
35653570
function getPerDiemExpenseInformation(perDiemExpenseInformation: PerDiemExpenseInformationParams): MoneyRequestInformation {
3566-
const {parentChatReport, transactionParams, participantParams, policyParams = {}, moneyRequestReportID = ''} = perDiemExpenseInformation;
3571+
const {parentChatReport, transactionParams, participantParams, policyParams = {}, recentlyUsedParams = {}, moneyRequestReportID = ''} = perDiemExpenseInformation;
35673572
const {payeeAccountID = userAccountID, payeeEmail = currentUserEmail, participant} = participantParams;
35683573
const {policy, policyCategories, policyTagList} = policyParams;
3574+
const {destinations: recentlyUsedDestinations} = recentlyUsedParams;
35693575
const {comment = '', currency, created, category, tag, customUnit, billable, attendees} = transactionParams;
35703576

35713577
const amount = computePerDiemExpenseAmount(customUnit);
@@ -3655,7 +3661,7 @@ function getPerDiemExpenseInformation(perDiemExpenseInformation: PerDiemExpenseI
36553661
const optimisticPolicyRecentlyUsedCategories = buildOptimisticPolicyRecentlyUsedCategories(iouReport.policyID, category);
36563662
const optimisticPolicyRecentlyUsedTags = buildOptimisticPolicyRecentlyUsedTags(iouReport.policyID, tag);
36573663
const optimisticPolicyRecentlyUsedCurrencies = buildOptimisticRecentlyUsedCurrencies(currency);
3658-
const optimisticPolicyRecentlyUsedDestinations = buildOptimisticPolicyRecentlyUsedDestinations(iouReport.policyID, customUnit.customUnitRateID);
3664+
const optimisticPolicyRecentlyUsedDestinations = customUnit.customUnitRateID ? [...new Set([customUnit.customUnitRateID, ...(recentlyUsedDestinations ?? [])])] : [];
36593665

36603666
// STEP 4: Build optimistic reportActions. We need:
36613667
// 1. CREATED action for the chatReport
@@ -5627,7 +5633,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) {
56275633
* Submit per diem expense to another user
56285634
*/
56295635
function submitPerDiemExpense(submitPerDiemExpenseInformation: PerDiemExpenseInformation) {
5630-
const {report, participantParams, policyParams = {}, transactionParams} = submitPerDiemExpenseInformation;
5636+
const {report, participantParams, policyParams = {}, recentlyUsedParams = {}, transactionParams} = submitPerDiemExpenseInformation;
56315637
const {payeeAccountID} = participantParams;
56325638
const {currency, comment = '', category, tag, created, customUnit, attendees} = transactionParams;
56335639

@@ -5663,6 +5669,7 @@ function submitPerDiemExpense(submitPerDiemExpenseInformation: PerDiemExpenseInf
56635669
parentChatReport: currentChatReport,
56645670
participantParams,
56655671
policyParams,
5672+
recentlyUsedParams,
56665673
transactionParams,
56675674
moneyRequestReportID,
56685675
});

src/libs/actions/Policy/PerDiem.ts

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,22 @@
11
import lodashDeepClone from 'lodash/cloneDeep';
2-
import lodashUnion from 'lodash/union';
3-
import type {NullishDeep, OnyxCollection} from 'react-native-onyx';
2+
import type {NullishDeep} from 'react-native-onyx';
43
import Onyx from 'react-native-onyx';
54
import * as API from '@libs/API';
65
import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
7-
import * as ApiUtils from '@libs/ApiUtils';
6+
import {getCommandURL} from '@libs/ApiUtils';
87
import fileDownload from '@libs/fileDownload';
98
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
109
import {translateLocal} from '@libs/Localize';
1110
import enhanceParameters from '@libs/Network/enhanceParameters';
12-
import * as NumberUtils from '@libs/NumberUtils';
11+
import {generateHexadecimalValue} from '@libs/NumberUtils';
1312
import {goBackWhenEnableFeature} from '@libs/PolicyUtils';
14-
import * as ReportUtils from '@libs/ReportUtils';
1513
import CONST from '@src/CONST';
1614
import ONYXKEYS from '@src/ONYXKEYS';
17-
import type {Policy, RecentlyUsedCategories, Report} from '@src/types/onyx';
1815
import type {ErrorFields, PendingAction} from '@src/types/onyx/OnyxCommon';
1916
import type {CustomUnit, Rate} from '@src/types/onyx/Policy';
2017
import type {OnyxData} from '@src/types/onyx/Request';
2118
import {isEmptyObject} from '@src/types/utils/EmptyObject';
2219

23-
const allPolicies: OnyxCollection<Policy> = {};
24-
Onyx.connect({
25-
key: ONYXKEYS.COLLECTION.POLICY,
26-
callback: (val, key) => {
27-
if (!key) {
28-
return;
29-
}
30-
if (val === null || val === undefined) {
31-
// If we are deleting a policy, we have to check every report linked to that policy
32-
// and unset the draft indicator (pencil icon) alongside removing any draft comments. Clearing these values will keep the newly archived chats from being displayed in the LHN.
33-
// More info: https://github.com/Expensify/App/issues/14260
34-
const policyID = key.replace(ONYXKEYS.COLLECTION.POLICY, '');
35-
const policyReports = ReportUtils.getAllPolicyReports(policyID);
36-
const cleanUpMergeQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT}${string}`, NullishDeep<Report>> = {};
37-
const cleanUpSetQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${string}` | `${typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${string}`, null> = {};
38-
policyReports.forEach((policyReport) => {
39-
if (!policyReport) {
40-
return;
41-
}
42-
const {reportID} = policyReport;
43-
cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${reportID}`] = null;
44-
cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`] = null;
45-
});
46-
Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, cleanUpMergeQueries);
47-
Onyx.multiSet(cleanUpSetQueries);
48-
delete allPolicies[key];
49-
return;
50-
}
51-
52-
allPolicies[key] = val;
53-
},
54-
});
55-
5620
type SubRateData = {
5721
pendingAction?: PendingAction;
5822
destination: string;
@@ -67,7 +31,7 @@ type SubRateData = {
6731
* Returns a client generated 13 character hexadecimal value for a custom unit ID
6832
*/
6933
function generateCustomUnitID(): string {
70-
return NumberUtils.generateHexadecimalValue(13);
34+
return generateHexadecimalValue(13);
7135
}
7236

7337
function enablePerDiem(policyID: string, enabled: boolean, customUnitID?: string, shouldGoBack?: boolean) {
@@ -193,7 +157,7 @@ function downloadPerDiemCSV(policyID: string, onDownloadFailed: () => void) {
193157
formData.append(key, String(value));
194158
});
195159

196-
fileDownload(ApiUtils.getCommandURL({command: WRITE_COMMANDS.EXPORT_PER_DIEM_CSV}), fileName, '', false, formData, CONST.NETWORK.METHOD.POST, onDownloadFailed);
160+
fileDownload(getCommandURL({command: WRITE_COMMANDS.EXPORT_PER_DIEM_CSV}), fileName, '', false, formData, CONST.NETWORK.METHOD.POST, onDownloadFailed);
197161
}
198162

199163
function clearPolicyPerDiemRatesErrorFields(policyID: string, customUnitID: string, updatedErrorFields: ErrorFields) {
@@ -400,23 +364,6 @@ function editPerDiemRateCurrency(policyID: string, rateID: string, customUnit: C
400364
API.write(WRITE_COMMANDS.UPDATE_WORKSPACE_CUSTOM_UNIT, parameters, onyxData);
401365
}
402366

403-
let allRecentlyUsedDestinations: OnyxCollection<RecentlyUsedCategories> = {};
404-
Onyx.connect({
405-
key: ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS,
406-
waitForCollectionCallback: true,
407-
callback: (val) => (allRecentlyUsedDestinations = val),
408-
});
409-
410-
function buildOptimisticPolicyRecentlyUsedDestinations(policyID: string | undefined, destination: string | undefined) {
411-
if (!policyID || !destination) {
412-
return [];
413-
}
414-
415-
const policyRecentlyUsedDestinations = allRecentlyUsedDestinations?.[`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS}${policyID}`] ?? [];
416-
417-
return lodashUnion([destination], policyRecentlyUsedDestinations);
418-
}
419-
420367
export {
421368
generateCustomUnitID,
422369
enablePerDiem,
@@ -429,5 +376,4 @@ export {
429376
editPerDiemRateSubrate,
430377
editPerDiemRateAmount,
431378
editPerDiemRateCurrency,
432-
buildOptimisticPolicyRecentlyUsedDestinations,
433379
};

src/pages/iou/request/step/IOURequestStepConfirmation.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ function IOURequestStepConfirmation({
130130
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${realPolicyID}`, {canBeMissing: true});
131131
const [userLocation] = useOnyx(ONYXKEYS.USER_LOCATION, {canBeMissing: true});
132132
const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: (val) => val?.reports});
133+
const [recentlyUsedDestinations] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS}${realPolicyID}`, {canBeMissing: true});
133134

134135
/*
135136
* We want to use a report from the transaction if it exists
@@ -543,6 +544,9 @@ function IOURequestStepConfirmation({
543544
policyTagList: policyTags,
544545
policyCategories,
545546
},
547+
recentlyUsedParams: {
548+
destinations: recentlyUsedDestinations,
549+
},
546550
transactionParams: {
547551
currency: transaction.currency,
548552
created: transaction.created,
@@ -555,7 +559,7 @@ function IOURequestStepConfirmation({
555559
},
556560
});
557561
},
558-
[report, transaction, currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, policy, policyTags, policyCategories],
562+
[report, transaction, currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, policy, policyTags, policyCategories, recentlyUsedDestinations],
559563
);
560564

561565
const trackExpense = useCallback(

0 commit comments

Comments
 (0)