group-invite.vue 3.6 KB

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