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.