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 (
)
}
function LogErrorState({ error }: { error?: string | object }) {
return {JSON.stringify(error, null, 2)}
}