MessageSection.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <template>
  2. <div class="message-section">
  3. <h3 class="message-thread-heading">{{ thread.name }}</h3>
  4. <ul class="message-list" ref="list">
  5. <message
  6. v-for="message in messages"
  7. :key="message.id"
  8. :message="message">
  9. </message>
  10. </ul>
  11. <textarea
  12. class="message-composer"
  13. v-model="text"
  14. @keyup.enter="sendMessage"></textarea>
  15. </div>
  16. </template>
  17. <script>
  18. import { ref, computed, watch, nextTick } from 'vue'
  19. import { useStore } from 'vuex'
  20. import Message from './Message.vue'
  21. export default {
  22. name: 'MessageSection',
  23. components: { Message },
  24. setup () {
  25. const list = ref(null)
  26. const store = useStore()
  27. const text = ref('')
  28. const thread = computed(() => store.getters.currentThread)
  29. const messages = computed(() => store.getters.sortedMessages)
  30. watch(() => thread.value.lastMessage, () => {
  31. nextTick(() => {
  32. const ul = list.value
  33. ul.scrollTop = ul.scrollHeight
  34. })
  35. })
  36. function sendMessage () {
  37. const trimedText = text.value.trim()
  38. if (trimedText) {
  39. store.dispatch('sendMessage', {
  40. text: trimedText,
  41. thread: thread.value
  42. })
  43. this.text = ''
  44. }
  45. }
  46. return {
  47. list,
  48. text,
  49. thread,
  50. messages,
  51. sendMessage
  52. }
  53. }
  54. }
  55. </script>