import { useMemo } from "react"; import { GripVertical } from "lucide-react"; import { useTranslation } from "react-i18next"; import type { DraggableAttributes, DraggableSyntheticListeners, } from "@dnd-kit/core"; import type { Provider } from "@/types"; import type { AppType } from "@/lib/api"; import { cn } from "@/lib/utils"; import { ProviderActions } from "@/components/providers/ProviderActions"; import UsageFooter from "@/components/UsageFooter"; interface DragHandleProps { attributes: DraggableAttributes; listeners: DraggableSyntheticListeners; isDragging: boolean; } interface ProviderCardProps { provider: Provider; isCurrent: boolean; appType: AppType; isEditMode?: boolean; onSwitch: (provider: Provider) => void; onEdit: (provider: Provider) => void; onDelete: (provider: Provider) => void; onConfigureUsage: (provider: Provider) => void; onOpenWebsite: (url: string) => void; dragHandleProps?: DragHandleProps; } const extractApiUrl = (provider: Provider, fallbackText: string) => { if (provider.websiteUrl) { return provider.websiteUrl; } const config = provider.settingsConfig; if (config && typeof config === "object") { const envBase = (config as Record)?.env?.ANTHROPIC_BASE_URL; if (typeof envBase === "string" && envBase.trim()) { return envBase; } const baseUrl = (config as Record)?.config; if (typeof baseUrl === "string" && baseUrl.includes("base_url")) { const match = baseUrl.match(/base_url\s*=\s*['"]([^'"]+)['"]/); if (match?.[1]) { return match[1]; } } } return fallbackText; }; export function ProviderCard({ provider, isCurrent, appType, isEditMode = false, onSwitch, onEdit, onDelete, onConfigureUsage, onOpenWebsite, dragHandleProps, }: ProviderCardProps) { const { t } = useTranslation(); const fallbackUrlText = t("provider.notConfigured", { defaultValue: "未配置接口地址", }); const displayUrl = useMemo(() => { return extractApiUrl(provider, fallbackUrlText); }, [provider, fallbackUrlText]); const usageEnabled = provider.meta?.usage_script?.enabled ?? false; const handleOpenWebsite = () => { if (!displayUrl || displayUrl === fallbackUrlText) { return; } onOpenWebsite(displayUrl); }; return (

{provider.name}

{isCurrent && ( {t("provider.currentlyUsing")} )}
{displayUrl && ( )}
onSwitch(provider)} onEdit={() => onEdit(provider)} onConfigureUsage={() => onConfigureUsage(provider)} onDelete={() => onDelete(provider)} />
); }