1
0

MessageSection.vue 1.2 KB

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