diff --git a/client/css/style.css b/client/css/style.css index 3c4532a4..a13d7a1d 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -1328,6 +1328,10 @@ kbd { overflow: hidden; } +#chat .toggle-type-error { + background: transparent; +} + #chat .toggle-content img { max-width: 100%; max-height: 128px; diff --git a/client/js/libs/handlebars/friendlysize.js b/client/js/libs/handlebars/friendlysize.js new file mode 100644 index 00000000..bd485f82 --- /dev/null +++ b/client/js/libs/handlebars/friendlysize.js @@ -0,0 +1,10 @@ +"use strict"; + +const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + +module.exports = function(size) { + // Loosely inspired from https://stackoverflow.com/a/18650828/1935861 + const i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0; + const fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1)); + return `${fixedSize} ${sizes[i]}`; +}; diff --git a/client/views/msg_preview.tpl b/client/views/msg_preview.tpl index d972a632..51e199de 100644 --- a/client/views/msg_preview.tpl +++ b/client/views/msg_preview.tpl @@ -28,5 +28,15 @@
{{body}}
{{/equal}} + {{#equal type "error"}} + {{#equal error "image-too-big"}} + + This image is larger than {{friendlysize maxSize}} and cannot be + previewed. + Click here + to open it in a new window. + + {{/equal}} + {{/equal}} {{/preview}} diff --git a/src/plugins/irc-events/link.js b/src/plugins/irc-events/link.js index 7a8ed3a6..b082bcea 100644 --- a/src/plugins/irc-events/link.js +++ b/src/plugins/irc-events/link.js @@ -99,12 +99,14 @@ function parse(msg, preview, res, client) { case "image/jpeg": case "image/webp": if (res.size > (Helper.config.prefetchMaxImageSize * 1024)) { - return; + preview.type = "error"; + preview.error = "image-too-big"; + preview.maxSize = Helper.config.prefetchMaxImageSize * 1024; + } else { + preview.type = "image"; + preview.thumb = preview.link; } - preview.type = "image"; - preview.thumb = preview.link; - break; case "audio/midi": diff --git a/test/client/js/libs/handlebars/friendlysizeTest.js b/test/client/js/libs/handlebars/friendlysizeTest.js new file mode 100644 index 00000000..274495d0 --- /dev/null +++ b/test/client/js/libs/handlebars/friendlysizeTest.js @@ -0,0 +1,18 @@ +"use strict"; + +const expect = require("chai").expect; +const friendlysize = require("../../../../../client/js/libs/handlebars/friendlysize"); + +describe("friendlysize Handlebars helper", function() { + it("should render big values in human-readable version", function() { + expect(friendlysize(51200)).to.equal("50 KB"); + }); + + it("should round with 1 digit", function() { + expect(friendlysize(1234567)).to.equal("1.2 MB"); + }); + + it("should render special case 0 as 0 Bytes", function() { + expect(friendlysize(0)).to.equal("0 Bytes"); + }); +});