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 };