/** Postavy Umamusume (chibi obrázky / portréty + hláška) — server obrázky cachuje, viz server/src/confetti.ts. */ const UMA_CHARACTERS_URL = '/api/confetti/umamusume'; /** `round` = čtvercový portrét, zobrazí se jako kulatá samolepka (chibi obrázky jsou průhledné). */ export type UmaCharacter = { name: string, quote?: string, round?: boolean, images: string[], /** portrét pro malé odznaky */ icon?: string }; let umaCharactersPromise: Promise | undefined; /** * Načte seznam postav (jednou za běh aplikace). Při chybě vrátí prázdný seznam * a výsledek si nepamatuje — příště se zkusí znovu (např. po restartu serveru). */ export function loadUmaCharacters(): Promise { umaCharactersPromise ??= fetch(UMA_CHARACTERS_URL) .then(r => r.ok ? r.json() : []) .then(list => Array.isArray(list) ? list.filter((c: UmaCharacter) => Array.isArray(c?.images)) : []) .catch(() => []) .then((list: UmaCharacter[]) => { if (list.length === 0) umaCharactersPromise = undefined; return list; }); return umaCharactersPromise; }