diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 23dcba5a2b1f..d17bcf49564e 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -7759,6 +7759,7 @@ const CONST = { MULTI_SCAN_EDUCATIONAL_MODAL: 'multiScanEducationalModal', GPS_TOOLTIP: 'gpsTooltip', HAS_FILTER_NEGATION: 'hasFilterNegation', + MILEAGE_RATE_AUTO_UPDATED: 'mileageRateAutoUpdated', }, CHANGE_POLICY_TRAINING_MODAL: 'changePolicyModal', AGENTS_RULES_BANNER: 'agentsRulesBanner', diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 9e953b0d25e3..89f825bbe90e 100644 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -256,6 +256,8 @@ function MoneyRequestConfirmationList({ const previousTransactionCurrency = usePrevious(transaction?.currency); const customUnitRateID = getRateID(transaction); + const shouldShowRateAutoUpdatedTooltip = isDistanceRequest && !!transaction?.comment?.customUnit?.rateAutoUpdated; + const subRates = transaction?.comment?.customUnit?.subRates ?? []; const prevSubRates = usePrevious(subRates); @@ -545,7 +547,7 @@ function MoneyRequestConfirmationList({ isPolicyExpenseChat={isPolicyExpenseChat} expenseMode={{isDistance: isDistanceRequest, isTime: isTimeRequest, isInvoice: isTypeInvoice, isPerDiem: isPerDiemRequest}} distanceFlags={{isManualDistanceRequest, isOdometerDistanceRequest, isGPSDistanceRequest}} - distanceData={{distance, hasRoute, unit, rate, distanceRateName: mileageRate.name, distanceRateCurrency: currency}} + distanceData={{distance, hasRoute, unit, rate, distanceRateName: mileageRate.name, distanceRateCurrency: currency, shouldShowRateAutoUpdatedTooltip}} amountDisplay={{amount: amountToBeUsed, formattedAmount, formattedAmountPerAttendee}} requiredFlags={{isCategoryRequired, isMerchantRequired, isDescriptionRequired}} visibilityFlags={{ diff --git a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx index 94e3a9de782e..0b01b27e66f9 100644 --- a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx +++ b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx @@ -177,8 +177,29 @@ function DistanceRequestController({ return; } - setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy); - }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy, selectedParticipants]); + let rateToUse = lastSelectedRate; + const expenseDate = transaction?.created; + if (expenseDate) { + const mileageRates = DistanceRequestUtils.getMileageRates(policy); + const lastRate = lastSelectedRate ? mileageRates[lastSelectedRate] : undefined; + if (!lastRate || !DistanceRequestUtils.isRateEligibleForDate(lastRate, expenseDate)) { + const bestRate = DistanceRequestUtils.getBestEligibleRate(mileageRates, expenseDate); + rateToUse = bestRate?.customUnitRateID ?? defaultMileageRateCustomUnitRateID ?? lastSelectedRate; + } + } + setCustomUnitRateID(transactionID, rateToUse, transaction, policy); + }, [ + customUnitRateID, + transactionID, + lastSelectedRate, + isDistanceRequest, + isPolicyExpenseChat, + isMovingTransactionFromTrackExpense, + transaction, + policy, + selectedParticipants, + defaultMileageRateCustomUnitRateID, + ]); useEffect(() => { if (!isDistanceRequest || !transactionID || isReadOnly) { diff --git a/src/components/MoneyRequestConfirmationList/sections/RateField.tsx b/src/components/MoneyRequestConfirmationList/sections/RateField.tsx index 46c64a8dafdb..67e79746da1f 100644 --- a/src/components/MoneyRequestConfirmationList/sections/RateField.tsx +++ b/src/components/MoneyRequestConfirmationList/sections/RateField.tsx @@ -1,12 +1,14 @@ import React from 'react'; import type {OnyxEntry} from 'react-native-onyx'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import {useProductTrainingContext} from '@components/ProductTrainingContext'; import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; +import variables from '@styles/variables'; import CONST from '@src/CONST'; import type {IOUAction, IOUType} from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -30,6 +32,7 @@ type RateFieldProps = { formError: string; shouldNavigateToUpgradePath: boolean; shouldSelectPolicy: boolean; + shouldShowRateAutoUpdatedTooltip?: boolean; }; function RateField({ @@ -49,6 +52,7 @@ function RateField({ formError, shouldNavigateToUpgradePath, shouldSelectPolicy, + shouldShowRateAutoUpdatedTooltip, }: RateFieldProps) { const styles = useThemeStyles(); const {translate, toLocaleDigit} = useLocalize(); @@ -59,6 +63,11 @@ function RateField({ const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK; const isRateInteractive = !!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT; + const {renderProductTrainingTooltip, shouldShowProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext( + CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.MILEAGE_RATE_AUTO_UPDATED, + !!shouldShowRateAutoUpdatedTooltip, + ); + return ( ); } diff --git a/src/components/MoneyRequestConfirmationListFooter/fieldGroupTypes.ts b/src/components/MoneyRequestConfirmationListFooter/fieldGroupTypes.ts index ac8c36dfae68..462298a94da6 100644 --- a/src/components/MoneyRequestConfirmationListFooter/fieldGroupTypes.ts +++ b/src/components/MoneyRequestConfirmationListFooter/fieldGroupTypes.ts @@ -16,6 +16,7 @@ type DistanceData = { rate: number | undefined; distanceRateName: string | undefined; distanceRateCurrency: string; + shouldShowRateAutoUpdatedTooltip?: boolean; }; /** Distance-mode discriminators (manual / odometer / GPS) */ diff --git a/src/components/MoneyRequestConfirmationListFooter/fieldGroups/TransactionDetailsFields.tsx b/src/components/MoneyRequestConfirmationListFooter/fieldGroups/TransactionDetailsFields.tsx index 5fb7255ee0ae..2d407b19b366 100644 --- a/src/components/MoneyRequestConfirmationListFooter/fieldGroups/TransactionDetailsFields.tsx +++ b/src/components/MoneyRequestConfirmationListFooter/fieldGroups/TransactionDetailsFields.tsx @@ -166,6 +166,7 @@ function TransactionDetailsFields({ formError={errorState.formError} shouldNavigateToUpgradePath={shouldNavigateToUpgradePath} shouldSelectPolicy={shouldSelectPolicy} + shouldShowRateAutoUpdatedTooltip={distanceData.shouldShowRateAutoUpdatedTooltip} /> )} diff --git a/src/components/ProductTrainingContext/TOOLTIPS.ts b/src/components/ProductTrainingContext/TOOLTIPS.ts index e47bf9396fb9..f5b7c13c2747 100644 --- a/src/components/ProductTrainingContext/TOOLTIPS.ts +++ b/src/components/ProductTrainingContext/TOOLTIPS.ts @@ -3,7 +3,8 @@ import {dismissProductTraining} from '@libs/actions/Welcome'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; -const {CONCIERGE_LHN_GBR, RENAME_SAVED_SEARCH, OUTSTANDING_FILTER, ACCOUNT_SWITCHER, SCAN_TEST_DRIVE_CONFIRMATION, GPS_TOOLTIP, HAS_FILTER_NEGATION} = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; +const {CONCIERGE_LHN_GBR, RENAME_SAVED_SEARCH, OUTSTANDING_FILTER, ACCOUNT_SWITCHER, SCAN_TEST_DRIVE_CONFIRMATION, GPS_TOOLTIP, HAS_FILTER_NEGATION, MILEAGE_RATE_AUTO_UPDATED} = + CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; type ProductTrainingTooltipName = Exclude, typeof CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.MULTI_SCAN_EDUCATIONAL_MODAL>; @@ -75,6 +76,13 @@ const TOOLTIPS: Record = { priority: 1000, shouldShow: () => true, }, + [MILEAGE_RATE_AUTO_UPDATED]: { + content: 'productTrainingTooltip.mileageRateAutoUpdated', + onHideTooltip: (isDismissedUsingCloseButton = false) => dismissProductTraining(MILEAGE_RATE_AUTO_UPDATED, isDismissedUsingCloseButton), + name: MILEAGE_RATE_AUTO_UPDATED, + priority: 800, + shouldShow: () => true, + }, }; export default TOOLTIPS; diff --git a/src/components/ProductTrainingContext/index.tsx b/src/components/ProductTrainingContext/index.tsx index d87310027d4a..32bd75136558 100644 --- a/src/components/ProductTrainingContext/index.tsx +++ b/src/components/ProductTrainingContext/index.tsx @@ -143,6 +143,7 @@ function ProductTrainingContextProvider({children}: ChildrenProps) { tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SCAN_TEST_DRIVE_CONFIRMATION && tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.GPS_TOOLTIP && tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.HAS_FILTER_NEGATION && + tooltipName !== CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.MILEAGE_RATE_AUTO_UPDATED && isModalVisible ) { return false; diff --git a/src/languages/de.ts b/src/languages/de.ts index 8fd0f0768da0..d9bb8a7c7cfa 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -9547,6 +9547,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc scanTestDriveTooltip: 'Sende diese Quittung, um\ndie Probefahrt abzuschließen!', gpsTooltip: 'GPS-Tracking läuft! Wenn du fertig bist, stoppe die Aufzeichnung unten.', hasFilterNegation: 'Suchen Sie nach Ausgaben ohne Belege mit -has:receipt.', + mileageRateAutoUpdated: 'Wir haben den Kurs basierend auf Ihrem Reisedatum aktualisiert.', }, discardChangesConfirmation: { title: 'Änderungen verwerfen?', diff --git a/src/languages/en.ts b/src/languages/en.ts index cdf27de7f1a7..cdfe2d47fea7 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -9604,6 +9604,7 @@ const translations = { scanTestDriveTooltip: 'Send this receipt to\ncomplete the test drive!', gpsTooltip: "GPS tracking in progress! When you're done, stop tracking below.", hasFilterNegation: 'Search for expenses without receipts using -has:receipt.', + mileageRateAutoUpdated: 'We updated the rate based on your travel date.', }, discardChangesConfirmation: { title: 'Discard changes?', diff --git a/src/languages/es.ts b/src/languages/es.ts index be753ba8c002..439026f78bb9 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -9705,6 +9705,7 @@ ${amount} para ${merchant} - ${date}`, scanTestDriveTooltip: '¡Envía este recibo para\ncompletar la prueba!', gpsTooltip: '¡Seguimiento por GPS en curso! Cuando termines, detén el seguimiento a continuación.', hasFilterNegation: 'Busca gastos sin recibos usando -has:receipt.', + mileageRateAutoUpdated: 'Hemos actualizado la tasa según tu fecha de viaje.', }, discardChangesConfirmation: { title: '¿Descartar cambios?', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index bfef9ba65a21..167a484a5bfb 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -9578,6 +9578,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e scanTestDriveTooltip: 'Envoyez ce reçu pour\nterminer l’essai !', gpsTooltip: 'Suivi GPS en cours ! Lorsque vous avez terminé, arrêtez le suivi ci-dessous.', hasFilterNegation: 'Recherchez les dépenses sans reçus à l’aide de -has:receipt.', + mileageRateAutoUpdated: 'Nous avons mis à jour le taux en fonction de votre date de voyage.', }, discardChangesConfirmation: { title: 'Ignorer les modifications ?', diff --git a/src/languages/it.ts b/src/languages/it.ts index c3c0525786ec..9cf14dab25f6 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -9534,6 +9534,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, scanTestDriveTooltip: 'Invia questa ricevuta per\ncompletare il test drive!', gpsTooltip: 'Tracciamento GPS in corso! Quando hai finito, interrompi il tracciamento qui sotto.', hasFilterNegation: 'Cerca le spese senza ricevute usando -has:receipt.', + mileageRateAutoUpdated: 'Abbiamo aggiornato il tasso in base alla tua data di viaggio.', }, discardChangesConfirmation: { title: 'Scartare le modifiche?', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 22b0a46b97c3..9b74b8256db2 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -9414,6 +9414,7 @@ ${reportName} scanTestDriveTooltip: 'このレシートを送信して\n試用を完了しましょう!', gpsTooltip: 'GPS追跡を実行中です!完了したら、下で追跡を停止してください。', hasFilterNegation: '-has:receipt を使って、レシートのない経費を検索します。', + mileageRateAutoUpdated: '出張日にもとづいてレートを更新しました。', }, discardChangesConfirmation: { title: '変更を破棄しますか?', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index b6b836726f01..080e339ac85c 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -9501,6 +9501,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, scanTestDriveTooltip: 'Stuur deze bon om\nde proefrit te voltooien!', gpsTooltip: 'GPS-tracking bezig! Als je klaar bent, stop dan hieronder met bijhouden.', hasFilterNegation: 'Zoek naar uitgaven zonder bonnen met -has:receipt.', + mileageRateAutoUpdated: 'We hebben het tarief bijgewerkt op basis van je reisdatum.', }, discardChangesConfirmation: { title: 'Wijzigingen negeren?', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 9a6d8b988c7b..17061a2c4246 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -9486,6 +9486,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, scanTestDriveTooltip: 'Wyślij ten paragon, aby\nzakończyć jazdę próbną!', gpsTooltip: 'Śledzenie GPS w toku! Gdy skończysz, zatrzymaj śledzenie poniżej.', hasFilterNegation: 'Wyszukaj wydatki bez paragonów za pomocą -has:receipt.', + mileageRateAutoUpdated: 'Zaktualizowaliśmy stawkę na podstawie daty twojej podróży.', }, discardChangesConfirmation: { title: 'Odrzucić zmiany?', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 0e1b4717bb76..64430a91a745 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -9494,6 +9494,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, scanTestDriveTooltip: 'Envie este recibo para\nconcluir o test drive!', gpsTooltip: 'Rastreamento por GPS em andamento! Quando terminar, pare o rastreamento abaixo.', hasFilterNegation: 'Pesquise despesas sem recibos usando -has:receipt.', + mileageRateAutoUpdated: 'Nós atualizamos a taxa com base na sua data de viagem.', }, discardChangesConfirmation: { title: 'Descartar alterações?', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 5d9c083b3282..24d45d8544cb 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -9242,6 +9242,7 @@ ${reportName} scanTestDriveTooltip: '发送此收据以\n完成试用体验!', gpsTooltip: '正在进行 GPS 跟踪!完成后,请在下方停止跟踪。', hasFilterNegation: '使用 -has:receipt 搜索没有收据的报销。', + mileageRateAutoUpdated: '我们已根据您的出行日期更新了汇率。', }, discardChangesConfirmation: { title: '放弃更改?', diff --git a/src/libs/DebugUtils.ts b/src/libs/DebugUtils.ts index baaf409bff38..901c774b39bc 100644 --- a/src/libs/DebugUtils.ts +++ b/src/libs/DebugUtils.ts @@ -1069,6 +1069,7 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string) name: CONST.RED_BRICK_ROAD_PENDING_ACTION, defaultP2PRate: CONST.RED_BRICK_ROAD_PENDING_ACTION, distanceUnit: CONST.RED_BRICK_ROAD_PENDING_ACTION, + rateAutoUpdated: CONST.RED_BRICK_ROAD_PENDING_ACTION, odometerStart: CONST.RED_BRICK_ROAD_PENDING_ACTION, odometerEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION, odometerStartImage: CONST.RED_BRICK_ROAD_PENDING_ACTION, diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 4aa02dd5cc74..d7cbdfeb5659 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -615,7 +615,7 @@ function setMoneyRequestTimeCount(transactionID: string, count: number, isDraft: * if passed transaction previously had it to make sure that transaction does not have inconsistent * states (for example distanceUnit not matching distance unit of the new customUnitRateID) */ -function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined, transaction: OnyxEntry, policy: OnyxEntry) { +function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined, transaction: OnyxEntry, policy: OnyxEntry, rateAutoUpdated = false) { const isFakeP2PRate = customUnitRateID === CONST.CUSTOM_UNITS.FAKE_P2P_ID; let newDistanceUnit: Unit | undefined; @@ -652,6 +652,7 @@ function setCustomUnitRateID(transactionID: string, customUnitRateID: string | u ...(!isFakeP2PRate && {defaultP2PRate: null}), distanceUnit: newDistanceUnit, quantity: newQuantity, + rateAutoUpdated, }, }, }); @@ -733,6 +734,7 @@ function setMoneyRequestDistanceRate(currentTransaction: OnyxEntry, ...(!!policy && {defaultP2PRate: null}), ...(newDistanceUnit && {distanceUnit: newDistanceUnit}), ...(newDistance && {quantity: newDistance}), + rateAutoUpdated: false, }, }, }); diff --git a/src/pages/iou/request/step/IOURequestStepDate.tsx b/src/pages/iou/request/step/IOURequestStepDate.tsx index ff0606010102..bae93cf06184 100644 --- a/src/pages/iou/request/step/IOURequestStepDate.tsx +++ b/src/pages/iou/request/step/IOURequestStepDate.tsx @@ -134,7 +134,8 @@ function IOURequestStepDate({ isTrackDistanceExpense: isTrackExpense, expenseDate: newCreated, }); - setCustomUnitRateID(transactionID, rateID, transaction, effectivePolicy); + const currentRateID = transaction?.comment?.customUnit?.customUnitRateID; + setCustomUnitRateID(transactionID, rateID, transaction, effectivePolicy, rateID !== currentRateID); } } diff --git a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx index a5b44b32aaac..2f3fceaf60d6 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx @@ -140,9 +140,11 @@ function IOURequestStepDistanceRate({ ? effectiveRateID === rate.customUnitRateID && !hasUnitMismatchForMovingTrackExpense : DistanceRequestUtils.getDefaultMileageRate(policy)?.customUnitRateID === rate.customUnitRateID; const rateForDisplay = DistanceRequestUtils.getFormattedRateValue(unit, rate.rate, isSelected ? transactionCurrency : rate.currency, translate, toLocaleDigit, getCurrencySymbol); + const dateLabel = DistanceRequestUtils.getRateDateLabel(rate, translate); + const alternateText = [rate.name ? rateForDisplay : '', dateLabel].filter(Boolean).join(' • '); return { text: rate.name ?? rateForDisplay, - alternateText: rate.name ? rateForDisplay : '', + alternateText, keyForList: rate.customUnitRateID ?? rateForDisplay, value: rate.customUnitRateID, isDisabled: !rate.enabled, diff --git a/src/styles/variables.ts b/src/styles/variables.ts index 60a17fe596aa..272c3275c066 100644 --- a/src/styles/variables.ts +++ b/src/styles/variables.ts @@ -358,6 +358,8 @@ export default { hasFilterNegationTooltipShiftHorizontal: -16, hasFilterNegationTooltipShiftVertical: 40, hasFilterNegationTooltipMaxWidth: 260, + mileageRateTooltipShiftHorizontal: 12, + mileageRateTooltipShiftVertical: 4, inlineImagePreviewMinSize: 64, inlineImagePreviewMaxSize: 148, diff --git a/src/types/onyx/DismissedProductTraining.ts b/src/types/onyx/DismissedProductTraining.ts index 640d97ccc883..958cb35a1650 100644 --- a/src/types/onyx/DismissedProductTraining.ts +++ b/src/types/onyx/DismissedProductTraining.ts @@ -1,7 +1,16 @@ import CONST from '@src/CONST'; -const {CONCIERGE_LHN_GBR, RENAME_SAVED_SEARCH, OUTSTANDING_FILTER, ACCOUNT_SWITCHER, SCAN_TEST_DRIVE_CONFIRMATION, MULTI_SCAN_EDUCATIONAL_MODAL, GPS_TOOLTIP, HAS_FILTER_NEGATION} = - CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; +const { + CONCIERGE_LHN_GBR, + RENAME_SAVED_SEARCH, + OUTSTANDING_FILTER, + ACCOUNT_SWITCHER, + SCAN_TEST_DRIVE_CONFIRMATION, + MULTI_SCAN_EDUCATIONAL_MODAL, + GPS_TOOLTIP, + HAS_FILTER_NEGATION, + MILEAGE_RATE_AUTO_UPDATED, +} = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES; /** * This type is used to store the timestamp of when the user dismisses a product training ui elements. @@ -73,6 +82,11 @@ type DismissedProductTraining = { * When user dismisses the Has filter negation tooltip, we store the timestamp here. */ [HAS_FILTER_NEGATION]: DismissedProductTrainingElement; + + /** + * When user dismisses the mileage rate auto-updated tooltip, we store the timestamp here. + */ + [MILEAGE_RATE_AUTO_UPDATED]: DismissedProductTrainingElement; }; export default DismissedProductTraining; diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 066411806e22..e5f483bde0d1 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -183,6 +183,9 @@ type TransactionCustomUnit = { /** The unit for the distance/quantity */ distanceUnit?: Unit; + /** Whether the rate was auto-updated due to a date change (used for tooltip display) */ + rateAutoUpdated?: boolean; + /** * The distance in meters from the route Mapbox or Google Maps chose through the user supplied waypoints. * It is used to track when the user has manually increased the distance above the system-calculated route distance.