Skip to content

Commit 66ec904

Browse files
authored
Merge pull request Expensify#66778 from DylanDylann/dylan/fix/64697
Safe access to collection key
2 parents 9824a80 + edae0de commit 66ec904

31 files changed

Lines changed: 87 additions & 47 deletions

Mobile-Expensify

src/components/Attachments/AttachmentView/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
2323
import {add as addCachedPDFPaths} from '@libs/actions/CachedPDFPaths';
2424
import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL';
2525
import {getFileResolution, isHighResolutionImage} from '@libs/fileDownload/FileUtils';
26+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
2627
import {hasEReceipt, hasReceiptSource, isDistanceRequest, isPerDiemRequest} from '@libs/TransactionUtils';
2728
import type {ColorValue} from '@styles/utils/types';
2829
import variables from '@styles/variables';
@@ -121,7 +122,7 @@ function AttachmentView({
121122
isUploading = false,
122123
reportID,
123124
}: AttachmentViewProps) {
124-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true});
125+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true});
125126
const {translate} = useLocalize();
126127
const {updateCurrentURLAndReportID} = usePlaybackContext();
127128

src/components/EReceipt.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useTheme from '@hooks/useTheme';
88
import useThemeStyles from '@hooks/useThemeStyles';
99
import {getCardDescription, getCompanyCardDescription} from '@libs/CardUtils';
1010
import {convertToDisplayString, getCurrencySymbol} from '@libs/CurrencyUtils';
11+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
1112
import {getTransactionDetails} from '@libs/ReportUtils';
1213
import variables from '@styles/variables';
1314
import CONST from '@src/CONST';
@@ -38,7 +39,7 @@ function EReceipt({transactionID, transactionItem, isThumbnail = false}: EReceip
3839
const {translate} = useLocalize();
3940
const theme = useTheme();
4041
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});
41-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true});
42+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true});
4243

4344
const {primaryColor, secondaryColor, titleColor, MCCIcon, tripIcon, backgroundImage} = useEReceipt(transactionItem ?? transaction);
4445

src/components/EReceiptThumbnail.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import useEReceipt from '@hooks/useEReceipt';
44
import useOnyx from '@hooks/useOnyx';
55
import useStyleUtils from '@hooks/useStyleUtils';
66
import useThemeStyles from '@hooks/useThemeStyles';
7+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
78
import {isPerDiemRequest as isPerDiemRequestTransactionUtils} from '@libs/TransactionUtils';
89
import colors from '@styles/theme/colors';
910
import variables from '@styles/variables';
@@ -38,7 +39,9 @@ type EReceiptThumbnailProps = {
3839
function EReceiptThumbnail({transactionID, borderRadius, fileExtension, isReceiptThumbnail = false, centerIconV = true, iconSize = 'large'}: EReceiptThumbnailProps) {
3940
const styles = useThemeStyles();
4041
const StyleUtils = useStyleUtils();
41-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`);
42+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {
43+
canBeMissing: true,
44+
});
4245

4346
const {primaryColor, secondaryColor, MCCIcon, tripIcon, backgroundImage} = useEReceipt(transaction, fileExtension, isReceiptThumbnail);
4447
const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction);

src/components/MoneyReportHeader.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import useTheme from '@hooks/useTheme';
1818
import useThemeStyles from '@hooks/useThemeStyles';
1919
import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
2020
import {deleteAppReport, downloadReportPDF, exportReportToCSV, exportReportToPDF, exportToIntegration, markAsManuallyExported, openUnreportedExpense} from '@libs/actions/Report';
21+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
2122
import {getThreadReportIDsForTransactions, getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
2223
import Navigation from '@libs/Navigation/Navigation';
2324
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -178,7 +179,8 @@ function MoneyReportHeader({
178179
selector: (_transactions) => reportTransactionsSelector(_transactions, moneyRequestReport?.reportID),
179180
canBeMissing: true,
180181
});
181-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${isMoneyRequestAction(requestParentReportAction) && getOriginalMessage(requestParentReportAction)?.IOUTransactionID}`, {
182+
const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : undefined;
183+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(iouTransactionID)}`, {
182184
canBeMissing: true,
183185
});
184186
const [dismissedHoldUseExplanation, dismissedHoldUseExplanationResult] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {canBeMissing: true});
@@ -365,14 +367,13 @@ function MoneyReportHeader({
365367
if (!requestParentReportAction) {
366368
return;
367369
}
368-
const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : undefined;
369370
const reportID = transactionThreadReport?.reportID;
370371

371372
if (!iouTransactionID || !reportID) {
372373
return;
373374
}
374375
markAsCashAction(iouTransactionID, reportID);
375-
}, [requestParentReportAction, transactionThreadReport?.reportID]);
376+
}, [iouTransactionID, requestParentReportAction, transactionThreadReport?.reportID]);
376377

377378
const getStatusIcon: (src: IconAsset) => React.ReactNode = (src) => (
378379
<Icon

src/components/PerDiemEReceipt.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import useOnyx from '@hooks/useOnyx';
55
import useStyleUtils from '@hooks/useStyleUtils';
66
import useThemeStyles from '@hooks/useThemeStyles';
77
import {convertAmountToDisplayString, convertToDisplayStringWithoutCurrency, getCurrencySymbol} from '@libs/CurrencyUtils';
8+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
89
import {getTransactionDetails} from '@libs/ReportUtils';
910
import variables from '@styles/variables';
1011
import CONST from '@src/CONST';
@@ -51,7 +52,9 @@ function PerDiemEReceipt({transactionID}: PerDiemEReceiptProps) {
5152
const styles = useThemeStyles();
5253
const StyleUtils = useStyleUtils();
5354
const {translate} = useLocalize();
54-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`);
55+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {
56+
canBeMissing: true,
57+
});
5558

