import { type Component, createEffect, createSignal, For } from "solid-js"; import { Sheet, SheetContent } from "@/components/ui/sheet"; import { type Task, removeTask, restoreTask, updateTask } from "@/store"; import { Select, SelectContent, SelectItem, SelectTrigger } from "@/components/ui/select"; import { ArrowUpCircle, Clock, Calendar, Type, Trash2, X } from "lucide-solid"; import { calculateDateFromUrgency, calculateUrgencyFromDate } from "@/store"; import { Button } from "./ui/button"; import { TagPicker } from "./TagPicker"; import { Badge } from "./ui/badge"; import { store } from "@/store"; import { cn } from "@/lib/utils"; import { toast } from "solid-sonner"; import { lazy, Suspense } from "solid-js"; const TaskEditor = lazy(() => import("./TaskEditor").then(m => ({ default: m.TaskEditor }))); interface TaskDetailProps { task: Task; isOpen: boolean; onClose: () => void; } export const TaskDetail: Component = (props) => { // Local state for immediate feedback, synced with props const [title, setTitle] = createSignal(props.task.title); const [editorInstance, setEditorInstance] = createSignal(null); // Sync input string for datetime-local const [dateString, setDateString] = createSignal(""); createEffect(() => { setTitle(props.task.title); // Format for datetime-local: yyyy-MM-ddThh:mm (local time) const dateObj = new Date(props.task.dueDate); const localIso = new Date(dateObj.getTime() - (dateObj.getTimezoneOffset() * 60000)).toISOString().slice(0, 16); setDateString(localIso); }); let debounceTimer: number | undefined; const updateTaskContent = (html: string) => { clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { updateTask(props.task.id, { content: html }); }, 1000); }; const updateTitle = (val: string) => { setTitle(val); updateTask(props.task.id, { title: val }); }; const updatePriority = (val: string) => { const p = parseInt(val); if (!isNaN(p)) { updateTask(props.task.id, { priority: p }); } }; const updateUrgency = (val: string) => { const u = parseInt(val); if (!isNaN(u)) { const newDate = calculateDateFromUrgency(u); updateTask(props.task.id, { dueDate: newDate }); } }; const updateTags = (tags: string[]) => { updateTask(props.task.id, { tags }); }; const onDateInputChange = (e: Event) => { const val = (e.currentTarget as HTMLInputElement).value; if (val) { const iso = new Date(val).toISOString(); updateTask(props.task.id, { dueDate: iso }); } }; // Calculate current urgency level for display const currentUrgency = () => calculateUrgencyFromDate(props.task.dueDate).toString(); return ( !open && props.onClose()}> {/* Header Area */}