A bad list reply crashes or silently empties editor screens
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 45/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- express, javascript, react
Research direction
Start with apiFetch.js and the named callers in Pages.jsx, useTranslationVersions.js, widgetStore.js, Media.jsx, mediaUsageDisplay.js, and themeUpdateStore.js; trace how each handles a successful response with the wrong shape. Add tests for the affected reads and translation list queries, then sweep the other list screens. Done means bad replies show visible load errors, screens remain usable, and empty instead of error cases are recorded under T64; the API caching decision is also made.
Written by the indexing model from the issue text.
Description
A bad reply from the server crashes the Pages screen or empties editor screens. Show a clear "couldn't load" instead.
Seen on 2026-10-02 at 9e98dad7, after upgrading a pre-0.9.10 data folder, in one Firefox session. Some editor requests made during a screen load intermittently resolved to an empty 2xx body, which parseJsonResponse (apiFetch.js) turns into null. The server was not the source: the same requests sent directly (curl, and four concurrent fetch calls from the console) always returned full bodies, and getAllPages responds with an array or a 500. It happened only with the HTTP cache enabled, never in a private window or Firefox Troubleshoot Mode, and stopped after a browser restart, so the trigger is unconfirmed (an extension or the session's cache state). The four affected reads and what each did with null:
GET /pageson Pages:loadPagesstores it unchecked (Pages.jsx:152);useTranslationVersionsruns for every project, single-language too, andentries.mapthrew, so the error boundary replaced the screen.GET /widgetsin the page editor:loadSchemas(widgetStore.js) catches the failure and keepsschemas: {}witherrorset, but nothing shows the error. Widgets displayed their raw type names, had no settings and the inserter was empty.GET /pagesandGET /collections/:typefeeding Media's usage labels (Media.jsxloadUsageTitles):buildUsageTitleMapthrew onnull(its defaults only coverundefined), the barecatchfell back to the global titles, and "Used in" showed rawpage:<uuid>/collection:<uuid>sources.GET /themes/update-count(themeUpdateStore.js):result.countthrew and was logged; the badge silently stayed at its previous value.
Any non-array or non-object 2xx body (e.g. an HTML string) fails the same way. Other callers to check: CollectionItems.jsx (items) and EditorTopBar.jsx (allPages) feed useTranslationVersions from server lists, and CollectionItemForm.jsx builds its entries from the item's translation group. Other editor list screens (menus, media, collections and similar) have not been swept. Embedding apps mount these screens and inherit the behaviour.
Treat a reply of the wrong shape as a load failure, and show it: the existing load-error toast for lists, and a visible "couldn't load widgets" state in the editor. Not an empty list, which would read as deleted content. Then sweep the remaining list screens once: fix crashes and silent failures here, and hand cases that show an empty list instead of an error to T64. Separately consider Cache-Control: no-store on editor API JSON replies: they are per-request data, and Express currently sends ETags with no cache directive, so browsers revalidate and reuse stored copies.
Done when: Each read above, and each list query feeding useTranslationVersions, shows a visible load error on a bad reply, the screen stays usable, and tests cover it. The sweep of other list screens is done, with any empty-instead-of-error cases recorded under T64. The API caching decision is made.
Start: Pages.jsx, useTranslationVersions.js, widgetStore.js, Media.jsx, mediaUsageDisplay.js, themeUpdateStore.js, apiFetch.js. Source: 2026-10-02 upgrade walkthrough.
- Dominant language
- JavaScript
- Stars
- 162
- Forks
- 6
- Avg merge
- 12h 55m
- Merged PRs (30d)
- 2
Getting set up
- Ships a Dockerfile or Docker Compose file
- No pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from tsiger/widgetizer
-
question
Difficulty 1/5 1-3 hours Newbie friendliness 82/100
tsiger/widgetizer#194 ·
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
tsiger/widgetizer#181 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
tsiger/widgetizer#175 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
tsiger/widgetizer#174 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
tsiger/widgetizer#173 ·
All issues in tsiger/widgetizer
Similar issues
-
bug confirmed issue
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
open-webui/open-webui#33196 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
fable-compiler/Fable#5157 ·
Maintainers usually reply within 1 day
-
New tool: PaperBananaPossibly taken @github-actions claimed this today. Opensubmission triage
Difficulty 1/5 Under an hour Newbie friendliness 75/100
kausalflow/tools#243 · 1 comment ·
Maintainers usually reply within 1 day
-
area: apple-music area: build-release bug effort: small priority: high
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
ChristianTabor/Argon#32 ·
Maintainers usually reply within 1 day
-
0️⃣ phase/new
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day