Conversation
| const {translate} = useLocalize(); | ||
|
|
||
| const {cardID, maskedCardNumber, triggerAmount, triggerMerchant, resolution} = originalMessage; | ||
| const formattedAmount = CurrencyUtils.convertToDisplayString(triggerAmount, 'USD'); |
There was a problem hiding this comment.
❌ PERF-4 Memoize objects and functions passed as props
The CurrencyUtils.convertToDisplayString() function call is executed on every render, creating potential performance overhead. Since triggerAmount is a primitive value that should remain stable, this calculation should be memoized.
const formattedAmount = useMemo(
() => CurrencyUtils.convertToDisplayString(triggerAmount, 'USD'),
[triggerAmount]
);
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
This comment has been minimized.
This comment has been minimized.
|
I am going OOO and will look for someone to take this over. |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index cc222c92..8c9d2da5 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2022,7 +2022,7 @@ const translations = {
confirmButtonText: 'Ja, das tue ich.',
reportFraudButtonText: 'Nein, das war ich nicht.',
clearedMessage: ({cardLastFour}: {cardLastFour: string}) =>
- `die verdächtige Aktivität geklärt und die Karte x${cardLastFour} reaktiviert. Alles bereit, um weiter Ausgaben zu erfassen!`,
+ `hat die verdächtige Aktivität geklärt und die Karte x${cardLastFour} reaktiviert. Alles bereit, um weiter Ausgaben zu erfassen!`,
deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `hat die Karte mit den Endziffern ${cardLastFour} deaktiviert`,
alertMessage: ({
cardLastFour,
@@ -2034,7 +2034,7 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `verdächtige Aktivitäten auf der Karte mit der Endung ${cardLastFour} festgestellt. Erkennen Sie diese Abbuchung?
+ }) => `verdächtige Aktivitäten auf der Karte mit den Endziffern ${cardLastFour} festgestellt. Erkennen Sie diese Belastung?
${amount} für ${merchant} - ${date}`,
},
@@ -7167,6 +7167,7 @@ ${amount} für ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: 'Wartet darauf, dass der Zuständige die Aktion abschließt.',
hasChildReportAwaitingAction: 'Hat einen untergeordneten Bericht, der auf eine Aktion wartet',
hasMissingInvoiceBankAccount: 'Fehlendes Rechnungsbankkonto',
+ hasUnresolvedCardFraudAlert: 'Hat einen ungelösten Kartenbetrugsalarm',
},
reasonRBR: {
hasErrors: 'Hat Fehler in den Berichtsdaten oder Berichtsaktionen',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index c3870be3..486c0203 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2034,7 +2034,7 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `activité suspecte identifiée sur la carte se terminant par ${cardLastFour}. Reconnaissez-vous cette transaction ?
+ }) => `activité suspecte identifiée sur la carte se terminant par ${cardLastFour}. Reconnaissez-vous cette charge ?
${amount} pour ${merchant} - ${date}`,
},
@@ -7174,6 +7174,7 @@ ${amount} pour ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: "Attend que le responsable termine l'action",
hasChildReportAwaitingAction: 'Le rapport enfant attend une action',
hasMissingInvoiceBankAccount: 'Il manque le compte bancaire de la facture',
+ hasUnresolvedCardFraudAlert: 'A une alerte de fraude à la carte non résolue',
},
reasonRBR: {
hasErrors: 'Contient des erreurs dans les données du rapport ou des actions du rapport',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 65aa3389..1ddd7c7c 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2012,9 +2012,8 @@ const translations = {
cardFraudAlert: {
confirmButtonText: 'Sì, lo faccio',
reportFraudButtonText: 'No, non ero io',
- clearedMessage: ({cardLastFour}: {cardLastFour: string}) =>
- `abbiamo eliminato l'attività sospetta e riattivato la carta x${cardLastFour}. Tutto pronto per continuare a registrare le spese!`,
- deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `disattivato la carta che termina con ${cardLastFour}`,
+ clearedMessage: ({cardLastFour}: {cardLastFour: string}) => `ho eliminato l'attività sospetta e riattivato la carta x${cardLastFour}. Tutto pronto per continuare a fare spese!`,
+ deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `disattivato la carta terminante in ${cardLastFour}`,
alertMessage: ({
cardLastFour,
amount,
@@ -7175,6 +7174,7 @@ ${amount} per ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: "In attesa che l'assegnatario completi l'azione",
hasChildReportAwaitingAction: 'Ha un rapporto figlio in attesa di azione',
hasMissingInvoiceBankAccount: 'Manca il conto bancario della fattura',
+ hasUnresolvedCardFraudAlert: 'Ha un avviso di frode sulla carta non risolto',
},
reasonRBR: {
hasErrors: 'Ha errori nei dati del report o delle azioni del report',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index b84721e2..2756d32e 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2003,10 +2003,10 @@ const translations = {
validateCardTitle: 'あなたであることを確認しましょう',
enterMagicCode: ({contactMethod}: EnterMagicCodeParams) => `カードの詳細を表示するには、${contactMethod} に送信されたマジックコードを入力してください。1~2分以内に届くはずです。`,
cardFraudAlert: {
- confirmButtonText: 'はい、そうです。',
+ confirmButtonText: 'はい、そうです',
reportFraudButtonText: 'いいえ、それは私ではありませんでした。',
- clearedMessage: ({cardLastFour}: {cardLastFour: string}) => `不審な活動をクリアし、カードx${cardLastFour}を再有効化しました。経費精算を続ける準備が整いました!`,
- deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `${cardLastFour}で終わるカードを無効にしました。`,
+ clearedMessage: ({cardLastFour}: {cardLastFour: string}) => `不審な活動をクリアし、カードx${cardLastFour}を再アクティブ化しました。経費精算を続ける準備が整いました!`,
+ deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `${cardLastFour}で終わるカードを無効化しました。`,
alertMessage: ({
cardLastFour,
amount,
@@ -2017,9 +2017,9 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `カードの末尾が${cardLastFour}のカードで不審な活動が確認されました。この請求を認識していますか?
+ }) => `カード末尾が${cardLastFour}の不審な活動を確認しました。この請求を認識していますか?
-${date} - ${merchant}に${amount}`,
+${date}に${merchant}で${amount}`,
},
},
workflowsPage: {
@@ -7104,6 +7104,7 @@ ${date} - ${merchant}に${amount}`,
isWaitingForAssigneeToCompleteAction: '担当者がアクションを完了するのを待っています',
hasChildReportAwaitingAction: '子レポートがアクション待ちです。',
hasMissingInvoiceBankAccount: '請求書の銀行口座がありません',
+ hasUnresolvedCardFraudAlert: '未解決のカード詐欺警告があります',
},
reasonRBR: {
hasErrors: 'レポートまたはレポートアクションデータにエラーがあります',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 5e80cde0..3dc4ca69 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1107,7 +1107,7 @@ const translations = {
totalAmountGreaterThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `Het totale bedrag is ${amount} meer dan de oorspronkelijke uitgave.`,
totalAmountLessThanOriginal: ({amount}: TotalAmountGreaterOrLessThanOriginalParams) => `Het totale bedrag is ${amount} minder dan de oorspronkelijke uitgave.`,
splitExpenseZeroAmount: 'Voer een geldig bedrag in voordat u doorgaat.',
- splitExpenseOneMoreSplit: 'Geen splitsing toegevoegd. Voeg er ten minste \u00E9\u00E9n toe om op te slaan.',
+ splitExpenseOneMoreSplit: 'Geen splitsing toegevoegd. Voeg er ten minste één toe om op te slaan.',
splitExpenseCannotBeEditedModalTitle: 'Deze uitgave kan niet worden bewerkt',
splitExpenseCannotBeEditedModalDescription: 'Goedgekeurde of betaalde uitgaven kunnen niet worden bewerkt',
splitExpenseEditTitle: ({amount, merchant}: SplitExpenseEditTitleParams) => `Bewerk ${amount} voor ${merchant}`,
@@ -2010,9 +2010,9 @@ const translations = {
`Voer de magische code in die naar ${contactMethod} is gestuurd om uw kaartgegevens te bekijken. Het zou binnen een minuut of twee moeten aankomen.`,
cardFraudAlert: {
confirmButtonText: 'Ja, dat doe ik.',
- reportFraudButtonText: 'Nee, dat was ik niet.',
+ reportFraudButtonText: 'Nee, dat was ik niet',
clearedMessage: ({cardLastFour}: {cardLastFour: string}) =>
- `verdachte activiteit verwijderd en kaart x${cardLastFour} opnieuw geactiveerd. Alles klaar om door te gaan met declareren!`,
+ `verdachte activiteit gewist en kaart x${cardLastFour} opnieuw geactiveerd. Alles klaar om door te gaan met declareren!`,
deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `deactiveerde de kaart eindigend op ${cardLastFour}`,
alertMessage: ({
cardLastFour,
@@ -2024,7 +2024,7 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `verdachte activiteit geïdentificeerd op kaart eindigend op ${cardLastFour}. Herken je deze transactie?
+ }) => `geïdentificeerde verdachte activiteit op kaart eindigend op ${cardLastFour}. Herken je deze transactie?
${amount} voor ${merchant} - ${date}`,
},
@@ -7157,6 +7157,7 @@ ${amount} voor ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: 'Wacht op de verantwoordelijke om de actie te voltooien',
hasChildReportAwaitingAction: 'Heeft kindrapport wachtend op actie',
hasMissingInvoiceBankAccount: 'Heeft een ontbrekende factuur bankrekening',
+ hasUnresolvedCardFraudAlert: 'Heeft onopgeloste kaartfraude waarschuwing',
},
reasonRBR: {
hasErrors: 'Heeft fouten in rapport of rapportacties gegevens',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 5f790d2b..5842277c 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2009,8 +2009,8 @@ const translations = {
confirmButtonText: 'Tak, robię',
reportFraudButtonText: 'Nie, to nie byłem ja',
clearedMessage: ({cardLastFour}: {cardLastFour: string}) =>
- `usunięto podejrzaną aktywność i ponownie aktywowano kartę x${cardLastFour}. Wszystko gotowe do dalszego rozliczania!`,
- deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `dezaktywowano kartę kończącą się na ${cardLastFour}`,
+ `usunięto podejrzaną aktywność i ponownie aktywowano kartę x${cardLastFour}. Wszystko gotowe do dalszego rozliczania wydatków!`,
+ deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `dezaktywował kartę kończącą się na ${cardLastFour}`,
alertMessage: ({
cardLastFour,
amount,
@@ -7145,6 +7145,7 @@ ${amount} dla ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: 'Czeka na przypisanie do wykonania działania',
hasChildReportAwaitingAction: 'Raport podrzędny oczekuje na działanie',
hasMissingInvoiceBankAccount: 'Brakuje konta bankowego na fakturze',
+ hasUnresolvedCardFraudAlert: 'Ma nierozwiązane powiadomienie o oszustwie związane z kartą',
},
reasonRBR: {
hasErrors: 'Ma błędy w danych raportu lub działaniach raportu',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 2a42cc8d..0ae3b11e 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2023,7 +2023,7 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `atividade suspeita identificada no cartão com final ${cardLastFour}. Você reconhece esta cobrança?
+ }) => `atividade suspeita identificada no cartão terminando em ${cardLastFour}. Você reconhece essa cobrança?
${amount} para ${merchant} - ${date}`,
},
@@ -7157,6 +7157,7 @@ ${amount} para ${merchant} - ${date}`,
isWaitingForAssigneeToCompleteAction: 'Está aguardando o responsável concluir a ação',
hasChildReportAwaitingAction: 'Tem um relatório infantil aguardando ação',
hasMissingInvoiceBankAccount: 'Falta a conta bancária da fatura',
+ hasUnresolvedCardFraudAlert: 'Tem alerta de fraude no cartão não resolvido',
},
reasonRBR: {
hasErrors: 'Tem erros nos dados do relatório ou nas ações do relatório',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 67fda00d..54ea0744 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1982,10 +1982,14 @@ const translations = {
validateCardTitle: '让我们确认一下身份',
enterMagicCode: ({contactMethod}: EnterMagicCodeParams) => `请输入发送到${contactMethod}的验证码以查看您的卡详细信息。验证码应在一两分钟内到达。`,
cardFraudAlert: {
- confirmButtonText: '是的,我愿意。',
+ confirmButtonText: '是的,我愿意',
reportFraudButtonText: '不,不是我',
- clearedMessage: ({cardLastFour}: {cardLastFour: string}) => `已清除可疑活动并重新激活卡片 x${cardLastFour}。一切准备就绪,可以继续报销了!`,
- deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `已停用以${cardLastFour}结尾的卡片`,
+ clearedMessage: ({cardLastFour}: {cardLastFour: string}) =>
+ `已清除可疑活动并重新激活卡片 x${
+ //_/\__/_/ \_,_/\__/\__/\_,_/
+ cardLastFour
+ }。一切准备就绪,可以继续报销了!`,
+ deactivatedMessage: ({cardLastFour}: {cardLastFour: string}) => `已停用尾号为${cardLastFour}的卡片`,
alertMessage: ({
cardLastFour,
amount,
@@ -1996,9 +2000,9 @@ const translations = {
amount: string;
merchant: string;
date: string;
- }) => `在卡号以${cardLastFour}结尾的卡上发现可疑活动。您是否认可此笔费用?
+ }) => `在卡号末尾为${cardLastFour}的卡上发现可疑活动。您是否认可此笔费用?
-${merchant}的${amount} - ${date}`,
+${date},${merchant},金额为${amount}。`,
},
},
workflowsPage: {
@@ -7006,6 +7010,7 @@ ${merchant}的${amount} - ${date}`,
isWaitingForAssigneeToCompleteAction: '正在等待受让人完成操作',
hasChildReportAwaitingAction: '有子报告等待处理',
hasMissingInvoiceBankAccount: '缺少发票银行账户',
+ hasUnresolvedCardFraudAlert: '有未解决的卡片欺诈警报',
},
reasonRBR: {
hasErrors: '报告或报告操作数据中有错误',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
Noting that @allgandalf has taken over this PR and created a new one: #72176 |
Explanation of Change
Fixed Issues
$ #70683
PROPOSAL:
Tests
Offline tests
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
MacOS: Desktop