import { BarChart3, Check, Copy, Edit, Loader2, Minus, Play, Plus, Terminal, TestTube2, Trash2, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import type { AppId } from "@/lib/api"; interface ProviderActionsProps { appId?: AppId; isCurrent: boolean; /** OpenCode: 是否已添加到配置 */ isInConfig?: boolean; isTesting?: boolean; isProxyTakeover?: boolean; onSwitch: () => void; onEdit: () => void; onDuplicate: () => void; onTest?: () => void; onConfigureUsage: () => void; onDelete: () => void; /** OpenCode: remove from live config (not delete from database) */ onRemoveFromConfig?: () => void; onOpenTerminal?: () => void; // 故障转移相关 isAutoFailoverEnabled?: boolean; isInFailoverQueue?: boolean; onToggleFailover?: (enabled: boolean) => void; } export function ProviderActions({ appId, isCurrent, isInConfig = false, isTesting, isProxyTakeover = false, onSwitch, onEdit, onDuplicate, onTest, onConfigureUsage, onDelete, onRemoveFromConfig, onOpenTerminal, // 故障转移相关 isAutoFailoverEnabled = false, isInFailoverQueue = false, onToggleFailover, }: ProviderActionsProps) { const { t } = useTranslation(); const iconButtonClass = "h-8 w-8 p-1"; // OpenCode 使用累加模式 const isOpenCodeMode = appId === "opencode"; // 故障转移模式下的按钮逻辑(OpenCode 不支持故障转移) const isFailoverMode = !isOpenCodeMode && isAutoFailoverEnabled && onToggleFailover; // 处理主按钮点击 const handleMainButtonClick = () => { if (isOpenCodeMode) { // OpenCode 模式:切换配置状态(添加/移除) if (isInConfig) { // Use onRemoveFromConfig if available, otherwise fall back to onDelete if (onRemoveFromConfig) { onRemoveFromConfig(); } else { onDelete(); } } else { onSwitch(); // 添加到配置 } } else if (isFailoverMode) { // 故障转移模式:切换队列状态 onToggleFailover(!isInFailoverQueue); } else { // 普通模式:切换供应商 onSwitch(); } }; // 主按钮的状态和样式 const getMainButtonState = () => { // OpenCode 累加模式 if (isOpenCodeMode) { if (isInConfig) { return { disabled: false, variant: "secondary" as const, className: "bg-orange-100 text-orange-600 hover:bg-orange-200 dark:bg-orange-900/50 dark:text-orange-400 dark:hover:bg-orange-900/70", icon: , text: t("provider.removeFromConfig", { defaultValue: "移除" }), }; } return { disabled: false, variant: "default" as const, className: "bg-emerald-500 hover:bg-emerald-600 dark:bg-emerald-600 dark:hover:bg-emerald-700", icon: , text: t("provider.addToConfig", { defaultValue: "添加" }), }; } // 故障转移模式 if (isFailoverMode) { if (isInFailoverQueue) { return { disabled: false, variant: "secondary" as const, className: "bg-blue-100 text-blue-600 hover:bg-blue-200 dark:bg-blue-900/50 dark:text-blue-400 dark:hover:bg-blue-900/70", icon: , text: t("failover.inQueue", { defaultValue: "已加入" }), }; } return { disabled: false, variant: "default" as const, className: "bg-blue-500 hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-700", icon: , text: t("failover.addQueue", { defaultValue: "加入" }), }; } // 普通模式 if (isCurrent) { return { disabled: true, variant: "secondary" as const, className: "bg-gray-200 text-muted-foreground hover:bg-gray-200 hover:text-muted-foreground dark:bg-gray-700 dark:hover:bg-gray-700", icon: , text: t("provider.inUse"), }; } return { disabled: false, variant: "default" as const, className: isProxyTakeover ? "bg-emerald-500 hover:bg-emerald-600 dark:bg-emerald-600 dark:hover:bg-emerald-700" : "", icon: , text: t("provider.enable"), }; }; const buttonState = getMainButtonState(); // OpenCode 模式下删除按钮始终可用(主按钮"移除"是从 live 配置移除,删除是从数据库删除) const canDelete = isOpenCodeMode ? true : !isCurrent; return (
{onTest && ( )} {onOpenTerminal && ( )}
); }