Skip to content

Commit ed2b2ac

Browse files
authored
Merge pull request Expensify#69003 from lorretheboy/fix/68996
[CP Staging] Expense - When submitting track expense, receipt can be added via drag & drop but not saved
2 parents 8924709 + 54239bb commit ed2b2ac

3 files changed

Lines changed: 29 additions & 13 deletions

File tree

src/components/MoneyRequestConfirmationListFooter.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import usePrevious from '@hooks/usePrevious';
1212
import useThemeStyles from '@hooks/useThemeStyles';
1313
import {convertToDisplayString} from '@libs/CurrencyUtils';
1414
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
15-
import {isMovingTransactionFromTrackExpense} from '@libs/IOUUtils';
15+
import {shouldShowReceiptEmptyState} from '@libs/IOUUtils';
1616
import Navigation from '@libs/Navigation/Navigation';
1717
import {getDestinationForDisplay, getSubratesFields, getSubratesForDisplay, getTimeDifferenceIntervals, getTimeForDisplay} from '@libs/PerDiemRequestUtils';
18-
import {canSendInvoice, getPerDiemCustomUnit, isPaidGroupPolicy} from '@libs/PolicyUtils';
18+
import {canSendInvoice, getPerDiemCustomUnit} from '@libs/PolicyUtils';
1919
import type {ThumbnailAndImageURI} from '@libs/ReceiptUtils';
2020
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
2121
import {
@@ -332,12 +332,7 @@ function MoneyRequestConfirmationListFooter({
332332
// Determine if the merchant error should be displayed
333333
const shouldDisplayMerchantError = isMerchantRequired && (shouldDisplayFieldError || formError === 'iou.error.invalidMerchant') && isMerchantEmpty;
334334
const shouldDisplayDistanceRateError = formError === 'iou.error.invalidRate';
335-
// Determine when to show the receipt empty state:
336-
// - Show for submit or track expense types
337-
// - Hide for per diem requests
338-
// - Hide when submitting a track expense to a non-paid group policy (personal users)
339-
const shouldShowReceiptEmptyState =
340-
(iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.TRACK) && !isPerDiemRequest && (!isMovingTransactionFromTrackExpense(action) || isPaidGroupPolicy(policy));
335+
const showReceiptEmptyState = shouldShowReceiptEmptyState(iouType, action, policy, isPerDiemRequest);
341336
// The per diem custom unit
342337
const perDiemCustomUnit = getPerDiemCustomUnit(policy);
343338
const {
@@ -941,10 +936,10 @@ function MoneyRequestConfirmationListFooter({
941936
</>
942937
)}
943938
{!shouldShowMap && (
944-
<View style={!hasReceiptImageOrThumbnail && !shouldShowReceiptEmptyState ? undefined : styles.mv3}>
939+
<View style={!hasReceiptImageOrThumbnail && !showReceiptEmptyState ? undefined : styles.mv3}>
945940
{hasReceiptImageOrThumbnail
946941
? receiptThumbnailContent
947-
: shouldShowReceiptEmptyState && (
942+
: showReceiptEmptyState && (
948943
<ReceiptEmptyState
949944
onPress={() => {
950945
if (!transactionID) {

src/libs/IOUUtils.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import type {ValueOf} from 'type-fest';
22
import type {IOUAction, IOUType} from '@src/CONST';
33
import CONST from '@src/CONST';
44
import ROUTES from '@src/ROUTES';
5-
import type {OnyxInputOrEntry, PersonalDetails, Report} from '@src/types/onyx';
5+
import type {OnyxInputOrEntry, PersonalDetails, Policy, Report} from '@src/types/onyx';
66
import type {Attendee} from '@src/types/onyx/IOU';
7+
import type {SearchPolicy} from '@src/types/onyx/SearchResults';
78
import type {IOURequestType} from './actions/IOU';
89
import {getCurrencyUnit} from './CurrencyUtils';
910
import Navigation from './Navigation/Navigation';
1011
import Performance from './Performance';
12+
import {isPaidGroupPolicy} from './PolicyUtils';
1113
import {getReportTransactions} from './ReportUtils';
1214
import {getCurrency, getTagArrayFromName} from './TransactionUtils';
1315

@@ -183,6 +185,14 @@ function isMovingTransactionFromTrackExpense(action?: IOUAction) {
183185
return false;
184186
}
185187

188+
function shouldShowReceiptEmptyState(iouType: IOUType, action: IOUAction, policy: OnyxInputOrEntry<Policy> | SearchPolicy, isPerDiemRequest: boolean) {
189+
// Determine when to show the receipt empty state:
190+
// - Show for submit or track expense types
191+
// - Hide for per diem requests
192+
// - Hide when submitting a track expense to a non-paid group policy (personal users)
193+
return (iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.TRACK) && !isPerDiemRequest && (!isMovingTransactionFromTrackExpense(action) || isPaidGroupPolicy(policy));
194+
}
195+
186196
function shouldUseTransactionDraft(action: IOUAction | undefined, type?: IOUType) {
187197
return action === CONST.IOU.ACTION.CREATE || type === CONST.IOU.TYPE.SPLIT_EXPENSE || isMovingTransactionFromTrackExpense(action);
188198
}
@@ -216,4 +226,5 @@ export {
216226
updateIOUOwnerAndTotal,
217227
formatCurrentUserToAttendee,
218228
navigateToParticipantPage,
229+
shouldShowReceiptEmptyState,
219230
};

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ import {canUseTouchScreen} from '@libs/DeviceCapabilities';
2828
import {isLocalFile as isLocalFileFileUtils} from '@libs/fileDownload/FileUtils';
2929
import getCurrentPosition from '@libs/getCurrentPosition';
3030
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
31-
import {isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseIOUUtils, navigateToStartMoneyRequestStep, shouldUseTransactionDraft} from '@libs/IOUUtils';
31+
import {
32+
isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseIOUUtils,
33+
navigateToStartMoneyRequestStep,
34+
shouldShowReceiptEmptyState,
35+
shouldUseTransactionDraft,
36+
} from '@libs/IOUUtils';
3237
import Log from '@libs/Log';
3338
import navigateAfterInteraction from '@libs/Navigation/navigateAfterInteraction';
3439
import Navigation from '@libs/Navigation/Navigation';
@@ -1041,6 +1046,8 @@ function IOURequestStepConfirmation({
10411046
showPreviousTransaction();
10421047
};
10431048

1049+
const showReceiptEmptyState = shouldShowReceiptEmptyState(iouType, action, policy, isPerDiemRequest);
1050+
10441051
const shouldShowSmartScanFields =
10451052
!!transaction?.receipt?.isTestDriveReceipt || (isMovingTransactionFromTrackExpense ? transaction?.amount !== 0 : requestType !== CONST.IOU.REQUEST_TYPE.SCAN);
10461053

@@ -1050,7 +1057,10 @@ function IOURequestStepConfirmation({
10501057
testID={IOURequestStepConfirmation.displayName}
10511058
headerGapStyles={isDraggingOver ? [styles.dropWrapper] : []}
10521059
>
1053-
<DragAndDropProvider setIsDraggingOver={setIsDraggingOver}>
1060+
<DragAndDropProvider
1061+
setIsDraggingOver={setIsDraggingOver}
1062+
isDisabled={!showReceiptEmptyState}
1063+
>
10541064
<View style={styles.flex1}>
10551065
<HeaderWithBackButton
10561066
title={headerTitle}

0 commit comments

Comments
 (0)