Skip to content

Commit 39a3443

Browse files
committed
(UI) add voice message duration
1 parent af2fa68 commit 39a3443

File tree

5 files changed

+48
-9
lines changed

5 files changed

+48
-9
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,8 @@ messages="[
532532
name: 'My File',
533533
size: 67351,
534534
type: 'png',
535+
audio: true,
536+
duration: 14.4,
535537
url: 'https://firebasestorage.googleapis.com/...'
536538
},
537539
reactions: {

demo/src/ChatContainer.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,10 @@ export default {
394394
type: file.type,
395395
url: file.localUrl
396396
}
397-
if (file.audio) message.file.audio = true
397+
if (file.audio) {
398+
message.file.audio = true
399+
message.file.duration = file.duration
400+
}
398401
}
399402
400403
if (replyMessage) {
@@ -429,7 +432,10 @@ export default {
429432
type: file.type,
430433
url: file.url || file.localUrl
431434
}
432-
if (file.audio) message.file.audio = true
435+
if (file.audio) {
436+
message.file.audio = true
437+
message.file.duration = file.duration
438+
}
433439
} else {
434440
newMessage.file = deleteDbField
435441
}

src/ChatWindow/Message.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
<div v-else-if="message.file.audio" class="audio-message">
133133
<div id="player">
134134
<audio controls v-if="message.file.audio">
135-
<source :src="message.file.url" type="audio/mpeg" />
135+
<source :src="message.file.url" />
136136
</audio>
137137
</div>
138138
</div>

src/ChatWindow/Room.vue

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -541,23 +541,49 @@ export default {
541541
this.recorder.onerror = event => reject(event.name)
542542
})
543543
544-
stopped.then(() => {
544+
stopped.then(async () => {
545545
stream.getTracks().forEach(track => track.stop())
546546
547-
const recordedBlob = new Blob(this.recordedChunks, {
547+
const blob = new Blob(this.recordedChunks, {
548548
type: 'audio/ogg; codecs="opus"'
549549
})
550550
551+
const duration = await this.getBlobDuration(blob)
552+
551553
this.file = {
552-
blob: recordedBlob,
554+
blob: blob,
553555
name: 'audio',
554-
size: recordedBlob.size,
555-
type: recordedBlob.type,
556+
size: blob.size,
557+
duration: duration,
558+
type: blob.type,
556559
audio: true,
557-
localUrl: URL.createObjectURL(recordedBlob)
560+
localUrl: URL.createObjectURL(blob)
558561
}
559562
})
560563
},
564+
getBlobDuration(blob) {
565+
const tempVideoEl = document.createElement('video')
566+
567+
const durationP = new Promise(resolve =>
568+
tempVideoEl.addEventListener('loadedmetadata', () => {
569+
if (tempVideoEl.duration === Infinity) {
570+
tempVideoEl.currentTime = Number.MAX_SAFE_INTEGER
571+
tempVideoEl.ontimeupdate = () => {
572+
tempVideoEl.ontimeupdate = null
573+
resolve(tempVideoEl.duration)
574+
tempVideoEl.currentTime = 0
575+
}
576+
} else resolve(tempVideoEl.duration)
577+
})
578+
)
579+
580+
tempVideoEl.src =
581+
typeof blob === 'string' || blob instanceof String
582+
? blob
583+
: window.URL.createObjectURL(blob)
584+
585+
return durationP
586+
},
561587
addNewMessage(message) {
562588
this.newMessages.push(message)
563589
},

src/ChatWindow/RoomsList.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
<slot name="microphone-icon">
9393
<svg-icon name="microphone" class="icon-microphone" />
9494
</slot>
95+
{{ formattedDuration(room.lastMessage.file.duration) }}
9596
</div>
9697
<format-message
9798
v-else-if="room.lastMessage"
@@ -203,6 +204,10 @@ export default {
203204
204205
return `${user.username} - ${content}`
205206
},
207+
formattedDuration(s) {
208+
s = Math.round(s)
209+
return (s - (s %= 60)) / 60 + (9 < s ? ':' : ':0') + s
210+
},
206211
isMessageCheckmarkVisible(room) {
207212
return (
208213
room.lastMessage &&

0 commit comments

Comments
 (0)