diff --git a/src/App.tsx b/src/App.tsx index 7f7839313..ad2f9d124 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -77,7 +77,11 @@ function App() { const [editingProvider, setEditingProvider] = useState(null); const [usageProvider, setUsageProvider] = useState(null); - const [confirmDelete, setConfirmDelete] = useState(null); + // Confirm action state: 'remove' = remove from live config, 'delete' = delete from database + const [confirmAction, setConfirmAction] = useState<{ + provider: Provider; + action: "remove" | "delete"; + } | null>(null); const [envConflicts, setEnvConflicts] = useState([]); const [showEnvBanner, setShowEnvBanner] = useState(false); @@ -322,11 +326,20 @@ function App() { setEditingProvider(null); }; - // 确认删除供应商 - const handleConfirmDelete = async () => { - if (!confirmDelete) return; - await deleteProvider(confirmDelete.id); - setConfirmDelete(null); + // 确认删除/移除供应商 + const handleConfirmAction = async () => { + if (!confirmAction) return; + const { provider, action } = confirmAction; + + if (action === "remove") { + // Remove from live config only (OpenCode) + // The switch operation with empty/removal semantics + await deleteProvider(provider.id); + } else { + // Delete from database + await deleteProvider(provider.id); + } + setConfirmAction(null); }; // 复制供应商 @@ -498,7 +511,15 @@ function App() { activeProviderId={activeProviderId} onSwitch={switchProvider} onEdit={setEditingProvider} - onDelete={setConfirmDelete} + onDelete={(provider) => + setConfirmAction({ provider, action: "delete" }) + } + onRemoveFromConfig={ + activeApp === "opencode" + ? (provider) => + setConfirmAction({ provider, action: "remove" }) + : undefined + } onDuplicate={handleDuplicateProvider} onConfigureUsage={setUsageProvider} onOpenWebsite={handleOpenWebsite} @@ -847,17 +868,25 @@ function App() { )} void handleConfirmDelete()} - onCancel={() => setConfirmDelete(null)} + onConfirm={() => void handleConfirmAction()} + onCancel={() => setConfirmAction(null)} /> diff --git a/src/components/providers/ProviderActions.tsx b/src/components/providers/ProviderActions.tsx index 1d67ad3ee..aa5b75187 100644 --- a/src/components/providers/ProviderActions.tsx +++ b/src/components/providers/ProviderActions.tsx @@ -29,6 +29,8 @@ interface ProviderActionsProps { onTest?: () => void; onConfigureUsage: () => void; onDelete: () => void; + /** OpenCode: remove from live config (not delete from database) */ + onRemoveFromConfig?: () => void; onOpenTerminal?: () => void; // 故障转移相关 isAutoFailoverEnabled?: boolean; @@ -48,6 +50,7 @@ export function ProviderActions({ onTest, onConfigureUsage, onDelete, + onRemoveFromConfig, onOpenTerminal, // 故障转移相关 isAutoFailoverEnabled = false, @@ -68,7 +71,12 @@ export function ProviderActions({ if (isOpenCodeMode) { // OpenCode 模式:切换配置状态(添加/移除) if (isInConfig) { - onDelete(); // 从配置移除 + // Use onRemoveFromConfig if available, otherwise fall back to onDelete + if (onRemoveFromConfig) { + onRemoveFromConfig(); + } else { + onDelete(); + } } else { onSwitch(); // 添加到配置 } diff --git a/src/components/providers/ProviderCard.tsx b/src/components/providers/ProviderCard.tsx index 248d5842f..a49e02608 100644 --- a/src/components/providers/ProviderCard.tsx +++ b/src/components/providers/ProviderCard.tsx @@ -30,6 +30,8 @@ interface ProviderCardProps { onSwitch: (provider: Provider) => void; onEdit: (provider: Provider) => void; onDelete: (provider: Provider) => void; + /** OpenCode: remove from live config (not delete from database) */ + onRemoveFromConfig?: (provider: Provider) => void; onConfigureUsage: (provider: Provider) => void; onOpenWebsite: (url: string) => void; onDuplicate: (provider: Provider) => void; @@ -90,6 +92,7 @@ export function ProviderCard({ onSwitch, onEdit, onDelete, + onRemoveFromConfig, onConfigureUsage, onOpenWebsite, onDuplicate, @@ -380,6 +383,11 @@ export function ProviderCard({ onTest={onTest ? () => onTest(provider) : undefined} onConfigureUsage={() => onConfigureUsage(provider)} onDelete={() => onDelete(provider)} + onRemoveFromConfig={ + onRemoveFromConfig + ? () => onRemoveFromConfig(provider) + : undefined + } onOpenTerminal={ onOpenTerminal ? () => onOpenTerminal(provider) : undefined } diff --git a/src/components/providers/ProviderList.tsx b/src/components/providers/ProviderList.tsx index 4baed18e9..9d3ad75df 100644 --- a/src/components/providers/ProviderList.tsx +++ b/src/components/providers/ProviderList.tsx @@ -40,6 +40,8 @@ interface ProviderListProps { onSwitch: (provider: Provider) => void; onEdit: (provider: Provider) => void; onDelete: (provider: Provider) => void; + /** OpenCode: remove from live config (not delete from database) */ + onRemoveFromConfig?: (provider: Provider) => void; onDuplicate: (provider: Provider) => void; onConfigureUsage?: (provider: Provider) => void; onOpenWebsite: (url: string) => void; @@ -58,6 +60,7 @@ export function ProviderList({ onSwitch, onEdit, onDelete, + onRemoveFromConfig, onDuplicate, onConfigureUsage, onOpenWebsite, @@ -221,6 +224,7 @@ export function ProviderList({ onSwitch={onSwitch} onEdit={onEdit} onDelete={onDelete} + onRemoveFromConfig={onRemoveFromConfig} onDuplicate={onDuplicate} onConfigureUsage={onConfigureUsage} onOpenWebsite={onOpenWebsite} @@ -331,6 +335,8 @@ interface SortableProviderCardProps { onSwitch: (provider: Provider) => void; onEdit: (provider: Provider) => void; onDelete: (provider: Provider) => void; + /** OpenCode: remove from live config (not delete from database) */ + onRemoveFromConfig?: (provider: Provider) => void; onDuplicate: (provider: Provider) => void; onConfigureUsage?: (provider: Provider) => void; onOpenWebsite: (url: string) => void; @@ -355,6 +361,7 @@ function SortableProviderCard({ onSwitch, onEdit, onDelete, + onRemoveFromConfig, onDuplicate, onConfigureUsage, onOpenWebsite, @@ -393,6 +400,7 @@ function SortableProviderCard({ onSwitch={onSwitch} onEdit={onEdit} onDelete={onDelete} + onRemoveFromConfig={onRemoveFromConfig} onDuplicate={onDuplicate} onConfigureUsage={ onConfigureUsage ? (item) => onConfigureUsage(item) : () => undefined diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index e156bd41c..99948b46e 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -157,7 +157,9 @@ }, "confirm": { "deleteProvider": "Delete Provider", - "deleteProviderMessage": "Are you sure you want to delete provider \"{{name}}\"? This action cannot be undone." + "deleteProviderMessage": "Are you sure you want to delete provider \"{{name}}\"? This action cannot be undone.", + "removeProvider": "Remove Provider", + "removeProviderMessage": "Are you sure you want to remove provider \"{{name}}\" from the configuration?\n\nAfter removal, this provider will no longer be active, but the configuration data will be retained in CC Switch. You can re-add it at any time." }, "settings": { "title": "Settings", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 1fe1811be..de3aaf027 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -157,7 +157,9 @@ }, "confirm": { "deleteProvider": "プロバイダーを削除", - "deleteProviderMessage": "プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。" + "deleteProviderMessage": "プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。", + "removeProvider": "プロバイダーを解除", + "removeProviderMessage": "プロバイダー「{{name}}」を設定から解除してもよろしいですか?\n\n解除後、このプロバイダーは無効になりますが、設定データは CC Switch に保持されます。いつでも再追加できます。" }, "settings": { "title": "設定", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 95dd17b49..295dc9d7e 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -157,7 +157,9 @@ }, "confirm": { "deleteProvider": "删除供应商", - "deleteProviderMessage": "确定要删除供应商 \"{{name}}\" 吗?此操作无法撤销。" + "deleteProviderMessage": "确定要删除供应商 \"{{name}}\" 吗?此操作无法撤销。", + "removeProvider": "移除供应商", + "removeProviderMessage": "确定要从配置中移除供应商 \"{{name}}\" 吗?\n\n移除后该供应商将不再生效,但配置数据会保留在 CC Switch 中,您可以随时重新添加。" }, "settings": { "title": "设置",