Customizing the Open ContactPad User Interface (UC only)

Create an integration provider

Choose a unique name for your integration provider. It will be used to associate integration provider owned resources. The below samples are using ‘acme’ as customization provider.

Tell the UC dialer which extra features to enable in the user interface during the initialization.

Note: You still have to implement the corresponding handlers for the enabled features.

 VonageDialer.init({
   features: {
     contactsProvider: true,
     openContact: true,
     openActivity: 'acme',
     eventsHistory: true
   }
 }, (dialer) => { /* <-- dialer instance */ });

Set integration icon

VonageDialer.init({}, (dialer) => {
  dialer.registerSvgIcon('acme', 'data:image/svg+xml;base64,PHN… ...zdmc+');
});

Add Custom Settings to the Dialer Interface

The SDK provides a method to extend the dialer interface default settings with extra configuration options (supported types: string, boolean, select).

dialer.registerCustomSettings('acme', [
  { name: 'autoLog', label: 'Auto Log Telephony Records', type: 'boolean', subtype: 'switch', default: true },
  { name: 'skipInternal', label: 'Skip internal communications', type: 'boolean', subtype: 'checkbox', dependsOn: 'autoLog', default: true },
  { name: 'skipZeroDuration', label: 'Skip zero duration calls', type: 'boolean', subtype: 'checkbox', dependsOn: 'autoLog', default: true },
  { name: 'skipNoContact', label: 'Skip if contact not found', type: 'boolean', subtype: 'checkbox', dependsOn: 'autoLog' },
  { name: 'skipMultipleContacts', label: 'Skip if multiple contacts', type: 'boolean', subtype: 'checkbox', dependsOn: 'autoLog' }
]);
dialer.getSettings('acme', (settings) => {
  //{"autoLog":true,"skipInternal":true,"skipZeroDuration":false,"skipNoContact":true}
});

LIVE SAMPLE

Contacts provider

How to bring your own contacts within the dialer interface.

Contacts autocomplete (dial suggestions)

Implement a special method for searching contacts from your own data source. The first input parameter is the text user types in the dialer input control (*it could be a phone number or any text as string). The second parameter is a callback function for returning the results when the search is complete. The callback must be called always with a parameter of type array (including zero or more contactable items). The UI shows a tiny progress bar during the search.

const searchContactables = (query, callback) => {
  // 'query' parameter contains the autocomplete search string
  callback([
   {
     provider: 'acme',
     id: '123',
     label: 'John Smith',
     type: 'contact',
     typeLabel: 'Contact',
     phoneNumber: '+12027621401',
     phoneType: 'Mobile'
   },
   {
     provider: 'acme',
     id: '124',
     label: 'John Smith',
     type: 'lead',
     // 'typeLabel' - optional, for visualization purposes
     phoneNumber: '+12027621401',
     // 'phoneType' - optional, for visualization purposes (home, mobile, office)
   }
  ]);
};

Register the custom contact search method with the dialer API setOnSearchContactables:

  dialer.setOnSearchContactables(searchContactables);

LIVE SAMPLE

Set interaction contact (active call screen)

The SDK allows attaching an external contact object to the interaction events for visualization and logging purposes. Once the ongoing call identifier is known (see Subscribing for interaction events), the integration could assign an external contact to the interaction.

The attached contactable is visualized during the active call screen (UC only) and also is carried by the system through the whole interaction lifecycle.

dialer.setOnDialerEvent((event) => {
   switch (event.type) {
     case 'CALL_START': {
       dialer.setInteractionContact(event.data.id, {
         provider: 'acme',
         id: '123',
         label: 'John Smith',
         type: 'contact',
       });
       break;
     }
     case 'CALL_END': {
       console.log(event.data.contact); // <- carries the assigned contact object
       break;
     }
     default: {
       console.log('Unhandled event', event);
     }
   }
 });

LIVE SAMPLE

Interactive History

Coming soon!