diff --git a/src/renderer/src/components/ModelList/ManageModelsList.tsx b/src/renderer/src/components/ModelList/ManageModelsList.tsx index 1100f6575b..01daf6230f 100644 --- a/src/renderer/src/components/ModelList/ManageModelsList.tsx +++ b/src/renderer/src/components/ModelList/ManageModelsList.tsx @@ -10,7 +10,7 @@ import { Model, Provider } from '@renderer/types' import { Button, Flex, Tooltip } from 'antd' import { Avatar } from 'antd' import { ChevronRight } from 'lucide-react' -import React, { memo, useCallback, useMemo, useState } from 'react' +import React, { memo, startTransition, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -23,12 +23,12 @@ interface GroupRowData { models: Model[] } -interface ModelRowData { - type: 'model' - model: Model +interface ModelsRowData { + type: 'models' + models: Model[] } -type RowData = GroupRowData | ModelRowData +type RowData = GroupRowData | ModelsRowData interface ManageModelsListProps { modelGroups: Record @@ -42,14 +42,16 @@ const ManageModelsList: React.FC = ({ modelGroups, provid const [collapsedGroups, setCollapsedGroups] = useState(new Set()) const handleGroupToggle = useCallback((groupName: string) => { - setCollapsedGroups((prev) => { - const newSet = new Set(prev) - if (newSet.has(groupName)) { - newSet.delete(groupName) // 如果已折叠,则展开 - } else { - newSet.add(groupName) // 如果已展开,则折叠 - } - return newSet + startTransition(() => { + setCollapsedGroups((prev) => { + const newSet = new Set(prev) + if (newSet.has(groupName)) { + newSet.delete(groupName) // 如果已折叠,则展开 + } else { + newSet.add(groupName) // 如果已展开,则折叠 + } + return newSet + }) }) }, []) @@ -62,9 +64,7 @@ const ManageModelsList: React.FC = ({ modelGroups, provid // 只添加非空组 rows.push({ type: 'group', groupName, models }) if (!collapsedGroups.has(groupName)) { - models.forEach((model) => { - rows.push({ type: 'model', model }) - }) + rows.push({ type: 'models', models }) } } }) @@ -132,37 +132,44 @@ const ManageModelsList: React.FC = ({ modelGroups, provid overscan={5} scrollerStyle={{ paddingRight: '10px' - }} - itemContainerStyle={{ - paddingBottom: '8px' }}> {(row) => { if (row.type === 'group') { const isCollapsed = collapsedGroups.has(row.groupName) return ( - handleGroupToggle(row.groupName)}> - - + handleGroupToggle(row.groupName)}> + + + {row.groupName} + + {row.models.length} + + + {renderGroupTools(row.models)} + + + ) + } else { + return ( + + {row.models.map((model) => ( + - {row.groupName} - - {row.models.length} - - - {renderGroupTools(row.models)} - + ))} + ) } - - return ( - - ) }} ) @@ -180,35 +187,65 @@ const ModelListItem: React.FC = memo(({ model, provider, onA const isAdded = useMemo(() => isModelInProvider(provider, model.id), [provider, model.id]) return ( - {model?.name?.[0]?.toUpperCase()}, - name: , - extra: model.description && , - ext: '.model', - actions: isAdded ? ( -