group-invite.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <view class="page group-invite">
  3. <view class="nav-bar">
  4. <view class="nav-search">
  5. <uni-search-bar v-model="searchText" radius="100" cancelButton="none"
  6. placeholder="输入好友昵称搜索"></uni-search-bar>
  7. </view>
  8. </view>
  9. <view class="friend-items">
  10. <scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true">
  11. <view v-for="friend in friendItems" :key="friend.id">
  12. <view v-show="!searchText || friend.nickName.includes(searchText)" class="friend-item"
  13. @click="onSwitchChecked(friend)"
  14. :class="{ checked: friend.checked, disabled: friend.disabled }">
  15. <head-image :name="friend.nickName" :online="friend.online"
  16. :url="friend.headImage"></head-image>
  17. <view class="friend-name">{{ friend.nickName }}</view>
  18. </view>
  19. </view>
  20. </scroll-view>
  21. </view>
  22. <button class="bottom-btn" type="primary" :disabled="inviteSize == 0"
  23. @click="onInviteFriends()">邀请({{ inviteSize }}) </button>
  24. </view>
  25. </template>
  26. <script>
  27. export default {
  28. data() {
  29. return {
  30. groupId: null,
  31. searchText: "",
  32. groupMembers: [],
  33. friendItems: []
  34. }
  35. },
  36. methods: {
  37. onInviteFriends() {
  38. let inviteVo = {
  39. groupId: this.groupId,
  40. friendIds: []
  41. }
  42. this.friendItems.forEach((f) => {
  43. if (f.checked && !f.disabled) {
  44. inviteVo.friendIds.push(f.id);
  45. }
  46. })
  47. if (inviteVo.friendIds.length > 0) {
  48. this.$http({
  49. url: "/group/invite",
  50. method: 'POST',
  51. data: inviteVo
  52. }).then(() => {
  53. uni.showToast({
  54. title: "邀请成功",
  55. icon: 'none'
  56. })
  57. setTimeout(() => {
  58. // 回退并刷新
  59. let pages = getCurrentPages();
  60. let prevPage = pages[pages.length - 2];
  61. prevPage.$vm.loadGroupMembers();
  62. uni.navigateBack();
  63. }, 1000);
  64. })
  65. }
  66. },
  67. onShowUserInfo(userId) {
  68. uni.navigateTo({
  69. url: "/pages/common/user-info?id=" + userId
  70. })
  71. },
  72. onSwitchChecked(friend) {
  73. if (!friend.disabled) {
  74. friend.checked = !friend.checked;
  75. }
  76. },
  77. initFriendItems() {
  78. this.friendItems = [];
  79. let friends = this.friendStore.friends;
  80. friends.filter(f => !f.deleted).forEach((f => {
  81. let item = {
  82. id: f.id,
  83. headImage: f.headImage,
  84. nickName: f.nickName,
  85. online: f.online
  86. }
  87. item.disabled = this.isGroupMember(f.id);
  88. item.checked = item.disabled;
  89. this.friendItems.push(item);
  90. }))
  91. },
  92. loadGroupMembers(id) {
  93. this.$http({
  94. url: `/group/members/${id}`,
  95. method: "GET"
  96. }).then((members) => {
  97. this.groupMembers = members.filter(m => !m.quit);
  98. this.initFriendItems();
  99. })
  100. },
  101. isGroupMember(id) {
  102. return this.groupMembers.some(m => m.userId == id);
  103. }
  104. },
  105. computed: {
  106. inviteSize() {
  107. return this.friendItems.filter(f => !f.disabled && f.checked).length;
  108. }
  109. },
  110. onLoad(options) {
  111. this.groupId = options.id;
  112. this.loadGroupMembers(options.id);
  113. }
  114. }
  115. </script>
  116. <style lang="scss" scoped>
  117. .group-invite {
  118. position: relative;
  119. display: flex;
  120. flex-direction: column;
  121. .friend-items {
  122. position: relative;
  123. flex: 1;
  124. overflow: hidden;
  125. .friend-item {
  126. height: 120rpx;
  127. display: flex;
  128. margin-bottom: 1rpx;
  129. position: relative;
  130. padding: 0 30rpx;
  131. align-items: center;
  132. background-color: white;
  133. white-space: nowrap;
  134. &.disabled {
  135. background-color: $im-bg-active !important;
  136. }
  137. &.checked {
  138. background-color: $im-color-primary-light-9;
  139. }
  140. .friend-name {
  141. flex: 1;
  142. padding-left: 20rpx;
  143. font-size: 30rpx;
  144. font-weight: 600;
  145. line-height: 60rpx;
  146. white-space: nowrap;
  147. overflow: hidden;
  148. }
  149. }
  150. .scroll-bar {
  151. height: 100%;
  152. }
  153. }
  154. }
  155. </style>