Skip to content

fix: show a "Refresh needed" empty state for stale search results - #100176

Merged
mountiny merged 9 commits into
Expensify:mainfrom
callstack-internal:error-stats-analogia
Sep 17, 2026
Merged

mountiny merged 9 commits into
Expensify:mainfrom
callstack-internal:error-stats-analogia

Conversation

@BartekObudzinski

@BartekObudzinski BartekObudzinski commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

A failed Search leaves the page showing "Oops... Something went wrong" under a broken magnifying glass. Nothing is broken. The results are out of date and a refresh fixes them.

This replaces that state with the design from the issue: a folder-and-arrows illustration, the heading "Refresh needed", the line "This page is out of date, refresh to see the latest", and a "Refresh" button. The button runs the same retry handler as before. A query the server rejected as malformed keeps the old copy, since that one did fail.

FullPageErrorView now takes optional illustration, illustrationWidth and illustrationHeight props. They default to the current illustration and its sizes, so the two other call sites render as before.

One detail worth flagging. FullPageErrorView asks for both illustration names in a single static useMemoizedLazyIllustrations(['BrokenMagnifyingGlass', 'FolderSync']) call rather than forwarding the prop into the hook, which is what WorkspaceCompanyCardsTable does. The hook fills its asset map once per mount, so a name it never received at mount resolves to PlaceholderIcon. Search can hit that: failureData writes errors alongside responseJsonCode: 0, then the real response code arrives in a later Onyx.merge, so the variant can flip while the view stays mounted.

Two things are still missing from this draft. The 10 non-English locale files have no search.searchResults.staleResults key yet, so npm run typecheck fails until generateTranslations runs. Screenshots are not in yet either.

Fixed Issues

$ #99352
PROPOSAL:

Tests

hasErrors in src/components/Search/index.tsx requires !isOffline, so offline mode will not show this state. Use the failing-requests switch.

  1. Press Cmd+D on the simulator to open the React Native dev menu, then pick "Open Test Preferences". Pressing d in the Metro terminal opens the same menu
  2. Turn on "Simulate failing network requests"
  3. Open Spend > Expenses
  4. Verify the page shows the folder-and-arrows illustration, the heading "Refresh needed", the line "This page is out of date, refresh to see the latest", and a green "Refresh" button
  5. Verify the illustration renders instead of a blank placeholder
  6. Turn "Simulate failing network requests" back off and press "Refresh"
  7. Verify the search reloads and the results appear
  8. Repeat on a narrow window and verify the heading still reads correctly
  9. Run a malformed search query and verify it still shows "Oops... Something went wrong" with no retry button

Watch the screen in the first few seconds. Once 3 requests have failed and 10 seconds have passed since the first one, FailureTracker raises a sustained failure, which sets isOffline to true and hides this state.

  • Verify that no errors appear in the JS console

Offline tests

This state cannot appear offline. hasErrors requires !isOffline, and a snapshot with no data goes through FullPageOfflineBlockingView.

  1. Go offline on Spend > Expenses
  2. Verify the behaviour matches main, so cached results stay visible and no "Refresh needed" state appears
  3. Go back online and verify the results refresh

QA Steps

Reaching this state needs the Search API to fail, which QA cannot force on staging. Requesting [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 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 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.

Screenshots/Videos

Android: Native
Screen.Recording.2026-09-04.at.09.48.26.mov
Android: mWeb Chrome
iOS: Native
Screen.Recording.2026-09-04.at.09.38.36.mov
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-09-04.at.09.11.34.mov

@melvin-bot

melvin-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown

Hey, I noticed you changed src/languages/en.ts in a PR from a fork. For security reasons, translations are not generated automatically for PRs from forks.

If you want to automatically generate translations for other locales, an Expensify employee will have to:

  1. Look at the code and make sure there are no malicious changes.
  2. Run the Generate static translations GitHub workflow. If you have write access and the K2 extension, you can simply click: [this button]

Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running:

npx bun ./scripts/generateTranslations.ts --help

Typically, you'd want to translate only what you changed by running npx bun ./scripts/generateTranslations.ts --compare-ref main

@BartekObudzinski BartekObudzinski changed the title fix: show a "Refresh needed" empty state for stale search results [No QA] [WIP] fix: show a "Refresh needed" empty state for stale search results Sep 2, 2026
@OSBotify

OSBotify commented Sep 7, 2026

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 4ae8c143..10717fa2 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9289,6 +9289,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
                 title: 'Keine Ausgaben zum Genehmigen',
                 subtitle: 'Null Ausgaben. Maximale Entspannung. Gut gemacht!',
             },
