"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 { GripVertical, Plus, X } from "lucide-react";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input";
import {
Item,
ItemContent,
ItemGroup,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
import { cn } from "@/lib/utils";
interface Todo {
id: string;
title: string;
completed: boolean;
}
interface Todo4Props {
heading?: string;
description?: string;
addTaskLabel?: string;
taskPlaceholder?: string;
cancelLabel?: string;
submitLabel?: string;
initialTodos?: Todo[];
className?: string;
}
const defaultTodos: Todo[] = [
{
id: "1",
title: "تکمیل مستندات فنی پروژه",
completed: false,
},
{
id: "2",
title: "بررسی و تأیید طراحی رابط کاربری",
completed: false,
},
{
id: "3",
title: "آمادهسازی گزارش هفتگی",
completed: false,
},
];
interface SortableTodoItemProps {
todo: Todo;
onToggle: (id: string) => void;
isNew?: boolean;
}
const SortableTodoItem = ({
todo,
onToggle,
isNew = 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 Todo4 = ({
heading = "مدیریت وظایف با افزودن وظیفه جدید",
description =
"وظیفه جدید اضافه کنید، ترتیب را با کشیدن تغییر دهید و وضعیت تکمیل را علامت بزنید.",
addTaskLabel = "افزودن وظیفه جدید",
taskPlaceholder = "عنوان وظیفه",
cancelLabel = "انصراف",
submitLabel = "افزودن",
initialTodos = defaultTodos,
className,
}: Todo4Props) => {
const [todos, setTodos] = useState(initialTodos);
const [isFormExpanded, setIsFormExpanded] = useState(false);
const [newTaskTitle, setNewTaskTitle] = useState("");
const [activeTodo, setActiveTodo] = useState(null);
const [newTodoIds, setNewTodoIds] = useState>(new Set());
const sensors = useSensors(
useSensor(PointerSensor),
useSensor(KeyboardSensor, {
coordinateGetter: sortableKeyboardCoordinates,
}),
);
const toggleTodo = (id: string) => {
setTodos((prevTodos) =>
prevTodos.map((todo) =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo,
),
);
};
const handleAddTask = () => {
if (newTaskTitle.trim()) {
const newTodo: Todo = {
id: Date.now().toString(),
title: newTaskTitle.trim(),
completed: false,
};
setTodos((prevTodos) => [...prevTodos, newTodo]);
setNewTodoIds((prev) => new Set(prev).add(newTodo.id));
setNewTaskTitle("");
setIsFormExpanded(false);
setTimeout(() => {
setNewTodoIds((prev) => {
const updated = new Set(prev);
updated.delete(newTodo.id);
return updated;
});
}, 500);
}
};
const handleCancel = () => {
setNewTaskTitle("");
setIsFormExpanded(false);
};
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);
};
return (
{!isFormExpanded ? (
) : (
)}
t.id)}
strategy={verticalListSortingStrategy}
>
{todos.map((todo) => (
))}
{activeTodo ? (
-
{activeTodo.title}
) : null}
);
};
export { Todo4 };