feat: chat 模式传 messageType/versionLabel/新 emits 给 MessageCard
This commit is contained in:
@@ -221,18 +221,28 @@
|
|||||||
>
|
>
|
||||||
<MessageCard
|
<MessageCard
|
||||||
v-if="message.sender === 'assistant' || message.type === 'script'"
|
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"
|
:content="message.content"
|
||||||
:collapsed="isMessageCollapsed(message)"
|
:collapsed="isMessageCollapsed(message)"
|
||||||
:content-length="message.content.length"
|
:content-length="message.content.length"
|
||||||
:is-short-message="message.content.length < 100"
|
:is-short-message="false"
|
||||||
:tts-icon="ttsPlayer.playing.value ? 'Ⅱ' : '▶'"
|
:tts-icon="ttsPlayer.playing.value ? 'Ⅱ' : '▶'"
|
||||||
:tts-text="ttsPlayer.playing.value ? '暂停' : '播放'"
|
:tts-text="ttsPlayer.playing.value ? '暂停' : '播放'"
|
||||||
@toggle-collapse="toggleMessageCollapse(message)"
|
@toggle-collapse="toggleMessageCollapse(message)"
|
||||||
@copy="copyMessageContent(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"
|
@change-direction="changeDirection"
|
||||||
@not-like-me="notLikeMe"
|
@not-like-me="notLikeMe"
|
||||||
@continue="continueMessage(message)"
|
@continue="continueMessage(message)"
|
||||||
@play-tts="playMessageTts(message)"
|
|
||||||
/>
|
/>
|
||||||
<view v-else class="chat-bubble user">
|
<view v-else class="chat-bubble user">
|
||||||
<text>{{ message.content }}</text>
|
<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 () => {
|
const sendChat = async () => {
|
||||||
if (!chatInput.value.trim() || generating.value) return
|
if (!chatInput.value.trim() || generating.value) return
|
||||||
const content = chatInput.value.trim()
|
const content = chatInput.value.trim()
|
||||||
|
|||||||
Reference in New Issue
Block a user