diff --git a/.meteor/packages b/.meteor/packages
index 0cbb854a2016..f490350b0352 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -190,3 +190,4 @@ rocketchat:version-check
rocketchat:search
chatpal:search
+rocketchat:lazy-load
diff --git a/.meteor/versions b/.meteor/versions
index d51b6678e431..c71a541b67d8 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -174,6 +174,7 @@ rocketchat:internal-hubot@0.0.1
rocketchat:irc@0.0.2
rocketchat:issuelinks@0.0.1
rocketchat:katex@0.0.1
+rocketchat:lazy-load@0.0.1
rocketchat:ldap@0.0.1
rocketchat:lib@0.0.1
rocketchat:livechat@0.0.1
diff --git a/packages/rocketchat-lazy-load/client/index.js b/packages/rocketchat-lazy-load/client/index.js
new file mode 100644
index 000000000000..9b525117e01b
--- /dev/null
+++ b/packages/rocketchat-lazy-load/client/index.js
@@ -0,0 +1,58 @@
+import _ from 'underscore';
+import './lazyloadImage';
+export const fixCordova = function(url) {
+ if (url && url.indexOf('data:image') === 0) {
+ return url;
+ }
+ if (Meteor.isCordova && (url && url[0] === '/')) {
+ url = Meteor.absoluteUrl().replace(/\/$/, '') + url;
+ const query = `rc_uid=${ Meteor.userId() }&rc_token=${ Meteor._localStorage.getItem(
+ 'Meteor.loginToken'
+ ) }`;
+ if (url.indexOf('?') === -1) {
+ url = `${ url }?${ query }`;
+ } else {
+ url = `${ url }&${ query }`;
+ }
+ }
+ if (Meteor.settings['public'].sandstorm || url.match(/^(https?:)?\/\//i)) {
+ return url;
+ } else if (navigator.userAgent.indexOf('Electron') > -1) {
+ return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url;
+ } else {
+ return Meteor.absoluteUrl().replace(/\/$/, '') + url;
+ }
+};
+
+const loadImage = el => {
+ const img = new Image();
+ const src = el.getAttribute('data-src');
+ el.className = el.className.replace('lazy-img', '');
+ img.onload = function() {
+ el.src = src;
+ el.removeAttribute('data-src');
+ };
+ img.src = fixCordova(src);
+};
+
+const isVisible = el => {
+ requestAnimationFrame(() => {
+ const rect = el.getBoundingClientRect();
+ if (rect.top >= -100 && rect.left >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight)) {
+ return loadImage(el);
+ }
+ });
+
+};
+
+window.addEventListener('resize', window.lazyloadtick);
+
+export const lazyloadtick = _.debounce(() => {
+ [...document.querySelectorAll('.lazy-img[data-src]')]
+
+ .forEach(isVisible);
+}, 500);
+
+window.lazyloadtick = lazyloadtick;
+
+export const addImage = el => isVisible(el);
diff --git a/packages/rocketchat-lazy-load/client/lazyloadImage.html b/packages/rocketchat-lazy-load/client/lazyloadImage.html
new file mode 100644
index 000000000000..c88c6b927623
--- /dev/null
+++ b/packages/rocketchat-lazy-load/client/lazyloadImage.html
@@ -0,0 +1,4 @@
+
+
+
diff --git a/packages/rocketchat-lazy-load/client/lazyloadImage.js b/packages/rocketchat-lazy-load/client/lazyloadImage.js
new file mode 100644
index 000000000000..c8d6a637db0e
--- /dev/null
+++ b/packages/rocketchat-lazy-load/client/lazyloadImage.js
@@ -0,0 +1,21 @@
+import './lazyloadImage.html';
+import { addImage, fixCordova } from './';
+
+Template.lazyloadImage.helpers({
+ lazy() {
+ const { preview, src, placeholder } = this;
+
+ if (!preview && !placeholder) {
+ return fixCordova(src);
+ }
+ return `data:image/png;base64,${ preview || 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8+/u3PQAJJAM0dIyWdgAAAABJRU5ErkJggg==' }`;
+ }
+});
+
+Template.lazyloadImage.onCreated(function() {
+ const element = Template.instance().firstNode;
+ if (!element) {
+ return;
+ }
+ addImage(element);
+});
diff --git a/packages/rocketchat-lazy-load/package.js b/packages/rocketchat-lazy-load/package.js
new file mode 100644
index 000000000000..d65e3f99cb54
--- /dev/null
+++ b/packages/rocketchat-lazy-load/package.js
@@ -0,0 +1,16 @@
+Package.describe({
+ name: 'rocketchat:lazy-load',
+ version: '0.0.1',
+ summary: 'Lazy load image',
+ git: ''
+});
+
+Package.onUse(function(api) {
+ api.use([
+ 'ecmascript',
+ 'templating',
+ 'rocketchat:lib'
+ ]);
+
+ api.mainModule('client/index.js', 'client');
+});
diff --git a/packages/rocketchat-message-attachments/client/messageAttachment.html b/packages/rocketchat-message-attachments/client/messageAttachment.html
index 4c3879a32c01..6bc61ddd0643 100644
--- a/packages/rocketchat-message-attachments/client/messageAttachment.html
+++ b/packages/rocketchat-message-attachments/client/messageAttachment.html
@@ -66,9 +66,7 @@