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