index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <template>
  2. <div ref="manageRef" class="manage">
  3. <header v-if="!isUniFrameWork || currentTab === 'admin'" class="manage-header">
  4. <div @click="back">
  5. <Icon :file="backSVG" />
  6. </div>
  7. <div class="manage-header-content">
  8. {{ TUITranslateService.t(`TUIGroup.${TabName}`) }}
  9. </div>
  10. </header>
  11. <main v-if="!currentTab || (isUniFrameWork && currentTab != 'admin')" class="main">
  12. <ManageName
  13. class="space-top"
  14. :isAuthor="isAuthor"
  15. :data="currentGroup"
  16. @update="updateProfile"
  17. />
  18. <div class="user-info space-top">
  19. <header class="user-info-header" @click="setCurrentTab('member')">
  20. <label class="user-info-header-left">
  21. {{ TUITranslateService.t(`TUIGroup.群成员`) }}
  22. </label>
  23. <div class="user-info-header-right">
  24. <span class="span">
  25. {{ currentGroup.memberCount || groupMemberList.length }}
  26. {{ TUITranslateService.t(`TUIGroup.人`) }}
  27. </span>
  28. <Icon :file="rightIcon" />
  29. </div>
  30. </header>
  31. <ol class="user-info-list">
  32. <dl
  33. v-for="(item, index) in groupMemberList.slice(0, showUserNum)"
  34. :key="index"
  35. class="user-info-list-item"
  36. >
  37. <dt class="user-info-list-item-main" @click="handleMemberProfileShow(item)">
  38. <img
  39. class="avatar"
  40. :src="
  41. item.avatar ||
  42. 'https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png'
  43. "
  44. onerror="this.onerror=null;this.src='https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png'"
  45. />
  46. </dt>
  47. <dd class="user-info-list-item-info">
  48. {{ item.nick || item.userID }}
  49. </dd>
  50. </dl>
  51. <dl v-if="isShowAddMember" class="user-info-list-item">
  52. <dt class="avatar" @click="toggleMask('add')">+</dt>
  53. </dl>
  54. <dl v-if="currentSelfRole === 'Owner'" class="user-info-list-item">
  55. <dt class="avatar" @click="toggleMask('remove')">-</dt>
  56. </dl>
  57. </ol>
  58. </div>
  59. <ul class="content list space-top" @click="editLableName = ''">
  60. <li class="list-item" @click="setCurrentTab('notification')">
  61. <aside class="aside">
  62. <label class="label">{{ TUITranslateService.t(`TUIGroup.群公告`) }}</label>
  63. <article class="article">
  64. {{ currentGroup.notification }}
  65. </article>
  66. </aside>
  67. <Icon :file="rightIcon" class="end" />
  68. </li>
  69. <li
  70. v-if="isAdmin && isSetMuteTime"
  71. class="list-item"
  72. @click="setCurrentTab('admin')"
  73. >
  74. <label class="label">{{ TUITranslateService.t(`TUIGroup.群管理`) }}</label>
  75. <Icon :file="rightIcon" />
  76. </li>
  77. <li class="list-item">
  78. <label class="label">{{ TUITranslateService.t(`TUIGroup.群ID`) }}</label>
  79. <div class="groupID">
  80. <span class="span">{{ currentGroupID }}</span>
  81. </div>
  82. </li>
  83. <li class="list-item">
  84. <label class="label">{{ TUITranslateService.t(`TUIGroup.群头像`) }}</label>
  85. <img
  86. class="avatar"
  87. :src="
  88. currentGroup.avatar ||
  89. 'https://web.sdk.qcloud.com/im/demo/TUIkit/web/img/constomer.svg'
  90. "
  91. onerror="this.onerror=null;this.src='https://web.sdk.qcloud.com/im/demo/TUIkit/web/img/constomer.svg'"
  92. />
  93. </li>
  94. <li class="list-item">
  95. <label class="label">{{ TUITranslateService.t(`TUIGroup.群类型`) }}</label>
  96. <span class="span">{{
  97. TUITranslateService.t(`TUIGroup.${typeName[currentGroup.type]}`)
  98. }}</span>
  99. </li>
  100. <li class="list-item">
  101. <label class="label">{{ TUITranslateService.t(`TUIGroup.加群方式`) }}</label>
  102. <span class="span">{{
  103. TUITranslateService.t(`TUIGroup.${typeName[currentGroup.joinOption]}`)
  104. }}</span>
  105. </li>
  106. </ul>
  107. <ul class="footer list space-top">
  108. <li
  109. v-if="currentSelfRole === 'Owner' && groupMemberList.length > 1"
  110. class="list-item"
  111. @click.stop="toggleMask('changeOwner')"
  112. >
  113. {{ TUITranslateService.t(`TUIGroup.转让群组`) }}
  114. </li>
  115. <li
  116. v-if="canIDissmissGroup"
  117. class="list-item"
  118. @click.stop="dismissGroup(currentGroup)"
  119. >
  120. {{ TUITranslateService.t(`TUIGroup.解散群聊`) }}
  121. </li>
  122. <li v-else class="list-item" @click.stop="quitGroup(currentGroup)">
  123. {{ TUITranslateService.t(`TUIGroup.退出群组`) }}
  124. </li>
  125. </ul>
  126. </main>
  127. <ManageMember
  128. v-if="currentTab === 'member'"
  129. :self="currentGroup.selfInfo"
  130. :list="groupMemberList"
  131. :total="~~currentGroup.memberCount"
  132. :isShowDel="currentSelfRole === 'Owner' && canDelMember"
  133. @more="getMember('more')"
  134. @del="submit"
  135. @handleMemberProfileShow="handleMemberProfileShow"
  136. @close="setCurrentTab('')"
  137. />
  138. <ManageProfile
  139. v-if="currentTab === 'profile'"
  140. :userInfo="currentMember"
  141. @close="setCurrentTab('')"
  142. />
  143. <ManageNotification
  144. v-if="currentTab === 'notification'"
  145. :isAuthor="isAuthor"
  146. :data="currentGroup"
  147. @update="updateProfile"
  148. @close="setCurrentTab('')"
  149. />
  150. <ManageAdmin
  151. v-if="currentTab === 'admin'"
  152. v-show="isAdmin"
  153. :isSetMuteTime="isSetMuteTime"
  154. :member="member"
  155. :currentGroup="currentGroup"
  156. @addAdmin="toggleMask('addAdmin')"
  157. @removeAdmin="toggleMask('removeAdmin')"
  158. @setAllMuteTime="setAllMuteTime"
  159. @addMute="toggleMask('addMute')"
  160. @removeMute="toggleMask('removeMute')"
  161. @close="setCurrentTab('')"
  162. />
  163. <MaskLayer :show="mask" @update:show="(e) => (mask = e)">
  164. <Transfer
  165. :title="TUITranslateService.t(`TUIGroup.${transferTitle}`)"
  166. :list="transferList"
  167. :isSearch="isSearch"
  168. :isRadio="isRadio"
  169. :selectedList="selectedList"
  170. :isH5="!isPC"
  171. @submit="submit"
  172. @cancel="cancel"
  173. @search="handleSearchMember"
  174. />
  175. </MaskLayer>
  176. <Dialog
  177. class="deleted-dialog"
  178. :title="TUITranslateService.t(`TUIGroup.删除成员`)"
  179. :show="delDialogShow"
  180. :isH5="!isPC"
  181. :center="true"
  182. :isHeaderShow="isPC"
  183. @submit="handleManage(deletedUserList, 'remove')"
  184. @update:show="(e) => (delDialogShow = e)"
  185. >
  186. <p v-if="deletedUserList.length === 1" class="del-dialog-title">
  187. {{ TUITranslateService.t(`TUIGroup.确定从群聊中删除该成员?`) }}
  188. </p>
  189. <p v-if="deletedUserList.length > 1" class="del-dialog-title">
  190. {{ TUITranslateService.t(`TUIGroup.确定从群聊中删除所选成员?`) }}
  191. </p>
  192. </Dialog>
  193. </div>
  194. </template>
  195. <script lang="ts" setup>
  196. import { ref, computed, watchEffect, onMounted, nextTick } from "../../../adapter-vue";
  197. import TUIChatEngine, {
  198. TUITranslateService,
  199. TUIGroupService,
  200. TUIFriendService,
  201. TUIStore,
  202. StoreName,
  203. IGroupModel,
  204. TUIConversationService,
  205. IConversationModel,
  206. IGroupMember,
  207. } from "@tencentcloud/chat-uikit-engine";
  208. import { TUIGlobal, outsideClick } from "@tencentcloud/universal-api";
  209. import MaskLayer from "../../common/MaskLayer/index.vue";
  210. import Dialog from "../../common/Dialog/index.vue";
  211. import Transfer from "../../common/Transfer/index.vue";
  212. import ManageName from "./manage-name.vue";
  213. import ManageNotification from "./manage-notification.vue";
  214. import ManageMember from "./manage-member.vue";
  215. import ManageProfile from "./manage-profile.vue";
  216. import ManageAdmin from "./manage-admin.vue";
  217. import Icon from "../../common/Icon.vue";
  218. import backSVG from "../../../assets/icon/back.svg";
  219. import rightIcon from "../../../assets/icon/right-icon.svg";
  220. import { Toast, TOAST_TYPE } from "../../common/Toast/index";
  221. import { isPC, isUniFrameWork } from "../../../utils/env";
  222. import Server from "../server";
  223. import { enableSampleTaskStatus } from "../../../utils/enableSampleTaskStatus";
  224. const TUIGroupServer = Server.getInstance();
  225. const TUIConstants = TUIGroupServer.constants;
  226. const props = defineProps({
  227. groupID: {
  228. type: String,
  229. default: "",
  230. },
  231. groupCurrentTab: {
  232. type: String,
  233. default: "",
  234. },
  235. });
  236. const manageRef = ref<any>(undefined);
  237. const currentTab = ref("");
  238. const editLableName = ref("");
  239. const transferType = ref("");
  240. const mask = ref(false);
  241. const currentGroupID = ref("");
  242. const userInfo = ref({
  243. list: [] as Array<typeof IGroupMember>,
  244. });
  245. const currentMember = ref<typeof IGroupMember>({});
  246. const typeName = ref({
  247. [TUIChatEngine.TYPES.GRP_WORK]: "好友工作群",
  248. [TUIChatEngine.TYPES.GRP_PUBLIC]: "陌生人社交群",
  249. [TUIChatEngine.TYPES.GRP_MEETING]: "临时会议群",
  250. [TUIChatEngine.TYPES.GRP_AVCHATROOM]: "直播群",
  251. [TUIChatEngine.TYPES.GRP_COMMUNITY]: "社群",
  252. [TUIChatEngine.TYPES.JOIN_OPTIONS_FREE_ACCESS]: "自由加入",
  253. [TUIChatEngine.TYPES.JOIN_OPTIONS_NEED_PERMISSION]: "需要验证",
  254. [TUIChatEngine.TYPES.JOIN_OPTIONS_DISABLE_APPLY]: "禁止加群",
  255. });
  256. const member = ref({
  257. admin: [] as Array<typeof IGroupMember>,
  258. member: [] as Array<typeof IGroupMember>,
  259. muteMember: [] as Array<typeof IGroupMember>,
  260. });
  261. const transferList = ref<Array<typeof IGroupMember>>([]);
  262. const transferTitle = ref("");
  263. const isSearch = ref(false);
  264. const isRadio = ref(false);
  265. const selectedList = ref([]);
  266. const delDialogShow = ref(false);
  267. const groupMemberList = ref<Array<typeof IGroupMember>>([]);
  268. const deletedUserList = ref([]);
  269. const currentGroup = ref<IGroupModel>();
  270. const currentSelfRole = ref("");
  271. const groupIDValue = ref<string>("");
  272. onMounted(() => {
  273. nextTick(() => {
  274. if (manageRef.value) {
  275. outsideClick.listen({
  276. domRefs: manageRef.value,
  277. handler: handleCompleteManage,
  278. });
  279. }
  280. });
  281. });
  282. TUIStore.watch(StoreName.GRP, {
  283. currentGroup: (group: IGroupModel) => {
  284. if (group) {
  285. currentGroup.value = group;
  286. currentSelfRole.value = currentGroup.value?.selfInfo?.role;
  287. }
  288. },
  289. currentGroupMemberList: (memberList: Array<typeof IGroupMember>) => {
  290. groupMemberList.value = memberList;
  291. member.value = {
  292. admin: [],
  293. member: [],
  294. muteMember: [],
  295. };
  296. Array.from(memberList).map((item: any) => {
  297. switch (item?.role) {
  298. case TUIChatEngine.TYPES.GRP_MBR_ROLE_ADMIN:
  299. member.value.admin.push(item);
  300. break;
  301. case TUIChatEngine.TYPES.GRP_MBR_ROLE_MEMBER:
  302. member.value.member.push(item);
  303. break;
  304. default:
  305. break;
  306. }
  307. return item;
  308. });
  309. const time: number = new Date().getTime();
  310. member.value.muteMember = Array.from(memberList).filter(
  311. (item: any) => item?.muteUntil * 1000 - time > 0
  312. );
  313. },
  314. });
  315. TUIStore.watch(StoreName.CONV, {
  316. currentConversation: (conversation: IConversationModel) => {
  317. groupIDValue.value = conversation?.groupProfile?.groupID;
  318. },
  319. });
  320. watchEffect(() => {
  321. const params = TUIGroupServer.getOnCallParams(
  322. TUIConstants.TUIGroup.SERVICE.METHOD.OPEN_GROUP_MANAGEMENT
  323. );
  324. currentGroupID.value = params.groupID || groupIDValue.value;
  325. currentTab.value = props.groupCurrentTab;
  326. });
  327. const TabName = computed(() => {
  328. let name = "";
  329. switch (currentTab.value) {
  330. case "notification":
  331. name = "群公告";
  332. break;
  333. case "member":
  334. name = "群成员";
  335. break;
  336. case "profile":
  337. name = "群成员";
  338. break;
  339. default:
  340. name = "群管理";
  341. break;
  342. }
  343. return name;
  344. });
  345. const isAuthor = computed(() => {
  346. // 判断是否是群主/管理员
  347. const userRole = currentGroup?.value?.selfInfo?.role;
  348. const isOwner = userRole === TUIChatEngine.TYPES.GRP_MBR_ROLE_OWNER;
  349. const isAdmin = userRole === TUIChatEngine.TYPES.GRP_MBR_ROLE_ADMIN;
  350. return isOwner || isAdmin;
  351. });
  352. const isAdmin = computed(() => {
  353. const groupType = currentGroup?.value?.type;
  354. const userRole = currentGroup?.value?.selfInfo?.role;
  355. const isOwner = userRole === TUIChatEngine.TYPES.GRP_MBR_ROLE_OWNER;
  356. const isWork = groupType === TUIChatEngine.TYPES.GRP_WORK;
  357. const isAVChatRoom = groupType === TUIChatEngine.TYPES.GRP_AVCHATROOM;
  358. if (!isWork && !isAVChatRoom && isOwner) {
  359. return true;
  360. }
  361. return false;
  362. });
  363. const isSetMuteTime = computed(() => {
  364. const groupType = currentGroup?.value?.type;
  365. const isWork = groupType === TUIChatEngine.TYPES.GRP_WORK;
  366. if (isWork || !isAuthor.value) {
  367. return false;
  368. }
  369. return true;
  370. });
  371. const canDelMember = computed(() => {
  372. const groupType = currentGroup?.value?.type;
  373. const isAVChatRoom = groupType === TUIChatEngine.TYPES.GRP_AVCHATROOM;
  374. if (isAVChatRoom) {
  375. return false;
  376. }
  377. return true;
  378. });
  379. const updateProfile = async (newGroupProfile: any) => {
  380. const { key, value } = newGroupProfile;
  381. const options: any = {
  382. groupID: currentGroup.value.groupID,
  383. [key]: value,
  384. };
  385. TUIGroupService.updateGroupProfile(options)
  386. .then((res: any) => {
  387. currentGroup.value = res.data.group;
  388. editLableName.value = "";
  389. })
  390. .catch((error: any) => {
  391. Toast({
  392. message: error?.message,
  393. type: TOAST_TYPE.ERROR,
  394. });
  395. });
  396. };
  397. const setCurrentTab = (tabName: string) => {
  398. currentTab.value = tabName;
  399. editLableName.value = "";
  400. if (currentTab.value === "member") {
  401. transferType.value = "remove";
  402. }
  403. if (!currentTab.value) {
  404. transferType.value = "";
  405. }
  406. };
  407. const cancel = () => {
  408. toggleMask();
  409. };
  410. const toggleMask = async (type?: string) => {
  411. selectedList.value = [];
  412. switch (type) {
  413. case "add":
  414. isRadio.value = false;
  415. transferList.value = await friendList();
  416. transferTitle.value = "添加成员";
  417. break;
  418. case "remove":
  419. isRadio.value = false;
  420. transferList.value = groupMemberList.value.filter(
  421. (item: any) => item.userID !== currentGroup?.value?.selfInfo?.userID
  422. );
  423. transferTitle.value = "删除成员";
  424. break;
  425. case "addAdmin":
  426. isRadio.value = true;
  427. transferList.value = member.value.member;
  428. transferTitle.value = "新增管理员";
  429. break;
  430. case "removeAdmin":
  431. isRadio.value = true;
  432. transferList.value = member.value.admin;
  433. transferTitle.value = "移除管理员";
  434. break;
  435. case "changeOwner":
  436. isRadio.value = true;
  437. transferList.value = [...member.value.admin, ...member.value.member];
  438. transferTitle.value = "转让群组";
  439. break;
  440. case "addMute":
  441. isRadio.value = true;
  442. transferList.value = member.value.member;
  443. if (currentGroup.value.selfInfo.role === "Owner") {
  444. transferList.value = [...member.value.admin, ...member.value.member];
  445. }
  446. transferList.value = transferList?.value?.filter((item: any) => {
  447. return member?.value?.muteMember?.indexOf(item) < 0;
  448. });
  449. transferTitle.value = "新增禁言用户";
  450. break;
  451. case "removeMute":
  452. isRadio.value = true;
  453. transferList.value = member.value.muteMember;
  454. transferTitle.value = "移除禁言用户";
  455. break;
  456. default:
  457. break;
  458. }
  459. type && (transferType.value = type);
  460. mask.value = !mask.value;
  461. };
  462. const friendList = async () => {
  463. const imResponse = await TUIFriendService.getFriendList();
  464. const friendList = imResponse.data.map((item: any) => item?.profile);
  465. return friendList.filter(
  466. (item: any) =>
  467. !userInfo.value.list.some((infoItem: any) => infoItem.userID === item.userID)
  468. );
  469. };
  470. const canIDissmissGroup = computed(() => {
  471. const userRole = currentGroup?.value?.selfInfo?.role;
  472. const groupType = currentGroup?.value?.type;
  473. return (
  474. userRole === TUIChatEngine.TYPES.GRP_MBR_ROLE_OWNER &&
  475. groupType !== TUIChatEngine.TYPES.GRP_WORK
  476. );
  477. });
  478. const isShowAddMember = computed(() => {
  479. const groupType = currentGroup?.value?.type;
  480. return groupType === TUIChatEngine.TYPES.GRP_WORK;
  481. });
  482. const showUserNum = computed(() => {
  483. let num = 3;
  484. if (!isShowAddMember.value) {
  485. num += 1;
  486. }
  487. if (currentGroup?.value?.selfInfo?.role !== "Owner") {
  488. num += 1;
  489. }
  490. return num;
  491. });
  492. const getMember = async (type?: string) => {
  493. const groupID = currentGroupID.value;
  494. const options = {
  495. groupID,
  496. count: 100,
  497. offset: type && type === "more" ? userInfo.value.list.length : 0,
  498. };
  499. await TUIGroupService.getGroupMemberList(options).then((res: any) => {
  500. if (type && type === "more") {
  501. userInfo.value.list = [...userInfo.value.list, ...res.data.memberList];
  502. } else {
  503. userInfo.value.list = res.data.memberList;
  504. }
  505. });
  506. };
  507. const handleMemberProfileShow = (user: any) => {
  508. currentMember.value = user;
  509. setCurrentTab("profile");
  510. };
  511. const submit = (userList: any) => {
  512. // 进行成员移除等等相关操作
  513. if (transferType.value === "remove") {
  514. deletedUserList.value = userList;
  515. delDialogShow.value = !delDialogShow.value;
  516. } else {
  517. handleManage(userList, transferType.value);
  518. }
  519. mask.value = false;
  520. };
  521. const dismissGroup = async (group: any) => {
  522. // 解散群组
  523. await TUIGroupService.dismissGroup(group.groupID);
  524. enableSampleTaskStatus("dismissGroup");
  525. Toast({
  526. message: TUITranslateService.t("TUIGroup.群组解散成功"),
  527. type: TOAST_TYPE.SUCCESS,
  528. });
  529. clearGroupInfo();
  530. };
  531. const clearGroupInfo = () => {
  532. if (isUniFrameWork) {
  533. TUIGlobal?.switchTab({
  534. url: "/TUIKit/components/TUIConversation/index",
  535. });
  536. } else {
  537. handleCompleteManage();
  538. // 回到chat default 页
  539. TUIConversationService.switchConversation();
  540. }
  541. };
  542. const setAllMuteTime = (value: boolean) => {
  543. // 设置全体禁言时间
  544. updateProfile({ key: "muteAllMembers", value });
  545. if (value) {
  546. enableSampleTaskStatus("muteGroup");
  547. Toast({
  548. message: TUITranslateService.t("TUIGroup.禁言设置成功"),
  549. type: TOAST_TYPE.SUCCESS,
  550. });
  551. } else {
  552. Toast({
  553. message: TUITranslateService.t("TUIGroup.取消禁言成功"),
  554. type: TOAST_TYPE.SUCCESS,
  555. });
  556. }
  557. };
  558. const handleSearchMember = async (value: string) => {
  559. let imResponse: any = {};
  560. let imMemberResponse: any = {};
  561. const options: any = {
  562. groupID: currentGroupID.value,
  563. userIDList: [value],
  564. };
  565. switch (transferType.value) {
  566. case "add":
  567. try {
  568. imMemberResponse = await TUIGroupService.getGroupMemberProfile(options);
  569. transferList.value = transferList.value.filter(
  570. (item: any) => item.userID !== imResponse.data[0]?.userID
  571. );
  572. transferList.value = [...transferList.value, ...imResponse.data];
  573. if (imMemberResponse?.data?.memberList.length > 0) {
  574. transferList.value = transferList.value.map((item: any) => {
  575. if (item.userID === imMemberResponse?.data?.memberList[0].userID) {
  576. item.isDisabled = true;
  577. }
  578. return item;
  579. });
  580. }
  581. } catch (error: any) {
  582. const message = TUITranslateService.t("TUIGroup.该用户不存在");
  583. Toast({
  584. message,
  585. type: TOAST_TYPE.ERROR,
  586. });
  587. }
  588. break;
  589. case "remove":
  590. try {
  591. imResponse = await TUIGroupService.getGroupMemberProfile(options);
  592. if (imResponse.data.memberList.length === 0) {
  593. const message = TUITranslateService.t("TUIGroup.该用户不在群组内");
  594. Toast({
  595. message,
  596. type: TOAST_TYPE.ERROR,
  597. });
  598. }
  599. transferList.value = transferList.value.filter(
  600. (item: any) => item.userID !== imResponse?.data?.memberList[0]?.userID
  601. );
  602. if (imResponse?.data?.memberList.length) {
  603. transferList.value = [...transferList.value, ...imResponse.data.memberList];
  604. }
  605. } catch (error: any) {
  606. const message = TUITranslateService.t("TUIGroup.该用户不存在");
  607. Toast({
  608. message,
  609. type: TOAST_TYPE.ERROR,
  610. });
  611. }
  612. break;
  613. default:
  614. break;
  615. }
  616. };
  617. const handleManage = (userList: any, type: any) => {
  618. const userIDList: any = [];
  619. userList.map((item: any) => {
  620. userIDList.push(item.userID);
  621. return item;
  622. });
  623. switch (type) {
  624. case "add":
  625. addMember(userIDList);
  626. break;
  627. case "remove":
  628. deleteGroupMember(userIDList);
  629. break;
  630. case "addAdmin":
  631. handleAdmin(userList[0]);
  632. break;
  633. case "removeAdmin":
  634. handleAdmin(userList[0]);
  635. break;
  636. case "changeOwner":
  637. changeOwner(userIDList[0]);
  638. break;
  639. case "addMute":
  640. setMemberMuteTime(userIDList[0], "add");
  641. break;
  642. case "removeMute":
  643. setMemberMuteTime(userIDList[0], "remove");
  644. break;
  645. default:
  646. break;
  647. }
  648. };
  649. const addMember = async (userIDList: any) => {
  650. const options: any = {
  651. groupID: currentGroupID.value,
  652. userIDList,
  653. };
  654. await TUIGroupService.addGroupMember(options);
  655. };
  656. const changeOwner = async (userID: any) => {
  657. const options: any = {
  658. groupID: currentGroupID.value,
  659. newOwnerID: userID,
  660. };
  661. const imResponse = await TUIGroupService.changeGroupOwner(options);
  662. currentGroup.value = {};
  663. currentGroup.value = imResponse.data.group;
  664. };
  665. const setMemberMuteTime = async (userID: string, type?: string) => {
  666. const options: any = {
  667. groupID: currentGroupID.value,
  668. userID,
  669. muteTime: type === "add" ? 60 * 60 * 24 * 30 : 0,
  670. };
  671. await TUIGroupService.setGroupMemberMuteTime(options);
  672. };
  673. const handleAdmin = async (user: any) => {
  674. let role = "";
  675. switch (user.role) {
  676. case TUIChatEngine.TYPES.GRP_MBR_ROLE_ADMIN:
  677. role = TUIChatEngine.TYPES.GRP_MBR_ROLE_MEMBER;
  678. break;
  679. case TUIChatEngine.TYPES.GRP_MBR_ROLE_MEMBER:
  680. role = TUIChatEngine.TYPES.GRP_MBR_ROLE_ADMIN;
  681. break;
  682. }
  683. const options: any = {
  684. groupID: currentGroupID.value,
  685. userID: user.userID,
  686. role,
  687. };
  688. await TUIGroupService.setGroupMemberRole(options);
  689. };
  690. const deleteGroupMember = async (userIDList: any) => {
  691. const options: any = {
  692. groupID: currentGroupID.value,
  693. userIDList,
  694. reason: "",
  695. };
  696. await TUIGroupService.deleteGroupMember(options);
  697. };
  698. const quitGroup = async (group: any) => {
  699. await TUIGroupService.quitGroup(group.groupID);
  700. clearGroupInfo();
  701. };
  702. const back = () => {
  703. if (currentTab.value) {
  704. setCurrentTab("");
  705. } else {
  706. handleCompleteManage();
  707. }
  708. };
  709. const handleCompleteManage = () => {
  710. TUIStore.update(StoreName.GRP, "isShowManageComponent", false);
  711. const callback = TUIGroupServer.getOnCallCallback(
  712. TUIConstants.TUIGroup.SERVICE.METHOD.OPEN_GROUP_MANAGEMENT
  713. );
  714. callback && callback();
  715. };
  716. </script>
  717. <style lang="scss" scoped src="./style/index.scss"></style>