"use client"; import { useEffect, useState, useCallback } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/lib/auth"; import { useTranslation } from "@/lib/i18n"; import { getProjects, createProject, deleteProject, Project, } from "@/lib/api"; import PageActionBar from "@/components/features/PageActionBar"; import DeleteIconButton from "@/components/features/DeleteIconButton"; export default function ProjectsPage() { const { token, user } = useAuth(); const { t, locale } = useTranslation(); const router = useRouter(); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [showForm, setShowForm] = useState(false); const [error, setError] = useState(null); const [formName, setFormName] = useState(""); const [formDesc, setFormDesc] = useState(""); const [formColor, setFormColor] = useState("#3B82F6"); const [formIcon, setFormIcon] = useState("\ud83d\udcc1"); const COLORS = ["#3B82F6", "#EF4444", "#10B981", "#F59E0B", "#8B5CF6", "#EC4899", "#6366F1", "#14B8A6"]; const ICONS = ["\ud83d\udcc1", "\ud83d\ude80", "\ud83d\udca1", "\ud83c\udfaf", "\ud83d\udee0\ufe0f", "\ud83c\udf1f", "\ud83d\udcca", "\ud83d\udd25"]; const loadData = useCallback(async () => { if (!token) return; setLoading(true); try { const res = await getProjects(token); setProjects(res.data || []); } catch (err) { console.error("Load error:", err); setError(t("common.error")); } finally { setLoading(false); } }, [token, t]); useEffect(() => { if (!token) { router.replace("/login"); return; } loadData(); }, [token, router, loadData]); async function handleCreate(e: React.FormEvent) { e.preventDefault(); if (!token || !formName.trim()) return; try { await createProject(token, { name: formName.trim(), description: formDesc, color: formColor, icon: formIcon, owner_id: user?.id, }); setFormName(""); setFormDesc(""); setFormColor("#3B82F6"); setFormIcon("\ud83d\udcc1"); setShowForm(false); loadData(); } catch (err) { console.error("Create error:", err); setError(t("common.error")); } } async function handleDelete(id: string) { if (!token) return; if (!confirm(t("tasks.confirmDelete"))) return; try { await deleteProject(token, id); loadData(); } catch (err) { console.error("Delete error:", err); setError(t("common.error")); } } const dateLocale = locale === "ua" ? "uk-UA" : locale === "cs" ? "cs-CZ" : locale === "he" ? "he-IL" : "ru-RU"; function formatDate(d: string) { return new Date(d).toLocaleDateString(dateLocale, { day: "numeric", month: "short" }); } if (!token) return null; return (
setShowForm(!showForm)} addOpen={showForm} t={t} /> {error && (
{error}
)} {showForm && (
setFormName(e.target.value)} placeholder={t("projects.namePlaceholder")} className="w-full px-3 py-2 border rounded-lg dark:bg-gray-800 dark:border-gray-700 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500 min-h-[44px]" required />