diff --git a/package.json b/package.json index 6159b1a..22a91e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "keanuapp-weblite", - "version": "0.1.3", + "version": "0.1.4", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 0997eff..8fa14e6 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -260,12 +260,16 @@ $admin-fg: white; width: fit-content; max-width: 70%; } + .video2-bubble { + background-color: #e5e5e5; + border-radius: 10px 10px 0 10px; + } .bubble.image-bubble { padding: 0px; display: inline-block; width: 70%; max-width: 70%; - .v-image { + .v-image, video { border-radius: 10px 10px 0 10px; } } @@ -428,6 +432,21 @@ $admin-fg: white; } } +.download-overlay { + position: absolute; + left: 0; + top: 0; + width:100%; + height:100%; + background-color: rgba(0,0,0,0.4); + align-items: center; + display: flex; + .download-text { + width: 100%; + color: white; + } +} + .room-name { font-family: 'Poppins', sans-serif; font-weight: 700; diff --git a/src/components/Chat.vue b/src/components/Chat.vue index af4ebc3..9458e3a 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -302,9 +302,11 @@ import { TimelineWindow, EventTimeline } from "matrix-js-sdk"; import MessageIncomingText from "./messages/MessageIncomingText"; import MessageIncomingImage from "./messages/MessageIncomingImage.vue"; import MessageIncomingAudio from "./messages/MessageIncomingAudio.vue"; +import MessageIncomingVideo from "./messages/MessageIncomingVideo.vue"; import MessageOutgoingText from "./messages/MessageOutgoingText"; import MessageOutgoingImage from "./messages/MessageOutgoingImage.vue"; import MessageOutgoingAudio from "./messages/MessageOutgoingAudio.vue"; +import MessageOutgoingVideo from "./messages/MessageOutgoingVideo.vue"; import ContactJoin from "./messages/ContactJoin.vue"; import ContactLeave from "./messages/ContactLeave.vue"; import ContactInvited from "./messages/ContactInvited.vue"; @@ -357,9 +359,11 @@ export default { MessageIncomingText, MessageIncomingImage, MessageIncomingAudio, + MessageIncomingVideo, MessageOutgoingText, MessageOutgoingImage, MessageOutgoingAudio, + MessageOutgoingVideo, ContactJoin, ContactLeave, ContactInvited, @@ -728,6 +732,8 @@ export default { return MessageIncomingImage; } else if (event.getContent().msgtype == "m.audio") { return MessageIncomingAudio; + } else if (event.getContent().msgtype == "m.video") { + return MessageIncomingVideo; } return MessageIncomingText; } else { @@ -735,6 +741,8 @@ export default { return MessageOutgoingImage; } else if (event.getContent().msgtype == "m.audio") { return MessageOutgoingAudio; + } else if (event.getContent().msgtype == "m.video") { + return MessageOutgoingVideo; } return MessageOutgoingText; } diff --git a/src/components/messages/MessageIncomingVideo.vue b/src/components/messages/MessageIncomingVideo.vue new file mode 100644 index 0000000..6aadb3b --- /dev/null +++ b/src/components/messages/MessageIncomingVideo.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/src/components/messages/MessageOutgoingVideo.vue b/src/components/messages/MessageOutgoingVideo.vue new file mode 100644 index 0000000..13acec7 --- /dev/null +++ b/src/components/messages/MessageOutgoingVideo.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/src/components/messages/attachmentMixin.js b/src/components/messages/attachmentMixin.js index a39b155..6a5a1fa 100644 --- a/src/components/messages/attachmentMixin.js +++ b/src/components/messages/attachmentMixin.js @@ -3,13 +3,17 @@ import util from "../../plugins/utils"; export default { data() { return { - src: null + src: null, + downloadProgress: null } }, mounted() { console.log("Mounted with event:", JSON.stringify(this.event.getContent())) util - .getAttachment(this.$matrix.matrixClient, this.event) + .getAttachment(this.$matrix.matrixClient, this.event, (progress) => { + this.downloadProgress = progress; + console.log("Progress: " + progress); + }) .then((url) => { this.src = url; }) diff --git a/src/plugins/utils.js b/src/plugins/utils.js index 767df63..ea2e5cb 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -12,7 +12,7 @@ var duration = require('dayjs/plugin/duration') dayjs.extend(duration); class Util { - getAttachment(matrixClient, event) { + getAttachment(matrixClient, event, progressCallback) { return new Promise((resolve, reject) => { const content = event.getContent(); if (content.url != null) { @@ -31,7 +31,13 @@ class Util { reject("No url found!"); } - axios.get(url, { responseType: 'arraybuffer' }) + axios.get(url, { responseType: 'arraybuffer', onDownloadProgress: progressEvent => { + let percentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total); + if (progressCallback) { + progressCallback(percentCompleted); + } + } + }) .then(response => { return this.decryptIfNeeded(file, response); }) @@ -41,7 +47,12 @@ class Util { .catch(err => { console.log("Download error: ", err); reject(err); - }); + }) + .finally(() => { + if (progressCallback) { + progressCallback(null); + } + }); }); }