<template> <view> <!-- 自己发出的消息 --> <view class="my" v-if="row.sendUid==userData.user.operId"> <!-- 右键 --> <view class="right-click" v-show="row.id==rClickId"> <view @tap="copyFunc(row.msgContext)">复制</view> <view @tap="deleteFunc(row.id,index)" v-if="row.msgType!=1">删除</view> <view @tap="forwardFunc(row)" v-if="row.msgType!=7">转发</view> <view @tap="collectFunc(row)" v-if="row.msgType==1">收藏</view> <text @tap="rollBackFunc(row)">撤销</text> </view> <!-- 左-消息 --> <view class="left"> <!-- 文字消息 --> <view @longtap="openRight(row)" v-if="row.msgType==0" class="bubble text"> <rich-text :nodes="transformFace(row.msgContext)"></rich-text> </view> <!-- 图片消息 --> <view @longtap="openRight(row)" v-if="row.msgType==1" class="bubble img" @tap="showPic(`/${$url}/${row.msgContext}`)"> <image :src="$url+'/scale_'+ row.msgContext" style="width:100px;height:100px"></image> </view> <!-- 语言消息 --> <view @longtap="openRight(row)" v-if="row.msgType==3" class="bubble voice" @tap="playVoice(row)" :class="playMsgId == row.id?'play':''"> <view class="length">{{recordToJson(row.msgContext).length}}</view> <view class="icon my-voice"></view> </view> <!-- 红包 --> <view v-if="row.msgType==7" @tap="openRedPacket(row)"> <div class="message-red-packet-right" :style="redProcess(row.msgContext).surplusMoney===0?'background:#F7DFC3':'background:#F09D47'"> <div class="text"> <image :src="redProcess(row.msgContext).surplusMoney===0?'../../static/img/red-chai.png':'../../static/img/red.png'"></image> <span class="packet">恭喜发财,大吉大利</span> </div> <div :class="redProcess(row.msgContext).surplusMoney===0?'footer2':'footer'">红包</div> <div class="arrow-org" :style="redProcess(row.msgContext).surplusMoney===0?'background:#F7DFC3':'background:#F09D47'"></div> </div> </view> </view> <!-- 右-头像 --> <view :class="row.msgType==0?'right text':'right'" @tap="linkToCard(row.sendUid)"> <img-cache :src="`${$url}/${row.avatar}`"></img-cache> </view> </view> </view> </template> <script> import ImgCache from '@/components/img-cache/img-cache.vue'; import { transform } from "../../static/emoji/ChatUtils.js"; export default { name: 'right-bubble', components:{ ImgCache }, props: { row: { type: Object, default() { return {}; } }, rClickId: { type: Number, default: 0 }, playMsgId: { type: Number, default: 0 }, index:{ type:Number, defalut:0 }, }, data() { return { //播放语音相关参数 AUDIO:uni.createInnerAudioContext(), $url:'' }; }, mounted() { //语音自然播放结束 this.AUDIO.onEnded((res)=>{ }); }, filters: { formatDate: function (e) { // 获取js 时间戳 let time = new Date().getTime(); // 去掉 js 时间戳后三位 time = parseInt((time - e) / 1000); // 存储转换值 let s; if (time < 60 * 10) { // 十分钟内 return '刚刚'; } else if (time < 60 * 60 && time >= 60 * 10) { // 超过十分钟少于1小时 s = Math.floor(time / 60); return s + '分钟前'; } else if (time < 60 * 60 * 24 && time >= 60 * 60) { // 超过1小时少于24小时 s = Math.floor(time / 60 / 60); return s + '小时前'; } else if (time < 60 * 60 * 24 * 3 && time >= 60 * 60 * 24) { // 超过1天少于3天内 s = Math.floor(time / 60 / 60 / 24); return s + '天前'; } else { // 超过3天 var date = new Date(e);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 var Y = date.getFullYear() + '-'; var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'; var D = date.getDate() + ' '; var h = date.getHours() + ':'; var m = date.getMinutes() + ':'; var ss = date.getSeconds(); return Y+M+D+h+m+ss; } } }, methods:{ openRight(row){ this.$emit('openRight', row); }, deleteFunc(id,index){ this.$emit('deleteF', id, index); }, //收藏表情 collectFunc({msgContext}){ this.$socket.addEmoticon(this.userData.user.operId, msgContext, res => { if(res.success){ uni.showToast({ icon:'none', title:'添加成功' }) } }); }, // 打开红包 openRedPacket(msg){ this.$emit('openRedPacket',msg); }, //处理红包数据 redProcess(msgContext){ let packets = JSON.parse(msgContext).Packets; let msg = { description:'好友暂不支持发红包', money:0, number:0, userAvatar:'defalut.jpg', surplusMoney:0, Records:[] } if(packets==undefined){ return msg; } if(packets.length==0){ return msg; } return packets[0]; }, // 预览图片 showPic(msg){ uni.previewImage({ indicator:"none", current: msg, urls: [msg] }); }, // 播放语音 playVoice(msg){ let s =JSON.parse(msg.msgContext); this.playMsgId= msg.id; this.AUDIO.src = this.$url + s.url; this.$nextTick(function() { this.AUDIO.play(); }); }, playMp3(){ let s =JSON.parse(msg.msgContext); const innerAudioContext = uni.createInnerAudioContext(); innerAudioContext.autoplay = true; innerAudioContext.src = this.$url + s.url; innerAudioContext.onPlay(() => { console.log('开始播放'); }); innerAudioContext.onError((res) => { console.log(res.errMsg); console.log(res.errCode); }); }, recordToJson(msg){ let s =JSON.parse(msg); return s }, //复制 copyFunc(content){ uni.setClipboardData({ data:content, success:()=>{ uni.showToast({ title:"复制成功" }) } }); }, //转发 forwardFunc({msgType,msgContext}){ this.$u.route({ url:'pages/chat/forward', params:{msgType,msgContext} }); }, //撤销 rollBackFunc({id,operTime}){ let _this = this uni.showActionSheet({ itemList: ['确认'], success: function (res) { if(res.tapIndex==0){ let type = _this.chatObj.chatType; let arr = ['deleteFriendMsg','deleteGroupMsg'] _this.$socket[arr[type]](_this.userData.user.operId, id, _this.chatObj.chatId, res => { if (res.success) { _this.sendMsg(6, id) } }) } }, fail: function (res) { console.log(res.errMsg); } }); }, sendMsg(index, msg){ this.$emit('sendMsg',index,msg); }, //名片 linkToCard(id){ this.$u.route({ url: 'pages/businessCard/businessCard', params:{ id: id, source: 1} }) }, //表情转换 transformFace(text){ return transform(text) }, } } </script> <style lang="scss"> @import "@/pages/chat/style.scss"; </style>