manage.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  1. <template>
  2. <div>
  3. <i class="icon icon-chat-setting" v-if="platform == 'daya'" @click="toggleShow"></i>
  4. <div class="manage" :class="[isH5 ? 'manage-h5' : '']" v-if="show" ref="dialog">
  5. <header class="manage-header">
  6. <i class="icon icon-back" v-if="isH5 && !currentTab" @click="toggleShow"></i>
  7. <aside class="manage-header-left">
  8. <i class="icon icon-back" v-if="currentTab" @click="setTab('')"></i>
  9. <main>
  10. <h1>{{ $t(`TUIChat.manage.${TabName}`) }}</h1>
  11. </main>
  12. </aside>
  13. <span>
  14. <i v-if="!isH5" class="icon icon-close" @click="toggleShow"></i>
  15. </span>
  16. </header>
  17. <main class="main" style="background-color: #f4f5f9; height: 100%" v-if="!currentTab">
  18. <ManageName class="space-top" :isAuth="isAuth" :isH5="isH5" :data="conversation.groupProfile" @update="updateProfile" style="background-color: #fff" />
  19. <div class="userInfo space-top" style="background-color: #fff">
  20. <header class="userInfo-header" @click="setTab('member')">
  21. <label>{{ $t(`TUIChat.manage.群成员`) }}</label>
  22. <p>
  23. <span> {{ groupDetail.memberNum || 0 }}{{ $t(`TUIChat.manage.人`) }} </span>
  24. <i class="icon icon-right"></i>
  25. </p>
  26. </header>
  27. <ol>
  28. <!-- @click="handleMemberProfileShow(item)" -->
  29. <dl v-for="(item, index) in userInfo?.list?.slice(0, showUserNum)" :key="index">
  30. <dt>
  31. <img class="avatar" :src="item?.avatar || 'https://oss.dayaedu.com/news-info/07/1690787574969.png'" onerror="this.src='https://oss.dayaedu.com/news-info/07/1690787574969.png'" />
  32. </dt>
  33. <dd>{{ item?.nickname || item?.userID }}</dd>
  34. </dl>
  35. <!-- v-if="isShowAddMember" -->
  36. <dl v-if="currentUserDetail.groupRoleType === 'Owner'">
  37. <dt class="avatar" @click="toggleMask('add')">+</dt>
  38. </dl>
  39. <!-- <dl v-if="conversation.groupProfile.selfInfo.role === 'Owner'">
  40. <dt class="avatar" @click="toggleMask('remove')">-</dt>
  41. </dl> -->
  42. </ol>
  43. </div>
  44. <ul class="content space-top" @click="editLableName = ''" style="background-color: #fff">
  45. <li @click.stop="setTab('notification')">
  46. <aside>
  47. <label>{{ $t(`TUIChat.manage.群公告`) }}</label>
  48. <article>{{ conversation.groupProfile.notification }}</article>
  49. </aside>
  50. <i class="icon icon-right end"></i>
  51. </li>
  52. <!-- <li v-if="isAdmin && isSetMuteTime" @click.stop="setTab('admin')">
  53. <label>{{ $t(`TUIChat.manage.群管理`) }}</label>
  54. <i class="icon icon-right"></i>
  55. </li>
  56. <li>
  57. <label>{{ $t(`TUIChat.manage.群ID`) }}</label>
  58. <div class="groupID">
  59. <span>{{ conversation.groupProfile.groupID }}</span>
  60. <i
  61. class="icon icon-msg-copy"
  62. @click="handleGroupIDCopy"
  63. :title="$t('TUIChat.复制')"
  64. ></i>
  65. </div>
  66. </li>
  67. <li>
  68. <label>{{ $t(`TUIChat.manage.群头像`) }}</label>
  69. <img
  70. class="avatar"
  71. :src="
  72. conversation?.groupProfile?.avatar ||
  73. 'https://oss.dayaedu.com/news-info/07/1690775328089.png'
  74. "
  75. onerror="this.src='https://oss.dayaedu.com/news-info/07/1690775328089.png'"
  76. />
  77. </li>
  78. <li>
  79. <label>{{ $t(`TUIChat.manage.群类型`) }}</label>
  80. <span>
  81. {{
  82. $t(`TUIChat.manage.${typeName[conversation.groupProfile.type]}`)
  83. }}
  84. </span>
  85. </li>
  86. <li>
  87. <label>{{ $t(`TUIChat.manage.加群方式`) }}</label>
  88. <span>
  89. {{
  90. $t(
  91. `TUIChat.manage.${
  92. typeName[conversation.groupProfile.joinOption]
  93. }`
  94. )
  95. }}
  96. </span>
  97. </li> -->
  98. </ul>
  99. <div v-if="currentUserDetail.groupRoleType === 'Owner'" class="admin-content space-top" style="background-color: #fff; padding-top: 12px">
  100. <aside>
  101. <label>学生禁言</label>
  102. </aside>
  103. <Slider :open="groupDetail.configJson.mute" @change="setAllMuteTime" />
  104. </div>
  105. <ul class="footer space-top">
  106. <li v-if="currentUserDetail.groupRoleType === 'Owner' && userInfo?.list.length > 1" @click.stop="toggleMask('changeOwner')">移交群主</li>
  107. <li v-if="currentUserDetail.groupRoleType === 'Owner'" @click.stop="dismiss(conversation.groupProfile)">解散群聊</li>
  108. <li v-else @click.stop="quit(conversation.groupProfile)">退出群组</li>
  109. </ul>
  110. </main>
  111. <ManageMember v-else-if="currentTab === 'member'" :self="conversation.groupProfile.selfInfo" :list="userInfo.list" :total="~~conversation.groupProfile.memberCount" @more="getMember('more')" @del="submit" @handleMemberProfileShow="handleMemberProfileShow" />
  112. <!-- :isShowDel="conversation.groupProfile.selfInfo.role === 'Owner'" -->
  113. <MemeberProfile v-else-if="currentTab === 'profile'" :userInfo="currentMember" />
  114. <ManageNotification v-else-if="currentTab === 'notification'" :isAuth="isAuth" :data="conversation.groupProfile" @update="updateProfile" />
  115. <main class="admin" v-else-if="currentTab === 'admin'">
  116. <div class="admin-list" v-if="isAdmin">
  117. <label>{{ $t(`TUIChat.manage.群管理员`) }}</label>
  118. <ol>
  119. <dl v-for="(item, index) in member.admin" :key="index">
  120. <dt>
  121. <img class="avatar" :src="item?.avatar || 'https://oss.dayaedu.com/news-info/07/1690787574969.png'" onerror="this.src='https://oss.dayaedu.com/news-info/07/1690787574969.png'" />
  122. </dt>
  123. <dd>{{ item?.nick || item?.userID }}</dd>
  124. </dl>
  125. <dl>
  126. <dt class="avatar" @click="toggleMask('addAdmin')">+</dt>
  127. </dl>
  128. <dl>
  129. <dt class="avatar" v-if="member.admin.length > 0" @click="toggleMask('removeAdmin')">-</dt>
  130. </dl>
  131. </ol>
  132. </div>
  133. <div class="admin-content space-top" v-if="isSetMuteTime">
  134. <aside>
  135. <label>{{ $t(`TUIChat.manage.学生禁言`) }}</label>
  136. <p>
  137. {{ $t(`TUIChat.manage.学生禁言开启后,只允许群主和管理员发言。`) }}
  138. </p>
  139. </aside>
  140. <Slider :open="conversation.groupProfile.muteAllMembers" @change="setAllMuteTime" />
  141. </div>
  142. <div class="admin-list last" v-if="isSetMuteTime">
  143. <label>{{ $t(`TUIChat.manage.单独禁言人员`) }}</label>
  144. <ol>
  145. <dl v-for="(item, index) in member.muteMember" :key="index">
  146. <dt>
  147. <img class="avatar" :src="item?.avatar || 'https://oss.dayaedu.com/news-info/07/1690787574969.png'" onerror="this.src='https://oss.dayaedu.com/news-info/07/1690787574969.png'" />
  148. </dt>
  149. <dd>{{ item?.nick || item?.userID }}</dd>
  150. </dl>
  151. <dl>
  152. <dt class="avatar" @click="toggleMask('addMute')">+</dt>
  153. </dl>
  154. <dl>
  155. <dt class="avatar" v-if="member.muteMember.length > 0" @click="toggleMask('removeMute')">-</dt>
  156. </dl>
  157. </ol>
  158. </div>
  159. </main>
  160. <MaskTUI :show="mask" @update:show="(e) => (mask = e)">
  161. <Transfer :title="$t(`TUIChat.manage.${transferTitle}`)" :list="transferList" :isSearch="isSearch" :isRadio="isRadio" :selectedList="selectedList" @submit="submit" @cancel="cancel" @search="handleSearchMember" :isH5="isH5" />
  162. </MaskTUI>
  163. <DialogTUI :title="$t(`TUIChat.manage.删除成员`)" :show="delDialogShow" :isH5="isH5" :center="true" :isHeaderShow="!isH5" @submit="handleManage(userList, 'remove')" @update:show="(e) => (delDialogShow = e)">
  164. <p v-if="userList.length === 1" class="delDialog-title">
  165. {{ $t(`TUIChat.manage.确定从群聊中删除该成员?`) }}
  166. </p>
  167. <p v-if="userList.length > 1" class="delDialog-title">
  168. {{ $t(`TUIChat.manage.确定从群聊中删除所选成员?`) }}
  169. </p>
  170. </DialogTUI>
  171. <DialogTUI title="退出群聊" :show="quitDialogShow" :isH5="isH5" :center="true" :isHeaderShow="!isH5" @submit="handleManage([], 'quit')" @update:show="(e) => (quitDialogShow = e)">
  172. <p class="delDialog-title">是否退出群聊?</p>
  173. </DialogTUI>
  174. <DialogTUI title="解散群聊" :show="dimmisDialogShow" :isH5="isH5" :center="true" :isHeaderShow="!isH5" @submit="handleManage([], 'dismiss')" @update:show="(e) => (dimmisDialogShow = e)">
  175. <p class="delDialog-title">是否解散群聊?</p>
  176. </DialogTUI>
  177. </div>
  178. </div>
  179. </template>
  180. <script lang="ts">
  181. import TUIMessage from "../../../components/messageTUI/index";
  182. import { defineComponent, watchEffect, reactive, toRefs, computed, watch, ref, onMounted } from "vue";
  183. import { onClickOutside } from "@vueuse/core";
  184. import MaskTUI from "../../../components/maskTUI/mask.vue";
  185. import Transfer from "../../../components/transferTUI/index.vue";
  186. import Slider from "../../../components/sliderTUI/index.vue";
  187. import ManageName from "./manage-name.vue";
  188. import ManageNotification from "./manage-notification.vue";
  189. import ManageMember from "./manage-member.vue";
  190. import MemeberProfile from "./member-profile.vue";
  191. import DialogTUI from "../../../components/dialogTUi/index.vue";
  192. import { imGroupChangeGroupOwner, imGroupDetail, imGroupDismiss, imGroupMemberPage, imGroupMemberSaveImAll, imGroupMemberUserDetail, imGroupMuteAll, imGroupQuit, imUserFriendPage } from "../../../../api";
  193. import Vuex from "vuex";
  194. import { handleErrorPrompts } from "../../utils";
  195. import useClipboard from "vue-clipboard3";
  196. import { eventGlobal } from "@/helpers";
  197. const manage = defineComponent({
  198. components: {
  199. MaskTUI,
  200. Transfer,
  201. Slider,
  202. ManageName,
  203. ManageNotification,
  204. ManageMember,
  205. MemeberProfile,
  206. DialogTUI,
  207. },
  208. props: {
  209. userInfo: {
  210. type: Object,
  211. default: () => ({
  212. isGroup: false,
  213. list: [],
  214. }),
  215. },
  216. conversation: {
  217. type: Object,
  218. default: () => ({}),
  219. },
  220. show: {
  221. type: Boolean,
  222. default: () => false,
  223. },
  224. isH5: {
  225. type: Boolean,
  226. default: () => false,
  227. },
  228. },
  229. setup(props: any, ctx: any) {
  230. const types: any = manage.TUIServer.TUICore.TIM.TYPES;
  231. const { GroupServer } = manage;
  232. const { t } = manage.TUIServer.TUICore.config.i18n.useI18n();
  233. const data: any = reactive({
  234. conversation: {},
  235. userInfo: {
  236. isGroup: false,
  237. list: [],
  238. },
  239. isShowMuteTimeInput: false,
  240. editLableName: "",
  241. mask: false,
  242. currentTab: "",
  243. transferType: "",
  244. isSearch: false,
  245. isRadio: false,
  246. transferList: [],
  247. selectedList: [],
  248. isMuteTime: false,
  249. show: false,
  250. typeName: {
  251. [types.GRP_WORK]: "好友工作群",
  252. [types.GRP_PUBLIC]: "陌生人社交群",
  253. [types.GRP_MEETING]: "临时会议群",
  254. [types.GRP_AVCHATROOM]: "直播群",
  255. [types.JOIN_OPTIONS_FREE_ACCESS]: "自由加入",
  256. [types.JOIN_OPTIONS_NEED_PERMISSION]: "需要验证",
  257. [types.JOIN_OPTIONS_DISABLE_APPLY]: "禁止加群",
  258. },
  259. delDialogShow: false,
  260. quitDialogShow: false,
  261. dimmisDialogShow: false,
  262. userList: [],
  263. transferTitle: "",
  264. member: {
  265. admin: [],
  266. member: [],
  267. muteMember: [],
  268. },
  269. currentMember: {},
  270. classGroupDetail: {}, // 群详情
  271. page: 1, // 当前默认查询第一页数据
  272. currentUserDetail: {} as any, // 用户信息
  273. groupDetail: {} as any,
  274. platform: "",
  275. });
  276. const dialog: any = ref();
  277. watchEffect(() => {
  278. data.conversation = props.conversation;
  279. data.userInfo = props.userInfo;
  280. data.show = props.show;
  281. });
  282. const VuexStore = ((window as any)?.TUIKitTUICore?.isOfficial && (Vuex as any)?.useStore()) || {};
  283. const TabName = computed(() => {
  284. let name = "";
  285. switch (data.currentTab) {
  286. case "notification":
  287. name = "群公告";
  288. break;
  289. case "member":
  290. name = "群成员";
  291. break;
  292. case "profile":
  293. name = "群成员";
  294. break;
  295. default:
  296. name = "群管理";
  297. break;
  298. }
  299. return name;
  300. });
  301. watch(
  302. () => data.userInfo.list,
  303. (newValue: any, oldValue: any) => {
  304. data.member = {
  305. admin: [],
  306. member: [],
  307. muteMember: [],
  308. };
  309. // TIM.TYPES.GRP_MBR_ROLE_ADMIN(群管理员),
  310. // TIM.TYPES.GRP_MBR_ROLE_MEMBER(群普通成员),
  311. // TIM.TYPES.GRP_MBR_ROLE_CUSTOM(自定义群成员角色,仅社群支持)
  312. newValue.map((item: any) => {
  313. switch (item?.groupRoleType) {
  314. case "Admin":
  315. data.member.admin.push(item);
  316. break;
  317. case "Member":
  318. data.member.member.push(item);
  319. break;
  320. default:
  321. break;
  322. }
  323. return item;
  324. });
  325. const time: number = new Date().getTime();
  326. data.member.muteMember = newValue.filter((item: any) => item?.muteUntil * 1000 - time > 0);
  327. },
  328. { deep: true }
  329. );
  330. const isDismissGroupAuth = computed(() => {
  331. const { conversation } = data;
  332. const userRole = conversation?.groupProfile?.selfInfo.role;
  333. const groupType = conversation?.groupProfile?.type;
  334. const isOwner = userRole === types.GRP_MBR_ROLE_OWNER;
  335. const isWork = groupType === types.GRP_WORK;
  336. return isOwner && !isWork;
  337. });
  338. const isShowAddMember = computed(() => {
  339. const { conversation } = data;
  340. const groupType = conversation?.groupProfile?.type;
  341. const isWork = groupType === types.GRP_WORK;
  342. if (isWork) {
  343. return true;
  344. }
  345. return false;
  346. });
  347. const showUserNum = computed(() => {
  348. let num = 3;
  349. if (!isShowAddMember.value) {
  350. num += 1;
  351. }
  352. if ((data.conversation as any).groupProfile.selfInfo.role !== "Owner") {
  353. num += 1;
  354. }
  355. return num;
  356. });
  357. const isAuth = computed(() => {
  358. const { conversation } = data;
  359. const userRole = conversation?.groupProfile?.selfInfo.role;
  360. const isOwner = userRole === types.GRP_MBR_ROLE_OWNER;
  361. const isAdmin = userRole === types.GRP_MBR_ROLE_ADMIN;
  362. return isOwner || isAdmin;
  363. });
  364. const isAdmin = computed(() => {
  365. const { conversation } = data;
  366. const groupType = conversation?.groupProfile?.type;
  367. const userRole = conversation?.groupProfile?.selfInfo.role;
  368. const isOwner = userRole === types.GRP_MBR_ROLE_OWNER;
  369. const isWork = groupType === types.GRP_WORK;
  370. const isAVChatRoom = groupType === types.GRP_AVCHATROOM;
  371. if (!isWork && !isAVChatRoom && isOwner) {
  372. return true;
  373. }
  374. return false;
  375. });
  376. const isSetMuteTime = computed(() => {
  377. const { conversation } = data;
  378. const groupType = conversation?.groupProfile?.type;
  379. const isWork = groupType === types.GRP_WORK;
  380. if (isWork || !isAuth.value) {
  381. return false;
  382. }
  383. return true;
  384. });
  385. const getMember = async (type?: string) => {
  386. try {
  387. const { conversation } = data;
  388. // console.log(conversation, "getMember -------");
  389. const options: any = {
  390. groupId: conversation?.groupProfile?.groupID,
  391. rows: 100,
  392. page: type && type === "more" ? data.page + 1 : data.page,
  393. // offset: type && type === "more" ? data.userInfo.list.length : 0,
  394. };
  395. await imGroupMemberPage(options).then((res: any) => {
  396. const rows = res.data.rows || [];
  397. rows.forEach((row: any) => {
  398. row.nick = row.nickname;
  399. });
  400. if (type && type === "more") {
  401. data.userInfo.list = [...data.userInfo.list, ...rows];
  402. } else {
  403. data.userInfo.list = rows;
  404. }
  405. });
  406. // GroupServer.getGroupMemberList(options)
  407. } catch {
  408. //
  409. }
  410. };
  411. const addMember = async (userIDList: any) => {
  412. const { conversation } = data;
  413. // const options: any = {
  414. // groupID: conversation.groupProfile.groupID,
  415. // userIDList,
  416. // };
  417. // await GroupServer.addGroupMember(options);
  418. const params: any = [];
  419. userIDList.forEach((id: any) => {
  420. params.push({
  421. groupId: conversation.groupProfile.groupID,
  422. imUserId: id,
  423. });
  424. });
  425. // console.log(params, userIDList, "userIDList");
  426. // return;
  427. try {
  428. await imGroupMemberSaveImAll(params);
  429. getGroupDetail();
  430. getMember();
  431. } catch {
  432. //
  433. }
  434. };
  435. const deleteMember = (user: any) => {
  436. const { conversation } = data;
  437. const options: any = {
  438. groupID: conversation.groupProfile.groupID,
  439. userIDList: [user.userID],
  440. };
  441. GroupServer.deleteGroupMember(options);
  442. };
  443. const changeOwner = async (userID: any) => {
  444. // const options: any = {
  445. // groupID: data.conversation.groupProfile.groupID,
  446. // newOwnerID: userID,
  447. // };
  448. // const imResponse = await GroupServer.changeGroupOwner(options);
  449. // data.conversation.groupProfile = imResponse.data.group;
  450. console.log(data.conversation.groupProfile, userID);
  451. // 腾讯IM切换人之后
  452. await imGroupChangeGroupOwner({
  453. oldOwner: data.conversation.groupProfile.ownerID,
  454. groupId: data.conversation.groupProfile.groupID,
  455. newOwner: userID,
  456. });
  457. toggleShow();
  458. data.conversation.groupProfile = {};
  459. TUIMessage({
  460. message: "转交成功",
  461. isH5: false,
  462. type: "success",
  463. });
  464. };
  465. const quit = async (group: any) => {
  466. data.quitDialogShow = true;
  467. };
  468. const dismiss = async (group: any) => {
  469. data.dimmisDialogShow = true;
  470. // console.log(manage.TUIServer.deleteConversation, "manage.TUIServer");
  471. // manage.TUIServer.deleteConversation(data.conversation.conversationID);
  472. // manage.TUIServer.store.conversation = {};
  473. // toggleShow();
  474. // await GroupServer.dismissGroup(group.groupID);
  475. // manage.TUIServer.store.conversation = {};
  476. // (window as any)?.TUIKitTUICore?.isOfficial && VuexStore?.commit && VuexStore?.commit("handleTask", 5);
  477. };
  478. const handleAdmin = async (user: any) => {
  479. const { conversation } = data;
  480. let role = "";
  481. switch (user.role) {
  482. case types.GRP_MBR_ROLE_ADMIN:
  483. role = types.GRP_MBR_ROLE_MEMBER;
  484. break;
  485. case types.GRP_MBR_ROLE_MEMBER:
  486. role = types.GRP_MBR_ROLE_ADMIN;
  487. break;
  488. }
  489. const options: any = {
  490. groupID: conversation.groupProfile.groupID,
  491. userID: user.userID,
  492. role,
  493. };
  494. await GroupServer.setGroupMemberRole(options);
  495. getMember();
  496. };
  497. const setMemberMuteTime = async (userID: string, type?: string) => {
  498. const { conversation } = data;
  499. const options: any = {
  500. groupID: conversation.groupProfile.groupID,
  501. userID,
  502. muteTime: type === "add" ? 60 * 60 * 24 * 30 : 0,
  503. };
  504. await GroupServer.setGroupMemberMuteTime(options);
  505. if (type === "add") {
  506. (window as any)?.TUIKitTUICore?.isOfficial && VuexStore?.commit && VuexStore?.commit("handleTask", 4);
  507. }
  508. getMember();
  509. };
  510. const kickedOut = async (userIDList: any) => {
  511. const { conversation } = data;
  512. const options: any = {
  513. groupID: conversation.groupProfile.groupID,
  514. userIDList,
  515. reason: "",
  516. };
  517. await GroupServer.deleteGroupMember(options);
  518. getMember();
  519. };
  520. const edit = (labelName: string) => {
  521. data.editLableName = labelName;
  522. };
  523. const updateProfile = async (params: any) => {
  524. const { key, value } = params;
  525. const options: any = {
  526. groupID: data.conversation.groupProfile.groupID,
  527. [key]: value,
  528. };
  529. const res = await GroupServer.updateGroupProfile(options);
  530. const { conversation } = manage.TUIServer.store;
  531. conversation.groupProfile = res.data.group;
  532. manage.TUIServer.store.conversation = {};
  533. manage.TUIServer.store.conversation = conversation;
  534. data.editLableName = "";
  535. };
  536. const setTab = (tabName: string) => {
  537. data.currentTab = tabName;
  538. data.editLableName = "";
  539. if (data.currentTab === "member") {
  540. data.transferType = "remove";
  541. }
  542. if (!data.currentTab) {
  543. data.transferType = "";
  544. }
  545. };
  546. const handleSearchMember = async (value: string) => {
  547. let imResponse: any = {};
  548. let imMemberResponse: any = {};
  549. const options: any = {
  550. groupID: data.conversation.groupProfile.groupID,
  551. userIDList: [value],
  552. };
  553. switch (data.transferType) {
  554. case "add":
  555. try {
  556. imMemberResponse = await GroupServer.getGroupMemberProfile(options);
  557. data.transferList = data.transferList.filter((item: any) => item.userID !== imResponse.data[0]?.userID);
  558. data.transferList = [...data.transferList, ...imResponse.data];
  559. if (imMemberResponse?.data?.memberList.length > 0) {
  560. data.transferList = data.transferList.map((item: any) => {
  561. if (item.userID === imMemberResponse?.data?.memberList[0].userID) {
  562. item.isDisabled = true;
  563. }
  564. return item;
  565. });
  566. }
  567. } catch (error) {
  568. const message = t("TUIChat.manage.该用户不存在");
  569. handleErrorPrompts(message, props);
  570. }
  571. break;
  572. case "remove":
  573. try {
  574. imResponse = await GroupServer.getGroupMemberProfile(options);
  575. if (imResponse.data.memberList.length === 0) {
  576. const message = t("TUIChat.manage.该用户不在群组内");
  577. return handleErrorPrompts(message, props);
  578. }
  579. data.transferList = data.transferList.filter(
  580. (item: any) =>
  581. // eslint-disable-next-line no-unsafe-optional-chaining
  582. item.userID !== imResponse?.data?.memberList[0]?.userID
  583. );
  584. data.transferList = [
  585. ...data.transferList,
  586. // eslint-disable-next-line no-unsafe-optional-chaining
  587. ...imResponse?.data?.memberList,
  588. ];
  589. } catch (error) {
  590. const message = t("TUIChat.manage.该用户不存在");
  591. handleErrorPrompts(message, props);
  592. }
  593. break;
  594. default:
  595. break;
  596. }
  597. };
  598. const submit = (userList: any) => {
  599. console.log(userList, data.transferType, " data.transferType");
  600. if (data.transferType === "remove") {
  601. data.userList = userList;
  602. data.delDialogShow = !data.delDialogShow;
  603. } else {
  604. handleManage(userList, data.transferType);
  605. }
  606. data.mask = false;
  607. };
  608. const friendList = async () => {
  609. const list = await imUserFriendPage({ page: 1, rows: 999 });
  610. console.log(list, "lits");
  611. const fristList = list.data.rows || [];
  612. fristList.forEach((item: any) => {
  613. item.nick = item.friendNickname;
  614. });
  615. return fristList.filter((item: any) => !data.userInfo.list.some((infoItem: any) => infoItem.imUserId === item.imUserId));
  616. };
  617. const cancel = () => {
  618. toggleMask();
  619. };
  620. const toggleMask = async (type?: string) => {
  621. data.selectedList = [];
  622. switch (type) {
  623. case "add":
  624. data.isRadio = false;
  625. data.transferList = await friendList();
  626. data.transferTitle = "添加成员";
  627. break;
  628. case "remove":
  629. data.isRadio = false;
  630. data.transferList = data.userInfo.list.filter(
  631. (item: any) =>
  632. // eslint-disable-next-line no-unsafe-optional-chaining
  633. item.userID !== data.conversation?.groupProfile?.selfInfo.userID
  634. );
  635. data.transferTitle = "删除成员";
  636. break;
  637. case "addAdmin":
  638. data.isRadio = true;
  639. data.transferList = data.member.member;
  640. data.transferTitle = "新增管理员";
  641. break;
  642. case "removeAdmin":
  643. data.isRadio = true;
  644. data.transferList = data.member.admin;
  645. data.transferTitle = "移除管理员";
  646. break;
  647. case "changeOwner":
  648. data.isRadio = true;
  649. data.transferList = [...data.member.admin, ...data.member.member];
  650. data.transferTitle = "转让群组";
  651. console.log(data.transferList, "data.transferList");
  652. break;
  653. case "addMute":
  654. data.isRadio = true;
  655. data.transferList = data.member.member;
  656. if (data.conversation.groupProfile.selfInfo.role === "Owner") {
  657. data.transferList = [...data.member.admin, ...data.member.member];
  658. }
  659. data.transferTitle = "新增禁言用户";
  660. break;
  661. case "removeMute":
  662. data.isRadio = true;
  663. data.transferList = data.member.muteMember;
  664. data.transferTitle = "移除禁言用户";
  665. break;
  666. default:
  667. break;
  668. }
  669. data.transferType = type;
  670. data.mask = !data.mask;
  671. };
  672. onClickOutside(dialog, () => {
  673. data.show = false;
  674. });
  675. const toggleShow = () => {
  676. if (!GroupServer) {
  677. const message = t("TUIChat.manage.请先注册 TUIGroup 模块");
  678. return handleErrorPrompts(message, props);
  679. }
  680. data.show = !data.show;
  681. if (!data.show) {
  682. data.currentTab = "";
  683. }
  684. if (data.show) {
  685. getMember();
  686. }
  687. };
  688. // 禁言
  689. const setAllMuteTime = async (value: boolean) => {
  690. // updateProfile({ key: "muteAllMembers", value });
  691. // (window as any)?.TUIKitTUICore?.isOfficial && VuexStore?.commit && VuexStore?.commit("handleTask", 4);
  692. try {
  693. await imGroupMuteAll({
  694. groupId: data.conversation.groupProfile.groupID,
  695. muteAll: value,
  696. });
  697. getGroupDetail();
  698. } catch {
  699. //
  700. }
  701. };
  702. const handleManage = (userList: any, type: any) => {
  703. const userIDList: any = [];
  704. userList.map((item: any) => {
  705. userIDList.push(item.imUserId);
  706. return item;
  707. });
  708. switch (type) {
  709. case "add":
  710. addMember(userIDList);
  711. break;
  712. case "remove":
  713. kickedOut(userIDList);
  714. break;
  715. case "addAdmin":
  716. handleAdmin(userList[0]);
  717. break;
  718. case "removeAdmin":
  719. handleAdmin(userList[0]);
  720. break;
  721. case "changeOwner":
  722. changeOwner(userIDList[0]);
  723. break;
  724. case "addMute":
  725. setMemberMuteTime(userIDList[0], "add");
  726. break;
  727. case "removeMute":
  728. setMemberMuteTime(userIDList[0], "remove");
  729. break;
  730. case "quit":
  731. // 退出群聊
  732. imGroupQuit({
  733. id: data.conversation.groupProfile.groupID,
  734. }).then(() => {
  735. eventGlobal.emit("removeGroup", data.conversation.groupProfile.groupID);
  736. manage.TUIServer.deleteConversation(data.conversation.conversationID);
  737. manage.TUIServer.store.conversation = {};
  738. toggleShow();
  739. });
  740. break;
  741. case "dismiss":
  742. // 解散群
  743. imGroupDismiss({
  744. id: data.conversation.groupProfile.groupID,
  745. })
  746. .then(() => {
  747. eventGlobal.emit("removeGroup", data.conversation.groupProfile.groupID);
  748. manage.TUIServer.deleteConversation(data.conversation.conversationID);
  749. manage.TUIServer.store.conversation = {};
  750. toggleShow();
  751. })
  752. .catch((err: any) => {
  753. TUIMessage({
  754. message: err.message,
  755. isH5: false,
  756. type: "error",
  757. });
  758. });
  759. break;
  760. default:
  761. break;
  762. }
  763. };
  764. const handleGroupIDCopy = async () => {
  765. try {
  766. const { toClipboard } = useClipboard();
  767. await toClipboard(data?.conversation?.groupProfile?.groupID);
  768. } catch (error) {
  769. handleErrorPrompts(error, data.env);
  770. }
  771. };
  772. const handleMemberProfileShow = (user: any) => {
  773. data.currentMember = user;
  774. setTab("profile");
  775. };
  776. const getGroupMemberUserDetail = async () => {
  777. try {
  778. console.log(data?.conversation?.groupProfile, "data?.conversation?.groupProfile?");
  779. const res = await imGroupMemberUserDetail({
  780. groupId: data?.conversation?.groupProfile?.groupID,
  781. imUserId: data?.conversation?.groupProfile?.selfInfo.userID,
  782. });
  783. data.currentUserDetail = res.data;
  784. } catch {
  785. //
  786. }
  787. };
  788. /** 获取群详情 */
  789. const getGroupDetail = async () => {
  790. try {
  791. const res = await imGroupDetail({ id: data?.conversation?.groupProfile?.groupID });
  792. const tdata = res.data;
  793. tdata.configJson = tdata.configJson ? JSON.parse(tdata.configJson) : {};
  794. data.groupDetail = tdata;
  795. } catch {
  796. //
  797. }
  798. };
  799. watch(
  800. () => data.show,
  801. () => {
  802. if (data.show) {
  803. try {
  804. getGroupDetail();
  805. getGroupMemberUserDetail();
  806. } catch {
  807. //
  808. }
  809. }
  810. }
  811. );
  812. onMounted(() => {
  813. try {
  814. data.platform = sessionStorage.getItem("platform") || "classroom";
  815. getGroupDetail();
  816. getGroupMemberUserDetail();
  817. console.log(data?.conversation, "data?.conversation?");
  818. // console.log(data.userInfo.list, "data.userInfo.list");
  819. } catch {
  820. //
  821. }
  822. });
  823. return {
  824. ...toRefs(data),
  825. isDismissGroupAuth,
  826. isShowAddMember,
  827. isSetMuteTime,
  828. isAdmin,
  829. isAuth,
  830. addMember,
  831. deleteMember,
  832. changeOwner,
  833. quit,
  834. dismiss,
  835. handleAdmin,
  836. setMemberMuteTime,
  837. kickedOut,
  838. edit,
  839. updateProfile,
  840. setTab,
  841. TabName,
  842. getMember,
  843. handleSearchMember,
  844. submit,
  845. cancel,
  846. toggleMask,
  847. toggleShow,
  848. setAllMuteTime,
  849. handleManage,
  850. showUserNum,
  851. dialog,
  852. handleGroupIDCopy,
  853. handleMemberProfileShow,
  854. };
  855. },
  856. });
  857. export default manage;
  858. </script>
  859. <style lang="scss" scoped src="./style/index.scss"></style>