Files
supabase/apps/studio/components/interfaces/Support/SupportAssistantSuccessCard.tsx
T
Joshen Lim 09a1f431bc Mass update for all lucide icon imports to use the component with Icon suffix (#51659)
## Context

This is largely just a mechanical change here:
Opting to use lucide icons with the `Icon` suffix across all icon
imports within `studio`
- so that it’s clearer which components are icons + reduces the
possibility of name collision with our own components
- e.g <User /> vs <UserIcon />

Also added a eslint rule for this:
<img width="1069" height="167" alt="image"
src="https://github.com/user-attachments/assets/7f36f443-5ca2-4bf6-8d22-86e774513bfc"
/>

And updated `AGENTS.md` as such:
```
Icons come from `lucide-react`, always imported with the `Icon` suffix (`import { CheckIcon, Trash2Icon } from 'lucide-react'`) — never the bare names (`Check`) or `Check as CheckIcon` aliases (lint-enforced).
```
2026-10-14 12:56:55 +02:00

86 lines
2.5 KiB
TypeScript

import { ArrowUpRightIcon } from 'lucide-react'
import dynamic from 'next/dynamic'
import {
AiIconAnimation,
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
cn,
Skeleton,
} from 'ui'
import type { SubmittedSupportRequest } from './SupportForm.state'
import { NO_PROJECT_MARKER } from './SupportForm.utils'
interface SupportAssistantSuccessCardProps {
request: SubmittedSupportRequest
className?: string
}
const SupportAssistantSuccessCardContent = dynamic<SupportAssistantSuccessCardProps>(
() =>
import('@/components/ui/AIAssistantPanel/AIAssistant').then(
(mod) => mod.SupportAssistantSuccessCardContent
),
{
loading: () => <SupportAssistantSuccessCardLoadingShell />,
}
)
function hasProjectScopedAssistantContext(projectRef: string | undefined) {
return projectRef !== undefined && projectRef !== NO_PROJECT_MARKER
}
export function SupportAssistantSuccessCard(props: SupportAssistantSuccessCardProps) {
if (!hasProjectScopedAssistantContext(props.request.projectRef)) return null
return <SupportAssistantSuccessCardContent {...props} />
}
function SupportAssistantSuccessCardLoadingShell({ className }: { className?: string }) {
return (
<Card
role="button"
tabIndex={0}
aria-label="Open assistant response"
className={cn(
'group cursor-pointer bg-muted/50 transition-colors hover:bg-muted/50 focus-ring',
className
)}
>
<CardHeader className="flex-row items-center justify-between gap-4 space-y-0">
<div className="flex min-w-0 items-center gap-3">
<div className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border bg-background">
<AiIconAnimation size={14} />
</div>
<div className="min-w-0 space-y-1">
<CardTitle>While you wait</CardTitle>
<CardDescription>Assistant may be able to help</CardDescription>
</div>
</div>
<ArrowUpRightIcon
size={14}
strokeWidth={1.5}
className="shrink-0 text-foreground-lighter transition-colors group-hover:text-foreground"
aria-hidden
/>
</CardHeader>
<CardContent>
<SupportAssistantResponseLoadingSkeleton />
</CardContent>
</Card>
)
}
function SupportAssistantResponseLoadingSkeleton() {
return (
<div className="space-y-2">
<Skeleton className="h-4 w-[82%]" />
<Skeleton className="h-4 w-[92%]" />
<Skeleton className="h-4 w-[68%]" />
</div>
)
}