+            staleResults: {title: 'Aktualisierung erforderlich', subtitle: 'Diese Seite ist veraltet, aktualisieren Sie sie, um die neuesten Inhalte zu sehen', buttonText: 'Aktualisieren'},
         },
         columns: 'Spalten',
         editColumns: 'Spalten bearbeiten',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index d5fc56a9..b671ca44 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -9499,6 +9499,7 @@ ${reportName}`,
             emptyViolationSnapshotResults: {
                 subtitle: (formattedDate) => `Οι παραβάσεις παρακολουθούνται μόνο από ${formattedDate} και μετά. Δοκιμάστε να προσαρμόσετε τα φίλτρα ημερομηνίας σας.`,
             },
+            staleResults: {title: 'Απαιτείται ανανέωση', subtitle: 'Αυτή η σελίδα είναι παρωχημένη, κάντε ανανέωση για να δείτε τα πιο πρόσφατα', buttonText: 'Ανανέωση'},
         },
         columns: 'Στήλες',
         editColumns: 'Επεξεργασία στηλών',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 84866131..20d6ec72 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -9147,6 +9147,7 @@ ${reportName}`,
                 title: 'No hay gastos para aprobar',
                 subtitle: 'Cero gastos. Máxima relajación. ¡Bien hecho!',
             },
+            staleResults: {title: 'Es necesario actualizar', subtitle: 'Esta página está desactualizada, actualiza para ver lo más reciente', buttonText: 'Actualizar'},
         },
         columns: 'Columnas',
         editColumns: 'Editar columnas',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index a70f4f10..be09a7e9 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -9319,6 +9319,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
                 title: 'Aucune dépense à approuver',
                 subtitle: 'Zéro dépense. Détente maximale. Bien joué !',
             },
+            staleResults: {title: 'Actualisation requise', subtitle: 'Cette page n’est plus à jour, actualisez-la pour voir les dernières informations', buttonText: 'Actualiser'},
         },
         columns: 'Colonnes',
         editColumns: 'Modifier les colonnes',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 31d95702..c3f0f1a0 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9253,6 +9253,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
                 title: 'Nessuna spesa da approvare',
                 subtitle: 'Zero spese. Massimo relax. Ben fatto!',
             },
+            staleResults: {title: 'Aggiornamento necessario', subtitle: 'Questa pagina non è aggiornata, ricarica per vedere le ultime novità', buttonText: 'Aggiorna'},
         },
         columns: 'Colonne',
         editColumns: 'Modifica colonne',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index d9c70fd9..74acf87f 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -9124,6 +9124,7 @@ ${reportName}`,
                 title: '承認する経費はありません',
                 subtitle: '経費はゼロ。リラックス度マックス。お見事です!',
             },
+            staleResults: {title: '再読み込みが必要です', subtitle: 'このページは古くなっています。最新の情報を見るには再読み込みしてください。', buttonText: '更新'},
         },
         columns: '列',
         editColumns: '列の編集',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 13b91089..6319c874 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9216,6 +9216,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
                 title: 'Geen declaraties om goed te keuren',
                 subtitle: 'Nul uitgaven. Maximale chill. Goed gedaan!',
             },
+            staleResults: {title: 'Vernieuwen nodig', subtitle: 'Deze pagina is verouderd, vernieuw om de laatste versie te zien', buttonText: 'Verversen'},
         },
         columns: 'Kolommen',
         editColumns: 'Kolommen bewerken',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 3d4a2242..5c0421a8 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9237,6 +9237,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
                 title: 'Brak wydatków do zatwierdzenia',
                 subtitle: 'Zero wydatków. Maksymalny luz. Dobra robota!',
             },
+            staleResults: {title: 'Wymagane odświeżenie', subtitle: 'Ta strona jest nieaktualna, odśwież ją, żeby zobaczyć najnowszą wersję', buttonText: 'Odśwież'},
         },
         columns: 'Kolumny',
         editColumns: 'Edytuj kolumny',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index c2bb06fd..14c64744 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9220,6 +9220,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
                 title: 'Nenhuma despesa para aprovar',
                 subtitle: 'Zero despesas. Máximo sossego. Muito bem!',
             },
+            staleResults: {title: 'É preciso atualizar', subtitle: 'Esta página está desatualizada, atualize para ver a versão mais recente', buttonText: 'Atualizar'},
         },
         columns: 'Colunas',
         editColumns: 'Editar colunas',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index b2fe6edc..a63c59dc 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -8879,6 +8879,7 @@ ${reportName}`,
                 title: '没有报销可审批',
                 subtitle: '零报销,最大轻松。干得好!',
             },
+            staleResults: {title: '需要刷新', subtitle: '此页面已过期,刷新以查看最新内容', buttonText: '刷新'},
         },
         columns: '列',
         editColumns: '编辑列',

Note

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

View workflow run

@BartekObudzinski BartekObudzinski changed the title [WIP] fix: show a "Refresh needed" empty state for stale search results fix: show a "Refresh needed" empty state for stale search results Sep 7, 2026
@BartekObudzinski
BartekObudzinski marked this pull request as ready for review September 7, 2026 08:38
@BartekObudzinski
BartekObudzinski requested review from a team as code owners September 7, 2026 08:38
@melvin-bot
melvin-bot Bot requested review from a team, getusha and heyjennahay and removed request for a team September 7, 2026 08:38
@melvin-bot

melvin-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown

@getusha 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 September 7, 2026 08:38

@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: 2e4a14a0da

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/Search/index.tsx
@shawnborton

