| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 'use client'
- import { ExternalLink } from 'lucide-react'
- import { useState } from 'react'
- import { AccordionContent, AccordionItem, AccordionTrigger, Button } from 'ui'
- import { RestartProjectDialog } from './RestartProjectDialog'
- import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown'
- import { useTrack } from '@/lib/telemetry/track'
- interface StepTriggerProps {
- number: number
- title: string
- }
- function StepTrigger({ number, title }: StepTriggerProps) {
- return (
- <AccordionTrigger className="py-3 hover:no-underline">
- <div className="flex items-center gap-2.5">
- <span className="shrink-0 w-6 h-6 border border-button-hover text-foreground font-mono tabular-nums bg-button rounded-md text-xs font-medium flex items-center justify-center">
- {number}
- </span>
- <span className="text-sm font-medium text-foreground text-left">{title}</span>
- </div>
- </AccordionTrigger>
- )
- }
- interface RestartDatabaseTroubleshootingSectionProps {
- number: number
- errorType: string
- /** Override the restart handler. If not provided, opens the restart dialog internally. */
- onRestartProject?: () => void
- }
- export function RestartDatabaseTroubleshootingSection({
- number,
- errorType,
- onRestartProject,
- }: RestartDatabaseTroubleshootingSectionProps) {
- const track = useTrack()
- const [showDialog, setShowDialog] = useState(false)
- const handleClick = () => {
- track('inline_error_troubleshooter_action_clicked', {
- errorType,
- ctaType: 'restart_db',
- })
- if (onRestartProject) {
- onRestartProject()
- } else {
- setShowDialog(true)
- }
- }
- return (
- <>
- <AccordionItem
- value={`step-${number}`}
- className="border-b border-default last:border-b-0 px-3 py-2"
- >
- <StepTrigger number={number} title="Try restarting your project" />
- <AccordionContent className="pt-1">
- <div className="px-2">
- <p className="text-sm text-foreground-light mb-3">
- Restarting your project can help resolve timeout errors or stale connections.
- </p>
- <Button type="default" size="tiny" onClick={handleClick}>
- Restart project
- </Button>
- </div>
- </AccordionContent>
- </AccordionItem>
- <RestartProjectDialog
- visible={showDialog}
- onClose={() => setShowDialog(false)}
- restartType="database"
- />
- </>
- )
- }
- interface TroubleshootingGuideSectionProps {
- number: number
- errorType: string
- href: string
- title?: string
- description?: string
- }
- export function TroubleshootingGuideSection({
- number,
- errorType,
- href,
- title = 'Try our troubleshooting guide',
- description,
- }: TroubleshootingGuideSectionProps) {
- const track = useTrack()
- return (
- <AccordionItem
- value={`step-${number}`}
- className="border-b border-default last:border-b-0 px-3 py-2"
- >
- <StepTrigger number={number} title={title} />
- <AccordionContent className="pt-1">
- <div className="px-2">
- {description && <p className="text-sm text-foreground-light mb-3">{description}</p>}
- <Button
- asChild
- type="default"
- size="tiny"
- onClick={() =>
- track('inline_error_troubleshooter_action_clicked', {
- errorType,
- ctaType: 'troubleshooting_guide',
- })
- }
- iconRight={<ExternalLink />}
- >
- <a href={href} target="_blank" rel="noopener noreferrer">
- View troubleshooting guide
- </a>
- </Button>
- </div>
- </AccordionContent>
- </AccordionItem>
- )
- }
- interface FixWithAITroubleshootingSectionProps {
- number: number
- errorType: string
- description?: string
- onDebugWithAI?: (prompt: string) => void
- buildPrompt: () => string
- }
- export function FixWithAITroubleshootingSection({
- number,
- errorType,
- description = 'Let our AI assistant help diagnose and suggest solutions.',
- onDebugWithAI,
- buildPrompt,
- }: FixWithAITroubleshootingSectionProps) {
- const track = useTrack()
- return (
- <AccordionItem
- value={`step-${number}`}
- className="border-b border-default last:border-b-0 px-3 py-2"
- >
- <StepTrigger number={number} title="Debug with AI" />
- <AccordionContent className="pt-1">
- <div className="px-2">
- <p className="text-sm text-foreground-light mb-3">{description}</p>
- <AiAssistantDropdown
- label="Debug with AI"
- buildPrompt={buildPrompt}
- onOpenAssistant={() => {
- track('inline_error_troubleshooter_action_clicked', {
- errorType,
- ctaType: 'ask_ai',
- })
- onDebugWithAI?.(buildPrompt())
- }}
- size="tiny"
- />
- </div>
- </AccordionContent>
- </AccordionItem>
- )
- }
|