rafaelcamargo/dollert

View on GitHub
src/js/chrome-service.js

Summary

Maintainability
A
0 mins
Test Coverage
(function(){

  var _public = {};

  _public.alarms = {
    create: function(id, options){
      chrome.alarms.create(id, options);
    },
    addListener: function(callback){
      chrome.alarms.onAlarm.addListener(callback);
    },
    get: function(id, callback){
      var promise = $.Deferred();
      callback = callback || function(response){
        promise.resolve(response);
      };
      chrome.alarms.get(id, callback);
      return promise;
    },
    clear: function(id, callback){
      callback = callback || function(){};
      chrome.alarms.clear(id, callback);
    }
  };

  _public.storage = {
    defaultKey: 'dollerts',
    lastAlertNotifiedKey: 'dollertLastNotified',
    get: function(item, callback){
      this.handleStorage('get', item, callback);
    },
    set: function(item, callback){
      this.handleStorage('set', item, callback);
    },
    remove: function(item, callback){
      this.handleStorage('remove', item, callback);
    },
    handleStorage: function(method, item, callback){
      callback = callback || function(){};
      chrome.storage.sync[method](item, callback);
    },
    isAlertAlreadySaved: function(previousValues, value){
      for (var i = 0; i < previousValues.length; i++)
        if(previousValues[i] === value)
          return true;
    },
    addAlert: function(value){
      var key = this.defaultKey;
      this.get(key, function(response){
        var storageItem = _public.storage.getStorageItem(key, response, []);
        if(!_public.storage.isAlertAlreadySaved(storageItem[key], value))
          storageItem[key].push(value);
        _public.storage.set(storageItem);
      });
    },
    addAlertLastNotified: function(alertDetails){
      var key = this.lastAlertNotifiedKey;
      this.get(key, function(response){
        var storageItem = _public.storage.getStorageItem(key, response, {});
        storageItem[key] = alertDetails;
        _public.storage.set(storageItem);
      });
    },
    removeAlert: function(value){
      this.get(this.defaultKey, function(response){
        var key = _public.storage.defaultKey;
        var storageItem = _public.storage.getStorageItem(key, response);
        for (var i = 0; i < storageItem[key].length; i++)
          if(storageItem[key][i] === parseFloat(value))
            storageItem[key].splice(i, 1);
        if(storageItem[key].length)
          _public.storage.set(storageItem);
        else
          _public.storage.remove(key);
      });
    },
    getLastNotifiedAlert: function(){
      return this.getAlerts('lastnotified');
    },
    getAlerts: function(alertType){
      var promise = $.Deferred();
      var alertProperties = this.getAlertProperties(alertType);
      this.get(alertProperties.key, function(response){
        var storageItem = _public.storage.getStorageItem(alertProperties.key, response, alertProperties.type);
        promise.resolve(storageItem[alertProperties.key]);
      });
      return promise;
    },
    getStorageItem: function(key, response, itemType){
      var storageItem = response || {};
      storageItem[key] = storageItem[key] || itemType;
      return storageItem;
    },
    getAlertProperties: function(alertType){
      var properties = {
        key: this.defaultKey,
        type: []
      };
      if(alertType == 'lastnotified'){
        properties.key = this.lastAlertNotifiedKey;
        properties.type = {};
      }
      return properties;
    },
    onChanged: function(callback){
      chrome.storage.onChanged.addListener(callback);
    }
  };

  _public.notification = {
    show: function(currentUSDValue){
      var details = this.build(currentUSDValue);
      return new Notification(details.title, details.options);
    },
    build: function(currentUSDValue){
      return {
        title: '1 USD = ' + currentUSDValue + ' BRL',
        options: {
          icon: 'icon_128x128.png'
        }
      };
    }
  };

  window.chromeService = _public;

}());