import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Loader2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { cn } from "@/lib/utils"; import { skillsApi, type MigrationResult } from "@/lib/api/skills"; import type { SkillStorageLocation } from "@/types"; export interface SkillStorageLocationSettingsProps { value: SkillStorageLocation; installedCount: number; onMigrated: (target: SkillStorageLocation) => void; } export function SkillStorageLocationSettings({ value, installedCount, onMigrated, }: SkillStorageLocationSettingsProps) { const { t } = useTranslation(); const [pendingTarget, setPendingTarget] = useState(null); const [isMigrating, setIsMigrating] = useState(false); const handleSelect = (target: SkillStorageLocation) => { if (target === value) return; if (installedCount > 0) { setPendingTarget(target); } else { doMigrate(target); } }; const doMigrate = async (target: SkillStorageLocation) => { setIsMigrating(true); setPendingTarget(null); try { const result: MigrationResult = await skillsApi.migrateStorage(target); if (result.errors.length > 0) { toast.warning( t("settings.skillStorage.migrationPartial", { migrated: result.migratedCount, errors: result.errors.length, }), ); } else { toast.success( t("settings.skillStorage.migrationSuccess", { count: result.migratedCount, }), ); } onMigrated(target); } catch (error) { toast.error(String(error)); } finally { setIsMigrating(false); } }; return (

{t("settings.skillStorage.title")}

{t("settings.skillStorage.description")}

handleSelect("cc_switch")} > {t("settings.skillStorage.ccSwitch")} handleSelect("unified")} > {isMigrating && value !== "unified" ? ( ) : null} {t("settings.skillStorage.unified")}

{value === "unified" ? t("settings.skillStorage.unifiedHint") : t("settings.skillStorage.ccSwitchHint")}

{/* 迁移确认对话框 */} { if (!open) setPendingTarget(null); }} > {t("settings.skillStorage.confirmTitle")} {t("settings.skillStorage.confirmMessage", { count: installedCount, })}
); } interface StorageButtonProps { active: boolean; disabled?: boolean; onClick: () => void; children: React.ReactNode; } function StorageButton({ active, disabled, onClick, children, }: StorageButtonProps) { return ( ); }