import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { Button } from 'ui' import { Markdown } from '../Markdown' import { asGraphqlExposureLint, GraphqlExposureCallout } from './GraphqlExposureLintCTA' import { EntityTypeIcon, LintCTA, LintEntity } from './Linter.utils' import { createLintSummaryPrompt, lintInfoMap } from '@/components/interfaces/Linter/Linter.utils' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' import { Lint } from '@/data/lint/lint-query' import { DOCS_URL } from '@/lib/constants' import { useTrack } from '@/lib/telemetry/track' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface LintDetailProps { lint: Lint projectRef: string onAskAssistant?: () => void onAfterAction?: () => void } export const LintDetail = ({ lint, projectRef, onAskAssistant, onAfterAction, }: LintDetailProps) => { const track = useTrack() const snap = useAiAssistantStateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const isGraphqlExposureLint = !!asGraphqlExposureLint(lint.name) const handleAskAssistant = () => { track('advisor_assistant_button_clicked', { origin: 'lint_detail', advisorCategory: lint.categories[0], advisorType: lint.name, advisorLevel: lint.level, }) onAskAssistant?.() openSidebar(SIDEBAR_KEYS.AI_ASSISTANT) snap.newChat({ name: 'Summarize lint', initialMessage: createLintSummaryPrompt(lint), }) } const buildPromptForCopy = () => { return createLintSummaryPrompt(lint) } return (

Entity

Issue

{lint.detail.replace(/\\`/g, '`')}

Description

{lint.description.replace(/\\`/g, '`')} {isGraphqlExposureLint && (
)}

Resolve

) }