'use client'; import React, { useState, useEffect } from 'react'; import { TableInfo } from '@/lib/vfs/types'; import { ChevronRight, ChevronDown, Table2, KeyRound, Loader2, AlertCircle, Eye, EyeOff } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; interface SchemaViewerProps { deploymentId?: string; schemaEndpoint?: string; showSystemTablesToggle?: boolean; workspaceId?: string; } export function SchemaViewer({ deploymentId, schemaEndpoint, showSystemTablesToggle = true, workspaceId }: SchemaViewerProps) { const apiBase = workspaceId ? `/api/w/${workspaceId}` : '/api'; const [tables, setTables] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [expandedTables, setExpandedTables] = useState>(new Set()); const [showSystemTables, setShowSystemTables] = useState(false); const endpoint = schemaEndpoint || `${apiBase}/admin/deployments/${deploymentId}/database/schema`; useEffect(() => { loadSchema(); }, [endpoint]); const loadSchema = async () => { try { setLoading(true); setError(null); const res = await fetch(endpoint); if (!res.ok) { const data = await res.json(); throw new Error(data.error || 'Failed to load schema'); } const data = await res.json(); setTables(data.tables); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load schema'); } finally { setLoading(false); } }; const toggleTable = (tableName: string) => { setExpandedTables(prev => { const next = new Set(prev); if (next.has(tableName)) { next.delete(tableName); } else { next.add(tableName); } return next; }); }; const filteredTables = showSystemTables ? tables : tables.filter(t => !t.isSystemTable); if (loading) { return (
); } if (error) { return (

{error}

); } return (

Database Tables

{showSystemTablesToggle && ( )}
{filteredTables.length === 0 ? (

No user tables found

Create tables using the SQL editor

) : (
{filteredTables.map(table => (
{expandedTables.has(table.name) && (
{table.columns.map(col => ( ))}
Column Type Nullable Default
{col.primaryKey && ( )} {col.name} {col.type || 'TEXT'} {col.nullable ? 'Yes' : 'No'} {col.defaultValue || '-'}
)}
))}
)}
); }