fix(ui): 修复 Skills 管理与模型配置交互展示问题 (#4323)

* fix(ui): improve skills and provider interactions

* fix(skills): keep repo manager available on skills.sh

* test(skills): cover repo switch after refresh

* fix(skills): keep refresh available for empty repo results

---------

Co-authored-by: thisTom <19346741+thisTom@users.noreply.github.com>
This commit is contained in:
thisTom
2026-06-23 10:07:14 +08:00
committed by GitHub
parent 2d478876fa
commit 2781d40e82
8 changed files with 366 additions and 56 deletions
+29 -22
View File
@@ -15,7 +15,6 @@ import {
Book,
Brain,
Wrench,
RefreshCw,
History,
BarChart2,
Download,
@@ -71,7 +70,11 @@ import { FailoverToggle } from "@/components/proxy/FailoverToggle";
import UsageScriptModal from "@/components/UsageScriptModal";
import UnifiedMcpPanel from "@/components/mcp/UnifiedMcpPanel";
import PromptPanel from "@/components/prompts/PromptPanel";
import { SkillsPage } from "@/components/skills/SkillsPage";
import {
SkillsPage,
getSkillsPageHeaderActions,
type SkillsPageSource,
} from "@/components/skills/SkillsPage";
import UnifiedSkillsPanel from "@/components/skills/UnifiedSkillsPanel";
import { DeepLinkImportDialog } from "@/components/DeepLinkImportDialog";
import { FirstRunNoticeDialog } from "@/components/FirstRunNoticeDialog";
@@ -169,6 +172,8 @@ function App() {
const sharedFeatureApp: AppId =
activeApp === "claude-desktop" ? "claude" : activeApp;
const [currentView, setCurrentView] = useState<View>(getInitialView);
const [skillsDiscoverySource, setSkillsDiscoverySource] =
useState<SkillsPageSource>("repos");
const [settingsDefaultTab, setSettingsDefaultTab] = useState("general");
const [isAddOpen, setIsAddOpen] = useState(false);
const [isWindowMaximized, setIsWindowMaximized] = useState(false);
@@ -857,6 +862,11 @@ function App() {
}
};
const handleOpenSkillsDiscovery = () => {
setSkillsDiscoverySource("repos");
setCurrentView("skillsDiscovery");
};
const renderContent = () => {
const content = (() => {
switch (currentView) {
@@ -884,7 +894,7 @@ function App() {
return (
<UnifiedSkillsPanel
ref={unifiedSkillsPanelRef}
onOpenDiscovery={() => setCurrentView("skillsDiscovery")}
onOpenDiscovery={handleOpenSkillsDiscovery}
currentApp={
sharedFeatureApp === "openclaw" ? "claude" : sharedFeatureApp
}
@@ -897,6 +907,7 @@ function App() {
initialApp={
sharedFeatureApp === "openclaw" ? "claude" : sharedFeatureApp
}
onSourceChange={setSkillsDiscoverySource}
/>
);
case "mcp":
@@ -1312,7 +1323,7 @@ function App() {
<Button
variant="ghost"
size="sm"
onClick={() => setCurrentView("skillsDiscovery")}
onClick={handleOpenSkillsDiscovery}
className="hover:bg-black/5 dark:hover:bg-white/5"
>
<Search className="w-4 h-4 mr-2" />
@@ -1322,24 +1333,20 @@ function App() {
)}
{currentView === "skillsDiscovery" && (
<>
<Button
variant="ghost"
size="sm"
onClick={() => skillsPageRef.current?.refresh()}
className="hover:bg-black/5 dark:hover:bg-white/5"
>
<RefreshCw className="w-4 h-4 mr-2" />
{t("skills.refresh")}
</Button>
<Button
variant="ghost"
size="sm"
onClick={() => skillsPageRef.current?.openRepoManager()}
className="hover:bg-black/5 dark:hover:bg-white/5"
>
<Settings className="w-4 h-4 mr-2" />
{t("skills.repoManager")}
</Button>
{getSkillsPageHeaderActions(skillsDiscoverySource).map(
({ key, labelKey, Icon, execute }) => (
<Button
key={key}
variant="ghost"
size="sm"
onClick={() => execute(skillsPageRef.current)}
className="hover:bg-black/5 dark:hover:bg-white/5"
>
<Icon className="w-4 h-4 mr-2" />
{t(labelKey)}
</Button>
),
)}
</>
)}
{currentView === "providers" && (