Files
BRETT/app/composables/useUserSummaries.ts
2026-10-03 20:07:49 +02:00

46 lines
1.2 KiB
TypeScript

export interface UserSummary {
id: number
name: string
color: string | null
cardEffect: string | null
cardEffectColor: string | null
cardVignette: boolean
cardBorderEffect: string | null
cardBorderEffectColor: string | null
avatarUrl: string | null
createdAt: string
stats: {
uploads: number
comments: number
}
}
const inflight = new Map<number, Promise<void>>()
// Cache für User-Hover-Cards: gleiche Nutzer werden nicht doppelt geladen
export function useUserSummaries() {
const summaries = useState<Record<number, UserSummary>>('user-summaries', () => ({}))
function ensureSummary(id: number) {
if (summaries.value[id] || inflight.has(id)) return
inflight.set(id, (async () => {
try {
summaries.value[id] = await $fetch<UserSummary>(`/api/users/${id}/summary`)
}
catch {
// Fehler stillschweigend ignorieren — die Card zeigt dann nur die Basisdaten
}
finally {
inflight.delete(id)
}
})())
}
// Cache-Eintrag verwerfen, damit geänderte Effekte/Farben ohne Reload sichtbar werden
function invalidate(id: number) {
delete summaries.value[id]
}
return { summaries, ensureSummary, invalidate }
}