1216 lines
33 KiB
Vue
1216 lines
33 KiB
Vue
|
|
<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&¶m!=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>
|