From a7b4658e62ecaefbeb6dbe4159a6da1d8068c53c Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 8 Jul 2025 14:48:29 +0700 Subject: [PATCH 1/4] Multi scan send button doesn't register the first tap --- .../request/step/IOURequestStepScan/index.tsx | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 51c0796482c99..ae0424e80196d 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -1,7 +1,8 @@ import {useIsFocused} from '@react-navigation/native'; import React, {useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState} from 'react'; import {ActivityIndicator, InteractionManager, PanResponder, PixelRatio, StyleSheet, View} from 'react-native'; -import type {OnyxEntry} from 'react-native-onyx'; +import type {NullishDeep, OnyxEntry} from 'react-native-onyx'; +import Onyx from 'react-native-onyx'; import {RESULTS} from 'react-native-permissions'; import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; import type Webcam from 'react-webcam'; @@ -69,6 +70,7 @@ import {buildOptimisticTransactionAndCreateDraft, removeDraftTransactions, remov import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type * as OnyxTypes from '@src/types/onyx'; import type {Policy} from '@src/types/onyx'; import type {Participant} from '@src/types/onyx/IOU'; import type Transaction from '@src/types/onyx/Transaction'; @@ -404,6 +406,19 @@ function IOURequestStepScan({ [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions], ); + const setMultipleMoneyRequestParticipantsFromReport = (transactionIDs: string[], reportValue: OnyxEntry) => { + const participants = getMoneyRequestParticipantsFromReport(reportValue); + const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; + transactionIDs.forEach((transactionID) => { + updatedTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] = { + participants, + participantsAutoAssigned: true, + }; + }); + // eslint-disable-next-line rulesdir/prefer-actions-set-data + return Onyx.mergeCollection(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, updatedTransactions); + }; + const navigateToConfirmationStep = useCallback( (files: ReceiptFile[], locationPermissionGranted = false, isTestTransaction = false) => { if (backTo) { @@ -497,9 +512,8 @@ function IOURequestStepScan({ createTransaction(files, participant); return; } - - const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, report)); - Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage()); + const transactionIDs = files.map((receiptFile) => receiptFile.transactionID); + setMultipleMoneyRequestParticipantsFromReport(transactionIDs, report).then(() => navigateToConfirmationPage()); return; } From 96e779e08f2291fba601427b684227d2d1d373a1 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 9 Jul 2025 03:17:18 +0700 Subject: [PATCH 2/4] create a new iou utils function --- src/libs/IOUUtils.ts | 18 +++++++++++++++++- .../request/step/IOURequestStepScan/index.tsx | 19 ++----------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index e7b50ef35c791..bffa767639ed0 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -1,11 +1,13 @@ import Onyx from 'react-native-onyx'; +import type {NullishDeep, OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import type {IOUAction, IOUType} from '@src/CONST'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {OnyxInputOrEntry, PersonalDetails, Report} from '@src/types/onyx'; +import type {OnyxInputOrEntry, PersonalDetails, Report, Transaction} from '@src/types/onyx'; import type {Attendee} from '@src/types/onyx/IOU'; +import {getMoneyRequestParticipantsFromReport} from './actions/IOU'; import type {IOURequestType} from './actions/IOU'; import {getCurrencyUnit} from './CurrencyUtils'; import DateUtils from './DateUtils'; @@ -216,6 +218,19 @@ function shouldStartLocationPermissionFlow() { ); } +function setMultipleMoneyRequestParticipantsFromReport(transactionIDs: string[], reportValue: OnyxEntry) { + const participants = getMoneyRequestParticipantsFromReport(reportValue); + const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; + transactionIDs.forEach((transactionID) => { + updatedTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] = { + participants, + participantsAutoAssigned: true, + }; + }); + // eslint-disable-next-line rulesdir/prefer-actions-set-data + return Onyx.mergeCollection(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, updatedTransactions); +} + export { calculateAmount, insertTagIntoTransactionTagsString, @@ -228,4 +243,5 @@ export { formatCurrentUserToAttendee, shouldStartLocationPermissionFlow, navigateToParticipantPage, + setMultipleMoneyRequestParticipantsFromReport, }; diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index ae0424e80196d..2b5220e63c594 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -1,8 +1,7 @@ import {useIsFocused} from '@react-navigation/native'; import React, {useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState} from 'react'; import {ActivityIndicator, InteractionManager, PanResponder, PixelRatio, StyleSheet, View} from 'react-native'; -import type {NullishDeep, OnyxEntry} from 'react-native-onyx'; -import Onyx from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; import {RESULTS} from 'react-native-permissions'; import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; import type Webcam from 'react-webcam'; @@ -40,7 +39,7 @@ import {dismissProductTraining} from '@libs/actions/Welcome'; import {isMobile, isMobileWebKit} from '@libs/Browser'; import {base64ToFile, isLocalFile as isLocalFileFileUtils} from '@libs/fileDownload/FileUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; -import {navigateToParticipantPage, shouldStartLocationPermissionFlow} from '@libs/IOUUtils'; +import {navigateToParticipantPage, setMultipleMoneyRequestParticipantsFromReport, shouldStartLocationPermissionFlow} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; @@ -70,7 +69,6 @@ import {buildOptimisticTransactionAndCreateDraft, removeDraftTransactions, remov import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type * as OnyxTypes from '@src/types/onyx'; import type {Policy} from '@src/types/onyx'; import type {Participant} from '@src/types/onyx/IOU'; import type Transaction from '@src/types/onyx/Transaction'; @@ -406,19 +404,6 @@ function IOURequestStepScan({ [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions], ); - const setMultipleMoneyRequestParticipantsFromReport = (transactionIDs: string[], reportValue: OnyxEntry) => { - const participants = getMoneyRequestParticipantsFromReport(reportValue); - const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; - transactionIDs.forEach((transactionID) => { - updatedTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] = { - participants, - participantsAutoAssigned: true, - }; - }); - // eslint-disable-next-line rulesdir/prefer-actions-set-data - return Onyx.mergeCollection(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, updatedTransactions); - }; - const navigateToConfirmationStep = useCallback( (files: ReceiptFile[], locationPermissionGranted = false, isTestTransaction = false) => { if (backTo) { From c30ad40194328778b1775c8a81c61c9d69719eae Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 10 Jul 2025 17:07:30 +0700 Subject: [PATCH 3/4] change the utils file --- src/libs/IOUUtils.ts | 18 +----------------- src/libs/actions/IOU.ts | 13 +++++++++++++ .../request/step/IOURequestStepScan/index.tsx | 3 ++- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index bffa767639ed0..e7b50ef35c791 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -1,13 +1,11 @@ import Onyx from 'react-native-onyx'; -import type {NullishDeep, OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import type {IOUAction, IOUType} from '@src/CONST'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {OnyxInputOrEntry, PersonalDetails, Report, Transaction} from '@src/types/onyx'; +import type {OnyxInputOrEntry, PersonalDetails, Report} from '@src/types/onyx'; import type {Attendee} from '@src/types/onyx/IOU'; -import {getMoneyRequestParticipantsFromReport} from './actions/IOU'; import type {IOURequestType} from './actions/IOU'; import {getCurrencyUnit} from './CurrencyUtils'; import DateUtils from './DateUtils'; @@ -218,19 +216,6 @@ function shouldStartLocationPermissionFlow() { ); } -function setMultipleMoneyRequestParticipantsFromReport(transactionIDs: string[], reportValue: OnyxEntry) { - const participants = getMoneyRequestParticipantsFromReport(reportValue); - const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; - transactionIDs.forEach((transactionID) => { - updatedTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] = { - participants, - participantsAutoAssigned: true, - }; - }); - // eslint-disable-next-line rulesdir/prefer-actions-set-data - return Onyx.mergeCollection(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, updatedTransactions); -} - export { calculateAmount, insertTagIntoTransactionTagsString, @@ -243,5 +228,4 @@ export { formatCurrentUserToAttendee, shouldStartLocationPermissionFlow, navigateToParticipantPage, - setMultipleMoneyRequestParticipantsFromReport, }; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 0f996fbe8c029..62402f89a41fc 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -11188,6 +11188,18 @@ function updateLastLocationPermissionPrompt() { Onyx.set(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT, new Date().toISOString()); } +function setMultipleMoneyRequestParticipantsFromReport(transactionIDs: string[], reportValue: OnyxEntry) { + const participants = getMoneyRequestParticipantsFromReport(reportValue); + const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; + transactionIDs.forEach((transactionID) => { + updatedTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] = { + participants, + participantsAutoAssigned: true, + }; + }); + return Onyx.mergeCollection(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, updatedTransactions); +} + /** Instead of merging the duplicates, it updates the transaction we want to keep and puts the others on hold without deleting them */ function resolveDuplicates(params: MergeDuplicatesParams) { if (!params.transactionID) { @@ -11892,6 +11904,7 @@ export { setMoneyRequestParticipantsFromReport, getMoneyRequestParticipantsFromReport, setMoneyRequestPendingFields, + setMultipleMoneyRequestParticipantsFromReport, setMoneyRequestReceipt, setMoneyRequestTag, setMoneyRequestTaxAmount, diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 34f5501264ab8..28addfa2ca32c 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -39,7 +39,7 @@ import {dismissProductTraining} from '@libs/actions/Welcome'; import {isMobile, isMobileWebKit} from '@libs/Browser'; import {base64ToFile, isLocalFile as isLocalFileFileUtils} from '@libs/fileDownload/FileUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; -import {navigateToParticipantPage, setMultipleMoneyRequestParticipantsFromReport, shouldStartLocationPermissionFlow} from '@libs/IOUUtils'; +import {navigateToParticipantPage, shouldStartLocationPermissionFlow} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; @@ -61,6 +61,7 @@ import { setMoneyRequestParticipants, setMoneyRequestParticipantsFromReport, setMoneyRequestReceipt, + setMultipleMoneyRequestParticipantsFromReport, startSplitBill, trackExpense, updateLastLocationPermissionPrompt, From 2d492cafcd77a8e428c3c43e260af75f91a01e7f Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 10 Jul 2025 17:16:31 +0700 Subject: [PATCH 4/4] fix lint --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 62402f89a41fc..fb4c56a05a72f 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -11188,7 +11188,7 @@ function updateLastLocationPermissionPrompt() { Onyx.set(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT, new Date().toISOString()); } -function setMultipleMoneyRequestParticipantsFromReport(transactionIDs: string[], reportValue: OnyxEntry) { +function setMultipleMoneyRequestParticipantsFromReport(transactionIDs: string[], reportValue: OnyxEntry) { const participants = getMoneyRequestParticipantsFromReport(reportValue); const updatedTransactions: Record<`${typeof ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${string}`, NullishDeep> = {}; transactionIDs.forEach((transactionID) => {