import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAdminTask } from '@/contexts/AdminTaskContext'; import GroupMultiSelect from '@/components/generic/GroupMultiSelect'; import api from '@/utils/api.util'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { ArrowLeft, ChevronRight, ChevronLeft, Check, FileText, Users, ClipboardList } from 'lucide-react'; // ─── Steps ──────────────────────────────────────────────────────────────────── const STEPS = [ { id: 0, label: 'Details', icon: FileText }, { id: 1, label: 'Assign Groups', icon: Users }, { id: 2, label: 'Review', icon: ClipboardList }, ]; // ─── Summary row ────────────────────────────────────────────────────────────── function SummaryRow({ label, value }) { if (!value) return null; return (
{label} {value}
); } export default function CreateTaskList() { const navigate = useNavigate(); const { createTaskList, assignGroups, loading } = useAdminTask(); const [step, setStep] = useState(0); const [form, setForm] = useState({ name: '', description: '' }); const [selectedGroupIds, setSelectedGroupIds] = useState([]); const [allGroups, setAllGroups] = useState([]); const [errors, setErrors] = useState({}); // Fetch groups for the review step's summary (names, not just ids) useEffect(() => { api.get('/admin/groups', { params: { limit: 500 } }) .then((res) => setAllGroups(res.data?.data?.data ?? res.data?.data ?? [])) .catch(() => {}); }, []); const validateDetails = () => { const e = {}; if (!form.name.trim()) e.name = 'Task list name is required.'; setErrors(e); return Object.keys(e).length === 0; }; const handleNext = () => { if (step === 0 && !validateDetails()) return; setStep((s) => s + 1); }; const handleBack = () => { if (step === 0) navigate('/admin/taskList'); else setStep((s) => s - 1); }; const handleCreate = async () => { if (!validateDetails()) { setStep(0); return; } const created = await createTaskList({ name: form.name.trim(), description: form.description.trim() || null, }); if (!created) return; // createTaskList already toasts on error // Assign selected groups if any — non-blocking: navigate regardless if (selectedGroupIds.length > 0) { await assignGroups(created.task_list_id, selectedGroupIds); } navigate(`/admin/taskList/${created.task_list_id}/view`); }; const selectedGroupNames = allGroups .filter((g) => selectedGroupIds.includes(g.group_id)) .map((g) => g.name); return ( // ← plain div, no
— prevents any accidental submit on button clicks
{/* Header */}

Create Task List

View course information.

{/* Stepper */}
{STEPS.map((s, i) => { const Icon = s.icon; const isActive = step === i; const isDone = step > i; return (
{isDone ? : }
{i < STEPS.length - 1 && (
i ? 'bg-emerald-600' : 'bg-border' )} /> )}
); })}
{/* Step content */}

{STEPS[step].label}

{/* ── Step 1: Details ── */} {step === 0 && (
setForm({ ...form, name: e.target.value })} placeholder="e.g. Onboarding Tasks" /> {errors.name && (

{errors.name}

)}