feat: chat 模式传 messageType/versionLabel/新 emits 给 MessageCard

This commit is contained in:
2026-06-29 22:53:36 +08:00
parent a713e8823c
commit f45fee7cce
+72 -2
View File
@@ -221,18 +221,28 @@
>
<MessageCard
v-if="message.sender === 'assistant' || message.type === 'script'"
message-type="script"
:version-label="formatVersionLabel(message)"
:has-children="messageHasChildren(message)"
:can-delete="message.id !== currentVersionMessageId && message.parentMessageId !== null"
:can-rewrite="true"
:can-continue="true"
:content="message.content"
:collapsed="isMessageCollapsed(message)"
:content-length="message.content.length"
:is-short-message="message.content.length < 100"
:is-short-message="false"
:tts-icon="ttsPlayer.playing.value ? '' : ''"
:tts-text="ttsPlayer.playing.value ? '暂停' : '播放'"
@toggle-collapse="toggleMessageCollapse(message)"
@copy="copyMessageContent(message)"
@rewrite="rewriteMessage(message)"
@continue-script="continueMessage(message)"
@view-versions="viewMessageVersions(message)"
@delete-version="removeVersion(message)"
@play-tts="playMessageTts(message)"
@change-direction="changeDirection"
@not-like-me="notLikeMe"
@continue="continueMessage(message)"
@play-tts="playMessageTts(message)"
/>
<view v-else class="chat-bubble user">
<text>{{ message.content }}</text>
@@ -719,6 +729,66 @@ const initializeFirstAIMessage = async () => {
}
}
/**
* 格式化版本标签,显示在 MessageCard 上
*/
const formatVersionLabel = (message) => {
if (message.type !== 'script') return ''
const versionNum = message.versionNumber || 1
const isCurrent = message.id === currentVersionMessageId.value
return isCurrent ? `V${versionNum} (当前)` : `V${versionNum}`
}
/**
* 判断消息是否有子版本
*/
const messageHasChildren = (message) => {
if (!message || message.type !== 'script') return false
// 通过 versions 列表判断是否有子版本
return versions.value.some(v => v.parentMessageId === message.id)
}
/**
* 查看消息的版本历史
*/
const viewMessageVersions = async (message) => {
try {
const res = await listMessageVersions(message.id)
const versionList = res.data || []
if (versionList.length === 0) {
uni.showToast({ title: '暂无历史版本', icon: 'none' })
return
}
const items = versionList.map(v => {
const isCurrent = v.id === currentVersionMessageId.value
return `${isCurrent ? '★ ' : ''}V${v.versionNumber || '-'}`
})
uni.showActionSheet({
itemList: items,
success: async (actionRes) => {
const selected = versionList[actionRes.tapIndex]
if (!selected) return
if (selected.id === currentVersionMessageId.value) {
uni.showToast({ title: '已是当前版本', icon: 'none' })
return
}
try {
await switchVersion({ scriptId: scriptId.value, messageId: selected.id })
currentVersionMessageId.value = selected.id
await loadMessages()
uni.showToast({ title: `已切换到 V${selected.versionNumber}`, icon: 'success' })
} catch (switchErr) {
uni.showToast({ title: switchErr.message || '切换失败', icon: 'none' })
}
}
})
} catch (error) {
uni.showToast({ title: error.message || '加载版本失败', icon: 'none' })
}
}
const sendChat = async () => {
if (!chatInput.value.trim() || generating.value) return
const content = chatInput.value.trim()