Skip to content

Commit b35f60d

Browse files
Added web support for attachments
1 parent e8140cd commit b35f60d

3 files changed

Lines changed: 49 additions & 2 deletions

File tree

web/components/MessageThread.vue

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,13 @@
9595
<v-list-item-title>
9696
{{ thread.contact | phoneNumber }}
9797
</v-list-item-title>
98-
<v-list-item-subtitle>
99-
{{ thread.last_message_content }}
98+
<v-list-item-subtitle class="text--secondary">
99+
<span v-if="thread.last_message_content">
100+
{{ thread.last_message_content }}
101+
</span>
102+
<span v-else>
103+
<v-icon small>{{ mdiPaperclip }}</v-icon> Multimedia Message
104+
</span>
100105
</v-list-item-subtitle>
101106
</v-list-item-content>
102107
<v-list-item-action>
@@ -150,6 +155,7 @@ import {
150155
mdiCheck,
151156
mdiAlert,
152157
mdiAccount,
158+
mdiPaperclip,
153159
} from '@mdi/js'
154160
155161
@Component
@@ -160,6 +166,7 @@ export default class MessageThread extends Vue {
160166
mdiAlert = mdiAlert
161167
mdiCheck = mdiCheck
162168
mdiCheckAll = mdiCheckAll
169+
mdiPaperclip = mdiPaperclip
163170
164171
get threads(): Array<MessageThread> {
165172
return this.$store.getters.getThreads

web/models/message.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1+
export interface MessageAttachment {
2+
content_type: string
3+
url: string
4+
}
5+
16
export interface Message {
27
contact: string
38
content: string
9+
attachments?: MessageAttachment[]
410
created_at: string
511
failure_reason: string
612
id: string

web/pages/messages/index.vue

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@
3333
placeholder="Enter your message here"
3434
label="Content"
3535
></v-textarea>
36+
<v-textarea
37+
v-model="formAttachments"
38+
:error="errors.has('attachments')"
39+
:error-messages="errors.get('attachments')"
40+
:disabled="sending"
41+
outlined
42+
rows="2"
43+
placeholder="https://example.com/image.jpg, https://example.com/video.mp4"
44+
label="Attachment URLs (comma separated, optional)"
45+
></v-textarea>
3646
<v-btn
3747
type="submit"
3848
class="primary"
@@ -72,6 +82,7 @@ export default {
7282
sending: false,
7383
formPhoneNumber: '',
7484
formContent: '',
85+
formAttachments: '',
7586
errors: new Map(),
7687
}
7788
},
@@ -85,11 +96,31 @@ export default {
8596
sendMessage() {
8697
this.errors = new Map()
8798
this.sending = true
99+
100+
const attachments = []
101+
if (this.formAttachments.trim() !== '') {
102+
const urls = this.formAttachments.split(',')
103+
for (const u of urls) {
104+
const cleanUrl = u.trim()
105+
if (!cleanUrl) continue
106+
107+
let contentType = 'application/octet-stream'
108+
const lowerUrl = cleanUrl.toLowerCase()
109+
if (lowerUrl.endsWith('.jpg') || lowerUrl.endsWith('.jpeg')) contentType = 'image/jpeg'
110+
else if (lowerUrl.endsWith('.png')) contentType = 'image/png'
111+
else if (lowerUrl.endsWith('.gif')) contentType = 'image/gif'
112+
else if (lowerUrl.endsWith('.mp4')) contentType = 'video/mp4'
113+
114+
attachments.push({ content_type: contentType, url: cleanUrl })
115+
}
116+
}
117+
88118
axios
89119
.post('/v1/messages/send', {
90120
to: this.formPhoneNumber,
91121
from: this.$store.getters.getOwner,
92122
content: this.formContent,
123+
attachments: attachments,
93124
sim: this.simSelected.code,
94125
})
95126
.then(() => {
@@ -113,6 +144,9 @@ export default {
113144
),
114145
)
115146
}
147+
if (response.data.data.attachments) {
148+
errors.set('attachments', response.data.data.attachments)
149+
}
116150
if (response.data.data.from) {
117151
this.$store.dispatch('addNotification', {
118152
message: response.data.data.from[0],

0 commit comments

Comments
 (0)