chat-app/src/components/talk/message/MixedMessage.vue
caiyx 1213ad9b98
Some checks failed
Check / lint (push) Has been cancelled
Check / typecheck (push) Has been cancelled
Check / build (build, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:app, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:app, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, windows-latest) (push) Has been cancelled
fix
2024-12-20 16:59:58 +08:00

118 lines
2.4 KiB
Vue

<script lang="ts" setup>
import { textReplaceEmoji } from '@/utils/emojis'
import { textReplaceLink } from '@/utils/strings'
import { getImageInfo } from '@/utils/functions'
import { ITalkRecordExtraMixed, ITalkRecord } from '@/types/chat'
const props = defineProps<{
extra: ITalkRecordExtraMixed
data: ITalkRecord
maxWidth?: Boolean
}>()
const float = props.data.float
const img = (src: string, width = 200) => {
const info = getImageInfo(src)
if (info.width == 0 || info.height == 0) {
return {
width: 200,
height: 200
}
}
if(info.width<300){
return {
width: 300,
height: info.height / (info.width / 300)
}
}
if (info.width < width) {
return {
width: info.width,
height: info.height
}
}
return {
width: width,
height: info.height / (info.width / width)
}
}
</script>
<template>
<div
class="im-message-mixed"
:class="{
left: float == 'left',
right: float == 'right',
maxwidth: maxWidth
}"
>
<pre>
<template v-for="(item) in extra.items" :key="item.id">
<template v-if="item.type === 1">
<span v-html="textReplaceEmoji(textReplaceLink(item.content))" />
</template>
<template v-else-if="item.type === 3">
<div
style="display: flex; margin: 5px 0;border-radius: 8px;overflow: hidden;"
>
<tm-image :src="item.content" :width="img(item.content,450).width" :height="img(item.content,450).height" ></tm-image>
</div>
</template>
</template>
</pre>
</div>
</template>
<style lang="less" scoped>
.im-message-mixed {
min-width: 40rpx;
min-height: 40rpx;
padding: 20rpx 18rpx;
color: #000000;
background-color: #FFFFFF;
border-radius: 0;
&.left{
background-color: #FFFFFF;
color: #000000;
border-radius: 0 16rpx 16rpx 16rpx;
}
&.right {
background-color: #46299D;
color: #FFFFFF;
border-radius: 10px 0px 10px 10px;
}
&.maxwidth {
max-width: 70%;
}
pre {
display: flex;
flex-direction: column;
white-space: pre-wrap;
overflow: hidden;
word-break: break-word;
word-wrap: break-word;
font-size: 14px;
padding: 3px 5px;
font-family: 'PingFang SC', 'Microsoft YaHei', 'Alibaba PuHuiTi 2.0 45';
line-height: 25px;
:deep(a) {
color: #2196f3;
text-decoration: revert;
}
}
}
</style>