refactor(Messages): enhance message rendering and navigation exclusions

- Updated styles for message content and group containers to improve layout.
- Added new selectors to exclude additional elements from navigation.
- Implemented conditional rendering for mentions in message content.
- Simplified token display logic in message tokens component.
This commit is contained in:
kangfenmao 2025-05-29 14:55:05 +08:00
parent 479b3ccfb7
commit a78db10798
5 changed files with 33 additions and 29 deletions

View File

@ -147,11 +147,16 @@ ul {
background-color: var(--color-white-soft); background-color: var(--color-white-soft);
} }
} }
.group-grid-container.horizontal,
.group-grid-container.grid {
.message-content-container-assistant {
padding: 0;
}
}
.group-message-wrapper { .group-message-wrapper {
background-color: var(--color-background); background-color: var(--color-background);
.message-content-container { .message-content-container {
width: 100%; width: 100%;
border: 1px solid var(--color-background-mute);
} }
} }
.group-menu-bar { .group-menu-bar {
@ -170,6 +175,7 @@ span.highlight {
background-color: var(--color-background-highlight); background-color: var(--color-background-highlight);
color: var(--color-highlight); color: var(--color-highlight);
} }
span.highlight.selected { span.highlight.selected {
background-color: var(--color-background-highlight-accent); background-color: var(--color-background-highlight-accent);
} }

View File

@ -18,7 +18,7 @@ import styled from 'styled-components'
import ChatFlowHistory from './ChatFlowHistory' import ChatFlowHistory from './ChatFlowHistory'
// Exclude some areas from the navigation // Exclude some areas from the navigation
const EXCLUDED_SELECTORS = ['.MessageFooter', '.code-toolbar', '.ant-collapse-header'] const EXCLUDED_SELECTORS = ['.MessageFooter', '.code-toolbar', '.ant-collapse-header', '.group-menu-bar', '.code-block']
interface ChatNavigationProps { interface ChatNavigationProps {
containerId: string containerId: string

View File

@ -1,6 +1,7 @@
import { getModelUniqId } from '@renderer/services/ModelService' import { getModelUniqId } from '@renderer/services/ModelService'
import type { Message } from '@renderer/types/newMessage' import type { Message } from '@renderer/types/newMessage'
import { Flex } from 'antd' import { Flex } from 'antd'
import { isEmpty } from 'lodash'
import React from 'react' import React from 'react'
import styled from 'styled-components' import styled from 'styled-components'
@ -12,9 +13,11 @@ interface Props {
const MessageContent: React.FC<Props> = ({ message }) => { const MessageContent: React.FC<Props> = ({ message }) => {
return ( return (
<> <>
<Flex gap="8px" wrap style={{ marginBottom: 10 }}> {!isEmpty(message.mentions) && (
{message.mentions?.map((model) => <MentionTag key={getModelUniqId(model)}>{'@' + model.name}</MentionTag>)} <Flex gap="8px" wrap style={{ marginBottom: 10 }}>
</Flex> {message.mentions?.map((model) => <MentionTag key={getModelUniqId(model)}>{'@' + model.name}</MentionTag>)}
</Flex>
)}
<MessageBlockRenderer blocks={message.blocks} message={message} /> <MessageBlockRenderer blocks={message.blocks} message={message} />
</> </>
) )

View File

@ -204,8 +204,7 @@ const MessageGroup = ({ messages, topic, hidePresetMessages, registerMessageElem
</MessageWrapper> </MessageWrapper>
} }
trigger={gridPopoverTrigger} trigger={gridPopoverTrigger}
styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto', zIndex: 1000 } }} styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto', zIndex: 1000 } }}>
getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement}>
<div style={{ cursor: 'pointer' }}>{messageContent}</div> <div style={{ cursor: 'pointer' }}>{messageContent}</div>
</Popover> </Popover>
) )

View File

@ -1,6 +1,7 @@
// import { useRuntime } from '@renderer/hooks/useRuntime' // import { useRuntime } from '@renderer/hooks/useRuntime'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import type { Message } from '@renderer/types/newMessage' import type { Message } from '@renderer/types/newMessage'
import { Popover } from 'antd'
import { t } from 'i18next' import { t } from 'i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -40,15 +41,24 @@ const MessgeTokens: React.FC<MessageTokensProps> = ({ message }) => {
}) })
} }
const tokensInfo = (
<span className="tokens">
Tokens:
<span>{message?.usage?.total_tokens}</span>
<span>{message?.usage?.prompt_tokens}</span>
<span>{message?.usage?.completion_tokens}</span>
</span>
)
return ( return (
<MessageMetadata className={`message-tokens ${hasMetrics ? 'has-metrics' : ''}`} onClick={locateMessage}> <MessageMetadata className="message-tokens" onClick={locateMessage}>
<span className="metrics">{metrixs}</span> {hasMetrics ? (
<span className="tokens"> <Popover content={metrixs} placement="top" trigger="hover" styles={{ root: { fontSize: 11 } }}>
Tokens: {tokensInfo}
<span>{message?.usage?.total_tokens}</span> </Popover>
<span>{message?.usage?.prompt_tokens}</span> ) : (
<span>{message?.usage?.completion_tokens}</span> tokensInfo
</span> )}
</MessageMetadata> </MessageMetadata>
) )
} }
@ -64,10 +74,6 @@ const MessageMetadata = styled.div`
cursor: pointer; cursor: pointer;
text-align: right; text-align: right;
.metrics {
display: none;
}
.tokens { .tokens {
display: block; display: block;
@ -75,16 +81,6 @@ const MessageMetadata = styled.div`
padding: 0 2px; padding: 0 2px;
} }
} }
&.has-metrics:hover {
.metrics {
display: block;
}
.tokens {
display: none;
}
}
` `
export default MessgeTokens export default MessgeTokens