49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import { getDeviceId } from '../lib/device';
|
|
import { fetchJson } from './apiClient';
|
|
import type { EventStats } from './eventApi';
|
|
|
|
const statsCache = new Map<string, { etag: string | null; data: EventStats }>();
|
|
|
|
export async function fetchEventStats(eventToken: string): Promise<EventStats> {
|
|
const cached = statsCache.get(eventToken);
|
|
const response = await fetchJson<{
|
|
online_guests?: number;
|
|
tasks_solved?: number;
|
|
guest_count?: number;
|
|
likes_count?: number;
|
|
latest_photo_at?: string | null;
|
|
}>(
|
|
`/api/v1/events/${encodeURIComponent(eventToken)}/stats`,
|
|
{
|
|
headers: {
|
|
'X-Device-Id': getDeviceId(),
|
|
},
|
|
etag: cached?.etag ?? null,
|
|
noStore: true,
|
|
}
|
|
);
|
|
|
|
if (response.notModified && cached) {
|
|
return cached.data;
|
|
}
|
|
|
|
const stats: EventStats = {
|
|
onlineGuests: response.data?.online_guests ?? 0,
|
|
tasksSolved: response.data?.tasks_solved ?? 0,
|
|
guestCount: response.data?.guest_count ?? 0,
|
|
likesCount: response.data?.likes_count ?? 0,
|
|
latestPhotoAt: response.data?.latest_photo_at ?? null,
|
|
};
|
|
|
|
statsCache.set(eventToken, { etag: response.etag, data: stats });
|
|
return stats;
|
|
}
|
|
|
|
export function clearStatsCache(eventToken?: string) {
|
|
if (eventToken) {
|
|
statsCache.delete(eventToken);
|
|
return;
|
|
}
|
|
statsCache.clear();
|
|
}
|