MessageSection.vue 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <template>
  2. <div class="message-section">
  3. <h3 class="message-thread-heading">{{ thread.name }}</h3>
  4. <ul class="message-list" v-el:list>
  5. <message
  6. v-for="message in messages | orderBy 'timestamp'"
  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. export default {
  18. components: { Message },
  19. vuex: {
  20. state: {
  21. thread ({ currentThreadID, threads }) {
  22. return currentThreadID ? threads[currentThreadID] : {}
  23. },
  24. messages ({ messages }) {
  25. const messageIds = this.thread.messages
  26. return messageIds && messageIds.map(id => messages[id])
  27. }
  28. },
  29. actions: {
  30. sendMessage
  31. }
  32. },
  33. watch: {
  34. 'thread.lastMessage': function () {
  35. this.$nextTick(() => {
  36. const ul = this.$els.list
  37. ul.scrollTop = ul.scrollHeight
  38. })
  39. }
  40. },
  41. methods: {
  42. trySendMessage (e) {
  43. const text = e.target.value
  44. if (text.trim()) {
  45. this.sendMessage(text, this.thread)
  46. e.target.value = ''
  47. }
  48. }
  49. }
  50. }
  51. </script>