Copy link
Copy Markdown
Contributor

Video seems good to me 👍

@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

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

Files with missing lines Coverage Δ
src/components/BlockingViews/FullPageErrorView.tsx 95.23% <100.00%> (+1.12%) ⬆️
src/components/Icon/chunks/illustrations.chunk.ts 0.00% <ø> (ø)
src/components/Search/index.tsx 57.99% <100.00%> (+0.27%) ⬆️
... and 9 files with indirect coverage changes

@BartekObudzinski

Copy link
Copy Markdown
Contributor Author

@getusha

@getusha

getusha commented Sep 9, 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 Screenshot_1789580770
Android: mWeb Chrome Screenshot_1789581636
iOS: HybridApp

Wasn't able to build for iOS (new xcode update)

iOS: mWeb Safari
MacOS: Chrome / Safari Screenshot 2026-09-16 at 7 42 22 PM

@getusha

getusha commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

I noticed this flick when navigating. Not a big deal but i wonder if we can easily fix it

Screen.Recording.2026-09-09.at.2.38.50.in.the.afternoon.mov

sometimes it happens when refreshing

Screen.Recording.2026-09-09.at.2.41.18.in.the.afternoon.mov

@getusha

getusha commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Also, am i missing context on why we only show the updated copy for Expenses only?

Screenshot 2026-09-09 at 2 44 33 in the afternoon

@shawnborton

Copy link
Copy Markdown
Contributor

Oh interesting, I thought that would be more of a global replacement, not just for Expenses.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

This comment has been minimized.

@BartekObudzinski

Copy link
Copy Markdown
Contributor Author

I see it too. I would rather fix it in a separate issue. I reproduced the same flick on staging, which does not have any of these changes, so it is pre existing rather than something this PR introduced. Happy to open a follow up issue for it

# Conflicts:
#	src/components/Search/index.tsx
@BartekObudzinski

Copy link
Copy Markdown
Contributor Author

@getusha

@getusha

getusha commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

I see it too. I would rather fix it in a separate issue. I reproduced the same flick on staging, which does not have any of these changes, so it is pre existing rather than something this PR introduced. Happy to open a follow up issue for it

Oh ok. thanks we can handle it separately

@melvin-bot
melvin-bot Bot requested a review from mountiny September 16, 2026 18:07
mountiny
mountiny previously approved these changes Sep 17, 2026

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

Thanks, can you check the failing oxfmt check?

@mountiny
mountiny merged commit 99c7db6 into Expensify:main Sep 17, 2026
37 of 38 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

🚧 mountiny 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.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.82-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 cancelled 🔪
🍎 iOS 🍎 cancelled 🔪

@MelvinBot

Copy link
Copy Markdown
Contributor

🤖 Yes, help site changes are required. Draft PR: Docs updates for E/A#100176 Refresh needed state on the Spend page

This PR added two pieces of user-facing copy that no article covered:

  • The new Refresh needed state and its Refresh button, which members will search for by the words on screen.
  • The fact that "Oops... Something went wrong" now means specifically an invalid search and has no Refresh button, so refreshing is not the fix.

Both went into Getting-Started-with-the-Spend-Page.md — it already owns the Spend page workflow and already documents a comparable "why is this disabled" case for the total spend currency picker. No new article, because this is not a separate workflow.

What changed and how it was verified

Changes (one file, +17/-1):

  • New ## What to do when the Spend page shows "Refresh needed" section, alongside the other standalone Spend page sections.
  • Two FAQ entries: one for the Refresh needed state, one for the invalid-search error.
  • Retrieval keywords for the phrases members actually search ("Refresh needed", "page out of date", "results not loading").

Copy source: every quoted string is verbatim from src/languages/en.ts on mainsearch.searchResults.staleResults and errorPage.title — so the article matches what shipped.

UI verification: Spend, Expenses, Filters, and Display were confirmed against the live dev web UI with exact casing. The Refresh needed state itself could not be reproduced on a fresh test account: enabling Simulate failing network requests on an account with no expenses left the list empty rather than stale, since there is nothing cached to go out of date. Its copy therefore comes from en.ts, not a screenshot — worth a glance when you review.

Guidelines applied: HELPSITE_NAMING_CONVENTIONS.md (bold UI labels, no quotation marks around button names, exact casing), HELP_AUTHORING_GUIDELINES.md (task-based ## headings, no new # headings, no ###, relative links kept out of numbered steps, # FAQ exempt), and TEMPLATE.md.

Not changed: General-product-troubleshooting.md already covers a page that won't load generically, so the new section links to it instead of duplicating it. Nothing on the help site referenced the old "Oops... Something went wrong" copy, so there was nothing stale to remove.

@BartekObudzinski, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR Ready for review

@jponikarchuk

Copy link
Copy Markdown

This PR failing because of the issue #101520
This issue is reproducible in: All platforms

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #101520 was identified to be related to this PR.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.86-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.89-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/luacmartins in version: 9.4.89-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 failure ❌

Bundle Size Analysis (Sentry):

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.

7 participants