Skip to content

Expand feed removal confirmation copy to mention deleted unsubmitted transactions - #98307

Merged
mollfpr merged 6 commits into
mainfrom
claude-expandFeedRemovalCopy
Aug 12, 2026
Merged

Expand feed removal confirmation copy to mention deleted unsubmitted transactions#98307
mollfpr merged 6 commits into
mainfrom
claude-expandFeedRemovalCopy

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Removing a company card feed both unassigns all cards and deletes unsubmitted (unreported/draft) transactions, but the removal confirmation copy only warned about the first consequence. This left admins able to confirm a destructive action without understanding its full impact.

This is a copy-only change that appends the missing consequence to the removeCardFeedDescription string in both language files, matching the phrasing already used by the sibling unassignCardDescription string.

  • English (src/languages/en.ts): "Are you sure you want to remove this card feed? This will unassign all cards and delete unsubmitted transactions."
  • Spanish (src/languages/es.ts): "¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas y eliminará las transacciones no enviadas."

The modal title (removeCardFeedTitle) is unchanged. No component or logic changes are required.

Fixed Issues

$ #97842
PROPOSAL: #97842 (comment)

Tests

// TODO: The human co-author must fill out the manual test steps before marking this PR as "ready for review".

Suggested steps (to be confirmed by the co-author):

  1. Go to a workspace with a company card feed → More featuresCompany cards → feed settings.
  2. Click Remove card feed.
  3. Verify the confirmation modal reads: "Are you sure you want to remove this card feed? This will unassign all cards and delete unsubmitted transactions."
  4. Switch the app language to Spanish and repeat; verify the Spanish copy reads: "¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas y eliminará las transacciones no enviadas."
  • Verify that no errors appear in the JS console

Offline tests

QA Steps

// TODO: These must be filled out, or the issue title must include "[No QA]."

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

…transactions

Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
@OSBotify

Copy link
Copy Markdown
Contributor

🦜 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 diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 74c0c7069f5..32ad4432a95 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6248,7 +6248,8 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
                 cardFeedAllowDeletingTransaction: 'Löschen von Transaktionen erlauben',
                 removeCardFeed: 'Kartenfeed entfernen',
                 removeCardFeedTitle: (feedName: string) => `${feedName}-Feed entfernen`,
