1
0

MessageSection.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 sortedMessages"
  7. :key="message.id"
  8. :message="message">
  9. </message>
  10. </ul>
  11. <textarea class="message-composer" @keyup.enter="sendMessage"></textarea>
  12. </div>
  13. </template>
  14. <script>
  15. import Message from './Message.vue'
  16. import { mapGetters } from 'vuex'
  17. export default {
  18. name: 'MessageSection',
  19. components: { Message },
  20. computed: {
  21. ...mapGetters({
  22. thread: 'currentThread',
  23. messages: 'currentMessages'
  24. }),
  25. sortedMessages () {
  26. return this.messages
  27. .slice()
  28. .sort((a, b) => a.timestamp - b.timestamp)
  29. }
  30. },
  31. watch: {
  32. 'thread.lastMessage': function () {
  33. this.$nextTick(() => {
  34. const ul = this.$refs.list
  35. ul.scrollTop = ul.scrollHeight
  36. })
  37. }
  38. },
  39. methods: {
  40. sendMessage (e) {
  41. const text = e.target.value
  42. if (text.trim()) {
  43. this.$store.dispatch('sendMessage', {
  44. text,
  45. thread: this.thread
  46. })
  47. e.target.value = ''
  48. }
  49. }
  50. }
  51. }
  52. </script>