message-model.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { defineComponent } from "vue";
  2. import { ElTag } from "element-plus";
  3. import VirtualList from 'vue-virtual-scroll-v3'
  4. import styles from './index.module.less'
  5. import event, { LIVE_EVENT_MESSAGE } from '/src/components/live-broadcast/event';
  6. import { state } from '/src/state'
  7. import dayjs from 'dayjs';
  8. import Empty from "/src/components/empty";
  9. export default defineComponent({
  10. props: {
  11. data: {
  12. type: Array,
  13. default: () => ([])
  14. }
  15. },
  16. data() {
  17. return {
  18. messageList: [] as any[], // 回复学生列表
  19. loadingMessage: false, // 观看列表状态
  20. }
  21. },
  22. mounted() {
  23. this.loadingMessage = true
  24. event.on(LIVE_EVENT_MESSAGE["RC:TxtMsg"], this.onMessage);
  25. setTimeout(() => {
  26. this.loadingMessage = false;
  27. }, 2000);
  28. },
  29. beforeUnmount() {
  30. event.off(LIVE_EVENT_MESSAGE["RC:TxtMsg"], this.onMessage);
  31. },
  32. methods: {
  33. onMessage(value: any) {
  34. if (value && value.user) {
  35. console.log(state.user)
  36. console.log(value)
  37. const sendTime = dayjs(value.$EventMessage.sentTime || new Date()).format('HH:mm:ss')
  38. let tempObj = {
  39. name: value.user?.name,
  40. id: value.user.id,
  41. isSelf: false,
  42. content: value.content,
  43. sendTime
  44. }
  45. // 判断是否是主播
  46. if (value.user.id === state.user.id) {
  47. tempObj.isSelf = true
  48. }
  49. this.messageList.push(tempObj);
  50. this.loadingMessage = false
  51. }
  52. console.log(this.messageList)
  53. }
  54. },
  55. render() {
  56. return (
  57. // <VirtualList class="list-dynamic scroll-touch"
  58. // :data-key="'id'"
  59. // :data-sources="items"
  60. // :estimate-size="80"
  61. // :item-class="'list-item-dynamic'"
  62. // ref="virtualList"
  63. // >
  64. // <template #={source}>
  65. // <div class="item-inner">
  66. // <div class="head">
  67. // <span># {{ source.index }}</span>
  68. // <span>{{ source.name }}</span>
  69. // </div>
  70. // <div class="desc">{{ source.desc }}</div>
  71. // </div>
  72. // </template>
  73. // </VirtualList>
  74. // <VirtualList class={styles.itemContent}
  75. // dataKey="id"
  76. // dataSources={this.messageList}
  77. // estimateSize="85"
  78. // itemClass="'itemInfo'"
  79. // ref="virtualList">
  80. // <template #default={source}>
  81. // <div class="item-inner">
  82. // 111
  83. // </div>
  84. // </template>
  85. // </VirtualList>
  86. <div style={{ minHeight: '100%', position: 'relative' }}>
  87. {this.messageList.length > 0 ? this.messageList.map((item : any) => (
  88. <div class={styles.itemContent}>
  89. <img src="/src/assets/home/placeholder-icon.png" alt="" />
  90. <div class={styles.itemInfo}>
  91. <div class={styles.itemName}>
  92. <p class={styles.userName}>{item.name} {item.isSelf ? <ElTag>主播</ElTag> : null}</p>
  93. <p class={styles.rightTime}>{ item.sendTime }</p>
  94. </div>
  95. <div class={[styles.itemText, item.isSelf ? styles.active : null]}>
  96. { item.content }
  97. </div>
  98. </div>
  99. </div>
  100. )) : this.loadingMessage ? <div class={styles.loadingStyle} v-loading={this.loadingMessage} element-loading-background="rgba(0, 0, 0, 0.8)"></div> : <Empty style={{ paddingTop: '120px' }} text="暂无学员互动!" icon="noData-no-message" />}
  101. </div>
  102. )
  103. }
  104. })