Files
2023-09-24 17:55:19 +08:00

570 lines
14 KiB
Plaintext
Raw Permalink 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 class="pages">
<view class="usersInfo">
<scroll-view class="usersInfo" scroll-y="true" :enable-flex="true" >
<view style="height: 150px;width: 750rpx;flex-direction: row;flex-wrap: wrap;">
<view class="invite-box">
<view class="invite">
<uni-icons @click="invite" color="#989898" size="20px" class="plusempty" type="plusempty">
</uni-icons>
</view>
<text class="nickname">邀请</text>
</view>
<view class="item" v-for="(item,index) in member_list" :key="index">
<image class="avatar"
:src="item.avatar_file ? item.avatar_file.url:'/uni_modules/uni-im/static/avatarUrl.png'"
mode="widthFix"></image>
<text class="nickname">{{item.nickname||'匿名用户'}}</text>
<uni-icons @click="expel(item)" v-if="manage" color="#e64348" size="20px" class="minus-filled"
type="minus-filled">
</uni-icons>
</view>
</view>
</scroll-view>
</view>
<uni-list>
<uni-list-item @click="toQRCode" :clickable="true" title="群号和二维码" v-if="conversation.group_id" link>
<template v-slot:footer>
<view class="slot-code">
<!-- <text class="group-name"></text> 先省略,后续会建群号表关联 -->
<image class="group-code" src="/uni_modules/uni-im/static/qrCode.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item>
<uni-list-item @click.native="openPopupInfo('editorName')" title="群聊名称" :showArrow="isAdmin" :clickable="true">
<template v-slot:footer>
<text class="introduction">{{conversation.group_info.name}}</text>
</template>
</uni-list-item>
<uni-list-item @click.native="openPopupInfo('editorInfo')" title="简介" :showArrow="isAdmin" :clickable="true">
<template v-slot:footer>
<text class="introduction">{{conversation.group_info.introduction || '未设置'}}</text>
</template>
</uni-list-item>
<uni-list-item @click.native="setAvatar" title="群头像" :clickable="true">
<template v-slot:footer>
<image class="logo" :src="logoUrl||'/uni_modules/uni-im/static/avatarUrl.png'" mode=""></image>
</template>
</uni-list-item>
<uni-list-item @click.native="setAddGroupType" title="加群方式" note="申请加入本群的验证规则" :clickable="true">
<template v-slot:footer>
<text class="join_option">{{join_option}}</text>
</template>
</uni-list-item>
</uni-list>
<button class="exitGroup" @click="exitGroup">{{isAdmin?'解散群聊':'退出群聊'}}</button>
<uni-popup ref="popupInfo" type="dialog">
<uni-popup-dialog mode="input" :title="editorType == 'editorName'?'编辑群聊名称':'编辑群聊简介'"
:placeholder="editorType == 'editorName'?'请输入群聊名称':'请输入群聊简介'" :duration="2000" :before-close="true"
:value="value" @close="closePopupInfo" @confirm="confirmPopupInfo"></uni-popup-dialog>
</uni-popup>
</view>
</template>
<script>
const db = uniCloud.database()
import uniIm from '@/uni_modules/uni-im/lib/main.js';
export default {
data() {
return {
conversation:{
group_info:{
user_id:""
},
group_member:{}
},
member_list:[],
manage: false,
editorType: '',
value: '',
groupType: '',
isAdmin:false
};
},
computed: {
...uniIm.mapState(['isWidescreen']),
logoUrl() {
return this.conversation.group_info.avatar_file ? this.conversation.group_info.avatar_file.url :
false
},
join_option() {
let val = this.conversation.group_info.join_option
return {
needPermission: "需要验证权限",
freeAccess: "自由加入",
disableApply: "禁止加入"
} [val]
}
},
watch: {
"conversation.group_info.user_id"(adminUserId){
this.isAdmin = adminUserId == uniCloud.getCurrentUserInfo().uid
//非群主 隐藏【管理】按钮
if (!this.isAdmin) {
if(!this.isWidescreen){
// #ifdef H5
let dom = document.getElementsByClassName('uni-page-head-btn')[1]
dom.style.visibility = 'hidden'; // 隐藏元素
// #endif
// #ifdef APP-PLUS
var webview = this.$scope.$getAppWebview();
// console.log('webview', webview);
webview.setStyle({
titleNView:{
buttons:[]
}
});
// #endif
}
}else{
if(this.isWidescreen){
this.manage = true
}
}
},
"conversation.group_member":{
handler(group_member, oldValue) {
console.log('group_member',group_member);
this.member_list = []
for (let key in group_member) {
this.member_list.push(group_member[key])
}
let title = "群信息(" + this.member_list.length + "人)"
uni.setNavigationBarTitle({
title
});
},
deep:true,
immediate:true
}
// (后续)通过监听实现实时切换管理员实时刷新权限
// console.log('isAdmin',isAdmin);
},
props: {
conversation_id: {
default(){
return false
}
},
},
async onLoad(e) {
if(!e.conversation_id){
throw new Error("会话id不能为空")
}
this.load(e.conversation_id)
},
mounted() { //pc端以组件模式加载时逻辑
if(this.conversation_id){
this.load(this.conversation_id)
}
},
onShow() {
// console.log("this.conversation: ", this.conversation.group_member);
},
onNavigationBarButtonTap(e) {
if (e.index === 0) {
this.manage = !this.manage
// #ifdef H5
let dom = document.getElementsByClassName('uni-btn-icon')[1]
// console.log("dom:22 ", dom);
dom.innerHTML = this.manage ? "退出管理" : "管理"
// #endif
// #ifdef APP-PLUS
var webview = this.$scope.$getAppWebview();
webview.setTitleNViewButtonStyle(0, {
text: this.manage ? "退出" : "管理"
});
// #endif
}
},
methods: {
async load(conversation_id){
this.conversation = await uniIm.conversation.get(conversation_id)
},
async expel(item) {
uni.showModal({
title: '确定要将该用户移出本群吗?',
content: '不能撤销,请谨慎操作',
cancelText: '取消',
confirmText: '确认',
complete: async (e) => {
// console.log(e);
if (e.confirm) {
uni.showLoading({
mask: true
});
try{
let res = await db.collection('uni-im-group-member').where({
user_id: item._id,
group_id: this.conversation.group_info._id
})
.remove()
if (res.result.deleted) {
uni.showToast({
title: '成功移除',
icon: 'none',
complete: () => {}
});
// console.log('exitGroup', res);
}
}catch(error){
uni.showToast({
title: error.message,
icon: 'error',
complete: () => {}
});
//TODO handle the exception
}
uni.hideLoading()
}
}
});
},
invite() {
console.log('group_info._id', this.conversation.group_info._id);
uni.navigateTo({
url: '/uni_modules/uni-im/pages/contacts/createGroup/createGroup?group_id=' + this
.conversation.group_info._id
})
},
async exitGroup() {
const group_id = this.conversation.group_info._id
if (this.isAdmin) {
uni.showModal({
title: '确认要解散群聊吗?',
content: '不能撤销,请谨慎操作',
cancelText: '取消',
confirmText: '确认',
complete: async (e) => {
console.log(e);
if (e.confirm) {
uni.showLoading({
mask: true
});
let res = await db.collection('uni-im-group')
.where({
_id: group_id
})
.remove()
.finally((res) => {
// uni.navigateBack({ // 收到离群的推送通知会自动关闭当前页面
// delta: 2
// })
uni.hideLoading()
})
console.log('exitGroup', res);
}
}
});
} else {
uni.showModal({
title: '确认要退出群聊吗?',
content: '不能撤销,请谨慎操作',
cancelText: '取消',
confirmText: '确认',
complete: async (e) => {
console.log(e);
if (e.confirm) {
// uni.navigateBack({ // 收到离群的推送通知会自动关闭当前页面
// delta: 2
// })
uni.showLoading({
mask: true
});
let res = await db.collection('uni-im-group-member').where({
user_id: uniCloud.getCurrentUserInfo().uid,
group_id
})
.remove()
if (res.result.deleted) {
uni.showToast({
title: '成功退出',
icon: 'none'
});
}
uni.hideLoading()
console.log('exitGroup', res);
}
}
});
}
},
openPopupInfo(type) {
console.log(type);
if (!this.isAdmin) return
this.editorType = type
console.log(this.conversation.group_info.name, 11);
console.log(this.conversation.group_info.introduction, 22);
if (type == 'editorName' && this.conversation.group_info.name) {
this.value = this.conversation.group_info.name
} else if (type == 'editorInfo' && this.conversation.group_info.introduction) {
this.value = this.conversation.group_info.introduction
} else {
this.value = ''
}
this.$refs.popupInfo.open()
},
closePopupInfo() {
this.$refs.popupInfo.close()
},
confirmPopupInfo(value) {
if (!value) {
uni.showToast({
title: '内容不能为空!',
icon: 'none'
});
return
}
console.log('----', value);
if (this.editorType == 'editorName') {
// 改群名称
this.editGroupInfo({
name: value
})
} else {
this.editGroupInfo({
introduction: value
})
}
this.$refs.popupInfo.close()
},
setAddGroupType() {
if (!this.isAdmin) return
uni.showActionSheet({
itemList: ['自由加入', '需要验证权限', '禁止加入'],
success: (e) => {
let join_option = ['freeAccess', 'needPermission', 'disableApply'][e.tapIndex]
this.editGroupInfo({
join_option
})
},
fail: (err) => {
console.log("err: ", err);
}
})
},
async editGroupInfo(group_info) {
console.log('group_info---------',group_info);
this.conversation.group_info = Object.assign(this.conversation.group_info,group_info)
let res = await db.collection('uni-im-group')
.doc(this.conversation.group_id)
.update(group_info)
console.log('change group info', res.result.updated,this.conversation);
},
async setAvatar() {
if (!this.isAdmin) return
const crop = {
quality: 100,
width: 600,
height: 600,
resize: true
};
uni.chooseImage({
count: 1,
crop,
success: async (res) => {
console.log(899889,res);
let tempFile = res.tempFiles[0],
avatar_file = {
// #ifdef H5
extname: tempFile.name.split('.')[tempFile.name.split('.').length - 1],
// #endif
// #ifndef H5
extname: tempFile.path.split('.')[tempFile.path.split('.').length - 1]
// #endif
},
filePath = res.tempFilePaths[0]
// #ifndef APP-PLUS
//非app端用前端组件剪裁头像app端用内置的原生裁剪
let isPC = false
// #ifdef H5
isPC = !['ios', 'android'].includes(uni.getSystemInfoSync().platform)
// #endif
if (!isPC) {
filePath = await new Promise((callback) => {
uni.navigateTo({
url: '/uni_modules/uni-id-pages/pages/userinfo/cropImage/cropImage?path=' +
filePath + `&options=${JSON.stringify(crop)}`,
animationType: "fade-in",
events: {
success: url => {
callback(url)
}
},
complete(e) {
// console.log(e);
}
});
})
}
// #endif
// console.log(this.userInfo);
let cloudPath = uniCloud.getCurrentUserInfo().uid + '' + Date.now()
avatar_file.name = cloudPath
uni.showLoading({
title: "更新中",
mask: true
});
let {
fileID
} = await uniCloud.uploadFile({
filePath,
cloudPath,
fileType: "image"
});
// console.log(result)
avatar_file.url = fileID
// console.log({avatar_file});
uni.hideLoading()
this.editGroupInfo({
avatar_file
})
}
})
},
toQRCode() {
let url = this.logoUrl ? this.logoUrl : ''
uni.navigateTo({
url: '/uni_modules/uni-im/pages/group/groupQRCode?id=' +
this.conversation.group_info._id +
'&name=' + this.conversation.group_info.name +
'&avatar_file=' + url,
complete: (e) => {
// console.log(e);
}
});
}
}
}
</script>
<style lang="less" scoped>
/* #ifndef APP-NVUE */
page,
/* #endif */
.pages {
width: 750rpx;
flex: 1;
background-color: #f5f5f5;
/* #ifndef APP-NVUE */
height: 100vh;
/* #endif */
}
.usersInfo {
flex-direction: row;
// padding: 10px 0;
margin-bottom: 8px;
background-color: #FFFFFF;
flex-wrap: wrap;
}
.item {
width: 150rpx;
margin: 5px 0;
align-items: center;
justify-content: center;
position: relative;
}
.minus-filled {
position: absolute;
top: 0;
right: 5px;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.avatar {
width: 100rpx;
height: 100rpx;
border-radius: 10px;
}
.nickname {
width: 150rpx;
text-align: center;
font-size: 14px;
color: #666;
padding: 0 16rpx;
/* #ifndef APP-NVUE */
white-space: nowrap;
/* #endif */
overflow: hidden;
text-overflow: ellipsis;
lines:1;
}
.logo {
width: 50px;
height: 50px;
}
.invite-box {
align-items: center;
}
.invite {
width: 100rpx;
height: 100rpx;
margin: 5px 0;
justify-content: center;
border-radius: 10px;
background-color: #f5f5f5;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.exitGroup {
margin: 10px 0;
background-color: #FFFFFF;
padding: 6px 0;
color: #e64141;
border-radius: 0;
}
/* #ifndef APP-NVUE */
.exitGroup::after {
display: none;
}
/* #endif */
.introduction {
color: #666;
font-size: 14px;
/* #ifndef APP-NVUE */
max-width: 560rpx;
/* #endif */
/* #ifdef APP-NVUE */
width: 560rpx;
/* #endif */
text-align: right;
}
.join_option {
color: #666;
font-size: 14px;
}
.slot-code {
align-items: center;
flex-direction: row;
}
.group-code {
width: 50rpx;
height: 50rpx;
margin-left: 10rpx;
}
</style>