import { useState, useEffect } from 'react'; import { Database, Plus, Trash2, RefreshCw, AlertCircle, Search, Play, FileJson, Key, Clock, GitBranch, Table, Braces, } from 'lucide-react'; import { useDatabaseStore, DATABASE_TYPES, REGIONS, DatabaseType } from '../../store/database'; const TYPE_ICONS: Record = { kv: , document: , vector: , timeseries: , graph: , sql: , }; const TYPE_DESCRIPTIONS: Record = { kv: 'Fast key-value storage for caching and simple data', document: 'JSON document storage with flexible schemas', vector: 'Vector embeddings for AI/ML and semantic search', timeseries: 'Time-indexed data for metrics and analytics', graph: 'Connected data with relationships and traversals', sql: 'Traditional relational database with ACID compliance', }; export default function DatabaseDashboard() { const { instances, isLoading, isCreating, error, clearError, fetchInstances, createDatabase, deleteDatabase, executeQuery, } = useDatabaseStore(); const [showCreateForm, setShowCreateForm] = useState(false); const [newDbName, setNewDbName] = useState(''); const [newDbType, setNewDbType] = useState('document'); const [newDbRegion, setNewDbRegion] = useState('us-east'); const [selectedDb, setSelectedDb] = useState(null); const [queryInput, setQueryInput] = useState(''); const [isQuerying, setIsQuerying] = useState(false); const [queryResult, setQueryResult] = useState(null); useEffect(() => { fetchInstances(); }, [fetchInstances]); const handleCreateDatabase = async () => { if (!newDbName) return; try { await createDatabase(newDbName, newDbType, newDbRegion); setShowCreateForm(false); setNewDbName(''); fetchInstances(); } catch { // Error handled by store } }; const handleDeleteDatabase = async (id: string) => { if (!confirm('Are you sure you want to delete this database? This action cannot be undone.')) { return; } await deleteDatabase(id); if (selectedDb === id) { setSelectedDb(null); } fetchInstances(); }; const handleQuery = async () => { if (!selectedDb || !queryInput) return; setIsQuerying(true); try { const result = await executeQuery(selectedDb, queryInput); setQueryResult(result); } catch { // Error handled by store } finally { setIsQuerying(false); } }; const formatSize = (bytes: number) => { if (bytes >= 1_000_000_000) return `${(bytes / 1_000_000_000).toFixed(2)} GB`; if (bytes >= 1_000_000) return `${(bytes / 1_000_000).toFixed(2)} MB`; if (bytes >= 1_000) return `${(bytes / 1_000).toFixed(2)} KB`; return `${bytes} B`; }; const selectedDatabase = instances.find((db) => db.id === selectedDb); return (
{/* Header */}

Database Services

Multi-model decentralized databases

{/* Error Alert */} {error && (

{error}

)} {/* Create Database Modal */} {showCreateForm && (

Create Database

setNewDbName(e.target.value)} placeholder="my-database" className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-synor-500" />
{DATABASE_TYPES.map((type) => ( ))}
)}
{/* Database List */}

Your Databases

{instances.map((db) => (
setSelectedDb(db.id)} className={`bg-gray-900 rounded-xl p-4 border cursor-pointer transition-colors ${ selectedDb === db.id ? 'border-synor-500 bg-synor-600/10' : 'border-gray-800 hover:border-gray-700' }`} >
{TYPE_ICONS[db.dbType]}

{db.name}

{db.dbType} • {db.region}

Size

{formatSize(db.storageUsed)}

Status

{db.status}

))} {instances.length === 0 && (

No databases yet

)}
{/* Query Panel */}
{selectedDatabase ? (
{TYPE_ICONS[selectedDatabase.dbType]}

{selectedDatabase.name}

{TYPE_DESCRIPTIONS[selectedDatabase.dbType]}