From 227a5679ad2568a91758481ecf54fcb9e4dd9146 Mon Sep 17 00:00:00 2001 From: LTbinglingfeng Date: Sat, 13 Jun 2026 04:31:20 +0800 Subject: [PATCH] refactor(plugin): add support for plugin feature detection and routing --- src/components/layout/MainLayout.tsx | 89 +++++++++++++++------------- src/router/MainRoutes.tsx | 22 +++++-- src/services/api/client.ts | 22 +++++++ src/stores/useAuthStore.ts | 21 ++++++- src/types/auth.ts | 1 + src/utils/constants.ts | 1 + 6 files changed, 106 insertions(+), 50 deletions(-) diff --git a/src/components/layout/MainLayout.tsx b/src/components/layout/MainLayout.tsx index a3e114c..bb002d8 100644 --- a/src/components/layout/MainLayout.tsx +++ b/src/components/layout/MainLayout.tsx @@ -300,6 +300,7 @@ export function MainLayout() { const logout = useAuthStore((state) => state.logout); const connectionStatus = useAuthStore((state) => state.connectionStatus); const apiBase = useAuthStore((state) => state.apiBase); + const supportsPlugin = useAuthStore((state) => state.supportsPlugin); const fetchConfig = useConfigStore((state) => state.fetchConfig); const clearCache = useConfigStore((state) => state.clearCache); @@ -430,7 +431,7 @@ export function MainLayout() { }, [fetchConfig]); const loadPluginResources = useCallback(async () => { - if (connectionStatus !== 'connected') { + if (connectionStatus !== 'connected' || !supportsPlugin) { setPluginResources([]); return; } @@ -441,7 +442,7 @@ export function MainLayout() { } catch { setPluginResources([]); } - }, [connectionStatus]); + }, [connectionStatus, supportsPlugin]); useEffect(() => { const timer = window.setTimeout(() => { @@ -468,39 +469,39 @@ export function MainLayout() { return groups; }, []); - const pluginPageNavItems: SidebarNavItem[] = pluginResourceGroups.flatMap( - (group): SidebarNavItem[] => { - if (group.entries.length === 1) { - const resource = group.entries[0]; - const pluginLogo = resolvePluginAssetURL(resource.pluginLogo, apiBase); + const pluginPageNavItems: SidebarNavItem[] = supportsPlugin + ? pluginResourceGroups.flatMap((group): SidebarNavItem[] => { + if (group.entries.length === 1) { + const resource = group.entries[0]; + const pluginLogo = resolvePluginAssetURL(resource.pluginLogo, apiBase); + return [ + { + path: resource.route, + label: resource.label, + meta: resource.description, + icon: , + }, + ]; + } + + const pluginLogo = resolvePluginAssetURL(group.entries[0]?.pluginLogo ?? '', apiBase); return [ { - path: resource.route, - label: resource.label, - meta: resource.description, + kind: 'drawer', + id: `plugin-pages-${group.pluginID}`, + label: group.pluginTitle, + meta: t('plugin_resource.page_count', { count: group.entries.length }), icon: , + children: group.entries.map((resource) => ({ + path: resource.route, + label: resource.label, + meta: resource.description, + icon: