Skip to content

Commit 8fd8688

Browse files
authored
Merge pull request Expensify#87275 from Krishna2323/krishna2323/issue/66413/part-1
Part 1 - Thread currentUserAccountID through hold/permission functions in ReportUtils
2 parents 73d9201 + d82fda8 commit 8fd8688

15 files changed

Lines changed: 147 additions & 61 deletions

File tree

src/components/AvatarWithDisplayName.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {View} from 'react-native';
33
import type {ColorValue, GestureResponderEvent, StyleProp, TextStyle, ViewStyle} from 'react-native';
44
import type {OnyxEntry} from 'react-native-onyx';
55
import type {ValueOf} from 'type-fest';
6+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
67
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
78
import useLocalize from '@hooks/useLocalize';
89
import useOnyx from '@hooks/useOnyx';
@@ -184,6 +185,7 @@ function AvatarWithDisplayName({
184185
parentNavigationStatusContainerStyles = {},
185186
}: AvatarWithDisplayNameProps) {
186187
const {localeCompare, formatPhoneNumber} = useLocalize();
188+
const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
187189
const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report?.parentReportID}`, {canEvict: false});
188190
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST) ?? CONST.EMPTY_OBJECT;
189191
const [conciergeReportID] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID);
@@ -208,7 +210,7 @@ function AvatarWithDisplayName({
208210
const statusText = shouldDisplayStatus ? getReportStatusTranslation({stateNum: report?.stateNum, statusNum: report?.statusNum, translate}) : undefined;
209211
const reportStatusColorStyle = shouldDisplayStatus ? getReportStatusColorStyle(theme, report?.stateNum, report?.statusNum) : {};
210212
const icons = useMemoizedLazyExpensifyIcons(['Pencil']);
211-
const shouldShowReportTitleEditButton = shouldEnableDetailPageNavigation && !isSmallScreenWidth && canEditReportTitle(report, policy);
213+
const shouldShowReportTitleEditButton = shouldEnableDetailPageNavigation && !isSmallScreenWidth && canEditReportTitle(report, policy, currentUserAccountID);
212214

213215
const actorAccountID = useRef<number | null>(null);
214216
useEffect(() => {

src/components/MoneyReportHeaderPrimaryAction/RemoveHoldPrimaryAction.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import Button from '@components/Button';
33
import {useDelegateNoAccessActions, useDelegateNoAccessState} from '@components/DelegateNoAccessModalProvider';
4+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
45
import useLocalize from '@hooks/useLocalize';
56
import useOnyx from '@hooks/useOnyx';
67
import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
@@ -17,6 +18,7 @@ function RemoveHoldPrimaryAction({reportID, chatReportID}: SimpleActionProps) {
1718
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
1819
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();
1920

21+
const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
2022
const {moneyRequestReport, isOffline, reportActions, transactionThreadReportID, requestParentReportAction} = useTransactionThreadData(reportID, chatReportID);
2123
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(moneyRequestReport?.policyID)}`);
2224

@@ -34,7 +36,7 @@ function RemoveHoldPrimaryAction({reportID, chatReportID}: SimpleActionProps) {
3436
}
3537

3638
const parentReportAction = getReportAction(moneyRequestReport?.parentReportID, moneyRequestReport?.parentReportActionID);
37-
const IOUActions = getAllExpensesToHoldIfApplicable(moneyRequestReport, reportActions, transactions, policy);
39+
const IOUActions = getAllExpensesToHoldIfApplicable(moneyRequestReport, reportActions, transactions, policy, currentUserAccountID);
3840

