index.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <view class="page_container">
  3. <custom-nav-bar title="消息接收人列表" />
  4. <u-tabs
  5. class="top_tab"
  6. :scrollable="false"
  7. :list="tabList"
  8. @click="clickTab"
  9. ></u-tabs>
  10. <view
  11. class="pane_row"
  12. :style="{ transform: `translateX(${isReaded ? '0' : '-100%'})` }"
  13. >
  14. <view class="pane_content">
  15. <u-list
  16. @scrolltolower="readedScrolltolower"
  17. :height="`${listHeight}px`"
  18. lowerThreshold="100"
  19. v-if="unReadList.length > 0"
  20. class="member_list"
  21. >
  22. <u-list-item v-for="member in unReadList" :key="member.userID">
  23. <user-item :item="member" :showRole="false" />
  24. </u-list-item>
  25. </u-list>
  26. <u-empty v-else mode="list" />
  27. </view>
  28. <view class="pane_content">
  29. <u-list
  30. @scrolltolower="unreadScrolltolower"
  31. :height="`${listHeight}px`"
  32. lowerThreshold="100"
  33. v-if="readedList.length > 0"
  34. class="member_list"
  35. >
  36. <u-list-item v-for="member in readedList" :key="member.userID">
  37. <user-item :item="member" :showRole="false" />
  38. </u-list-item>
  39. </u-list>
  40. <u-empty v-else mode="list" />
  41. </view>
  42. </view>
  43. </view>
  44. </template>
  45. <script>
  46. import IMSDK from "openim-uniapp-polyfill";
  47. import CustomNavBar from "../../../components/CustomNavBar/index.vue";
  48. import UserItem from "../../../components/UserItem/index.vue";
  49. import { PageEvents } from "../../../constant/event";
  50. export default {
  51. components: {
  52. CustomNavBar,
  53. UserItem,
  54. },
  55. data() {
  56. return {
  57. readedList: [],
  58. unReadList: [],
  59. isReaded: true,
  60. tabList: [
  61. {
  62. name: "未读",
  63. },
  64. {
  65. name: "已读",
  66. },
  67. ],
  68. conversationID: "",
  69. clientMsgID: "",
  70. messageState: {
  71. groupID: "",
  72. hasReadUserIDList: [],
  73. memberCount: 0,
  74. sendTime: 0,
  75. },
  76. unReadLoadstate: {
  77. loading: false,
  78. hasMore: true,
  79. },
  80. readedLoadstate: {
  81. loading: false,
  82. hasMore: true,
  83. },
  84. listHeight:
  85. uni.getWindowInfo().windowHeight -
  86. uni.getWindowInfo().statusBarHeight -
  87. 110,
  88. };
  89. },
  90. onLoad(options) {
  91. this.messageState = JSON.parse(options.messageState);
  92. const { readedCount, unReadCount, conversationID, clientMsgID } = this.messageState;
  93. this.conversationID = conversationID
  94. this.clientMsgID = clientMsgID
  95. this.tabList[1].name = `已读 ${readedCount}`;
  96. this.tabList[0].name = `未读 ${unReadCount}`;
  97. this.getReadedMemberList();
  98. this.getUnreadMemberList();
  99. uni.$on(PageEvents.GroupMessageReceipt, this.groupMessageHasReadedHander);
  100. },
  101. onUnload() {
  102. uni.$off(PageEvents.GroupMessageReceipt, this.groupMessageHasReadedHander);
  103. },
  104. methods: {
  105. groupMessageHasReadedHander(receipt) {
  106. if(this.clientMsgID != receipt.clientMsgID) return
  107. this.tabList[0].name = `已读 ${receipt.hasReadCount}`;
  108. this.tabList[1].name = `未读 ${receipt.unreadCount}`;
  109. const readMembers = receipt.readMembers;
  110. if (!this.readedLoadstate.hasMore) {
  111. this.readedList = [...this.readedList, ...readMembers];
  112. }
  113. const filterMembers = this.unReadList.filter(
  114. (member) => !readMembers.some((item) => item.userID === member.userID),
  115. );
  116. this.unReadList = [...filterMembers];
  117. },
  118. clickTab({ index }) {
  119. this.isReaded = index === 0;
  120. },
  121. readedScrolltolower() {
  122. if (this.readedLoadstate.hasMore && !this.readedLoadstate.loading) {
  123. this.getReadedMemberList();
  124. }
  125. },
  126. unreadScrolltolower() {
  127. if (this.unReadLoadstate.hasMore && !this.unReadLoadstate.loading) {
  128. this.getUnreadMemberList();
  129. }
  130. },
  131. getReadedMemberList() {
  132. this.readedLoadstate.loading = true;
  133. IMSDK.asyncApi(
  134. 'getGroupMessageReaderList',
  135. IMSDK.uuid(),
  136. {
  137. conversationID: this.conversationID,
  138. clientMsgID : this.clientMsgID,
  139. filter: 0,
  140. offset: this.readedList.length ?? 0,
  141. count: 20,
  142. },
  143. )
  144. .then(({ data }) => {
  145. this.readedList = [...this.readedList, ...data];
  146. this.readedLoadstate.hasMore = data.length === 20;
  147. })
  148. .finally(() => (this.readedLoadstate.loading = false));
  149. },
  150. getUnreadMemberList() {
  151. this.unReadLoadstate.loading = true;
  152. IMSDK.asyncApi(
  153. 'getGroupMessageReaderList',
  154. IMSDK.uuid(),
  155. {
  156. conversationID: this.conversationID,
  157. clientMsgID : this.clientMsgID,
  158. filter: 1,
  159. offset: this.unReadList.length ?? 0,
  160. count: 20,
  161. },
  162. )
  163. .then(({ data }) => {
  164. this.unReadList = [...this.unReadList, ...data];
  165. this.unReadLoadstate.hasMore = data.length === 20;
  166. })
  167. .finally(() => (this.unReadLoadstate.loading = false));
  168. },
  169. },
  170. };
  171. </script>
  172. <style lang="scss">
  173. .page_container {
  174. background-color: #f8f8f8;
  175. overflow-x: hidden;
  176. .u-tabs {
  177. background-color: #fff;
  178. // margin-bottom: 12px;
  179. }
  180. .pane_row {
  181. display: flex;
  182. transition: all 0.3s ease 0s !important;
  183. .pane_content {
  184. @include colBox(false);
  185. height: 100%;
  186. flex: 0 0 100%;
  187. /deep/.user_item {
  188. background-color: #fff;
  189. }
  190. }
  191. }
  192. .u-empty {
  193. margin-top: 20vh !important;
  194. }
  195. }
  196. </style>