index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <Dialog
  3. :show="show"
  4. :isH5="!isPC"
  5. :isHeaderShow="false"
  6. :isFooterShow="false"
  7. :background="false"
  8. @update:show="toggleShow"
  9. >
  10. <Transfer
  11. :isSearch="true"
  12. :title="title"
  13. :list="searchMemberList"
  14. :isH5="!isPC"
  15. :isRadio="false"
  16. @search="search"
  17. @submit="submit"
  18. @cancel="cancel"
  19. />
  20. </Dialog>
  21. </template>
  22. <script setup lang="ts">
  23. import {
  24. TUIGroupService,
  25. TUIUserService,
  26. } from '@tencentcloud/chat-uikit-engine';
  27. import { ref, computed, watch } from '../../../../adapter-vue';
  28. import Dialog from '../../../common/Dialog/index.vue';
  29. import Transfer from '../../../common/Transfer/index.vue';
  30. import { isPC } from '../../../../utils/env';
  31. const props = defineProps({
  32. // 类型: voiceCall/groupCall/...
  33. type: {
  34. type: String,
  35. default: '',
  36. },
  37. currentConversation: {
  38. type: Object,
  39. default: () => ({}),
  40. },
  41. isGroup: {
  42. type: Boolean,
  43. default: false,
  44. },
  45. });
  46. const emits = defineEmits(['submit', 'cancel']);
  47. const show = ref<boolean>(false);
  48. const groupID = ref<string>('');
  49. const memberList = ref<Array<any>>([]);
  50. const searchMemberList = ref<Array<any>>([]);
  51. const selfUserID = ref<string>('');
  52. const titleMap: any = {
  53. voiceCall: '发起群语音',
  54. videoCall: '发起群视频',
  55. };
  56. const title = computed(() => {
  57. return titleMap[props.type] ? titleMap[props.type] : '';
  58. });
  59. TUIUserService.getUserProfile().then((res: any) => {
  60. if (res?.data?.userID) {
  61. selfUserID.value = res.data.userID;
  62. }
  63. });
  64. watch(
  65. () => [props?.currentConversation?.conversationID, show.value],
  66. (newVal: any, oldVal: any) => {
  67. if (newVal && newVal !== oldVal) {
  68. if (props.isGroup && show.value) {
  69. groupID.value = props.currentConversation.groupProfile.groupID;
  70. TUIGroupService.getGroupMemberList({
  71. groupID: groupID.value,
  72. }).then((res: any) => {
  73. memberList.value = res?.data?.memberList?.filter(
  74. (user: any) => user?.userID !== selfUserID.value,
  75. );
  76. searchMemberList.value = memberList.value;
  77. });
  78. } else {
  79. groupID.value = '';
  80. memberList.value = [];
  81. searchMemberList.value = memberList.value;
  82. }
  83. }
  84. },
  85. {
  86. immediate: true,
  87. },
  88. );
  89. const search = (searchInfo: string) => {
  90. const results = memberList.value?.filter(
  91. (member: any) => member?.userID === searchInfo,
  92. );
  93. searchMemberList.value = results?.length ? results : memberList.value;
  94. };
  95. const submit = (selectedMemberList: Array<string>) => {
  96. const userIDList: Array<string> = [];
  97. selectedMemberList?.forEach((user: any) => {
  98. user?.userID && userIDList.push(user.userID);
  99. });
  100. if (props.type === 'voiceCall') {
  101. emits('submit', { userIDList, groupID: groupID.value, type: 1 });
  102. } else if (props.type === 'videoCall') {
  103. emits('submit', { userIDList, groupID: groupID.value, type: 2 });
  104. }
  105. searchMemberList.value = memberList.value;
  106. toggleShow(false);
  107. };
  108. const cancel = () => {
  109. searchMemberList.value = memberList.value;
  110. emits('cancel');
  111. toggleShow(false);
  112. };
  113. const toggleShow = (showStatus: boolean) => {
  114. show.value = showStatus;
  115. };
  116. defineExpose({
  117. toggleShow,
  118. });
  119. </script>