From 42a1d03ad97f86955924334a2adaee8df245b79a Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 29 Jan 2026 23:41:47 +0700 Subject: [PATCH 1/7] Refactor ConfirmModal usage to useConfirmModal in Money Request pages --- src/components/MoneyRequestHeader.tsx | 106 +++++------ .../MoneyRequestReportActionsList.tsx | 175 +++++++++--------- .../MoneyRequestReceiptView.tsx | 40 ++-- .../MoneyRequestReportPreviewContent.tsx | 35 ++-- src/hooks/useSelectedTransactionsActions.ts | 10 +- 5 files changed, 183 insertions(+), 183 deletions(-) diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index 9a0ae0da116e3..0ff9ea0baa4b9 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -5,6 +5,7 @@ import React, {useCallback, useContext, useMemo, useState} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; +import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy'; import useDeleteTransactions from '@hooks/useDeleteTransactions'; @@ -68,7 +69,6 @@ import BrokenConnectionDescription from './BrokenConnectionDescription'; import Button from './Button'; import ButtonWithDropdownMenu from './ButtonWithDropdownMenu'; import type {DropdownOption} from './ButtonWithDropdownMenu/types'; -import ConfirmModal from './ConfirmModal'; import DecisionModal from './DecisionModal'; import {DelegateNoAccessContext} from './DelegateNoAccessModalProvider'; import HeaderWithBackButton from './HeaderWithBackButton'; @@ -78,6 +78,7 @@ import Icon from './Icon'; // eslint-disable-next-line no-restricted-imports import * as Expensicons from './Icon/Expensicons'; import LoadingBar from './LoadingBar'; +import {ModalActions} from './Modal/Global/ModalContext'; import type {MoneyRequestHeaderStatusBarProps} from './MoneyRequestHeaderStatusBar'; import MoneyRequestHeaderStatusBar from './MoneyRequestHeaderStatusBar'; import MoneyRequestReportTransactionsNavigation from './MoneyRequestReportView/MoneyRequestReportTransactionsNavigation'; @@ -123,13 +124,12 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre const transactionViolations = useTransactionViolations(transaction?.transactionID); const [policyRecentlyUsedCurrencies] = useOnyx(ONYXKEYS.RECENTLY_USED_CURRENCIES, {canBeMissing: true}); const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transaction?.transactionID ? [transaction.transactionID] : []); - const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); + const {showConfirmModal} = useConfirmModal(); const [downloadErrorModalVisible, setDownloadErrorModalVisible] = useState(false); const [isHoldEducationalModalVisible, setIsHoldEducationalModalVisible] = useState(false); const [rejectModalAction, setRejectModalAction] = useState | null>(null); - const [duplicateDistanceErrorModalVisible, setDuplicateDistanceErrorModalVisible] = useState(false); const [isDuplicateActive, temporarilyDisableDuplicateAction] = useThrottledButtonState(); const [dismissedRejectUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_REJECT_USE_EXPLANATION, {canBeMissing: true}); const [dismissedHoldUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {canBeMissing: true}); @@ -446,7 +446,12 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre value: CONST.REPORT.SECONDARY_ACTIONS.DUPLICATE, onSelected: () => { if (hasCustomUnitOutOfPolicyViolation) { - setDuplicateDistanceErrorModalVisible(true); + showConfirmModal({ + title: translate('common.duplicateExpense'), + prompt: translate('iou.correctDistanceRateError'), + confirmText: translate('common.buttonConfirm'), + shouldShowCancelButton: false, + }); return; } @@ -473,7 +478,47 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre icon: Expensicons.Trashcan, value: CONST.REPORT.SECONDARY_ACTIONS.DELETE, onSelected: () => { - setIsDeleteModalVisible(true); + showConfirmModal({ + title: translate('iou.deleteExpense', {count: 1}), + prompt: translate('iou.deleteConfirmation', {count: 1}), + confirmText: translate('common.delete'), + cancelText: translate('common.cancel'), + danger: true, + shouldEnableNewFocusManagement: true, + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + if (!parentReportAction || !transaction) { + throw new Error('Data missing'); + } + if (isTrackExpenseAction(parentReportAction)) { + deleteTrackExpense({ + chatReportID: report?.parentReportID, + chatReport: parentReport, + transactionID: transaction.transactionID, + reportAction: parentReportAction, + iouReport, + chatIOUReport, + transactions: duplicateTransactions, + violations: duplicateTransactionViolations, + isSingleTransactionView: true, + isChatReportArchived: isParentReportArchived, + isChatIOUReportArchived, + allTransactionViolationsParam: allTransactionViolations, + currentUserAccountID: accountID, + }); + } else { + deleteTransactions([transaction.transactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash, true); + removeTransaction(transaction.transactionID); + } + if (isInNarrowPaneModal) { + Navigation.navigateBackToLastSuperWideRHPScreen(); + return; + } + + onBackButtonPress(); + }); }, }, [CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT]: { @@ -578,57 +623,6 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre isVisible={downloadErrorModalVisible} onClose={() => setDownloadErrorModalVisible(false)} /> - { - setIsDeleteModalVisible(false); - if (!parentReportAction || !transaction) { - throw new Error('Data missing'); - } - if (isTrackExpenseAction(parentReportAction)) { - deleteTrackExpense({ - chatReportID: report?.parentReportID, - chatReport: parentReport, - transactionID: transaction.transactionID, - reportAction: parentReportAction, - iouReport, - chatIOUReport, - transactions: duplicateTransactions, - violations: duplicateTransactionViolations, - isSingleTransactionView: true, - isChatReportArchived: isParentReportArchived, - isChatIOUReportArchived, - allTransactionViolationsParam: allTransactionViolations, - currentUserAccountID: accountID, - }); - } else { - deleteTransactions([transaction.transactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash, true); - removeTransaction(transaction.transactionID); - } - if (isInNarrowPaneModal) { - Navigation.navigateBackToLastSuperWideRHPScreen(); - return; - } - - onBackButtonPress(); - }} - onCancel={() => setIsDeleteModalVisible(false)} - prompt={translate('iou.deleteConfirmation', {count: 1})} - confirmText={translate('common.delete')} - cancelText={translate('common.cancel')} - danger - shouldEnableNewFocusManagement - /> - setDuplicateDistanceErrorModalVisible(false)} - onCancel={() => setDuplicateDistanceErrorModalVisible(false)} - confirmText={translate('common.buttonConfirm')} - prompt={translate('iou.correctDistanceRateError')} - shouldShowCancelButton={false} - /> {!!rejectModalAction && ( { if (!report) { return; } - setIsExportWithTemplateModalVisible(true); - queueExportSearchWithTemplate({ - templateName, - templateType, - jsonQuery: '{}', - reportIDList: [report.reportID], - transactionIDList, - policyID: policy?.id, + showConfirmModal({ + title: translate('export.exportInProgress'), + prompt: translate('export.conciergeWillSend'), + confirmText: translate('common.buttonConfirm'), + shouldShowCancelButton: false, + }).then((result) => { + if (result.action === ModalActions.CONFIRM) { + clearSelectedTransactions(undefined, true); + queueExportSearchWithTemplate({ + templateName, + templateType, + jsonQuery: '{}', + reportIDList: [report.reportID], + transactionIDList, + policyID: policy?.id, + }); + } }); }, - [report, policy?.id], + [report, policy?.id, showConfirmModal, translate, clearSelectedTransactions], ); - const { - options: selectedTransactionsOptions, - handleDeleteTransactions, - isDeleteModalVisible, - hideDeleteModal, - } = useSelectedTransactionsActions({ + const onDeleteSelected = useCallback( + (handleDeleteTransactions: () => void) => { + showConfirmModal({ + title: translate('iou.deleteExpense', {count: selectedTransactionIDs.length}), + prompt: translate('iou.deleteConfirmation', {count: selectedTransactionIDs.length}), + confirmText: translate('common.delete'), + cancelText: translate('common.cancel'), + danger: true, + shouldEnableNewFocusManagement: true, + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + const shouldNavigateBack = transactions.filter((trans) => trans.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE).length === selectedTransactionIDs.length; + handleDeleteTransactions(); + if (shouldNavigateBack) { + const backToRoute = route.params?.backTo ?? (chatReport?.reportID ? ROUTES.REPORT_WITH_ID.getRoute(chatReport.reportID) : undefined); + Navigation.goBack(backToRoute); + } + }); + }, + [showConfirmModal, translate, selectedTransactionIDs.length, transactions, route.params?.backTo, chatReport?.reportID], + ); + + const {options: selectedTransactionsOptions} = useSelectedTransactionsActions({ report, reportActions, allTransactionsLength: transactions.length, @@ -219,6 +248,7 @@ function MoneyRequestReportActionsList({ onExportOffline: () => setOfflineModalVisible(true), policy, beginExportWithTemplate: (templateName, templateType, transactionIDList) => beginExportWithTemplate(templateName, templateType, transactionIDList), + onDeleteSelected, }); // We are reversing actions because in this View we are starting at the top and don't use Inverted list @@ -674,67 +704,46 @@ function MoneyRequestReportActionsList({ ref={wrapperViewRef} > {shouldUseNarrowLayout && isMobileSelectionModeEnabled && ( - <> - - null} - options={selectedTransactionsOptions} - customText={translate('workspace.common.selected', {count: selectedTransactionIDs.length})} - isSplitButton={false} - shouldAlwaysShowDropdownMenu - wrapperStyle={[styles.w100, styles.ph5]} - /> - - 0 && selectedTransactionIDs.length !== transactionsWithoutPendingDelete.length} - onPress={() => { - if (selectedTransactionIDs.length !== 0) { - clearSelectedTransactions(true); - } else { - setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); - } - }} - /> - { - if (isSelectAllChecked) { - clearSelectedTransactions(true); - } else { - setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); - } - }} - accessibilityLabel={translate('workspace.people.selectAll')} - role="button" - accessibilityState={{checked: isSelectAllChecked}} - dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} - > - {translate('workspace.people.selectAll')} - - - - { - const shouldNavigateBack = - transactions.filter((trans) => trans.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE).length === selectedTransactionIDs.length; - handleDeleteTransactions(); - if (shouldNavigateBack) { - const backToRoute = route.params?.backTo ?? (chatReport?.reportID ? ROUTES.REPORT_WITH_ID.getRoute(chatReport.reportID) : undefined); - Navigation.goBack(backToRoute); - } - }} - onCancel={hideDeleteModal} - prompt={translate('iou.deleteConfirmation', {count: selectedTransactionIDs.length})} - confirmText={translate('common.delete')} - cancelText={translate('common.cancel')} - danger - shouldEnableNewFocusManagement + + null} + options={selectedTransactionsOptions} + customText={translate('workspace.common.selected', {count: selectedTransactionIDs.length})} + isSplitButton={false} + shouldAlwaysShowDropdownMenu + wrapperStyle={[styles.w100, styles.ph5]} /> - + + 0 && selectedTransactionIDs.length !== transactionsWithoutPendingDelete.length} + onPress={() => { + if (selectedTransactionIDs.length !== 0) { + clearSelectedTransactions(true); + } else { + setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); + } + }} + /> + { + if (isSelectAllChecked) { + clearSelectedTransactions(true); + } else { + setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); + } + }} + accessibilityLabel={translate('workspace.people.selectAll')} + role="button" + accessibilityState={{checked: isSelectAllChecked}} + dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} + > + {translate('workspace.people.selectAll')} + + + )} setOfflineModalVisible(false)} /> - { - setIsExportWithTemplateModalVisible(false); - clearSelectedTransactions(undefined, true); - }} - onCancel={() => setIsExportWithTemplateModalVisible(false)} - isVisible={isExportWithTemplateModalVisible} - title={translate('export.exportInProgress')} - prompt={translate('export.conciergeWillSend')} - confirmText={translate('common.buttonConfirm')} - shouldShowCancelButton={false} - /> ); } diff --git a/src/components/ReportActionItem/MoneyRequestReceiptView.tsx b/src/components/ReportActionItem/MoneyRequestReceiptView.tsx index 91094bddf08db..d8c1da35349c7 100644 --- a/src/components/ReportActionItem/MoneyRequestReceiptView.tsx +++ b/src/components/ReportActionItem/MoneyRequestReceiptView.tsx @@ -3,11 +3,12 @@ import React, {useMemo, useState} from 'react'; import {View} from 'react-native'; import type {StyleProp, ViewStyle} from 'react-native'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; -import ConfirmModal from '@components/ConfirmModal'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ReceiptAudit, {ReceiptAuditMessages} from '@components/ReceiptAudit'; import ReceiptEmptyState from '@components/ReceiptEmptyState'; import useActiveRoute from '@hooks/useActiveRoute'; +import useConfirmModal from '@hooks/useConfirmModal'; import useEnvironment from '@hooks/useEnvironment'; import useGetIOUReportFromReportAction from '@hooks/useGetIOUReportFromReportAction'; import useLocalize from '@hooks/useLocalize'; @@ -207,7 +208,7 @@ function MoneyRequestReceiptView({ const errors = useMemo(() => ({...errorsWithoutReportCreation, ...reportCreationError}), [errorsWithoutReportCreation, reportCreationError]); const showReceiptErrorWithEmptyState = shouldShowReceiptEmptyState && !hasReceipt && !isEmptyObject(errors); - const [showConfirmDismissReceiptError, setShowConfirmDismissReceiptError] = useState(false); + const {showConfirmModal} = useConfirmModal(); const transactionAndReportActionErrors = useMemo( () => ({ @@ -321,11 +322,24 @@ function MoneyRequestReceiptView({ const errorMessages = mapValues(Object.fromEntries(errorEntries), (error) => error); const hasReceiptError = Object.values(errorMessages).some((error) => isReceiptError(error)); - if (hasReceiptError) { - setShowConfirmDismissReceiptError(true); - } else { + if (!hasReceiptError) { dismissReceiptError(); + return; } + + showConfirmModal({ + title: translate('iou.dismissReceiptError'), + prompt: translate('iou.dismissReceiptErrorConfirmation'), + confirmText: translate('common.dismiss'), + cancelText: translate('common.cancel'), + shouldShowCancelButton: true, + danger: true, + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + dismissReceiptError(); + }); }} dismissError={dismissReceiptError} style={[shouldShowAuditMessage ? styles.mt3 : styles.mv3, !showReceiptErrorWithEmptyState && styles.flex1]} @@ -359,22 +373,6 @@ function MoneyRequestReceiptView({ )} {!shouldShowReceiptEmptyState && !hasReceipt && } {!!shouldShowAuditMessage && !hasReceipt && receiptAuditMessagesRow} - { - dismissReceiptError(); - setShowConfirmDismissReceiptError(false); - }} - onCancel={() => { - setShowConfirmDismissReceiptError(false); - }} - title={translate('iou.dismissReceiptError')} - prompt={translate('iou.dismissReceiptErrorConfirmation')} - confirmText={translate('common.dismiss')} - cancelText={translate('common.cancel')} - shouldShowCancelButton - danger - /> ); } diff --git a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx index 95dbf469986f9..f8e37fa31ea0b 100644 --- a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx @@ -8,9 +8,9 @@ import AnimatedSubmitButton from '@components/AnimatedSubmitButton'; import Button from '@components/Button'; import {getButtonRole} from '@components/Button/utils'; import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu'; -import ConfirmModal from '@components/ConfirmModal'; import {DelegateNoAccessContext} from '@components/DelegateNoAccessModalProvider'; import Icon from '@components/Icon'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import MoneyReportHeaderStatusBarSkeleton from '@components/MoneyReportHeaderStatusBarSkeleton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import {PressableWithFeedback} from '@components/Pressable'; @@ -22,6 +22,7 @@ import AnimatedSettlementButton from '@components/SettlementButton/AnimatedSettl import type {PaymentActionParams} from '@components/SettlementButton/types'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; +import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -163,10 +164,10 @@ function MoneyRequestReportPreviewContent({ const {isPaidAnimationRunning, isApprovedAnimationRunning, isSubmittingAnimationRunning, stopAnimation, startAnimation, startApprovedAnimation, startSubmittingAnimation} = usePaymentAnimations(); + const {showConfirmModal} = useConfirmModal(); const [isHoldMenuVisible, setIsHoldMenuVisible] = useState(false); const [requestType, setRequestType] = useState(); const [paymentType, setPaymentType] = useState(); - const [isDEWModalVisible, setIsDEWModalVisible] = useState(false); const isIouReportArchived = useReportIsArchived(iouReportID); const isChatReportArchived = useReportIsArchived(chatReport?.reportID); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true}); @@ -298,9 +299,23 @@ function MoneyRequestReportPreviewContent({ ], ); + const showDEWModal = useCallback(() => { + showConfirmModal({ + title: translate('customApprovalWorkflow.title'), + prompt: translate('customApprovalWorkflow.description'), + confirmText: translate('customApprovalWorkflow.goToExpensifyClassic'), + shouldShowCancelButton: false, + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + openOldDotLink(CONST.OLDDOT_URLS.INBOX); + }); + }, [showConfirmModal, translate]); + const confirmApproval = () => { if (hasDynamicExternalWorkflow(policy) && !isDEWBetaEnabled) { - setIsDEWModalVisible(true); + showDEWModal(); return; } setRequestType(CONST.IOU.REPORT_ACTION_TYPE.APPROVE); @@ -588,7 +603,7 @@ function MoneyRequestReportPreviewContent({ text={translate('common.submit')} onPress={() => { if (hasDynamicExternalWorkflow(policy) && !isDEWBetaEnabled) { - setIsDEWModalVisible(true); + showDEWModal(); return; } startSubmittingAnimation(); @@ -904,18 +919,6 @@ function MoneyRequestReportPreviewContent({ /> )} - { - setIsDEWModalVisible(false); - openOldDotLink(CONST.OLDDOT_URLS.INBOX); - }} - onCancel={() => setIsDEWModalVisible(false)} - prompt={translate('customApprovalWorkflow.description')} - confirmText={translate('customApprovalWorkflow.goToExpensifyClassic')} - shouldShowCancelButton={false} - /> ); } diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 90628c3cb07ee..2d0db6976907a 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -57,6 +57,7 @@ function useSelectedTransactionsActions({ beginExportWithTemplate, isOnSearch, reportLevelActions, + onDeleteSelected, }: { report?: Report; reportActions: ReportAction[]; @@ -68,6 +69,7 @@ function useSelectedTransactionsActions({ beginExportWithTemplate: (templateName: string, templateType: string, transactionIDList: string[], policyID?: string) => void; isOnSearch?: boolean; reportLevelActions?: Array & Pick>; + onDeleteSelected?: (handleDeleteTransactions: () => void) => void | Promise; }) { const {isOffline} = useNetworkWithOfflineStatus(); const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext); @@ -385,7 +387,13 @@ function useSelectedTransactionsActions({ text: translate('common.delete'), icon: expensifyIcons.Trashcan, value: CONST.REPORT.SECONDARY_ACTIONS.DELETE, - onSelected: showDeleteModal, + onSelected: () => { + if (onDeleteSelected) { + onDeleteSelected(handleDeleteTransactions); + } else { + showDeleteModal(); + } + }, }); } computedOptions = options; From c9c9002ed8c7a680c033f89743613db43fde6203 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 30 Jan 2026 00:14:18 +0700 Subject: [PATCH 2/7] remove unused variable --- src/hooks/useSelectedTransactionsActions.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 2a4ccf667443d..ae670f593a6fd 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -56,7 +56,6 @@ function useSelectedTransactionsActions({ policy, beginExportWithTemplate, isOnSearch, - reportLevelActions, onDeleteSelected, }: { report?: Report; @@ -68,7 +67,6 @@ function useSelectedTransactionsActions({ policy?: Policy; beginExportWithTemplate: (templateName: string, templateType: string, transactionIDList: string[], policyID?: string) => void; isOnSearch?: boolean; - reportLevelActions?: Array & Pick>; onDeleteSelected?: (handleDeleteTransactions: () => void) => void | Promise; }) { const {isOffline} = useNetworkWithOfflineStatus(); From 60ceddb80f26964c7f43e577a8fbc533c5e3fa79 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 3 Feb 2026 12:19:48 +0700 Subject: [PATCH 3/7] queue export immediately --- .../MoneyRequestReportActionsList.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index e26a269732622..848c77716c320 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -201,6 +201,15 @@ function MoneyRequestReportActionsList({ return; } + queueExportSearchWithTemplate({ + templateName, + templateType, + jsonQuery: '{}', + reportIDList: [report.reportID], + transactionIDList, + policyID: policy?.id, + }); + showConfirmModal({ title: translate('export.exportInProgress'), prompt: translate('export.conciergeWillSend'), @@ -209,18 +218,10 @@ function MoneyRequestReportActionsList({ }).then((result) => { if (result.action === ModalActions.CONFIRM) { clearSelectedTransactions(undefined, true); - queueExportSearchWithTemplate({ - templateName, - templateType, - jsonQuery: '{}', - reportIDList: [report.reportID], - transactionIDList, - policyID: policy?.id, - }); } }); }, - [report, policy?.id, showConfirmModal, translate, clearSelectedTransactions], + [isOffline, report, policy?.id, showConfirmModal, translate, clearSelectedTransactions], ); const onDeleteSelected = useCallback( From 019c3dec08645e03ed9472c58c6c8c1c652c3288 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 3 Feb 2026 12:20:54 +0700 Subject: [PATCH 4/7] update type import --- .../MoneyRequestReportView/MoneyRequestReportActionsList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 848c77716c320..71f8fc0c86f4b 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -70,6 +70,7 @@ import {openReport, readNewestAction, subscribeToNewActionEvent} from '@userActi import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type {Route} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type * as OnyxTypes from '@src/types/onyx'; import type {PendingAction} from '@src/types/onyx/OnyxCommon'; From 6b94b22ea6752556081b4f48ca0c621186ca2c42 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 3 Feb 2026 15:25:22 +0700 Subject: [PATCH 5/7] add sentryLabel --- .../MoneyRequestReportView/MoneyRequestReportActionsList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 71f8fc0c86f4b..035d87f28a10e 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -781,6 +781,7 @@ function MoneyRequestReportActionsList({ role="button" accessibilityState={{checked: isSelectAllChecked}} dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} + sentryLabel={CONST.SENTRY_LABEL.REPORT.MONEY_REQUEST_REPORT_ACTIONS_LIST_SELECT_ALL} > {translate('workspace.people.selectAll')} From 02b79d77e400901b78649b160c076e27cccc4daa Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 11 Feb 2026 14:44:40 +0700 Subject: [PATCH 6/7] fix duplicate select all button --- .../MoneyRequestReportActionsList.tsx | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 35095c58bd2e2..9689ef161fa14 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -756,37 +756,6 @@ function MoneyRequestReportActionsList({ {translate('workspace.people.selectAll')} - - 0 && selectedTransactionIDs.length !== transactionsWithoutPendingDelete.length} - onPress={() => { - if (selectedTransactionIDs.length !== 0) { - clearSelectedTransactions(true); - } else { - setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); - } - }} - /> - { - if (isSelectAllChecked) { - clearSelectedTransactions(true); - } else { - setSelectedTransactions(transactionsWithoutPendingDelete.map((t) => t.transactionID)); - } - }} - accessibilityLabel={translate('workspace.people.selectAll')} - role="button" - accessibilityState={{checked: isSelectAllChecked}} - dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} - sentryLabel={CONST.SENTRY_LABEL.REPORT.MONEY_REQUEST_REPORT_ACTIONS_LIST_SELECT_ALL} - > - {translate('workspace.people.selectAll')} - - )} From 9d25f04f14981aaae6b87c12426300349b838637 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 17 Feb 2026 23:07:07 +0700 Subject: [PATCH 7/7] fix ts error --- src/components/MoneyRequestHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index f008249661984..9d2d1fd4dc9ef 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -460,7 +460,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre if (hasCustomUnitOutOfPolicyViolation) { showConfirmModal({ title: translate('common.duplicateExpense'), - prompt: translate('iou.correctDistanceRateError'), + prompt: translate('iou.correctRateError'), confirmText: translate('common.buttonConfirm'), shouldShowCancelButton: false, });