[Payment due @dmkt9] Update Report suspicious activity copy to clarify when to lock an account#92841
Conversation
…ount Co-authored-by: Christina Dobrzynski <Christinadobrzyn@users.noreply.github.com>
🦜 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 32c68c42a5b..08b7c268a38 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2232,6 +2232,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Sobald Ihr Konto gesperrt ist, wird es eingeschränkt, bis eine Entsperrungsanfrage gestellt und eine Sicherheitsprüfung durchgeführt wurde',
unlockTitle: 'Wir haben Ihre Anfrage erhalten',
unlockDescription: 'Wir überprüfen das Konto, um sicherzustellen, dass es sicher entsperrt werden kann, und melden uns bei Fragen über Concierge.',
+ lockMyAccount: 'Sperren Sie mein Konto',
+ findYourSituation: 'Die meisten Probleme erfordern keine Sperrung Ihres Kontos! Finden Sie Ihre Situation unten:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Karte verloren oder unbekannte Abbuchungen</a>: Sperren Sie Ihre Karte und kontaktieren Sie Concierge, um unbekannte Transaktionen anzufechten.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Unbefugter Kontozugriff</a>: Sperren Sie Ihr Konto unten. Dadurch werden neue Expensify Karte-Transaktionen, Kartenbestellungen und Kontenänderungen blockiert. Wenn Sie ein Domain-Admin sind, wird dadurch außerdem alle domänenweite Kartenaktivität und Administratoraktionen angehalten.',
+ securityTeamFollowUp: 'Unser Sicherheitsteam wird sich nach der Sperrung von <a href="mailto:risk@expensify.com">risk@expensify.com</a> bei Ihnen melden.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Konto konnte nicht gesperrt werden',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index a776b747936..2a76fffac73 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2118,6 +2118,13 @@ const translations: TranslationDeepObject<typeof en> = {
domainAdminsDescription: 'Para administradores de dominio: Esto también detiene toda la actividad de la Tarjeta Expensify y las acciones administrativas en tus dominios.',
areYouSure: '¿Estás seguro de que deseas bloquear tu cuenta de Expensify?',
onceLocked: 'Una vez bloqueada, tu cuenta estará restringida hasta que se solicite el desbloqueo y se realice una revisión de seguridad.',
+ lockMyAccount: 'Bloquear mi cuenta',
+ findYourSituation: '¡La mayoría de los problemas no requieren bloquear tu cuenta! Busca tu situación a continuación:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Tarjeta perdida o cargos desconocidos</a>: Cancela tu tarjeta y contacta con Concierge para disputar transacciones desconocidas.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Acceso no autorizado a la cuenta</a>: Bloquea tu cuenta abajo. Esto bloquea nuevas transacciones con la Tarjeta Expensify, pedidos de tarjetas y cambios en la cuenta. Si eres administrador de dominio, esto también pausa toda la actividad de tarjetas y las acciones de administrador en todo el dominio.',
+ securityTeamFollowUp: 'Nuestro equipo de seguridad hará un seguimiento desde <a href="mailto:risk@expensify.com">risk@expensify.com</a> después del bloqueo.',
},
failedToLockAccountPage: {
failedToLockAccount: 'No se pudo bloquear la cuenta',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 7ba2b143d6e..d36d8a627dc 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2239,6 +2239,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Une fois verrouillé, votre compte sera restreint en attendant une demande de déverrouillage et un contrôle de sécurité',
unlockTitle: 'Nous avons bien reçu votre demande',
unlockDescription: 'Nous examinerons le compte pour vérifier qu’il est sûr de le déverrouiller et nous vous contacterons via Concierge si nous avons des questions.',
+ lockMyAccount: 'Verrouiller mon compte',
+ findYourSituation: 'La plupart des problèmes ne nécessitent pas de verrouiller votre compte ! Trouvez votre situation ci-dessous :',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Carte perdue ou frais inconnus</a> : Annulez votre carte et contactez Concierge pour contester les transactions inconnues.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Accès non autorisé au compte</a> : Verrouillez votre compte ci-dessous. Cela bloque les nouvelles transactions Carte Expensify, les commandes de carte et les modifications de compte. Si vous êtes administrateur de domaine, cela met également en pause toute l’activité de carte au niveau du domaine et les actions des administrateurs.',
+ securityTeamFollowUp: 'Notre équipe de sécurité effectuera un suivi depuis <a href="mailto:risk@expensify.com">risk@expensify.com</a> après le verrouillage.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Échec du verrouillage du compte',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 16c336b978b..d56e58c43ae 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2231,6 +2231,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Una volta bloccato, il tuo account sarà limitato in attesa di una richiesta di sblocco e di una revisione di sicurezza',
unlockTitle: 'Abbiamo ricevuto la tua richiesta',
unlockDescription: 'Esamineremo l’account per verificare che sia sicuro sbloccarlo e ti contatteremo tramite Concierge per qualsiasi domanda.',
+ lockMyAccount: 'Blocca il mio account',
+ findYourSituation: 'La maggior parte dei problemi non richiede il blocco del tuo account! Trova la tua situazione qui sotto:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Carta smarrita o addebiti non riconosciuti</a>: Annulla la tua carta e contatta Concierge per contestare le transazioni sconosciute.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Accesso non autorizzato all’account</a>: Blocca il tuo account qui sotto. Questo blocca le nuove transazioni con la Carta Expensify, gli ordini di carte e le modifiche all’account. Se sei un amministratore di dominio, sospende anche tutta l’attività delle carte a livello di dominio e le azioni amministrative.',
+ securityTeamFollowUp: 'Il nostro team di sicurezza ti ricontatterà da <a href="mailto:risk@expensify.com">risk@expensify.com</a> dopo il blocco.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Impossibile bloccare l’account',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 2b1a926f254..9b81e5b0047 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2209,6 +2209,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'ロックされると、解除リクエストとセキュリティ審査が完了するまでアカウントは制限されます',
unlockTitle: 'リクエストを受け付けました',
unlockDescription: 'アカウントが安全にロック解除できることを確認するために審査し、質問がある場合はConciergeを通じてご連絡します。',
+ lockMyAccount: 'アカウントをロックする',
+ findYourSituation: 'ほとんどの問題ではアカウントをロックする必要はありません。以下からご自身の状況をお探しください。',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">カードの紛失または身に覚えのない請求</a>:カードを解約し、不明な取引について異議申し立てをするために Concierge へご連絡ください。',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">不正なアカウントアクセス</a>:以下からアカウントをロックしてください。これにより、新しい Expensify カードの利用、カードの発行依頼、およびアカウントの変更ができなくなります。ドメイン管理者の場合、ドメイン全体のカードアクティビティと管理者アクションも一時停止されます。',
+ securityTeamFollowUp: 'ロック後、セキュリティチームが<a href="mailto:risk@expensify.com">risk@expensify.com</a>からご連絡します。',
},
failedToLockAccountPage: {
failedToLockAccount: 'アカウントのロックに失敗しました',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 58c0c33708d..34cabf95733 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -2226,6 +2226,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Zodra deze wordt vergrendeld, wordt je account beperkt in afwachting van een deblokkeringsverzoek en een beveiligingscontrole',
unlockTitle: 'We hebben je verzoek ontvangen',
unlockDescription: 'We beoordelen de account om te verifiëren dat het veilig is om deze te ontgrendelen en nemen via Concierge contact op als we vragen hebben.',
+ lockMyAccount: 'Account vergrendelen',
+ findYourSituation: 'Voor de meeste problemen hoef je je account niet te blokkeren. Zoek hieronder jouw situatie:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Kaart kwijt of onbekende kosten</a>: Annuleer je kaart en neem contact op met Concierge om onbekende transacties te betwisten.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Onbevoegde accounttoegang</a>: Vergrendel hieronder je account. Dit blokkeert nieuwe Expensify Kaart-transacties, kaartbestellingen en accountwijzigingen. Als je domeinbeheerder bent, pauzeert dit ook alle domeinbrede kaartactiviteiten en beheerdersacties.',
+ securityTeamFollowUp: 'Ons beveiligingsteam neemt na het blokkeren contact met je op vanaf <a href="mailto:risk@expensify.com">risk@expensify.com</a>.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Account vergrendelen mislukt',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index ae2c2b5fa0a..1921863ea7a 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2226,6 +2226,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Po zablokowaniu Twoje konto będzie ograniczone do czasu złożenia prośby o odblokowanie i przeprowadzenia kontroli bezpieczeństwa',
unlockTitle: 'Otrzymaliśmy Twoją prośbę',
unlockDescription: 'Przejrzymy konto, aby potwierdzić, że bezpiecznie je odblokować, i skontaktujemy się przez Concierge w razie pytań.',
+ lockMyAccount: 'Zablokuj moje konto',
+ findYourSituation: 'Większość problemów nie wymaga blokowania konta! Znajdź swoją sytuację poniżej:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Zgubiona karta lub nieznane obciążenia</a>: Anuluj swoją kartę i skontaktuj się z Concierge, żeby zakwestionować nieznane transakcje.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Nieautoryzowany dostęp do konta</a>: Zablokuj swoje konto poniżej. To zablokuje nowe transakcje Kartą Expensify, zamówienia kart i zmiany na koncie. Jeśli jesteś administratorem domeny, to wstrzyma też całą aktywność kart i działania administratorów w obrębie domeny.',
+ securityTeamFollowUp: 'Nasz zespół ds. bezpieczeństwa skontaktuje się z tobą z adresu <a href="mailto:risk@expensify.com">risk@expensify.com</a> po zablokowaniu.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Nie udało się zablokować konta',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index de0e271772d..fc8789dd555 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2223,6 +2223,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: 'Depois de bloqueada, sua conta ficará restrita até que seja feita uma solicitação de desbloqueio e uma revisão de segurança',
unlockTitle: 'Recebemos sua solicitação',
unlockDescription: 'Vamos revisar a conta para verificar se é seguro desbloqueá-la e entraremos em contato via Concierge caso haja dúvidas.',
+ lockMyAccount: 'Bloquear minha conta',
+ findYourSituation: 'A maioria dos problemas não exige bloquear sua conta! Encontre sua situação abaixo:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">Cartão perdido ou cobranças desconhecidas</a>: Cancele seu cartão e contate o Concierge para contestar transações desconhecidas.',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">Acesso não autorizado à conta</a>: Bloqueie sua conta abaixo. Isso bloqueia novas transações com o Cartão Expensify, pedidos de cartão e alterações na conta. Se você for admin de domínio, isso também pausa toda a atividade de cartões em todo o domínio e as ações de admin.',
+ securityTeamFollowUp: 'Nossa equipe de segurança vai entrar em contato a partir de <a href="mailto:risk@expensify.com">risk@expensify.com</a> após o bloqueio.',
},
failedToLockAccountPage: {
failedToLockAccount: 'Falha ao bloquear a conta',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 1df8087de86..58478064abb 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -2167,6 +2167,13 @@ const translations: TranslationDeepObject<typeof en> = {
onceLocked: '一旦被锁定,您的账户将受到限制,直至提交解锁请求并完成安全审查',
unlockTitle: '我们已收到您的请求',
unlockDescription: '我们会审核账户以确认解锁是否安全,如有任何问题将通过 Concierge 与您联系。',
+ lockMyAccount: '锁定我的账户',
+ findYourSituation: '大多数问题都不需要锁定你的账户!请在以下列表中找到与你相符的情况:',
+ lostCardOrCharges:
+ '<a href="https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-Transaction">卡片遗失或出现不明扣款</a>:请挂失您的卡片,并联系 Concierge 申诉未知交易。',
+ unauthorizedAccess:
+ '<a href="https://help.expensify.com/articles/expensify-classic/settings/Report-Suspicious-Activity">未经授权的账号访问</a>:请在下方锁定你的账号。这将阻止新的 Expensify 卡交易、卡片申请和账号更改。如果你是域管理员,这也会暂停整个域的所有卡片活动和管理员操作。',
+ securityTeamFollowUp: '锁定后,我们的安全团队将通过 <a href="mailto:risk@expensify.com">risk@expensify.com</a> 与您后续联系。',
},
failedToLockAccountPage: {
failedToLockAccount: '锁定账号失败',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
⏱️ Ran out of time before I could finish. This usually means the task was too complex or I got stuck exploring. Please try again with a more specific request or post in #melvinbot-ai. |
Add lockMyAccount, findYourSituation, lostCardOrCharges, unauthorizedAccess, and securityTeamFollowUp and remove the obsolete compromisedDescription and domainAdminsDescription keys so all locales match en.ts, fixing the typecheck and TranslateTest failures. Co-authored-by: Christina Dobrzynski <Christinadobrzyn@users.noreply.github.com>
|
🤖 Pushed a fix for the failing checks. Root cause: This PR updated the Fix: Synced all non-English locales ( Verification (run locally):
A couple of notes for the human reviewer:
|
|
⏱️ Ran out of time before I could finish. This usually means the task was too complex or I got stuck exploring. Please try again with a more specific request or post in #melvinbot-ai. |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@Christinadobrzyn I noticed that the translation in this PR differs from the Polyglot Parrot version. Which one should we use here? |
| <RenderHTML html={translate('lockAccountPage.findYourSituation')} /> | ||
| <RenderHTML html={translate('lockAccountPage.lostCardOrCharges')} /> | ||
| <RenderHTML html={translate('lockAccountPage.unauthorizedAccess')} /> | ||
| <RenderHTML html={translate('lockAccountPage.securityTeamFollowUp')} /> |
There was a problem hiding this comment.
@MelvinBot Each RenderHTML component should be wrapped in its own View to prevent text overlap between RenderHTML instances.
| <RenderHTML html={translate('lockAccountPage.findYourSituation')} /> | |
| <RenderHTML html={translate('lockAccountPage.lostCardOrCharges')} /> | |
| <RenderHTML html={translate('lockAccountPage.unauthorizedAccess')} /> | |
| <RenderHTML html={translate('lockAccountPage.securityTeamFollowUp')} /> | |
| <View> | |
| <RenderHTML html={translate('lockAccountPage.findYourSituation')} /> | |
| </View> | |
| <View> | |
| <RenderHTML html={translate('lockAccountPage.lostCardOrCharges')} /> | |
| </View> | |
| <View> | |
| <RenderHTML html={translate('lockAccountPage.unauthorizedAccess')} /> | |
| </View> | |
| <View> | |
| <RenderHTML html={translate('lockAccountPage.securityTeamFollowUp')} /> | |
| </View> |
There was a problem hiding this comment.
Good catch — the four RenderHTML instances currently share a single View (with gap4), and RenderHTML (react-native-render-html) can collapse/overlap sibling instances because each one manages its own layout. Wrapping each in its own View is the standard fix and matches how stacked RenderHTML blocks are handled elsewhere in the app.
I can't push this change myself, though: I can only make code changes when directed by the PR author, an assignee, or an existing co-author. Christinadobrzyn — would you like me to implement this? If so, reply tagging me and I'll apply the suggestion.
There was a problem hiding this comment.
@Christinadobrzyn It seems I don’t have write access to this PR, so could you please ask Melvin to apply the fix when you have a chance? Or could you ask him to handle the changes I requested in this PR? Thanks
There was a problem hiding this comment.
@MelvinBot, can you please implement the change you are suggesting?
There was a problem hiding this comment.
@MelvinBot, can you please implement the change you are suggesting?
@Christinadobrzyn It looks like this request caused Melvin to apply the translations from Polyglot Parrot. Could you assign this PR to me? It would make it easier for me to review it and request changes from Melvin when needed.
There was a problem hiding this comment.
🤖 Done — applied in 8204aa8. Each RenderHTML instance is now wrapped in its own View inside the outer gap4 container, matching the suggestion.
Verified locally: Prettier, lint-changed, typecheck-tsgo, and the React Compiler compliance check (COMPILED) all pass.
I don't know the answer to this, adding @rushatgabhane to this PR. @rushatgabhane might you know the answer to this based on your help with our other support articles? |
…utput Co-authored-by: Christina Dobrzynski <Christinadobrzyn@users.noreply.github.com>
|
@abzokhattab Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
🤖 Done — I aligned the non-English translations with the canonical Polyglot Parrot output in Why they differed: when I pushed the earlier "fix the failing checks" commit, I hand-wrote the 9 locale translations to get typecheck/key-parity passing. Polyglot Parrot is the official auto-generated source of truth for translations, so the right move is to use its strings — that's what Verified locally:
The PR now matches the Polyglot Parrot diff exactly, so there should no longer be a discrepancy to reconcile. |
…untCopy Co-authored-by: Christina Dobrzynski <Christinadobrzyn@users.noreply.github.com>
|
Merged the latest What was failing: The ESLint check reported Root cause: Branch drift. Fix: The remaining |
|
The failing ESLint check is unrelated to this PR — no fix is pushed. Analysis: The only ESLint errors are in Evidence:
Since both the failing file and its seatbelt baseline match The other red check, |
|
The failing ESLint check is unrelated to this PR — no fix pushed. Analysis: All 466 lint errors come from a single file, So this is a pre-existing lint failure on The only other failing checks are Recommendation: Once |
|
@dmkt9 will help us out on this one |
…untCopy Co-authored-by: Christina Dobrzynski <Christinadobrzyn@users.noreply.github.com>
|
Merged the latest Root cause: The failure was an Fix: The two remaining red checks — PR Author Checklist and PR Reviewer Checklist — are not code failures; they turn green once the human author/reviewer completes the checklist and Tests/QA sections. |
|
MelvinBot has made 5 consecutive commits trying to fix CI failures. Automatic CI fix dispatches are now paused for this PR. Next steps: A human should review the recent commits and resolve the conflicting CI errors manually. |
@rushatgabhane Thank you. I think using translations from Polyglot Parrot is the normal workflow, and they have already been applied, so I'll review this PR based on them. |
Co-authored-by: dmkt9 <dmkt9@users.noreply.github.com>
|
@MelvinBot Please update your checklist:
|
|
🤖 Done — updated the PR description:
I also finalized the Tests section (the suggested manual steps are now the test steps) and refreshed the implementation note that referenced applying the Polyglot Parrot patch, since that's already done. |
|
@codex review |
|
Codex Review: Didn't find any major issues. Nice work! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@MelvinBot merge the latest main branch into this PR to fix the ESLint failure |
…untCopy Co-authored-by: dmkt9 <dmkt9@users.noreply.github.com>
|
🤖 Merged the latest The ESLint failure was an eslint-seatbelt baseline drift — The merge applied cleanly with no conflicts. I wasn't able to run the full ESLint suite locally (the runner ran out of memory), so CI will re-run ESLint on the merge commit to confirm the fix — please keep an eye on the check. |
Reviewer Checklist
Screenshots/Videos |
|
🎯 @dmkt9, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
|
Thank you so much for all the help here @dmkt9!! |
@Christinadobrzyn Sure, happy to help here. I noticed the melvin-bot doesn't assign internal engineer automatically, so I will post in Slack to get help. |
|
🚧 @amyevans has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/amyevans in version: 9.4.7-0 🚀
Bundle Size Analysis (Sentry): |
Help site review — changes required ✅This PR reworks the New Expensify Lock Account / Report suspicious activity page copy, which is documented in our help site, so a docs update is required. What changed in this PR that the help site needs to reflect:
Article updated: The Expensify Classic Report Suspicious Activity article was left unchanged, since this PR only touched the New Expensify Lock Account page. Draft help site PR: #93484 @Christinadobrzyn, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |





Explanation of Change
Updates the Report suspicious activity (Lock Account) page copy so it guides people to the right resolution instead of locking their account for every security concern. The KYC/Risk team was seeing many accounts locked for card fraud or account closures — neither of which requires a lock — and those users then ignored the follow-up emails from risk@expensify.com.
The page now:
Implementation notes:
src/languages/en.ts(source of truth). The non-English locale files were synced to match the 🦜 Polyglot Parrot translation output.RenderHTML(same pattern already used by the domain "Report suspicious activity" page) so the help-article links andmailto:link are clickable.lockButtonTextprop onLockAccountPageBase, so the domain-admin variant (DomainReportSuspiciousActivityPage) keeps its existing "Report suspicious activity" button.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/642204
PROPOSAL:
Tests
Offline tests
Same as tests.
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand 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