group-invite.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <view class="page group-invite">
  3. <view class="search-bar">
  4. <uni-search-bar v-model="searchText" cancelButton="none" placeholder="输入好友昵称搜索"></uni-search-bar>
  5. </view>
  6. <view class="friend-items">
  7. <scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true">
  8. <view v-for="friend in friendItems" v-show="!searchText || friend.nickName.startsWith(searchText)"
  9. :key="friend.id">
  10. <uni-list-chat :avatar="friend.headImage" :title="friend.nickName" :clickable="true"
  11. @click="onShowUserInfo(friend.id)">
  12. <view class="chat-custom-right">
  13. <radio :checked="friend.checked" :disabled="friend.disabled"
  14. @click.stop="onSwitchChecked(friend)" />
  15. </view>
  16. </uni-list-chat>
  17. </view>
  18. </scroll-view>
  19. </view>
  20. <view>
  21. <button type="primary" :disabled="inviteSize==0" @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. uni.navigateBack({
  58. });
  59. }, 1000);
  60. })
  61. }
  62. },
  63. onShowUserInfo(userId) {
  64. uni.navigateTo({
  65. url: "/pages/common/user-info?id=" + userId
  66. })
  67. },
  68. onSwitchChecked(friend) {
  69. if (!friend.disabled) {
  70. console.log(friend.disabled)
  71. friend.checked = !friend.checked;
  72. }
  73. },
  74. initFriendItems() {
  75. this.friendItems = [];
  76. let friends = this.$store.state.friendStore.friends;
  77. friends.forEach((f => {
  78. let item = {
  79. id: f.id,
  80. headImage: f.headImage,
  81. nickName: f.nickName,
  82. }
  83. item.disabled = this.isGroupMember(f.id);
  84. item.checked = item.disabled;
  85. this.friendItems.push(item);
  86. }))
  87. },
  88. loadGroupMembers(id) {
  89. this.$http({
  90. url: `/group/members/${id}`,
  91. method: "GET"
  92. }).then((members) => {
  93. this.groupMembers = members.filter(m => !m.quit);
  94. this.initFriendItems();
  95. })
  96. },
  97. isGroupMember(id) {
  98. return this.groupMembers.some(m => m.userId == id);
  99. }
  100. },
  101. computed: {
  102. inviteSize() {
  103. return this.friendItems.filter(f => !f.disabled && f.checked).length;
  104. }
  105. },
  106. onLoad(options) {
  107. this.groupId = options.id;
  108. this.loadGroupMembers(options.id);
  109. }
  110. }
  111. </script>
  112. <style lang="scss" scoped>
  113. .group-invite {
  114. position: relative;
  115. border: #dddddd solid 1px;
  116. display: flex;
  117. flex-direction: column;
  118. .friend-items {
  119. position: relative;
  120. flex: 1;
  121. overflow: hidden;
  122. .scroll-bar {
  123. height: 100%;
  124. }
  125. }
  126. }
  127. </style>