import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useForm, useWatch } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { ArrowLeft } from "lucide-react"; import { useLibrary } from "@/contexts/AdminLibraryContext"; import { useCourses } from "@/contexts/AdminCoursesContext"; import { useAuth } from "@/contexts/AuthContext"; import { PageMeta } from "@/contexts/MetadataContext"; import api from "@/utils/api.util"; 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 { Spinner } from "@/components/ui/spinner"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useUnsavedChangesGuard } from "@/hooks/useUnsavedChangesGuard"; import CompletionRequirementBuilder from "@/modules/admin/components/courses/CompletionRequirementBuilder"; import ProductPricingCard from "@/modules/admin/components/products/ProductPricingCard"; const schema = z.object({ title: z.string().min(1, "Title is required."), description: z.string().optional(), subscription: z.string().optional(), }); function FieldError({ message }) { if (!message) return null; return

{message}

; } export default function EditLibraryLesson() { const navigate = useNavigate(); const { lessonId } = useParams(); const { fetchLesson, updateLesson, lesson, loading, fetchLessonProduct, saveLessonProduct, removeLessonProduct } = useLibrary(); const { fetchLessonRequirements, syncLessonRequirements } = useCourses(); const { user } = useAuth(); const [tierCategories, setTierCategories] = useState([]); useEffect(() => { api.get("/admin/tiers/categories") .then(({ data }) => setTierCategories((data.data ?? []).filter((c) => c.is_active))) .catch(() => {}); }, []); const { register, handleSubmit, reset, control, setValue, formState: { errors, isDirty } } = useForm({ resolver: zodResolver(schema), defaultValues: { title: "", description: "", subscription: "free" }, }); const { bypassOnce, dialog: unsavedChangesDialog } = useUnsavedChangesGuard(isDirty); const watchedSubscr = useWatch({ control, name: "subscription" }); const defaultTierSlug = tierCategories.find((c) => c.is_default)?.slug || "free"; useEffect(() => { fetchLesson(lessonId); }, [lessonId]); useEffect(() => { if (lesson && String(lesson.lesson_id) === String(lessonId)) { reset({ title: lesson.title ?? "", description: lesson.description ?? "", subscription: lesson.subscription || defaultTierSlug }); } }, [lesson, lessonId, reset]); const onSubmit = async (data) => { const result = await updateLesson(lessonId, { ...data, subscription: data.subscription || defaultTierSlug, updatedBy: user?.user_id }); if (!result) return; bypassOnce(); navigate(`/admin/lessons/${lessonId}/view`); }; return (

Edit Lesson

Changes apply everywhere this lesson is attached.