Skip to content

Surface Expensify Card monthly settlement date on card settings page - #98164

Open
MelvinBot wants to merge 7 commits into
mainfrom
claude-cardMonthlySettlementDate
Open

Surface Expensify Card monthly settlement date on card settings page#98164
MelvinBot wants to merge 7 commits into
mainfrom
claude-cardMonthlySettlementDate

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Implements the alternative solution approved on the issue: surface the Expensify Card's current monthly settlement date as supporting text under the Settlement frequency row of the workspace's Expensify Card Settings page (not on the settlement frequency selector screen). This brings NewDot to parity with OldDot, which shows admins when their monthly settlement occurs.

When a card's settlement frequency is Monthly and monthlySettlementDate is present, the Settlement frequency row now renders hint text reading Expensify cards will settle on the 27th of each month. (day-of-month derived from the existing ExpensifyCardSettings.monthlySettlementDate Onyx value). The recurring day-of-month is formatted with date-fns format using CONST.DATE.ORDINAL_DAY_OF_MONTH ('do' → e.g. 27th) and the active dateFnsLocale, matching the existing date formatting on the neighboring WorkspaceCardsListLabel. The change reuses the MenuItemWithTopDescription hint slot that already renders the "blocked" message for the Daily case (the new text is rendered in the else branch of that ternary), so no new component is introduced. Displaying the date only (not letting admins change it) is intentionally in scope per the issue.

A new workspace.expensifyCard.monthlySettlementDate translation function key was added to en.ts and all other locale files (de, el, es, fr, it, ja, nl, pl, pt-BR, zh-hans). A UI test (tests/ui/WorkspaceCardSettingsPageTest.tsx) was added covering the Monthly (hint shown) and Daily (hint hidden) cases.

Fixed Issues

$ #97578
PROPOSAL: #97578 (comment)

Tests

  1. Sign in and open a workspace that has the Expensify Card feature enabled and at least one card whose settlement frequency is Monthly (i.e. ExpensifyCardSettings.monthlySettlementDate is set).
  2. Go to Settings > Workspaces > [workspace] > Expensify Card > Settings.
  3. Verify the Settlement frequency row shows the title Monthly with supporting hint text below it reading Expensify cards will settle on the <day> of each month. (e.g. Expensify cards will settle on the 27th of each month.), where <day> is the ordinal day of the month from monthlySettlementDate.
  4. Switch (or open) a workspace whose settlement frequency is Daily and verify no monthly settlement date hint text is shown under the Settlement frequency row.
  5. If the workspace is not eligible for monthly settlement (blocked Daily case), verify the existing "blocked" hint text with the support link still renders as before and is not replaced by the settlement date text.
  6. Change your language (Settings > Preferences > Language) to a non-English locale and repeat step 3 — verify the hint text is localized and the ordinal day is formatted for that locale.
  • Verify that no errors appear in the JS console

Offline tests

  1. Load the Expensify Card Settings page for a Monthly workspace while online so the data is cached.
  2. Go offline.
  3. Re-open Settings > Workspaces > [workspace] > Expensify Card > Settings and verify the Expensify cards will settle on the <day> of each month. hint text still renders from cached Onyx data.

QA Steps

  1. On staging, sign in to an account that is an admin of a workspace with the Expensify Card feature enabled and a Monthly settlement frequency card.
  2. Go to Settings > Workspaces > [workspace] > Expensify Card > Settings.
  3. Verify the Settlement frequency row title reads Monthly and the supporting hint text below it reads Expensify cards will settle on the <day> of each month. (e.g. Expensify cards will settle on the 27th of each month.).
  4. Open a workspace with Daily settlement frequency and verify no monthly settlement date hint text appears under the Settlement frequency row.
  5. Verify no regression to the existing blocked-Daily hint text (with the support link) when the workspace is not eligible for monthly settlement.
  • 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

Note: automated verification could not exercise the new hint text because the available test account has no workspace with the Expensify Card feature provisioned (screenshot below shows the "No workspaces yet" state). The card-settings page renders and the app stays authenticated; the human co-author should capture the Monthly settlement-date screenshot on a provisioned account.

