From f5acddbfebff248093c9cc29d5226e6c40b62c79 Mon Sep 17 00:00:00 2001 From: icarus Date: Sat, 20 Sep 2025 00:48:17 +0800 Subject: [PATCH] refactor(agent): extract shared components and improve model handling - Extract common option components to shared.tsx for reuse - Make useModels filter parameter optional - Update SessionModal to use real model data from API --- .../components/Popups/agent/AgentModal.tsx | 53 +---------------- .../components/Popups/agent/SessionModal.tsx | 58 ++++++------------- .../src/components/Popups/agent/shared.tsx | 42 ++++++++++++++ src/renderer/src/hooks/agents/useModels.ts | 2 +- 4 files changed, 62 insertions(+), 93 deletions(-) create mode 100644 src/renderer/src/components/Popups/agent/shared.tsx diff --git a/src/renderer/src/components/Popups/agent/AgentModal.tsx b/src/renderer/src/components/Popups/agent/AgentModal.tsx index 08481b4be1..31e486079c 100644 --- a/src/renderer/src/components/Popups/agent/AgentModal.tsx +++ b/src/renderer/src/components/Popups/agent/AgentModal.tsx @@ -1,5 +1,4 @@ import { - Avatar, Button, cn, Form, @@ -11,7 +10,6 @@ import { ModalHeader, Select, SelectedItemProps, - SelectedItems, SelectItem, Textarea, useDisclosure @@ -21,41 +19,21 @@ import ClaudeIcon from '@renderer/assets/images/models/claude.png' import { getModelLogo } from '@renderer/config/models' import { useAgents } from '@renderer/hooks/agents/useAgents' import { useModels } from '@renderer/hooks/agents/useModels' -import { getProviderLabel } from '@renderer/i18n/label' import { AddAgentForm, AgentEntity, AgentType, BaseAgentForm, isAgentType, UpdateAgentForm } from '@renderer/types' import { ChangeEvent, FormEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { ErrorBoundary } from '../../ErrorBoundary' +import { BaseOption, ModelOption, Option, renderOption } from './shared' const logger = loggerService.withContext('AddAgentPopup') -interface BaseOption { - type: 'type' | 'model' - key: string - label: string - // img src - avatar: string -} - interface AgentTypeOption extends BaseOption { type: 'type' key: AgentEntity['type'] name: AgentEntity['name'] } -// function isAgentTypeOption(option: BaseOption): option is AgentTypeOption { -// return option.type === 'type' -// } - -interface ModelOption extends BaseOption { - providerId?: string -} - -function isModelOption(option: BaseOption): option is ModelOption { - return option.type === 'model' -} - type Option = AgentTypeOption | ModelOption const buildAgentForm = (existing?: AgentEntity): BaseAgentForm => ({ @@ -113,33 +91,6 @@ export const AgentModal: React.FC = ({ agent, trigger, isOpen: _isOpen, o } }, [agent, isOpen]) - const Option = useCallback( - ({ option }: { option?: Option | null }) => { - if (!option) { - return ( -
- - {t('common.invalid_value')} -
- ) - } - return ( -
- - {option.label} {isModelOption(option) && option.providerId && `| ${getProviderLabel(option.providerId)}`} -
- ) - }, - [t] - ) - - const Item = useCallback(({ item }: { item: SelectedItemProps