From e1385cb4e30733bae3be7e7bdc36db03bf555438 Mon Sep 17 00:00:00 2001 From: Jan Nowakowski Date: Mon, 10 Mar 2025 12:27:19 +0100 Subject: [PATCH 01/54] Simplified actions on report header --- src/components/AvatarWithDisplayName.tsx | 16 +- src/components/MoneyReportHeader.tsx | 397 +++++++++++-------- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- src/libs/PolicyUtils.ts | 14 - src/libs/ReportPrimaryActionUtils.ts | 5 +- src/libs/ReportSecondaryActionUtils.ts | 26 +- tests/unit/ReportSecondaryActionUtilsTest.ts | 49 ++- 8 files changed, 288 insertions(+), 223 deletions(-) diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index a8b3e1d35119..6d4fd8cfdd4c 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -78,6 +78,7 @@ function AvatarWithDisplayName({policy, report, isAnonymous = false, size = CONS const subtitle = getChatRoomSubtitle(report, {isCreateExpenseFlow: true}); const parentNavigationSubtitleData = getParentNavigationSubtitle(report); const isMoneyRequestOrReport = isMoneyRequestReport(report) || isMoneyRequest(report) || isTrackExpenseReport(report) || isInvoiceReport(report); + const isSingleTransactionView = isMoneyRequest(report) || isTrackExpenseReport(report); const icons = getIcons(report, personalDetails, null, '', -1, policy, invoiceReceiverPolicy); const ownerPersonalDetails = getPersonalDetailsForAccountIDs(report?.ownerAccountID ? [report.ownerAccountID] : [], personalDetails); const displayNamesWithTooltips = getDisplayNamesWithTooltips(Object.values(ownerPersonalDetails), false); @@ -155,7 +156,18 @@ function AvatarWithDisplayName({policy, report, isAnonymous = false, size = CONS - + {isSingleTransactionView ? ( + + + + ) : ( - + )} {Object.keys(parentNavigationSubtitleData).length > 0 && ( => action.reportActionID === transactionThreadReport.parentReportActionID); }, [reportActions, transactionThreadReport?.parentReportActionID]); - const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { + const [transactions = []] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { selector: (_transactions) => reportTransactionsSelector(_transactions, moneyRequestReport?.reportID), initialValue: [], }); @@ -127,10 +138,9 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const [dismissedHoldUseExplanation, dismissedHoldUseExplanationResult] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {initialValue: true}); const isLoadingHoldUseExplained = isLoadingOnyxValue(dismissedHoldUseExplanationResult); - const {isPaidAnimationRunning, isApprovedAnimationRunning, stopAnimation, startAnimation, startApprovedAnimation} = usePaymentAnimations(); + const {isPaidAnimationRunning, isApprovedAnimationRunning, startAnimation, startApprovedAnimation} = usePaymentAnimations(); const styles = useThemeStyles(); const theme = useTheme(); - const [isDeleteRequestModalVisible, setIsDeleteRequestModalVisible] = useState(false); const {translate} = useLocalize(); const {isOffline} = useNetwork(); const {reimbursableSpend} = getMoneyRequestSpendBreakdown(moneyRequestReport); @@ -175,7 +185,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea ); const canIOUBePaid = useMemo(() => getCanIOUBePaid(), [getCanIOUBePaid]); - const canIOUBePaidAndApproved = useMemo(() => getCanIOUBePaid(false, false), [getCanIOUBePaid]); const onlyShowPayElsewhere = useMemo(() => !canIOUBePaid && getCanIOUBePaid(true), [canIOUBePaid, getCanIOUBePaid]); const shouldShowMarkAsCashButton = @@ -264,19 +273,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea } }; - const deleteTransaction = useCallback(() => { - if (requestParentReportAction) { - const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : undefined; - if (isTrackExpenseAction(requestParentReportAction)) { - navigateBackToAfterDelete.current = deleteTrackExpense(moneyRequestReport?.reportID, iouTransactionID, requestParentReportAction, true); - } else { - navigateBackToAfterDelete.current = deleteMoneyRequest(iouTransactionID, requestParentReportAction, true); - } - } - - setIsDeleteRequestModalVisible(false); - }, [moneyRequestReport?.reportID, requestParentReportAction, setIsDeleteRequestModalVisible]); - const markAsCash = useCallback(() => { if (!requestParentReportAction) { return; @@ -346,11 +342,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea [chatReport?.isOwnPolicyExpenseChat, policy?.harvesting?.enabled], ); - const shouldDuplicateButtonBeSuccess = useMemo( - () => isDuplicate && !shouldShowSettlementButton && !shouldShowExportIntegrationButton && !shouldShowSubmitButton && !shouldShowMarkAsCashButton, - [isDuplicate, shouldShowSettlementButton, shouldShowExportIntegrationButton, shouldShowSubmitButton, shouldShowMarkAsCashButton], - ); - useEffect(() => { // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing if (isLoadingHoldUseExplained || dismissedHoldUseExplanation || !isOnHold) { @@ -359,19 +350,215 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD.getRoute(Navigation.getReportRHPActiveRoute())); }, [dismissedHoldUseExplanation, isLoadingHoldUseExplained, isOnHold]); - useEffect(() => { - if (canDeleteRequest) { - return; + const unholdAction = () => { + const parentReportAction = getReportAction(moneyRequestReport?.parentReportID, moneyRequestReport?.parentReportActionID); + + const moneyRequestAction = transactionThreadReportID ? requestParentReportAction : parentReportAction; + if (!moneyRequestAction) { + throw new Error('boom'); } - setIsDeleteRequestModalVisible(false); - }, [canDeleteRequest]); + changeMoneyRequestHoldStatus(moneyRequestAction); + }; + + if (!moneyRequestReport) { + return null; + } + if (!policy) { + return null; + } + + const primaryAction = getPrimaryAction(moneyRequestReport, policy, transactions, violations); + + const primaryActions = { + [CONST.REPORT.PRIMARY_ACTIONS.SUBMIT]: ( +