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

295 lines
7.3 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="create-group-box">
<view class="header-box">
<uni-search-bar v-model="keyword"
placeholder="搜索" bgColor="#fff"
:radius="100"
@confirm="getFriendsData"
@cancel="doClear"
@clear="doClear"
></uni-search-bar>
<!--
checkFriendsSearchWidth
<view v-if="checkFriendIds.length" class="image-box"
:style="{'width':checkFriendsWidth + 'rpx','transform':'translateX' + ( translateXWidth + 'rpx')}">
<image v-for="(img,index) in checkFriendImg" :key="index"
class="avatar" :src="img && img.url ? img.url : '/uni_modules/uni-im/static/avatarUrl.png'"
></image>
</view> -->
</view>
<view class="content-box">
<checkbox-group @change="checkboxChange">
<label v-for="(item,index) in friendList" :key="index" class="label-box" >
<checkbox :value="item._id" class="checkbox" />
<view>
<uni-list :border="false">
<uni-list-chat :avatar-circle="true"
:title="item.nickname"
:avatar="item.avatar_file && item.avatar_file.url ? item.avatar_file.url : '/uni_modules/uni-im/static/avatarUrl.png'"
>
</uni-list-chat>
</uni-list>
</view>
</label>
</checkbox-group>
</view>
<view class="foot-box">
<!-- 创建新群可以不选择好友直接创建,要求好友进群必须选择好友 -->
<button :disabled="group_id? !checkFriendIds.length : false " class="btn" type="primary" @click="createGroup">{{btnText}}{{checkFriendNum}}</button>
</view>
<uni-load-more :status="loading?'loading':(hasMore?'hasMore':'noMore')"
:contentText='{"contentnomore": friendList.length?"没有更多好友":"没有可以选择的好友"}'
></uni-load-more>
</view>
</template>
<script>
import uniIm from '@/uni_modules/uni-im/lib/main.js';
const db = uniCloud.database();
export default {
data() {
return {
loading:true,
hasMore: false,
keyword:'',
checkFriendIds: [],
friendData: [],
groupMemberUid:[] ,//选人进群时已经在群里的人的id
group_id:false
}
},
computed: {
friendList(){
return this.friendData.filter(item=>!this.groupMemberUid.includes(item._id))
},
checkFriendNum() {
return this.checkFriendIds.length > 0 ? ''+ this.checkFriendIds.length +'': ''
},
btnText(){
return this.group_id ? '立即邀请' : '立即创建'
},
checkFriendsWidth() {
return this.checkFriendIds.length > 6 ? '360' : this.checkFriendIds.length * 65
},
// checkFriendsSearchWidth() {
// return this.checkFriendIds.length > 6 ? '360' : 720 - (this.checkFriendIds.length * 60)
// },
translateXWidth() {
return this.checkFriendIds.length > 6 ? this.checkFriendIds.length * 65 : '60'
},
checkFriendImg(){
return this.friendList.reduce((sum,current)=>{
if(this.checkFriendIds.includes(current._id)){
sum.push(current)
}
return sum
},[]).map(item=>item.avatar_file)
}
},
async onLoad(options) {
this.setParam(options)
},
methods: {
async setParam(options = {}){
console.log("group_id",options);
if(options.group_id){
this.group_id = options.group_id
uni.setNavigationBarTitle({
title:'邀请新成员'
})
//查本群,成员,
let res = await db.collection('uni-im-group-member').where({
group_id: options.group_id
})
.get()
console.log("res:查本群,成员 ",res);
this.groupMemberUid = res.result.data.map(item=>item.user_id)
console.log('this.groupMemberUid',this.groupMemberUid);
}
this.getFriendsData()
},
async getFriendsData(){
let whereString = {}
if(this.keyword){
whereString = `
"_id" == "${this.keyword}" ||
"username" == "${this.keyword}" ||
"nickname" == "${this.keyword}" ||
"email" == "${this.keyword}" ||
"mobile" == "${this.keyword}"
`
}
let res = await db.collection(
db.collection('uni-im-friend').where('"user_id" == $cloudEnv_uid').field('friend_uid,mark,class_name').getTemp(),
db.collection('uni-id-users').where(whereString).field('_id,nickname,avatar_file').getTemp()
).get()
// console.log(res);
let data = res.result.data
data.forEach((item,index)=>{
if(item.friend_uid[0]){
data[index] = item.friend_uid[0]
}else{
delete data[index]
}
})
this.friendData = data
this.loading = false
this.hasMore = this.friendList.length != 0
},
doClear() {
this.keyword = ''
this.getFriendsData()
},
checkboxChange(e) {
// console.log("checkboxChange-value",e.detail.value);
this.checkFriendIds = e.detail.value
},
async createGroup() {
// console.log('创建', this.checkFriendIds.length)
const uniImCo = uniCloud.importObject("uni-im-co")
let res = await uniImCo.chooseUserIntoGroup({
user_ids:this.checkFriendIds,
group_id:this.group_id
})
this.checkFriendIds = []
// console.log('createGroup',res);
if(this.group_id){
uni.navigateBack({
delta:1
})
}else{
// #ifdef H5
if(uniIm.isWidescreen){
uni.$emit('uni-im-toChat','group_' + res.data.group_id)
}else{
uni.redirectTo({
url: '/uni_modules/uni-im/pages/chat/chat?conversation_id=' + 'group_' + res.data.group_id,
animationDuration: 300,
fail: (e) => {
console.log(e);
}
})
}
// #endif
// #ifndef H5
uni.redirectTo({
url: '/uni_modules/uni-im/pages/chat/chat?conversation_id=' + 'group_' + res.data.group_id,
animationDuration: 300,
complete: (e) => {
console.log(e);
}
})
// #endif
}
}
}
}
</script>
<style lang="scss" scoped>
.create-group-box {
flex: 1;
flex-direction: column;
position: relative;
background-color: #f5f5f5;
/* #ifdef H5 */
align-items: center;
height: 100vh;
padding-top: 60px;
/* #endif */
/* #ifdef MP-WEIXIN */
height: 100vh;
/* #endif */
}
/* #ifdef H5 */
.create-group-box * {
max-width: 950px;
}
/* #endif */
.header-box {
width: 750rpx;
/* #ifdef H5 */
position: fixed;
top: 44px;
z-index: 99;
display: flex;
width: 100%;
/* #endif */
flex-direction: column;
background-color: #f5f5f5;
}
.image-box {
flex-direction: row;
align-items: center;
/* #ifndef APP-NVUE */
transition: 0.3s;
display: flex;
white-space: nowrap;
overflow-x: scroll;
/* #endif */
}
.avatar {
width: 60rpx;
height: 60rpx;
border-radius: 50px;
/* #ifndef APP-NVUE */
flex-shrink: 0;
/* #endif */
}
.content-box .label-box .uni-list-chat__content-title{
line-height: 41px;
}
/* #ifdef H5 */
.content-box ::v-deep .uni-list-chat__content-title {
position: relative;
top: 8px;
}
/* #endif */
.content-box {
/* #ifdef H5 */
// margin-top: 58px;
width: 100%;
/* #endif */
background-color: #fff;
z-index: 10;
}
.label-box{
flex-direction: row;
align-items: center;
height: 80px;
margin-right: 20rpx;
}
.checkbox{
margin: 0 20rpx 0 30rpx;
transform: scale(1.2);
}
.foot-box {
width: 750rpx;
height: 80px;
justify-content: center;
align-items: center;
position: fixed;
bottom: 0;
z-index: 99;
background-color: #f5f5f5;
/* #ifdef H5 */
width: 100%;
@media screen and (min-width:960px){
bottom: 10vh;
// right: 25vw;
}
/* #endif */
}
.btn {
width: 300px;
}
</style>