import { DndContext, closestCenter } from '@dnd-kit/core' import { SortableContext, arrayMove, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' import { Add, Delete, DragIndicator, Edit } from '@mui/icons-material' import { Box, Checkbox, IconButton, Input, List, ListItem, Typography, } from '@mui/joy' import React, { useState } from 'react' import { CompleteSubTask } from '../../utils/Fetcher' function SortableItem({ task, index, handleToggle, handleDelete, editMode }) { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: task.id }) const style = { transform: CSS.Transform.toString(transform), transition, display: 'flex', alignItems: 'center', gap: '0.5rem', flexDirection: { xs: 'column', sm: 'row' }, // Responsive style touchAction: 'none', } const [isEditing, setIsEditing] = useState(false) const [editedText, setEditedText] = useState(task.name) const handleEdit = () => { setIsEditing(true) } const handleSave = () => { setIsEditing(false) task.name = editedText } return ( {editMode && ( )} {!editMode && ( handleToggle(task.id)} overlay={!editMode} /> )} {isEditing ? ( setEditedText(e.target.value)} onBlur={handleSave} onKeyPress={e => { if (e.key === 'Enter') { handleSave() } }} autoFocus /> ) : ( {task.name} )} {task.completedAt && ( {new Date(task.completedAt).toLocaleString()} )} {editMode && ( handleDelete(task.id)} > )} ) } const SubTasks = ({ editMode = true, choreId = 0, tasks, setTasks }) => { const [newTask, setNewTask] = useState('') const handleToggle = taskId => { const updatedTask = tasks.find(task => task.id === taskId) updatedTask.completedAt = updatedTask.completedAt ? null : new Date().toISOString() const updatedTasks = tasks.map(task => task.id === taskId ? updatedTask : task, ) CompleteSubTask( taskId, Number(choreId), updatedTask.completedAt ? new Date().toISOString() : null, ).then(res => { if (res.status !== 200) { console.log('Error updating task') return } }) setTasks(updatedTasks) } const handleDelete = taskId => { setTasks(tasks.filter(task => task.id !== taskId)) } const handleAdd = () => { if (!newTask.trim()) return setTasks([ ...tasks, { name: newTask, completedAt: null, orderId: tasks.length, }, ]) setNewTask('') } const onDragEnd = event => { const { active, over } = event if (active.id !== over.id) { setTasks(items => { const oldIndex = items.findIndex(item => item.id === active.id) const newIndex = items.findIndex(item => item.id === over.id) const reorderedItems = arrayMove(items, oldIndex, newIndex) return reorderedItems.map((item, index) => ({ ...item, orderId: index, })) }) } } const handleKeyPress = event => { if (event.key === 'Enter') { handleAdd() } } // Sort tasks by orderId before rendering const sortedTasks = [...tasks].sort((a, b) => a.orderId - b.orderId) return ( <> {sortedTasks.map((task, index) => ( ))} {editMode && ( setNewTask(e.target.value)} onKeyPress={handleKeyPress} sx={{ flex: 1 }} /> )} ) } export default SubTasks