From dd464db5945b671d4923e9bded6df577f8b1e5dc Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 21 Jan 2025 16:58:42 +0800 Subject: [PATCH] feat: add group message action bar --- .../src/pages/home/Messages/Message.tsx | 8 +- .../pages/home/Messages/MessageContent.tsx | 2 +- .../src/pages/home/Messages/MessageGroup.tsx | 182 +++++++++++++++--- .../pages/home/Messages/MessageMenubar.tsx | 2 +- .../src/pages/home/Messages/Messages.tsx | 89 +++++---- .../src/pages/home/Messages/Prompt.tsx | 1 - src/renderer/src/store/settings.ts | 6 +- 7 files changed, 219 insertions(+), 71 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index 4a3a71bd..81d7348e 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -25,9 +25,10 @@ interface Props { index?: number total?: number hidePresetMessages?: boolean + style?: React.CSSProperties onGetMessages?: () => Message[] onSetMessages?: Dispatch> - onDeleteMessage?: (message: Message) => void + onDeleteMessage?: (message: Message) => Promise } const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolean) => @@ -38,6 +39,7 @@ const MessageItem: FC = ({ topic, index, hidePresetMessages, + style, onDeleteMessage, onSetMessages, onGetMessages @@ -123,7 +125,7 @@ const MessageItem: FC = ({ onResponse: (msg) => { setMessage(msg) if (msg.status !== 'pending') { - const _messages = messages.map((m) => (m.id === msg.id ? msg : m)) + const _messages = onGetMessages().map((m) => (m.id === msg.id ? msg : m)) onSetMessages(_messages) db.topics.update(topic.id, { messages: _messages }) } @@ -157,7 +159,7 @@ const MessageItem: FC = ({ 'message-user': !isAssistantMessage })} ref={messageContainerRef} - style={isBubbleStyle ? { alignItems: isAssistantMessage ? 'start' : 'end' } : undefined}> + style={{ ...style, alignItems: isBubbleStyle ? (isAssistantMessage ? 'start' : 'end') : undefined }}> - + {message.mentions?.map((model) => {'@' + model.name})} diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 943b4a8f..3d0cc4f3 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -1,8 +1,14 @@ +import { ColumnHeightOutlined, ColumnWidthOutlined, DeleteOutlined, FolderOutlined } 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 { Message, Topic } from '@renderer/types' -import { Segmented } from 'antd' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' +import { MultiModelMessageStyle } from '@renderer/store/settings' +import { Message, Model, Topic } from '@renderer/types' +import { Button, Segmented } from 'antd' import { Dispatch, FC, SetStateAction, useState } from 'react' -import styled from 'styled-components' +import styled, { css } from 'styled-components' import MessageItem from './Message' @@ -12,7 +18,8 @@ interface Props { hidePresetMessages?: boolean onGetMessages?: () => Message[] onSetMessages?: Dispatch> - onDeleteMessage?: (message: Message) => void + onDeleteMessage?: (message: Message) => Promise + onDeleteGroupMessages?: (askId: string) => Promise } const MessageGroup: FC = ({ @@ -21,33 +28,39 @@ const MessageGroup: FC = ({ hidePresetMessages, onDeleteMessage, onSetMessages, - onGetMessages + onGetMessages, + onDeleteGroupMessages }) => { - const { multiModelMessageStyle } = useSettings() + const { multiModelMessageStyle: multiModelMessageStyleSetting } = useSettings() + + const [multiModelMessageStyle, setMultiModelMessageStyle] = + useState(multiModelMessageStyleSetting) + const messageLength = messages.length const [selectedIndex, setSelectedIndex] = useState(0) + const isGrouped = messageLength > 1 + + const onDelete = async () => { + const askId = messages[0].askId + askId && onDeleteGroupMessages?.(askId) + } + return ( - - {messageLength > 1 && multiModelMessageStyle === 'fold' && ( - setSelectedIndex(Number(value))} - options={messages.map((message, index) => ({ - label: `@${message.modelId}`, - value: index.toString() - }))} - size="small" - /> - )} + {messages.map((message, index) => ( - + = ({ ))} + {isGrouped && ( + + + + {['fold', 'horizontal', 'vertical'].map((layout) => ( + setMultiModelMessageStyle(layout as MultiModelMessageStyle)}> + {layout === 'fold' ? ( + + ) : layout === 'horizontal' ? ( + + ) : ( + + )} + + ))} + + {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" + /> + + )} + +