3941
if (IOUActions.length) {
4042
for (const action of IOUActions) {

src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {View} from 'react-native';
44
import type {OnyxEntry} from 'react-native-onyx';
55
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
66
import OfflineWithFeedback from '@components/OfflineWithFeedback';
7+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
78
import useThemeStyles from '@hooks/useThemeStyles';
89
import {clearReportFieldKeyErrors} from '@libs/actions/Report';
910
import {resolveReportFieldValue} from '@libs/Formula';
@@ -79,6 +80,7 @@ function ReportFieldView(reportField: EnrichedPolicyReportField, report: OnyxEnt
7980
}
8081
function MoneyRequestViewReportFields({report, policy, isCombinedReport = false, pendingAction}: MoneyRequestViewReportFieldsProps) {
8182
const styles = useThemeStyles();
83+
const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
8284

8385
const sortedPolicyReportFields = useMemo<EnrichedPolicyReportField[]>((): EnrichedPolicyReportField[] => {
8486
const {fieldValues, fieldsByName} = getReportFieldMaps(report, policy?.fieldList ?? {});
@@ -90,7 +92,7 @@ function MoneyRequestViewReportFields({report, policy, isCombinedReport = false,
9092
.sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight)
9193
.map((field): EnrichedPolicyReportField => {
9294
const fieldValue = resolveReportFieldValue(field, report, policy, fieldValues, fieldsByName);
93-
const isFieldDisabled = isReportFieldDisabledForUser(report, field, policy);
95+
const isFieldDisabled = isReportFieldDisabledForUser(report, field, policy, currentUserAccountID);
9496
const isDeletedFormulaField = field.type === CONST.REPORT_FIELD_TYPES.FORMULA && field.deletable;
9597
const fieldKey = getReportFieldKey(field.fieldID);
9698

@@ -106,7 +108,7 @@ function MoneyRequestViewReportFields({report, policy, isCombinedReport = false,
106108
violationTranslation,
107109
};
108110
});
109-
}, [policy, report]);
111+
}, [policy, report, currentUserAccountID]);
110112

111113
const enabledReportFields = sortedPolicyReportFields.filter(
112114
(reportField) => !isReportFieldDisabled(report, reportField, policy) || reportField.type === CONST.REPORT_FIELD_TYPES.FORMULA,

src/components/ReportActionItem/MoneyReportView.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
1010
import SpacerView from '@components/SpacerView';
1111
import Text from '@components/Text';
1212
import UnreadActionIndicator from '@components/UnreadActionIndicator';
13+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
1314
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
1415
import useLocalize from '@hooks/useLocalize';
1516
import useNetwork from '@hooks/useNetwork';
@@ -82,6 +83,7 @@ function MoneyReportView({
8283
}: MoneyReportViewProps) {
8384
const theme = useTheme();
8485
const styles = useThemeStyles();
86+
const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
8587
const StyleUtils = useStyleUtils();
8688
const {translate} = useLocalize();
8789
const {isOffline} = useNetwork();
@@ -169,7 +171,7 @@ function MoneyReportView({
169171
}
170172

171173
const fieldValue = resolveReportFieldValue(reportField, report, policy, fieldValues, fieldsByName);
172-
const isFieldDisabled = isReportFieldDisabledForUser(report, reportField, policy);
174+
const isFieldDisabled = isReportFieldDisabledForUser(report, reportField, policy, currentUserAccountID);
173175
const fieldKey = getReportFieldKey(reportField.fieldID);
174176

175177
const violation = isFieldDisabled ? undefined : getFieldViolation(reportField);

src/components/Search/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ function mapTransactionItemToSelectedEntry(
117117
outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
118118
allowNegativeAmount = true,
119119
): [string, SelectedTransactionInfo] {
120-
const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy);
120+
const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy, currentUserAccountID);
121121
const canRejectRequest = item.report ? canRejectReportAction(currentUserLogin, item.report) : false;
122122
const amount = hasValidModifiedAmount(item) ? Number(item.modifiedAmount) : item.amount;
123123

@@ -760,6 +760,7 @@ function Search({
760760
transactionItem.holdReportAction,
761761
transactionItem,
762762
transactionItem.policy,
763+
accountID,
763764
);
764765
const canRejectRequest = email && transactionItem.report ? canRejectReportAction(email, transactionItem.report) : false;
765766

@@ -818,6 +819,7 @@ function Search({
818819
transactionItem.holdReportAction,
819820
transactionItem,
820821
transactionItem.policy,
822+
accountID,
821823
);
822824
const canRejectRequest = email && transactionItem.report ? canRejectReportAction(email, transactionItem.report) : false;
823825

src/hooks/useSelectedTransactionsActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ function useSelectedTransactionsActions({
290290
}
291291
const iouReportAction = getIOUActionForTransactionID(reportActions, selectedTransaction.transactionID);
292292
const holdReportAction = getReportAction(iouReportAction?.childReportID, `${selectedTransaction?.comment?.hold ?? ''}`);
293-
const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(report, iouReportAction, holdReportAction, selectedTransaction, policy);
293+
const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(report, iouReportAction, holdReportAction, selectedTransaction, policy, currentUserAccountID);
294294

295295
canHoldTransactions = canHoldTransactions && canHoldRequest;
296296
canUnholdTransactions = canUnholdTransactions && canUnholdRequest;

src/libs/ReportPrimaryActionUtils.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,13 @@ function isPrimaryMarkAsResolvedAction(
423423
return isExpenseReportUtils(report) && isMarkAsResolvedAction(report, transactionViolations, policy);
424424
}
425425

426-
function getAllExpensesToHoldIfApplicable(report: Report | undefined, reportActions: ReportAction[] | undefined, reportTransactions: Transaction[], policy: OnyxEntry<Policy>) {
426+
function getAllExpensesToHoldIfApplicable(
427+
report: Report | undefined,
428+
reportActions: ReportAction[] | undefined,
429+
reportTransactions: Transaction[],
430+
policy: OnyxEntry<Policy>,
431+
currentUserAccountID: number | undefined,
432+
) {
427433
if (!report || !reportActions || !hasOnlyHeldExpenses(report?.reportID)) {
428434
return [];
429435
}
@@ -436,7 +442,7 @@ function getAllExpensesToHoldIfApplicable(report: Report | undefined, reportActi
436442
const transactionID = getOriginalMessage(action)?.IOUTransactionID;
437443
const transaction = reportTransactions.find((reportTransaction) => reportTransaction.transactionID === transactionID);
438444
const holdReportAction = getReportAction(action?.childReportID, `${transaction?.comment?.hold ?? ''}`);
439-
return canHoldUnholdReportAction(report, action, holdReportAction, transaction, policy).canUnholdRequest;
445+
return canHoldUnholdReportAction(report, action, holdReportAction, transaction, policy, currentUserAccountID).canUnholdRequest;
440446
});
441447
}
442448

@@ -490,7 +496,7 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf<t
490496
invoiceReceiverPolicy,
491497
reportActions,
492498
}) && hasOnlyHeldExpenses(report?.reportID);
493-
const expensesToHold = getAllExpensesToHoldIfApplicable(report, reportActions, reportTransactions, policy);
499+
const expensesToHold = getAllExpensesToHoldIfApplicable(report, reportActions, reportTransactions, policy, currentUserAccountID);
494500

495501
if (isMarkAsCashAction(currentUserLogin, currentUserAccountID, report, reportTransactions, violations, policy)) {
496502
return CONST.REPORT.PRIMARY_ACTIONS.MARK_AS_CASH;

src/libs/ReportSecondaryActionUtils.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,14 @@ function isMarkAsExportedAction(currentAccountID: number, currentUserLogin: stri
530530
return (isAdmin && syncEnabled) || (isExporter && !syncEnabled);
531531
}
532532

533-
function isHoldAction(report: Report, chatReport: OnyxEntry<Report>, reportTransactions: Transaction[], reportActions: ReportAction[] | undefined, policy: OnyxEntry<Policy>): boolean {
533+
function isHoldAction(
534+
report: Report,
535+
chatReport: OnyxEntry<Report>,
536+
reportTransactions: Transaction[],
537+
reportActions: ReportAction[] | undefined,
538+
policy: OnyxEntry<Policy>,
539+
currentUserAccountID: number | undefined,
540+
): boolean {
534541
const transactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, reportActions);
535542
const isOneExpenseReport = reportTransactions.length === 1;
536543
const transaction = reportTransactions.at(0);
@@ -540,15 +547,21 @@ function isHoldAction(report: Report, chatReport: OnyxEntry<Report>, reportTrans
540547
}
541548

542549
const action = !!reportActions && getIOUActionForTransactionID(reportActions, transaction.transactionID);
543-
return !!action && isHoldActionForTransaction(report, transaction, action, policy);
550+
return !!action && isHoldActionForTransaction(report, transaction, action, policy, currentUserAccountID);
544551
}
545552

546-
function isHoldActionForTransaction(report: Report, reportTransaction: Transaction, reportAction: ReportAction, policy: OnyxEntry<Policy>): boolean {
553+
function isHoldActionForTransaction(
554+
report: Report,
555+
reportTransaction: Transaction,
556+
reportAction: ReportAction,
557+
policy: OnyxEntry<Policy>,
558+
currentUserAccountID: number | undefined,
559+
): boolean {
547560
const isExpenseReport = isExpenseReportUtils(report);
548561
const isIOUReport = isIOUReportUtils(report);
549562
const iouOrExpenseReport = isExpenseReport || isIOUReport;
550563
const holdReportAction = getReportAction(reportAction?.childReportID, `${reportTransaction?.comment?.hold ?? ''}`);
551-
const {canHoldRequest} = canHoldUnholdReportAction(report, reportAction, holdReportAction, reportTransaction, policy);
564+
const {canHoldRequest} = canHoldUnholdReportAction(report, reportAction, holdReportAction, reportTransaction, policy, currentUserAccountID);
552565

553566
if (!iouOrExpenseReport || !canHoldRequest) {
554567
return false;
@@ -954,7 +967,7 @@ function getSecondaryReportActions({
954967
options.push(CONST.REPORT.SECONDARY_ACTIONS.REOPEN);
955968
}
956969

957-
if (isHoldAction(report, chatReport, reportTransactions, reportActions, policy)) {
970+
if (isHoldAction(report, chatReport, reportTransactions, reportActions, policy, currentUserAccountID)) {
958971
options.push(CONST.REPORT.SECONDARY_ACTIONS.HOLD);
959972
}
960973

@@ -1066,7 +1079,7 @@ function getSecondaryTransactionThreadActions(
10661079
): Array<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>> {
10671080
const options: Array<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>> = [];
10681081

1069-
if (!!reportAction && isHoldActionForTransaction(parentReport, reportTransaction, reportAction, policy)) {
1082+
if (!!reportAction && isHoldActionForTransaction(parentReport, reportTransaction, reportAction, policy, currentUserAccountID)) {
10701083
options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD);
10711084
}
10721085

0 commit comments

Comments
 (0)