From ec047d87a912b61c213bc9316077b6214c5e23f0 Mon Sep 17 00:00:00 2001 From: daledah Date: Mon, 31 Mar 2025 11:34:46 +0700 Subject: [PATCH 01/11] fix: remove markdown symbol in report header and report details page --- src/components/DisplayNames/index.native.tsx | 3 ++- src/components/DisplayNames/index.tsx | 3 ++- src/pages/ReportDetailsPage.tsx | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/DisplayNames/index.native.tsx b/src/components/DisplayNames/index.native.tsx index 3ca810aa4d36..69068aa83cdd 100644 --- a/src/components/DisplayNames/index.native.tsx +++ b/src/components/DisplayNames/index.native.tsx @@ -1,6 +1,7 @@ import React from 'react'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import Parser from '@libs/Parser'; import type DisplayNamesProps from './types'; // As we don't have to show tooltips of the Native platform so we simply render the full display names list. @@ -13,7 +14,7 @@ function DisplayNames({accessibilityLabel, fullTitle, textStyles = [], numberOfL numberOfLines={numberOfLines} testID={DisplayNames.displayName} > - {fullTitle || translate('common.hidden')} + {Parser.htmlToText(fullTitle) || translate('common.hidden')} {renderAdditionalText?.()} ); diff --git a/src/components/DisplayNames/index.tsx b/src/components/DisplayNames/index.tsx index 43e29af6e3c0..d74c776b8dad 100644 --- a/src/components/DisplayNames/index.tsx +++ b/src/components/DisplayNames/index.tsx @@ -1,12 +1,13 @@ import React from 'react'; import useLocalize from '@hooks/useLocalize'; +import Parser from '@libs/Parser'; import DisplayNamesWithoutTooltip from './DisplayNamesWithoutTooltip'; import DisplayNamesWithToolTip from './DisplayNamesWithTooltip'; import type DisplayNamesProps from './types'; function DisplayNames({fullTitle, tooltipEnabled, textStyles, numberOfLines, shouldAddEllipsis, shouldUseFullTitle, displayNamesWithTooltips, renderAdditionalText}: DisplayNamesProps) { const {translate} = useLocalize(); - const title = fullTitle || translate('common.hidden'); + const title = Parser.htmlToText(fullTitle) || translate('common.hidden'); if (!tooltipEnabled) { return ( diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index ee01f9aa7e93..ba01f3e8c5aa 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -41,6 +41,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {ReportDetailsNavigatorParamList} from '@libs/Navigation/types'; import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getConnectedIntegration, isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils'; import {getOneTransactionThreadReportID, getOriginalMessage, getTrackExpenseActionableWhisper, isDeletedAction, isMoneyRequestAction, isTrackExpenseAction} from '@libs/ReportActionsUtils'; import { @@ -373,7 +374,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const shouldShowLeaveButton = canLeaveChat(report, policy); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, session?.email) && !policy?.isJoinRequestPending; - const reportName = getReportName(report); + const reportName = Parser.htmlToText(getReportName(report)); const additionalRoomDetails = (isPolicyExpenseChat && !!report?.isOwnPolicyExpenseChat) || isExpenseReportUtil(report) || isPolicyExpenseChat || isInvoiceRoom From 939b86641c54b306f6c2fa74b691718c9502ab9f Mon Sep 17 00:00:00 2001 From: daledah Date: Tue, 8 Apr 2025 18:49:25 +0700 Subject: [PATCH 02/11] fix: remove markdown symbol in money request preview --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- src/components/ReportActionItem/ReportPreview.tsx | 6 +++++- .../TransactionPreview/TransactionPreviewContent.tsx | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index e2388ead0dd4..c12607df1523 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -199,7 +199,7 @@ function MoneyRequestPreviewContent({ let merchantOrDescription = requestMerchant; if (!shouldShowMerchant) { - merchantOrDescription = description || ''; + merchantOrDescription = Parser.htmlToText(Parser.replace(description || '')); } const receiptImages = [{...getThumbnailAndImageURIs(transaction), transaction}]; diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 047f8f3717f9..f63045a706e0 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -447,7 +447,11 @@ function ReportPreview({ return {supportText: truncate(formattedMerchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; } if (formattedDescription ?? moneyRequestComment) { - return {supportText: truncate(StringUtils.lineBreaksToSpaces(formattedDescription ?? moneyRequestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH})}; + return { + supportText: truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToText(Parser.replace(formattedDescription ?? moneyRequestComment))), { + length: CONST.REQUEST_PREVIEW.MAX_LENGTH, + }), + }; } if (numberOfRequests === 1) { diff --git a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx index 0b79f75f9cbc..a05cca4dedfd 100644 --- a/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx +++ b/src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx @@ -20,6 +20,7 @@ import {convertToDisplayString} from '@libs/CurrencyUtils'; import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import {calculateAmount} from '@libs/IOUUtils'; import {getAvatarsForAccountIDs} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getCleanedTagName} from '@libs/PolicyUtils'; import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils'; import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; @@ -137,7 +138,7 @@ function TransactionPreviewContent({ const shouldShowCategoryOrTag = shouldShowCategory || shouldShowTag; const shouldShowMerchantOrDescription = shouldShowDescription || shouldShowMerchant; const shouldShowIOUHeader = !!from && !!to; - const description = truncate(StringUtils.lineBreaksToSpaces(requestComment), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); + const description = truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToText(requestComment ?? '')), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = hasReceiptTransactionUtils(transaction); const isApproved = isReportApproved({report: iouReport}); From b29eb07d10802cc08a9d1d73022f022a1d4de547 Mon Sep 17 00:00:00 2001 From: daledah Date: Wed, 9 Apr 2025 16:37:00 +0700 Subject: [PATCH 03/11] fix: remove markdown symbol in duplicate review description --- src/pages/TransactionDuplicate/ReviewDescription.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/TransactionDuplicate/ReviewDescription.tsx b/src/pages/TransactionDuplicate/ReviewDescription.tsx index ad6d25960cb4..257982fa7a38 100644 --- a/src/pages/TransactionDuplicate/ReviewDescription.tsx +++ b/src/pages/TransactionDuplicate/ReviewDescription.tsx @@ -8,6 +8,7 @@ import useReviewDuplicatesNavigation from '@hooks/useReviewDuplicatesNavigation' import {setReviewDuplicatesKey} from '@libs/actions/Transaction'; import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; +import Parser from '@libs/Parser'; import * as TransactionUtils from '@libs/TransactionUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -33,7 +34,7 @@ function ReviewDescription() { !description?.comment ? {text: translate('violations.none'), value: ''} : { - text: description.comment, + text: Parser.htmlToText(description.comment), value: description.comment, }, ), From 3fae7b866587e4228c46bccfb7061deeec997b0d Mon Sep 17 00:00:00 2001 From: daledah Date: Wed, 9 Apr 2025 16:40:09 +0700 Subject: [PATCH 04/11] fix: lint --- src/pages/TransactionDuplicate/ReviewDescription.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/TransactionDuplicate/ReviewDescription.tsx b/src/pages/TransactionDuplicate/ReviewDescription.tsx index 257982fa7a38..90e1a8ffc786 100644 --- a/src/pages/TransactionDuplicate/ReviewDescription.tsx +++ b/src/pages/TransactionDuplicate/ReviewDescription.tsx @@ -9,7 +9,7 @@ import {setReviewDuplicatesKey} from '@libs/actions/Transaction'; import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; import Parser from '@libs/Parser'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import {compareDuplicateTransactionFields, getTransactionID} from '@libs/TransactionUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; import type {FieldItemType} from './ReviewFields'; @@ -18,9 +18,9 @@ import ReviewFields from './ReviewFields'; function ReviewDescription() { const route = useRoute>(); const {translate} = useLocalize(); - const transactionID = TransactionUtils.getTransactionID(route.params.threadReportID ?? ''); + const transactionID = getTransactionID(route.params.threadReportID ?? ''); const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); - const compareResult = TransactionUtils.compareDuplicateTransactionFields(transactionID, reviewDuplicates?.reportID ?? '-1'); + const compareResult = compareDuplicateTransactionFields(transactionID, reviewDuplicates?.reportID ?? '-1'); const stepNames = Object.keys(compareResult.change ?? {}).map((key, index) => (index + 1).toString()); const {currentScreenIndex, goBack, navigateToNextScreen} = useReviewDuplicatesNavigation( Object.keys(compareResult.change ?? {}), From 93535fc45149d186cd8ca52eea7fa0229a079fe2 Mon Sep 17 00:00:00 2001 From: daledah Date: Wed, 9 Apr 2025 22:53:10 +0700 Subject: [PATCH 05/11] fix: lint --- src/pages/TransactionDuplicate/ReviewDescription.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/TransactionDuplicate/ReviewDescription.tsx b/src/pages/TransactionDuplicate/ReviewDescription.tsx index 90e1a8ffc786..f2800401f441 100644 --- a/src/pages/TransactionDuplicate/ReviewDescription.tsx +++ b/src/pages/TransactionDuplicate/ReviewDescription.tsx @@ -18,14 +18,14 @@ import ReviewFields from './ReviewFields'; function ReviewDescription() { const route = useRoute>(); const {translate} = useLocalize(); - const transactionID = getTransactionID(route.params.threadReportID ?? ''); + const transactionID = getTransactionID(route.params.threadReportID); const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); - const compareResult = compareDuplicateTransactionFields(transactionID, reviewDuplicates?.reportID ?? '-1'); + const compareResult = compareDuplicateTransactionFields(transactionID, reviewDuplicates?.reportID); const stepNames = Object.keys(compareResult.change ?? {}).map((key, index) => (index + 1).toString()); const {currentScreenIndex, goBack, navigateToNextScreen} = useReviewDuplicatesNavigation( Object.keys(compareResult.change ?? {}), 'description', - route.params.threadReportID ?? '', + route.params.threadReportID, route.params.backTo, ); const options = useMemo( From 1c111ab6b3774a371e6e435bc7a6820848adbec2 Mon Sep 17 00:00:00 2001 From: daledah Date: Sat, 19 Apr 2025 23:15:00 +0700 Subject: [PATCH 06/11] fix: remove line breaks on transaction filter --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 4 ++-- src/pages/TransactionDuplicate/ReviewDescription.tsx | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index ba1a8fbde8dd..d68a8df584dd 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -142,7 +142,7 @@ function MoneyRequestPreviewContent({ category, } = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); - const description = truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToMarkdown(requestComment ?? '')), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); + const description = truncate(StringUtils.lineBreaksToSpaces(Parser.htmlToText(requestComment ?? '')), {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = hasReceiptTransactionUtils(transaction); const isScanning = hasReceipt && isReceiptBeingScanned(transaction); @@ -203,7 +203,7 @@ function MoneyRequestPreviewContent({ let merchantOrDescription = requestMerchant; if (!shouldShowMerchant) { - merchantOrDescription = Parser.htmlToText(Parser.replace(description || '')); + merchantOrDescription = description || ''; } const receiptImages = [{...getThumbnailAndImageURIs(transaction), transaction}]; diff --git a/src/pages/TransactionDuplicate/ReviewDescription.tsx b/src/pages/TransactionDuplicate/ReviewDescription.tsx index f2800401f441..b7acd05de8c0 100644 --- a/src/pages/TransactionDuplicate/ReviewDescription.tsx +++ b/src/pages/TransactionDuplicate/ReviewDescription.tsx @@ -9,6 +9,7 @@ import {setReviewDuplicatesKey} from '@libs/actions/Transaction'; import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types'; import Parser from '@libs/Parser'; +import StringUtils from '@libs/StringUtils'; import {compareDuplicateTransactionFields, getTransactionID} from '@libs/TransactionUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -34,7 +35,7 @@ function ReviewDescription() { !description?.comment ? {text: translate('violations.none'), value: ''} : { - text: Parser.htmlToText(description.comment), + text: StringUtils.lineBreaksToSpaces(Parser.htmlToText(description.comment)), value: description.comment, }, ), From 2752f7b608389e59f5500d56aeef405a6b2b9d60 Mon Sep 17 00:00:00 2001 From: daledah Date: Sat, 19 Apr 2025 23:26:21 +0700 Subject: [PATCH 07/11] fix: lint --- .../MoneyRequestPreviewContent.tsx | 14 +++++------ .../ReportActionItem/ReportPreview.tsx | 10 ++++---- src/pages/ReportDetailsPage.tsx | 24 ++++++++++--------- .../ReviewDescription.tsx | 2 +- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index d68a8df584dd..ae8a44926d3e 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -105,17 +105,17 @@ function MoneyRequestPreviewContent({ const {windowWidth} = useWindowDimensions(); const route = useRoute>(); const {shouldUseNarrowLayout} = useResponsiveLayout(); - const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`); - const [session] = useOnyx(ONYXKEYS.SESSION); - const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`); + const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`, {canBeMissing: false}); + const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); + const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, {canBeMissing: false}); const {isOnSearch} = useSearchContext(); const policy = usePolicy(iouReport?.policyID); const isMoneyRequestAction = isMoneyRequestActionReportActionsUtils(action); const transactionID = isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : undefined; - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); - const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: false}); + const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: false}); const violations = useTransactionViolations(transaction?.transactionID); const sessionAccountID = session?.accountID; @@ -184,7 +184,7 @@ function MoneyRequestPreviewContent({ // We don't use isOnHold because it's true for duplicated transaction too and we only want to show hold message if the transaction is truly on hold const shouldShowHoldMessage = !(isSettled && !isSettlementOrApprovalPartial) && !!transaction?.comment?.hold; - const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`, {canBeMissing: false}); const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); const reviewingTransactionID = isMoneyRequestActionReportActionsUtils(parentReportAction) ? getOriginalMessage(parentReportAction)?.IOUTransactionID : undefined; diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 245ba61fe4fb..4df7963f1f1c 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -152,17 +152,19 @@ function ReportPreview({ shouldDisplayContextMenu = true, }: ReportPreviewProps) { const policy = usePolicy(policyID); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`, {canBeMissing: false}); const [iouReport, transactions, violations] = useReportWithTransactionsAndViolations(iouReportID); const lastTransaction = transactions?.at(0); const transactionIDList = transactions?.map((reportTransaction) => reportTransaction.transactionID) ?? []; - const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET); + const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: false}); const [invoiceReceiverPolicy] = useOnyx( `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : CONST.DEFAULT_NUMBER_ID}`, + {canBeMissing: false}, ); const [invoiceReceiverPersonalDetail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, { selector: (personalDetails) => personalDetails?.[chatReport?.invoiceReceiver && 'accountID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.accountID : CONST.DEFAULT_NUMBER_ID], + canBeMissing: false, }); const theme = useTheme(); const styles = useThemeStyles(); @@ -206,7 +208,7 @@ function ReportPreview({ const managerID = iouReport?.managerID ?? action.childManagerAccountID ?? CONST.DEFAULT_NUMBER_ID; const {totalDisplaySpend, reimbursableSpend} = getMoneyRequestSpendBreakdown(iouReport); - const [reports] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}`); + const [reports] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}`, {canBeMissing: false}); const iouSettled = isSettled(iouReportID, isOnSearch ? reports : undefined) || action?.childStatusNum === CONST.REPORT.STATUS_NUM.REIMBURSED; const previewMessageOpacity = useSharedValue(1); const previewMessageStyle = useAnimatedStyle(() => ({ @@ -425,7 +427,7 @@ function ReportPreview({ const shouldShowSubtitle = !isScanning && (shouldShowSingleRequestMerchantOrDescription || numberOfRequests > 1) && !isDisplayAmountZero(getDisplayAmount()); const isPayAtEndExpense = isPayAtEndExpenseReport(iouReportID, transactions); - const [archiveReason] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, {selector: getArchiveReason}); + const [archiveReason] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, {selector: getArchiveReason, canBeMissing: false}); const getPendingMessageProps: () => PendingMessageProps = () => { if (isPayAtEndExpense) { diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 2991e3e2622f..6fb8c062d265 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -172,17 +172,18 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here. /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`); + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); - const [reportPDFFilename] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_REPORT_PDFFILENAME}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`) ?? null; - const [download] = useOnyx(`${ONYXKEYS.COLLECTION.DOWNLOAD}${reportPDFFilename}`); + const [reportPDFFilename] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_REPORT_PDFFILENAME}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true}) ?? null; + const [download] = useOnyx(`${ONYXKEYS.COLLECTION.DOWNLOAD}${reportPDFFilename}`, {canBeMissing: true}); const isDownloadingPDF = download?.isDownloading ?? false; const [parentReportAction] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`, { selector: (actions) => (report?.parentReportActionID ? actions?.[report.parentReportActionID] : undefined), + canBeMissing: false, }); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID || CONST.DEFAULT_NUMBER_ID}`); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); + const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ const {reportActions} = usePaginatedReportActions(report.reportID); const {currentSearchHash} = useSearchContext(); @@ -194,13 +195,14 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const transactionThreadReportID = useMemo(() => getOneTransactionThreadReportID(report.reportID, reportActions ?? [], isOffline), [report.reportID, reportActions, isOffline]); /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID || CONST.DEFAULT_NUMBER_ID}`); - const [isDebugModeEnabled] = useOnyx(ONYXKEYS.USER, {selector: (user) => !!user?.isDebugModeEnabled}); - const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); - const [session] = useOnyx(ONYXKEYS.SESSION); + const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); + const [isDebugModeEnabled] = useOnyx(ONYXKEYS.USER, {selector: (user) => !!user?.isDebugModeEnabled, canBeMissing: false}); + const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); + const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { selector: (_transactions) => reportTransactionsSelector(_transactions, report.reportID), initialValue: [], + canBeMissing: false, }); const {removeTransaction} = useMoneyRequestReportContext(); @@ -362,7 +364,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta }); }, [isPolicyEmployee, isPolicyExpenseChat, isRootGroupChat, report.reportID, report.visibility]); - const [moneyRequestReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${moneyRequestReport?.reportID}`); + const [moneyRequestReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${moneyRequestReport?.reportID}`, {canBeMissing: false}); const isMoneyRequestExported = isExported(moneyRequestReportActions); const {isDelegateAccessRestricted} = useDelegateUserDetails(); const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); @@ -401,7 +403,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const shouldShowWriteCapability = !isMoneyRequestReport; const shouldShowMenuItem = shouldShowNotificationPref || shouldShowWriteCapability || (!!report?.visibility && report.chatType !== CONST.REPORT.CHAT_TYPE.INVOICE); const shouldShowCancelPaymentButton = caseID === CASES.MONEY_REPORT && canCancelPayment(moneyRequestReport, session); - const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`); + const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`, {canBeMissing: false}); const cancelPayment = useCallback(() => { if (!chatReport) { diff --git a/src/pages/TransactionDuplicate/ReviewDescription.tsx b/src/pages/TransactionDuplicate/ReviewDescription.tsx index b7acd05de8c0..d261591b4c45 100644 --- a/src/pages/TransactionDuplicate/ReviewDescription.tsx +++ b/src/pages/TransactionDuplicate/ReviewDescription.tsx @@ -20,7 +20,7 @@ function ReviewDescription() { const route = useRoute>(); const {translate} = useLocalize(); const transactionID = getTransactionID(route.params.threadReportID); - const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); + const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES, {canBeMissing: false}); const compareResult = compareDuplicateTransactionFields(transactionID, reviewDuplicates?.reportID); const stepNames = Object.keys(compareResult.change ?? {}).map((key, index) => (index + 1).toString()); const {currentScreenIndex, goBack, navigateToNextScreen} = useReviewDuplicatesNavigation( From a371d912bef680536441696663a40a2890582317 Mon Sep 17 00:00:00 2001 From: daledah Date: Mon, 21 Apr 2025 10:44:32 +0700 Subject: [PATCH 08/11] fix: show single line on display names --- src/components/DisplayNames/index.native.tsx | 3 ++- src/components/DisplayNames/index.tsx | 3 ++- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/DisplayNames/index.native.tsx b/src/components/DisplayNames/index.native.tsx index 69068aa83cdd..c37c299f4094 100644 --- a/src/components/DisplayNames/index.native.tsx +++ b/src/components/DisplayNames/index.native.tsx @@ -2,6 +2,7 @@ import React from 'react'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import Parser from '@libs/Parser'; +import StringUtils from '@libs/StringUtils'; import type DisplayNamesProps from './types'; // As we don't have to show tooltips of the Native platform so we simply render the full display names list. @@ -14,7 +15,7 @@ function DisplayNames({accessibilityLabel, fullTitle, textStyles = [], numberOfL numberOfLines={numberOfLines} testID={DisplayNames.displayName} > - {Parser.htmlToText(fullTitle) || translate('common.hidden')} + {StringUtils.lineBreaksToSpaces(Parser.htmlToText(fullTitle)) || translate('common.hidden')} {renderAdditionalText?.()} ); diff --git a/src/components/DisplayNames/index.tsx b/src/components/DisplayNames/index.tsx index d74c776b8dad..a9f9e579d483 100644 --- a/src/components/DisplayNames/index.tsx +++ b/src/components/DisplayNames/index.tsx @@ -1,13 +1,14 @@ import React from 'react'; import useLocalize from '@hooks/useLocalize'; import Parser from '@libs/Parser'; +import StringUtils from '@libs/StringUtils'; import DisplayNamesWithoutTooltip from './DisplayNamesWithoutTooltip'; import DisplayNamesWithToolTip from './DisplayNamesWithTooltip'; import type DisplayNamesProps from './types'; function DisplayNames({fullTitle, tooltipEnabled, textStyles, numberOfLines, shouldAddEllipsis, shouldUseFullTitle, displayNamesWithTooltips, renderAdditionalText}: DisplayNamesProps) { const {translate} = useLocalize(); - const title = Parser.htmlToText(fullTitle) || translate('common.hidden'); + const title = StringUtils.lineBreaksToSpaces(Parser.htmlToText(fullTitle)) || translate('common.hidden'); if (!tooltipEnabled) { return ( diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index ae8a44926d3e..f5454a259cfa 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -115,7 +115,7 @@ function MoneyRequestPreviewContent({ const isMoneyRequestAction = isMoneyRequestActionReportActionsUtils(action); const transactionID = isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : undefined; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: false}); - const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: false}); + const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true}); const violations = useTransactionViolations(transaction?.transactionID); const sessionAccountID = session?.accountID; From b2a5cb065f0869e303198700562bcc55ff7f468a Mon Sep 17 00:00:00 2001 From: daledah Date: Mon, 21 Apr 2025 15:43:05 +0700 Subject: [PATCH 09/11] fix: lint --- src/components/ReportActionItem/ReportPreview.tsx | 2 +- src/pages/ReportDetailsPage.tsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 4df7963f1f1c..5218641cb532 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -158,7 +158,7 @@ function ReportPreview({ const transactionIDList = transactions?.map((reportTransaction) => reportTransaction.transactionID) ?? []; const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: false}); const [invoiceReceiverPolicy] = useOnyx( - `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : CONST.DEFAULT_NUMBER_ID}`, + `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : undefined}`, {canBeMissing: false}, ); const [invoiceReceiverPersonalDetail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, { diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 6fb8c062d265..b0e0a0931cf7 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -172,18 +172,18 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here. /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, {canBeMissing: false}); - const [reportPDFFilename] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_REPORT_PDFFILENAME}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true}) ?? null; + const [reportPDFFilename] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_REPORT_PDFFILENAME}${report?.reportID}`, {canBeMissing: true}) ?? null; const [download] = useOnyx(`${ONYXKEYS.COLLECTION.DOWNLOAD}${reportPDFFilename}`, {canBeMissing: true}); const isDownloadingPDF = download?.isDownloading ?? false; - const [parentReportAction] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.parentReportID || CONST.DEFAULT_NUMBER_ID}`, { + const [parentReportAction] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.parentReportID}`, { selector: (actions) => (report?.parentReportActionID ? actions?.[report.parentReportActionID] : undefined), canBeMissing: false, }); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: false}); + const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: false}); /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ const {reportActions} = usePaginatedReportActions(report.reportID); const {currentSearchHash} = useSearchContext(); @@ -195,7 +195,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const transactionThreadReportID = useMemo(() => getOneTransactionThreadReportID(report.reportID, reportActions ?? [], isOffline), [report.reportID, reportActions, isOffline]); /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID || CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: false}); + const [transactionThreadReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`, {canBeMissing: false}); const [isDebugModeEnabled] = useOnyx(ONYXKEYS.USER, {selector: (user) => !!user?.isDebugModeEnabled, canBeMissing: false}); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); From c88fbfa5cf0057f1909caca306b876d447a0171c Mon Sep 17 00:00:00 2001 From: daledah Date: Tue, 22 Apr 2025 17:58:40 +0700 Subject: [PATCH 10/11] fix: update canBeMissing value --- src/components/ReportActionItem/ReportPreview.tsx | 6 +++--- src/pages/ReportDetailsPage.tsx | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 5218641cb532..3de2d4d3f124 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -156,15 +156,15 @@ function ReportPreview({ const [iouReport, transactions, violations] = useReportWithTransactionsAndViolations(iouReportID); const lastTransaction = transactions?.at(0); const transactionIDList = transactions?.map((reportTransaction) => reportTransaction.transactionID) ?? []; - const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: false}); + const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true}); const [invoiceReceiverPolicy] = useOnyx( `${ONYXKEYS.COLLECTION.POLICY}${chatReport?.invoiceReceiver && 'policyID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.policyID : undefined}`, - {canBeMissing: false}, + {canBeMissing: true}, ); const [invoiceReceiverPersonalDetail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, { selector: (personalDetails) => personalDetails?.[chatReport?.invoiceReceiver && 'accountID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.accountID : CONST.DEFAULT_NUMBER_ID], - canBeMissing: false, + canBeMissing: true, }); const theme = useTheme(); const styles = useThemeStyles(); diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index b0e0a0931cf7..0a12d3d94a91 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -172,7 +172,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta // The app would crash due to subscribing to the entire report collection if parentReportID is an empty string. So we should have a fallback ID here. /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, {canBeMissing: false}); + const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, {canBeMissing: true}); const [reportPDFFilename] = useOnyx(`${ONYXKEYS.COLLECTION.NVP_EXPENSIFY_REPORT_PDFFILENAME}${report?.reportID}`, {canBeMissing: true}) ?? null; const [download] = useOnyx(`${ONYXKEYS.COLLECTION.DOWNLOAD}${reportPDFFilename}`, {canBeMissing: true}); @@ -180,10 +180,10 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const [parentReportAction] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.parentReportID}`, { selector: (actions) => (report?.parentReportActionID ? actions?.[report.parentReportActionID] : undefined), - canBeMissing: false, + canBeMissing: true, }); - const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: false}); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: false}); + const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true}); + const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: true}); /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ const {reportActions} = usePaginatedReportActions(report.reportID); const {currentSearchHash} = useSearchContext(); @@ -202,7 +202,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { selector: (_transactions) => reportTransactionsSelector(_transactions, report.reportID), initialValue: [], - canBeMissing: false, + canBeMissing: true, }); const {removeTransaction} = useMoneyRequestReportContext(); From 3a3913202212ee73adecba299c211a74b3045ec1 Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 25 Apr 2025 14:52:01 +0700 Subject: [PATCH 11/11] fix: correct canBeMissing --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- src/pages/ReportDetailsPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index f5454a259cfa..ba1b16ee6336 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -114,7 +114,7 @@ function MoneyRequestPreviewContent({ const policy = usePolicy(iouReport?.policyID); const isMoneyRequestAction = isMoneyRequestActionReportActionsUtils(action); const transactionID = isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : undefined; - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: false}); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true}); const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true}); const violations = useTransactionViolations(transaction?.transactionID); diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 696b10ef85be..d27fc4243df4 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -183,7 +183,7 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta canBeMissing: true, }); const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: false}); - const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: false}); + const [parentReportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.parentReportID}`, {canBeMissing: true}); /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ const {reportActions} = usePaginatedReportActions(report.reportID); const {currentSearchHash} = useSearchContext();