VulpesOS/assets/webapps/communications.gaiamobile.org/contacts/js/service_extensions.js
OverSu b38dea0597 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.
2026-09-30 23:13:03 +02:00

185 lines
4.9 KiB
JavaScript

'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));