import { useState } from 'react'; import { Check, Lock, Sparkles } from 'lucide-react'; import { api, type Character } from '@/api'; import { useAppData } from '@/state/AppData'; import { useAsync } from '@/lib/useAsync'; import { SeyarMascot } from '@/mascots/SeyarMascot'; import { SEYAR_INFO, seyarFromSlug } from '@/mascots/seyar'; import { useToast } from '@/components/Toast'; import { EmptyState, ErrorState, LoadingState, Screen, ScreenHeader, Sep } from '@/components/ui'; import { friendlyError } from '@/lib/errors'; import { toFa } from '@/lib/format'; /** * همراه‌ها (کاتالوگِ کاراکترهای بک‌اند). همراهِ انتخابی در خانه، درس و تمرین * نشان داده می‌شود. باز شدن فقط با امتیاز است. */ export function CharactersScreen() { const { summary, setCompanion } = useAppData(); const toast = useToast(); const list = useAsync(() => api.characters.list(), []); const [busy, setBusy] = useState(null); async function select(c: Character) { if (!c.unlocked || c.selected || busy) return; setBusy(c.characterId); try { await api.characters.select(c.characterId); list.setData((prev) => prev?.map((x) => ({ ...x, selected: x.characterId === c.characterId }))); setCompanion(c); toast(`${c.name} حالا همراهته!`, 'success'); } catch (err) { toast(friendlyError(err), 'error'); } finally { setBusy(null); } } return ( امتیازِ تو: {toFa(summary?.xp ?? 0)}با امتیازِ بیشتر همراه‌های بیشتری باز می‌شن} color="#9B7BFF" back />
{list.loading ? ( ) : list.error ? ( ) : !list.data?.length ? ( ) : (
{list.data.map((c) => { const seyar = seyarFromSlug(c.slug); return ( ); })}
)}
); }