import { useState, useEffect } from "react"; import { Link, useLocation } from "wouter"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { ArrowLeft, Plus, Trash2, ExternalLink, Github, Globe, Loader2 } from "lucide-react"; import { MobileHeader } from "@/components/mobile/MobileHeader"; import { supabase } from "@/lib/supabase"; import { useAuth } from "@/lib/auth"; import { nanoid } from "nanoid"; interface Portfolio { id: string; user_id: string; title: string; description: string; tech_stack: string[]; live_url?: string; github_url?: string; image?: string; status: "planning" | "in-progress" | "completed"; progress: number; created_at?: Date; updated_at?: Date; } export default function Projects() { const { user } = useAuth(); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (user?.id) fetchProjects(); }, [user]); const fetchProjects = async () => { try { const { data, error } = await supabase .from('projects') .select('*') .eq('user_id', user?.id) .order('created_at', { ascending: false }); if (!error && data) { setProjects(data.map(p => ({ ...p, technologies: p.tech_stack || [] }))); } } catch (err) { console.error('Error fetching projects:', err); } finally { setLoading(false); } }; const [showForm, setShowForm] = useState(false); const [newProject, setNewProject] = useState({ title: "", description: "", technologies: "", }); const handleAddProject = async () => { if (!newProject.title || !user?.id) return; try { const { data, error } = await supabase.from('projects').insert({ id: nanoid(), user_id: user.id, title: newProject.title, description: newProject.description, tech_stack: newProject.technologies.split(",").map((t) => t.trim()), status: "planning", progress: 0 }).select().single(); if (!error && data) { setProjects([{ ...data, technologies: data.tech_stack }, ...projects]); setNewProject({ title: "", description: "", technologies: "" }); setShowForm(false); } } catch (err) { console.error('Error adding project:', err); } }; const deleteProject = async (id: string) => { try { await supabase.from('projects').delete().eq('id', id); setProjects(projects.filter((p) => p.id !== id)); } catch (err) { console.error('Error deleting project:', err); } }; const getStatusColor = (status: string) => { switch (status) { case "completed": return "bg-green-500"; case "in-progress": return "bg-blue-500"; case "planning": return "bg-yellow-500"; default: return "bg-gray-500"; } }; return (
{/* Mobile Header */}
{/* Desktop Header */}

Projects & Portfolio

{/* Add Project Form */} {showForm && (

Create New Project

setNewProject({ ...newProject, title: e.target.value }) } className="bg-slate-700 border-slate-600 text-white" />