import { Activity, ExternalLink, Shield } from 'lucide-react' import Link from 'next/link' import { useCallback, useMemo, useState } from 'react' import { useParams } from 'common' import { LINTER_LEVELS } from 'components/interfaces/Linter/Linter.constants' import { EntityTypeIcon, createLintSummaryPrompt } from 'components/interfaces/Linter/Linter.utils' import { useQueryPerformanceQuery } from 'components/interfaces/Reports/Reports.queries' import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { Lint, useProjectLintsQuery } from 'data/lint/lint-query' import { useAdvisorStateSnapshot } from 'state/advisor-state' import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Card, CardContent, CardHeader, CardTitle, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Tabs_Shadcn_ as Tabs, TabsContent_Shadcn_ as TabsContent, TabsList_Shadcn_ as TabsList, TabsTrigger_Shadcn_ as TabsTrigger, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' interface SlowQuery { rolname: string mean_time: number calls: number query: string } export const AdvisorWidget = () => { const { ref: projectRef } = useParams() const [selectedTab, setSelectedTab] = useState<'security' | 'performance'>('security') const { data: lints, isPending: isLoadingLints } = useProjectLintsQuery({ projectRef }) const { data: slowestQueriesData, isLoading: isLoadingSlowestQueries } = useQueryPerformanceQuery( { preset: 'slowestExecutionTime', } ) const snap = useAiAssistantStateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const { setSelectedItem } = useAdvisorStateSnapshot() const securityLints = useMemo( () => (lints ?? []).filter((lint: Lint) => lint.categories.includes('SECURITY')), [lints] ) const performanceLints = useMemo( () => (lints ?? []).filter((lint: Lint) => lint.categories.includes('PERFORMANCE')), [lints] ) const securityErrorCount = securityLints.filter( (lint: Lint) => lint.level === LINTER_LEVELS.ERROR ).length const securityWarningCount = securityLints.filter( (lint: Lint) => lint.level === LINTER_LEVELS.WARN ).length const performanceErrorCount = performanceLints.filter( (lint: Lint) => lint.level === LINTER_LEVELS.ERROR ).length const performanceWarningCount = performanceLints.filter( (lint: Lint) => lint.level === LINTER_LEVELS.WARN ).length const top5SlowestQueries = useMemo( () => ((slowestQueriesData ?? []) as SlowQuery[]).slice(0, 5), [slowestQueriesData] ) const handleLintClick = useCallback( (lint: Lint) => { setSelectedItem(lint.cache_key, 'lint') openSidebar(SIDEBAR_KEYS.ADVISOR_PANEL) }, [setSelectedItem, openSidebar] ) const totalIssues = securityErrorCount + securityWarningCount + performanceErrorCount + performanceWarningCount const hasErrors = securityErrorCount > 0 || performanceErrorCount > 0 const hasWarnings = securityWarningCount > 0 || performanceWarningCount > 0 let titleContent: React.ReactNode if (totalIssues === 0) { titleContent =
No {title.toLowerCase()} issues found
No slow queries found in the selected period