import { useCallback, useEffect, useState } from "react"; import { ApiClientError, apiClient } from "../api"; import { CreateDeckModal } from "../components/CreateDeckModal"; import { EditDeckModal } from "../components/EditDeckModal"; import { useAuth } from "../stores"; interface Deck { id: string; name: string; description: string | null; newCardsPerDay: number; createdAt: string; updatedAt: string; } export function HomePage() { const { logout } = useAuth(); const [decks, setDecks] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [editingDeck, setEditingDeck] = useState(null); const fetchDecks = useCallback(async () => { setIsLoading(true); setError(null); try { const res = await apiClient.rpc.api.decks.$get(undefined, { headers: apiClient.getAuthHeader(), }); if (!res.ok) { const errorBody = await res.json().catch(() => ({})); throw new ApiClientError( (errorBody as { error?: string }).error || `Request failed with status ${res.status}`, res.status, ); } const data = await res.json(); setDecks(data.decks); } catch (err) { if (err instanceof ApiClientError) { setError(err.message); } else { setError("Failed to load decks. Please try again."); } } finally { setIsLoading(false); } }, []); useEffect(() => { fetchDecks(); }, [fetchDecks]); return (

Kioku

Your Decks

{isLoading &&

Loading decks...

} {error && (
{error}
)} {!isLoading && !error && decks.length === 0 && (

You don't have any decks yet.

Create your first deck to start learning!

)} {!isLoading && !error && decks.length > 0 && (
    {decks.map((deck) => (
  • {deck.name}

    {deck.description && (

    {deck.description}

    )}
  • ))}
)}
setIsCreateModalOpen(false)} onDeckCreated={fetchDecks} /> setEditingDeck(null)} onDeckUpdated={fetchDecks} />
); }