5659
// Get receipt colorway, or default to Yellow.
5760
const {backgroundColor: primaryColor, color: secondaryColor} = StyleUtils.getEReceiptColorStyles(StyleUtils.getEReceiptColorCode(transaction)) ?? {};

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {isCategoryMissing} from '@libs/CategoryUtils';
2727
import {convertToDisplayString} from '@libs/CurrencyUtils';
2828
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
2929
import {isReceiptError} from '@libs/ErrorUtils';
30+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
3031
import {hasEnabledOptions} from '@libs/OptionsListUtils';
3132
import {getTagLists, hasDependentTags as hasDependentTagsPolicyUtils, isTaxTrackingEnabled} from '@libs/PolicyUtils';
3233
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
@@ -149,8 +150,8 @@ function MoneyRequestView({allReports, report, policy, shouldShowAnimatedBackgro
149150
return originalMessage?.IOUTransactionID;
150151
}, [parentReportAction]);
151152

152-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`, {canBeMissing: true});
153-
const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${linkedTransactionID}`, {canBeMissing: true});
153+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true});
154+
const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true});
154155
const transactionViolations = useTransactionViolations(transaction?.transactionID);
155156

156157
const {

src/components/ReportActionItem/TransactionPreview/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import useTransactionViolations from '@hooks/useTransactionViolations';
1010
import ControlSelection from '@libs/ControlSelection';
1111
import {convertToDisplayString} from '@libs/CurrencyUtils';
1212
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
13+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
1314
import Navigation from '@libs/Navigation/Navigation';
1415
import {getOriginalMessage, isMoneyRequestAction as isMoneyRequestActionReportActionsUtils} from '@libs/ReportActionsUtils';
1516
import {getTransactionDetails} from '@libs/ReportUtils';
@@ -46,8 +47,8 @@ function TransactionPreview(props: TransactionPreviewProps) {
4647
const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`];
4748
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
4849
const isMoneyRequestAction = isMoneyRequestActionReportActionsUtils(action);
49-
const transactionID = transactionIDFromProps ?? (isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : null);
50-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true});
50+
const transactionID = transactionIDFromProps ?? (isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : undefined);
51+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true});
5152
const violations = useTransactionViolations(transaction?.transactionID);
5253
const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true});
5354
const session = useSession();

src/components/SidePanel/HelpComponents/HelpContent.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import useOnyx from '@hooks/useOnyx';
1313
import useResponsiveLayout from '@hooks/useResponsiveLayout';
1414
import useRootNavigationState from '@hooks/useRootNavigationState';
1515
import useThemeStyles from '@hooks/useThemeStyles';
16+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
1617
import {normalizedConfigs} from '@libs/Navigation/linkingConfig/config';
1718
import {getOneTransactionThreadReportAction, getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils';
1819
import {getHelpPaneReportType} from '@libs/ReportUtils';
@@ -58,7 +59,7 @@ function HelpContent({closeSidePanel}: HelpContentProps) {
5859
const transactionThreadReportAction = getOneTransactionThreadReportAction(report, chatReport, reportActions ?? []);
5960
return getOriginalMessage(parentIOUReportAction ?? transactionThreadReportAction)?.IOUTransactionID;
6061
}, [report, chatReport, reportActions, parentIOUReportAction]);
61-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true});
62+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true});
6263

6364
const route = useMemo(() => {
6465
const path = normalizedConfigs[routeName]?.path;

src/hooks/useTransactionViolations.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import {useMemo} from 'react';
2+
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
23
import {isViolationDismissed, shouldShowViolation} from '@libs/TransactionUtils';
34
import ONYXKEYS from '@src/ONYXKEYS';
45
import type {TransactionViolation, TransactionViolations} from '@src/types/onyx';
56
import getEmptyArray from '@src/types/utils/getEmptyArray';
67
import useOnyx from './useOnyx';
78

89
function useTransactionViolations(transactionID?: string, shouldShowRterForSettledReport = true): TransactionViolations {
9-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {
10+
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {
1011
canBeMissing: true,
1112
});
1213
const [transactionViolations = getEmptyArray<TransactionViolation>()] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, {

0 commit comments

Comments
 (0)