diff --git a/src/pages/iou/request/step/IOURequestStepScan/ReceiptPreviews/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/ReceiptPreviews/index.tsx index 6d3a3d05093b..c407ebfce02a 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/ReceiptPreviews/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/ReceiptPreviews/index.tsx @@ -1,5 +1,5 @@ import {transactionDraftReceiptsSelector} from '@selectors/TransactionDraft'; -import React, {useEffect, useRef} from 'react'; +import React, {useEffect, useMemo, useRef} from 'react'; import {View} from 'react-native'; import type {FlatList as FlatListType} from 'react-native'; import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; @@ -15,6 +15,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import Navigation from '@libs/Navigation/Navigation'; +import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -25,7 +26,7 @@ type ReceiptWithTransactionID = Receipt & {transactionID: string}; type ReceiptPreviewsProps = { /** Submit method */ - submit: () => void; + submit: (files: ReceiptFile[]) => void; /** If the receipts preview should be shown */ isMultiScanEnabled: boolean; @@ -39,12 +40,15 @@ function ReceiptPreviews({submit, isMultiScanEnabled}: ReceiptPreviewsProps) { const isPreviewsVisible = useSharedValue(false); const previewsHeight = styles.receiptPlaceholder.height + styles.pv2.paddingVertical * 2; const previewItemWidth = styles.receiptPlaceholder.width + styles.receiptPlaceholder.marginRight; - const initialReceiptsAmount = (windowWidth - styles.ph4.paddingHorizontal * 2 - styles.singleAvatarMedium.width) / previewItemWidth; + const initialReceiptsAmount = useMemo( + () => (windowWidth - styles.ph4.paddingHorizontal * 2 - styles.singleAvatarMedium.width) / previewItemWidth, + [windowWidth, styles, previewItemWidth], + ); const [optimisticTransactionsReceipts] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, { selector: transactionDraftReceiptsSelector, canBeMissing: true, }); - const receipts = (() => { + const receipts = useMemo(() => { if (optimisticTransactionsReceipts && optimisticTransactionsReceipts.length >= initialReceiptsAmount) { return optimisticTransactionsReceipts; } @@ -53,7 +57,7 @@ function ReceiptPreviews({submit, isMultiScanEnabled}: ReceiptPreviewsProps) { receiptsWithPlaceholders.push(undefined); } return receiptsWithPlaceholders; - })(); + }, [initialReceiptsAmount, optimisticTransactionsReceipts]); const isScrollEnabled = optimisticTransactionsReceipts ? optimisticTransactionsReceipts.length >= receipts.length : false; const flatListRef = useRef>(null); const receiptsPhotosLength = optimisticTransactionsReceipts?.length ?? 0; @@ -113,6 +117,11 @@ function ReceiptPreviews({submit, isMultiScanEnabled}: ReceiptPreviewsProps) { }; }); + const submitReceipts = () => { + const transactionReceipts = (optimisticTransactionsReceipts ?? []).filter((receipt): receipt is ReceiptWithTransactionID & {source: string} => !!receipt.source); + submit(transactionReceipts); + }; + return ( @@ -135,7 +144,7 @@ function ReceiptPreviews({submit, isMultiScanEnabled}: ReceiptPreviewsProps) { innerStyles={[styles.singleAvatarMedium, styles.bgGreenSuccess]} icon={Expensicons.ArrowRight} iconFill={theme.white} - onPress={submit} + onPress={submitReceipts} /> diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 9afc29c70dd0..003ac1f2bc7e 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -667,12 +667,6 @@ function IOURequestStepScan({ [shouldSkipConfirmation, navigateToConfirmationStep, initialTransaction?.amount, iouType, shouldStartLocationPermissionFlow], ); - const submitMultiScanReceipts = () => { - const transactionIDs = new Set(optimisticTransactions?.map((transaction) => transaction?.transactionID)); - const validReceiptFiles = receiptFiles.filter((receiptFile) => transactionIDs.has(receiptFile.transactionID)); - submitReceipts(validReceiptFiles); - }; - const viewfinderLayout = useRef(null); const capturePhoto = useCallback(() => { @@ -987,7 +981,7 @@ function IOURequestStepScan({ {canUseMultiScan && ( )} diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 4939c8925e33..d17fdd2c3b31 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -849,12 +849,6 @@ function IOURequestStepScan({ }); }; - const submitMultiScanReceipts = () => { - const transactionIDs = new Set(optimisticTransactions?.map((transaction) => transaction?.transactionID)); - const validReceiptFiles = receiptFiles.filter((receiptFile) => transactionIDs.has(receiptFile.transactionID)); - submitReceipts(validReceiptFiles); - }; - const mobileCameraView = () => ( <> @@ -1028,7 +1022,7 @@ function IOURequestStepScan({ {canUseMultiScan && ( )}