refactor(MessageGroup): optimize selected message handling with useMe… (#6124)

* refactor(MessageGroup): optimize selected message handling with useMemo and clean up unused code

* refactor(MainTextBlock): optimize citation handling with useMemo and improve code clarity

* fix:del console
This commit is contained in:
MyPrototypeWhat 2025-05-18 18:08:13 +08:00 committed by GitHub
parent 22ee6f042f
commit fed855a4ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 21 deletions

View File

@ -38,13 +38,14 @@ const MainTextBlock: React.FC<Props> = ({ block, citationBlockId, role, mentions
// Use the passed citationBlockId directly in the selector // Use the passed citationBlockId directly in the selector
const { renderInputMessageAsMarkdown } = useSettings() const { renderInputMessageAsMarkdown } = useSettings()
const formattedCitations = useSelector((state: RootState) => { const rawCitations = useSelector((state: RootState) => selectFormattedCitationsByBlockId(state, citationBlockId))
const citations = selectFormattedCitationsByBlockId(state, citationBlockId)
return citations.map((citation) => ({ const formattedCitations = useMemo(() => {
return rawCitations.map((citation) => ({
...citation, ...citation,
content: citation.content ? cleanMarkdownContent(citation.content) : citation.content content: citation.content ? cleanMarkdownContent(citation.content) : citation.content
})) }))
}) }, [rawCitations])
const processedContent = useMemo(() => { const processedContent = useMemo(() => {
let content = block.content let content = block.content

View File

@ -7,7 +7,7 @@ import type { Topic } from '@renderer/types'
import type { Message } from '@renderer/types/newMessage' import type { Message } from '@renderer/types/newMessage'
import { classNames } from '@renderer/utils' import { classNames } from '@renderer/utils'
import { Popover } from 'antd' import { Popover } from 'antd'
import { memo, useCallback, useEffect, useRef, useState } from 'react' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import styled, { css } from 'styled-components' import styled, { css } from 'styled-components'
import MessageItem from './Message' import MessageItem from './Message'
@ -31,7 +31,8 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
const prevMessageLengthRef = useRef(messageLength) const prevMessageLengthRef = useRef(messageLength)
const [selectedIndex, setSelectedIndex] = useState(messageLength - 1) const [selectedIndex, setSelectedIndex] = useState(messageLength - 1)
const getSelectedMessageId = useCallback(() => { const selectedMessageId = useMemo(() => {
if (messages.length === 1) return messages[0]?.id
const selectedMessage = messages.find((message) => message.foldSelected) const selectedMessage = messages.find((message) => message.foldSelected)
if (selectedMessage) { if (selectedMessage) {
return selectedMessage.id return selectedMessage.id
@ -41,9 +42,10 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
const setSelectedMessage = useCallback( const setSelectedMessage = useCallback(
(message: Message) => { (message: Message) => {
messages.forEach(async (m) => { // 前一个
await editMessage(m.id, { foldSelected: m.id === message.id }) editMessage(selectedMessageId, { foldSelected: false })
}) // 当前选中的消息
editMessage(message.id, { foldSelected: true })
setTimeout(() => { setTimeout(() => {
const messageElement = document.getElementById(`message-${message.id}`) const messageElement = document.getElementById(`message-${message.id}`)
@ -52,7 +54,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
} }
}, 200) }, 200)
}, },
[editMessage, messages] [editMessage, selectedMessageId]
) )
const isGrouped = messageLength > 1 && messages.every((m) => m.role === 'assistant') const isGrouped = messageLength > 1 && messages.every((m) => m.role === 'assistant')
@ -67,8 +69,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
setSelectedMessage(lastMessage) setSelectedMessage(lastMessage)
} }
} else { } else {
const selectedId = getSelectedMessageId() const newIndex = messages.findIndex((msg) => msg.id === selectedMessageId)
const newIndex = messages.findIndex((msg) => msg.id === selectedId)
if (newIndex !== -1) { if (newIndex !== -1) {
setSelectedIndex(newIndex) setSelectedIndex(newIndex)
} }
@ -147,7 +148,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
}, [messages, setSelectedMessage]) }, [messages, setSelectedMessage])
const renderMessage = useCallback( const renderMessage = useCallback(
(message: Message & { index: number }, index: number) => { (message: Message & { index: number }) => {
const isGridGroupMessage = isGrid && message.role === 'assistant' && isGrouped const isGridGroupMessage = isGrid && message.role === 'assistant' && isGrouped
const messageProps = { const messageProps = {
isGrouped, isGrouped,
@ -164,15 +165,15 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
<MessageWrapper <MessageWrapper
id={`message-${message.id}`} id={`message-${message.id}`}
$layout={multiModelMessageStyle} $layout={multiModelMessageStyle}
$selected={index === selectedIndex} // $selected={index === selectedIndex}
$isGrouped={isGrouped} $isGrouped={isGrouped}
key={message.id} key={message.id}
className={classNames({ className={classNames({
'group-message-wrapper': message.role === 'assistant' && isHorizontal && isGrouped, 'group-message-wrapper': message.role === 'assistant' && isHorizontal && isGrouped,
[multiModelMessageStyle]: isGrouped, [multiModelMessageStyle]: isGrouped,
selected: message.id === getSelectedMessageId() selected: message.id === selectedMessageId
})}> })}>
<MessageItem {...messageProps} /> {message.id === selectedMessageId && <MessageItem {...messageProps} />}
</MessageWrapper> </MessageWrapper>
) )
@ -183,7 +184,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
content={ content={
<MessageWrapper <MessageWrapper
$layout={multiModelMessageStyle} $layout={multiModelMessageStyle}
$selected={index === selectedIndex} // $selected={index === selectedIndex}
$isGrouped={isGrouped} $isGrouped={isGrouped}
$isInPopover={true}> $isInPopover={true}>
<MessageItem {...messageProps} /> <MessageItem {...messageProps} />
@ -204,11 +205,10 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
isGrouped, isGrouped,
isHorizontal, isHorizontal,
multiModelMessageStyle, multiModelMessageStyle,
selectedIndex,
topic, topic,
hidePresetMessages, hidePresetMessages,
gridPopoverTrigger, gridPopoverTrigger,
getSelectedMessageId selectedMessageId
] ]
) )
@ -235,7 +235,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages }: Props) => {
}) })
}} }}
messages={messages} messages={messages}
selectMessageId={getSelectedMessageId()} selectMessageId={selectedMessageId}
setSelectedMessage={setSelectedMessage} setSelectedMessage={setSelectedMessage}
topic={topic} topic={topic}
/> />
@ -297,7 +297,7 @@ const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageSty
interface MessageWrapperProps { interface MessageWrapperProps {
$layout: 'fold' | 'horizontal' | 'vertical' | 'grid' $layout: 'fold' | 'horizontal' | 'vertical' | 'grid'
$selected: boolean // $selected: boolean
$isGrouped: boolean $isGrouped: boolean
$isInPopover?: boolean $isInPopover?: boolean
} }