* Expose init context from OCSDK

* Add ability to override initContext completely

* Add tests

* Fix eslint

* Update README.md

* Update CHANGELOG.md
This commit is contained in:
xTEddie 2021-03-19 09:46:27 -07:00 коммит произвёл GitHub
Родитель 67e5368111
Коммит 3b3e3ff4f8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 149 добавлений и 7 удалений

Просмотреть файл

@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
- React Native sample app using Omnichannel Chat SDK with [react-native-gifted-chat](https://github.com/FaridSafi/react-native-gifted-chat)
- Escalation to Voice & View support (Web Only)
- React sample app using Omnichannel Chat SDK with [BotFramework-WebChat](https://github.com/microsoft/BotFramework-WebChat)
- Expose `sessiontInit`'s `initContext` on `startChat`'s optional paramaters
### Changed
- Uptake [@microsoft/ocsdk@0.1.1](https://www.npmjs.com/package/@microsoft/ocsdk/v/0.1.1)

Просмотреть файл

@ -5,15 +5,20 @@
Headless Chat SDK to build your own chat widget against Dynamics 365 Omnichannel Services.
## Table of Contents
- [API Reference](#api-reference)
- [API Examples](#api-examples)
- [Sample Apps](samples/)
- [Common Scenarios](#common-scenarios)
- [Feature Comparisons](#feature-comparisons)
## Installation
```
npm install @microsoft/omnichannel-chat-sdk --save
```
## API
### High Level Overview
## API Reference
| Method | Description | Notes |
| ------ | ----------- | ----- |
@ -38,6 +43,8 @@ Headless Chat SDK to build your own chat widget against Dynamics 365 Omnichannel
| OmnichannelChatSDK.createChatAdapter() | Get IC3Adapter | **Web only** |
| OmnichannelChatSDK.getVoiceVideoCalling() | Get VoiceVideoCall SDK for Escalation to Voice & Video| **Web only** |
## API examples
### Import
```ts
import OmnichannelChatSDK from '@microsoft/omnichannel-chat-sdk';
@ -95,9 +102,16 @@ Headless Chat SDK to build your own chat widget against Dynamics 365 Omnichannel
### Start Chat
```ts
const customContext = {
'contextKey1': {'value': 'contextValue1', 'isDisplayable': true},
'contextKey2': {'value': 12.34, 'isDisplayable': false},
'contextKey3': {'value': true}
};
const optionalParams = {
preChatResponse: '', // PreChatSurvey response
liveChatContext: {} // EXISTING chat context data
liveChatContext: {}, // EXISTING chat context data
customContext // Custom Context
};
await chatSDK.startChat(optionalParams);
```
@ -197,7 +211,7 @@ Headless Chat SDK to build your own chat widget against Dynamics 365 Omnichannel
await chatSDK.emailLiveChatTranscript(body);
```
## Samples
## Common Scenarios
### PreChatSurvey

Просмотреть файл

@ -305,6 +305,101 @@ describe('Omnichannel Chat SDK', () => {
expect(chatSDK.OCClient.sessionInit.mock.calls[0][1]).toMatchObject(sessionInitOptionalParams);
});
it('ChatSDK.startChat() with customContext, browser, os, locale, device defined in sessionInitOptionalParams should pass it to OCClient.sessionInit() call\'s optional parameters', async() => {
const chatSDK = new OmnichannelChatSDK(omnichannelConfig);
chatSDK.getChatConfig = jest.fn();
await chatSDK.initialize();
chatSDK.IC3Client = {
initialize: jest.fn(),
joinConversation: jest.fn()
}
const optionaParams = {
preChatResponse: 'preChatResponse',
customContext: {},
browser: 'browser',
os: 'os',
locale: 'locale',
device: 'device'
}
jest.spyOn(chatSDK.OCClient, 'getChatToken').mockResolvedValue(Promise.resolve({
ChatId: '',
Token: '',
RegionGtms: '{}'
}));
jest.spyOn(chatSDK.OCClient, 'sessionInit').mockResolvedValue(Promise.resolve());
await chatSDK.startChat(optionaParams);
const sessionInitOptionalParams = {
initContext: {
preChatResponse: optionaParams.preChatResponse,
browser: optionaParams.browser,
os: optionaParams.os,
locale: optionaParams.locale,
device: optionaParams.device
}
}
expect(chatSDK.OCClient.sessionInit.mock.calls[0][1]).toMatchObject(sessionInitOptionalParams);
});
it('ChatSDK.startChat() with initContext defined should override IStartChatOptionalParams', async() => {
const chatSDK = new OmnichannelChatSDK(omnichannelConfig);
chatSDK.getChatConfig = jest.fn();
await chatSDK.initialize();
chatSDK.IC3Client = {
initialize: jest.fn(),
joinConversation: jest.fn()
}
const optionaParams = {
preChatResponse: 'preChatResponse',
customContext: {},
browser: 'browser',
os: 'os',
locale: 'locale',
device: 'device',
initContext: {
preChatResponse: 'override',
customContext: 'override',
browser: 'override',
os: 'override',
locale: 'override',
device: 'override'
}
}
jest.spyOn(chatSDK.OCClient, 'getChatToken').mockResolvedValue(Promise.resolve({
ChatId: '',
Token: '',
RegionGtms: '{}'
}));
jest.spyOn(chatSDK.OCClient, 'sessionInit').mockResolvedValue(Promise.resolve());
await chatSDK.startChat(optionaParams);
const sessionInitOptionalParams = {
initContext: {
preChatResponse: optionaParams.initContext.preChatResponse,
customContext: optionaParams.initContext.customContext,
browser: optionaParams.initContext.browser,
os: optionaParams.initContext.os,
locale: optionaParams.initContext.locale,
device: optionaParams.initContext.device
}
}
expect(chatSDK.OCClient.sessionInit.mock.calls[0][1]).toMatchObject(sessionInitOptionalParams);
});
it('ChatSDK.startChat() with authenticatedUserToken should pass it to OCClient.sessionInit() call\'s optional parameters', async() => {
const chatSDKConfig = {
getAuthToken: async () => {

Просмотреть файл

@ -104,10 +104,35 @@ class OmnichannelChatSDK {
initContext: {} as InitContext
};
if (optionalParams.customContext) {
(sessionInitOptionalParams.initContext! as any).customContextData = optionalParams.customContext; // eslint-disable-line @typescript-eslint/no-explicit-any
}
if (optionalParams.browser) {
sessionInitOptionalParams.initContext!.browser = optionalParams.browser;
}
if (optionalParams.os) {
sessionInitOptionalParams.initContext!.os = optionalParams.os;
}
if (optionalParams.locale) {
sessionInitOptionalParams.initContext!.locale = optionalParams.locale;
}
if (optionalParams.device) {
sessionInitOptionalParams.initContext!.device = optionalParams.device;
}
if (optionalParams.preChatResponse) {
sessionInitOptionalParams.initContext!.preChatResponse = optionalParams.preChatResponse;
}
// Override initContext completely
if (optionalParams.initContext) {
sessionInitOptionalParams.initContext = optionalParams.initContext;
}
if (this.authenticatedUserToken) {
sessionInitOptionalParams.authenticatedUserToken = this.authenticatedUserToken;
}

Просмотреть файл

@ -1,6 +1,13 @@
import InitContext from "@microsoft/ocsdk/lib/Model/InitContext";
import ILiveChatContext from "./ILiveChatContext";
export default interface IStartChatOptionalParams {
liveChatContext?: ILiveChatContext
preChatResponse?: object
liveChatContext?: ILiveChatContext;
preChatResponse?: object;
customContext?: object;
browser?: string;
os?: string;
locale?: string;
device?: string;
initContext?: InitContext;
}