Workspaces tab showing 'No workspaces yet' empty state
- [ ] I verified that similar component doesn't exist in the codebase - [ ] I verified that all props are defined accurately and each prop has a `/** comment above it */` - [ ] I verified that each file is named correctly - [ ] I verified that each component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone - [ ] I verified that the only data being stored in component state is data necessary for rendering and nothing else - [ ] In component if we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes - [ ] For Class Components, any internal methods passed to components event handlers are bound to `this` properly so there are no scoping issues (i.e. for `onClick={this.submit}` the method `this.submit` should be bound to `this` in the constructor) - [ ] I verified that component internal methods bound to `this` are necessary to be bound (i.e. avoid `this.submit = this.submit.bind(this);` if `this.submit` is never passed to a component event handler like `onClick`) - [ ] I verified that all JSX used for rendering exists in the render method - [ ] I verified that each 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

Screenshots/Videosundefined

Co-authored-by: Brandon Stites <stitesExpensify@users.noreply.github.com>
@OSBotify

This comment has been minimized.

@codecov

codecov Bot commented Aug 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
...kspace/expensifyCard/WorkspaceCardSettingsPage.tsx 93.18% <100.00%> (+93.18%) ⬆️
... and 120 files with indirect coverage changes

@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 I re-ran through all checks — there's no code-related failure to fix. Every substantive check now passes (typecheck, all 8 test jobs, Bun tests, ESLint, Oxfmt, generateTranslations, Storybook, knip, React Compiler, spellcheck, all builds, and the perf tests).

The only two red checks are non-code process gates:

  • PR Author Checklist / checklist — failing because the PR Author Checklist isn't filled in (0 out of 38 items checked). This needs the human co-author to complete the checklist boxes; it isn't something I can/should auto-tick.
  • Check independent approval — waiting on an independent human reviewer's approval.

Both clear once the human author completes the checklist and the PR gets a review — no push from me is warranted here.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Re-checked — status is unchanged and there's still no code failure to push a fix for. Every substantive check passes (typecheck, all 8 test jobs, Bun tests, ESLint, Oxfmt, generateTranslations, Storybook, knip, React Compiler, spellcheck, all builds, and perf tests).

The only two red checks are non-code process gates that I can't/shouldn't resolve with a commit:

  • PR Author Checklist / checklist — the PR Author Checklist isn't filled in (0 of 38 items). The human co-author needs to complete the checklist boxes.
  • Check independent approval — awaiting an independent human reviewer's approval.

Both clear once the author completes the checklist and the PR is reviewed.

@linhvovan29546

Copy link
Copy Markdown
Contributor

@stitesExpensify Could you please assign me as a co-author instead of a reviewer? Thanks

Comment thread src/languages/en.ts Outdated
settlementFrequency: 'Settlement frequency',
settlementFrequencyDescription: 'Choose how often you’ll pay your Expensify Card balance.',
settlementFrequencyInfo: 'If you’d like to switch to monthly settlement, you’ll need to connect your bank account via Plaid and have a positive 90-day balance history.',
monthlySettlementDate: (date: string) => `Settles on the ${date} of each month.`,

@linhvovan29546 linhvovan29546 Aug 11, 2026

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.

The text should be Expensify cards will settle on the ${date} of each month.

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 Please address this one

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.

Done — updated the copy to Expensify cards will settle on the ${date} of each month. in src/languages/en.ts:6072, and kept the other 10 locale files in sync with the new phrasing. Pushed as 488fd3a.

npm run fmt, lint, and typecheck pass (the only typecheck error is a pre-existing, unrelated failure in useDiscardChangesConfirmationNative.test.ts).

@MelvinBot

Copy link
Copy Markdown
Contributor Author

There's nothing to fix in code here — every automated check that runs actual code (tests, typecheck, ESLint, Oxfmt, build, generateTranslations, spellcheck, etc.) is passing.

The only failing/pending checks are human-completion gates, which I can't (and shouldn't) satisfy by pushing code:

  • PR Author Checklist / checklist — fails until the author checks off the items in the PR's PR Author Checklist section. This PR still has // TODO: The human co-author must fill out... placeholders in the Tests and QA Steps sections and unchecked author boxes.
  • PR Reviewer Checklist / checklist — fails until a reviewer completes their checklist (requires a review to be posted).
  • Check independent approval — pending; clears once the required approvals are in.

Next step: the human co-author should fill in the Tests/QA sections, complete the PR Author Checklist boxes, and then get a review. No commit from me is needed.

@stitesExpensify

Copy link
Copy Markdown
Contributor

@linhvovan29546 added you

@MelvinBot

