'use client'; import React, { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; import Image from 'next/image'; import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar'; import { AppSidebar } from '@/components/app-sidebar'; import { SiteHeader } from '@/components/site-header'; import { Card, CardContent, CardHeader, CardTitle, } from '@/components/ui/card'; import { Field, FieldGroup, FieldLabel, FieldDescription, } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; interface VideoData { id: string; title: string; description: string; thumbnail?: string; playlistTitle: string; courseTitle: string; restrictedCourseIds?: string[]; } interface CourseData { id: string; title: string; } export default function EditVideoClient({ video }: { video: VideoData }) { const router = useRouter(); const [title, setTitle] = useState(video.title); const [description, setDescription] = useState(video.description); const [thumbFile, setThumbFile] = useState(null); const [thumbPreview, setThumbPreview] = useState(video.thumbnail); const [loading, setLoading] = useState(false); const [courses, setCourses] = useState([]); const [coursesLoading, setCoursesLoading] = useState(true); const [restrictedCourseIds, setRestrictedCourseIds] = useState( video.restrictedCourseIds ?? [] ); useEffect(() => { let cancelled = false; setCoursesLoading(true); fetch('/api/admin/meta') .then(async (res) => { if (!res.ok) throw new Error(`HTTP ${res.status}`); const json = await res.json(); if (!cancelled) { setCourses(json.courses ?? []); } }) .catch((err) => { console.error('Failed to load courses', err); if (!cancelled) { setCourses([]); } }) .finally(() => { if (!cancelled) setCoursesLoading(false); }); return () => { cancelled = true; }; }, []); const handleThumbnailChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setThumbFile(file); const reader = new FileReader(); reader.onload = (event) => { setThumbPreview(event.target?.result as string); }; reader.readAsDataURL(file); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { const formData = new FormData(); formData.append('videoId', video.id); formData.append('title', title); formData.append('description', description); if (thumbFile) { formData.append('thumbnail', thumbFile); } formData.append('restrictedCourseIds', JSON.stringify(restrictedCourseIds)); const res = await fetch('/api/admin/update-video', { method: 'POST', body: formData, }); if (res.ok) { toast.success('Video updated successfully'); router.push('/admin/videos'); } else { const err = await res.text(); toast.error('Failed to update video: ' + err); } } catch (err: any) { toast.error('Error: ' + String(err.message ?? err)); } finally { setLoading(false); } }; return (

Edit Video

{video.courseTitle} • {video.playlistTitle}

{video.title}
Video Title setTitle(e.target.value)} placeholder="Enter video title" /> Description Optional description for the video