// frontend/src/components/admin/ClassForm.jsx import React, { useState, useEffect } from "react"; import { Plus, Trash2, Loader2, Save, X, MapPin } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import api from "../../api/client"; const DAYS = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]; export default function ClassForm({ classData, onSave, onCancel, isLoading }) { // Fetch membership plans if not provided const { data: plans = [], isLoading: plansLoading } = useQuery({ queryKey: ["membership-plans"], queryFn: async () => { const res = await api.get("/admin/plans"); return Array.isArray(res.data) ? res.data : []; }, initialData: [], }); // schedule: [{ day, start_time, end_time }] const [formData, setFormData] = useState({ name: "", description: "", coach_email: "", location: "", membership_plan_ids: [], schedule: [{ day: "Monday", start_time: "", end_time: "" }], is_active: true, }); useEffect(() => { if (!classData) return; setFormData({ name: classData.name || "", description: classData.description || "", coach_email: classData.coach_email || "", location: classData.location || "", membership_plan_ids: Array.isArray(classData.membership_plan_ids) ? classData.membership_plan_ids : (classData.membership_plans?.map(p => p.id) || []), schedule: Array.isArray(classData.schedule) && classData.schedule.length > 0 ? classData.schedule.map((slot) => ({ day: slot.day || "Monday", start_time: slot.start_time || "", end_time: slot.end_time || "", })) : [{ day: "Monday", start_time: "", end_time: "" }], is_active: classData.is_active !== undefined ? classData.is_active : true, }); }, [classData]); const addScheduleSlot = () => { setFormData((prev) => ({ ...prev, schedule: [ ...prev.schedule, { day: "Monday", start_time: "", end_time: "" }, ], })); }; const removeScheduleSlot = (index) => { setFormData((prev) => ({ ...prev, schedule: prev.schedule.filter((_, i) => i !== index), })); }; const updateScheduleSlot = (index, field, value) => { setFormData((prev) => { const schedule = [...prev.schedule]; schedule[index] = { ...schedule[index], [field]: value }; return { ...prev, schedule }; }); }; const handleSubmit = (e) => { e.preventDefault(); // Transform schedule to a simple structure that backend can later map const transformedSchedule = formData.schedule.map((slot) => ({ day: slot.day, start_time: slot.start_time, end_time: slot.end_time, time: slot.start_time && slot.end_time ? `${slot.start_time}-${slot.end_time}` : "", })); const payload = { name: formData.name, description: formData.description, coach_email: formData.coach_email || null, location: formData.location || null, membership_plan_ids: formData.membership_plan_ids || [], schedule: transformedSchedule, is_active: formData.is_active, }; onSave(payload); }; const handlePlanToggle = (planId) => { setFormData((prev) => { const currentIds = prev.membership_plan_ids || []; const newIds = currentIds.includes(planId) ? currentIds.filter((id) => id !== planId) : [...currentIds, planId]; return { ...prev, membership_plan_ids: newIds }; }); }; return (
{/* Class Name */}
setFormData((prev) => ({ ...prev, name: e.target.value })) } placeholder="e.g., Beginner Karate" required />
{/* Description */}