@nativescript/contacts
Version:
Easy access to iOS and Android contact directory. Pick a contact, update date, or add a new one!
241 lines • 10.4 kB
JavaScript
import { Utils, Frame } from '@nativescript/core';
import { Contact, Group } from './models';
export * from './common';
export * from './models';
let delegate;
export class Contacts {
static getContact() {
return new Promise((resolve, reject) => {
const controller = CNContactPickerViewController.alloc().init();
delegate = CustomCNContactPickerViewControllerDelegate.initWithResolveReject(resolve, reject);
controller.delegate = delegate;
const page = Frame.topmost().ios.controller;
page.presentViewControllerAnimatedCompletion(controller, true, null);
});
}
static getContactById(id, contactFields) {
return new Promise((resolve, reject) => {
if (!id) {
reject('Missing Contact Identifier');
return;
}
contactFields = contactFields || ['name', 'organization', 'nickname', 'photo', 'urls', 'phoneNumbers', 'emailAddresses', 'postalAddresses'];
const store = CNContactStore.new();
const searchPredicate = CNContact.predicateForContactsWithIdentifiers([id]);
const keysToFetch = [];
if (contactFields.indexOf('name') > -1) {
keysToFetch.push('givenName', 'familyName', 'middleName', 'namePrefix', 'nameSuffix', 'phoneticGivenName', 'phoneticMiddleName', 'phoneticFamilyName');
}
if (contactFields.indexOf('organization') > -1) {
keysToFetch.push('jobTitle', 'departmentName', 'organizationName');
}
if (contactFields.indexOf('nickname') > -1) {
keysToFetch.push('nickname');
}
if (contactFields.indexOf('notes') > -1) {
keysToFetch.push('note');
}
if (contactFields.indexOf('photo') > -1) {
keysToFetch.push('imageData', 'imageDataAvailable');
}
if (contactFields.indexOf('phoneNumbers') > -1) {
keysToFetch.push('phoneNumbers');
}
if (contactFields.indexOf('emailAddresses') > -1) {
keysToFetch.push('emailAddresses');
}
if (contactFields.indexOf('postalAddresses') > -1) {
keysToFetch.push('postalAddresses');
}
if (contactFields.indexOf('urlAddresses') > -1) {
keysToFetch.push('urlAddresses');
}
const foundContacts = store.unifiedContactsMatchingPredicateKeysToFetchError(searchPredicate, keysToFetch);
if (foundContacts && foundContacts.count > 0) {
let contactModel = new Contact();
contactModel.initializeFromNative(foundContacts[0]);
resolve({
data: [contactModel],
response: 'fetch',
});
}
else {
resolve({
data: null,
response: 'fetch',
});
}
});
}
static getContactsByName(searchPredicate, contactFields) {
return new Promise((resolve, reject) => {
const worker = new Worker('./worker-get-contacts-by-name');
worker.postMessage({
searchPredicate: searchPredicate,
contactFields: contactFields,
});
worker.onmessage = function (event) {
if (event.data.type == 'debug') {
// console.log(event.data.message);
}
else if (event.data.type == 'dump') {
// console.dump(event.data.message);
}
else if (event.data.type == 'error') {
reject(event.data.message);
}
else {
worker.terminate();
resolve(event.data.message);
}
};
worker.onerror = function (e) {
// console.dump(e);
};
});
}
static getAllContacts(contactFields) {
return new Promise((resolve, reject) => {
const worker = new Worker('./worker-get-all-contacts');
worker.postMessage({ contactFields: contactFields });
worker.onmessage = function (event) {
var _contacts = [];
try {
(event.data.message.data || []).forEach(function (contact) {
var contactModel = new Contact();
contactModel.initializeFromObject(contact, event.data.contactFields);
_contacts.push(contactModel);
});
}
catch (e) {
// console.dump(e)
}
event.data.message.data = _contacts;
if (event.data.type == 'debug') {
// console.log(event.data.message);
}
else if (event.data.type == 'dump') {
// console.dump(event.data.message);
}
else if (event.data.type == 'error') {
reject(event.data.message);
}
else {
worker.terminate();
resolve(event.data.message);
}
};
worker.onerror = function (e) {
// console.dump(e);
};
});
}
static getGroups(name) {
return new Promise((resolve, reject) => {
const store = new CNContactStore();
let foundGroups = store.groupsMatchingPredicateError(null);
if (foundGroups && foundGroups.count > 0) {
var groups = [], i = 0, groupModel = null;
if (name) {
var foundGroupsMutable = foundGroups.mutableCopy();
for (i = 0; i < foundGroupsMutable.count; i++) {
if (foundGroupsMutable[i]['name'] === name) {
groupModel = new Group();
groupModel.initializeFromNative(foundGroups[i]);
groups.push(groupModel);
}
else {
foundGroupsMutable.removeObjectAtIndex(i);
}
}
if (foundGroupsMutable.count > 0) {
foundGroups = foundGroupsMutable.copy();
}
else {
foundGroups = null;
groups = null;
}
}
else {
for (i = 0; i < foundGroups.count; i++) {
groupModel = new Group();
groupModel.initializeFromNative(foundGroups[i]);
groups.push(groupModel);
}
}
resolve({
data: groups,
response: 'fetch',
});
}
else {
resolve({
data: null,
response: 'fetch',
});
}
});
}
static getContactsInGroup(groupId) {
return new Promise((resolve, reject) => {
const store = new CNContactStore();
const keysToFetch = Utils.ios.collections.jsArrayToNSArray(['givenName', 'familyName', 'middleName', 'namePrefix', 'nameSuffix', 'phoneticGivenName', 'phoneticMiddleName', 'phoneticFamilyName', 'nickname', 'jobTitle', 'departmentName', 'organizationName', 'note', 'phoneNumbers', 'emailAddresses', 'postalAddresses', 'urlAddresses', 'imageData', 'imageDataAvailable']); // All Properties that we are using in the Model
const foundContacts = store.unifiedContactsMatchingPredicateKeysToFetchError(CNContact.predicateForContactsInGroupWithIdentifier(groupId), keysToFetch);
if (foundContacts && foundContacts.count > 0) {
var cts = [];
for (var i = 0; i < foundContacts.count; i++) {
var contactModel = new Contact();
contactModel.initializeFromNative(foundContacts[i]);
cts.push(contactModel);
}
resolve({
data: cts,
response: 'fetch',
});
}
else {
resolve({
data: null,
response: 'fetch',
});
}
});
}
}
var CustomCNContactPickerViewControllerDelegate = /** @class */ (function (_super) {
__extends(CustomCNContactPickerViewControllerDelegate, _super);
function CustomCNContactPickerViewControllerDelegate() {
return _super !== null && _super.apply(this, arguments) || this;
}
CustomCNContactPickerViewControllerDelegate.initWithResolveReject = function (resolve, reject) {
var delegate = CustomCNContactPickerViewControllerDelegate.alloc().init();
delegate.resolve = resolve;
delegate.reject = reject;
return delegate;
};
CustomCNContactPickerViewControllerDelegate.prototype.contactPickerDidCancel = function (controller) {
this.resolve({
data: null,
response: 'cancelled',
});
delegate = null;
};
CustomCNContactPickerViewControllerDelegate.prototype.contactPickerDidSelectContact = function (controller, contact) {
var _this = this;
console.log('contactPickerDidSelectContact:', contact);
var page = Frame.topmost().ios.controller;
page.dismissViewControllerAnimatedCompletion(true, function () {
// Convert the native contact object
var contactModel = new Contact();
contactModel.initializeFromNative(contact);
_this.resolve({
data: contactModel,
response: 'selected',
});
delegate = null;
});
};
CustomCNContactPickerViewControllerDelegate.ObjCProtocols = [CNContactPickerDelegate];
return CustomCNContactPickerViewControllerDelegate;
}(NSObject));
//# sourceMappingURL=index.ios.js.map