Fix lazy loading Addressbooks data retrieval

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ (skjnldsv) 2017-08-24 20:43:57 +02:00
parent 5c8fef6b94
commit 3ead292583
No known key found for this signature in database
GPG Key ID: FB5ACEED51955BF8
2 changed files with 24 additions and 18 deletions

View File

@ -160,8 +160,8 @@ angular.module('contactsApp')
if(ctrl.loading && $(window).width() > 768) {
ctrl.setSelectedId(ctrl.contactList[0].uid());
}
var firstNames = ctrl.contactList.slice(0, 20).map(function (c) { return c.displayName(); });
ContactService.getFullContacts(firstNames);
// Get full data for the first 20 contacts of the list
ContactService.getFullContacts(ctrl.contactList.slice(0, 20));
ctrl.loading = false;
unbindListWatch();
}

View File

@ -4,7 +4,6 @@ angular.module('contactsApp')
var cacheFilled = false;
var contacts = CacheFactory('contacts');
var urlsByDisplayname = CacheFactory('urlsByDisplayname');
var observerCallbacks = [];
@ -25,25 +24,34 @@ angular.module('contactsApp')
});
};
this.getFullContacts = function getFullContacts(names) {
this.getFullContacts = function(contacts) {
AddressBookService.getAll().then(function (enabledAddressBooks) {
var promises = [];
enabledAddressBooks.forEach(function (addressBook) {
var urlLists = names.map(function (name) { return urlsByDisplayname.get(name); });
var urls = [].concat.apply([], urlLists);
var promise = DavClient.getContacts(addressBook, {}, urls)
.then(
function (vcards) {
return vcards.map(function (vcard) {
return new Contact(addressBook, vcard);
});
})
.then(function (contacts_) {
var xhrAddressBooks = [];
contacts.forEach(function (contact) {
// Regroup urls by addressbooks
if(enabledAddressBooks.indexOf(contact.data.addressBook) !== -1) {
// Initiate array if no exists
xhrAddressBooks[contact.addressBookId] = xhrAddressBooks[contact.addressBookId] || [];
xhrAddressBooks[contact.addressBookId].push(contact.data.url);
}
});
// Get our full vCards
enabledAddressBooks.forEach(function(addressBook) {
if(angular.isArray(xhrAddressBooks[addressBook.displayName])) {
console.log('Contacts found for: '+addressBook.displayName);
var promise = DavClient.getContacts(addressBook, {}, xhrAddressBooks[addressBook.displayName]).then(
function (vcards) {
return vcards.map(function (vcard) {
return new Contact(addressBook, vcard);
});
}).then(function (contacts_) {
contacts_.map(function (contact) {
contacts.put(contact.uid(), contact);
});
});
promises.push(promise);
promises.push(promise);
}
});
$q.all(promises).then(function () {
notifyObservers('getFullContacts', '');
@ -62,8 +70,6 @@ angular.module('contactsApp')
if (addressBook.objects[i].addressData) {
var contact = new Contact(addressBook, addressBook.objects[i]);
contacts.put(contact.uid(), contact);
var oldList = urlsByDisplayname.get(contact.displayName()) || [];
urlsByDisplayname.put(contact.displayName(), oldList.concat(contact.data.url));
} else {
// eslint-disable-next-line no-console
console.log('Invalid contact received: ' + addressBook.objects[i].url);