|
<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> |
|
|