Copy link
Copy Markdown
Contributor Author

I looked into the failing checks. All three are human-completion checks, not code or test failures — there's no code fix I can push for these:

  • PR Author Checklist (checklist) — fails until the author checks off every item in the PR Author Checklist section of the PR body.
  • PR Reviewer Checklist (checklist) — fails until a reviewer completes the reviewer checklist.
  • Check independent approval — requires an independent reviewer's approval on the PR.

Every code/test check is passing (Bun tests, test jobs 1–8, ESLint, typecheck, Oxfmt, spellcheck, generateTranslations, build, etc.).

To get these green: complete the PR Author Checklist items in the description, have a reviewer fill out the reviewer checklist, and get the required independent approval. Note the ### Tests and ### QA Steps sections still have // TODO placeholders that the human co-author needs to fill in before marking the PR ready for review.

…n the...'

Co-authored-by: Linh Vo <linhvovan29546@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only remaining failing check is PR Author Checklist (checklist), which is a human-completion check — it fails until the author checks off every item in the PR Author Checklist section of the PR description. There's no code or test failure to push a fix for; all code/test checks (Bun tests, test jobs, ESLint, typecheck, build, etc.) are passing.

To clear it: complete the PR Author Checklist items in the description, and fill in the ### Tests and ### QA Steps sections (still // TODO) before marking the PR ready for review.

@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 1fc3b832..3495364b 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5980,7 +5980,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
             settlementFrequencyDescription: 'Wählen Sie, wie oft Sie den Saldo Ihrer Expensify Karte begleichen.',
             settlementFrequencyInfo:
                 'Wenn du zur monatlichen Abrechnung wechseln möchtest, musst du dein Bankkonto über Plaid verbinden und eine positive Kontohistorie der letzten 90 Tage haben.',
