import { faBoxOpen, faLayerGroup, faPen, faPlus, faTrash, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useAtomValue, useSetAtom } from "jotai"; import { Suspense, useState } from "react"; import { Link } from "wouter"; import { type Deck, decksAtom, logoutAtom } from "../atoms"; import { CreateDeckModal } from "../components/CreateDeckModal"; import { DeleteDeckModal } from "../components/DeleteDeckModal"; import { EditDeckModal } from "../components/EditDeckModal"; import { ErrorBoundary } from "../components/ErrorBoundary"; import { LoadingSpinner } from "../components/LoadingSpinner"; import { SyncButton } from "../components/SyncButton"; import { SyncStatusIndicator } from "../components/SyncStatusIndicator"; import { queryClient } from "../queryClient"; function DeckList({ onEditDeck, onDeleteDeck, }: { onEditDeck: (deck: Deck) => void; onDeleteDeck: (deck: Deck) => void; }) { const { data: decks } = useAtomValue(decksAtom); if (decks.length === 0) { return (

No decks yet

Create your first deck to start learning

); } return (
{decks.map((deck, index) => (

{deck.name}

{deck.dueCardCount > 0 && ( {deck.dueCardCount} )}
{deck.description && (

{deck.description}

)} {deck.totalCardCount > 0 && (
{deck.reviewCardCount}/{deck.totalCardCount}
)}
))}
); } export function HomePage() { const logout = useSetAtom(logoutAtom); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [editingDeck, setEditingDeck] = useState(null); const [deletingDeck, setDeletingDeck] = useState(null); const handleDeckMutation = () => { queryClient.invalidateQueries({ queryKey: ["decks"] }); }; return (
{/* Header */}

Kioku

{/* Main Content */}
{/* Section Header */}

Your Decks

{/* Deck List with Suspense */} }>
{/* Modals */} setIsCreateModalOpen(false)} onDeckCreated={handleDeckMutation} /> setEditingDeck(null)} onDeckUpdated={handleDeckMutation} /> setDeletingDeck(null)} onDeckDeleted={handleDeckMutation} />
); }