Skip to content

Commit 853a8eb

Browse files
committed
Let the search dialog retry after a failed load
The request guard was set before the fetch and never cleared, so one failed package load left "Could not load packages." in place until a full reload, even after closing and reopening the dialog. Before the refactor the effect simply ran again on the next open. The guard now resets when the fetch throws, and opening the dialog clears a stale error during render, so the spinner shows again while the retry is in flight instead of the old message.
1 parent 7b699a5 commit 853a8eb

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

components/search/SearchDialog.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,20 @@ export function SearchDialog({ open, onClose }: Props) {
2727

2828
// Packages beim ersten Öffnen laden. Der Fetch läuft komplett im Effect und
2929
// schreibt State nur nach dem await — kein zusätzlicher Render-Durchlauf.
30+
// Nach einem Fehlschlag wird die Sperre wieder gelöst, damit das nächste
31+
// Öffnen es erneut versucht, statt die alte Fehlermeldung bis zum Reload
32+
// stehen zu lassen.
3033
useEffect(() => {
3134
if (!open || requested.current) return
3235
requested.current = true
3336
let alive = true
3437
async function run() {
3538
try {
3639
const list = await getPackages()
37-
if (alive) setPackages(list)
40+
if (alive) { setPackages(list); setError(null) }
3841
} catch (err) {
3942
console.error('[SearchDialog]', err)
43+
requested.current = false
4044
if (alive) setError('Could not load packages.')
4145
}
4246
}
@@ -65,11 +69,14 @@ export function SearchDialog({ open, onClose }: Props) {
6569
}, [open, onClose])
6670

6771
// Query bei Close resetten — während des Renders statt im Effect, damit der
68-
// Dialog beim nächsten Öffnen nie kurz die alte Eingabe zeigt.
72+
// Dialog beim nächsten Öffnen nie kurz die alte Eingabe zeigt. Beim Öffnen
73+
// fällt eine alte Fehlermeldung weg, sonst zeigt der Dialog sie weiter,
74+
// während der Effect darunter längst neu lädt.
6975
const [wasOpen, setWasOpen] = useState(open)
7076
if (wasOpen !== open) {
7177
setWasOpen(open)
72-
if (!open) setQuery('')
78+
if (open) setError(null)
79+
else setQuery('')
7380
}
7481

7582
if (!open) return null

0 commit comments

Comments
 (0)