From c6d5faff73ff3485f65ceb85353526b4d03bceb7 Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Mon, 9 Jun 2025 15:22:25 +0800 Subject: [PATCH] feat: update TypeScript configuration and enhance discover page layout - Added support for the @modelcontextprotocol/sdk in tsconfig.node.json. - Updated import paths in provider.ts to include .js extensions. - Enhanced AgentsPage layout by integrating Navbar and Input components. - Refactored DiscoverPage to remove DialogManagerProvider and related components, simplifying the structure. - Removed unused dialog components and hooks to streamline the discover functionality. - Minor adjustments to AssistantSettings and Vercel tabs for improved code clarity. --- src/main/services/mcp/oauth/provider.ts | 8 +- src/renderer/src/pages/agents/AgentsPage.tsx | 8 +- .../dialog/DialogManagerContext.tsx | 38 ----- .../components/dialog/InstallDialog.tsx | 157 ------------------ .../discover/components/dialog/index.tsx | 36 ---- .../discover/hooks/useFilteredStoreItems.ts | 55 ------ src/renderer/src/pages/discover/index.tsx | 7 +- .../settings/AssistantSettings/index.tsx | 2 +- src/renderer/src/ui/vercel-tabs.tsx | 4 +- tsconfig.node.json | 3 +- 10 files changed, 19 insertions(+), 299 deletions(-) delete mode 100644 src/renderer/src/pages/discover/components/dialog/DialogManagerContext.tsx delete mode 100644 src/renderer/src/pages/discover/components/dialog/InstallDialog.tsx delete mode 100644 src/renderer/src/pages/discover/components/dialog/index.tsx delete mode 100644 src/renderer/src/pages/discover/hooks/useFilteredStoreItems.ts diff --git a/src/main/services/mcp/oauth/provider.ts b/src/main/services/mcp/oauth/provider.ts index a2a47fc15e..bc37c952e9 100644 --- a/src/main/services/mcp/oauth/provider.ts +++ b/src/main/services/mcp/oauth/provider.ts @@ -1,8 +1,12 @@ import path from 'node:path' import { getConfigDir } from '@main/utils/file' -import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth' -import { OAuthClientInformation, OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth' +import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js' +import { + OAuthClientInformation, + OAuthClientInformationFull, + OAuthTokens +} from '@modelcontextprotocol/sdk/shared/auth.js' import Logger from 'electron-log' import open from 'open' diff --git a/src/renderer/src/pages/agents/AgentsPage.tsx b/src/renderer/src/pages/agents/AgentsPage.tsx index b9cad54ec4..b9873c310b 100644 --- a/src/renderer/src/pages/agents/AgentsPage.tsx +++ b/src/renderer/src/pages/agents/AgentsPage.tsx @@ -1,4 +1,5 @@ import { ImportOutlined, PlusOutlined } from '@ant-design/icons' +import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import CustomTag from '@renderer/components/CustomTag' import ListItem from '@renderer/components/ListItem' import Scrollbar from '@renderer/components/Scrollbar' @@ -6,8 +7,9 @@ import { useAgents } from '@renderer/hooks/useAgents' import { createAssistantFromAgent } from '@renderer/services/AssistantService' import { Agent } from '@renderer/types' import { uuid } from '@renderer/utils' -import { Button, Empty, Flex } from 'antd' +import { Button, Empty, Flex, Input } from 'antd' import { omit } from 'lodash' +import { Search } from 'lucide-react' import { FC, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' @@ -150,7 +152,7 @@ const AgentsPage: FC = () => { return ( - {/* + {t('agents.title')} { />
- */} +
diff --git a/src/renderer/src/pages/discover/components/dialog/DialogManagerContext.tsx b/src/renderer/src/pages/discover/components/dialog/DialogManagerContext.tsx deleted file mode 100644 index dd2d62aca7..0000000000 --- a/src/renderer/src/pages/discover/components/dialog/DialogManagerContext.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { CherryStoreItem } from '@renderer/types/cherryStore' -import { createContext, ReactNode, use, useState } from 'react' - -interface ActiveDialog { - type: string - item: CherryStoreItem -} - -interface DialogManagerContextType { - activeDialog: ActiveDialog | null - openDialog: (type: string, item: CherryStoreItem) => void - closeDialog: () => void -} - -const DialogManagerContext = createContext(undefined) - -export const DialogManagerProvider = ({ children }: { children: ReactNode }) => { - const [activeDialog, setActiveDialog] = useState(null) - - const openDialog = (type: string, item: CherryStoreItem) => { - setActiveDialog({ type, item }) - } - - const closeDialog = () => { - setActiveDialog(null) - } - - return {children} -} - -export const useDialogManager = (): DialogManagerContextType => { - const context = use(DialogManagerContext) - if (!context) { - // More robust check - throw new Error('useDialogManager must be used within a DialogManagerProvider') - } - return context -} diff --git a/src/renderer/src/pages/discover/components/dialog/InstallDialog.tsx b/src/renderer/src/pages/discover/components/dialog/InstallDialog.tsx deleted file mode 100644 index 1edbce8bae..0000000000 --- a/src/renderer/src/pages/discover/components/dialog/InstallDialog.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import { createAssistantFromAgent } from '@renderer/services/AssistantService' -import { Agent } from '@renderer/types' -import { CherryStoreItem, CherryStoreType } from '@renderer/types/cherryStore' -import { Badge } from '@renderer/ui/badge' -import { Button } from '@renderer/ui/button' -import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@renderer/ui/dialog' -import { Download } from 'lucide-react' -import ReactMarkdown from 'react-markdown' -import { v4 as uuid } from 'uuid' - -export default function InstallDialog({ - item, - isOpen, - onClose -}: { - item: CherryStoreItem | null - isOpen: boolean - onClose: () => void -}) { - if (!item) return null - - const handleInstall = () => { - switch (item.type) { - case CherryStoreType.ASSISTANT: { - const getAgentFromSystemAgent = (agent) => { - return { - prompt: agent.prompt, - description: agent.description, - emoji: agent.icon, - name: agent.title, - id: uuid(), - topics: [], - type: 'agent' - } - } - - createAssistantFromAgent(getAgentFromSystemAgent(item) as unknown as Agent) - break - } - - default: - break - } - onClose() - } - - return ( - !open && onClose()}> - - -
- - {item.title} - - {item.type} - - {item.icon && {item.icon}} - - {item.description} -
-
- -
-
-
- {item.prompt} -
- - {/* {item.requirements && ( -
-

功能要求

-
    - {item.requirements.map((req: string, index: number) => ( -
  • - - {req} -
  • - ))} -
-
- )} */} -
- -
-
- {item.image && ( -
- {item.title} -
- )} -
- -
- {/*
- 评分 -
- - {item.rating} - ({item.downloads}) -
-
*/} - -
- 版本 - {/* {item.version} */} -
- -
- 更新日期 - {/* {item.lastUpdated} */} -
- -
- 开发者 - {item.author} -
- - {/* {item.type !== CherryStoreType.ASSISTANT && ( */} -
- -
- {/* )} */} -
- -
-

标签

-
- {item.tags.map((tag: string) => ( - - {tag} - - ))} -
-

分类

- - {item.type} - -
-
-
- - {/* - - - */} -
-
- ) -} diff --git a/src/renderer/src/pages/discover/components/dialog/index.tsx b/src/renderer/src/pages/discover/components/dialog/index.tsx deleted file mode 100644 index 89d944ac99..0000000000 --- a/src/renderer/src/pages/discover/components/dialog/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useDialogManager } from './DialogManagerContext' -import InstallDialog from './InstallDialog' -// Import other dialog components here as they are created -// e.g., import ItemDetailsDialog from './ItemDetailsDialog'; - -export default function DialogManager() { - // Renamed component for clarity - const { activeDialog, closeDialog } = useDialogManager() - - if (!activeDialog) { - return null // No dialog is active - } - - switch (activeDialog.type) { - case 'install': - return ( - - ) - // case 'viewDetails': - // return ( - // - // ); - // Add more cases for other dialog types here - default: - console.warn('Unknown dialog type:', activeDialog.type) - return null - } -} diff --git a/src/renderer/src/pages/discover/hooks/useFilteredStoreItems.ts b/src/renderer/src/pages/discover/hooks/useFilteredStoreItems.ts deleted file mode 100644 index 4c08528699..0000000000 --- a/src/renderer/src/pages/discover/hooks/useFilteredStoreItems.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { CherryStoreItem } from '@renderer/types/cherryStore' -import { useMemo } from 'react' - -// 假设 Item 类型定义,您可以从 store_list.json 的结构推断或在项目中共享 -// 如果没有明确的类型定义,可以使用 any,但强烈建议定义类型 - -export function useFilteredStoreItems( - storeList: CherryStoreItem[], - searchQuery: string, - selectedCategory: string, - selectedSubcategory: string -) { - return useMemo(() => { - if (!storeList) { - return [] - } - return storeList.filter((item) => { - const lowerSearchQuery = searchQuery.toLowerCase() - const matchesSearch = - searchQuery === '' || - item.title.toLowerCase().includes(lowerSearchQuery) || - item.description.toLowerCase().includes(lowerSearchQuery) || - item.author.toLowerCase().includes(lowerSearchQuery) || - item.tags.some((tag) => tag.toLowerCase().includes(lowerSearchQuery)) - - let matchesCategory = false - if (selectedCategory === 'all') { - matchesCategory = true - } else if (['featured', 'new', 'top'].includes(selectedCategory)) { - // 当前的筛选逻辑中 'featured', 'new', 'top' 是特殊处理的 - // 'new' 和 'top' 还没有具体的实现逻辑,这里保持和原组件一致 - if (selectedCategory === 'featured') { - matchesCategory = item.featured === true - } else { - // 如果 selectedCategory 是 'new' 或 'top' 但不是 'featured' - // 并且 item 没有 .featured = true, 那么 matchesCategory 仍然是 false - // 这可能需要根据实际需求调整,例如: - // if (selectedCategory === 'new') matchesCategory = item.isNew === true; (假设有 isNew 字段) - // if (selectedCategory === 'top') matchesCategory = item.isTop === true; (假设有 isTop 字段) - // 为了保持和原逻辑一致,这里暂时不修改这部分行为,但提示您可能需要完善 - matchesCategory = item.featured === true && ['featured'].includes(selectedCategory) // 或者更复杂的逻辑 - } - } else { - matchesCategory = item.categoryId === selectedCategory - } - - const matchesSubcategory = - ['all', 'featured', 'new', 'top'].includes(selectedCategory) || // If a special category is selected, subcategory filter might be bypassed or handled differently - selectedSubcategory === 'all' || - item.subcategoryId === selectedSubcategory - - return matchesSearch && matchesCategory && matchesSubcategory - }) - }, [storeList, searchQuery, selectedCategory, selectedSubcategory]) -} diff --git a/src/renderer/src/pages/discover/index.tsx b/src/renderer/src/pages/discover/index.tsx index 9ea4eb907c..f197a42b2d 100644 --- a/src/renderer/src/pages/discover/index.tsx +++ b/src/renderer/src/pages/discover/index.tsx @@ -6,8 +6,6 @@ import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' // Import Context and the main Dialog Manager component -import { DialogManagerProvider } from './components/dialog/DialogManagerContext' -import Dialogs from './components/dialog/index' import DiscoverContent from './components/DiscoverContent' // Removed DiscoverContent import import DiscoverSidebar from './components/DiscoverSidebar' import { InternalCategory, useDiscoverCategories } from './hooks/useDiscoverCategories' @@ -45,7 +43,7 @@ export default function DiscoverPage() { const vercelTabsData = adaptCategoriesForVercelTabs(categories) return ( - +
{t('discover.title')} @@ -79,8 +77,7 @@ export default function DiscoverPage() { />
- - + ) } diff --git a/src/renderer/src/pages/settings/AssistantSettings/index.tsx b/src/renderer/src/pages/settings/AssistantSettings/index.tsx index 350c7d571c..d7a979cf88 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/index.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/index.tsx @@ -80,7 +80,7 @@ const AssistantSettingPopupContainer: React.FC = ({ resolve, tab, ...prop (
(tabRefs.current[index] = el)} + ref={(el) => { + tabRefs.current[index] = el + }} className={cn( 'h-[30px] cursor-pointer px-3 py-2 transition-colors duration-300', index === activeIndex ? 'text-[#0e0e10] dark:text-white' : 'text-[#0e0f1199] dark:text-[#ffffff99]' diff --git a/tsconfig.node.json b/tsconfig.node.json index 885f343a91..a2d94d74f9 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -19,7 +19,8 @@ "@main/*": ["src/main/*"], "@types": ["src/renderer/src/types/index.ts"], "@shared/*": ["packages/shared/*"], - "@renderer/*": ["src/renderer/src/*"] + "@renderer/*": ["src/renderer/src/*"], + "@modelcontextprotocol/sdk/*": ["node_modules/@modelcontextprotocol/sdk/dist/esm/*"] } } }