| <script setup lang="ts"> |
| |
| import router from "@/router.ts"; |
| import { useSettingsStore } from "@/stores/config.ts"; |
| import { onMounted, ref, nextTick, watch, defineProps } from "vue"; |
| |
| const props = defineProps({ |
| isPlaying: { |
| type: Boolean, |
| default: true |
| }, |
| chatContent: { |
| type: [Object], |
| default: [] |
| } |
| }); |
| |
| const contentListRef = ref(null); |
| |
| const scrollToBottom = () => { |
| nextTick(() => { |
| if (contentListRef.value) { |
| |
| contentListRef.value.scrollTop = contentListRef.value.scrollHeight + 24; |
| } |
| }); |
| }; |
| |
| |
| watch(() => props.chatContent, (newVal, oldVal) => { |
| |
| scrollToBottom(); |
| }, { deep: true }); |
| </script> |
| |
| <template> |
| <div ref="contentListRef" class="talk-wrapper"> |
| <div v-for="node, index in chatContent" :class="[node.type == 'answer' ? 'cont-left' : 'cont-right']" :key="index"> |
| <div :class="[node.type == 'answer' ? 'text-left' : 'text-right']"> |
| {{ node.content }} |
| </div> |
| </div> |
| |
| |
| |
| |
| {{ 'AI' }} |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| {{ 'U' }} |
| |
| |
| |
| |
| </div> |
| </template> |
| |
| <style lang="scss" scoped> |
| .talk-wrapper { |
| width: auto; |
| height: calc(100vh - 100px); |
| overflow-y: scroll; |
| padding: 20px 240px 0 240px; |
| display: flex; |
| flex-direction: column; |
| align-items: flex-start; |
| justify-content: flex-start; |
| |
| .cont-left { |
| width: 100%; |
| |
| margin: 24px 0; |
| display: flex; |
| justify-content: flex-start; |
| align-items: flex-start; |
| .text-left { |
| color: #222; |
| font-size: 16px; |
| font-weight: 400; |
| text-align: left; |
| line-height: 2; |
| margin-left: 12px; |
| margin-top: 6px; |
| } |
| } |
| |
| .cont-right { |
| width: 100%; |
| margin: 24px 0; |
| display: flex; |
| justify-content: flex-end; |
| align-items: flex-start; |
| |
| .text-right { |
| color: #444; |
| font-size: 16px; |
| font-weight: 400; |
| text-align: end; |
| line-height: 2; |
| margin-right: 12px; |
| background: #ccc; |
| border-radius: 8px; |
| border-top-right-radius: 0; |
| padding: 8px; |
| } |
| } |
| } |
| </style> |
| |