-                removeCardFeedDescription: 'Möchtest du diesen Kartenfeed wirklich entfernen? Dadurch werden alle Karten zugewiesen.',
+                removeCardFeedDescription:
+                    'Sind Sie sicher, dass Sie diesen Kartenfeed entfernen möchten? Dadurch werden alle Karten zugewiesen und nicht eingereichte Transaktionen gelöscht.',
                 error: {
                     feedNameRequired: 'Name des Kartenfeeds ist erforderlich',
                     statementCloseDateRequired: 'Bitte wählen Sie ein Abrechnungsenddatum aus.',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 5acfee2009d..e8714a449ea 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -6381,7 +6381,8 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
                 cardFeedAllowDeletingTransaction: 'Να επιτρέπεται η διαγραφή συναλλαγών',
                 removeCardFeed: 'Αφαίρεση ροής κάρτας',
                 removeCardFeedTitle: (feedName: string) => `Κατάργηση ροής ${feedName}`,
-                removeCardFeedDescription: 'Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν την τροφοδοσία καρτών; Αυτό θα αποδεσμεύσει όλες τις κάρτες.',
+                removeCardFeedDescription:
+                    'Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν τη ροή καρτών; Αυτό θα αποδεσμεύσει όλες τις κάρτες και θα διαγράψει τις μη υποβληθείσες συναλλαγές.',
                 error: {
                     feedNameRequired: 'Απαιτείται όνομα ροής κάρτας',
                     statementCloseDateRequired: 'Επιλέξτε μια ημερομηνία κλεισίματος της κατάστασης.',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index c740bfb4ddc..35715e47dd7 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -6127,7 +6127,7 @@ ${amount} para ${merchant} - ${date}`,
                 cardFeedAllowDeletingTransaction: 'Permitir eliminación de transacciones',
                 removeCardFeed: 'Quitar la alimentación de tarjetas',
                 removeCardFeedTitle: (feedName) => `Eliminar el feed de ${feedName}`,
-                removeCardFeedDescription: '¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas y eliminará las transacciones no enviadas.',
+                removeCardFeedDescription: '¿Seguro que quieres eliminar este suministro de tarjetas? Esto desasignará todas las tarjetas y eliminará las transacciones no enviadas.',
                 error: {
                     feedNameRequired: 'Se requiere el nombre de la fuente de la tarjeta',
                     statementCloseDateRequired: 'Por favor, selecciona una fecha de cierre del estado de cuenta.',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 1b3923a1289..5146950a85e 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -6271,7 +6271,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
                 cardFeedAllowDeletingTransaction: 'Autoriser la suppression des transactions',
                 removeCardFeed: 'Supprimer le flux de cartes',
                 removeCardFeedTitle: (feedName: string) => `Supprimer le flux ${feedName}`,
-                removeCardFeedDescription: "Voulez-vous vraiment supprimer ce flux de cartes ? Cela retirera l'assignation de toutes les cartes.",
+                removeCardFeedDescription: 'Voulez-vous vraiment supprimer ce flux de cartes ? Cela retirera l’assignation de toutes les cartes et supprimera les transactions non soumises.',
                 error: {
                     feedNameRequired: 'Le nom du flux de carte est obligatoire',
                     statementCloseDateRequired: 'Veuillez sélectionner une date de clôture de relevé.',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index ff0a26d51c9..d2314275e8d 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6223,7 +6223,8 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
                 cardFeedAllowDeletingTransaction: 'Consenti l’eliminazione delle transazioni',
                 removeCardFeed: 'Rimuovi flusso carta',
                 removeCardFeedTitle: (feedName: string) => `Rimuovi feed ${feedName}`,
-                removeCardFeedDescription: 'Sei sicuro di voler rimuovere questo flusso di carte? Questo rimuoverà l’assegnazione di tutte le carte.',
+                removeCardFeedDescription:
+                    'Sei sicuro di voler rimuovere questo collegamento della carta? Questo rimuoverà l’assegnazione di tutte le carte ed eliminerà le transazioni non inviate.',
                 error: {
                     feedNameRequired: 'Il nome del feed della carta è obbligatorio',
                     statementCloseDateRequired: 'Seleziona una data di chiusura dell’estratto conto.',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index e8f52def158..a4ed30e120a 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6143,7 +6143,7 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
                 cardFeedAllowDeletingTransaction: '取引の削除を許可',
                 removeCardFeed: 'カードフィードを削除',
                 removeCardFeedTitle: (feedName: string) => `${feedName}フィードを削除`,
-                removeCardFeedDescription: 'このカードフィードを削除してもよろしいですか?すべてのカードの割り当てが解除されます。',
+                removeCardFeedDescription: 'このカードフィードを削除してもよろしいですか?すべてのカードの割り当てが解除され、未提出の取引が削除されます。',
                 error: {
                     feedNameRequired: 'カードフィード名は必須です',
                     statementCloseDateRequired: '明細書の締め日を選択してください。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 9bdb2bd6bf5..b1f10f5d2a4 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6211,7 +6211,7 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
                 cardFeedAllowDeletingTransaction: 'Verwijderen van transacties toestaan',
                 removeCardFeed: 'Kaartfeed verwijderen',
                 removeCardFeedTitle: (feedName: string) => `Feed ${feedName} verwijderen`,
-                removeCardFeedDescription: 'Weet je zeker dat je deze kaartfeed wilt verwijderen? Hierdoor worden alle kaarten losgekoppeld.',
+                removeCardFeedDescription: 'Weet je zeker dat je deze kaartfeed wilt verwijderen? Hiermee worden alle kaarten losgekoppeld en worden niet-ingediende transacties verwijderd.',
                 error: {
                     feedNameRequired: 'Naam van kaartfeed is vereist',
                     statementCloseDateRequired: 'Selecteer een afsluitdatum voor het afschrift.',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 5c0f5025d1c..d3a1250aa8d 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6189,7 +6189,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
                 cardFeedAllowDeletingTransaction: 'Zezwól na usuwanie transakcji',
                 removeCardFeed: 'Usuń źródło karty',
                 removeCardFeedTitle: (feedName: string) => `Usuń strumień ${feedName}`,
-                removeCardFeedDescription: 'Na pewno chcesz usunąć ten kanał kart? Spowoduje to odłączenie wszystkich kart.',
+                removeCardFeedDescription: 'Na pewno chcesz usunąć ten kanał kart? Spowoduje to odpięcie wszystkich kart i usunięcie niewysłanych transakcji.',
                 error: {
                     feedNameRequired: 'Nazwa źródła karty jest wymagana',
                     statementCloseDateRequired: 'Wybierz datę zamknięcia wyciągu.',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index a6f37501505..fcdccd19496 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6211,7 +6211,7 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS
                 cardFeedAllowDeletingTransaction: 'Permitir excluir transações',
                 removeCardFeed: 'Remover feed do cartão',
                 removeCardFeedTitle: (feedName: string) => `Remover feed ${feedName}`,
-                removeCardFeedDescription: 'Tem certeza de que deseja remover este feed de cartão? Isso removerá a atribuição de todos os cartões.',
+                removeCardFeedDescription: 'Tem certeza de que quer remover este feed de cartão? Isso vai desatribuir todos os cartões e excluir as transações não enviadas.',
                 error: {
                     feedNameRequired: 'O nome do feed do cartão é obrigatório',
                     statementCloseDateRequired: 'Selecione uma data de fechamento do extrato.',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index d8933b998f4..51ed1a2ef5b 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -5999,7 +5999,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
                 cardFeedAllowDeletingTransaction: '允许删除交易',
                 removeCardFeed: '移除卡片流水',
                 removeCardFeedTitle: (feedName: string) => `移除 ${feedName} 数据源`,
-                removeCardFeedDescription: '确定要移除此卡片数据源吗?这将取消分配所有卡片。',
+                removeCardFeedDescription: '确定要移除此卡片流水吗?这将取消分配所有卡片并删除所有未提交的交易。',
                 error: {
                     feedNameRequired: '必须填写卡片流水名称',
                     statementCloseDateRequired: '请选择账单结算日期。',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@hoangzinh

Copy link
Copy Markdown
Contributor

@MelvinBot can you apply diff in #98307 (comment)

@hoangzinh

Copy link
Copy Markdown
Contributor
Details
  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

@MelvinBot please set the PR Author checklist to the content in the details section above

Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed the failing Oxfmt check and pushed to this branch.

Root cause: Adding "y eliminará las transacciones no enviadas." pushed the removeCardFeedDescription line in src/languages/es.ts:6130 to ~199 columns, over the printWidth: 190 configured in .oxfmtrc.json. Oxfmt wraps a key: '…' property whose combined line exceeds the print width by moving the string literal onto its own line (indent +4) — so npm run fmt produced a diff and CI failed. The English string stayed at ~159 columns, which is why en.ts was fine.

Fix: Applied the wrap Oxfmt wanted (string content unchanged):

removeCardFeedDescription:
    '¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas y eliminará las transacciones no enviadas.',

Other checks:

  • build (Expensify Dev, Debug, true) — unrelated. It's the HybridApp remote iOS build and it failed on a curl artifact download, not on anything a language-string change could affect. Should clear on re-run.
  • Check independent approval and checklist — expected process checks, not code failures.

MelvinBot and others added 2 commits August 11, 2026 14:03
Applies the translation updates from the Polyglot Parrot workflow so all
locales mention that removing a card feed also deletes unsubmitted transactions.

Co-authored-by: hoangzinh <9639873+hoangzinh@users.noreply.github.com>
Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
…to claude-expandFeedRemovalCopy

Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>

# Conflicts:
#	src/languages/es.ts
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Applied the Polyglot Parrot translation diff from this comment and pushed to claude-expandFeedRemovalCopy.

Updated removeCardFeedDescription in all 10 locale files: de, el, es, fr, it, ja, nl, pl, pt-BR, zh-hans.

Details
  • The patch applied cleanly (git apply --check passed) and each added string was byte-verified with grep -F.
  • es.ts had a merge conflict with the remote Fix Oxfmt commit (0e7f5ef), which had wrapped the previous long string across two lines. I resolved it in favor of the Parrot translation — the new, shorter Spanish string fits on one line, which Oxfmt confirms.
  • Ran npm run fmt (Oxfmt — no reformatting needed beyond the applied diff) and lint on the changed files (clean). Typecheck/test/Storybook aren't affected since this is copy-only content on existing keys (no keys added or removed).

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The code failure is already fixed — the Oxfmt check now passes on the latest commit (the es.ts string-wrap I pushed earlier). My push kicked off a fresh CI run, so most checks are currently re-running.

The only remaining failure is PR Author Checklist / checklist, which isn't a code failure — it's the process gate that stays red until the human author ticks off the checklist items in the PR description. Nothing for me to fix there.

I'll leave the re-running checks to complete on their own.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The code-level failure is already resolved — my earlier fix made the Oxfmt check pass, and all remaining checks are just pending in the fresh CI run triggered by that push.

The only currently-failing check is PR Author Checklist / checklist, and that's not something I can fix with code. It fails on the authorChecklist.ts step because the author checklist items in the PR body are still unchecked and the Tests / QA Steps sections still contain the // TODO placeholders. Those need the human co-author (hoangzinh) to fill in the manual test steps and tick the checklist boxes before the check will pass.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only remaining non-ignored failure — build (Expensify Dev, Debug, true) — is unrelated infra flakiness, not something this PR can cause. No code change is needed.

What it is: The HybridApp remote iOS build failed during pod install while downloading a prebuilt dependency:

[!] Error installing React-Core-prebuilt
[!] /usr/bin/curl -f -L -o .../file.tgz https…

That's a transient CocoaPods/CDN download failure. This PR only touches src/languages/en.ts and es.ts (translation copy), which cannot affect native iOS pod installation or compilation.

Fix: Just re-run the failed job (I don't have permission to trigger a re-run here) — it should pass on retry.

Other checks:

  • Oxfmt — now passing. (The earlier Oxfmt failure I fixed is moot anyway: the Spanish string was since regenerated to a shorter single-line form that's already within the printWidth: 190 limit.)
  • checklist — expected process check, not a code failure.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Done — updated the PR Author Checklist in the PR description to the checked content you provided. All items in that section are now ticked.

Note: the "Verify that no errors appear in the JS console" boxes in the Tests and QA Steps sections are separate from the PR Author Checklist and were left as-is, since your request was scoped to the author checklist. Let me know if you'd like those checked too.

@hoangzinh

Copy link
Copy Markdown
Contributor

@MelvinBot makes this PR is ready for review

@MelvinBot
MelvinBot marked this pull request as ready for review August 11, 2026 14:23
@MelvinBot
MelvinBot requested a review from a team as a code owner August 11, 2026 14:23
@melvin-bot

melvin-bot Bot commented Aug 11, 2026

Copy link
Copy Markdown

@hoangzinh 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]

@melvin-bot
melvin-bot Bot removed request for a team August 11, 2026 14:23
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Marked this PR as ready for review.

All code-quality checks pass (ESLint, Oxfmt, typecheck, unit tests, Storybook, generateTranslations, React Compiler, unused styles, spellcheck).

The two red checks are not related to this copy-only change:

  • build (Expensify Dev, Debug, true) — failed at RockError: CocoaPods installation failed (native iOS dependency install, infra/flaky). A translation-string change can't affect a CocoaPods install.
  • Check independent approval — approval gate, not a code failure; it clears once a reviewer approves.

⚠️ One thing for you hoangzinh: the Tests and QA Steps sections still have the // TODO placeholders — those are human-authored and I can't fill them on your behalf. Please add the manual test steps (the PR body already has suggested steps you can confirm/adjust).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7c9ea1ab09

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

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".

Comment thread src/languages/de.ts Outdated
removeCardFeedTitle: (feedName: string) => `${feedName}-Feed entfernen`,
removeCardFeedDescription: 'Möchtest du diesen Kartenfeed wirklich entfernen? Dadurch werden alle Karten zugewiesen.',
removeCardFeedDescription:
'Sind Sie sicher, dass Sie diesen Kartenfeed entfernen möchten? Dadurch werden alle Karten zugewiesen und nicht eingereichte Transaktionen gelöscht.',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Say unassign, not assign, in German warning

For German users, this confirmation still says alle Karten zugewiesen, which means the removal will assign all cards, while the English source and the delete flow unassign/remove the cards from the feed. In the card-feed removal modal this reverses the destructive consequence the user is being asked to confirm; use the existing wording pattern from the nearby unassign strings, e.g. that the card assignments will be removed.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot can you check this feedback?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — the feedback is valid. The German string said Dadurch werden alle Karten zugewiesen ("all cards will be assigned"), which reverses the destructive consequence. The English source and every other locale say the cards are unassigned.

Fixed in f29a6ac using the German file's existing Zuweisung … aufheben pattern:

Sind Sie sicher, dass Sie diesen Kartenfeed entfernen möchten? Dadurch wird die Zuweisung aller Karten aufgehoben und alle nicht eingereichten Transaktionen werden gelöscht.

src/languages/de.ts:6252

I checked the other 9 locales I applied and they all correctly express "unassign" (es desasignará, fr retirera l’assignation, it rimuoverà l’assegnazione, ja 割り当てが解除, nl losgekoppeld, pl odpięcie, pt-BR desatribuir, zh-hans 取消分配, el αποδεσμεύσει), so this reversal was German-only.

@hoangzinh

hoangzinh commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Screen.Recording.2026-08-11.at.22.08.27.mov
Android: mWeb Chrome
Screen.Recording.2026-08-11.at.21.40.52.mov
iOS: HybridApp
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-08-11.at.21.34.37.mov

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The Oxfmt check I fixed earlier is now green. The only remaining failure — build (Expensify Dev, Debug, true) — is unrelated CI infrastructure, not something this PR can cause or fix, so I'm not pushing a code change for it.

What's failing: The HybridApp iOS remote build can't download a prebuilt CocoaPods artifact:

▲ Remote Cache: Failed to fetch cached build for rock-ios-simulator-Debug-… (NoSuchKey: The specified key does not exist)
[!] Error installing React-Core-prebuilt
curl: (56) The requested URL returned error: 401
■ RockError: CocoaPods installation failed.

A 401 on the React-Core-prebuilt fetch plus the remote-cache NoSuchKey miss is an auth/cache infrastructure problem in the iOS build pipeline. This PR only changes copy in src/languages/en.ts and src/languages/es.ts — it touches no iOS/native/pod code, so it cannot influence this step.

Recommended action: Re-run the build (Expensify Dev, Debug, true) job. If the 401 persists across re-runs, it's a credentials/remote-cache issue for the prebuilt pods that needs an infra look, independent of this PR.

The other non-green items (Check independent approval, checklist) are process checks, not code failures.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The Oxfmt check I fixed earlier is now passing. No code fix is needed for the remaining failures — none of them are related to this PR's copy change:

  • build (Expensify Dev, Debug, true) — unrelated CI infrastructure failure. The HybridApp iOS build died during CocoaPods install (curl: (56) The requested URL returned error: 401 fetching the prebuilt React-Core artifact, preceded by a remote-cache NoSuchKey miss), not from anything a language-string change touches. Re-running the build should clear it.
  • Check independent approval and PR Author Checklist / checklist — expected process checks, not code failures.

So there's nothing further for me to push — the only real failing check has been resolved.

The German string said "werden alle Karten zugewiesen" (all cards will be
assigned), reversing the destructive consequence. The English source and all
other locales say the cards will be unassigned. Use the German file's existing
"Zuweisung ... aufheben" pattern.

Co-authored-by: hoangzinh <9639873+hoangzinh@users.noreply.github.com>
Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team as a code owner August 11, 2026 14:36
@melvin-bot
melvin-bot Bot requested review from mollfpr and removed request for a team August 11, 2026 14:37
@melvin-bot

melvin-bot Bot commented Aug 11, 2026

Copy link
Copy Markdown

@mollfpr 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]

@MelvinBot

Copy link
Copy Markdown
Contributor Author

⚠️ MelvinBot CI Fix Loop Detected

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.

@hoangzinh

Copy link
Copy Markdown
Contributor

CI is stuck. @MelvinBot can you try to merge latest main to trigger CI again?

…valCopy

Co-authored-by: Vinh Hoang <hoangzinh@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Merged latest main into claude-expandFeedRemovalCopy (cdb5225) and pushed — a fresh CI run is now queued/in progress on the new commit.

Details
  • The branch was behind main; merged it via git merge origin/main (no rebase, no force-push). The merge was clean — no conflicts — and the translation changes are intact.
  • The previously stuck resolveRefs / Resolve build refs and failed adhoc build (Expensify Dev, Debug, true) jobs should re-run with this push.
  • Check independent approval isn't a CI failure — it just reflects that the PR still needs an independent reviewer approval.

@hoangzinh hoangzinh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢

@quinthar quinthar added the #migrate Relates to work in the #migrate room label Aug 11, 2026

@mollfpr mollfpr left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Only updating the translation file.

@trjExpensify @JmillsExpensify could you confirm if the new copy is what we desire? Thanks!

@trjExpensify

Copy link
Copy Markdown
Contributor

Yes.

@trjExpensify
trjExpensify requested review from trjExpensify and removed request for JmillsExpensify August 12, 2026 10:59

@trjExpensify trjExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change request to make it clearer that unsubmitted transactions will be deleted. 👍

@mollfpr
mollfpr merged commit b4174ee into main Aug 12, 2026
47 of 49 checks passed
@mollfpr
mollfpr deleted the claude-expandFeedRemovalCopy branch August 12, 2026 11:47
@github-actions

Copy link
Copy Markdown
Contributor

🚧 mollfpr has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

#migrate Relates to work in the #migrate room

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants