diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 05b3bf6ad5af..63a4119ef62c 100644 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -1,5 +1,4 @@ import {useFocusEffect, useIsFocused} from '@react-navigation/native'; -import {deepEqual} from 'fast-equals'; import React, {memo, useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; @@ -52,6 +51,9 @@ import { hasRoute as hasRouteUtil, hasTaxRateWithMatchingValue, hasValidModifiedAmount, + isDistanceRequest as isDistanceRequestUtil, + isGPSDistanceRequest as isGPSDistanceRequestUtil, + isManualDistanceRequest as isManualDistanceRequestUtil, isMerchantMissing, isScanning, isScanRequest as isScanRequestUtil, @@ -129,21 +131,12 @@ type MoneyRequestConfirmationListProps = { /** Transaction that represents the expense */ transaction?: OnyxEntry; - /** Whether the expense is a distance expense */ - isDistanceRequest: boolean; - - /** Whether the expense is a manual distance expense */ - isManualDistanceRequest: boolean; - /** Whether the expense is an odometer distance expense */ isOdometerDistanceRequest?: boolean; /** Whether the odometer receipt is currently being stitched */ isLoadingReceipt?: boolean; - /** Whether the expense is a GPS distance expense */ - isGPSDistanceRequest: boolean; - /** Whether the expense is a per diem expense */ isPerDiemRequest?: boolean; @@ -207,11 +200,8 @@ function MoneyRequestConfirmationList({ onSendMoney, onConfirm, iouType = CONST.IOU.TYPE.SUBMIT, - isDistanceRequest, - isManualDistanceRequest, isOdometerDistanceRequest = false, isLoadingReceipt = false, - isGPSDistanceRequest, isPerDiemRequest = false, isPolicyExpenseChat = false, shouldShowSmartScanFields = true, @@ -256,7 +246,6 @@ function MoneyRequestConfirmationList({ selector: mileageRateSelector, }); const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT}${policyID}`); - const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES); const {getCurrencySymbol, getCurrencyDecimals} = useCurrencyListActions(); const {isBetaEnabled} = usePermissions(); const isNewManualExpenseFlowEnabled = isBetaEnabled(CONST.BETAS.NEW_MANUAL_EXPENSE_FLOW); @@ -297,6 +286,10 @@ function MoneyRequestConfirmationList({ const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const {isRestrictedToPreferredPolicy} = usePreferredPolicy(); + const isDistanceRequest = isDistanceRequestUtil(transaction); + const isManualDistanceRequest = isManualDistanceRequestUtil(transaction); + const isGPSDistanceRequest = isGPSDistanceRequestUtil(transaction); + const iouAmount = hasValidModifiedAmount(transaction) ? Number(transaction?.modifiedAmount) : (transaction?.amount ?? 0); const iouComment = getDescription(transaction); const iouCurrencyCode = getCurrency(transaction); @@ -323,7 +316,6 @@ function MoneyRequestConfirmationList({ const subRates = transaction?.comment?.customUnit?.subRates ?? []; const defaultRate = defaultMileageRate?.customUnitRateID; - const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate; const mileageRate = DistanceRequestUtils.getRate({ transaction, @@ -1180,7 +1172,7 @@ function MoneyRequestConfirmationList({ isTypeSplit={isTypeSplit} selectedParticipants={selectedParticipants} selectedParticipantsProp={selectedParticipantsProp} - lastSelectedRate={lastSelectedRate} + defaultMileageRateCustomUnitRateID={defaultRate} hasRoute={hasRoute} isDistanceRequestWithPendingRoute={isDistanceRequestWithPendingRoute} shouldCalculateDistanceAmount={shouldCalculateDistanceAmount} @@ -1227,32 +1219,4 @@ function MoneyRequestConfirmationList({ ); } -export default memo( - MoneyRequestConfirmationList, - (prevProps, nextProps) => - prevProps.transaction === nextProps.transaction && - prevProps.onSendMoney === nextProps.onSendMoney && - prevProps.onConfirm === nextProps.onConfirm && - prevProps.iouType === nextProps.iouType && - prevProps.isDistanceRequest === nextProps.isDistanceRequest && - prevProps.isPolicyExpenseChat === nextProps.isPolicyExpenseChat && - prevProps.expensesNumber === nextProps.expensesNumber && - prevProps.shouldShowSmartScanFields === nextProps.shouldShowSmartScanFields && - prevProps.isEditingSplitBill === nextProps.isEditingSplitBill && - // eslint-disable-next-line rulesdir/no-deep-equal-in-memo -- selectedParticipants is derived with .map() which creates new array references - deepEqual(prevProps.selectedParticipants, nextProps.selectedParticipants) && - prevProps.payeePersonalDetails === nextProps.payeePersonalDetails && - prevProps.isReadOnly === nextProps.isReadOnly && - prevProps.policyID === nextProps.policyID && - prevProps.reportID === nextProps.reportID && - prevProps.receiptPath === nextProps.receiptPath && - prevProps.receiptFilename === nextProps.receiptFilename && - prevProps.onToggleBillable === nextProps.onToggleBillable && - prevProps.hasSmartScanFailed === nextProps.hasSmartScanFailed && - prevProps.reportActionID === nextProps.reportActionID && - prevProps.action === nextProps.action && - prevProps.shouldDisplayReceipt === nextProps.shouldDisplayReceipt && - prevProps.isTimeRequest === nextProps.isTimeRequest && - prevProps.shouldHideToSection === nextProps.shouldHideToSection && - prevProps.isLoadingReceipt === nextProps.isLoadingReceipt, -); +export default memo(MoneyRequestConfirmationList); diff --git a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx index 3517de617404..acd924e61e5d 100644 --- a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx +++ b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx @@ -2,6 +2,7 @@ import {useEffect, useRef} from 'react'; import type {OnyxEntry} from 'react-native-onyx'; import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; import usePrevious from '@hooks/usePrevious'; import {setCustomUnitRateID, setMoneyRequestAmount, setMoneyRequestMerchant, setMoneyRequestPendingFields} from '@libs/actions/IOU'; import {setSplitShares} from '@libs/actions/IOU/Split'; @@ -9,6 +10,7 @@ import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import type {MileageRate} from '@libs/DistanceRequestUtils'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; +import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy, Transaction} from '@src/types/onyx'; import type {Participant} from '@src/types/onyx/IOU'; import type {Unit} from '@src/types/onyx/Policy'; @@ -33,7 +35,7 @@ type DistanceRequestControllerProps = { shouldCalculateDistanceAmount: boolean; isDistanceRequestWithPendingRoute: boolean; hasRoute: boolean; - lastSelectedRate: string | undefined; + defaultMileageRateCustomUnitRateID: string | undefined; selectedParticipants: Participant[]; selectedParticipantsProp: Participant[]; setFormError: (error: TranslationPaths | '') => void; @@ -65,7 +67,7 @@ function DistanceRequestController({ shouldCalculateDistanceAmount, isDistanceRequestWithPendingRoute, hasRoute, - lastSelectedRate, + defaultMileageRateCustomUnitRateID, selectedParticipants, selectedParticipantsProp, setFormError, @@ -73,6 +75,8 @@ function DistanceRequestController({ }: DistanceRequestControllerProps) { const {translate, toLocaleDigit} = useLocalize(); const {getCurrencySymbol} = useCurrencyListActions(); + const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES); + const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultMileageRateCustomUnitRateID) : defaultMileageRateCustomUnitRateID; const prevPolicy = usePrevious(policy); const isFirstUpdatedDistanceAmount = useRef(false); diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index 1ea1bc03d494..8da16ed9af74 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -1,7 +1,6 @@ import {accountIDSelector, emailSelector} from '@selectors/Session'; import {format} from 'date-fns'; import {Str} from 'expensify-common'; -import {deepEqual} from 'fast-equals'; import React, {memo, useCallback, useMemo, useRef, useState} from 'react'; import {View} from 'react-native'; import type {LayoutChangeEvent} from 'react-native'; @@ -1625,52 +1624,4 @@ function MoneyRequestConfirmationListFooter({ ); } -export default memo( - MoneyRequestConfirmationListFooter, - (prevProps, nextProps) => - prevProps.action === nextProps.action && - prevProps.distanceRateCurrency === nextProps.distanceRateCurrency && - prevProps.didConfirm === nextProps.didConfirm && - prevProps.distance === nextProps.distance && - prevProps.formattedAmount === nextProps.formattedAmount && - prevProps.formError === nextProps.formError && - prevProps.hasRoute === nextProps.hasRoute && - prevProps.iouCategory === nextProps.iouCategory && - prevProps.iouComment === nextProps.iouComment && - prevProps.iouCreated === nextProps.iouCreated && - prevProps.iouCurrencyCode === nextProps.iouCurrencyCode && - prevProps.iouIsBillable === nextProps.iouIsBillable && - prevProps.iouMerchant === nextProps.iouMerchant && - prevProps.iouType === nextProps.iouType && - prevProps.isCategoryRequired === nextProps.isCategoryRequired && - prevProps.isDistanceRequest === nextProps.isDistanceRequest && - prevProps.isMerchantEmpty === nextProps.isMerchantEmpty && - prevProps.isMerchantRequired === nextProps.isMerchantRequired && - prevProps.isPolicyExpenseChat === nextProps.isPolicyExpenseChat && - prevProps.isReadOnly === nextProps.isReadOnly && - prevProps.isTypeInvoice === nextProps.isTypeInvoice && - prevProps.onToggleBillable === nextProps.onToggleBillable && - prevProps.policy === nextProps.policy && - prevProps.policyTagLists === nextProps.policyTagLists && - prevProps.rate === nextProps.rate && - prevProps.receiptFilename === nextProps.receiptFilename && - prevProps.receiptPath === nextProps.receiptPath && - prevProps.reportActionID === nextProps.reportActionID && - prevProps.reportID === nextProps.reportID && - // eslint-disable-next-line rulesdir/no-deep-equal-in-memo -- selectedParticipants is derived with .map() which creates new array references - deepEqual(prevProps.selectedParticipants, nextProps.selectedParticipants) && - prevProps.shouldDisplayFieldError === nextProps.shouldDisplayFieldError && - prevProps.shouldDisplayReceipt === nextProps.shouldDisplayReceipt && - prevProps.shouldShowCategories === nextProps.shouldShowCategories && - prevProps.shouldShowMerchant === nextProps.shouldShowMerchant && - prevProps.shouldShowSmartScanFields === nextProps.shouldShowSmartScanFields && - prevProps.shouldShowTax === nextProps.shouldShowTax && - prevProps.transaction === nextProps.transaction && - prevProps.transactionID === nextProps.transactionID && - prevProps.unit === nextProps.unit && - prevProps.showMoreFields === nextProps.showMoreFields && - prevProps.isTimeRequest === nextProps.isTimeRequest && - prevProps.iouTimeCount === nextProps.iouTimeCount && - prevProps.iouTimeRate === nextProps.iouTimeRate && - prevProps.isLoadingReceipt === nextProps.isLoadingReceipt, -); +export default memo(MoneyRequestConfirmationListFooter); diff --git a/src/pages/Share/SubmitDetailsPage.tsx b/src/pages/Share/SubmitDetailsPage.tsx index 0b8a8f47a816..7ba5c4abe3fb 100644 --- a/src/pages/Share/SubmitDetailsPage.tsx +++ b/src/pages/Share/SubmitDetailsPage.tsx @@ -302,9 +302,6 @@ function SubmitDetailsPage({ receiptFilename={getFileName(fileName)} reportID={reportOrAccountID} shouldShowSmartScanFields={false} - isDistanceRequest={false} - isManualDistanceRequest={false} - isGPSDistanceRequest={false} onPDFLoadError={() => { if (errorTitle) { return; diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx index 21ccb5fd4001..ca06aa66d81d 100644 --- a/src/pages/iou/SplitBillDetailsPage.tsx +++ b/src/pages/iou/SplitBillDetailsPage.tsx @@ -24,15 +24,7 @@ import {getParticipantsOption, getPolicyExpenseReportOption} from '@libs/Options import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {isPolicyExpenseChat} from '@libs/ReportUtils'; import type {OptionData} from '@libs/ReportUtils'; -import { - areRequiredFieldsEmpty, - hasReceipt, - isDistanceRequest as isDistanceRequestUtil, - isGPSDistanceRequest as isGPSDistanceRequestUtil, - isManualDistanceRequest as isManualDistanceRequestUtil, - isMapDistanceRequest as isMapDistanceRequestUtil, - isScanning, -} from '@libs/TransactionUtils'; +import {areRequiredFieldsEmpty, hasReceipt, isDistanceRequest as isDistanceRequestUtil, isMapDistanceRequest as isMapDistanceRequestUtil, isScanning} from '@libs/TransactionUtils'; import withReportAndReportActionOrNotFound from '@pages/inbox/report/withReportAndReportActionOrNotFound'; import type {WithReportAndReportActionOrNotFoundProps} from '@pages/inbox/report/withReportAndReportActionOrNotFound'; import variables from '@styles/variables'; @@ -85,8 +77,6 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag const isDistanceRequest = isDistanceRequestUtil(transaction); const isEditingSplitBill = session?.accountID === actorAccountID && (areRequiredFieldsEmpty(transaction, transactionReport) || (transaction?.amount === 0 && !hasReceipt(transaction))) && !isDistanceRequest; - const isManualDistanceRequest = isManualDistanceRequestUtil(transaction); - const isGPSDistanceRequest = isGPSDistanceRequestUtil(transaction); const isMapDistanceRequest = isMapDistanceRequestUtil(transaction); const [isConfirmed, setIsConfirmed] = useState(false); @@ -143,9 +133,6 @@ function SplitBillDetailsPage({route, report, reportAction}: SplitBillDetailsPag shouldShowSmartScanFields receiptPath={transaction?.receipt?.source} receiptFilename={transaction?.receipt?.filename} - isDistanceRequest={isDistanceRequest} - isManualDistanceRequest={isManualDistanceRequest} - isGPSDistanceRequest={isGPSDistanceRequest} isEditingSplitBill={isEditingSplitBill} hasSmartScanFailed={hasSmartScanFailed} reportID={reportID} diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index c398a9303f97..15ceec913952 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -1509,11 +1509,8 @@ function IOURequestStepConfirmation({ shouldDisplayReceipt={!isMovingTransactionFromTrackExpense && (!isDistanceRequest || isManualDistanceRequest || isOdometerDistanceRequest) && !isPerDiemRequest} isPolicyExpenseChat={isPolicyExpenseChat} policyID={policyID} - isDistanceRequest={isDistanceRequest} - isManualDistanceRequest={isManualDistanceRequest} isOdometerDistanceRequest={isOdometerDistanceRequest} isLoadingReceipt={isStitchingReceipt} - isGPSDistanceRequest={isGPSDistanceRequest} isPerDiemRequest={isPerDiemRequest} shouldShowSmartScanFields={shouldShowSmartScanFields} action={action}