index.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <SelectUser
  3. :isRadio="selectOptions.isRadio"
  4. :isNeedSearch="selectOptions.isNeedSearch"
  5. :title="selectOptions.title"
  6. :userList="userList"
  7. @search="handleSearch"
  8. @complete="handleSelectedResult"
  9. />
  10. </template>
  11. <script lang="ts" setup>
  12. import {
  13. TUIFriendService,
  14. TUIStore,
  15. StoreName,
  16. TUITranslateService,
  17. } from '@tencentcloud/chat-uikit-engine';
  18. import { ref, watchEffect } from '../../../adapter-vue';
  19. import { Toast, TOAST_TYPE } from '../../common/Toast/index';
  20. import TUICore from '@tencentcloud/tui-core';
  21. import SelectUser from '../../common/SelectUser/index.vue';
  22. import Server from '../server';
  23. const TUIContactServer = Server.getInstance();
  24. const TUIConstants = TUIContactServer.constants;
  25. const needSearch = ref(false);
  26. const friendList = ref([]);
  27. const userList = ref([]);
  28. const TUISearchServer = ref<any>(null);
  29. const selectOptions = ref({
  30. isRadio: false,
  31. isNeedSearch: false,
  32. title: '',
  33. });
  34. const generateSearchServer = (isNeedSearch: any) => {
  35. TUISearchServer.value = TUICore.getService(TUIConstants.TUISearch.SERVICE.NAME);
  36. if (TUISearchServer.value) {
  37. needSearch.value = isNeedSearch;
  38. } else {
  39. console.warn('请添加 TUISearch 组件');
  40. }
  41. };
  42. watchEffect(() => {
  43. const params = TUIContactServer.getOnCallParams(TUIConstants.TUIContact.SERVICE.METHOD.SELECT_FRIEND);
  44. selectOptions.value.title = params.title;
  45. selectOptions.value.isRadio = params.isRadio;
  46. selectOptions.value.isNeedSearch = params.isNeedSearch;
  47. if (params.isNeedSearch) {
  48. generateSearchServer(params.isNeedSearch);
  49. }
  50. TUIFriendService.getFriendList().then((res: any) => {
  51. friendList.value = res.data.map((item: any) => item.profile);
  52. userList.value = friendList.value;
  53. }).catch((err: any) => {
  54. console.warn('getFriendList error:', err);
  55. });
  56. });
  57. const handleSelectedResult = (memberList: Array<any>) => {
  58. TUIStore.update(StoreName.CUSTOM, 'isShowSelectFriendComponent', false);
  59. const callback = TUIContactServer.getOnCallCallback(TUIConstants.TUIContact.SERVICE.METHOD.SELECT_FRIEND);
  60. callback && callback(memberList);
  61. };
  62. const searchFail = () => {
  63. Toast({
  64. message: TUITranslateService.t('TUIGroup.该用户不存在'),
  65. type: TOAST_TYPE.ERROR,
  66. });
  67. userList.value = [...friendList.value];
  68. };
  69. const handleSearch = async (val: string) => {
  70. if (!val) {
  71. return userList.value = friendList.value;
  72. }
  73. try {
  74. const imResponse: any = await TUISearchServer.value.searchUser(val);
  75. if (!imResponse.data[0]) {
  76. return searchFail();
  77. }
  78. userList.value = imResponse.data;
  79. const searchAllResult = friendList.value.filter((item: any) => item.userID === imResponse.data[0].userID);
  80. friendList.value = searchAllResult.length ? friendList.value : [...friendList.value, ...userList.value];
  81. } catch (error) {
  82. return searchFail();
  83. }
  84. };
  85. </script>