diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index e7a73052de..49b225e4c3 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -1,24 +1,14 @@ -import { - ColumnHeightOutlined, - ColumnWidthOutlined, - DeleteOutlined, - FolderOutlined, - NumberOutlined -} from '@ant-design/icons' -import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' -import { HStack } from '@renderer/components/Layout' import Scrollbar from '@renderer/components/Scrollbar' import { useSettings } from '@renderer/hooks/useSettings' -import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { MultiModelMessageStyle } from '@renderer/store/settings' -import { Message, Model, Topic } from '@renderer/types' -import { Button, Popover, Segmented as AntdSegmented } from 'antd' -import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' +import { Message, Topic } from '@renderer/types' +import { Popover } from 'antd' +import { Dispatch, FC, memo, SetStateAction, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' import MessageItem from './Message' -import MessageGroupSettings from './MessageGroupSettings' +import MessageGroupMenuBar from './MessageGroupMenuBar' interface Props { messages: (Message & { index: number })[] @@ -39,7 +29,7 @@ const MessageGroup: FC = ({ onGetMessages, onDeleteGroupMessages }) => { - const { multiModelMessageStyle: multiModelMessageStyleSetting, gridColumns } = useSettings() + const { multiModelMessageStyle: multiModelMessageStyleSetting, gridColumns, gridPopoverTrigger } = useSettings() const { t } = useTranslation() const [multiModelMessageStyle, setMultiModelMessageStyle] = @@ -48,11 +38,10 @@ const MessageGroup: FC = ({ const messageLength = messages.length const [selectedIndex, setSelectedIndex] = useState(messageLength - 1) - const { gridPopoverTrigger } = useSettings() - const isGrouped = messageLength > 1 + const isHorizontal = multiModelMessageStyle === 'horizontal' - const onDelete = async () => { + const onDelete = useCallback(async () => { window.modal.confirm({ title: t('message.group.delete.title'), content: t('message.group.delete.content'), @@ -66,26 +55,50 @@ const MessageGroup: FC = ({ askId && onDeleteGroupMessages?.(askId) } }) - } + }, [messages, onDeleteGroupMessages, t]) useEffect(() => { setSelectedIndex(messageLength - 1) }, [messageLength]) - const isHorizontal = multiModelMessageStyle === 'horizontal' - return ( - {messages.map((message, index) => - multiModelMessageStyle === 'grid' && message.role === 'assistant' && isGrouped ? ( - { + const isGridGroupMessage = multiModelMessageStyle === 'grid' && message.role === 'assistant' && isGrouped + if (isGridGroupMessage) { + return ( + + + + } + trigger={gridPopoverTrigger} + styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto', zIndex: 1000 } }} + getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement} + key={message.id}> = ({ topic={topic} index={message.index} hidePresetMessages={hidePresetMessages} - style={{ - paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15 - }} + style={ + gridPopoverTrigger === 'hover' && isGrouped + ? { + paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15, + overflow: isGrouped ? 'hidden' : 'auto', + maxHeight: isGrouped ? '280px' : 'unset' + } + : undefined + } onSetMessages={onSetMessages} onDeleteMessage={onDeleteMessage} onGetMessages={onGetMessages} /> - } - trigger={gridPopoverTrigger} - styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto', zIndex: 1000 } }} - getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement} - key={message.id}> - - - - - ) : ( + + ) + } + return ( = ({ /> ) - )} + })} {isGrouped && ( - - - - {['fold', 'vertical', 'horizontal', 'grid'].map((layout) => ( - setMultiModelMessageStyle(layout as MultiModelMessageStyle)}> - {layout === 'fold' ? ( - - ) : layout === 'horizontal' ? ( - - ) : layout === 'vertical' ? ( - - ) : ( - - )} - - ))} - - {multiModelMessageStyle === 'fold' && ( - - { - setSelectedIndex(Number(value)) - EventEmitter.emit(EVENT_NAMES.LOCATE_MESSAGE + ':' + messages[Number(value)].id, false) - }} - options={messages.map((message, index) => ({ - label: ( - - - {message.model?.name} - - ), - value: index.toString() - }))} - size="small" - /> - - )} - {multiModelMessageStyle === 'grid' && } - -