VulpesOS/gaia/shared/js/contacts/contacts_cleaner.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

113 lines
2.4 KiB
JavaScript
Executable file

'use strict';
/* global utils */
window.ContactsCleaner = function(contacts) {
this.lcontacts = contacts;
var total = contacts.length;
var next = 0;
var self = this;
var CHUNK_SIZE = 5;
var numResponses = 0;
var notifyClean = false;
var mustHold = false;
var holded = false;
var mustFinish = false;
this.start = function() {
mustHold = holded = mustFinish = false;
if (total > 0) {
cleanContacts(0);
}
else if (typeof self.onsuccess === 'function') {
window.setTimeout(self.onsuccess, 0);
}
};
this.hold = function() {
mustHold = true;
};
this.finish = function() {
mustFinish = true;
if (holded) {
notifySuccess();
}
};
this.resume = function() {
mustHold = holded = mustFinish = false;
window.setTimeout(function resume_clean() {
cleanContacts(next);
});
};
this.performClean = function(contact, number, cbs) {
var req = navigator.mozContacts.remove(utils.misc.toMozContact(contact));
req.number = number;
req.onsuccess = cbs.success;
req.onerror = function(e) {
errorHandler(contact.id, e.target.error);
};
};
function successHandler(e) {
if (notifyClean || typeof self.oncleaned === 'function') {
notifyClean = true;
// Avoiding race condition so the cleaned element is cached
var cleaned = e.target.number;
window.setTimeout(function() {
self.oncleaned(cleaned);
},0);
}
continueCb();
}
function errorHandler(contactid, error) {
if (typeof self.onerror === 'function') {
self.onerror(contactid, error);
}
continueCb();
}
function cleanContacts(from) {
for (var idx = from; idx < (from + CHUNK_SIZE) && idx < total; idx++) {
var contact = contacts[idx];
self.performClean(contact, idx, {
success: successHandler
});
}
}
function notifySuccess() {
if (typeof self.onsuccess === 'function') {
window.setTimeout(self.onsuccess);
}
}
function continueCb() {
next++;
numResponses++;
if (next < total && numResponses === CHUNK_SIZE) {
numResponses = 0;
if (!mustHold && !mustFinish) {
cleanContacts(next);
}
else if (mustFinish && !holded) {
notifySuccess();
}
if (mustHold) {
holded = true;
}
}
else if (next >= total) {
// End has been reached
notifySuccess();
}
} // function
}; // ContactsCleaner