import { fetchJson } from './apiClient'; import { getDeviceId } from '../lib/device'; export { likePhoto, unlikePhoto, createPhotoShareLink, uploadPhoto, deletePhoto } from '@/shared/guest/services/photosApi'; export type GalleryPhoto = Record; type GalleryResponse = { data?: GalleryPhoto[]; next_cursor?: string | null; latest_photo_at?: string | null; }; const galleryCache = new Map(); export async function fetchGallery( eventToken: string, params: { cursor?: string; since?: string; limit?: number; locale?: string } = {} ) { const search = new URLSearchParams(); if (params.cursor) search.set('cursor', params.cursor); if (params.since) search.set('since', params.since); if (params.limit) search.set('limit', params.limit.toString()); if (params.locale) search.set('locale', params.locale); const cacheKey = `${eventToken}:${search.toString()}`; const cached = galleryCache.get(cacheKey); const response = await fetchJson( `/api/v1/events/${encodeURIComponent(eventToken)}/photos${search.toString() ? `?${search.toString()}` : ''}`, { headers: { 'X-Device-Id': getDeviceId(), }, etag: cached?.etag ?? null, noStore: true, } ); if (response.notModified && cached) { return { ...cached.data, notModified: true }; } const payload = response.data ?? { data: [], next_cursor: null, latest_photo_at: null }; const items = Array.isArray((payload as GalleryResponse).data) ? (payload as GalleryResponse).data ?? [] : Array.isArray((payload as { photos?: GalleryPhoto[] }).photos) ? (payload as { photos?: GalleryPhoto[] }).photos ?? [] : Array.isArray(payload) ? (payload as GalleryPhoto[]) : []; const data = { data: items, next_cursor: (payload as GalleryResponse).next_cursor ?? null, latest_photo_at: (payload as GalleryResponse).latest_photo_at ?? null, }; galleryCache.set(cacheKey, { etag: response.etag, data }); return { ...data, notModified: false }; } export async function fetchPhoto(photoId: number, locale?: string) { const search = locale ? `?locale=${encodeURIComponent(locale)}` : ''; const response = await fetchJson(`/api/v1/photos/${photoId}${search}`, { headers: { 'X-Device-Id': getDeviceId(), ...(locale ? { 'X-Locale': locale } : {}), }, noStore: true, }); return response.data; } export function clearGalleryCache() { galleryCache.clear(); }