"use client"; import { useState, useEffect } from "react"; import { useMissionControl } from "@/lib/mission-control/store"; import { TaskStatus } from "@/lib/mission-control/types"; import VoiceChat from "./VoiceChat"; import AIManagement from "@/components/ai-management/AIManagement"; interface SidebarItem { id: string; name: string; icon: string; color?: string; category: string; } interface SidebarCategory { id: string; name: string; icon: string; items: SidebarItem[]; } const sidebarCategories: SidebarCategory[] = [ { id: "projects", name: "Projects", icon: "🎯", items: [ { id: "sitemente", name: "SiteMente", icon: "🌐", color: "#ff7bc0", category: "projects" }, { id: "holacompi", name: "HolaCompi", icon: "🤝", color: "#6366f1", category: "projects" }, ]}, { id: "tasks", name: "Tasks", icon: "✓", items: [ { id: "all", name: "All Tasks", icon: "📋", category: "tasks" }, ]}, { id: "chat", name: "Chat", icon: "💬", items: [ { id: "voice", name: "Voice Chat", icon: "🎤", category: "chat" }, ]}, { id: "council", name: "Council", icon: "🏛️", items: [ { id: "ai-settings", name: "AI Settings", icon: "🤖", category: "council" }, ]}, { id: "calendar", name: "Calendar", icon: "📅", items: [ { id: "brief", name: "Morning Brief", icon: "☀️", category: "calendar" }, ]}, { id: "memory", name: "Memory", icon: "🧠", items: [ { id: "logs", name: "Session Logs", icon: "📝", category: "memory" }, ]}, ]; const statusConfig: Record = { todo: { label: "To Do", color: "text-white/70" }, in_progress: { label: "In Progress", color: "text-yellow-400" }, done: { label: "Done", color: "text-green-400" }, blocked: { label: "Blocked", color: "text-red-400" }, paused: { label: "Paused", color: "text-gray-400" }, }; export default function MissionControlDashboard() { const { tasks, toggleTask, updateTaskStatus, addTask, getProjectProgress, getTasksByProject } = useMissionControl(); const [selectedItem, setSelectedItem] = useState("sitemente"); const [filter, setFilter] = useState("all"); const [expandedCategories, setExpandedCategories] = useState(["projects"]); const [searchQuery, setSearchQuery] = useState(""); const [showAddTask, setShowAddTask] = useState(false); const [newTaskTitle, setNewTaskTitle] = useState(""); const [newTaskProject, setNewTaskProject] = useState("sitemente"); // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "/" && !e.ctrlKey && !e.metaKey) { const target = e.target as HTMLElement; if (target.tagName !== "INPUT" && target.tagName !== "TEXTAREA") { e.preventDefault(); document.getElementById("search-input")?.focus(); } } if (e.key === "n" && (e.ctrlKey || e.metaKey)) { e.preventDefault(); setShowAddTask(true); } if (e.key === "Escape") { setShowAddTask(false); setSearchQuery(""); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, []); // Find selected item let selectedCategory = sidebarCategories.find(c => c.items.some(i => i.id === selectedItem)); let currentItem = selectedCategory?.items.find(i => i.id === selectedItem); const projectTasks = currentItem?.category === "projects" ? getTasksByProject(selectedItem as any) : tasks; const filteredTasks = filter === "all" ? projectTasks : projectTasks.filter((t) => t.status === filter); const searchedTasks = searchQuery ? filteredTasks.filter(t => t.title.toLowerCase().includes(searchQuery.toLowerCase())) : filteredTasks; const progress = currentItem?.category === "projects" ? getProjectProgress(selectedItem as any) : 0; const toggleCategory = (catId: string) => { setExpandedCategories(prev => prev.includes(catId) ? prev.filter(id => id !== catId) : [...prev, catId]); }; const collapseAll = () => setExpandedCategories([]); // Today's focus const todayTasks = projectTasks.filter(t => t.priority === "critical" || t.status === "in_progress").slice(0, 3); // Export function const exportTasks = () => { const data = JSON.stringify(projectTasks, null, 2); const blob = new Blob([data], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `tasks-${new Date().toISOString().split("T")[0]}.json`; a.click(); }; // Add task const handleAddTask = () => { if (!newTaskTitle.trim()) return; addTask({ title: newTaskTitle, description: "", status: "todo", priority: "medium", project: newTaskProject as any }); setShowAddTask(false); setNewTaskTitle(""); }; // Render functions const renderSidebar = () => ( ); const renderHeader = () => (

{currentItem?.icon}{currentItem?.name}

{currentItem?.category === "projects" ? `${progress}% complete` : `${tasks.length} total tasks`}

{currentItem?.category === "projects" && (
)}
); const renderContent = () => { const category = currentItem?.category; if (category === "chat") return
; if (category === "council") return
; if (category === "calendar") return (

📅 Morning Brief

Daily intelligence at 6am CET

☀️ Open Calendar
); if (category === "memory") return (

🧠 Memory & Logs

Session history and daily logs

Memory is stored in:

  • • localStorage (browser)
  • • GitHub repo (daily commits)
  • • MEMORY.md (curated)
); return renderTasksView(); }; const renderTasksView = () => ( <> {todayTasks.length > 0 && (

🎯 TODAY'S FOCUS

{todayTasks.map(task => (
{task.title}
))}
)}
🔍 setSearchQuery(e.target.value)} placeholder="Search tasks... (press /)" className="w-full bg-white/10 border border-white/20 rounded-lg pl-9 pr-4 py-2 text-sm placeholder:text-white/40 focus:outline-none focus:border-brand-pink" />
{showAddTask && (
setNewTaskTitle(e.target.value)} placeholder="New task title..." className="w-full bg-white/10 border border-white/20 rounded-lg px-4 py-2 text-sm placeholder:text-white/40 focus:outline-none focus:border-brand-pink mb-3" autoFocus onKeyDown={(e) => e.key === "Enter" && handleAddTask()} />
)}
{(["todo", "in_progress", "done", "blocked"] as TaskStatus[]).map((status) => { const count = projectTasks.filter((t) => t.status === status).length; const config = statusConfig[status]; return ( ); })}

{currentItem?.name || "Tasks"}{searchQuery && ({searchedTasks.length} results)}

{filteredTasks.filter((t) => t.status === "done").length} / {filteredTasks.length} done

{searchedTasks.map((task) => { const config = statusConfig[task.status]; return (

{task.title}

{task.priority === "critical" && CRITICAL}
); })}
{searchedTasks.length === 0 &&
No tasks match the current filter.
}
); return (
{renderSidebar()}
{renderHeader()} {renderContent()}
); }