"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"; export default function ProjectsPage() { const { token, user } = useAuth(); const { t } = useTranslation(); const router = useRouter(); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [showForm, setShowForm] = useState(false); const [error, setError] = useState(null); // Form state 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")); } } function formatDate(d: string) { return new Date(d).toLocaleDateString("cs-CZ", { day: "numeric", month: "short" }); } if (!token) return null; return (
{/* Header */}

{t("nav.projects")}

{/* Error */} {error && (
{error}
)} {/* Create form */} {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 />