publiclab/image-sequencer

View on GitHub
src/ui/LoadImage.js

Summary

Maintainability
C
1 day
Test Coverage
// special module to load an image into the start of the sequence; used in the HTML UI
function LoadImage(ref, name, src, main_callback) {
  function makeImage(datauri) {
    var image = {
      src: datauri,
      format: datauri.split(':')[1].split(';')[0].split('/')[1]
    };
    return image;
  }

  // function to check whether a image can be fetched from external source or not
  function checkForError(image_url) {
    return fetch(image_url).then(function(res) {
      if(res)
        return false;
      else 
        return true;
    }).catch(function(err) {
      if(err)
        console.log('Error occured because of image URL ',err);

      return true;
    });
  }

  function CImage(src, step, callback) {
    var datauri;
    if (src.match(/^data:/i)) {
      datauri = src;
      callback(datauri, step);
    }
    else if (!ref.options.inBrowser && !!src.match(/^https?:\/\//i)) {
      require(src.match(/^(https?):\/\//i)[1]).get(src, function(res) {
        var data = '';
        var contentType = res.headers['content-type'];
        res.setEncoding('base64');
        res.on('data', function(chunk) { data += chunk; });
        res.on('end', function() {
          callback('data:' + contentType + ';base64,' + data, step);
        });
      });
    }
    else if (ref.options.inBrowser) {
      
      let notifyBox = document.querySelector('div.notify-box');
      let closePopUP = document.getElementById('close-popup');
      if(src.indexOf('images/') !== 0  && src.indexOf('./images/') !== 0 && checkForError(src)){

        if(notifyBox){
          notifyBox.classList.remove('d-none');
          notifyBox.classList.add('d-block');
        }

        if(closePopUP){
          closePopUP.addEventListener('click',function(){
            if(notifyBox){
              notifyBox.classList.remove('d-block');
              notifyBox.classList.add('d-none');
            }
            if(document.querySelector('button.remove'))
              document.querySelector('button.remove').click(); // Remove the step due to redundant processing.
            location.reload();
          });
        }
      }
      else{
        var ext = src.split('.').pop();
        var image = document.createElement('img');
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        image.onload = function() {
          canvas.width = image.naturalWidth;
          canvas.height = image.naturalHeight;
          context.drawImage(image, 0, 0);
          datauri = canvas.toDataURL(ext);
          callback(datauri, step);
        };
        image.src = src;
      }
    }
    else {
      datauri = require('urify')(src);
      callback(datauri, step);
    }
  }

  function loadImage(name, src) {
    var step = {
      name: 'load-image',
      description: 'This initial step loads and displays the original image without any modifications.',
      ID: ref.options.sequencerCounter++,
      inBrowser: ref.options.inBrowser,
      ui: ref.options.ui,
      UI: ref.events,
      output: ''
    };


    CImage(src, step, function(datauri, step) {
      var output = makeImage(datauri);
      ref.steps.push(step);
      ref.steps[0].output = output;
      ref.steps[0].UI.onSetup(ref.steps[0]);
      ref.steps[0].UI.onDraw(ref.steps[0]);
      ref.steps[0].UI.onComplete(ref.steps[0]);

      main_callback();
      return true;
    });
  }

  return loadImage(name, src);
}

module.exports = LoadImage;