"use client"; import { useState, useTransition } from "react"; import { DndContext, closestCenter, PointerSensor, useSensor, useSensors, DragEndEvent, } from "@dnd-kit/core"; import { SortableContext, verticalListSortingStrategy, useSortable, arrayMove, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import Link from "next/link"; import { Eye, EyeOff, Video } from "lucide-react"; import { createLesson, deleteLesson, updateLesson, reorderLessons, toggleLessonPublished, moveLessonToModule, } from "@/app/admin/courses/[courseId]/modules/[moduleId]/actions"; interface Lesson { id: string; title: string; order: number; published: boolean; kinescopeId: string | null; } interface OtherModule { id: string; title: string; } function SortableLesson({ lesson, courseId, moduleId, otherModules, }: { lesson: Lesson; courseId: string; moduleId: string; otherModules: OtherModule[]; }) { const [editing, setEditing] = useState(false); const [editValue, setEditValue] = useState(lesson.title); const [pending, startTransition] = useTransition(); const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: lesson.id }); const style = { transform: CSS.Transform.toString(transform), transition, opacity: isDragging ? 0.4 : 1, }; function handleUpdate(e: React.FormEvent) { e.preventDefault(); const fd = new FormData(e.currentTarget); startTransition(() => updateLesson(lesson.id, courseId, moduleId, fd)); setEditing(false); } function handleDelete() { if (!confirm(`Удалить урок "${lesson.title}"?`)) return; startTransition(() => deleteLesson(lesson.id, courseId, moduleId)); } function handleTogglePublished() { startTransition(() => toggleLessonPublished(lesson.id, courseId, moduleId, lesson.published)); } function handleMove(targetModuleId: string) { if (!targetModuleId) return; startTransition(() => moveLessonToModule(lesson.id, targetModuleId, courseId, moduleId)); } return (
{/* Drag handle */} {/* Kinescope indicator */} {editing ? (
setEditValue(e.target.value)} autoFocus required className="flex-1 px-2 py-1 text-sm" style={{ border: "2px solid var(--foreground)", background: "var(--background)", outline: "none" }} />
) : ( <> {lesson.title} {/* Published toggle */} {/* Edit */} Ред. → {/* Rename */} {/* Move to module */} {otherModules.length > 0 && ( )} {/* Delete */} )}
); } export function SortableLessons({ courseId, moduleId, lessons, otherModules = [], }: { courseId: string; moduleId: string; lessons: Lesson[]; otherModules?: OtherModule[]; }) { const [items, setItems] = useState(lessons); const [creating, startTransition] = useTransition(); const sensors = useSensors(useSensor(PointerSensor)); function handleDragEnd(event: DragEndEvent) { const { active, over } = event; if (!over || active.id === over.id) return; const oldIndex = items.findIndex((l) => l.id === active.id); const newIndex = items.findIndex((l) => l.id === over.id); const newItems = arrayMove(items, oldIndex, newIndex); setItems(newItems); startTransition(() => reorderLessons(moduleId, courseId, newItems.map((l) => l.id))); } function handleCreate(e: React.FormEvent) { e.preventDefault(); const fd = new FormData(e.currentTarget); e.currentTarget.reset(); startTransition(() => createLesson(moduleId, courseId, fd)); } return (
l.id)} strategy={verticalListSortingStrategy}> {items.map((lesson) => ( ))} {items.length === 0 && (

Уроков пока нет. Добавьте первый.

)} {/* Quick create form */}
(e.currentTarget.style.borderColor = "var(--foreground)")} onBlur={(e) => (e.currentTarget.style.borderColor = "var(--border)")} /> (e.currentTarget.style.borderColor = "var(--foreground)")} onBlur={(e) => (e.currentTarget.style.borderColor = "var(--border)")} />
); }