import { useState } from 'react' import { createFileRoute, useNavigate } from '@tanstack/react-router' import { useMutation } from '@tanstack/react-query' import { lessonPlanTemplateMutations } from '@/api/lessons' import { TemplateSectionBuilder, type TemplateSectionRow } from '@/components/lessons/template-section-builder' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { ArrowLeft } from 'lucide-react' import { toast } from 'sonner' export const Route = createFileRoute('/_authenticated/lessons/templates/new')({ component: NewTemplatePage, }) function NewTemplatePage() { const navigate = useNavigate() const [name, setName] = useState('') const [description, setDescription] = useState('') const [instrument, setInstrument] = useState('') const [skillLevel, setSkillLevel] = useState('all_levels') const [sections, setSections] = useState([]) const mutation = useMutation({ mutationFn: () => lessonPlanTemplateMutations.create({ name, description: description || undefined, instrument: instrument || undefined, skillLevel, sections: sections.map((s, sIdx) => ({ title: s.title, description: s.description || undefined, sortOrder: sIdx, items: s.items.map((item, iIdx) => ({ title: item.title, description: item.description || undefined, sortOrder: iIdx, })), })), }), onSuccess: (template) => { toast.success('Template created') navigate({ to: '/lessons/templates/$templateId', params: { templateId: template.id }, search: { page: 1, limit: 25, q: undefined, sort: undefined, order: 'asc' as const } }) }, onError: (err) => toast.error(err.message), }) function handleSubmit(e: React.FormEvent) { e.preventDefault() if (!name.trim()) return mutation.mutate() } const allSectionsValid = sections.every( (s) => s.title.trim() && s.items.every((i) => i.title.trim()), ) return (

New Template

Details
setName(e.target.value)} placeholder="e.g. Piano Foundations — Beginner" required />