Files
im/pages/conversation/chating/components/MessageItem/FaceMessageRender.vue
T
cansnow 5a086fa1fa 13
2025-12-11 22:33:31 +08:00

103 lines
2.3 KiB
Vue

<template>
<view class="face_message_container bg_container">
<u--image
:showLoading="true"
width="120"
:height="maxHeight"
mode="widthFix"
v-if="src"
:src="src"
@load="onLoaded"
@click="clickMediaItem">
<template v-slot:loading>
<u-loading-icon color="red"></u-loading-icon>
</template>
</u--image>
</view>
</template>
<script>
import util from "@/util"
import md5 from "md5";
export default {
name: "FaceMessageRender",
components: {},
props: {
message: Object,
conversationID:String,
},
data() {
//console.log(this.message);
return {
loadingWidth: "120px",
maxHeight:'120px',
src:"",
coverCachePath:"",
coverDownloading:false,
coverExists:false,
coverDownloadProgress:"",
};
},
computed: {
getImgUrl() {
return (
this.message.FaceElem?.data ??
this.message.FaceElem.index
);
}
},
created() {
this.init();
},
methods: {
async init(){
const self = this;
let url = "";
// 如果有远程 snapshotUrl,则下载到 coverCachePath
const snapshotUrl = this.message.FaceElem.data;
const key = md5(snapshotUrl || '');
this.coverCachePath = `_doc/${this.conversationID}/face_${key}.jpg`;
if (typeof plus === 'undefined' || !this.coverCachePath) return;
try {
// 检查封面是否存在
const coverExists = await util.fileExsit(self.coverCachePath);
this.coverExists = !!coverExists;
if (this.coverExists) {
this.src = this.coverCachePath;
return;
}
if (!snapshotUrl) {
this.src="/static/images/sync_error.png";
return;
}
this.coverDownloading = true;
await new Promise((resolve, reject) => {
util.downloadFile(snapshotUrl, self.coverCachePath, function(localPath) {
self.coverDownloading = false;
self.coverExists = true;
resolve(localPath);
}, function(err) {
self.coverDownloading = false;
reject(err);
}, function(progress) {
self.coverDownloadProgress = progress;
});
});
} catch (e) {
this.coverDownloading = false;
}
},
onLoaded() {
this.loadingWidth = "auto";
}
},
};
</script>
<style lang="scss" scoped>
.face_message_container {
position: relative;
border-radius: 16rpx;
overflow: hidden;
}
</style>