<template> <div class="message-section"> <h3 class="message-thread-heading">{{ thread.name }}</h3> <ul class="message-list" ref="list"> <message v-for="message in messages" :key="message.id" :message="message"> </message> </ul> <textarea class="message-composer" v-model="text" @keyup.enter="sendMessage"></textarea> </div> </template> <script> import { ref, computed, watch, nextTick } from 'vue' import { useStore } from 'vuex' import Message from './Message.vue' export default { name: 'MessageSection', components: { Message }, setup () { const list = ref(null) const store = useStore() const text = ref('') const thread = computed(() => store.getters.currentThread) const messages = computed(() => store.getters.sortedMessages) watch(() => thread.value.lastMessage, () => { nextTick(() => { const ul = list.value ul.scrollTop = ul.scrollHeight }) }) function sendMessage () { const trimedText = text.value.trim() if (trimedText) { store.dispatch('sendMessage', { text: trimedText, thread: thread.value }) this.text = '' } } return { list, text, thread, messages, sendMessage } } } </script>