import { useParams } from 'common' import { useDataTable } from 'components/ui/DataTable/providers/DataTableProvider' import { ServiceFlowType, useUnifiedLogInspectionQuery, } from 'data/logs/unified-log-inspection-query' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useState } from 'react' import { cn, CodeBlock, ResizableHandle, ResizablePanel, Skeleton, Tabs_Shadcn_ as Tabs, TabsContent_Shadcn_ as TabsContent, TabsList_Shadcn_ as TabsList, TabsTrigger_Shadcn_ as TabsTrigger, } from 'ui' import { MemoizedRequestStartedBlock } from './ServiceFlow/components/blocks/RequestStartedBlock' import { MemoizedResponseCompletedBlock } from './ServiceFlow/components/blocks/ResponseCompletedBlock' import { MemoizedEdgeFunctionBlock, MemoizedGoTrueBlock, MemoizedNetworkBlock, MemoizedPostgresBlock, MemoizedPostgRESTBlock, MemoizedStorageBlock, } from './ServiceFlow/components/ServiceBlocks' import { ServiceFlowHeader } from './ServiceFlow/components/ServiceFlowHeader' import { ColumnSchema } from './UnifiedLogs.schema' import { QuerySearchParamsType } from './UnifiedLogs.types' interface ServiceFlowPanelProps { selectedRow: ColumnSchema selectedRowKey: string searchParameters: QuerySearchParamsType } export function ServiceFlowPanel({ selectedRow, selectedRowKey, searchParameters, }: ServiceFlowPanelProps) { const { table, filterFields } = useDataTable() const { ref: projectRef } = useParams() const [activeTab, setActiveTab] = useState('service-flow') const { logsMetadata } = useIsFeatureEnabled(['logs:metadata']) const logType = selectedRow?.log_type const serviceFlowType: ServiceFlowType | undefined = logType === 'edge function' ? 'edge-function' : (logType as ServiceFlowType) const shouldShowServiceFlow = !!serviceFlowType // Query the logs API directly const { data: serviceFlowData, isPending: isLoading, error, } = useUnifiedLogInspectionQuery( { projectRef: projectRef, logId: selectedRow?.id, type: serviceFlowType, search: searchParameters, }, { enabled: Boolean(projectRef) && Boolean(selectedRow?.id) && Boolean(serviceFlowType), } ) // 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 if (selectedRowKey) { return ( <>
{/* Service Flow Header with navigation */}
{shouldShowServiceFlow && ( Overview )} Raw JSON {shouldShowServiceFlow && (
{error ? (
Error: {error.toString()}
) : ( <> {serviceFlowType === 'postgres' ? ( // Postgres flows: Connection Started -> Postgres -> Response <> ) : ( // HTTP-based flows: Request Started -> Network -> Service -> Response <> {serviceFlowType === 'auth' ? ( ) : serviceFlowType === 'edge-function' ? ( ) : serviceFlowType === 'storage' ? ( ) : ( <> )} )} )}
)} {isLoading && shouldShowServiceFlow && (
Enriching log...
)} {JSON.stringify(formattedJsonData, null, 2)}
) } return null }