|
@@ -1,49 +1,51 @@
|
|
|
<template>
|
|
|
<div class="container">
|
|
|
- <van-index-bar class="list">
|
|
|
- <template v-for="(group, groupIndex) in memberGroups" :key="group.index">
|
|
|
- <van-index-anchor :index="group.index" />
|
|
|
- <van-checkbox-group v-model="checked">
|
|
|
- <van-cell-group inset>
|
|
|
- <van-cell
|
|
|
- v-for="(item, index) in group.members"
|
|
|
- :key="item.id"
|
|
|
- clickable
|
|
|
- @click="toggle(groupIndex, index, item)"
|
|
|
- >
|
|
|
- <template #icon>
|
|
|
- <van-checkbox checked-color="#4765DD"
|
|
|
- :name="item"
|
|
|
- :ref="el => setCheckboxRef(groupIndex, index, el)"
|
|
|
- :disabled="joinedIds.has(item.uuid)"
|
|
|
- @click.stop
|
|
|
- />
|
|
|
- </template>
|
|
|
- <template #title>
|
|
|
- <div class="cell-item">
|
|
|
- <van-image class="img-icon" round :src="item.avatar" />
|
|
|
- <div>{{ item.nickname }}</div>
|
|
|
- <span v-if="joinedIds.has(item.uuid)" class="joined-tag">已在群</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </van-cell>
|
|
|
- </van-cell-group>
|
|
|
- </van-checkbox-group>
|
|
|
- </template>
|
|
|
- </van-index-bar>
|
|
|
-
|
|
|
- <div class="footer-box">
|
|
|
- <div class="avatar-list">
|
|
|
- <van-image
|
|
|
- v-for="item in checked"
|
|
|
- :key="item.id"
|
|
|
- class="img-icon"
|
|
|
- round
|
|
|
- :src="item.avatar"
|
|
|
- />
|
|
|
+ <van-loading class="load-box" size="24px" v-if="loading">加载中...</van-loading>
|
|
|
+ <template v-else>
|
|
|
+ <van-index-bar class="list">
|
|
|
+ <template v-for="(group, groupIndex) in memberGroups" :key="group.index">
|
|
|
+ <van-index-anchor :index="group.index" />
|
|
|
+ <van-checkbox-group v-model="checked">
|
|
|
+ <van-cell-group inset>
|
|
|
+ <van-cell
|
|
|
+ v-for="(item, index) in group.members"
|
|
|
+ :key="item.id"
|
|
|
+ clickable
|
|
|
+ @click="toggle(groupIndex, index, item)"
|
|
|
+ >
|
|
|
+ <template #icon>
|
|
|
+ <van-checkbox checked-color="#4765DD"
|
|
|
+ :name="item"
|
|
|
+ :ref="el => setCheckboxRef(groupIndex, index, el)"
|
|
|
+ :disabled="joinedIds.has(item.uuid)"
|
|
|
+ @click.stop
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <template #title>
|
|
|
+ <div class="cell-item">
|
|
|
+ <van-image class="img-icon" round :src="item.avatar" />
|
|
|
+ <div>{{ item.nickname }}</div>
|
|
|
+ <span v-if="joinedIds.has(item.uuid)" class="joined-tag">已在群</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ </van-cell-group>
|
|
|
+ </van-checkbox-group>
|
|
|
+ </template>
|
|
|
+ </van-index-bar>
|
|
|
+ <div class="footer-box">
|
|
|
+ <div class="avatar-list">
|
|
|
+ <van-image
|
|
|
+ v-for="item in checked"
|
|
|
+ :key="item.id"
|
|
|
+ class="img-icon"
|
|
|
+ round
|
|
|
+ :src="item.avatar"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="btn" :class="checked.length == 0?'':'active-btn'" @click="submit">完成({{ checked.length }})</div>
|
|
|
</div>
|
|
|
- <div class="btn" :class="checked.length == 0?'':'active-btn'" @click="submit">完成({{ checked.length }})</div>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -54,6 +56,7 @@ import {getFirstLetter} from "@/utils/utils";
|
|
|
import { useWalletStore } from "@/stores/modules/walletStore";
|
|
|
import { useWebSocketStore } from "@/stores/modules/webSocketStore.js";
|
|
|
import { showToast } from "vant";
|
|
|
+import { MSG_TYPE, MESSAGE_TYPE_USER,MESSAGE_TYPE_GROUP } from "@/common/constant/msgType";
|
|
|
const IM_PATH = import.meta.env.VITE_IM_PATH_FIlE;
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
@@ -63,6 +66,7 @@ const wsStore = useWebSocketStore();
|
|
|
|
|
|
const checked = ref([]);
|
|
|
const memberGroups = ref([]);
|
|
|
+const loading = ref(false);
|
|
|
|
|
|
// 已加入群的成员数组
|
|
|
const dataArr = route.query.arr ? JSON.parse(route.query.arr) : [];
|
|
@@ -70,31 +74,35 @@ const dataArr = route.query.arr ? JSON.parse(route.query.arr) : [];
|
|
|
const joinedIds = new Set(dataArr.map(m => m.uuid));
|
|
|
|
|
|
const getuserList = async () => {
|
|
|
- const res = await userList({ uuid: walletStore.account });
|
|
|
- const groupedMap = {};
|
|
|
+ loading.value = true;
|
|
|
+ try {
|
|
|
+ const res = await userList({ uuid: walletStore.account });
|
|
|
+ const groupedMap = {};
|
|
|
|
|
|
- res.data?.userList?.forEach(user => {
|
|
|
- const name = user.nickname || '';
|
|
|
- user.avatar = user.avatar ? IM_PATH + user.avatar : user.avatar
|
|
|
- const firstLetter = getFirstLetter(name); // 获取首字母
|
|
|
+ res.data?.userList?.forEach(user => {
|
|
|
+ const name = user.nickname || '';
|
|
|
+ user.avatar = user.avatar ? IM_PATH + user.avatar : user.avatar
|
|
|
+ const firstLetter = getFirstLetter(name); // 获取首字母
|
|
|
|
|
|
- if (!groupedMap[firstLetter]) {
|
|
|
- groupedMap[firstLetter] = [];
|
|
|
- }
|
|
|
+ if (!groupedMap[firstLetter]) {
|
|
|
+ groupedMap[firstLetter] = [];
|
|
|
+ }
|
|
|
|
|
|
- groupedMap[firstLetter].push({...user});
|
|
|
- });
|
|
|
+ groupedMap[firstLetter].push({...user});
|
|
|
+ });
|
|
|
|
|
|
- // 转为数组并按 index 排序
|
|
|
- const groupedList = Object.keys(groupedMap)
|
|
|
- .sort()
|
|
|
- .map(letter => ({
|
|
|
- index: letter,
|
|
|
- members: groupedMap[letter]
|
|
|
- }));
|
|
|
+ // 转为数组并按 index 排序
|
|
|
+ const groupedList = Object.keys(groupedMap)
|
|
|
+ .sort()
|
|
|
+ .map(letter => ({
|
|
|
+ index: letter,
|
|
|
+ members: groupedMap[letter]
|
|
|
+ }));
|
|
|
|
|
|
- memberGroups.value = groupedList;
|
|
|
- console.log(memberGroups.value)
|
|
|
+ memberGroups.value = groupedList;
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const checkboxRefs = ref([]);
|
|
@@ -119,8 +127,9 @@ const toggle = (groupIndex, index, item) => {
|
|
|
|
|
|
const submit = async () => {
|
|
|
if(checked.value.length == 0) return;
|
|
|
- console.log("已选择成员:", checked.value.uuid);
|
|
|
+ console.log("已选择成员:", checked.value);
|
|
|
const ids = checked.value.map(item => item.id);//创建群需要id
|
|
|
+ const uname = checked.value.map(item => item.nickname).join('、');
|
|
|
const uuids = checked.value.map(item => item.uuid);//添加成员需要uuid
|
|
|
if(route.name == 'addMember'){
|
|
|
// 添加成员加入群组
|
|
@@ -146,12 +155,19 @@ const submit = async () => {
|
|
|
userIds:ids
|
|
|
});
|
|
|
console.log(res)
|
|
|
+ const message = {
|
|
|
+ content: `你邀请${uname}加入了群聊`,
|
|
|
+ contentType: MSG_TYPE.JION_GROUP, // 99: 加入群
|
|
|
+ messageType: 2,
|
|
|
+ };
|
|
|
+ wsStore.sendMessage(message);
|
|
|
if(res.code == 200){
|
|
|
router.push('im')
|
|
|
}else{
|
|
|
showToast('创建失败')
|
|
|
}
|
|
|
} catch (error) {
|
|
|
+ console.log(error)
|
|
|
showToast('创建失败')
|
|
|
}
|
|
|
}
|
|
@@ -162,6 +178,10 @@ onMounted(() => {
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
+.load-box{
|
|
|
+ text-align: center !important;
|
|
|
+ margin-top: 50px !important;
|
|
|
+}
|
|
|
.container{
|
|
|
display: flex;
|
|
|
flex-direction: column;
|