Skip to content

Commit f95b760

Browse files
committed
(feature) multiple files upload
1 parent f881962 commit f95b760

File tree

19 files changed

+556
-552
lines changed

19 files changed

+556
-552
lines changed

demo/src/ChatContainer.vue

Lines changed: 109 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,9 @@ export default {
315315
if (!message.timestamp) return
316316
317317
let content = message.content
318-
if (message.file) {
319-
content = `${message.file.name}.${message.file.extension ||
320-
message.file.type}`
318+
if (message.files?.length) {
319+
const file = message.files[0]
320+
content = `${file.name}.${file.extension || file.type}`
321321
}
322322
323323
return {
@@ -458,25 +458,15 @@ export default {
458458
return formattedMessage
459459
},
460460
461-
async sendMessage({ content, roomId, file, replyMessage }) {
461+
async sendMessage({ content, roomId, files, replyMessage }) {
462462
const message = {
463463
sender_id: this.currentUserId,
464464
content,
465465
timestamp: new Date()
466466
}
467467
468-
if (file) {
469-
message.file = {
470-
name: file.name,
471-
size: file.size,
472-
type: file.type,
473-
extension: file.extension || file.type,
474-
url: file.localUrl
475-
}
476-
if (file.audio) {
477-
message.file.audio = true
478-
message.file.duration = file.duration
479-
}
468+
if (files) {
469+
message.files = this.formattedFiles(files)
480470
}
481471
482472
if (replyMessage) {
@@ -486,20 +476,118 @@ export default {
486476
sender_id: replyMessage.senderId
487477
}
488478
489-
if (replyMessage.file) {
490-
message.replyMessage.file = replyMessage.file
479+
if (replyMessage.files) {
480+
message.replyMessage.files = replyMessage.files
491481
}
492482
}
493483
494484
const { id } = await messagesRef(roomId).add(message)
495485
496-
if (file) this.uploadFile({ file, messageId: id, roomId })
486+
if (files) {
487+
files.forEach(file => {
488+
this.uploadFile({ file, messageId: id, roomId })
489+
})
490+
}
497491
498492
roomsRef.doc(roomId).update({ lastUpdated: new Date() })
499493
},
500494
501-
openFile({ message }) {
502-
window.open(message.file.url, '_blank')
495+
async editMessage({ messageId, newContent, roomId, files }) {
496+
const newMessage = { edited: new Date() }
497+
newMessage.content = newContent
498+
499+
if (files) {
500+
newMessage.files = this.formattedFiles(files)
501+
} else {
502+
newMessage.files = deleteDbField
503+
}
504+
505+
await messagesRef(roomId)
506+
.doc(messageId)
507+
.update(newMessage)
508+
509+
if (files) {
510+
files.forEach(file => {
511+
if (file?.blob) this.uploadFile({ file, messageId, roomId })
512+
})
513+
}
514+
},
515+
516+
async deleteMessage({ message, roomId }) {
517+
await messagesRef(roomId)
518+
.doc(message._id)
519+
.update({ deleted: new Date() })
520+
521+
const { files } = message
522+
523+
if (files) {
524+
files.forEach(file => {
525+
const deleteFileRef = filesRef
526+
.child(this.currentUserId)
527+
.child(message._id)
528+
.child(`${file.name}.${file.extension || file.type}`)
529+
530+
deleteFileRef.delete()
531+
})
532+
}
533+
},
534+
535+
async uploadFile({ file, messageId, roomId }) {
536+
let type = file.extension || file.type
537+
if (type === 'svg' || type === 'pdf') {
538+
type = file.type
539+
}
540+
541+
const uploadFileRef = filesRef
542+
.child(this.currentUserId)
543+
.child(messageId)
544+
.child(`${file.name}.${type}`)
545+
546+
await uploadFileRef.put(file.blob, { contentType: type })
547+
const url = await uploadFileRef.getDownloadURL()
548+
549+
const messageDoc = await messagesRef(roomId)
550+
.doc(messageId)
551+
.get()
552+
553+
const files = messageDoc.data().files
554+
555+
files.forEach(f => {
556+
if (f.url === file.localUrl) {
557+
f.url = url
558+
}
559+
})
560+
561+
await messagesRef(roomId)
562+
.doc(messageId)
563+
.update({ files })
564+
},
565+
566+
formattedFiles(files) {
567+
const formattedFiles = []
568+
569+
files.forEach(file => {
570+
const messageFile = {
571+
name: file.name,
572+
size: file.size,
573+
type: file.type,
574+
extension: file.extension || file.type,
575+
url: file.localUrl
576+
}
577+
578+
if (file.audio) {
579+
messageFile.audio = true
580+
messageFile.duration = file.duration
581+
}
582+
583+
formattedFiles.push(messageFile)
584+
})
585+
586+
return formattedFiles
587+
},
588+
589+
openFile({ file }) {
590+
window.open(file.file.url, '_blank')
503591
},
504592
505593
async openUserTag({ user }) {
@@ -554,71 +642,6 @@ export default {
554642
})
555643
},
556644
557-
async editMessage({ messageId, newContent, roomId, file }) {
558-
const newMessage = { edited: new Date() }
559-
newMessage.content = newContent
560-
561-
if (file) {
562-
newMessage.file = {
563-
name: file.name,
564-
size: file.size,
565-
type: file.type,
566-
extension: file.extension || file.type,
567-
url: file.url || file.localUrl
568-
}
569-
if (file.audio) {
570-
newMessage.file.audio = true
571-
newMessage.file.duration = file.duration
572-
}
573-
} else {
574-
newMessage.file = deleteDbField
575-
}
576-
577-
await messagesRef(roomId)
578-
.doc(messageId)
579-
.update(newMessage)
580-
581-
if (file?.blob) this.uploadFile({ file, messageId, roomId })
582-
},
583-
584-
async deleteMessage({ message, roomId }) {
585-
await messagesRef(roomId)
586-
.doc(message._id)
587-
.update({ deleted: new Date() })
588-
589-
const { file } = message
590-
591-
if (file) {
592-
const deleteFileRef = filesRef
593-
.child(this.currentUserId)
594-
.child(message._id)
595-
.child(`${file.name}.${file.extension || file.type}`)
596-
597-
await deleteFileRef.delete()
598-
}
599-
},
600-
601-
async uploadFile({ file, messageId, roomId }) {
602-
let type = file.extension || file.type
603-
if (type === 'svg' || type === 'pdf') {
604-
type = file.type
605-
}
606-
607-
const uploadFileRef = filesRef
608-
.child(this.currentUserId)
609-
.child(messageId)
610-
.child(`${file.name}.${type}`)
611-
612-
await uploadFileRef.put(file.blob, { contentType: type })
613-
const url = await uploadFileRef.getDownloadURL()
614-
615-
await messagesRef(roomId)
616-
.doc(messageId)
617-
.update({
618-
'file.url': url
619-
})
620-
},
621-
622645
menuActionHandler({ action, roomId }) {
623646
switch (action.name) {
624647
case 'inviteUser':

src/lib/ChatWindow.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ export default {
301301
deleteMessage(message) {
302302
this.$emit('delete-message', { message, roomId: this.room.roomId })
303303
},
304-
openFile({ message, action }) {
305-
this.$emit('open-file', { message, action })
304+
openFile({ message, file }) {
305+
this.$emit('open-file', { message, file })
306306
},
307307
openUserTag({ user }) {
308308
this.$emit('open-user-tag', { user })

src/lib/Message/Message.scss

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,6 @@
125125
fill: var(--chat-message-color-deleted);
126126
}
127127

128-
.vac-video-container {
129-
width: 350px;
130-
max-width: 100%;
131-
margin: 4px auto 5px;
132-
133-
video {
134-
border-radius: 4px;
135-
}
136-
}
137-
138128
.vac-message-image {
139129
position: relative;
140130
background-color: var(--chat-message-bg-color-image) !important;
@@ -172,21 +162,6 @@
172162
font-size: 12px;
173163
}
174164

175-
.vac-file-message {
176-
display: flex;
177-
flex-wrap: wrap;
178-
align-items: center;
179-
margin-top: 3px;
180-
181-
span {
182-
max-width: 100%;
183-
}
184-
185-
.vac-icon-file svg {
186-
margin-right: 5px;
187-
}
188-
}
189-
190165
.vac-icon-edited {
191166
-webkit-box-align: center;
192167
align-items: center;

0 commit comments

Comments
 (0)