From 7afcc206f372ade1be1abb2f473d334e8d2e715c Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Thu, 4 Dec 2025 21:14:44 +0100 Subject: [PATCH] =?UTF-8?q?=20Gefixt:=20Objekt-Namen=20werden=20jetzt=20f?= =?UTF-8?q?=C3=BCr=20Galerie/Share=20normalisiert,=20damit=20React=20keine?= =?UTF-8?q?=20Objekte=20mehr=20rendern=20muss.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Änderungen: - resources/js/guest/services/galleryApi.ts: Locale-Felder (event.name, event.description) werden nach dem Fetch per coerceLocalized in Strings überführt. - resources/js/guest/services/photosApi.ts: fetchPhotoShare normalisiert event.name auf einen String mit de/en-Fallback; Fehler bei fehlendem Share unverändert. --- resources/js/guest/services/galleryApi.ts | 35 ++++++++++++++++++++++- resources/js/guest/services/photosApi.ts | 32 ++++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/resources/js/guest/services/galleryApi.ts b/resources/js/guest/services/galleryApi.ts index cf3b997..f7009e0 100644 --- a/resources/js/guest/services/galleryApi.ts +++ b/resources/js/guest/services/galleryApi.ts @@ -59,6 +59,29 @@ async function handleResponse(response: Response): Promise { return data as T; } +function coerceLocalized(value: unknown, fallback: string): string { + if (typeof value === 'string' && value.trim() !== '') { + return value; + } + + if (value && typeof value === 'object') { + const obj = value as Record; + const preferred = ['de', 'en']; + for (const key of preferred) { + const candidate = obj[key]; + if (typeof candidate === 'string' && candidate.trim() !== '') { + return candidate; + } + } + const firstString = Object.values(obj).find((candidate) => typeof candidate === 'string' && candidate.trim() !== ''); + if (typeof firstString === 'string') { + return firstString; + } + } + + return fallback; +} + export async function fetchGalleryMeta(token: string, locale?: LocaleCode): Promise { const params = new URLSearchParams(); if (locale) params.set('locale', locale); @@ -70,7 +93,17 @@ export async function fetchGalleryMeta(token: string, locale?: LocaleCode): Prom credentials: 'omit', }); - return handleResponse(response); + const data = await handleResponse(response); + + if (data?.event) { + data.event = { + ...data.event, + name: coerceLocalized((data.event as any).name, 'Fotospiel Event'), + description: coerceLocalized((data.event as any).description, ''), + }; + } + + return data; } export async function fetchGalleryPhotos(token: string, cursor?: string | null, limit = 30): Promise { diff --git a/resources/js/guest/services/photosApi.ts b/resources/js/guest/services/photosApi.ts index 59449a2..059cd2d 100644 --- a/resources/js/guest/services/photosApi.ts +++ b/resources/js/guest/services/photosApi.ts @@ -251,5 +251,35 @@ export async function fetchPhotoShare(slug: string) { throw error; } - return res.json(); + const payload = await res.json(); + + const normalize = (value: unknown, fallback: string): string => { + if (typeof value === 'string' && value.trim() !== '') { + return value; + } + if (value && typeof value === 'object') { + const obj = value as Record; + const preferred = ['de', 'en']; + for (const key of preferred) { + const candidate = obj[key]; + if (typeof candidate === 'string' && candidate.trim() !== '') { + return candidate; + } + } + const firstString = Object.values(obj).find((candidate) => typeof candidate === 'string' && candidate.trim() !== ''); + if (typeof firstString === 'string') { + return firstString; + } + } + return fallback; + }; + + if (payload?.event) { + payload.event = { + ...payload.event, + name: normalize(payload.event?.name, 'Fotospiel Event'), + }; + } + + return payload; }