import { Check, Copy, MousePointerClick, X } from 'lucide-react' import { useEffect, useState } from 'react' import { Button, cn, copyToClipboard, Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import type { LogData, QueryType } from './Logs.types' import { apiKey, role as extractRole, jwtAPIKey } from './Logs.utils' import DefaultPreviewSelectionRenderer from './LogSelectionRenderers/DefaultPreviewSelectionRenderer' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' export interface LogSelectionProps { log?: LogData onClose: () => void queryType?: QueryType projectRef: string isLoading: boolean error?: string | object } const LogSelection = ({ log, onClose, queryType, isLoading, error }: LogSelectionProps) => { const [showCopied, setShowCopied] = useState(false) useEffect(() => { if (!showCopied) return const timer = setTimeout(() => setShowCopied(false), 2000) return () => clearTimeout(timer) }, [showCopied]) const LogDetails = () => { if (error) return if (!log) return switch (queryType) { case 'api': const status = log?.metadata?.[0]?.response?.[0]?.status_code const method = log?.metadata?.[0]?.request?.[0]?.method const path = log?.metadata?.[0]?.request?.[0]?.path const search = log?.metadata?.[0]?.request?.[0]?.search const user_agent = log?.metadata?.[0]?.request?.[0]?.headers[0].user_agent const error_code = log?.metadata?.[0]?.response?.[0]?.headers?.[0]?.x_sb_error_code const apikey = jwtAPIKey(log?.metadata) ?? apiKey(log?.metadata) const role = extractRole(log?.metadata) const { id, metadata, timestamp, event_message, ...rest } = log const apiLog = { id, status, method, path, search, user_agent, timestamp, event_message, metadata, ...(apikey ? { apikey } : null), ...(error_code ? { error_code } : null), ...(role ? { role } : null), ...rest, } return case 'database': const hint = log?.metadata?.[0]?.parsed?.[0]?.hint const detail = log?.metadata?.[0]?.parsed?.[0]?.detail const query = log?.metadata?.[0]?.parsed?.[0]?.query const postgresLog = { ...(hint && { hint }), ...(detail && { detail }), ...(query && { query }), ...log, } return default: return } } return (
Details Raw
: } onClick={() => { setShowCopied(true) copyToClipboard(JSON.stringify(log, null, 2)) }} />
{isLoading ? (
) : ( <> {JSON.stringify(log, null, 2)} )}
) } export default LogSelection function LogDetailEmptyState({ title = 'Select an Event', message = 'Select an Event to view the complete JSON payload', }: { title?: string message?: string }) { return (

{title}

{message}

) } function LogErrorState({ error }: { error?: string | object }) { return
{JSON.stringify(error, null, 2)}
}