1115cd2caSopenharmony_ci/*
2115cd2caSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3115cd2caSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4115cd2caSopenharmony_ci * you may not use this file except in compliance with the License.
5115cd2caSopenharmony_ci * You may obtain a copy of the License at
6115cd2caSopenharmony_ci *
7115cd2caSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8115cd2caSopenharmony_ci *
9115cd2caSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10115cd2caSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11115cd2caSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12115cd2caSopenharmony_ci * See the License for the specific language governing permissions and
13115cd2caSopenharmony_ci * limitations under the License.
14115cd2caSopenharmony_ci */
15115cd2caSopenharmony_ciconst featureAbility = requireNapi('ability.featureAbility');
16115cd2caSopenharmony_ciconst contact = requireInternal('contact');
17115cd2caSopenharmony_ciconst ARGUMENTS_LEN_TWO = 2;
18115cd2caSopenharmony_ci
19115cd2caSopenharmony_ciasync function contactsPickerSelect() {
20115cd2caSopenharmony_ci  if (arguments.length === ARGUMENTS_LEN_TWO && typeof arguments[1] !== 'function') {
21115cd2caSopenharmony_ci    console.log('[picker] contactsPickerSelect callback invalid');
22115cd2caSopenharmony_ci    throw Error('invalid callback');
23115cd2caSopenharmony_ci  }
24115cd2caSopenharmony_ci
25115cd2caSopenharmony_ci  try {
26115cd2caSopenharmony_ci    let result;
27115cd2caSopenharmony_ci    let context = getContext(this);
28115cd2caSopenharmony_ci    if (context) {
29115cd2caSopenharmony_ci      let config = {
30115cd2caSopenharmony_ci        parameters: {
31115cd2caSopenharmony_ci          'pageFlag': 'page_flag_single_choose'
32115cd2caSopenharmony_ci        },
33115cd2caSopenharmony_ci        bundleName: 'com.ohos.contacts',
34115cd2caSopenharmony_ci        abilityName: 'com.ohos.contacts.MainAbility'
35115cd2caSopenharmony_ci      };
36115cd2caSopenharmony_ci      if (arguments.length > 0 && typeof arguments[0] === 'object') {
37115cd2caSopenharmony_ci        let option = arguments[0];
38115cd2caSopenharmony_ci        if (option.isMultiSelect !== undefined) {
39115cd2caSopenharmony_ci          config.parameters.pageFlag =
40115cd2caSopenharmony_ci            option.isMultiSelect === true ? 'page_flag_multi_choose' : 'page_flag_single_choose';
41115cd2caSopenharmony_ci        }
42115cd2caSopenharmony_ci      }
43115cd2caSopenharmony_ci      console.log('[picker] contactsPickerSelect config: ' + JSON.stringify(config));
44115cd2caSopenharmony_ci      result = await context.startAbilityForResult(config, { windowMode: 1 });
45115cd2caSopenharmony_ci    } else {
46115cd2caSopenharmony_ci      let parameter = {
47115cd2caSopenharmony_ci        want: {
48115cd2caSopenharmony_ci          parameters: {
49115cd2caSopenharmony_ci            'pageFlag': 'page_flag_single_choose'
50115cd2caSopenharmony_ci          },
51115cd2caSopenharmony_ci          bundleName: 'com.ohos.contacts',
52115cd2caSopenharmony_ci          abilityName: 'com.ohos.contacts.MainAbility'
53115cd2caSopenharmony_ci        }
54115cd2caSopenharmony_ci      };
55115cd2caSopenharmony_ci      if (arguments.length > 0 && typeof arguments[0] === 'object') {
56115cd2caSopenharmony_ci        let option = arguments[0];
57115cd2caSopenharmony_ci        if (option.isMultiSelect !== undefined) {
58115cd2caSopenharmony_ci          parameter.want.parameters.pageFlag =
59115cd2caSopenharmony_ci            option.isMultiSelect === true ? 'page_flag_multi_choose' : 'page_flag_single_choose';
60115cd2caSopenharmony_ci        }
61115cd2caSopenharmony_ci      }
62115cd2caSopenharmony_ci      console.log('[picker] contactsPickerSelect parameter: ' + JSON.stringify(parameter));
63115cd2caSopenharmony_ci      result = await featureAbility.startAbilityForResult(parameter);
64115cd2caSopenharmony_ci    }
65115cd2caSopenharmony_ci    let contactObject = result.want.parameters.contactObjects;
66115cd2caSopenharmony_ci    let params = [];
67115cd2caSopenharmony_ci    try {
68115cd2caSopenharmony_ci      params = JSON.parse(contactObject);
69115cd2caSopenharmony_ci    } catch (Error) {
70115cd2caSopenharmony_ci      console.log(`[picker] JSON.parse Error: ${Error}`);
71115cd2caSopenharmony_ci    }
72115cd2caSopenharmony_ci    let contacts = [];
73115cd2caSopenharmony_ci    for (let object of params) {
74115cd2caSopenharmony_ci      let contact = {
75115cd2caSopenharmony_ci        name: {
76115cd2caSopenharmony_ci          fullName: object.contactName
77115cd2caSopenharmony_ci        },
78115cd2caSopenharmony_ci        phoneNumbers: [
79115cd2caSopenharmony_ci          {
80115cd2caSopenharmony_ci            phoneNumber: object.telephone
81115cd2caSopenharmony_ci          }
82115cd2caSopenharmony_ci        ]
83115cd2caSopenharmony_ci      };
84115cd2caSopenharmony_ci      contacts.push(contact);
85115cd2caSopenharmony_ci    }
86115cd2caSopenharmony_ci    if (arguments.length === ARGUMENTS_LEN_TWO && typeof arguments[1] === 'function') {
87115cd2caSopenharmony_ci      if (result.resultCode === 0) {
88115cd2caSopenharmony_ci        return arguments[1](undefined, contacts);
89115cd2caSopenharmony_ci      } else {
90115cd2caSopenharmony_ci        return arguments[1](result.resultCode, undefined);
91115cd2caSopenharmony_ci      }
92115cd2caSopenharmony_ci    } else if (arguments.length === 1 && typeof arguments[0] === 'function') {
93115cd2caSopenharmony_ci      if (result.resultCode === 0) {
94115cd2caSopenharmony_ci        return arguments[0](undefined, contacts);
95115cd2caSopenharmony_ci      } else {
96115cd2caSopenharmony_ci        return arguments[0](result.resultCode, undefined);
97115cd2caSopenharmony_ci      }
98115cd2caSopenharmony_ci    }
99115cd2caSopenharmony_ci    return new Promise((resolve, reject) => {
100115cd2caSopenharmony_ci      if (result.resultCode === 0) {
101115cd2caSopenharmony_ci        resolve(contacts);
102115cd2caSopenharmony_ci      } else {
103115cd2caSopenharmony_ci        console.log('[picker] contactsPickerSelect err, result.resultCode = : ' + result.resultCode);
104115cd2caSopenharmony_ci        reject(result.resultCode);
105115cd2caSopenharmony_ci      }
106115cd2caSopenharmony_ci    });
107115cd2caSopenharmony_ci  } catch (error) {
108115cd2caSopenharmony_ci    console.log('[picker] contactsPickerSelect error: ' + error);
109115cd2caSopenharmony_ci  }
110115cd2caSopenharmony_ci}
111115cd2caSopenharmony_ci
112115cd2caSopenharmony_ciexport default {
113115cd2caSopenharmony_ci  selectContact: contactsPickerSelect,
114115cd2caSopenharmony_ci  selectContacts: contactsPickerSelect,
115115cd2caSopenharmony_ci  addContact: contact.addContact,
116115cd2caSopenharmony_ci  deleteContact: contact.deleteContact,
117115cd2caSopenharmony_ci  queryContact: contact.queryContact,
118115cd2caSopenharmony_ci  queryContacts: contact.queryContacts,
119115cd2caSopenharmony_ci  queryContactsByEmail: contact.queryContactsByEmail,
120115cd2caSopenharmony_ci  queryContactsByPhoneNumber: contact.queryContactsByPhoneNumber,
121115cd2caSopenharmony_ci  queryGroups: contact.queryGroups,
122115cd2caSopenharmony_ci  queryHolders: contact.queryHolders,
123115cd2caSopenharmony_ci  queryKey: contact.queryKey,
124115cd2caSopenharmony_ci  queryMyCard: contact.queryMyCard,
125115cd2caSopenharmony_ci  updateContact: contact.updateContact,
126115cd2caSopenharmony_ci  isLocalContact: contact.isLocalContact,
127115cd2caSopenharmony_ci  isMyCard: contact.isMyCard,
128115cd2caSopenharmony_ci
129115cd2caSopenharmony_ci  Contact: contact.Contact,
130115cd2caSopenharmony_ci  ContactAttributes: contact.ContactAttributes,
131115cd2caSopenharmony_ci  Attribute: contact.Attribute,
132115cd2caSopenharmony_ci  Email: contact.Email,
133115cd2caSopenharmony_ci  Event: contact.Event,
134115cd2caSopenharmony_ci  Group: contact.Group,
135115cd2caSopenharmony_ci  Holder: contact.Holder,
136115cd2caSopenharmony_ci  ImAddress: contact.ImAddress,
137115cd2caSopenharmony_ci  Name: contact.Name,
138115cd2caSopenharmony_ci  NickName: contact.NickName,
139115cd2caSopenharmony_ci  Note: contact.Note,
140115cd2caSopenharmony_ci  Organization: contact.Organization,
141115cd2caSopenharmony_ci  PhoneNumber: contact.PhoneNumber,
142115cd2caSopenharmony_ci  Portrait: contact.Portrait,
143115cd2caSopenharmony_ci  PostalAddress: contact.PostalAddress,
144115cd2caSopenharmony_ci  Relation: contact.Relation,
145115cd2caSopenharmony_ci  SipAddress: contact.SipAddress,
146115cd2caSopenharmony_ci  Website: contact.Website
147115cd2caSopenharmony_ci};
148