pixelfed/pixelfed

View on GitHub
resources/assets/js/embed.js

Summary

Maintainability
A
1 hr
Test Coverage
window.pixlfed = {};
window.pixlfed.config = {
    domain: process.env.MIX_APP_DOMAIN,
}

pixlfed.autoSizeIFrame = function(el) {
    console.log(el.contentDocument);
    el.style.height = el.contentDocument.body.scrollHeight +'px';
}

pixlfed.polyfill = function() {
    [].forEach.call(document.querySelectorAll('div.pixelfed-embed'), function(el) {
        pixlfed.loadIFrame(el);
    });
}

pixlfed.loadIFrame = function(el) {
    let permalink = el.getAttribute('data-pixlfed-permalink');
    let parser = document.createElement('a');
    parser.href = permalink;
    if(el.getAttribute('loaded') == 'true') {
        return;
    }
    if(pixlfed.config.domain !== parser.host) {
        el.setAttribute('loaded', 'true');
        console.error('Invalid embed permalink')
        return;
    }
    let css = 'background: white; max-width: 540px; width: calc(100% - 2px); border-radius: 3px; border: 1px solid rgb(219, 219, 219); box-shadow: none; display: block; margin: 0px 0px 12px; min-width: 326px; padding: 0px;';
    let iframe = document.createElement('iframe');
    iframe.onload = function() {
        pixlfed.autoSizeIFrame(iframe);
    }
    iframe.setAttribute('allowtransparency', 'true');
    iframe.setAttribute('frameborder', '0');
    iframe.setAttribute('scrolling', 'no');
    iframe.setAttribute('src', permalink);
    iframe.setAttribute('style', css);
    iframe.setAttribute('loaded', 'true');
    el.replaceWith(iframe);
}

pixlfed.run = function() {
    var lazyFrames = [].slice.call(document.querySelectorAll("div.pixelfed-embed"));

    if ("IntersectionObserver" in window) {
    let lazyFrameObserver = new IntersectionObserver(function(entries, observer) {
      entries.forEach(function(entry) {
        if (entry.isIntersecting) {
          if(entry.target.getAttribute('loaded') !== 'true') {
              pixlfed.loadIFrame(entry.target);
          }
        }
      });
    });

    lazyFrames.forEach(function(lazyFrame) {
      lazyFrameObserver.observe(lazyFrame);
    });
    } else {
        pixlfed.polyfill();
    }
}

pixlfed.run();