import { Metadata } from 'next'; import { notFound } from 'next/navigation'; import Link from 'next/link'; import { createClient } from '@supabase/supabase-js'; import { DashboardLayout } from '@/components/layout/sidebar'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { ArrowLeft, FileText, FileType, FileIcon, FileCode, Edit3, Trash2, Clock, Folder } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Document, DocumentType, DOCUMENT_TYPE_COLORS } from '@/types/documents'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; const typeIcons: Record = { markdown: FileType, text: FileText, pdf: FileIcon, code: FileCode, }; function getSupabaseServerClient() { const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL; const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY; if (!supabaseUrl || !supabaseServiceKey) { throw new Error('Server configuration error: Missing Supabase credentials'); } return createClient(supabaseUrl, supabaseServiceKey, { auth: { autoRefreshToken: false, persistSession: false, }, }); } async function getDocument(id: string): Promise { try { const supabase = getSupabaseServerClient(); const { data, error } = await supabase .from('mission_control_documents') .select('*') .eq('id', id) .single(); if (error || !data) { console.error('Error fetching document:', error); return null; } return { id: data.id, title: data.title, content: data.content, type: data.type as DocumentType, folder: data.folder || 'General', tags: data.tags || [], createdAt: data.created_at, updatedAt: data.updated_at, size: data.size || 0, description: data.description, }; } catch (err) { console.error('Failed to fetch document:', err); return null; } } function formatFileSize(bytes: number): string { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]; } function formatDate(dateString: string): string { const date = new Date(dateString); return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', }); } interface PageProps { params: Promise<{ id: string }>; } export async function generateMetadata({ params }: PageProps): Promise { const { id } = await params; const document = await getDocument(id); return { title: document ? `${document.title} - Mission Control` : 'Document - Mission Control', }; } export default async function DocumentPage({ params }: PageProps) { const { id } = await params; const document = await getDocument(id); if (!document) { notFound(); } const Icon = typeIcons[document.type]; const colorClass = DOCUMENT_TYPE_COLORS[document.type]; return (
{/* Header with back button */}
{/* Document Header */}

{document.title}

{document.folder} {formatFileSize(document.size)} Updated {formatDate(document.updatedAt)}
{/* Tags */} {document.tags.length > 0 && (
{document.tags.map((tag) => ( #{tag} ))}
)}
{/* Document Content */}
{document.content || '*No content*'}
{/* Footer with back button */}
); }