|
@@ -0,0 +1,114 @@
|
|
|
|
|
+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;
|
|
|
|
|
+}
|