Files
im/pages/find/shake/chatting/index.vue
T
2026-02-15 19:41:13 +08:00

1216 lines
33 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view>
<!-- 自定义导航栏 -->
<view>
<u-navbar :is-back="false" title="" :background="{backgroundColor:'#f0f0f0'}" :border-bottom="!checkBoxFlag">
<view class="custom-navbar" v-if="checkBoxFlag==false">
<view class="nav-left" @click="customBack">
<u-icon name="arrow-left" color="#000000" size="34"></u-icon>
</view>
<view class="nav-center u-flex u-row-center u-col-center">
<view>{{yyyGroup.nickName}}</view>
</view>
<view class="nav-right" @click="toGroupDetail()">
<u-icon name="more-dot-fill" color="#000000" :size="35"></u-icon>
</view>
</view>
<view class="custom-navbar" v-else>
<view class="nav-left"
style="font-size: 32rpx;color: #000000;"
@click="checkBoxFlag=false">
<text>取消</text>
</view>
<view class="nav-center u-flex u-row-center u-col-center">
<view>{{yyyGroup.nickName}}</view>
</view>
<view class="nav-right">
<text> </text>
</view>
</view>
</u-navbar>
<view style="background-color: #f0f0f0;border-bottom: 1rpx solid #c0c0c0;"
class="u-p-20" v-if="checkBoxFlag">
<view class="u-flex u-row-center u-col-center"
style="background-color: #ffffff;height:70rpx;border-radius: 10rpx;color: #c0c0c0;">
<view class="u-m-r-20">
<u-icon class="u-clear-icon" top="6rpx" :size="40" name="search" color="#c0c0c0"></u-icon>
</view>
<view style="color: #c0c0c0;font-size: 34rpx;">搜索</view>
</view>
</view>
</view>
<!-- 信息记录列表 test-border-->
<view class="msg-container">
<scroll-view :scroll-y="true" class="msg-box-scroller hidden-scroll-bar"
:style="checkBoxFlag?'height:'+(scrollViewHeight-80)+'px':'height:'+(scrollViewHeight-30)+'px'" :scroll-with-animation="scrollAnimation"
:scroll-into-view="scrollIntoView"
:upper-threshold="10" @touchstart="hideDrawer">
<view style="width: 100%;" v-for="(msg,index) in messageList" :key="index">
<yyy-message-item @handleMessage="handleMessageMenu"
@checkChange="checkChange"
@toYYYPerson="toYYYPerson"
:checkBoxFlag="checkBoxFlag" :item="msg" :id="'msg_'+msg.id"></yyy-message-item>
</view>
</scroll-view>
</view>
<!-- 底部模块盒子 -->
<view class="footer-container">
<view v-if="checkBoxFlag==true"
style="background-color: #F7F7F7;"
class="u-flex u-row-around u-col-center u-p-30 u-border-top">
<view @click="showZhuanFaPop()">
<u-image src="/static/image/wx/handle-msg/check-zhuanfa.jpg" :width="40" :height="40">
</u-image>
</view>
<view>
<u-image src="/static/image/wx/handle-msg/check-shoucang.jpg" :width="40" :height="40">
</u-image>
</view>
<view>
<u-image src="/static/image/wx/handle-msg/check-shanchu.jpg" :width="40" :height="40">
</u-image>
</view>
<view>
<u-icon name="more-dot-fill" :size="40"></u-icon>
</view>
<u-action-sheet :list="zhuanFaActionList" v-model="zhuanFaPopFlag"
@click="confirmToZhuanFa"
safe-area-inset-bottom></u-action-sheet>
</view>
<view v-else class="input-box u-border-top">
<view class="input-box-flex">
<!-- 语音/键盘切换,H5不支持 -->
<!-- #ifdef APP-PLUS -->
<view>
<image class="icon_img"
:src="require('@/static/images/chating_footer_audio.png')">
</image>
</view>
<!-- #endif -->
<!-- 中间的输入框或者语音录入显示框 -->
<view class="input-box-flex-grow">
<view class="textArea-box">
<scroll-view :scroll-y="true" :scroll-x="false" class="inputScroll" :show-scrollbar="true">
<textarea style="text-indent:5upx;" auto-height="true"
placeholder-style="color:#DDDDDD;" :cursor-spacing="10" :confirm-hold="true"
confirm-type="send" :show-confirm-bar="false" :focus="inputFocusFlag"
:auto-focus="false" :hold-keyboard="true" @blur="onBlur" @focus="onInputFocus"
@confirm="$noClicks(confirmSendText)" v-model="sendStr" :cursor="sendStr.length"
:maxlength="-1">
</textarea>
</scroll-view>
</view>
</view>
<!-- 功能性按钮 表情-->
<view>
<image class="u-m-l-20" :src="require('@/static/images/chating_footer_emoji.png')" @click="changeEmojiBox">
</image>
</view>
<!-- 宫格 -->
<view>
<image class="u-m-l-20" :src="require('@/static/images/chating_footer_add.png')" @click="changeDrawer">
</image>
</view>
<!-- 发送按钮 @touchend.prevent="$noClicks(sendText)" -->
<!-- <view class="u-m-l-16" @touchend.prevent="$noClicks(sendText)">
<u-button type="success" :custom-style="customSendBtnStyle">
<text>发送</text>
</u-button>
</view> -->
</view>
<view class="fun-box u-border-top" :class="{'show-fun-box':showFunBtn}">
<u-grid :col="4" :border="false" @click="funGirdItemClick">
<u-grid-item v-for="(item, index) in funList" :index="index" :key="index"
:custom-style="{padding:'20rpx 0'}" bg-color="#F8F8F8">
<view class="u-flex u-row-center u-col-center"
style="background-color: #FFFFFF;width: 110rpx;height: 110rpx;border-radius: 30rpx;">
<u-icon :name="item.icon" :size="60"></u-icon>
</view>
<view class="grid-text" style="font-size: 24rpx;">{{ item.title }}</view>
</u-grid-item>
</u-grid>
</view>
<view class="fun-box u-border-top" :class="{'show-fun-box':showEmojiBox}">
<swiper class="emoji-swiper" :indicator-dots="false" :duration="50" :vertical="true">
<swiper-item v-for="(item,index) in faceList" :key="index">
<view v-for="(childrenItem, childrenIndex) in item" :key="childrenIndex">
<image v-if="index<6" class="emo-image" :src="emojiUrl + emojiMap[childrenItem]">
</image>
<image v-else class="face-img" :src="faceUrl + childrenItem + '@2x.png'">
</image>
</view>
</swiper-item>
</swiper>
<view v-if="showEmojiBox" style="padding:0rpx 20rpx;position: absolute;bottom: 1rpx;right: 10rpx;
width: 250rpx;height: 150rpx;z-index: 1000;opacity: 0.9;" class="u-flex u-row-right u-col-center">
<view class="u-flex u-row-center u-col-center"
style="border: 1px solid #f1f1f1;border-radius: 10rpx; background-color: #82848a;width: 100rpx;padding: 15rpx 20rpx;margin-right: 8rpx;">
<view @click="delSendStr()" @longpress="clearSendStr()">
<u-icon name="backspace" size="46" color="#ffffff"></u-icon>
</view>
</view>
<!-- <view>
<u-button @click="$noClicks(sendText)" type="success" :custom-style="{padding:'20rpx'}">发送
</u-button>
</view> -->
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import faceUtil from "@/util/emojiMap.js"; //表情
import permission from '@/util/permission.js'; //手机权限
import yyyMessageItem from "./components/message-item.vue"; //聊天信息
export default {
components: {
yyyMessageItem
},
data() {
return {
checkBoxFlag:false,
checkedMessages:[],
zhuanFaPopFlag:false,
zhuanFaActionList:[
{
text: '逐条转发',
color:'#000000',
fontSize: 34,
},
{
text: '合并转发',
color:'#000000',
fontSize: 34,
}
],
noClick: true, //防止重复点击
yyyGroup:{
id:'000000',
avatar:'/static/image/default/default-user/1.jpg',
chatNumber:'000000',
nickName:'文件传输助手',
signature:'每个人的活法都不一样,只要你开心,一切都值得',
userRemark:'来吧,摇一摇',
address:'湖北 武汉',
sex:0,
friendPower:0,
forbidSelf:false,
forbidHis:false,
createTime:'21:20',
sendTimeStr:"21:22",
lastMsgContent:'',
delFlag:false,
},
messageList:[],
scrollViewHeight:0,
scrollAnimation:false,
scrollIntoView:'',
chatType: 'voice', // 图标类型 'voice'语音 'keyboard'键盘
sendStr:'',
showFunBtn:false,
showEmojiBox:false,
inputFocusFlag:false,
emojiUrl: faceUtil.emojiUrl, //表情请求前缀(腾讯)
emojiMap: faceUtil.emojiMap, //表情包集合(腾讯)
emojiName: faceUtil.emojiName, //表情名称(腾讯)
faceUrl: faceUtil.faceUrl, //特殊表情请求前缀(腾讯)
bigEmojiList: faceUtil.bigEmojiList, //特殊表情对象集合(腾讯)
faceList: [], //自定义表情对象集合,有腾讯数据提供转换而来
//功能菜单
funList: [{
id: 1,
icon: "photo-fill",
title: "照片",
uploadType: ["album"]
},
{
id: 2,
icon: "camera-fill",
title: "视频",
uploadType: ["camera"]
},
{
id: 3,
icon: "red-packet-fill",
title: "红包",
},
{
id: 4,
icon: "rmb-circle-fill",
title: "转账",
},
],
toolTipFlag: false,
toolTipData: [{
id: 1,
icon: '/static/image/chat/longTipIcon/copy.png',
title: '复制',
disabled: false
},
{
id: 2,
icon: '/static/image/chat/longTipIcon/zhuanfa.png',
title: '调换', //转发
disabled: false
},
{
id: 4,
icon: '/static/image/chat/longTipIcon/revert.png',
title: '多选',
disabled: false
},
{
id: 5,
icon: '/static/image/chat/longTipIcon/tag.png',
title: '编辑',
disabled: false
},
],
toolTipX: 0,
toolTipY: 0,
currentHandleMsg: {},
customSendBtnStyle: { //发送按钮的自定义样式
padding: '10rpx 20rpx',
},
};
},
created: function() {
//计算页面高度布局
this.windowHeight = this.$u.sys().windowHeight; //H5原始高度,H5键盘收起时会用到
let scrollViewHeight = this.$u.sys().windowHeight * 0.831;
this.scrollViewHeight = scrollViewHeight;
this.scrollTop = scrollViewHeight - 5;
//表情初始化
let emjiList = faceUtil.splitEmojiList();
//这里注释掉不需要的表情,如果放开出来前缀不一样会带来界面适配的问题,后续在处理
/* for (let i = 0; i < this.bigEmojiList.length; i++) {
emjiList.push(this.bigEmojiList[i].list);
} */
this.faceList = emjiList;
//console.log("faceList",this.faceList);
},
watch: {
//监听H5键盘是否拉起的高度
inputFocusFlag: function(inputFocus) {
let that = this;
// #ifdef H5
console.log("输入框焦点变化", inputFocus);
if (inputFocus == true) {
that.showFunBtn = false;
that.showEmojiBox = false;
that.scrollViewHeight = that.$u.sys().windowHeight * 0.48;
console.log("H5键盘打开", that.scrollViewHeight);
} else {
uni.hideKeyboard();
if (!(that.showEmojiBox || that.showFunBtn)) {
let scrollViewHeight = this.windowHeight * 0.831;
that.scrollViewHeight = scrollViewHeight;
console.log("H5键盘收起", that.scrollViewHeight);
}
}
// #endif
},
scrollViewHeight(newVal, oldVal) {
let that = this;
//console.log("监听到列表高度变化,保证最后一条信息不被键盘或者抽屉弹窗挡住");
if (that.messageList.length > 2) {
that.scrollIntoView = "msg_" + that.messageList[that.messageList.length - 2].id;
that.scrollAnimation = false;
setTimeout(function() {
that.scrollAnimation = true;
that.scrollIntoView = "msg_" + that.messageList[that.messageList.length - 1].id;
}, 500);
}
},
},
//监听信息滚动
onReady() {
let that = this;
// 官方api【onKeyboardHeightChange】仅支持APP平台,H5不支持此监听
// #ifdef APP-PLUS
uni.onKeyboardHeightChange(res => {
//console.log("监听到键盘高度变化",res);
//如果键盘弹起
if (res.height != 0) {
that.showFunBtn = false;
that.showEmojiBox = false;
that.scrollViewHeight = (that.$u.sys().windowHeight - res.height) * 0.735;
//console.log("键盘打开",that.scrollViewHeight);
}
//键盘收起
else {
if (!(that.showEmojiBox || that.showFunBtn)) {
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831;
//console.log("键盘收起",that.scrollViewHeight);
}
}
});
// #endif
},
onLoad:function(option){
let that=this;
let param=option.yyyGroup;
if(param!=null&&param!=undefined){
that.yyyGroup=JSON.parse(decodeURIComponent(param));
console.log("that.yyyGroup",that.yyyGroup);
}
that.createMessageList();
},
//监听返回
onBackPress(options) {
this.customBack();
return true;
},
methods:{
createMessageList:function(){
let that=this;
let chatGroupId=that.yyyGroup.chatNumber;
if(this.yyyGroup.chatNumber=="000000"){
if(this.vuex_fileAssist.messageList.length>0){
that.messageList=that.vuex_fileAssist.messageList;
};
}else{
that.messageList=[
{
"id":"01",
"chatGroupId":chatGroupId,
"userId": that.yyyGroup.id,
"meFlag": false,
"userName":that.yyyGroup.nickName,
"userAvatar": that.yyyGroup.avatar,
'messageType': that.messageApi.MSG_TYPE.USER_MSG,
"contentType": that.messageApi.CONTENT_TYPE.TEXT_CONTENT_TYPE,
"content": {
text:that.yyyGroup.userRemark
},
"formatTimeStr": that.yyyGroup.createTime,
"showTimeFlag": true,
"checked":false,
},
{
"id":"02",
"chatGroupId":chatGroupId,
"userId": that.yyyGroup.chatNumber,
"meFlag": false,
"userName":that.yyyGroup.nickName,
"userAvatar": that.yyyGroup.avatar,
'messageType': this.messageApi.MSG_TYPE.SYSTEM_MSG,
"contentType": that.messageApi.CONTENT_TYPE.TEXT_CONTENT_TYPE,
"content": {
text:'以上是打招呼的内容'
},
"formatTimeStr": that.yyyGroup.createTime,
"showTimeFlag":false,
"checked":false,
},
{
"id":"03",
"chatGroupId":chatGroupId,
"userId": that.vuex_userInfo.id,
"meFlag": true,
"userName":"",
"userAvatar": that.vuex_userInfo.avatar ? that.vuex_userInfo.avatar :
"/static/image/default/default-user/default-user.png",
'messageType': that.messageApi.MSG_TYPE.SYSTEM_MSG,
"contentType": that.messageApi.CONTENT_TYPE.TEXT_CONTENT_TYPE,
"content": {
text:"你已添加了"+that.yyyGroup.nickName+",现在可以开始聊天了"
},
"formatTimeStr": that.yyyGroup.sendTimeStr,
"platFrom": this.messageApi.msgPlat,
"showTimeFlag": true,
"checked":false,
},
];
if(that.yyyGroup.messageList&&that.yyyGroup.messageList.length>0){
that.messageList=that.messageList.concat(that.yyyGroup.messageList);
};
}
if(that.messageList.length>0){
that.messageList.map(function(item){
item.checked=false;
});
setTimeout(function(){
that.scrollIntoView = "msg_" + that.messageList[that.messageList.length - 1].id;
},500)
}
},
customBack: function() {
uni.hideKeyboard();
this.hideDrawer();
setTimeout(function(){
uni.switchTab({
url: "/pages/tabbar/group/group"
})
},200)
},
toGroupDetail:function(){
let that=this;
if(that.yyyGroup.chatNumber=="000000"){
let obj={
"lastMsgContent":"",
"messageList":[],
"lastMsgTime":"",
};
this.messageList=[];
this.$u.vuex("vuex_fileAssist",obj);
}
},
//输入框获取到焦点事件
onInputFocus: function(event) {
//console.log("输入框获取到焦点",event);
this.inputFocusFlag = true;
},
//输入框失去焦点事件
onBlur: function(event) {
let that = this;
let text = event.target.value;
console.log("输入框失去焦点", text);
that.inputFocusFlag = false;
},
//键盘确认发送
confirmSendText: function(e) {
let that = this;
this.sendText();
},
//发送文字
sendText: function() {
let that = this;
if (that.sendStr.length < 1) {
uni.hideKeyboard();
that.globalUtil.utilAlert("不能发送空字符串");
return;
} else {
//如果文字中有表情,需要转换处理
let formatStr = this.replaceEmoji(this.sendStr);
let content = {
"text": formatStr, //文本内容
};
that.sendMsg(this.messageApi.MSG_TYPE.USER_MSG,
this.messageApi.CONTENT_TYPE.TEXT_CONTENT_TYPE,
content);
}
},
//控制表情弹窗
changeEmojiBox: function() {
let that = this;
that.showFunBtn = false; //关闭功能盒子
that.showEmojiBox = !that.showEmojiBox; //控制表情弹窗
uni.hideKeyboard(); //隐藏键盘
//这里要根据是否打开表情弹窗控制聊天列表盒子的高度
if (that.showEmojiBox) {
that.chatType = "voice";
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831 - 200;
} else {
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831;
}
},
//切换功能性按钮
changeDrawer() {
let that = this;
that.showEmojiBox = false;
that.showFunBtn = !that.showFunBtn;
uni.hideKeyboard();
if (that.showFunBtn) {
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831 - 200;
} else {
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831;
}
},
//功能弹窗点击事件
funGirdItemClick: function(index) {
let that = this;
if (!that.vuex_WSObj) {
that.globalUtil.utilAlert("网路故障,服务不可达");
return;
}
let id = that.funList[index].id;
that.inputFocusFlag = false;
switch (id) {
case 1:
that.chooseImage(that.messageApi.CONTENT_TYPE.IMG_CONTENT_TYPE); //选择照片
break;
case 2:
//that.chooseVideo(that.messageApi.CONTENT_TYPE.VIDEO_CONTENT_TYPE); //选择视频
break;
case 3:
//that.toSendRedBag(); //发送红包
break;
case 4:
//that.toTransfer(); //转账
break;
default:
break;
}
},
chooseImage(contentType) {
let that = this;
uni.chooseImage({
count: 9,
sizeType: ['original'], //可以指定是原图还是压缩图,默认二者都有
success: (res) => {
for (let i = 0; i < res.tempFilePaths.length; i++) {
uni.getImageInfo({
src: res.tempFilePaths[i],
success: (image) => {
image.tempFilePath = image.path;
let maxW = uni.upx2px(350); //350是定义消息图片最大宽度
let maxH = uni.upx2px(350); //350是定义消息图片最大高度
if (image.width > maxW || image.height > maxH) {
let scale = image.width / image.height;
image.width = scale > 1 ? maxW : maxH * scale;
image.height = scale > 1 ? maxW / scale : maxH;
}
delete image.errMsg;
delete image.path;
setTimeout(function() {
that.uploadFile(image, contentType);
}, 1500);
return;
}
});
}
},
fail() {
console.log("选择图片上传发送异常");
}
});
},
toYYYPerson:function(item){
let that=this;
that.$u.route({
url:'/pages/tabbar/find/yaoyiyao/yaoyiyao-friend-home',
params:{
personInfo:encodeURIComponent(JSON.stringify(that.yyyGroup))
},
//animationType:'slide-in-left'
})
},
//上传文件 contentType 2图片 3视频 4语音 5文件
uploadFile: function(tempFileInfo, contentType) {
let that = this;
//console.log("上传文件本地信息",tempFileInfo);
if (tempFileInfo.errMsg) {
delete tempFileInfo.errMsg;
};
let target = that.$u.api.multipartAddress.target;
const uploadTask = uni.uploadFile({
url: that.$u.api.multipartAddress.updload,
filePath: tempFileInfo.tempFilePath,
name: 'fileName',
header: {
'Access-Control-Allow-Origin': '*',
'TOKEN_IM': that.vuex_token,
},
success: (uploadFileRes) => {
if (uploadFileRes.statusCode == 200 && uploadFileRes.data.length > 0) {
let resObj = JSON.parse(uploadFileRes.data);
if (resObj.code == 200) {
let fileInfo = resObj.data;
let fileMsgObj = Object.assign(tempFileInfo, fileInfo);
fileMsgObj.fileSaveTarget = target;
console.log("发送文件信息参数", fileMsgObj);
that.sendMsg(this.messageApi.MSG_TYPE.USER_MSG, contentType, fileMsgObj);
} else {
console.log("文件上传失败");
}
} else {
console.log("文件上传失败");
}
},
fail: function() {
console.log("文件上传失败");
},
complete: function() {
uni.hideLoading();
}
});
},
//发送信息
//msgType 2用户信息 1系统信息
//contentObj:信息内容 json对象
//contentType:内容类型 1文本
sendMsg: function(msgType, contentType, contentObj) {
let that = this;
let timestamp = new Date().getTime();
let message = {
"id": new Date().getTime() + "",
"chatGroupId": timestamp,
"userId": that.vuex_userInfo.id,
"meFlag": true,
"userName": that.vuex_userInfo.userName,
"userAvatar": that.vuex_userInfo.avatar ? that.vuex_userInfo.avatar :
"/static/image/default/default-user/default-user.png",
'messageType': msgType,
"contentType": contentType,
"content": contentObj,
"createTime": that.globalUtil.getTimeStr(timestamp),
"formatTimeStr":that.globalUtil.getTimeStr(timestamp,'M'),
"timestamp": timestamp,
"platFrom": this.messageApi.msgPlat,
"showTimeFlag":false,
"linkName":"",
"checked":false,
};
console.log("发送信息", message);
this.messageList.push(message);
that.sendStr="";
//这里要设置一下最后发送的信息内容
this.setLastMsgContent(message);
setTimeout(function(){
that.scrollIntoView = "msg_" + message.id;
},500);
},
//设置最后一条信息发送内容
setLastMsgContent:function(message){
let that=this;
let formatContent="";
let contentType=message.contentType;
let contentObj=message.content;
switch (contentType+""){
case "1":
formatContent=contentObj.text;
formatContent=formatContent.replace(/\n/g,",");
formatContent=formatContent.replace(/face\[([^\s\[\]]+?)]/g, function(face) {
return face.replace(/^face/g, '')
});
break;
case "2":
formatContent="[图片]";
break;
case "3":
formatContent="[视频]";
break;
case "4":
formatContent="[语音]";
break;
case "7":
formatContent="[红包]";
break;
case "10":
formatContent="[聊天记录]";
break;
case "11":
formatContent="[图文]";
break;
case "12":
formatContent="[视频文字]";
break;
default:
formatContent="[其他]";
break;
};
console.log("最后一条信息",formatContent);
console.log("群号",this.yyyGroup.chatNumber);
if(this.yyyGroup.chatNumber=="000000"){
let obj={
"lastMsgContent":formatContent,
"messageList":that.messageList,
"lastMsgTime":message.formatTimeStr,
};
this.$u.vuex("vuex_fileAssist",obj);
return;
}else{
let yyy_groupList=JSON.parse(JSON.stringify(this.vuex_yyyFriendList));
yyy_groupList.map(function(item){
if(item.chatNumber==that.yyyGroup.chatNumber){
item.lastMsgContent=formatContent;
item.sendTimeStr=message.createTime;
item.messageList.push(message);
console.log("动态加载最后一条信息",item.chatNumber);
}
});
this.$u.vuex("vuex_yyyFriendList",yyy_groupList);
return;
}
},
//删除表情和文字
delSendStr: function() {
//console.log("删除表情",this.sendStr);
let emojiStr = this.sendStr;
let emojiArr = [];
emojiStr = emojiStr.replace(/\[([^(\]|\[)]*)\]/g, function(item, index) {
emojiArr.unshift(item);
});
if (emojiArr.length > 0) {
if (this.sendStr.endsWith(emojiArr[0])) {
this.sendStr = this.sendStr.replace(emojiArr[0], "");
} else {
this.sendStr = this.sendStr.slice(0, this.sendStr.length - 1);
}
} else {
this.sendStr = this.sendStr.slice(0, this.sendStr.length - 1);
}
},
//清除文本
clearSendStr: function() {
console.log("长按删除")
this.sendStr = "";
},
hideDrawer: function() {
let that = this;
if (this.showFunBtn == true) {
uni.hideKeyboard();
this.showFunBtn = false;
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831;
}
if (this.showEmojiBox == true) {
uni.hideKeyboard();
this.showEmojiBox = false;
that.scrollViewHeight = that.$u.sys().windowHeight * 0.831;
}
},
//操作项
showToolTip: function(e, index) {
let that = this;
that.toolTipX = e.touches[0].clientX;
that.toolTipY = e.touches[0].clientY;
that.toolTipFlag = !that.toolTipFlag;
that.currentHandleMsg = that.messageList[index];
that.currentHandleMsg.msgIndex = index;
},
tapPopup(e) {
let that = this;
console.log("点击菜单",e);
if (e.title == "撤回") {
//that.revertMsg();
}
if (e.title == "复制") {
let content = that.currentHandleMsg.content;
if (content) {
let copyContent =content.text;
console.log("复制的内容", copyContent);
let formatStr = this.replaceReseverEmoji(copyContent);
console.log("复制转义后的内容", formatStr);
that.globalUtil.uniCopy({
content: formatStr,
success: (res) => {
uni.showToast({
title: res,
icon: 'none'
})
},
error: (e) => {
uni.showToast({
title: e,
icon: 'none',
duration: 3000,
})
}
})
}
that.toolTipFlag = false;
return;
}
if (e.title == "转发") {
that.toolTipFlag = false;
that.$u.route({
url: '/pages/chat/chatGroup/msgForward',
params: {
msgList:encodeURIComponent(JSON.stringify([that.currentHandleMsg])),
sendType: 1, //1 单条转发 2多条转发
}
})
return
}
if(e.title=="调换"){
that.toolTipFlag = false;
}
if (e.title == "多选") {
that.toolTipFlag = false;
that.$u.route({
url: '/pages/chat/chatting/chatting-checkbox',
})
return
}
if(e.title=="编辑"){
that.toolTipFlag = false;
return
}
},
checkChange:function(msg){
let isExist = this.checkedMessages.some(item=>item.id===msg.id);
if(!isExist){
this.checkedMessages.push(msg);
}else{
this.checkedMessages = this.checkedMessages.filter(function(item) {
return item.id!=msg.id;
});
}
console.log("this.checkedMessages",this.checkedMessages);
},
handleMessageMenu:function(menuItem,messageItem){
let that=this;
console.log("messageItem",messageItem);
let title= menuItem.title;
switch (title){
case '复制':
let copyContent =messageItem.content.text;
console.log("复制的内容", copyContent);
let formatStr = this.replaceReseverEmoji(copyContent);
console.log("复制转义后的内容", formatStr);
that.globalUtil.uniCopy({
content: formatStr,
success: (res) => {
console.log("复制成功");
},
error: (e) => {
uni.showToast({
title: e,
icon: 'none',
duration: 3000,
})
}
})
break;
case '转发':
break;
case '多选':
that.checkBoxFlag=true;
break;
default:
break;
}
},
showZhuanFaPop:function(){
let that=this;
that.zhuanFaPopFlag=true;
},
confirmToZhuanFa:function(index){
this.zhuanFaPopFlag=false;
this.checkBoxFlag=false;
let num=this.checkedMessages.length;
//这里就提前处理一下信息记录到转发的
console.log("选择要转发的信息记录",num);
let param=null;
if(num>0){
param=encodeURIComponent(JSON.stringify(this.checkedMessages));
};
this.checkedMessages=[];
this.messageList.map(function(item){
item.checked=false;
});
this.$u.route({
url:'/pages/tabbar/find/yaoyiyao/yaoyiyao-chatting/yaoyiyao-zhuanfa-pop',
params:{
checkedMessages:param
}
})
},
replaceReseverEmoji: function(str) {
let replacedStr = str.replace(/face\[([^\s\[\]]+?)]/g, function(face) {
let alt = face.replace(/^face/g, '');
return alt;
})
console.log("replacedStr", replacedStr);
return replacedStr;
},
//表情替换
replaceEmoji(str) {
let that = this;
let replacedStr = str.replace(/\[([^(\]|\[)]*)\]/g, (item, index) => {
for (let i = 0; i < this.faceList.length; i++) {
let row = this.faceList[i];
for (let j = 0; j < row.length; j++) {
let EM = row[j];
if (EM == item) {
//console.log("EM: " + EM);
let imgstr = "face" + EM;
return imgstr;
}
}
}
});
//console.log("replacedStr", replacedStr);
return replacedStr;
},
}
}
</script>
<style lang="scss" scoped>
.custom-navbar {
width: 100%;
display: flex;
flex: 1;
flex-direction: row;
justify-content: space-between;
align-content: center;
align-items: center;
padding: 0 30rpx;
.nav-left {}
.nav-center {
font-size: 36rpx;
font-weight: bold;
}
.nav-right {}
}
.msg-container {
//width: 100%;
.msg-box-scroller {
::-webkit-scrollbar {
display: none;
height: 0;
width: 0;
}
background-color: #f0f0f0;
}
}
.footer-container {
&-showfn {
padding-bottom: 0rpx;
padding-bottom: calc(420rpx + constant(safe-area-inset-bottom));
padding-bottom: calc(420rpx + env(safe-area-inset-bottom));
}
&-box {
height: auto;
min-height: calc(100vh - env(safe-area-inset-top) - 200rpx);
box-sizing: content-box;
position: relative;
padding-bottom: 120rpx;
}
.input-box {
position: fixed;
bottom: 20;
left: 0;
width: 100%;
box-sizing: content-box;
z-index: 999;
background-color: #f9f9f9 !important;
&-flex {
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: nowrap;
flex-direction: row;
padding: 20rpx;
box-sizing: border-box;
image {
width: 60rpx;
height: 60rpx;
}
.icon_img {
margin-right: 20rpx;
}
.icon_btn_add {
margin-left: 20rpx;
}
&-grow {
flex-grow: 1;
.content {
box-sizing: border-box;
background-color: #fff;
height: 80rpx;
padding: 0 20rpx;
border-radius: 12rpx;
font-size: 30rpx;
caret-color: $uni-color-success;
}
.textArea-box {
width: 100%;
background-color: #FFFFFF;
border-radius: 10upx;
//padding-left: 30upx;
min-height: 70upx;
display: flex;
align-items: center;
textarea {
width: 100%;
}
}
.inputScroll {
max-height: 180upx;
}
/* 语音标题 */
.voice_title {
text-align: center;
background-color: #ffffff;
height: 80rpx;
line-height: 80rpx;
border-radius: 12rpx;
font-weight: bold;
font-size: 32rpx;
}
}
.btn {
margin-left: 20rpx;
background-color: $u-success;
border: none;
}
}
.fun-box {
opacity: 0;
transition: all 0.1s ease-in-out;
height: 0;
.grid-text {
padding-top: 10rpx;
color: $uni-text-color-grey;
font-size: 30rpx;
}
}
.show-fun-box {
opacity: 1;
height: 400rpx;
.emoji-swiper {
height: 400rpx;
swiper-item {
display: flex;
align-content: flex-start;
flex-wrap: wrap;
view {
width: 12%;
height: 16vw;
display: flex;
justify-content: center;
align-items: center;
image {
width: 8.4vw;
height: 8.4vw;
}
}
}
}
}
}
/* 语音动画 */
.voice_an {
width: 300rpx;
height: 300rpx;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -55%);
background-color: rgba(41, 41, 41, 0.7);
color: white;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
border-radius: 10rpx;
.text {
padding-top: 30rpx;
}
@keyframes runVoice {
0% {
height: 10%;
}
20% {
height: 50%;
}
50% {
height: 100%;
}
80% {
height: 50%;
}
100% {
height: 0%;
}
}
.wave {
width: 6rpx;
height: 100%;
margin-left: 10rpx;
border-radius: 50rpx;
background-color: #999;
vertical-align: middle;
display: inline-block;
}
.voice_an_icon {
width: 200rpx;
height: 100rpx;
line-height: 50rpx;
margin: 50rpx 0;
}
.voice_an_icon #one {
animation: runVoice 0.6s infinite 0.1s;
}
.voice_an_icon #two {
animation: runVoice 0.6s infinite 0.3s;
}
.voice_an_icon #three {
animation: runVoice 0.6s infinite 0.6s;
}
.voice_an_icon #four {
animation: runVoice 0.6s infinite 0.1s;
}
.voice_an_icon #five {
animation: runVoice 0.6s infinite 0.3s;
}
.voice_an_icon #six {
animation: runVoice 0.6s infinite 0.6s;
}
.voice_an_icon #seven {
animation: runVoice 0.6s infinite 0.1s;
}
}
}
</style>
<style>
page {
background-color: #F8F8F8;
}
</style>