"use client"; import { useState } from "react"; interface CreateTabProps { classId: string; onCreated: () => void; } export function CreateTab({ classId, onCreated }: CreateTabProps) { const [deckName, setDeckName] = useState(""); const [description, setDescription] = useState(""); const [cards, setCards] = useState([ { id: "1", front: "", back: "" }, { id: "2", front: "", back: "" }, { id: "3", front: "", back: "" }, ]); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); function addCard() { setCards([ ...cards, { id: Date.now().toString(), front: "", back: "" }, ]); } function removeCard(id: string) { if (cards.length <= 1) return; setCards(cards.filter((c) => c.id !== id)); } function updateCard(id: string, field: "front" | "back", value: string) { setCards( cards.map((c) => (c.id === id ? { ...c, [field]: value } : c)) ); } async function handleCreate() { setError(null); if (!deckName.trim()) { setError("Deck title is required."); return; } const validCards = cards.filter((c) => c.front.trim() && c.back.trim()); if (validCards.length === 0) { setError("Please add at least one complete card."); return; } setSaving(true); try { const res = await fetch("/api/decks", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ classId, name: deckName, data: { type: "flashcards", deckName: deckName, description: description || undefined, cards: validCards.map((c) => ({ front: c.front, back: c.back, })), }, }), }); if (!res.ok) { throw new Error("Failed to create deck"); } onCreated(); } catch (err: unknown) { setError(err instanceof Error ? err.message : "Failed to create deck"); } finally { setSaving(false); } } return (
{error && (
{error}
)} {/* Deck Metadata */}
setDeckName(e.target.value)} placeholder="Enter a title, e.g. Biology Ch. 1" className="w-full px-4 py-2.5 rounded-lg border border-border bg-bg-surface-alt/50 text-sm focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary transition-all duration-200" />
setDescription(e.target.value)} placeholder="Add a description..." className="w-full px-4 py-2.5 rounded-lg border border-border bg-bg-surface-alt/50 text-sm focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary transition-all duration-200" />
{/* Cards */}
{cards.map((card, index) => (
{index + 1}
updateCard(card.id, "front", e.target.value)} placeholder="Enter term" className="w-full px-0 py-2 bg-transparent border-0 border-b-2 border-border-light focus:border-primary focus:ring-0 text-sm transition-colors outline-none" /> Term
updateCard(card.id, "back", e.target.value)} placeholder="Enter definition" className="w-full px-0 py-2 bg-transparent border-0 border-b-2 border-border-light focus:border-primary focus:ring-0 text-sm transition-colors outline-none" /> Definition
))}
); }