"use client"; import { useEffect, useState, useCallback } from "react"; import { useRouter, useParams } from "next/navigation"; import { useAuth } from "@/lib/auth"; import { useTranslation } from "@/lib/i18n"; import { getTask, getGroups, updateTask, deleteTask, Task, Group, } from "@/lib/api"; import TaskForm from "@/components/TaskForm"; import StatusBadge from "@/components/StatusBadge"; function isDone(status: string): boolean { return status === "done" || status === "completed"; } export default function TaskDetailPage() { const { token } = useAuth(); const { t, locale } = useTranslation(); const router = useRouter(); const params = useParams(); const id = params.id as string; const [task, setTask] = useState(null); const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); const [editing, setEditing] = useState(false); const [deleting, setDeleting] = useState(false); const [error, setError] = useState(""); const dateLocale = locale === "ua" ? "uk-UA" : locale === "cs" ? "cs-CZ" : locale === "he" ? "he-IL" : "ru-RU"; function formatDate(dateStr: string | null | undefined): string { if (!dateStr) return t("tasks.noDue"); try { const d = new Date(dateStr); if (isNaN(d.getTime())) return t("tasks.noDue"); return d.toLocaleDateString(dateLocale, { day: "numeric", month: "numeric", year: "numeric", hour: "2-digit", minute: "2-digit", }); } catch { return t("tasks.noDue"); } } const loadTask = useCallback(async () => { if (!token || !id) return; setLoading(true); try { const [taskData, groupsData] = await Promise.all([ getTask(token, id), getGroups(token), ]); setTask(taskData); setGroups(groupsData.data || []); } catch (err) { setError( err instanceof Error ? err.message : t("tasks.loadError") ); } finally { setLoading(false); } }, [token, id, t]); useEffect(() => { if (!token) { router.replace("/login"); return; } loadTask(); }, [token, router, loadTask]); async function handleUpdate(data: Partial) { if (!token || !id) return; await updateTask(token, id, data); setEditing(false); loadTask(); } async function handleDelete() { if (!token || !id) return; if (!confirm(t("tasks.confirmDelete"))) return; setDeleting(true); try { await deleteTask(token, id); router.push("/tasks"); } catch (err) { setError( err instanceof Error ? err.message : t("common.error") ); setDeleting(false); } } async function handleQuickStatus(newStatus: Task["status"]) { if (!token || !id) return; try { await updateTask(token, id, { status: newStatus }); loadTask(); } catch (err) { setError( err instanceof Error ? err.message : t("common.error") ); } } if (!token) return null; if (loading) { return (
); } if (error || !task) { return (

{error || t("tasks.notFound")}

); } if (editing) { return (

{t("tasks.editTask")}

setEditing(false)} submitLabel={t("tasks.saveChanges")} />
); } const PRIORITY_LABELS: Record = { low: { dot: "\ud83d\udfe2" }, medium: { dot: "\ud83d\udfe1" }, high: { dot: "\ud83d\udfe0" }, urgent: { dot: "\ud83d\udd34" }, }; const pri = PRIORITY_LABELS[task.priority] || PRIORITY_LABELS.medium; const taskDone = isDone(task.status); return (
{/* Back button */} {/* Task detail card */}
{task.group_icon && ( {task.group_icon} )}

{task.title}

{task.description && (

{task.description}

)}
{t("tasks.form.priority")}: {pri.dot} {t(`tasks.priority.${task.priority}`)}
{task.group_name && (
{t("tasks.form.group")}: {task.group_icon && ( {task.group_icon} )} {task.group_name}
)}
{t("tasks.form.dueDate")}: {formatDate(task.due_at)}
{t("tasks.created")}: {formatDate(task.created_at)}
{task.completed_at && (
{t("tasks.completed")}: {formatDate(task.completed_at)}
)}
{/* Quick status buttons */}
{!taskDone && ( )} {task.status === "pending" && ( )} {taskDone && ( )}
{/* Action buttons */}
); }