mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-25 13:45:03 +08:00
e65360e68a
* refactor(ui): add tooltips and icons to MCP and Skills panels * refactor: deduplicate UnifiedSkillsPanel and UnifiedMcpPanel shared code
173 lines
4.1 KiB
TypeScript
173 lines
4.1 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import {
|
|
skillsApi,
|
|
type DiscoverableSkill,
|
|
type InstalledSkill,
|
|
} from "@/lib/api/skills";
|
|
import type { AppId } from "@/lib/api/types";
|
|
|
|
/**
|
|
* 查询所有已安装的 Skills
|
|
*/
|
|
export function useInstalledSkills() {
|
|
return useQuery({
|
|
queryKey: ["skills", "installed"],
|
|
queryFn: () => skillsApi.getInstalled(),
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 发现可安装的 Skills(从仓库获取)
|
|
*/
|
|
export function useDiscoverableSkills() {
|
|
return useQuery({
|
|
queryKey: ["skills", "discoverable"],
|
|
queryFn: () => skillsApi.discoverAvailable(),
|
|
staleTime: Infinity, // 无限缓存,直到仓库变化时 invalidate
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 安装 Skill
|
|
*/
|
|
export function useInstallSkill() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({
|
|
skill,
|
|
currentApp,
|
|
}: {
|
|
skill: DiscoverableSkill;
|
|
currentApp: AppId;
|
|
}) => skillsApi.installUnified(skill, currentApp),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "installed"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "discoverable"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 卸载 Skill
|
|
*/
|
|
export function useUninstallSkill() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: string) => skillsApi.uninstallUnified(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "installed"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "discoverable"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 切换 Skill 在特定应用的启用状态
|
|
*/
|
|
export function useToggleSkillApp() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({
|
|
id,
|
|
app,
|
|
enabled,
|
|
}: {
|
|
id: string;
|
|
app: AppId;
|
|
enabled: boolean;
|
|
}) => skillsApi.toggleApp(id, app, enabled),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "installed"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 扫描未管理的 Skills
|
|
*/
|
|
export function useScanUnmanagedSkills() {
|
|
return useQuery({
|
|
queryKey: ["skills", "unmanaged"],
|
|
queryFn: () => skillsApi.scanUnmanaged(),
|
|
enabled: false, // 手动触发
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 从应用目录导入 Skills
|
|
*/
|
|
export function useImportSkillsFromApps() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (directories: string[]) =>
|
|
skillsApi.importFromApps(directories),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "installed"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "unmanaged"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取仓库列表
|
|
*/
|
|
export function useSkillRepos() {
|
|
return useQuery({
|
|
queryKey: ["skills", "repos"],
|
|
queryFn: () => skillsApi.getRepos(),
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 添加仓库
|
|
*/
|
|
export function useAddSkillRepo() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: skillsApi.addRepo,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "repos"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "discoverable"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 删除仓库
|
|
*/
|
|
export function useRemoveSkillRepo() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ owner, name }: { owner: string; name: string }) =>
|
|
skillsApi.removeRepo(owner, name),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "repos"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "discoverable"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 从 ZIP 文件安装 Skills
|
|
*/
|
|
export function useInstallSkillsFromZip() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({
|
|
filePath,
|
|
currentApp,
|
|
}: {
|
|
filePath: string;
|
|
currentApp: AppId;
|
|
}) => skillsApi.installFromZip(filePath, currentApp),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "installed"] });
|
|
queryClient.invalidateQueries({ queryKey: ["skills", "unmanaged"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
// ========== 辅助类型 ==========
|
|
|
|
export type { InstalledSkill, DiscoverableSkill, AppId };
|