Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
185
gaia/apps/communications/contacts/js/service_extensions.js
Executable file
185
gaia/apps/communications/contacts/js/service_extensions.js
Executable file
|
|
@ -0,0 +1,185 @@
|
|||
'use strict';
|
||||
/* exported extServices*/
|
||||
/* global fb */
|
||||
/* global utils */
|
||||
|
||||
(function(exports) {
|
||||
var onContactsImportedCb = null;
|
||||
var extServices = {
|
||||
set onContactsImported(cb) {
|
||||
if (typeof cb !== 'function') {
|
||||
return;
|
||||
}
|
||||
onContactsImportedCb = cb;
|
||||
}
|
||||
};
|
||||
|
||||
var extensionFrame = document.querySelector('#iframe_extensions');
|
||||
var oauthFrame = document.querySelector('#iframe_oauth');
|
||||
oauthFrame.src = '/shared/pages/import/oauth.html';
|
||||
var currentURI, access_token;
|
||||
var canClose = true, canCloseLogout = true;
|
||||
var closeRequested = false;
|
||||
|
||||
extServices.importGmail = function(evt) {
|
||||
loadService('gmail');
|
||||
};
|
||||
|
||||
extServices.importLive = function(evt) {
|
||||
loadService('live');
|
||||
};
|
||||
|
||||
function loadService(serviceName) {
|
||||
closeRequested = false;
|
||||
canClose = false;
|
||||
canCloseLogout = false;
|
||||
load('/shared/pages/import/import.html?service=' + serviceName,
|
||||
'friends', serviceName);
|
||||
}
|
||||
|
||||
function load(uri, from, serviceName) {
|
||||
oauthFrame.contentWindow.postMessage({
|
||||
type: 'start',
|
||||
data: {
|
||||
from: from,
|
||||
service: serviceName
|
||||
}
|
||||
}, fb.CONTACTS_APP_ORIGIN);
|
||||
currentURI = uri;
|
||||
}
|
||||
|
||||
function unload() {
|
||||
// Attaching again scrolling handlers on the contact list's image loader
|
||||
window.dispatchEvent(new CustomEvent('image-loader-resume'));
|
||||
extensionFrame.src = currentURI = null;
|
||||
}
|
||||
|
||||
function close(messageId, additionalMessageId) {
|
||||
// Aborting the close if was closed previously, ie: no contacts
|
||||
if (!extensionFrame.classList.contains('opening')) {
|
||||
return;
|
||||
}
|
||||
extensionFrame.addEventListener('transitionend', function tclose() {
|
||||
extensionFrame.removeEventListener('transitionend', tclose);
|
||||
extensionFrame.classList.add('hidden');
|
||||
if (canClose === true && canCloseLogout === true) {
|
||||
unload();
|
||||
}
|
||||
else {
|
||||
closeRequested = true;
|
||||
}
|
||||
|
||||
if (messageId) {
|
||||
utils.status.show(messageId, additionalMessageId);
|
||||
}
|
||||
// Otherwise we do nothing as the sync process will finish sooner or later
|
||||
});
|
||||
extensionFrame.classList.remove('opening');
|
||||
}
|
||||
|
||||
function notifySettings(evtype) {
|
||||
// Notify observers that a change from FB could have happened
|
||||
var eventType = evtype || 'fb_changed';
|
||||
|
||||
var event = new CustomEvent(eventType, {
|
||||
'detail' : true
|
||||
});
|
||||
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
|
||||
// This function can also be executed when other messages arrive
|
||||
// That's why we cannot call notifySettings outside the switch block
|
||||
function messageHandler(e) {
|
||||
if (!currentURI || e.origin !== fb.CONTACTS_APP_ORIGIN) {
|
||||
return;
|
||||
}
|
||||
|
||||
var data = e.data;
|
||||
|
||||
switch (data.type) {
|
||||
case 'ready':
|
||||
extensionFrame.classList.remove('hidden');
|
||||
window.setTimeout(function displaying() {
|
||||
extensionFrame.classList.add('opening');
|
||||
extensionFrame.addEventListener('transitionend', function topen() {
|
||||
extensionFrame.removeEventListener('transitionend', topen);
|
||||
extensionFrame.contentWindow.postMessage({
|
||||
type: 'dom_transition_end',
|
||||
data: ''
|
||||
}, fb.CONTACTS_APP_ORIGIN);
|
||||
// Stop scrolling listeners on the contact list's image loader to
|
||||
// prevent images cancelled while friends are being imported
|
||||
window.dispatchEvent(new CustomEvent('image-loader-pause'));
|
||||
});
|
||||
}, 0);
|
||||
break;
|
||||
|
||||
case 'authenticated':
|
||||
extensionFrame.src = currentURI;
|
||||
access_token = data.data;
|
||||
break;
|
||||
|
||||
case 'token_stored':
|
||||
notifySettings('fb_token_ready');
|
||||
break;
|
||||
|
||||
case 'token_error':
|
||||
notifySettings('fb_token_error');
|
||||
break;
|
||||
|
||||
case 'abort':
|
||||
unload();
|
||||
break;
|
||||
|
||||
case 'window_close':
|
||||
close(data.messageId, data.additionalMessageId);
|
||||
notifySettings();
|
||||
break;
|
||||
|
||||
case 'import_updated':
|
||||
extensionFrame.contentWindow.postMessage({
|
||||
type: 'contacts_loaded',
|
||||
data: ''
|
||||
}, fb.CONTACTS_APP_ORIGIN);
|
||||
if (onContactsImportedCb) {
|
||||
onContactsImportedCb();
|
||||
onContactsImportedCb = null;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'sync_finished':
|
||||
// Sync finished thus the iframe can be safely "removed"
|
||||
canClose = true;
|
||||
if (closeRequested && canCloseLogout) {
|
||||
unload();
|
||||
}
|
||||
|
||||
// Check whether there has been changes or not
|
||||
if (data.data > 0) {
|
||||
notifySettings();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'logout_finished':
|
||||
canCloseLogout = true;
|
||||
if (closeRequested && canClose) {
|
||||
unload();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'messaging_ready':
|
||||
extensionFrame.contentWindow.postMessage({
|
||||
type: 'token',
|
||||
data: access_token
|
||||
}, fb.CONTACTS_APP_ORIGIN);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('message', messageHandler);
|
||||
|
||||
exports.ExtServices = extServices;
|
||||
|
||||
}(window));
|
||||
Loading…
Reference in a new issue