|
123 | 123 | </template> |
124 | 124 |
|
125 | 125 | <script lang="ts"> |
126 | | -import { Vue, Component } from 'vue-property-decorator' |
| 126 | +import Vue from 'vue' |
127 | 127 | import { InputValidationRules } from 'vuetify' |
128 | 128 | import { Message } from '~/models/message' |
129 | 129 | import { SendMessageRequest } from '~/store' |
130 | 130 |
|
131 | | -@Component |
132 | | -export default class ThreadsIndex extends Vue { |
133 | | - formMessage = '' |
134 | | - formMessageRules: InputValidationRules = [ |
135 | | - (v) => !!v || 'Message is required', |
136 | | - (v) => (v && v.length <= 320) || 'Message must be less than 320 characters', |
137 | | - ] |
| 131 | +export default Vue.extend({ |
| 132 | + middleware: ['auth'], |
| 133 | + data() { |
| 134 | + const formMessageRules: InputValidationRules = [ |
| 135 | + (v) => !!v || 'Message is required', |
| 136 | + (v) => |
| 137 | + (v && v.length <= 320) || 'Message must be less than 320 characters', |
| 138 | + ] |
| 139 | + return { |
| 140 | + formMessage: '', |
| 141 | + formMessageRules, |
| 142 | + submitting: false, |
| 143 | + } |
| 144 | + }, |
138 | 145 |
|
139 | | - submitting = false |
| 146 | + computed: { |
| 147 | + messages(): Array<Message> { |
| 148 | + return [...this.$store.getters.getThreadMessages].reverse() |
| 149 | + }, |
| 150 | + }, |
140 | 151 |
|
141 | | - async mounted(): Promise<void> { |
| 152 | + async mounted() { |
142 | 153 | await this.$store.dispatch('loadThreads') |
143 | 154 | await this.$store.dispatch('loadThreadMessages', this.$route.params.id) |
144 | 155 | this.scrollToElement() |
145 | | - } |
146 | | -
|
147 | | - get messages(): Array<Message> { |
148 | | - return [...this.$store.getters.getThreadMessages].reverse() |
149 | | - } |
150 | | -
|
151 | | - isPending(message: Message): boolean { |
152 | | - return ['sending', 'pending'].includes(message.status) |
153 | | - } |
154 | | -
|
155 | | - isMT(message: Message): boolean { |
156 | | - return message.type === 'mobile-terminated' |
157 | | - } |
158 | | -
|
159 | | - scrollToElement() { |
160 | | - const el: Element = this.$refs.messageBody as Element |
161 | | - el.scrollTop = el.scrollHeight + 120 |
162 | | - } |
163 | | -
|
164 | | - async sendMessage(event: KeyboardEvent) { |
165 | | - if (event.shiftKey) { |
166 | | - return |
167 | | - } |
168 | | -
|
169 | | - if (!(this.$refs.form as any).validate()) { |
170 | | - return |
171 | | - } |
172 | | -
|
173 | | - this.submitting = true |
174 | | - const request: SendMessageRequest = { |
175 | | - from: this.$store.getters.getOwner, |
176 | | - to: this.$store.getters.getThread.contact, |
177 | | - content: this.formMessage, |
178 | | - } |
179 | | -
|
180 | | - await this.$store.dispatch('sendMessage', request) |
181 | | -
|
182 | | - this.formMessage = '' |
183 | | - this.submitting = false |
184 | | -
|
185 | | - this.$nextTick(() => { |
186 | | - ;(this.$refs.messageInput as any).$refs.input.focus() |
187 | | - this.scrollToElement() |
188 | | - ;(this.$refs.form as any).reset() |
189 | | - }) |
190 | | - } |
191 | | -} |
| 156 | + }, |
| 157 | +
|
| 158 | + methods: { |
| 159 | + isPending(message: Message): boolean { |
| 160 | + return ['sending', 'pending'].includes(message.status) |
| 161 | + }, |
| 162 | +
|
| 163 | + isMT(message: Message): boolean { |
| 164 | + return message.type === 'mobile-terminated' |
| 165 | + }, |
| 166 | +
|
| 167 | + scrollToElement() { |
| 168 | + const el: Element = this.$refs.messageBody as Element |
| 169 | + el.scrollTop = el.scrollHeight + 120 |
| 170 | + }, |
| 171 | +
|
| 172 | + async sendMessage(event: KeyboardEvent) { |
| 173 | + if (event.shiftKey) { |
| 174 | + return |
| 175 | + } |
| 176 | +
|
| 177 | + if (!(this.$refs.form as any).validate()) { |
| 178 | + return |
| 179 | + } |
| 180 | +
|
| 181 | + this.submitting = true |
| 182 | +
|
| 183 | + const request: SendMessageRequest = { |
| 184 | + from: this.$store.getters.getOwner, |
| 185 | + to: this.$store.getters.getThread.contact, |
| 186 | + content: this.formMessage, |
| 187 | + } |
| 188 | +
|
| 189 | + await this.$store.dispatch('sendMessage', request) |
| 190 | +
|
| 191 | + this.formMessage = '' |
| 192 | + this.submitting = false |
| 193 | +
|
| 194 | + this.$nextTick(() => { |
| 195 | + ;(this.$refs.messageInput as any).$refs.input.focus() |
| 196 | + this.scrollToElement() |
| 197 | + ;(this.$refs.form as any).reset() |
| 198 | + }) |
| 199 | + }, |
| 200 | + }, |
| 201 | +}) |
192 | 202 | </script> |
193 | 203 |
|
194 | 204 | <style lang="scss"> |
|
0 commit comments