"use client"; import { AiConfigCodeBlock } from "@app/components/ai-client-config/AiConfigCodeBlock"; import { Button } from "@app/components/ui/button"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@app/components/ui/collapsible"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@app/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@app/components/ui/tabs"; import type { AiClientAuthInput, AiClientId, AiClientPresetId } from "@app/lib/aiClientConfig"; import { buildAiClientGuide } from "@app/lib/aiClientConfig"; import { cn } from "@app/lib/cn"; import { ChevronDown, Loader2, type LucideIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import { useMemo, useState } from "react"; type AiClientConfigCardProps = { clientId: AiClientId; name: string; endpoint: string; keyAuth: AiClientAuthInput; description: string; icon: LucideIcon; }; export function AiClientConfigCard({ clientId, name, endpoint, keyAuth, description, icon: Icon }: AiClientConfigCardProps) { const t = useTranslations(); const [open, setOpen] = useState(false); const [presetId, setPresetId] = useState("default"); const [revealedKey, setRevealedKey] = useState(null); const [revealing, setRevealing] = useState(false); const [revealError, setRevealError] = useState(false); const reveal = () => { if (keyAuth.mode !== "keyed" || revealedKey !== null || revealing) { return; } setRevealing(true); setRevealError(false); keyAuth .getKeyText() .then(setRevealedKey) .catch(() => setRevealError(true)) .finally(() => setRevealing(false)); }; const handleOpenChange = (next: boolean) => { setOpen(next); if (next) { reveal(); } }; const guide = useMemo(() => { if (keyAuth.mode === "keyless") { return buildAiClientGuide(clientId, endpoint, { mode: "keyless" }); } if (revealedKey === null) { return null; } return buildAiClientGuide(clientId, endpoint, { mode: "keyed", key: revealedKey }); }, [clientId, endpoint, keyAuth.mode, revealedKey]); const preset = guide?.presets.find((p) => p.id === presetId) ?? guide?.presets[0]; const manualContent = guide ? (
{guide.presets.length > 1 ? ( ) : null}
{preset?.blocks.map((block) => ( ))}
) : null; return (

{name}

{description}

{!guide && revealing ? (
) : null} {!guide && revealError ? (

{t("aiClientConfigRevealError")}

) : null} {guide ? ( guide.cli ? ( {t("aiClientConfigTabCli")} {t("aiClientConfigTabManual")} {guide.cli.configureWithKey ? ( ) : null} {manualContent} ) : ( manualContent ) ) : null}
); }