diff --git a/src/renderer/src/pages/home/Messages/Blocks/index.tsx b/src/renderer/src/pages/home/Messages/Blocks/index.tsx index c0d3bf716f..f13c9b1175 100644 --- a/src/renderer/src/pages/home/Messages/Blocks/index.tsx +++ b/src/renderer/src/pages/home/Messages/Blocks/index.tsx @@ -14,6 +14,7 @@ import type { import { MessageBlockStatus, MessageBlockType } from '@renderer/types/newMessage' import React from 'react' import { useSelector } from 'react-redux' +import styled from 'styled-components' import CitationBlock from './CitationBlock' import ErrorBlock from './ErrorBlock' @@ -31,14 +32,42 @@ interface Props { message: Message } +const filterImageBlockGroups = (blocks: MessageBlock[]): (MessageBlock[] | MessageBlock)[] => { + return blocks.reduce((acc: (MessageBlock[] | MessageBlock)[], currentBlock) => { + if (currentBlock.type === MessageBlockType.IMAGE) { + const prevGroup = acc[acc.length - 1] + if (Array.isArray(prevGroup) && prevGroup[0].type === MessageBlockType.IMAGE) { + prevGroup.push(currentBlock) + } else { + acc.push([currentBlock]) + } + } else { + acc.push(currentBlock) + } + return acc + }, []) +} + const MessageBlockRenderer: React.FC = ({ blocks, message }) => { // 始终调用useSelector,避免条件调用Hook const blockEntities = useSelector((state: RootState) => messageBlocksSelectors.selectEntities(state)) // 根据blocks类型处理渲染数据 const renderedBlocks = blocks.map((blockId) => blockEntities[blockId]).filter(Boolean) + const groupedBlocks = filterImageBlockGroups(renderedBlocks) + return ( <> - {renderedBlocks.map((block) => { + {groupedBlocks.map((block) => { + if (Array.isArray(block)) { + return ( + imageBlock.id).join('-')}> + {block.map((imageBlock) => ( + + ))} + + ) + } + switch (block.type) { case MessageBlockType.UNKNOWN: if (block.status === MessageBlockStatus.PROCESSING) { @@ -90,3 +119,18 @@ const MessageBlockRenderer: React.FC = ({ blocks, message }) => { } export default React.memo(MessageBlockRenderer) + +const ImageBlockGroup = styled.div` + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + gap: 8px; + width: 100%; + margin: 8px 0; + > * { + flex: 0 0 auto; + min-width: 200px; + max-width: calc(33.33% - 8px); + } +` diff --git a/src/renderer/src/pages/home/Messages/MessageImage.tsx b/src/renderer/src/pages/home/Messages/MessageImage.tsx index cdeff1b443..a8cea1d40b 100644 --- a/src/renderer/src/pages/home/Messages/MessageImage.tsx +++ b/src/renderer/src/pages/home/Messages/MessageImage.tsx @@ -99,7 +99,6 @@ const MessageImage: FC = ({ block }) => {