"use client"; import { useState } from "react"; import { Group, Task } from "@/lib/api"; import { useTranslation } from "@/lib/i18n"; interface TaskFormProps { groups: Group[]; initial?: Partial; onSubmit: (data: Partial) => Promise; onCancel: () => void; submitLabel?: string; } export default function TaskForm({ groups, initial, onSubmit, onCancel, submitLabel, }: TaskFormProps) { const { t } = useTranslation(); const [title, setTitle] = useState(initial?.title || ""); const [description, setDescription] = useState(initial?.description || ""); const [status, setStatus] = useState(initial?.status || "pending"); const [priority, setPriority] = useState(initial?.priority || "medium"); const [groupId, setGroupId] = useState(initial?.group_id || ""); const [dueAt, setDueAt] = useState( initial?.due_at ? initial.due_at.slice(0, 16) : "" ); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const STATUSES = [ { value: "pending", label: t("tasks.status.pending") }, { value: "in_progress", label: t("tasks.status.in_progress") }, { value: "done", label: t("tasks.status.done") }, { value: "cancelled", label: t("tasks.status.cancelled") }, ]; const PRIORITIES = [ { value: "low", label: t("tasks.priority.low") }, { value: "medium", label: t("tasks.priority.medium") }, { value: "high", label: t("tasks.priority.high") }, { value: "urgent", label: t("tasks.priority.urgent") }, ]; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!title.trim()) { setError(t("tasks.form.titleRequired")); return; } setLoading(true); setError(""); try { await onSubmit({ title: title.trim(), description: description.trim(), status: status as Task["status"], priority: priority as Task["priority"], group_id: groupId || null, due_at: dueAt ? new Date(dueAt).toISOString() : null, }); } catch (err) { setError( err instanceof Error ? err.message : t("tasks.form.saveError") ); } finally { setLoading(false); } } return (
{error && (
{error}
)}
setTitle(e.target.value)} className="w-full px-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition-shadow" placeholder={t("tasks.form.placeholder")} autoFocus />