-            monthlySettlementDate: (date) => `Expensify Cards werden am ${date} jedes Monats abgerechnet.`,
+            monthlySettlementDate: (date: string) => `Expensify Karten werden am ${date} jedes Monats abgerechnet.`,
             applyCashbackToBill: 'Cashback auf meine Expensify-Rechnung anwenden',
             applyCashbackToBillDescription: 'Das Cashback von der Expensify-Karte wird zur Begleichung deiner Expensify-Rechnung verwendet.',
             frequency: {
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 5fe64887..0b5e27ee 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -320,7 +320,6 @@ const translations: TranslationDeepObject<typeof en> = {
         automatic: 'Αυτόματο',
         showing: 'Εμφανίζονται',
         of: 'του',
-        // @context Carousel pagination counter showing the current item's position out of the total (e.g. "3 of 50").
         currentOfTotal: ({current, total}: {current: number; total: number}) => `${current} από ${total}`,
         default: 'Προεπιλογή',
         update: 'Ενημέρωση',
@@ -6102,7 +6101,7 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
             settlementFrequencyDescription: 'Επιλέξτε πόσο συχνά θα εξοφλείτε το υπόλοιπο της Κάρτας Expensify.',
             settlementFrequencyInfo:
                 'Αν θέλετε να μεταβείτε σε μηνιαίο διακανονισμό, θα πρέπει να συνδέσετε τον τραπεζικό σας λογαριασμό μέσω Plaid και να έχετε θετικό ιστορικό υπολοίπου 90 ημερών.',
-            monthlySettlementDate: (date) => `Οι κάρτες Expensify διακανονίζονται στις ${date} κάθε μήνα.`,
+            monthlySettlementDate: (date: string) => `Οι Κάρτες Expensify θα εκκαθαρίζονται στις ${date} κάθε μήνα.`,
             applyCashbackToBill: 'Εφαρμογή επιστροφής μετρητών στον λογαριασμό μου στο Expensify',
             applyCashbackToBillDescription: 'Η επιστροφή μετρητών από την Κάρτα Expensify θα χρησιμοποιηθεί για την πληρωμή του λογαριασμού σας στην Expensify.',
             frequency: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 42590305..33ea43b7 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -5857,7 +5857,7 @@ ${amount} para ${merchant} - ${date}`,
             settlementFrequencyDescription: 'Elige con qué frecuencia pagarás el saldo de tu Tarjeta Expensify',
             settlementFrequencyInfo:
                 'Si deseas cambiar a la liquidación mensual, deberás conectar tu cuenta bancaria a través de Plaid y tener un historial de saldo positivo en los últimos 90 días.',
-            monthlySettlementDate: (date) => `Las tarjetas Expensify se liquidan el ${date} de cada mes.`,
+            monthlySettlementDate: (date: string) => `Las Tarjetas Expensify se liquidarán el ${date} de cada mes.`,
             applyCashbackToBill: 'Aplicar reembolso a mi factura de Expensify',
             applyCashbackToBillDescription: 'El reembolso de la Tarjeta Expensify se utilizará para el pago de tu factura de Expensify.',
             frequency: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index dafe5988..1988026c 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5993,7 +5993,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
             settlementFrequencyDescription: 'Choisissez la fréquence à laquelle vous réglerez le solde de votre Carte Expensify.',
             settlementFrequencyInfo:
                 'Si vous souhaitez passer à un règlement mensuel, vous devrez connecter votre compte bancaire via Plaid et disposer d’un historique de solde positif sur 90 jours.',
-            monthlySettlementDate: (date) => `Les cartes Expensify seront réglées le ${date} de chaque mois.`,
+            monthlySettlementDate: (date: string) => `Les règlements des Cartes Expensify auront lieu le ${date} de chaque mois.`,
             applyCashbackToBill: 'Appliquer le cashback à ma facture Expensify',
             applyCashbackToBillDescription: 'Le cashback de la carte Expensify sera utilisé pour le paiement de votre facture Expensify.',
             frequency: {
diff --git a/src/languages/it.ts b/src/languages/it.ts
index e1852189..1de7ca6b 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5946,7 +5946,7 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
             settlementFrequencyDescription: 'Scegli con quale frequenza pagherai il saldo della tua Carta Expensify.',
             settlementFrequencyInfo:
                 'Se desideri passare alla liquidazione mensile, dovrai collegare il tuo conto bancario tramite Plaid e avere uno storico del saldo positivo di 90 giorni.',
-            monthlySettlementDate: (date) => `Le carte Expensify vengono liquidate il ${date} di ogni mese.`,
+            monthlySettlementDate: (date: string) => `Le Carte Expensify verranno saldate il ${date} di ogni mese.`,
             applyCashbackToBill: 'Applica il cashback alla mia fattura Expensify',
             applyCashbackToBillDescription: 'Il cashback della Carta Expensify verrà utilizzato per il pagamento della tua fattura Expensify.',
             frequency: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index e62f64ba..bb4d3779 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -5883,7 +5883,7 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
             settlementFrequency: '清算頻度',
             settlementFrequencyDescription: 'Expensify カードの残高を支払う頻度を選択してください。',
             settlementFrequencyInfo: '月次清算に切り替えるには、Plaid を通じて銀行口座を連携し、直近90日間の残高履歴がプラスである必要があります。',
-            monthlySettlementDate: (date) => `Expensifyカードは毎月${date}に清算されます。`,
+            monthlySettlementDate: (date: string) => `Expensify カードの精算は毎月${date}に行われます。`,
             applyCashbackToBill: 'キャッシュバックを Expensify 請求書に適用する',
             applyCashbackToBillDescription: 'Expensify カードのキャッシュバックは、Expensify 請求書の支払いに使用されます。',
             frequency: {
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index c2002ec2..6efc52aa 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5940,7 +5940,7 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
             settlementFrequency: 'Uitbetalingsfrequentie',
             settlementFrequencyDescription: 'Kies hoe vaak je het saldo van je Expensify Kaart betaalt.',
             settlementFrequencyInfo: 'Als je wilt overschakelen naar maandelijkse afrekening, moet je je bankrekening koppelen via Plaid en een positieve saldohistorie van 90 dagen hebben.',
-            monthlySettlementDate: (date) => `Expensify-kaarten worden op de ${date} van elke maand afgerekend.`,
+            monthlySettlementDate: (date: string) => `Expensify kaarten worden op de ${date} van elke maand vereffend.`,
             applyCashbackToBill: 'Cashback toepassen op mijn Expensify-factuur',
             applyCashbackToBillDescription: 'De cashback van de Expensify Kaart wordt gebruikt voor het betalen van je Expensify-factuur.',
             frequency: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 3385c977..52fdfd8b 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5918,7 +5918,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
             settlementFrequency: 'Częstotliwość rozliczeń',
             settlementFrequencyDescription: 'Wybierz, jak często będziesz spłacać saldo swojej Karty Expensify.',
             settlementFrequencyInfo: 'Jeśli chcesz przejść na miesięczne rozliczenie, musisz podłączyć swoje konto bankowe przez Plaid i mieć dodatnią historię salda z ostatnich 90 dni.',
-            monthlySettlementDate: (date) => `Karty Expensify są rozliczane ${date} każdego miesiąca.`,
+            monthlySettlementDate: (date: string) => `Karty Expensify będą rozliczane ${date} dnia każdego miesiąca.`,
             applyCashbackToBill: 'Zastosuj zwrot gotówki do mojego rachunku Expensify',
             applyCashbackToBillDescription: 'Zwrot gotówki z Karty Expensify zostanie wykorzystany do opłacenia Twojego rachunku Expensify.',
             frequency: {
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index bd70f358..5b7b0474 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5936,7 +5936,7 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS
             settlementFrequency: 'Frequência de liquidação',
             settlementFrequencyDescription: 'Escolha com que frequência você vai pagar o saldo do seu Cartão Expensify.',
             settlementFrequencyInfo: 'Se quiser mudar para liquidação mensal, você precisará conectar sua conta bancária via Plaid e ter um histórico de saldo positivo de 90 dias.',
-            monthlySettlementDate: (date) => `Os cartões Expensify serão liquidados no dia ${date} de cada mês.`,
+            monthlySettlementDate: (date: string) => `Os Cartões Expensify serão liquidados no dia ${date} de cada mês.`,
             applyCashbackToBill: 'Aplicar reembolso à minha fatura do Expensify',
             applyCashbackToBillDescription: 'O reembolso do Cartão Expensify será usado para o pagamento da sua fatura do Expensify.',
             frequency: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index d79d7e52..e6d0950c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -5752,7 +5752,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
             settlementFrequency: '结算频率',
             settlementFrequencyDescription: '选择支付 Expensify 卡余额的频率。',
             settlementFrequencyInfo: '如果你想切换为按月结算,你需要通过 Plaid 连接你的银行账户,并且拥有过去 90 天为正数的余额记录。',
-            monthlySettlementDate: (date) => `Expensify 卡每月 ${date} 结算。`,
+            monthlySettlementDate: (date: string) => `Expensify 卡将在每月的 ${date} 结算。`,
             applyCashbackToBill: '将返现用于抵扣我的 Expensify 账单',
             applyCashbackToBillDescription: 'Expensify 卡的返现将用于支付你的 Expensify 账单。',
             frequency: {

Note

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

View workflow run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Same situation as my previous comment — the only failing checks are human-completion checks, not code/test failures, so there's no code fix I can push:

  • PR Author Checklist (checklist) — needs the author to check off the checklist items in the PR body.
  • PR Reviewer Checklist (checklist) — needs a reviewer to complete the reviewer checklist.
  • Check independent approval — needs an independent reviewer's approval.

Every code/test check (Bun tests, test jobs 1–8, ESLint, typecheck, Oxfmt, spellcheck, generateTranslations, build, etc.) is passing. To turn these green, complete the author checklist (and fill in the ### Tests/### QA Steps // TODO sections), have a reviewer fill out their checklist, and get the required independent approval.

@linhvovan29546

Copy link
Copy Markdown
Contributor

@MelvinBot Please update this translation: #98164 (comment).

Co-authored-by: Linh Vo <linhvovan29546@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — applied the Polyglot Parrot translation suggestions for monthlySettlementDate across all 10 locales (de, el, es, fr, it, ja, nl, pl, pt-BR, zh-hans). Pushed as e2751a1.

I skipped the parrot's unrelated currentOfTotal @context-comment removal in el.ts, since that comment isn't part of this PR. npm run fmt and typecheck pass (the only typecheck error is a pre-existing, unrelated failure in useDiscardChangesConfirmationNative.test.ts).

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Re-checked — the situation is unchanged. The only failing checks are human-completion gates, not code or test failures, so there's no code fix for me to push:

  • PR Author Checklist (checklist) — fails until the author checks off every item in the PR Author Checklist section of the PR body.
  • Check independent approval — requires an independent reviewer's approval on the PR.

Every code/test check is green (Bun tests, test jobs 1–8, ESLint, typecheck, Oxfmt, spellcheck, generateTranslations, build, etc.).

To turn these green: the author needs to complete the PR Author Checklist (and fill in the ### Tests / ### QA Steps sections that still have // TODO placeholders), then the PR needs the required independent approval. None of that can be resolved by a code push.

MelvinBot and others added 2 commits August 12, 2026 15:52
…tlementDate

Co-authored-by: Brandon Stites <stitesExpensify@users.noreply.github.com>
…ent date

Co-authored-by: Brandon Stites <stitesExpensify@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed the failing ESLint check.

Root cause: The new format(...) call for the monthly settlement date used a localized date-fns token (CONST.DATE.ORDINAL_DAY_OF_MONTHdo) without passing a locale, which the require-locale-for-localized-date-format rule flags — date-fns resolves the language from a mutable global React can't track, so the formatted day wouldn't re-render on language change.

Fix: Pull dateFnsLocale from useLocalize() and pass it to format:

const {translate, dateFnsLocale} = useLocalize();
...
format(new Date(settings.monthlySettlementDate), CONST.DATE.ORDINAL_DAY_OF_MONTH, {locale: dateFnsLocale})

The dateFnsLocale value on useLocalize() only exists on main, so I also merged main into the branch (it was 1 commit behind). npm run lint and npm run fmt pass locally on the changed file.

The remaining failing checks — PR Author Checklist, PR Reviewer Checklist, and Check independent approval — are human-completion checks, not code failures.

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

@stitesExpensify
stitesExpensify marked this pull request as ready for review August 12, 2026 23:41
@stitesExpensify
stitesExpensify requested a review from a team as a code owner August 12, 2026 23:41
@melvin-bot
melvin-bot Bot requested review from joekaufmanexpensify and linhvovan29546 and removed request for a team August 12, 2026 23:41
@melvin-bot

melvin-bot Bot commented Aug 12, 2026

Copy link
Copy Markdown

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

@linhvovan29546

linhvovan29546 commented Aug 13, 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 photo_2026-08-13 14 36 50
Android: mWeb Chrome photo_2026-08-13 14 36 52
iOS: HybridApp Simulator Screenshot - iPhone 17 Pro Max - 2026-08-13 at 14 34 17
iOS: mWeb Safari Simulator Screenshot - iPhone 17 Pro Max - 2026-08-13 at 14 00 51
MacOS: Chrome / Safari Screenshot 2026-08-13 at 13 57 42

@linhvovan29546

Copy link
Copy Markdown
Contributor

@MelvinBot Please write a UI test for this.

Co-authored-by: Linh Vo <linhvovan29546@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team as a code owner August 13, 2026 02:54
@melvin-bot
melvin-bot Bot requested review from stitesExpensify and removed request for a team August 13, 2026 02:54
@melvin-bot

melvin-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown

@stitesExpensify 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

Added a UI test covering the new settlement-frequency hint: tests/ui/WorkspaceCardSettingsPageTest.tsx. Pushed to this branch.

It renders WorkspaceCardSettingsPage with real Onyx + locale providers and asserts both branches of the change:

  • Monthly — with monthlySettlementDate set, the row shows Monthly and the hint Expensify cards will settle on the 27th of each month. (verifying the date-fns ordinal formatting).
  • Daily — with no monthlySettlementDate, the row shows Daily and no monthly-settlement hint is rendered.

Both tests pass locally (npm test -- tests/ui/WorkspaceCardSettingsPageTest.tsx), and lint is clean.

Test setup notes
  • Mirrors the existing WorkspaceTravelInvoicingSectionTest pattern (real OnyxListItemProvider + LocaleContextProvider, real MenuItemWithTopDescription), so the assertions exercise the actual English copy and hint rendering rather than mocked translations.
  • AccessOrNotFoundWrapper is mocked to render its children so the test can focus on the settlement-frequency row without provisioning full policy access.
  • useWorkspaceAccountID is mocked so useDefaultFundID resolves to a known fund ID, which is used to seed the private_expensifyCardSettings_ Onyx key.
  • Dates are timezone-safe: the suite runs under TZ=utc and the fixture uses a UTC-midnight date, so the ordinal (27th) is deterministic.

@linhvovan29546

Copy link
Copy Markdown
Contributor

@MelvinBot Please address this actions https://github.com/Expensify/App/actions/runs/31662267153/job/94329330678?pr=98164

Co-authored-by: Linh Vo <linhvovan29546@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed the failing Oxfmt check. Oxfmt wanted a blank line between the two import type groups in tests/ui/WorkspaceCardSettingsPageTest.tsx (the test file added for this PR). Ran npm run fmt and pushed the formatted result (d5bfb42).

@quinthar quinthar removed the #migrate label Aug 13, 2026
@linhvovan29546

Copy link
Copy Markdown
Contributor

@MelvinBot Please update the PR's description and test steps to match the changes in this PR. Also, please add the QA steps test.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Updated the PR description, Tests, Offline tests, and QA Steps to match the current changes. Key updates:

  • Explanation of Change: Corrected the stale hint copy — it now reads Expensify cards will settle on the 27th of each month. (was Settles on the 27th of each month. from the earlier commit). Also noted the date-fns format + dateFnsLocale usage, that the text renders in the else branch of the blocked-Daily ternary, the full list of locale files touched, and the new UI test (tests/ui/WorkspaceCardSettingsPageTest.tsx).
  • Tests: Rewrote to cover the Monthly (hint shown), Daily (hint hidden), blocked-Daily (existing support-link hint unchanged), and localized-copy cases.
  • Offline tests: Added steps verifying the hint renders from cached Onyx data while offline.
  • QA Steps: Added staging steps mirroring the Tests, replacing the placeholder TODO.

I also removed a duplicated checklist block and the stray ### Screenshots/Videosundefined fragment that were left at the end of the body.

A couple of things left for the human co-author:

  • The Screenshots/Videos section still needs real captures on a provisioned Expensify Card workspace — automated verification couldn't reach the Monthly hint because the test account has no Expensify Card workspace.
  • Please review/confirm the copy wording and the checklists before marking the PR ready for review.

@linhvovan29546

Copy link
Copy Markdown
Contributor

@MelvinBot I've tested all the test steps myself, and they all pass. Let's check all the boxes in your checklist to fix the PR Author Checklist CI failure.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Thanks for testing! I'd rather not check the PR Author Checklist boxes for you here — that checklist is the human author's attestation (it's exactly what the checklist gate is designed to enforce), so it should be ticked by you in the GitHub UI rather than by me.

Beyond the process point, several boxes aren't actually satisfiable yet, so checking them would be a false attestation:

  • "I included screenshots or videos for tests on all platforms" and "I ran the tests on all platforms" (Android Native, Android mWeb, iOS Native, iOS mWeb, MacOS) — the Screenshots/Videos section is still empty placeholders, and cross-platform runs haven't been captured. My automated run could only reach web, and even there it couldn't exercise the Monthly hint because the test account has no Expensify Card workspace provisioned.
  • "I turned off my network connection and tested it while offline" — needs your offline confirmation.

The checklist check requires every author box to be checked, so partially ticking won't clear it. Once you've added the platform screenshots/videos to the Screenshots section and are comfortable attesting to each item, tick the boxes yourself and the gate will pass.

Two cleanup notes on the body while you're in there:

  • The reviewer/component checklist got appended again below the MacOS screenshots block, leaving a duplicated set of - [ ] items and a stray ### Screenshots/Videosundefined line at the very end — worth removing so the checklist parses cleanly.

(For the record: the other red checks — Check independent approval — just need a reviewer, not a code change.)

@linhvovan29546

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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — updated the PR Author Checklist in the PR description to the full checklist you provided, with every item checked off.

I also cleaned up a leftover duplicated checklist fragment and the stray ### Screenshots/Videosundefined line that had reappeared at the end of the body.

One heads-up: the Screenshots/Videos section still needs real captures on a provisioned Expensify Card workspace before this is ready for review — the automated run couldn't reach the Monthly hint because the test account has no Expensify Card workspace.

@linhvovan29546

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 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 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)
  • 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.
  • 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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — the PR Author Checklist is now fully checked ✅.

While applying it I also cleaned up two artifacts that had reappeared at the bottom of the body: a duplicated (unchecked) checklist block and a stray ### Screenshots/Videosundefined fragment. Both are removed.

Note: the two - [ ] Verify that no errors appear in the JS console boxes under Tests and QA Steps were left unchecked on purpose — they belong to the Tests/QA sections (not the author checklist) and should be ticked once you've verified no console errors while running the steps.

@linhvovan29546 linhvovan29546 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.

NAB: The author's PR checklist is failing, which I can't fix since it looks like the GitHub Action automatically added the checklist.

@joekaufmanexpensify joekaufmanexpensify 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.

Good for product 👍

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants