import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Card, CardContent, CardHeader } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Loader2, Search, ChevronDown, ChevronRight } from 'lucide-react'; import { format } from 'date-fns'; import { supabase } from '@/lib/supabaseClient'; interface DatabaseLog { id: string; timestamp: number; identifier: string; error_severity: string; event_message: string; } export function DatabaseLogs() { const [searchTerm, setSearchTerm] = useState(''); const [severity, setSeverity] = useState('all'); const [timeRange, setTimeRange] = useState<'1h' | '24h' | '7d'>('24h'); const [expandedLog, setExpandedLog] = useState(null); const { data: logs, isLoading } = useQuery({ queryKey: ['database-logs', severity, timeRange], queryFn: async () => { // For now, return empty array as we need proper permissions for analytics query // In production, this would use Supabase Analytics API // const hoursAgo = timeRange === '1h' ? 1 : timeRange === '24h' ? 24 : 168; // const startTime = Date.now() * 1000 - (hoursAgo * 60 * 60 * 1000 * 1000); return [] as DatabaseLog[]; }, refetchInterval: 30000, }); const filteredLogs = logs?.filter(log => { if (searchTerm && !log.event_message.toLowerCase().includes(searchTerm.toLowerCase())) { return false; } return true; }) || []; const getSeverityColor = (severity: string): "default" | "destructive" | "outline" | "secondary" => { switch (severity.toUpperCase()) { case 'ERROR': return 'destructive'; case 'WARNING': return 'destructive'; case 'NOTICE': return 'default'; case 'LOG': return 'secondary'; default: return 'outline'; } }; const isSpanLog = (message: string) => { return message.includes('SPAN:') || message.includes('SPAN_EVENT:'); }; const toggleExpand = (logId: string) => { setExpandedLog(expandedLog === logId ? null : logId); }; return (
setSearchTerm(e.target.value)} className="pl-10" />
{isLoading ? (
) : filteredLogs.length === 0 ? (

No database logs found for the selected criteria.

) : (
{filteredLogs.map((log) => ( toggleExpand(log.id)} >
{expandedLog === log.id ? ( ) : ( )} {log.error_severity} {isSpanLog(log.event_message) && ( TRACE )} {format(log.timestamp / 1000, 'HH:mm:ss.SSS')}
{log.event_message.slice(0, 100)} {log.event_message.length > 100 && '...'}
{expandedLog === log.id && (
Full Message:
                        {log.event_message}
                      
Timestamp:

{format(log.timestamp / 1000, 'PPpp')}

Identifier:

{log.identifier}

)}
))}
)}
); }