diff --git a/packages/uni-api/src/protocols/device/addPhoneContact.ts b/packages/uni-api/src/protocols/device/addPhoneContact.ts index 53529b9ffa8f99d2698c2413ef91639ae47cd534..2b6128352c40596e63edad3e01effdcc0f9b11e4 100644 --- a/packages/uni-api/src/protocols/device/addPhoneContact.ts +++ b/packages/uni-api/src/protocols/device/addPhoneContact.ts @@ -1,13 +1,25 @@ export const API_ADD_PHONE_CONTACT = 'addPhoneContact' export type API_TYPE_ADD_PHONE_CONTACT = typeof uni.addPhoneContact +export const AddPhoneContactOptions: ApiOptions = { + formatArgs: { + firstName(firstName) { + if (!firstName) + return 'addPhoneContact:fail parameter error: parameter.firstName should not be empty;' + }, + }, +} + export const AddPhoneContactProtocol: ApiProtocol = { + firstName: { + type: String, + required: true, + }, photoFilePath: String, nickName: String, lastName: String, middleName: String, - firstName: String, remark: String, mobilePhoneNumber: String, weChatNumber: String, diff --git a/packages/uni-app-plus/src/service/api/device/addPhoneContact.ts b/packages/uni-app-plus/src/service/api/device/addPhoneContact.ts index 6e37616cc481cd07957fc5cbdcf0b170928c5334..83be15279dc927b084fa49931821278c798dfd5c 100644 --- a/packages/uni-app-plus/src/service/api/device/addPhoneContact.ts +++ b/packages/uni-app-plus/src/service/api/device/addPhoneContact.ts @@ -2,260 +2,174 @@ import { API_ADD_PHONE_CONTACT, API_TYPE_ADD_PHONE_CONTACT, defineAsyncApi, - MakePhoneCallProtocol, + AddPhoneContactProtocol, + AddPhoneContactOptions, } from '@dcloudio/uni-api' -export const addPhoneContact = defineAsyncApi( - API_ADD_PHONE_CONTACT, - ( +type Schema = Record< + Exclude< + keyof PlusContactsContact, + | 'id' + | 'displayName' + | 'birthday' + | 'categories' + | 'clone' + | 'remove' + | 'save' + >, + any +> + +const schema: Schema = { + name: { + givenName: 'firstName', + middleName: 'middleName', + familyName: 'lastName', + }, + nickname: 'nickName', + photos: { + type: 'url', + value: 'photoFilePath', + }, + note: 'remark', + phoneNumbers: [ + { + type: 'mobile', + value: 'mobilePhoneNumber', + }, + { + type: 'work', + value: 'workPhoneNumber', + }, { - photoFilePath = '', - nickName, - lastName, - middleName, - firstName, - remark, - mobilePhoneNumber, - weChatNumber, - addressCountry, - addressState, - addressCity, - addressStreet, - addressPostalCode, - organization, - title, - workFaxNumber, - workPhoneNumber, - hostNumber, - email, - url, - workAddressCountry, - workAddressState, - workAddressCity, - workAddressStreet, - workAddressPostalCode, - homeFaxNumber, - homePhoneNumber, - homeAddressCountry, - homeAddressState, - homeAddressCity, - homeAddressStreet, - homeAddressPostalCode, + type: 'company', + value: 'hostNumber', }, - { resolve, reject } - ) => { + { + type: 'home fax', + value: 'homeFaxNumber', + }, + { + type: 'work fax', + value: 'workFaxNumber', + }, + ], + emails: [ + { + type: 'home', + value: 'email', + }, + ], + urls: [ + { + type: 'other', + value: 'url', + }, + ], + organizations: [ + { + type: 'company', + name: 'organization', + title: 'title', + }, + ], + ims: [ + { + type: 'other', + value: 'weChatNumber', + }, + ], + addresses: [ + { + type: 'other', + preferred: true, + country: 'addressCountry', + region: 'addressState', + locality: 'addressCity', + streetAddress: 'addressStreet', + postalCode: 'addressPostalCode', + }, + { + type: 'home', + country: 'homeAddressCountry', + region: 'homeAddressState', + locality: 'homeAddressCity', + streetAddress: 'homeAddressStreet', + postalCode: 'homeAddressPostalCode', + }, + { + type: 'company', + country: 'workAddressCountry', + region: 'workAddressState', + locality: 'workAddressCity', + streetAddress: 'workAddressStreet', + postalCode: 'workAddressPostalCode', + }, + ], +} + +const keepFields = ['type', 'preferred'] + +function buildContact(contact: any, data: any, schema: any) { + let hasValue = 0 + Object.keys(schema).forEach((contactKey) => { + const dataKey = schema[contactKey] + const typed = typeof dataKey + if (typed !== 'object') { + if (keepFields.indexOf(contactKey) !== -1) { + contact[contactKey] = schema[contactKey] + } else { + if (typeof data[dataKey] !== 'undefined') { + hasValue++ + contact[contactKey] = data[dataKey] + } else { + delete contact[contactKey] + } + } + } else { + if (dataKey instanceof Array) { + contact[contactKey] = [] + dataKey.forEach((item) => { + const obj = {} + if (buildContact(obj, data, item)) { + contact[contactKey].push(obj) + } + }) + if (!contact[contactKey].length) { + delete contact[contactKey] + } else { + hasValue++ + } + } else { + contact[contactKey] = {} + if (buildContact(contact[contactKey], data, dataKey)) { + hasValue++ + } else { + delete contact[contactKey] + } + } + } + }) + return hasValue +} + +export const addPhoneContact = defineAsyncApi( + API_ADD_PHONE_CONTACT, + (data, { resolve, reject }) => { + !data.photoFilePath && (data.photoFilePath = '') plus.contacts.getAddressBook( plus.contacts.ADDRESSBOOK_PHONE, (addressbook) => { const contact = addressbook.create() - const name: any = {} - if (lastName) { - name.familyName = lastName - } - if (firstName) { - name.givenName = firstName - } - if (middleName) { - name.middleName = middleName - } - contact.name = name - - if (nickName) { - contact.nickname = nickName - } - - if (photoFilePath) { - ;(contact as any).photos = [ - { - type: 'url', - value: photoFilePath, - }, - ] - } - - if (remark) { - contact.note = remark - } - - const mobilePhone: any = { - type: 'mobile', - } - - const workPhone: any = { - type: 'work', - } - - const companyPhone: any = { - type: 'company', - } - - const homeFax: any = { - type: 'home fax', - } - - const workFax: any = { - type: 'work fax', - } - - if (mobilePhoneNumber) { - mobilePhone.value = mobilePhoneNumber - } - - if (workPhoneNumber) { - workPhone.value = workPhoneNumber - } - - if (hostNumber) { - companyPhone.value = hostNumber - } - - if (homeFaxNumber) { - homeFax.value = homeFaxNumber - } - - if (workFaxNumber) { - workFax.value = workFaxNumber - } - - ;(contact as any).phoneNumbers = [ - mobilePhone, - workPhone, - companyPhone, - homeFax, - workFax, - ] - - if (email) { - ;(contact as any).emails = [ - { - type: 'home', - value: email, - }, - ] - } - - if (url) { - ;(contact as any).urls = [ - { - type: 'other', - value: url, - }, - ] - } - - const org: any = { - type: 'company', - } - - if (organization) { - org.name = organization - } - if (title) { - org.title = title - } - - if (weChatNumber) { - ;(contact as any).ims = [ - { - type: 'other', - value: weChatNumber, - }, - ] - } - - const defaultAddress: any = { - type: 'other', - preferred: true, - } - - const homeAddress: any = { - type: 'home', - } - const companyAddress: any = { - type: 'company', - } - - if (addressCountry) { - defaultAddress.country = addressCountry - } - - if (addressState) { - defaultAddress.region = addressState - } - - if (addressCity) { - defaultAddress.locality = addressCity - } - - if (addressStreet) { - defaultAddress.streetAddress = addressStreet - } - - if (addressPostalCode) { - defaultAddress.postalCode = addressPostalCode - } - - if (homeAddressCountry) { - homeAddress.country = homeAddressCountry - } - - if (homeAddressState) { - homeAddress.region = homeAddressState - } - - if (homeAddressCity) { - homeAddress.locality = homeAddressCity - } - - if (homeAddressStreet) { - homeAddress.streetAddress = homeAddressStreet - } - - if (homeAddressPostalCode) { - homeAddress.postalCode = homeAddressPostalCode - } - - if (workAddressCountry) { - companyAddress.country = workAddressCountry - } - - if (workAddressState) { - companyAddress.region = workAddressState - } - - if (workAddressCity) { - companyAddress.locality = workAddressCity - } - - if (workAddressStreet) { - companyAddress.streetAddress = workAddressStreet - } - - if (workAddressPostalCode) { - companyAddress.postalCode = workAddressPostalCode - } - - ;(contact as any).addresses = [ - defaultAddress, - homeAddress, - companyAddress, - ] - + buildContact(contact, data, schema) contact.save( - () => { - resolve({ - errMsg: 'addPhoneContact:ok', - }) - }, - (e) => { - reject('addPhoneContact:fail') - } + () => resolve(), + (e) => reject() ) }, - (e) => { - reject('addPhoneContact:fail') - } + (e) => reject() ) }, - MakePhoneCallProtocol + AddPhoneContactProtocol, + AddPhoneContactOptions )