import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Memory } from "@/types" import { Plus, Folder, FolderOpen, Settings, X } from "lucide-react" interface ProjectTabsProps { memories: Memory[] currentProject: string onProjectChange: (projectId: string) => void onCreateProject?: (name: string) => void onDeleteProject?: (projectId: string) => void onMoveMemories?: (memoryIds: string[], projectId: string) => void className?: string } interface ProjectInfo { id: string name: string count: number lastUpdated: Date description?: string } export function ProjectTabs({ memories, currentProject, onProjectChange, onCreateProject, onDeleteProject, onMoveMemories, className = "" }: ProjectTabsProps) { const [showCreateDialog, setShowCreateDialog] = useState(false) const [newProjectName, setNewProjectName] = useState("") const [newProjectDescription, setNewProjectDescription] = useState("") const [showManageDialog, setShowManageDialog] = useState(false) // Extract projects from memories const projects: ProjectInfo[] = [ { id: "all", name: "All Projects", count: memories.length, lastUpdated: new Date(Math.max(...memories.map(m => new Date(m.timestamp || 0).getTime()))), description: "All memories across all projects" }, { id: "default", name: "General", count: memories.filter(m => !m.project || m.project === "default").length, lastUpdated: new Date(Math.max(...memories.filter(m => !m.project || m.project === "default").map(m => new Date(m.timestamp || 0).getTime()))), description: "Memories not assigned to any specific project" } ] // Add user-defined projects const userProjects = Array.from(new Set(memories.map(m => m.project).filter(p => p && p !== "default"))) userProjects.forEach(projectId => { const projectMemories = memories.filter(m => m.project === projectId) projects.push({ id: projectId, name: projectId.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()), count: projectMemories.length, lastUpdated: new Date(Math.max(...projectMemories.map(m => new Date(m.timestamp || 0).getTime()))), description: `Project with ${projectMemories.length} memories` }) }) const handleCreateProject = () => { if (!newProjectName.trim()) return const projectId = newProjectName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') if (onCreateProject) { onCreateProject(projectId) } setNewProjectName("") setNewProjectDescription("") setShowCreateDialog(false) onProjectChange(projectId) } const handleDeleteProject = (projectId: string) => { if (projectId === "all" || projectId === "default") return if (confirm(`Delete project "${projectId}" and move all memories to General?`)) { if (onDeleteProject) { onDeleteProject(projectId) } if (currentProject === projectId) { onProjectChange("default") } } } const formatLastUpdated = (date: Date) => { const now = new Date() const diffMs = now.getTime() - date.getTime() const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)) if (diffDays === 0) return "Today" if (diffDays === 1) return "Yesterday" if (diffDays < 7) return `${diffDays} days ago` if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago` return `${Math.floor(diffDays / 30)} months ago` } return (
{projects.find(p => p.id === currentProject)?.count} memories • Last updated {formatLastUpdated(projects.find(p => p.id === currentProject)?.lastUpdated || new Date())}