import { useState, useEffect, useRef } from "react" import { motion, AnimatePresence } from "framer-motion" import { ListOfTasks, Task } from "@/lib/schema/tasks" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { useAccount } from "@/lib/providers/jazz-provider" import { LaIcon } from "@/components/custom/la-icon" import { Checkbox } from "@/components/ui/checkbox" import { DatePicker } from "@/components/ui/date-picker" import { format, parse } from "date-fns" interface TaskFormProps { filter?: "today" | "upcoming" | undefined } export const TaskForm: React.FC = ({ filter }) => { const [title, setTitle] = useState("") const [dueDate, setDueDate] = useState(filter === "today" ? new Date() : undefined) const [inputVisible, setInputVisible] = useState(false) const { me } = useAccount({ root: {} }) const inputRef = useRef(null) const formRef = useRef(null) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() saveTask() } const saveTask = () => { if (title.trim() && (filter !== "upcoming" || dueDate)) { if (me?.root?.tasks === undefined) { if (!me) return me.root.tasks = ListOfTasks.create([], { owner: me }) } const newTask = Task.create( { title, description: "", status: "todo", createdAt: new Date(), updatedAt: new Date(), dueDate: filter === "upcoming" ? dueDate : filter === "today" ? new Date() : null }, { owner: me._owner } ) me.root.tasks?.push(newTask) resetForm() } } const resetForm = () => { setTitle("") setDueDate(filter === "today" ? new Date() : undefined) setInputVisible(false) } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Escape") { resetForm() } else if (e.key === "Backspace" && title.trim() === "") { resetForm() } } useEffect(() => { if (inputVisible && inputRef.current) { inputRef.current.focus() } }, [inputVisible]) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (formRef.current && !formRef.current.contains(event.target as Node)) { if (title.trim()) { saveTask() } else { resetForm() } } } document.addEventListener("mousedown", handleClickOutside) return () => { document.removeEventListener("mousedown", handleClickOutside) } }, [title, dueDate]) const formattedDate = dueDate ? format(dueDate, "EEE, MMMM do, yyyy") : "Select a date" return (
{filter ? ( !inputVisible ? ( ) : (
{}} className="mr-2" /> setTitle(e.target.value)} onKeyDown={handleKeyDown} placeholder="Task title" />
e.stopPropagation()}> {filter === "upcoming" && ( setDueDate(date)} className="z-50" /> )}
) ) : null}
) }