Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
182 lines
5.4 KiB
JavaScript
182 lines
5.4 KiB
JavaScript
/* Taken from https://github.com/fxos/achievements-service and in particular,
|
|
built from https://github.com/fxos/achievements-service/blob/master/
|
|
achievements-service.js */
|
|
|
|
(function(exports) {
|
|
'use strict';
|
|
|
|
var _toArray = function (arr) {
|
|
return Array.isArray(arr) ? arr : Array.from(arr);
|
|
};
|
|
|
|
/* global Notification, console */
|
|
|
|
var DEFAULT_IMAGE_SIZE = 64;
|
|
var MOZ_SETTINGS_NOT_AVAILABLE_MSG = 'navigator.mozSettings is not available';
|
|
|
|
var ImageHelper = (function () {
|
|
var ImageHelper = function ImageHelper() {};
|
|
|
|
ImageHelper.getImage = function (aSrc) {
|
|
return new Promise(function (resolve, reject) {
|
|
var image = new Image();
|
|
image.src = aSrc;
|
|
image.onload = function () {
|
|
return resolve(image);
|
|
};
|
|
image.onerror = function (reason) {
|
|
return reject(reason);
|
|
};
|
|
})['catch'](function (reason) {
|
|
return console.warn('Could not load an achievement image:', reason);
|
|
});
|
|
};
|
|
|
|
ImageHelper.generateImageDataURL = function (aSrc) {
|
|
return ImageHelper.getImage(aSrc).then(function (image) {
|
|
try {
|
|
var canvas = document.createElement('canvas');
|
|
canvas.height = canvas.width = DEFAULT_IMAGE_SIZE;
|
|
var context = canvas.getContext('2d');
|
|
var dataUrl;
|
|
|
|
context.drawImage(image, 0, 0, DEFAULT_IMAGE_SIZE,
|
|
DEFAULT_IMAGE_SIZE);
|
|
dataUrl = canvas.toDataURL();
|
|
|
|
// Clean up.
|
|
canvas.width = canvas.height = 0;
|
|
canvas = null;
|
|
|
|
return dataUrl;
|
|
} catch (e) {
|
|
return Promise.reject('Could not convert image to Data URL.');
|
|
}
|
|
})['catch'](function (reason) {
|
|
return console.warn(reason);
|
|
});
|
|
};
|
|
|
|
return ImageHelper;
|
|
})();
|
|
|
|
var SettingsHelper = (function () {
|
|
var SettingsHelper = function SettingsHelper() {};
|
|
|
|
SettingsHelper.get = function (name, defaultValue) {
|
|
if (!name) {
|
|
return Promise.reject('Setting name is missing');
|
|
}
|
|
|
|
if (!navigator.mozSettings) {
|
|
console.warn(MOZ_SETTINGS_NOT_AVAILABLE_MSG);
|
|
return Promise.reject(MOZ_SETTINGS_NOT_AVAILABLE_MSG);
|
|
}
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
var setting = navigator.mozSettings.createLock().get(name,
|
|
defaultValue);
|
|
setting.onsuccess = function () {
|
|
var settingValue = setting.result[name] || defaultValue;
|
|
resolve(settingValue);
|
|
};
|
|
setting.onerror = function () {
|
|
reject(setting.error);
|
|
};
|
|
});
|
|
};
|
|
|
|
SettingsHelper.set = function (settings) {
|
|
if (!settings) {
|
|
return Promise.reject('Settings are missing');
|
|
}
|
|
|
|
if (!navigator.mozSettings) {
|
|
console.warn(MOZ_SETTINGS_NOT_AVAILABLE_MSG);
|
|
return Promise.reject(MOZ_SETTINGS_NOT_AVAILABLE_MSG);
|
|
}
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
var result = navigator.mozSettings.createLock().set(settings);
|
|
result.onsuccess = function () {
|
|
resolve(result.result);
|
|
};
|
|
result.onerror = function () {
|
|
reject(result.error);
|
|
};
|
|
});
|
|
};
|
|
|
|
return SettingsHelper;
|
|
})();
|
|
|
|
var AchievementsService = (function () {
|
|
var AchievementsService = function AchievementsService() {};
|
|
|
|
AchievementsService.prototype.reward = function (_ref) {
|
|
var criteria = _ref.criteria;
|
|
var evidence = _ref.evidence;
|
|
var name = _ref.name;
|
|
var description = _ref.description;
|
|
var image = _ref.image;
|
|
if (!evidence) {
|
|
return Promise.reject('Evidence is not provided.');
|
|
}
|
|
|
|
var issuedOn;
|
|
return SettingsHelper.get('achievements', []).then(
|
|
function (achievements) {
|
|
var achievement = achievements.find(function (achievement) {
|
|
return achievement.criteria === criteria;
|
|
});
|
|
|
|
if (!achievement) {
|
|
return Promise.reject('Achievement is not registered.');
|
|
}
|
|
if (achievement.evidence) {
|
|
return Promise.reject('Achievement is already awarded.');
|
|
}
|
|
|
|
achievement.evidence = evidence;
|
|
achievement.uid = 'achievement' +
|
|
Math.round(Math.random() * 100000000);
|
|
achievement.issuedOn = issuedOn = Date.now();
|
|
achievement.recipient = {}; // TODO
|
|
|
|
return achievements;
|
|
}).then(function (achievements) {
|
|
return Promise.all([ImageHelper.generateImageDataURL(image),
|
|
SettingsHelper.set({ achievements: achievements })]);
|
|
}).then(function (_ref2) {
|
|
var _ref3 = _toArray(_ref2);
|
|
|
|
var image = _ref3[0];
|
|
// Send a Notification via WebAPI to be handled by the Gaia::System
|
|
var notification = new Notification(name, {
|
|
body: description,
|
|
icon: image,
|
|
tag: issuedOn
|
|
});
|
|
|
|
notification.onclick = function () {
|
|
var activity = new window.MozActivity({
|
|
name: 'configure',
|
|
data: {
|
|
target: 'device',
|
|
section: 'achievements'
|
|
}
|
|
});
|
|
activity.onsuccess = activity.onerror = function () {
|
|
notification.close();
|
|
};
|
|
};
|
|
})['catch'](function (reason) {
|
|
return console.warn(reason);
|
|
});
|
|
};
|
|
|
|
return AchievementsService;
|
|
})();
|
|
|
|
exports.AchievementsService = AchievementsService;
|
|
})(window);
|