Skip to content

Commit 0890f45

Browse files
authored
Merge pull request Expensify#67600 from samranahm/67102/remove-getReportNameValuePairs
[No QA] chore: remove call to getReportNameValuePairs in getMoneyRequestOptions
2 parents cf93ba9 + 10a6c36 commit 0890f45

8 files changed

Lines changed: 47 additions & 22 deletions

File tree

src/components/ReportWelcomeText.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) {
5757
const participantAccountIDs = getParticipantsAccountIDsForDisplay(report, undefined, true, true, reportMetadata);
5858
const isMultipleParticipant = participantAccountIDs.length > 1;
5959
const displayNamesWithTooltips = getDisplayNamesWithTooltips(getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails), isMultipleParticipant);
60-
const moneyRequestOptions = temporary_getMoneyRequestOptions(report, policy, participantAccountIDs);
60+
const moneyRequestOptions = temporary_getMoneyRequestOptions(report, policy, participantAccountIDs, isReportArchived);
6161
const policyName = getPolicyName({report});
6262

6363
const filteredOptions = moneyRequestOptions.filter(

src/libs/QuickActionUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ const getQuickActionTitle = (action: QuickActionName): TranslationPaths => {
9292
}
9393
};
9494

95-
const isQuickActionAllowed = (quickAction: QuickAction, quickActionReport: Report | undefined, quickActionPolicy: Policy | undefined) => {
95+
const isQuickActionAllowed = (quickAction: QuickAction, quickActionReport: Report | undefined, quickActionPolicy: Policy | undefined, isReportArchived = false) => {
9696
const iouType = getIOUType(quickAction?.action);
9797
if (iouType) {
98-
return canCreateRequest(quickActionReport, quickActionPolicy, iouType);
98+
return canCreateRequest(quickActionReport, quickActionPolicy, iouType, isReportArchived);
9999
}
100100
if (quickAction?.action === CONST.QUICK_ACTIONS.PER_DIEM) {
101101
return !!quickActionPolicy?.arePerDiemRatesEnabled;

src/libs/ReportUtils.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8646,16 +8646,12 @@ function isGroupChatAdmin(report: OnyxEntry<Report>, accountID: number) {
86468646
* None of the options should show in chat threads or if there is some special Expensify account
86478647
* as a participant of the report.
86488648
*/
8649-
function getMoneyRequestOptions(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, reportParticipants: number[], filterDeprecatedTypes = false): IOUType[] {
8649+
function getMoneyRequestOptions(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, reportParticipants: number[], filterDeprecatedTypes = false, isReportArchived = false): IOUType[] {
86508650
const teacherUnitePolicyID = environment === CONST.ENVIRONMENT.PRODUCTION ? CONST.TEACHERS_UNITE.PROD_POLICY_ID : CONST.TEACHERS_UNITE.TEST_POLICY_ID;
86518651
const isTeachersUniteReport = report?.policyID === teacherUnitePolicyID;
86528652

8653-
// This will get removed as part of https://github.com/Expensify/App/issues/59961
8654-
// eslint-disable-next-line deprecation/deprecation
8655-
const reportNameValuePairs = getReportNameValuePairs(report?.reportID);
8656-
86578653
// In any thread, task report or trip room, we do not allow any new expenses
8658-
if (isChatThread(report) || isTaskReport(report) || isInvoiceReport(report) || isSystemChat(report) || isArchivedReport(reportNameValuePairs) || isTripRoom(report)) {
8654+
if (isChatThread(report) || isTaskReport(report) || isInvoiceReport(report) || isSystemChat(report) || isReportArchived || isTripRoom(report)) {
86598655
return [];
86608656
}
86618657

@@ -8742,8 +8738,9 @@ function temporary_getMoneyRequestOptions(
87428738
report: OnyxEntry<Report>,
87438739
policy: OnyxEntry<Policy>,
87448740
reportParticipants: number[],
8741+
isReportArchived = false,
87458742
): Array<Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND | typeof CONST.IOU.TYPE.CREATE | typeof CONST.IOU.TYPE.SPLIT_EXPENSE>> {
8746-
return getMoneyRequestOptions(report, policy, reportParticipants, true) as Array<
8743+
return getMoneyRequestOptions(report, policy, reportParticipants, true, isReportArchived) as Array<
87478744
Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND | typeof CONST.IOU.TYPE.CREATE | typeof CONST.IOU.TYPE.SPLIT_EXPENSE>
87488745
>;
87498746
}
@@ -8958,14 +8955,14 @@ function getReportOfflinePendingActionAndErrors(report: OnyxEntry<Report>): Repo
89588955
/**
89598956
* Check if the report can create the expense with type is iouType
89608957
*/
8961-
function canCreateRequest(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, iouType: ValueOf<typeof CONST.IOU.TYPE>): boolean {
8958+
function canCreateRequest(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, iouType: ValueOf<typeof CONST.IOU.TYPE>, isReportArchived = false): boolean {
89628959
const participantAccountIDs = Object.keys(report?.participants ?? {}).map(Number);
89638960

89648961
if (!canUserPerformWriteAction(report)) {
89658962
return false;
89668963
}
89678964

8968-
const requestOptions = getMoneyRequestOptions(report, policy, participantAccountIDs);
8965+
const requestOptions = getMoneyRequestOptions(report, policy, participantAccountIDs, isReportArchived);
89698966
requestOptions.push(CONST.IOU.TYPE.CREATE);
89708967

89718968
return requestOptions.includes(iouType);

src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import useLocalize from '@hooks/useLocalize';
1616
import useOnyx from '@hooks/useOnyx';
1717
import usePermissions from '@hooks/usePermissions';
1818
import usePrevious from '@hooks/usePrevious';
19+
import useReportIsArchived from '@hooks/useReportIsArchived';
1920
import useResponsiveLayout from '@hooks/useResponsiveLayout';
2021
import useTheme from '@hooks/useTheme';
2122
import useThemeStyles from '@hooks/useThemeStyles';
@@ -135,6 +136,7 @@ function AttachmentPickerWithMenuItems({
135136
const {isProduction} = useEnvironment();
136137
const {isBetaEnabled} = usePermissions();
137138
const {setIsLoaderVisible} = useFullScreenLoader();
139+
const isReportArchived = useReportIsArchived(report?.reportID);
138140

139141
const isManualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);
140142

@@ -228,7 +230,7 @@ function AttachmentPickerWithMenuItems({
228230
],
229231
};
230232

231-
const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => options[option]);
233+
const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => options[option], isReportArchived);
232234

233235
return moneyRequestOptionsList.flat().filter((item, index, self) => index === self.findIndex((t) => t.text === item.text));
234236
}, [translate, shouldUseNarrowLayout, report, policy, reportParticipantIDs, selectOption, isDelegateAccessRestricted, showDelegateNoAccessModal, isManualDistanceTrackingEnabled]);

src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import useHandleExceedMaxTaskTitleLength from '@hooks/useHandleExceedMaxTaskTitl
2727
import useLocalize from '@hooks/useLocalize';
2828
import useNetwork from '@hooks/useNetwork';
2929
import useOnyx from '@hooks/useOnyx';
30+
import useReportIsArchived from '@hooks/useReportIsArchived';
3031
import useResponsiveLayout from '@hooks/useResponsiveLayout';
3132
import useTheme from '@hooks/useTheme';
3233
import useThemeStyles from '@hooks/useThemeStyles';
@@ -217,6 +218,7 @@ function ReportActionCompose({
217218
const includesConcierge = useMemo(() => chatIncludesConcierge({participants: report?.participants}), [report?.participants]);
218219
const userBlockedFromConcierge = useMemo(() => isBlockedFromConciergeUserAction(blockedFromConcierge), [blockedFromConcierge]);
219220
const isBlockedFromConcierge = useMemo(() => includesConcierge && userBlockedFromConcierge, [includesConcierge, userBlockedFromConcierge]);
221+
const isReportArchived = useReportIsArchived(report?.reportID);
220222

221223
const isTransactionThreadView = useMemo(() => isReportTransactionThread(report), [report]);
222224
const isExpensesReport = useMemo(() => reportTransactions && reportTransactions.length > 1, [reportTransactions]);
@@ -241,7 +243,7 @@ function ReportActionCompose({
241243
const shouldDisplayDualDropZone = useMemo(() => {
242244
const parentReport = getParentReport(report);
243245
const isSettledOrApproved = isSettled(report) || isSettled(parentReport) || isReportApproved({report}) || isReportApproved({report: parentReport});
244-
return (shouldAddOrReplaceReceipt && !isSettledOrApproved) || !!temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs).length;
246+
return (shouldAddOrReplaceReceipt && !isSettledOrApproved) || !!temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs, isReportArchived).length;
245247
}, [shouldAddOrReplaceReceipt, report, policy, reportParticipantIDs]);
246248

247249
// Placeholder to display in the chat input.

src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import useNetwork from '@hooks/useNetwork';
1717
import useOnyx from '@hooks/useOnyx';
1818
import usePermissions from '@hooks/usePermissions';
1919
import usePrevious from '@hooks/usePrevious';
20+
import useReportIsArchived from '@hooks/useReportIsArchived';
2021
import useResponsiveLayout from '@hooks/useResponsiveLayout';
2122
import useTheme from '@hooks/useTheme';
2223
import useThemeStyles from '@hooks/useThemeStyles';
@@ -42,7 +43,7 @@ import {
4243
shouldShowPolicy,
4344
} from '@libs/PolicyUtils';
4445
import {getQuickActionIcon, getQuickActionTitle, isQuickActionAllowed} from '@libs/QuickActionUtils';
45-
import {generateReportID, getDisplayNameForParticipant, getIcons, getReportName, getWorkspaceChats, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
46+
import {generateReportID, getDisplayNameForParticipant, getIcons, getReportName, getWorkspaceChats, isPolicyExpenseChat} from '@libs/ReportUtils';
4647
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
4748
import variables from '@styles/variables';
4849
import {closeReactNativeApp} from '@userActions/HybridApp';
@@ -97,7 +98,6 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT
9798
const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false, selector: (onyxSession) => ({email: onyxSession?.email, accountID: onyxSession?.accountID})});
9899
const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true});
99100
const [quickActionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${quickAction?.chatReportID}`, {canBeMissing: true});
100-
const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${quickActionReport?.reportID}`, {canBeMissing: true});
101101
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
102102
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: true});
103103
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {canBeMissing: true});
@@ -120,6 +120,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT
120120
const {shouldUseNarrowLayout} = useResponsiveLayout();
121121
const isFocused = useIsFocused();
122122
const prevIsFocused = usePrevious(isFocused);
123+
const isReportArchived = useReportIsArchived(quickActionReport?.reportID);
123124
const {isOffline} = useNetwork();
124125
const {isBlockedFromSpotnanaTravel, isBetaEnabled} = usePermissions();
125126
const isManualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);
@@ -128,7 +129,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT
128129
const [travelSettings] = useOnyx(ONYXKEYS.NVP_TRAVEL_SETTINGS, {canBeMissing: true});
129130

130131
const canSendInvoice = useMemo(() => canSendInvoicePolicyUtils(allPolicies as OnyxCollection<OnyxTypes.Policy>, session?.email), [allPolicies, session?.email]);
131-
const isValidReport = !(isEmptyObject(quickActionReport) || isArchivedReport(reportNameValuePairs));
132+
const isValidReport = !(isEmptyObject(quickActionReport) || isReportArchived);
132133
const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
133134
const [hasSeenTour = false] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {
134135
selector: hasSeenTourSelector,
@@ -327,7 +328,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT
327328
};
328329

329330
if (quickAction?.action) {
330-
if (!isQuickActionAllowed(quickAction, quickActionReport, quickActionPolicy)) {
331+
if (!isQuickActionAllowed(quickAction, quickActionReport, quickActionPolicy, isReportArchived)) {
331332
return [];
332333
}
333334
const onSelected = () => {

src/pages/workspace/AccessOrNotFoundWrapper.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
77
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
88
import useNetwork from '@hooks/useNetwork';
99
import useOnyx from '@hooks/useOnyx';
10+
import useReportIsArchived from '@hooks/useReportIsArchived';
1011
import useResponsiveLayout from '@hooks/useResponsiveLayout';
1112
import {openWorkspace} from '@libs/actions/Policy/Policy';
1213
import {isValidMoneyRequestType} from '@libs/IOUUtils';
@@ -31,13 +32,24 @@ const ACCESS_VARIANTS = {
3132
[CONST.POLICY.ACCESS_VARIANTS.PAID]: (policy: OnyxEntry<Policy>) => isPaidGroupPolicy(policy),
3233
[CONST.POLICY.ACCESS_VARIANTS.CONTROL]: (policy: OnyxEntry<Policy>) => isControlPolicy(policy),
3334
[CONST.POLICY.ACCESS_VARIANTS.ADMIN]: (policy: OnyxEntry<Policy>, login: string) => isPolicyAdmin(policy, login),
34-
[CONST.IOU.ACCESS_VARIANTS.CREATE]: (policy: OnyxEntry<Policy>, login: string, report: OnyxEntry<Report>, allPolicies: NonNullable<OnyxCollection<Policy>> | null, iouType?: IOUType) =>
35+
[CONST.IOU.ACCESS_VARIANTS.CREATE]: (
36+
policy: OnyxEntry<Policy>,
37+
login: string,
38+
report: OnyxEntry<Report>,
39+
allPolicies: NonNullable<OnyxCollection<Policy>> | null,
40+
iouType?: IOUType,
41+
isReportArchived?: boolean,
42+
) =>
3543
!!iouType &&
3644
isValidMoneyRequestType(iouType) &&
3745
// Allow the user to submit the expense if we are submitting the expense in global menu or the report can create the expense
38-
(isEmptyObject(report?.reportID) || canCreateRequest(report, policy, iouType)) &&
46+
47+
(isEmptyObject(report?.reportID) || canCreateRequest(report, policy, iouType, isReportArchived)) &&
3948
(iouType !== CONST.IOU.TYPE.INVOICE || canSendInvoice(allPolicies, login)),
40-
} as const satisfies Record<string, (policy: Policy, login: string, report: Report, allPolicies: NonNullable<OnyxCollection<Policy>> | null, iouType?: IOUType) => boolean>;
49+
} as const satisfies Record<
50+
string,
51+
(policy: Policy, login: string, report: Report, allPolicies: NonNullable<OnyxCollection<Policy>> | null, iouType?: IOUType, isArchivedReport?: boolean) => boolean
52+
>;
4153

4254
type AccessVariant = keyof typeof ACCESS_VARIANTS;
4355
type AccessOrNotFoundWrapperChildrenProps = {
@@ -155,9 +167,10 @@ function AccessOrNotFoundWrapper({
155167

156168
const {isOffline} = useNetwork();
157169

170+
const isReportArchived = useReportIsArchived(report?.reportID);
158171
const isPageAccessible = accessVariants.reduce((acc, variant) => {
159172
const accessFunction = ACCESS_VARIANTS[variant];
160-
return acc && accessFunction(policy, login, report, allPolicies ?? null, iouType);
173+
return acc && accessFunction(policy, login, report, allPolicies ?? null, iouType, isReportArchived);
161174
}, true);
162175

163176
const isPolicyNotAccessible = !isPolicyAccessible(policy);

tests/unit/ReportUtilsTest.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,16 @@ describe('ReportUtils', () => {
11671167
expect(moneyRequestOptions.length).toBe(0);
11681168
});
11691169

1170+
it('its archived report', () => {
1171+
const report = {
1172+
...LHNTestUtils.getFakeReport(),
1173+
type: CONST.REPORT.TYPE.EXPENSE,
1174+
};
1175+
1176+
const moneyRequestOptions = temporary_getMoneyRequestOptions(report, undefined, [currentUserAccountID], true);
1177+
expect(moneyRequestOptions.length).toBe(0);
1178+
});
1179+
11701180
it('its trip room', () => {
11711181
const report = {
11721182
...LHNTestUtils.getFakeReport(),

0 commit comments

Comments
 (0)