From 6b4034dae9578debc0d62499a68179c5e9f00bc9 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Sun, 29 Dec 2024 19:54:48 +1300 Subject: [PATCH] implement optional image compression when adding images to messages --- package-lock.json | 26 ++++ package.json | 1 + .../components/messages/AddImageButton.vue | 135 ++++++++++++++++++ .../messages/ConversationViewer.vue | 46 +++--- 4 files changed, 178 insertions(+), 30 deletions(-) create mode 100644 src/frontend/components/messages/AddImageButton.vue diff --git a/package-lock.json b/package-lock.json index 8ae2d65..7ed4d10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "autoprefixer": "^10.4.20", "axios": "^1.7.9", "click-outside-vue3": "^4.0.1", + "compressorjs": "^1.2.1", "electron-prompt": "^1.7.0", "mitt": "^3.0.1", "moment": "^2.30.1", @@ -1979,6 +1980,11 @@ "bluebird": "^3.5.5" } }, + "node_modules/blueimp-canvas-to-blob": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", + "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==" + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -2414,6 +2420,15 @@ "node": ">= 10" } }, + "node_modules/compressorjs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compressorjs/-/compressorjs-1.2.1.tgz", + "integrity": "sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==", + "dependencies": { + "blueimp-canvas-to-blob": "^3.29.0", + "is-blob": "^2.1.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3751,6 +3766,17 @@ "node": ">=8" } }, + "node_modules/is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", diff --git a/package.json b/package.json index 3979bec..ed2cba7 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ "autoprefixer": "^10.4.20", "axios": "^1.7.9", "click-outside-vue3": "^4.0.1", + "compressorjs": "^1.2.1", "electron-prompt": "^1.7.0", "mitt": "^3.0.1", "moment": "^2.30.1", diff --git a/src/frontend/components/messages/AddImageButton.vue b/src/frontend/components/messages/AddImageButton.vue new file mode 100644 index 0000000..89a120c --- /dev/null +++ b/src/frontend/components/messages/AddImageButton.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/frontend/components/messages/ConversationViewer.vue b/src/frontend/components/messages/ConversationViewer.vue index 9eb2e20..d4e942f 100644 --- a/src/frontend/components/messages/ConversationViewer.vue +++ b/src/frontend/components/messages/ConversationViewer.vue @@ -334,12 +334,9 @@ - +
+ +
@@ -369,7 +366,6 @@
- @@ -398,10 +394,12 @@ import moment from "moment"; import SendMessageButton from "./SendMessageButton.vue"; import MaterialDesignIcon from "../MaterialDesignIcon.vue"; import ConversationDropDownMenu from "./ConversationDropDownMenu.vue"; +import AddImageButton from "./AddImageButton.vue"; export default { name: 'ConversationViewer', components: { + AddImageButton, ConversationDropDownMenu, MaterialDesignIcon, SendMessageButton, @@ -1095,7 +1093,6 @@ export default { this.newMessageImageUrl = null; this.newMessageAudio = null; this.newMessageFiles = []; - this.clearImageInput(); this.clearFileInput(); } catch(e) { @@ -1166,28 +1163,20 @@ export default { this.newMessageImage = null; this.newMessageImageUrl = null; }, - onImageInputChange: function(event) { - if(event.target.files.length > 0){ + onImageSelected: function(imageBlob) { - // update selected file - this.newMessageImage = event.target.files[0]; - - // update image url when file is read - const fileReader = new FileReader(); - fileReader.onload = (event) => { - this.newMessageImageUrl = event.target.result - } - - // convert image to data url - fileReader.readAsDataURL(this.newMessageImage); - - // clear image input to allow selecting the same file after user removed it - this.clearImageInput(); + // update selected file + this.newMessageImage = imageBlob; + // update image url when file is read + const fileReader = new FileReader(); + fileReader.onload = (event) => { + this.newMessageImageUrl = event.target.result } - }, - clearImageInput: function() { - this.$refs["image-input"].value = null; + + // convert image to data url + fileReader.readAsDataURL(this.newMessageImage); + }, async startRecordingAudioAttachment(args) { @@ -1376,9 +1365,6 @@ export default { addFilesToMessage: function() { this.$refs["file-input"].click(); }, - addImageToMessage: function() { - this.$refs["image-input"].click(); - }, findConversation: function(destinationHash) { return this.conversations.find((conversation) => { return conversation.destination_hash === destinationHash;