import { ApiClientError } from "@/lib/frontend/apiClient"; const DEFAULT_GENERIC = Object.freeze({ kind: "generic", title: "Fehler", description: "Beim Laden der Suche ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", }); const DEFAULT_VALIDATION = Object.freeze({ kind: "validation", title: "Ungültige Eingabe", description: "Bitte prüfen Sie Ihre Eingaben und versuchen Sie es erneut.", }); const VALIDATION_MAP = Object.freeze({ VALIDATION_SEARCH_MISSING_FILTER: { title: "Kein Suchbegriff", description: "Bitte geben Sie einen Suchbegriff ein.", }, VALIDATION_SEARCH_BRANCH: { title: "Niederlassung fehlt", description: "Bitte wählen Sie eine Niederlassung aus.", }, VALIDATION_SEARCH_BRANCHES: { title: "Niederlassungen fehlen", description: "Bitte wählen Sie mindestens eine Niederlassung aus.", }, VALIDATION_SEARCH_SCOPE: { title: "Ungültiger Suchbereich", description: "Bitte wählen Sie einen gültigen Suchbereich aus.", }, VALIDATION_SEARCH_LIMIT: { title: "Ungültige Seitengröße", description: "Die Anzahl der Ergebnisse pro Seite ist ungültig. Bitte versuchen Sie es erneut.", }, VALIDATION_SEARCH_CURSOR: { title: "Ungültige Paginierung", description: "Die nächsten Ergebnisse konnten nicht geladen werden. Bitte starten Sie die Suche erneut.", }, VALIDATION_SEARCH_DATE: { title: "Ungültiger Zeitraum", description: "Bitte prüfen Sie den Zeitraum und versuchen Sie es erneut.", }, VALIDATION_SEARCH_RANGE: { title: "Ungültiger Zeitraum", description: "Bitte prüfen Sie den Zeitraum und versuchen Sie es erneut.", }, }); /** * mapSearchError * * Centralized error-to-UI mapping for Search UI (RHL-024). * * Important: * - All returned strings are user-facing => German. * - We intentionally do NOT expose raw backend messages to the UI. * * @param {unknown} err * @returns {null | { * kind: "unauthenticated"|"forbidden"|"validation"|"generic", * title: string, * description: string * }} */ export function mapSearchError(err) { if (!err) return null; if (err instanceof ApiClientError) { if (err.code === "AUTH_UNAUTHENTICATED") { return { kind: "unauthenticated", title: "Sitzung abgelaufen", description: "Ihre Sitzung ist abgelaufen. Sie werden zum Login weitergeleitet.", }; } if (err.code === "AUTH_FORBIDDEN_BRANCH") { return { kind: "forbidden", title: "Kein Zugriff", description: "Sie haben keine Berechtigung, diesen Suchbereich zu verwenden.", }; } if (String(err.code || "").startsWith("VALIDATION_")) { const mapped = VALIDATION_MAP[err.code]; return { kind: "validation", title: mapped?.title || DEFAULT_VALIDATION.title, description: mapped?.description || DEFAULT_VALIDATION.description, }; } if (err.code === "CLIENT_NETWORK_ERROR") { return { kind: "generic", title: "Netzwerkfehler", description: "Bitte prüfen Sie Ihre Verbindung und versuchen Sie es erneut.", }; } return DEFAULT_GENERIC; } return DEFAULT_GENERIC; }