import { useParams } from 'common' import { Check, Clock, Copy } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import { Button, copyToClipboard, ResizableHandle, ResizablePanel, Skeleton, Tabs_Shadcn_ as Tabs, TabsContent_Shadcn_ as TabsContent, TabsList_Shadcn_ as TabsList, TabsTrigger_Shadcn_ as TabsTrigger, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { PostgresFlowDetail } from './ServiceFlow/components/blocks/PostgresFlowDetail' import { MemoizedEdgeFunctionBlock, MemoizedGoTrueBlock, MemoizedNetworkBlock, MemoizedPostgresBlock, MemoizedPostgRESTBlock, MemoizedStorageBlock, } from './ServiceFlow/components/ServiceBlocks' import { ServiceFlowPanelControls } from './ServiceFlow/components/ServiceFlowPanelControls' import { DetailSectionHeader } from './ServiceFlow/components/shared/DetailSection' import { ColumnSchema } from './UnifiedLogs.schema' import { QuerySearchParamsType } from './UnifiedLogs.types' import { getRowTimestampMs } from './UnifiedLogs.utils' import { useDataTable } from '@/components/ui/DataTable/providers/DataTableProvider' import { ServiceFlowType, useUnifiedLogInspectionQuery, } from '@/data/logs/unified-log-inspection-query' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' interface ServiceFlowPanelProps { dock: 'bottom' | 'right' setDock: (value: 'bottom' | 'right') => void selectedRow?: ColumnSchema selectedRowKey: string searchParameters: QuerySearchParamsType } export function ServiceFlowPanel({ dock, setDock, selectedRow, selectedRowKey, searchParameters, }: ServiceFlowPanelProps) { const { table, filterFields } = useDataTable() const { ref: projectRef } = useParams() const [activeTab, setActiveTab] = useState('overview') const [jsonCopied, setJsonCopied] = useState(false) const overviewScrollRef = useRef(null) const jsonScrollRef = useRef(null) useEffect(() => { overviewScrollRef.current?.scrollTo({ top: 0 }) jsonScrollRef.current?.scrollTo({ top: 0 }) }, [selectedRowKey]) const logType = selectedRow?.log_type const serviceFlowType: ServiceFlowType | undefined = logType === 'edge function' ? 'edge-function' : (logType as ServiceFlowType) const shouldShowServiceFlow = !!serviceFlowType useEffect(() => { if (!shouldShowServiceFlow && activeTab === 'overview') { setActiveTab('raw-json') } }, [shouldShowServiceFlow, activeTab]) const { logsMetadata } = useIsFeatureEnabled(['logs:metadata']) // Query the logs API directly const { data: serviceFlowData, isPending: isLoading, error, } = useUnifiedLogInspectionQuery( { projectRef: projectRef, logId: selectedRow?.id, type: serviceFlowType, search: searchParameters, }, { enabled: Boolean(selectedRow?.id) && Boolean(serviceFlowType) } ) if (!selectedRowKey || !selectedRow) return null const timestampMs = getRowTimestampMs(selectedRow) const formattedTime = timestampMs ? new Date(timestampMs).toLocaleString() : null // Prepare JSON data for Raw JSON tab const jsonData = shouldShowServiceFlow && serviceFlowData?.result?.[0] ? serviceFlowData.result[0] : selectedRow const formattedJsonData = !logsMetadata && 'raw_log_data' in jsonData && 'metadata' in jsonData.raw_log_data ? { ...jsonData, raw_log_data: { ...jsonData.raw_log_data, metadata: undefined }, } : jsonData return ( <>
{shouldShowServiceFlow && ( Overview )} Raw JSON
{shouldShowServiceFlow && ( {error ? (
Error: {error.toString()}
) : serviceFlowType === 'postgres' ? ( ) : (
{serviceFlowType === 'auth' ? ( ) : serviceFlowType === 'edge-function' ? ( ) : serviceFlowType === 'storage' ? ( ) : ( <> )}
)}
)} {isLoading && shouldShowServiceFlow && (
Enriching log...
)}
{JSON.stringify(formattedJsonData, null, 2)}
) }