fix(logos): „Mehr laden“ beginnt von vorn, wenn der Cursor nicht mehr existiert

Schlussreview F2. Hat jemand das Logo gelöscht oder ausgeblendet, hinter dem „Mehr laden“ ansetzt (der Cursor), antwortet Appwrite mit
400 `general_cursor_not_found`. „Nochmal versuchen“ wiederholte dann denselben Cursor und scheiterte immer wieder.

- Dieser Fehlertyp beim Nachladen löst jetzt `load('reset')` aus: die erste Seite der aktuellen Ansicht (gleiche Sortierung, gleicher Filter)
  wird neu geladen, die Kachel des gewählten Logos bleibt stehen. Kein Fehlertext, kein „Nochmal versuchen“ für den toten Cursor.
- Jeder andere Fehler beim Nachladen und jeder Fehler beim Laden der ersten Seite bleibt wie bisher (Meldung und „Nochmal versuchen“);
  die erste Seite hat keinen Cursor, ein Neuladen im Kreis ist ausgeschlossen.
- Tests mit einem Fehler {code: 400, type: 'general_cursor_not_found'}: Neuladen von Seite 1 mit Anfragefolge, Ansicht „Gemeldet“ bleibt,
  gewählte Kachel bleibt, Neuladen scheitert selbst, anderer Fehlertyp, Fehlertyp beim ersten Laden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 01:12:59 +00:00
1 parent 202254c09e
commit ec4e80c62c
2 files changed
+111 -1

No files matched your search

+14 -1
View File
@@ -43,6 +43,14 @@ export interface LogoPicker {
const LOAD_ERROR = msg('Die Logos konnten nicht geladen werden.');
/**
* Das Logo, hinter dem „Mehr laden“ ansetzt (der Cursor), gibt es nicht mehr, weil jemand es gelöscht oder ausgeblendet hat: Appwrite
* antwortet mit 400 `general_cursor_not_found`. Ein Wiederholen mit demselben Cursor scheitert dann immer wieder.
*/
function isCursorGone(err: unknown): boolean {
return typeof err === 'object' && err !== null && (err as { type?: unknown }).type === 'general_cursor_not_found';
}
/**
* Die Ansichten des Umschalters. „Beliebt“ und „Neu“ sind öffentlich, „Gemeldet“ und „Ausgeblendet“ nur für Admins (der Server prüft
* die Rechte; hier erscheinen die Knöpfe nur für sie). Die Admin-Ansichten zeigen die neuesten zuerst.
@@ -337,9 +345,14 @@ export function createLogoPicker(handlers: { onSelect(id: string | null): void }
nextCursor = page.nextCursor;
addLogos(page.logos);
void loadHearts(page.logos.map((logo) => logo.id));
} catch {
} catch (err) {
if (disposed || token !== loadToken) return;
loading = false;
if (mode === 'more' && isCursorGone(err)) {
// Die Liste hat sich unter dem Cursor verändert: statt eines Fehlers, den „Nochmal versuchen“ nicht beheben kann, von vorn laden.
void load('reset');
return;
}
failed = mode;
statusEl.textContent = t(LOAD_ERROR);
}