"use client"; import { use, useState, useEffect } from "react"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { FileText, Plus, Search, Filter, MoreHorizontal, Star, Info, Share2, Archive, Loader2, Target, Lightbulb, MessageSquare, BookOpen, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import Link from "next/link"; import { toast } from "sonner"; import { CollapsibleSidebar } from "@/components/ui/collapsible-sidebar"; type DocType = "all" | "vision" | "features" | "research" | "chats"; type ViewType = "public" | "private" | "archived"; interface Document { id: string; title: string; type: DocType; owner: string; dateModified: string; visibility: ViewType; starred: boolean; chunkCount?: number; } export default function DocsPage({ params, }: { params: Promise<{ workspace: string; projectId: string }>; }) { const { workspace, projectId } = use(params); const [activeView, setActiveView] = useState("public"); const [filterType, setFilterType] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); const [documents, setDocuments] = useState([]); const [loading, setLoading] = useState(true); const [sortBy, setSortBy] = useState<"modified" | "created">("modified"); useEffect(() => { loadDocuments(); }, [projectId, activeView, filterType]); const loadDocuments = async () => { try { setLoading(true); const response = await fetch( `/api/projects/${projectId}/knowledge/items?visibility=${activeView}&type=${filterType}` ); if (response.ok) { const data = await response.json(); // Use returned items or mock data if empty if (data.items && data.items.length > 0) { // Transform knowledge items to document format const docs = data.items.map((item: any, index: number) => ({ id: item.id, title: item.title, type: item.sourceType === 'vision' ? 'vision' : item.sourceType === 'feature' ? 'features' : item.sourceType === 'chat' ? 'chats' : 'research', owner: "You", dateModified: item.updatedAt || item.createdAt, visibility: activeView, starred: false, chunkCount: item.chunkCount, })); setDocuments(docs); } else { // Show mock data when no real data exists setDocuments([ { id: "1", title: "Project Vision & Mission", type: "vision", owner: "You", dateModified: new Date().toISOString(), visibility: "public", starred: true, chunkCount: 12, }, { id: "2", title: "Core Features Specification", type: "features", owner: "You", dateModified: new Date(Date.now() - 86400000).toISOString(), visibility: "public", starred: false, chunkCount: 24, }, ]); } } else { // Fallback to mock data on error setDocuments([ { id: "1", title: "Project Vision & Mission", type: "vision", owner: "You", dateModified: new Date().toISOString(), visibility: "public", starred: true, chunkCount: 12, }, ]); } } catch (error) { console.error("Error loading documents:", error); // Show mock data on error setDocuments([ { id: "1", title: "Project Vision & Mission", type: "vision", owner: "You", dateModified: new Date().toISOString(), visibility: "public", starred: true, chunkCount: 12, }, ]); } finally { setLoading(false); } }; const getDocIcon = (type: DocType) => { switch (type) { case "vision": return ; case "features": return ; case "research": return ; case "chats": return ; default: return ; } }; const filteredDocuments = documents.filter((doc) => { if (searchQuery && !doc.title.toLowerCase().includes(searchQuery.toLowerCase())) { return false; } return true; }); return (
{/* Left Sidebar */}

Document Stats

Total Docs {documents.length}
Public {documents.filter(d => d.visibility === 'public').length}
Private {documents.filter(d => d.visibility === 'private').length}
Starred {documents.filter(d => d.starred).length}
{/* Main Content */}
{/* Header */}

Docs

{filteredDocuments.length} {filteredDocuments.length === 1 ? "doc" : "docs"}
{/* Tabs */}
{/* Toolbar */}
setSearchQuery(e.target.value)} className="pl-9" />
{/* Document List */}
{loading ? (
) : filteredDocuments.length === 0 ? (

No documents yet

Create your first document to get started

) : (
{filteredDocuments.map((doc) => (
{getDocIcon(doc.type)}

{doc.title}

{doc.starred && ( )}
{doc.owner} {new Date(doc.dateModified).toLocaleDateString()} {doc.chunkCount && ( <> {doc.chunkCount} chunks )}
))}
)}
{/* End Main Content */}
); }