index.vue 23 KB

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