"use client"; import type { DragEndEvent, DragStartEvent } from "@dnd-kit/core"; import { closestCenter, DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core"; import { arrayMove, SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { ChevronDown, GripVertical } from "lucide-react"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Item, ItemContent, ItemGroup, ItemMedia, ItemTitle, } from "@/components/ui/item"; import { cn } from "@/lib/utils"; interface Todo { id: string; title: string; completed: boolean; } interface Todo3Props { heading?: string; description?: string; activeLabel?: string; completedLabel?: string; initialTodos?: Todo[]; className?: string; } const defaultTodos: Todo[] = [ { id: "1", title: "تکمیل مستندات فنی پروژه", completed: false, }, { id: "2", title: "بررسی و تأیید طراحی رابط کاربری", completed: false, }, { id: "3", title: "آماده‌سازی گزارش هفتگی", completed: false, }, { id: "4", title: "بازبینی کد منابع", completed: true, }, { id: "5", title: "هماهنگی با تیم طراحی", completed: false, }, { id: "6", title: "به‌روزرسانی مستندات فنی", completed: true, }, ]; interface SortableTodoItemProps { todo: Todo; onToggle: (id: string) => void; isAnimating?: boolean; } const SortableTodoItem = ({ todo, onToggle, isAnimating = false, }: SortableTodoItemProps) => { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id: todo.id }); const style = { transform: CSS.Translate.toString(transform), transition, opacity: isDragging ? 0.5 : 1, }; return (
onToggle(todo.id)} >
onToggle(todo.id)} onClick={(e) => e.stopPropagation()} aria-label={ todo.completed ? `علامت‌گذاری «${todo.title}» به‌عنوان انجام‌نشده` : `علامت‌گذاری «${todo.title}» به‌عنوان انجام‌شده` } />
{todo.title}
); }; const Todo3 = ({ heading = "مدیریت وظایف با بخش تکمیل‌شده‌ها", description = "ترتیب وظایف را با کشیدن تغییر دهید، وضعیت تکمیل را علامت بزنید و وظایف انجام‌شده را در بخش تاشو مشاهده کنید.", activeLabel = "در انتظار", completedLabel = "تکمیل‌شده", initialTodos = defaultTodos, className, }: Todo3Props) => { const [todos, setTodos] = useState(initialTodos); const [isCompletedExpanded, setIsCompletedExpanded] = useState(true); const [activeTodo, setActiveTodo] = useState(null); const [animatingTodoId, setAnimatingTodoId] = useState(null); const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }), ); const toggleTodo = (id: string) => { const todo = todos.find((t) => t.id === id); if (!todo) return; if (!todo.completed) { setAnimatingTodoId(id); setTimeout(() => { setTodos((prevTodos) => prevTodos.map((t) => (t.id === id ? { ...t, completed: true } : t)), ); setAnimatingTodoId(null); }, 1000); } else { setTodos((prevTodos) => prevTodos.map((t) => (t.id === id ? { ...t, completed: false } : t)), ); } }; const handleDragStart = (event: DragStartEvent) => { const { active } = event; const todo = todos.find((t) => t.id === active.id); setActiveTodo(todo || null); }; const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { setTodos((items) => { const oldIndex = items.findIndex((item) => item.id === active.id); const newIndex = items.findIndex((item) => item.id === over.id); return arrayMove(items, oldIndex, newIndex); }); } setActiveTodo(null); }; const activeTodos = todos.filter((todo) => !todo.completed); const completedTodos = todos.filter((todo) => todo.completed); return (

{heading}

{description}

{activeTodos.length > 0 && (

{activeLabel} ({activeTodos.length})

t.id)} strategy={verticalListSortingStrategy} > {activeTodos.map((todo) => ( ))}
)} {completedTodos.length > 0 && (
{completedTodos.map((todo) => ( toggleTodo(todo.id)} > toggleTodo(todo.id)} onClick={(e) => e.stopPropagation()} aria-label={`علامت‌گذاری «${todo.title}» به‌عنوان انجام‌نشده`} /> {todo.title} ))}
)}
{activeTodo ? (
{activeTodo.title}
) : null}
); }; export { Todo3 };