forked from BRETT/BRETT
46 lines
1.2 KiB
TypeScript
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 }
|
|
}
|