"use client"; import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Search, FileText, Shield, Network, Scale, ChevronLeft, TerminalSquare, Loader2, } from "lucide-react"; import { pb } from "@/lib/pb"; import { Dictionary } from "@/lib/IDict"; interface PBDocument { id: string; title: string; category: "Core" | "Security" | "Network" | "Legal"; status: "Encrypted" | "Public" | "Internal" | "Dynamic"; content: string; created: string; } const CATEGORIES = ["All", "Core", "Security", "Network", "Legal"]; export function DocsClient({ dict, lang, }: { dict: Dictionary["docs"]; lang: string; }) { const [docs, setDocs] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [activeCategory, setActiveCategory] = useState("All"); const [selectedDoc, setSelectedDoc] = useState(null); useEffect(() => { async function fetchDocs() { try { setLoading(true); const records = await pb .collection(`documents_${lang}`) .getFullList({ sort: "-created", }); setDocs(records); } catch (error) { console.error("Vault access error:", error); } finally { setLoading(false); } } fetchDocs(); }, [lang]); const filteredDocs = docs.filter((doc) => { const matchesSearch = doc.title.toLowerCase().includes(search.toLowerCase()) || doc.content.toLowerCase().includes(search.toLowerCase()); const matchesCategory = activeCategory === "All" || doc.category === activeCategory; return matchesSearch && matchesCategory; }); const getCategoryIcon = (cat: string) => { switch (cat) { case "Core": return ; case "Security": return ; case "Network": return ; case "Legal": return ; default: return ; } }; const formatDate = (dateStr: string) => dateStr.split(" ")[0]; return (
{loading ? (

{dict.establishing}

) : !selectedDoc ? (

{dict.vaultTitle}

{dict.vaultSubtitle}

setSearch(e.target.value)} className="w-full bg-card/50 backdrop-blur-md border border-border/50 rounded-xl py-3 pl-12 pr-4 text-sm text-foreground focus:outline-none focus:border-primary/50 focus:shadow-[0_0_15px_rgba(0,240,255,0.15)] transition-all placeholder:text-muted-foreground/50" />
{CATEGORIES.map((cat) => ( ))}
{filteredDocs.map((doc) => ( setSelectedDoc(doc)} className="group bg-card/30 backdrop-blur-sm border border-border/50 hover:border-primary/40 rounded-2xl p-5 md:p-6 cursor-pointer transition-all duration-300 hover:shadow-[0_0_30px_rgba(0,240,255,0.1)] hover:-translate-y-1 flex flex-col h-48" >
{getCategoryIcon(doc.category)}
{doc.status}

{doc.title}

{doc.category} {formatDate(doc.created)}
))}
{filteredDocs.length === 0 && (

{dict.empty}

)}
) : (
{selectedDoc.id}.txt
{getCategoryIcon(selectedDoc.category)} {selectedDoc.category}

{selectedDoc.title}

{selectedDoc.content || dict.noContent}
{dict.eof}
)}
); }