MessageSection.vue 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 Message from './Message.vue'
  19. import { mapActions, mapGetters } from 'vuex'
  20. export default {
  21. name: 'MessageSection',
  22. components: { Message },
  23. data () {
  24. return {
  25. text: ''
  26. }
  27. },
  28. computed: mapGetters({
  29. thread: 'currentThread',
  30. messages: 'sortedMessages'
  31. }),
  32. watch: {
  33. 'thread.lastMessage': function () {
  34. this.$nextTick(() => {
  35. const ul = this.$refs.list
  36. ul.scrollTop = ul.scrollHeight
  37. })
  38. }
  39. },
  40. methods: mapActions({
  41. sendMessage (dispatch) {
  42. const { text, thread } = this
  43. if (text.trim()) {
  44. dispatch('sendMessage', {
  45. text,
  46. thread
  47. })
  48. this.text = ''
  49. }
  50. }
  51. })
  52. }
  53. </script>