From f1328d89fc5fef44fb5a4a7c258c5ce46a16b208 Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 24 Jun 2026 23:47:04 +0800 Subject: [PATCH] feat(skills): flag unmanaged skills with a green dot on the Import button - Add an optional `enabled` flag to useScanUnmanagedSkills; the Skills panel scans once on mount (enabled:true), with 30s staleTime + keepPreviousData to dedupe disk IO across navigations. - App subscribes to the shared query (enabled:false) and renders a green dot + tooltip on the top-bar Import button when unmanaged skills are available. --- src/App.tsx | 18 +++++++++++++++++- src/components/skills/UnifiedSkillsPanel.tsx | 3 ++- src/hooks/useSkills.ts | 11 +++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 7a913e7ef..0eaef98ad 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -46,6 +46,7 @@ import { useAutoCompact } from "@/hooks/useAutoCompact"; import { useUsageCacheBridge } from "@/hooks/useUsageCacheBridge"; import { useTauriEvent } from "@/hooks/useTauriEvent"; import { useLastValidValue } from "@/hooks/useLastValidValue"; +import { useScanUnmanagedSkills } from "@/hooks/useSkills"; import { extractErrorMessage } from "@/utils/errorUtils"; import { isTextEditableTarget } from "@/utils/domUtils"; import { deepClone } from "@/utils/deepClone"; @@ -250,6 +251,10 @@ function App() { const mcpPanelRef = useRef(null); const skillsPageRef = useRef(null); const unifiedSkillsPanelRef = useRef(null); + // 订阅未管理 Skill 的共享缓存(实际扫描由 UnifiedSkillsPanel 进入页面时触发)。 + // 这里 enabled 默认 false,仅用于「导入」按钮的绿点提示,不主动发起扫描。 + const { data: unmanagedSkills } = useScanUnmanagedSkills(); + const hasUnmanagedSkills = (unmanagedSkills?.length ?? 0) > 0; const addActionButtonClass = "bg-orange-500 hover:bg-orange-600 dark:bg-orange-500 dark:hover:bg-orange-600 text-white shadow-lg shadow-orange-500/30 dark:shadow-orange-500/40 rounded-full w-8 h-8"; @@ -1315,10 +1320,21 @@ function App() { onClick={() => unifiedSkillsPanelRef.current?.openImport() } - className="hover:bg-black/5 dark:hover:bg-white/5" + className="relative hover:bg-black/5 dark:hover:bg-white/5" + title={ + hasUnmanagedSkills + ? t("skills.unmanagedAvailable") + : undefined + } > {t("skills.import")} + {hasUnmanagedSkills && ( +