index.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <SelectUser
  3. :isRadio="selectOptions.isRadio"
  4. :isNeedSearch="selectOptions.isNeedSearch"
  5. :title="selectOptions.title"
  6. :userList="userList"
  7. :total="group.memberCount"
  8. @getMore="getMember"
  9. @search="handleSearch"
  10. @complete="handleSelectedResult"
  11. />
  12. </template>
  13. <script lang="ts" setup>
  14. import {
  15. TUIGroupService,
  16. TUIStore,
  17. StoreName,
  18. TUITranslateService,
  19. IGroupMember,
  20. IGroupModel,
  21. } from '@tencentcloud/chat-uikit-engine';
  22. import { ref, watchEffect } from '../../../adapter-vue';
  23. import { Toast, TOAST_TYPE } from '../../common/Toast/index';
  24. import TUICore from '@tencentcloud/tui-core';
  25. import SelectUser from '../../common/SelectUser/index.vue';
  26. import Server from '../server';
  27. const TUIContactServer = Server.getInstance();
  28. const TUIConstants = TUIContactServer.constants;
  29. const needSearch = ref(false);
  30. const memberList = ref<Array<typeof IGroupMember>>([]);
  31. const userList = ref<Array<typeof IGroupMember>>([]);
  32. const group = ref<IGroupModel>({});
  33. const selectOptions: any = ref({
  34. groupID: '',
  35. isRadio: false,
  36. isNeedSearch: false,
  37. title: '',
  38. filterUserIDList: [] as Array<string>,
  39. });
  40. const TUISearchServer = ref<any>(null);
  41. const generateSearchServer = (isNeedSearch: any) => {
  42. TUISearchServer.value = TUICore.getService(TUIConstants.TUISearch.SERVICE.NAME);
  43. if (TUISearchServer.value) {
  44. needSearch.value = isNeedSearch;
  45. } else {
  46. console.warn('请添加 TUISearch 组件');
  47. }
  48. };
  49. watchEffect(() => {
  50. const params = TUIContactServer.getOnCallParams(TUIConstants.TUIContact.SERVICE.METHOD.SELECT_FRIEND);
  51. selectOptions.value.groupID = params.groupID;
  52. selectOptions.value.title = params.title;
  53. selectOptions.value.isRadio = params.isRadio;
  54. selectOptions.value.isNeedSearch = params.isNeedSearch;
  55. selectOptions.value.filterUserIDList = params.filterUserIDList;
  56. if (params.isNeedSearch) {
  57. generateSearchServer(params.isNeedSearch);
  58. }
  59. });
  60. TUIStore.watch(StoreName.GRP, {
  61. currentGroup: (data: IGroupModel) => {
  62. group.value = data;
  63. },
  64. currentGroupMemberList: (List: Array<typeof IGroupMember>) => {
  65. memberList.value = List.map((item: typeof IGroupMember) => {
  66. if (selectOptions.value.filterUserIDList.indexOf(item.userID) > -1) {
  67. item.isDisabled = true;
  68. }
  69. });
  70. userList.value = memberList.value;
  71. },
  72. });
  73. const getMember = async () => {
  74. const groupID = group.value.groupID;
  75. const options = {
  76. groupID,
  77. count: 100,
  78. offset: memberList.value.length,
  79. };
  80. await TUIGroupService.getGroupMemberList(options);
  81. };
  82. const handleSelectedResult = (memberList: Array<any>) => {
  83. TUIStore.update(StoreName.GRP, 'isShowSelectComponent', false);
  84. const callback = TUIContactServer.getOnCallCallback(TUIConstants.TUIGroup.SERVICE.METHOD.SELECT_GROUP_MEMBER);
  85. callback && callback(memberList);
  86. };
  87. const searchFail = () => {
  88. Toast({
  89. message: TUITranslateService.t('TUIGroup.该用户不存在'),
  90. type: TOAST_TYPE.ERROR,
  91. });
  92. userList.value = [...memberList.value];
  93. };
  94. const handleSearch = async (val: string) => {
  95. if (!val) {
  96. return userList.value = memberList.value;
  97. }
  98. try {
  99. const imResponse: any = await TUISearchServer.value.searchGroupMember(val);
  100. if (!imResponse.data[0]) {
  101. return searchFail();
  102. }
  103. userList.value = imResponse.data;
  104. const searchAllResult = memberList.value.filter((item: any) => item.userID === imResponse.data[0].userID);
  105. memberList.value = searchAllResult.length ? memberList.value : [...memberList.value, ...userList.value];
  106. } catch (error) {
  107. return searchFail();
  108. }
  109. };
  110. </script>