refactor: ScriptView 删除 read 模式 + 兼容旧模式,统一对话流入口
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 短消息气泡(chat/system 短消息) -->
|
<!-- 短消息气泡(短消息) -->
|
||||||
<view v-if="isShortMessage && messageType !== 'script'" class="chat-bubble system">
|
<view v-if="isShortMessage" class="chat-bubble system">
|
||||||
<text>{{ content }}</text>
|
<text>{{ content }}</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 长文本卡片(story-card),按 messageType 渲染不同按钮 -->
|
<!-- 长文本卡片(story-card) -->
|
||||||
<view v-else class="story-card" :class="{ collapsed }">
|
<view v-else class="story-card" :class="{ collapsed }">
|
||||||
<view class="story-head">
|
<view class="story-head">
|
||||||
<view class="story-title-wrap">
|
<view class="story-title-wrap">
|
||||||
@@ -45,23 +45,14 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- script 专属按钮组 -->
|
<!-- 按旧版布局统一按钮组 -->
|
||||||
<view v-if="messageType === 'script'" class="script-actions">
|
<view class="result-actions">
|
||||||
<button v-if="canRewrite" class="action-btn" @click="$emit('rewrite')">改写</button>
|
|
||||||
<button v-if="canContinue" class="action-btn" @click="$emit('continue-script')">续写</button>
|
|
||||||
<button v-if="hasChildren" class="action-btn" @click="$emit('view-versions')">查看历史版本</button>
|
|
||||||
<button v-if="canDelete" class="action-btn danger" @click="$emit('delete-version')">删除版本</button>
|
|
||||||
<button class="action-btn primary" @click="$emit('play-tts')">
|
|
||||||
<text class="action-icon">{{ ttsIcon || '▶' }}</text>
|
|
||||||
<text>{{ ttsText || '播放' }}</text>
|
|
||||||
</button>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- chat / 旧版兼容按钮组 -->
|
|
||||||
<view v-else class="result-actions">
|
|
||||||
<button class="action-btn" @click="$emit('change-direction')">换个方向</button>
|
<button class="action-btn" @click="$emit('change-direction')">换个方向</button>
|
||||||
<button class="action-btn" @click="$emit('not-like-me')">不像我</button>
|
<button class="action-btn" @click="$emit('not-like-me')">不像我</button>
|
||||||
<button class="action-btn" @click="$emit('continue')">继续生成</button>
|
<button v-if="canContinue" class="action-btn" @click="$emit('continue-script')">续写</button>
|
||||||
|
<button v-if="canRewrite" class="action-btn" @click="$emit('rewrite')">改写</button>
|
||||||
|
<button v-if="hasChildren" class="action-btn" @click="$emit('view-versions')">查看历史版本</button>
|
||||||
|
<button v-if="canDelete" class="action-btn danger" @click="$emit('delete-version')">删除版本</button>
|
||||||
<button class="action-btn primary" @click="$emit('play-tts')">
|
<button class="action-btn primary" @click="$emit('play-tts')">
|
||||||
<text class="action-icon">{{ ttsIcon || '▶' }}</text>
|
<text class="action-icon">{{ ttsIcon || '▶' }}</text>
|
||||||
<text>{{ ttsText || '播放' }}</text>
|
<text>{{ ttsText || '播放' }}</text>
|
||||||
@@ -81,7 +72,6 @@ const props = defineProps({
|
|||||||
ttsIcon: { type: String, default: '▶' },
|
ttsIcon: { type: String, default: '▶' },
|
||||||
ttsText: { type: String, default: '播放' },
|
ttsText: { type: String, default: '播放' },
|
||||||
// 新增
|
// 新增
|
||||||
messageType: { type: String, default: 'script', validator: v => ['script', 'chat', 'system'].includes(v) },
|
|
||||||
versionLabel: { type: String, default: '' },
|
versionLabel: { type: String, default: '' },
|
||||||
hasChildren: { type: Boolean, default: false },
|
hasChildren: { type: Boolean, default: false },
|
||||||
canDelete: { type: Boolean, default: false },
|
canDelete: { type: Boolean, default: false },
|
||||||
|
|||||||
@@ -159,7 +159,7 @@
|
|||||||
<view id="result-scroll-top" class="result-scroll-top"></view>
|
<view id="result-scroll-top" class="result-scroll-top"></view>
|
||||||
|
|
||||||
<!-- 聊天模式 -->
|
<!-- 聊天模式 -->
|
||||||
<view v-else>
|
<view>
|
||||||
<view class="conversation compact">
|
<view class="conversation compact">
|
||||||
<view class="chat-bubble user">
|
<view class="chat-bubble user">
|
||||||
<text>{{ wishText }}</text>
|
<text>{{ wishText }}</text>
|
||||||
@@ -178,7 +178,6 @@
|
|||||||
>
|
>
|
||||||
<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)"
|
:version-label="formatVersionLabel(message)"
|
||||||
:has-children="messageHasChildren(message)"
|
:has-children="messageHasChildren(message)"
|
||||||
:can-delete="message.id !== currentVersionMessageId && message.parentMessageId !== null"
|
:can-delete="message.id !== currentVersionMessageId && message.parentMessageId !== null"
|
||||||
@@ -199,7 +198,6 @@
|
|||||||
@play-tts="playMessageTts(message)"
|
@play-tts="playMessageTts(message)"
|
||||||
@change-direction="changeDirection"
|
@change-direction="changeDirection"
|
||||||
@not-like-me="notLikeMe"
|
@not-like-me="notLikeMe"
|
||||||
@continue="continueMessage(message)"
|
|
||||||
/>
|
/>
|
||||||
<view v-else class="chat-bubble user">
|
<view v-else class="chat-bubble user">
|
||||||
<text>{{ message.content }}</text>
|
<text>{{ message.content }}</text>
|
||||||
@@ -221,83 +219,6 @@
|
|||||||
<view :id="resultScrollAnchor" class="result-scroll-anchor"></view>
|
<view :id="resultScrollAnchor" class="result-scroll-anchor"></view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 兼容旧模式 -->
|
|
||||||
<view v-else>
|
|
||||||
<view class="conversation compact">
|
|
||||||
<view class="chat-bubble user">
|
|
||||||
<text>{{ wishText }}</text>
|
|
||||||
<text class="bubble-time">{{ currentMessageTime }}</text>
|
|
||||||
</view>
|
|
||||||
<view class="chat-bubble system done">
|
|
||||||
<text>心愿已实现,故事已为你展开</text>
|
|
||||||
<text class="bubble-time">{{ currentResultTime }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<MessageCard
|
|
||||||
:content="displayedResultContent"
|
|
||||||
:title="currentResult?.title"
|
|
||||||
:tags="resultTags"
|
|
||||||
:collapsed="storyCollapsed"
|
|
||||||
:content-length="displayedResultContent.length"
|
|
||||||
:is-short-message="false"
|
|
||||||
:tts-icon="ttsActionIcon"
|
|
||||||
:tts-text="ttsActionText"
|
|
||||||
@toggle-collapse="toggleStoryCollapse"
|
|
||||||
@copy="copyResultContent"
|
|
||||||
@change-direction="changeDirection"
|
|
||||||
@not-like-me="notLikeMe"
|
|
||||||
@continue="continueInChat"
|
|
||||||
@play-tts="trackTtsClick"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<view v-if="resultMessages.length" class="result-chat-list">
|
|
||||||
<view
|
|
||||||
v-for="message in resultMessages"
|
|
||||||
:key="message.id"
|
|
||||||
>
|
|
||||||
<MessageCard
|
|
||||||
v-if="isAssistantMessage(message)"
|
|
||||||
:content="message.content"
|
|
||||||
:collapsed="isMessageCollapsed(message)"
|
|
||||||
:content-length="message.content.length"
|
|
||||||
:is-short-message="message.content.length < 100"
|
|
||||||
:tts-icon="ttsPlayer.playing.value ? 'Ⅱ' : '▶'"
|
|
||||||
:tts-text="ttsPlayer.playing.value ? '暂停' : '播放'"
|
|
||||||
@toggle-collapse="toggleMessageCollapse(message)"
|
|
||||||
@copy="copyMessageContent(message)"
|
|
||||||
@change-direction="changeDirection"
|
|
||||||
@not-like-me="notLikeMe"
|
|
||||||
@continue="continueInChat"
|
|
||||||
@play-tts="playMessageTts(message)"
|
|
||||||
/>
|
|
||||||
<view v-else class="chat-bubble user">
|
|
||||||
<text>{{ message.content }}</text>
|
|
||||||
<text class="bubble-time">{{ message.time }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view v-if="resultChatting" class="generation-loading">
|
|
||||||
<view class="loading-orbit streaming">
|
|
||||||
<view class="orbit-ring outer"></view>
|
|
||||||
<view class="orbit-ring inner"></view>
|
|
||||||
<view class="orbit-core"></view>
|
|
||||||
</view>
|
|
||||||
<text class="loading-copy">正在为你重写人生</text>
|
|
||||||
<text class="loading-subcopy">AI 正在思考下一步方向</text>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view :id="resultScrollAnchor" class="result-scroll-anchor"></view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</scroll-view>
|
|
||||||
|
|
||||||
<view v-if="showScrollTopBtn || showScrollBottomBtn" class="scroll-jump-group">
|
|
||||||
<view v-if="showScrollTopBtn" class="scroll-jump-btn" @click="scrollResultToTop">顶部</view>
|
|
||||||
<view v-if="showScrollBottomBtn" class="scroll-jump-btn" @click="scrollResultToBottom">底部</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 聊天模式输入栏 -->
|
<!-- 聊天模式输入栏 -->
|
||||||
<view v-if="viewMode === 'chat'" class="result-chat-bar">
|
<view v-if="viewMode === 'chat'" class="result-chat-bar">
|
||||||
<view
|
<view
|
||||||
@@ -326,28 +247,6 @@
|
|||||||
<view class="chat-send-btn" :class="{ disabled: !chatInput.trim() || generating }" @click="sendChat">发送</view>
|
<view class="chat-send-btn" :class="{ disabled: !chatInput.trim() || generating }" @click="sendChat">发送</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 非聊天模式输入栏(兼容旧模式) -->
|
|
||||||
<view v-else class="result-chat-bar">
|
|
||||||
<view
|
|
||||||
class="chat-voice-btn"
|
|
||||||
:class="{ pressing: voiceState === 'pressing', recognizing: voiceState === 'recognizing' }"
|
|
||||||
@touchstart.prevent="startVoicePress"
|
|
||||||
@touchend.prevent="endVoicePress"
|
|
||||||
@touchcancel.prevent="cancelVoicePress"
|
|
||||||
>
|
|
||||||
<text class="voice-icon">🎤</text>
|
|
||||||
</view>
|
|
||||||
<view class="result-input-shell" :class="{ twoLine: resultInputLevel === 'two', expanded: resultInputLevel === 'multi' }">
|
|
||||||
<text v-if="!resultChatInput" class="custom-input-placeholder result-input-placeholder">继续提修改建议,或确认后重新生成</text>
|
|
||||||
<textarea
|
|
||||||
class="result-chat-input"
|
|
||||||
v-model="resultChatInput"
|
|
||||||
:auto-height="resultInputLevel !== 'single'"
|
|
||||||
:show-confirm-bar="false"
|
|
||||||
:focus="resultInputFocus"
|
|
||||||
maxlength="500"
|
|
||||||
confirm-type="send"
|
|
||||||
@focus="resultInputFocused = true"
|
|
||||||
@blur="resultInputFocused = false"
|
@blur="resultInputFocused = false"
|
||||||
@confirm="sendResultChat('text')"
|
@confirm="sendResultChat('text')"
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user