import { fadeIn, scaleIn } from "$lib/animations"; import { api } from "$lib/api"; import type { Card, CardType, CreateDeckPayload, Visibility } from "$lib/model"; import { toast } from "$lib/toast"; import { useTutorialTarget } from "$lib/TutorialProvider"; import { Button } from "$ui/Button"; import { createSignal, For, Show } from "solid-js"; import { Motion } from "solid-motionone"; import { CardEditor } from "./CardEditor"; type CardData = Card & { hints: string[]; cardType: CardType }; export function DeckEditor(props: { onSave?: (deck: CreateDeckPayload) => void }) { const [title, setTitle] = createSignal(""); const [description, setDescription] = createSignal(""); const [tags, setTags] = createSignal(""); const [visibilityType, setVisibilityType] = createSignal("Private"); const [sharedWith, setSharedWith] = createSignal(""); const [cards, setCards] = createSignal([]); const [showCardEditor, setShowCardEditor] = createSignal(false); const registerTutorialTarget = (id: string) => { try { return useTutorialTarget(id); } catch { return () => {}; } }; const handleSubmit = async (e: Event) => { e.preventDefault(); let visibility: Visibility; if (visibilityType() === "SharedWith") { visibility = { type: "SharedWith", content: sharedWith().split(",").map(s => s.trim()).filter(s => s) }; } else { visibility = { type: visibilityType() as Exclude }; } const tagsArray = tags().split(",").map(t => t.trim()).filter(t => t); const payload = { title: title(), description: description(), tags: tagsArray, visibility, cards: cards() }; if (props.onSave) { props.onSave(payload); return; } try { const res = await api.post("/decks", payload); if (res.ok) { toast.success("Deck created!"); } else { toast.error("Failed to create deck"); } } catch { toast.error("Network error creating deck"); } }; const addCard = (cardData: CardData) => { const card: Card = { front: cardData.front, back: cardData.back, mediaUrl: cardData.mediaUrl, cardType: cardData.cardType, hints: cardData.hints, }; setCards([...cards(), card]); setShowCardEditor(false); }; const removeCard = (index: number) => setCards(cards().filter((_, i) => i !== index)); const moveCard = (from: number, to: number) => { if (to < 0 || to >= cards().length) return; const newCards = [...cards()]; const [moved] = newCards.splice(from, 1); newCards.splice(to, 0, moved); setCards(newCards); }; return (
setTitle(e.target.value)} class="w-full bg-gray-800 border-gray-700 text-white rounded p-2 focus:ring-blue-500 focus:border-blue-500" required />