@telia-ace/knowledge-widget-bot-provider 0.0.1-alpha.48 → 0.0.1-alpha.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +5 -5
- package/README.md +12 -12
- package/dist/client/chat.client.d.ts +16 -16
- package/dist/client/contact-method.client.d.ts +34 -34
- package/dist/client/http.client.d.ts +26 -26
- package/dist/client/middleware.client.d.ts +14 -14
- package/dist/components/feedback-list.d.ts +8 -0
- package/dist/components/no-good-alternative.d.ts +6 -0
- package/dist/contact-method.js.map +1 -1
- package/dist/contract/custom-component/contact-method-item.d.ts +9 -9
- package/dist/contract/custom-component/contact-method-list.d.ts +7 -7
- package/dist/contract/custom-component/contact-method.d.ts +3 -3
- package/dist/contract/custom-component/entry-context.d.ts +5 -5
- package/dist/contract/enum/server-entry-type.enum.d.ts +7 -7
- package/dist/contract/model/conversation-api-model/list.model.d.ts +5 -5
- package/dist/contract/model/conversation-api-model/message.model.d.ts +7 -7
- package/dist/contract/model/http/action.model.d.ts +3 -3
- package/dist/contract/model/http/client-action.model.d.ts +4 -4
- package/dist/contract/model/http/client-envelope.model.d.ts +9 -9
- package/dist/contract/model/http/connect-options.model.d.ts +5 -5
- package/dist/contract/model/http/global-state.model.d.ts +8 -8
- package/dist/contract/model/http/http-client-options.model.d.ts +5 -5
- package/dist/contract/model/http/server-entry.model.d.ts +11 -11
- package/dist/contract/model/http/server-envelope.model.d.ts +10 -10
- package/dist/contract/model/middleware/aggregator-state.model.d.ts +4 -4
- package/dist/contract/model/shared/loose-object.model.d.ts +3 -3
- package/dist/feedback-list.js +104 -0
- package/dist/feedback-list.js.map +1 -0
- package/dist/helper/chat.helper.d.ts +8 -8
- package/dist/helper/http.helper.d.ts +13 -13
- package/dist/helper/middleware.helper.d.ts +12 -12
- package/dist/helper/store.helper.d.ts +23 -23
- package/dist/index.d.ts +2 -2
- package/dist/index.js +32 -11
- package/dist/index.js.map +1 -1
- package/dist/interface/entry.interface.d.ts +20 -20
- package/dist/interface/middleware/paging.interface.d.ts +4 -4
- package/dist/interface/middleware/processor.interface.d.ts +10 -10
- package/dist/no-good-alternative.js +33 -0
- package/dist/no-good-alternative.js.map +1 -0
- package/dist/plugin.d.ts +3 -3
- package/dist/ui/feedback-list.d.ts +8 -0
- package/dist/ui/no-good-alternative.d.ts +6 -0
- package/dist/utils.d.ts +2 -2
- package/package.json +8 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export declare class ChatHelper {
|
|
2
|
-
private static user;
|
|
3
|
-
private static agent;
|
|
4
|
-
static setUser(user: any): void;
|
|
5
|
-
static setAgent(agent: any): void;
|
|
6
|
-
static getUser(): any;
|
|
7
|
-
static getAgent(): any;
|
|
8
|
-
}
|
|
1
|
+
export declare class ChatHelper {
|
|
2
|
+
private static user;
|
|
3
|
+
private static agent;
|
|
4
|
+
static setUser(user: any): void;
|
|
5
|
+
static setAgent(agent: any): void;
|
|
6
|
+
static getUser(): any;
|
|
7
|
+
static getAgent(): any;
|
|
8
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export declare class HttpHelper {
|
|
2
|
-
static fetchOptions: {
|
|
3
|
-
method: string;
|
|
4
|
-
headers: {
|
|
5
|
-
Accept: string;
|
|
6
|
-
'Content-Type': string;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
static combineUrl(basePath: string, path: string): string;
|
|
10
|
-
static managedSubdomainSuffixes: string[];
|
|
11
|
-
static parseSubdomain: (input: string) => string;
|
|
12
|
-
static getCredentials(): string | undefined;
|
|
13
|
-
}
|
|
1
|
+
export declare class HttpHelper {
|
|
2
|
+
static fetchOptions: {
|
|
3
|
+
method: string;
|
|
4
|
+
headers: {
|
|
5
|
+
Accept: string;
|
|
6
|
+
'Content-Type': string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
static combineUrl(basePath: string, path: string): string;
|
|
10
|
+
static managedSubdomainSuffixes: string[];
|
|
11
|
+
static parseSubdomain: (input: string) => string;
|
|
12
|
+
static getCredentials(): string | undefined;
|
|
13
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Message } from '../contract/model/conversation-api-model/message.model';
|
|
2
|
-
export declare class MiddlewareHelper {
|
|
3
|
-
private static sessionMessageStorageVariable;
|
|
4
|
-
private static container;
|
|
5
|
-
private static widget;
|
|
6
|
-
static setContainer(container: any): void;
|
|
7
|
-
static setWidget(widget: any): void;
|
|
8
|
-
static getContainer(): any;
|
|
9
|
-
static getWidget(): any;
|
|
10
|
-
static setEntrySessionStorage: (messages: Message[]) => Promise<void>;
|
|
11
|
-
static getEntrySessionStorage(): Promise<any>;
|
|
12
|
-
}
|
|
1
|
+
import { Message } from '../contract/model/conversation-api-model/message.model';
|
|
2
|
+
export declare class MiddlewareHelper {
|
|
3
|
+
private static sessionMessageStorageVariable;
|
|
4
|
+
private static container;
|
|
5
|
+
private static widget;
|
|
6
|
+
static setContainer(container: any): void;
|
|
7
|
+
static setWidget(widget: any): void;
|
|
8
|
+
static getContainer(): any;
|
|
9
|
+
static getWidget(): any;
|
|
10
|
+
static setEntrySessionStorage: (messages: Message[]) => Promise<void>;
|
|
11
|
+
static getEntrySessionStorage(): Promise<any>;
|
|
12
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { Message } from '../contract/model/conversation-api-model/message.model';
|
|
2
|
-
import { ClientAction } from '../contract/model/http/client-action.model';
|
|
3
|
-
import { GlobalState } from '../contract/model/http/global-state.model';
|
|
4
|
-
import { ServerEntry } from '../contract/model/http/server-entry.model';
|
|
5
|
-
import { LooseObject } from '../contract/model/shared/loose-object.model';
|
|
6
|
-
export declare class StoreHelper {
|
|
7
|
-
private static messageStore;
|
|
8
|
-
private static globalState;
|
|
9
|
-
constructor();
|
|
10
|
-
static insertOrUpdateMessageArrayStore(messageArray: Message[], entry?: any): Promise<void>;
|
|
11
|
-
static insertMessageToStore(message: Message): void;
|
|
12
|
-
private static updateMessageInStore;
|
|
13
|
-
static checkIdInMessageStore(id: string): boolean;
|
|
14
|
-
static getLocalState(action: string): LooseObject | undefined;
|
|
15
|
-
static getGlobalState(): GlobalState;
|
|
16
|
-
static setGlobalState(state: GlobalState): Promise<void>;
|
|
17
|
-
static getAction(action: string): ClientAction;
|
|
18
|
-
static getCommand(text: string): LooseObject;
|
|
19
|
-
static getEntry(action: string): ServerEntry | undefined;
|
|
20
|
-
static getMessage(id: string): Message | undefined;
|
|
21
|
-
static getEntryStore(): ServerEntry[];
|
|
22
|
-
static rehydrateState(): Promise<void>;
|
|
23
|
-
}
|
|
1
|
+
import { Message } from '../contract/model/conversation-api-model/message.model';
|
|
2
|
+
import { ClientAction } from '../contract/model/http/client-action.model';
|
|
3
|
+
import { GlobalState } from '../contract/model/http/global-state.model';
|
|
4
|
+
import { ServerEntry } from '../contract/model/http/server-entry.model';
|
|
5
|
+
import { LooseObject } from '../contract/model/shared/loose-object.model';
|
|
6
|
+
export declare class StoreHelper {
|
|
7
|
+
private static messageStore;
|
|
8
|
+
private static globalState;
|
|
9
|
+
constructor();
|
|
10
|
+
static insertOrUpdateMessageArrayStore(messageArray: Message[], entry?: any): Promise<void>;
|
|
11
|
+
static insertMessageToStore(message: Message): void;
|
|
12
|
+
private static updateMessageInStore;
|
|
13
|
+
static checkIdInMessageStore(id: string): boolean;
|
|
14
|
+
static getLocalState(action: string): LooseObject | undefined;
|
|
15
|
+
static getGlobalState(): GlobalState;
|
|
16
|
+
static setGlobalState(state: GlobalState): Promise<void>;
|
|
17
|
+
static getAction(action: string): ClientAction;
|
|
18
|
+
static getCommand(text: string): LooseObject;
|
|
19
|
+
static getEntry(action: string): ServerEntry | undefined;
|
|
20
|
+
static getMessage(id: string): Message | undefined;
|
|
21
|
+
static getEntryStore(): ServerEntry[];
|
|
22
|
+
static rehydrateState(): Promise<void>;
|
|
23
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import ConversationPlugin from './plugin';
|
|
2
|
-
export { ConversationPlugin };
|
|
1
|
+
import ConversationPlugin from './plugin';
|
|
2
|
+
export { ConversationPlugin };
|
package/dist/index.js
CHANGED
|
@@ -39,7 +39,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
39
39
|
};
|
|
40
40
|
import { ContactMethodPlatform } from "@telia-ace/knowledge-widget-adapters";
|
|
41
41
|
import { DataType, DataClient } from "@telia-ace/knowledge-widget-types-grid";
|
|
42
|
-
import { ConversationMessageListItemType, ConversationPlatform
|
|
42
|
+
import { ConversationMessageListItemType, ConversationPlatform } from "@telia-ace/widget-conversation";
|
|
43
43
|
import { v4 } from "uuid";
|
|
44
44
|
import { createStorageWriter, StorageCategory, readStorage } from "@telia-ace/widget-services";
|
|
45
45
|
import { FormBuilder, submitButton } from "@telia-ace/widget-forms";
|
|
@@ -555,8 +555,14 @@ class EntryInterface {
|
|
|
555
555
|
}
|
|
556
556
|
getListActions(items, text, actions, state) {
|
|
557
557
|
let list = [];
|
|
558
|
-
let mainListContent = {};
|
|
559
558
|
const mainListType = this.getListType(state);
|
|
559
|
+
const createMainList = (type) => {
|
|
560
|
+
if (type === ConversationMessageListItemType.ButtonList) {
|
|
561
|
+
return [];
|
|
562
|
+
}
|
|
563
|
+
return {};
|
|
564
|
+
};
|
|
565
|
+
let mainListContent = createMainList(mainListType);
|
|
560
566
|
let mainList = [mainListType, { actions: mainListContent }];
|
|
561
567
|
if (mainListType === "ace-knowledge-contact-method") {
|
|
562
568
|
mainList[1] = __spreadProps(__spreadValues({}, mainList[1]), {
|
|
@@ -580,19 +586,32 @@ class EntryInterface {
|
|
|
580
586
|
switch (o.actionKey) {
|
|
581
587
|
case this.helpActionKey: {
|
|
582
588
|
list.push([ConversationMessageListItemType.Separator, void 0]);
|
|
583
|
-
list.push([
|
|
584
|
-
ConversationMessageListItemType.NoGoodAlternative,
|
|
585
|
-
{ body: o.title }
|
|
586
|
-
]);
|
|
589
|
+
list.push(["no-good-alternative", { body: o.title }]);
|
|
587
590
|
break;
|
|
588
591
|
}
|
|
589
592
|
case this.nextActionKey: {
|
|
590
|
-
if (!!actions["next"] && actions["next"].take === items.filter((o2) => o2.actionKey !== "help").length + 2)
|
|
591
|
-
mainListContent
|
|
593
|
+
if (!!actions["next"] && actions["next"].take === items.filter((o2) => o2.actionKey !== "help").length + 2) {
|
|
594
|
+
if (Array.isArray(mainListContent)) {
|
|
595
|
+
mainListContent.push({
|
|
596
|
+
label: o.title,
|
|
597
|
+
actionKey: o.actionKey
|
|
598
|
+
});
|
|
599
|
+
} else {
|
|
600
|
+
mainListContent[o.actionKey] = o.title;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
592
603
|
break;
|
|
593
604
|
}
|
|
594
605
|
default: {
|
|
595
|
-
mainListContent
|
|
606
|
+
if (Array.isArray(mainListContent)) {
|
|
607
|
+
mainListContent.push({
|
|
608
|
+
label: o.title,
|
|
609
|
+
actionKey: o.actionKey,
|
|
610
|
+
symbol: o.symbol
|
|
611
|
+
});
|
|
612
|
+
} else {
|
|
613
|
+
mainListContent[o.actionKey] = o.title;
|
|
614
|
+
}
|
|
596
615
|
}
|
|
597
616
|
}
|
|
598
617
|
});
|
|
@@ -602,7 +621,7 @@ class EntryInterface {
|
|
|
602
621
|
if ((state == null ? void 0 : state.$type) === "Humany.Matching.Bots.Conversations.GuideListState, Humany.Matching") {
|
|
603
622
|
return ConversationMessageListItemType.LinkList;
|
|
604
623
|
} else if ((state == null ? void 0 : state.$type) === "Humany.Matching.Bots.Conversations.States.GuideFeedbackState, Humany.Matching") {
|
|
605
|
-
return
|
|
624
|
+
return "feedback-list";
|
|
606
625
|
} else if ((state == null ? void 0 : state.$type) === "Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching") {
|
|
607
626
|
return "ace-knowledge-contact-method";
|
|
608
627
|
} else
|
|
@@ -1057,7 +1076,9 @@ const KnowledgeBotProviderPlugin = (container) => __async(this, null, function*
|
|
|
1057
1076
|
const dataClient = yield DataClient.getInstance(container);
|
|
1058
1077
|
const platform = yield ConversationPlatform.getInstance(container);
|
|
1059
1078
|
const contactMethodPlatform = yield ContactMethodPlatform.getInstance(container);
|
|
1060
|
-
|
|
1079
|
+
platform.registerConversationItem("ace-knowledge-contact-method", import("./contact-method.js"));
|
|
1080
|
+
platform.registerConversationItem("no-good-alternative", import("./no-good-alternative.js"));
|
|
1081
|
+
platform.registerConversationItem("feedback-list", import("./feedback-list.js"));
|
|
1061
1082
|
platform.registerProvider("chat.bot", (conversation, component) => {
|
|
1062
1083
|
const endpoint = getKnowledgeBotEndpoint(container, component);
|
|
1063
1084
|
const clientId = v4();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/contract/enum/server-entry-type.enum.ts","../src/helper/chat.helper.ts","../src/helper/middleware.helper.ts","../src/helper/store.helper.ts","../src/client/contact-method.client.ts","../src/utils.ts","../src/interface/entry.interface.ts","../src/client/chat.client.ts","../src/helper/http.helper.ts","../src/interface/middleware/paging.interface.ts","../src/interface/middleware/processor.interface.ts","../src/client/middleware.client.ts","../src/client/http.client.ts","../src/plugin.ts"],"sourcesContent":["export enum ServerEntryTypeEnum {\r\n Widget,\r\n Text,\r\n Contact,\r\n List,\r\n Error,\r\n}\r\n","export class ChatHelper {\r\n private static user: any;\r\n private static agent: any;\r\n\r\n static setUser(user: any) {\r\n this.user = user;\r\n }\r\n\r\n static setAgent(agent: any) {\r\n this.agent = agent;\r\n }\r\n \r\n static getUser(): any {\r\n return this.user;\r\n }\r\n \r\n static getAgent(): any {\r\n return this.agent;\r\n }\r\n}\r\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\r\nimport { Message } from '../contract/model/conversation-api-model/message.model';\r\n\r\nexport class MiddlewareHelper {\r\n private static sessionMessageStorageVariable: string = 'conversation-plugin-messages';\r\n private static container: any;\r\n private static widget: any;\r\n\r\n static setContainer(container: any) {\r\n MiddlewareHelper.container = container;\r\n }\r\n\r\n static setWidget(widget: any) {\r\n this.widget = widget;\r\n }\r\n\r\n static getContainer(): any {\r\n return this.container;\r\n }\r\n\r\n static getWidget(): any {\r\n return this.widget;\r\n }\r\n\r\n static setEntrySessionStorage = async (messages: Message[]) => {\r\n return createStorageWriter(\r\n MiddlewareHelper.container,\r\n MiddlewareHelper.sessionMessageStorageVariable,\r\n StorageCategory.Necessary\r\n ).then((write) => {\r\n return write(messages);\r\n });\r\n };\r\n\r\n static getEntrySessionStorage(): Promise<any> {\r\n return readStorage(this.container, this.sessionMessageStorageVariable);\r\n }\r\n}\r\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\r\nimport { Message } from '../contract/model/conversation-api-model/message.model';\r\nimport { ClientAction } from '../contract/model/http/client-action.model';\r\nimport { GlobalState } from '../contract/model/http/global-state.model';\r\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\r\nimport { LooseObject } from '../contract/model/shared/loose-object.model';\r\nimport { MiddlewareHelper } from './middleware.helper';\r\n\r\nconst botProviderGlobalStateSessionKey = 'bot-provider-global-state';\r\n\r\nexport class StoreHelper {\r\n private static messageStore: Message[] = [];\r\n private static globalState: GlobalState;\r\n\r\n constructor() {\r\n StoreHelper.globalState = {\r\n completedInteractionsCount: 0,\r\n lastBotGuide: 0,\r\n site: '',\r\n invincibleParameters: {},\r\n };\r\n }\r\n\r\n static async insertOrUpdateMessageArrayStore(messageArray: Message[], entry?: any) {\r\n for (const message of messageArray.filter((o) => !!o)) {\r\n if (!this.messageStore.find((o) => o.id == message.id)) {\r\n this.insertMessageToStore(message);\r\n } else {\r\n this.updateMessageInStore(message, entry);\r\n }\r\n }\r\n\r\n await MiddlewareHelper.setEntrySessionStorage(this.messageStore);\r\n }\r\n\r\n static insertMessageToStore(message: Message) {\r\n this.messageStore.push(message);\r\n }\r\n\r\n private static updateMessageInStore(message: Message, entry?: any) {\r\n message.conversationEntry = entry;\r\n let index = this.messageStore.findIndex((o) => o.id == message.id);\r\n this.messageStore[index] = message;\r\n }\r\n\r\n static checkIdInMessageStore(id: string): boolean {\r\n return this.messageStore.find((o) => o.id == id) === undefined;\r\n }\r\n\r\n static getLocalState(action: string): LooseObject | undefined {\r\n const entry: ServerEntry | undefined = this.getEntry(action);\r\n return entry?.localState;\r\n }\r\n\r\n static getGlobalState(): GlobalState {\r\n return StoreHelper.globalState;\r\n }\r\n\r\n static setGlobalState(state: GlobalState) {\r\n StoreHelper.globalState = state;\r\n\r\n return createStorageWriter(\r\n MiddlewareHelper.getContainer(),\r\n botProviderGlobalStateSessionKey,\r\n StorageCategory.Necessary\r\n ).then((write) => {\r\n return write(state);\r\n });\r\n }\r\n\r\n static getAction(action: string): ClientAction {\r\n const entry: ServerEntry | undefined = this.getEntry(action);\r\n\r\n return {\r\n key: action,\r\n content: entry?.actions[action],\r\n };\r\n }\r\n\r\n static getCommand(text: string): LooseObject {\r\n return { phrase: text };\r\n }\r\n\r\n static getEntry(action: string): ServerEntry | undefined {\r\n let entry: ServerEntry | undefined = undefined;\r\n this.getEntryStore().forEach((o) => {\r\n if (o.actions[action]) {\r\n entry = o;\r\n }\r\n });\r\n return entry;\r\n }\r\n\r\n static getMessage(id: string): Message | undefined {\r\n return this.messageStore.find((o) => o.id == id);\r\n }\r\n\r\n static getEntryStore(): ServerEntry[] {\r\n return this.messageStore\r\n .filter((o) => !!o.entry)\r\n .map((o) => {\r\n return o.entry;\r\n });\r\n }\r\n\r\n static async rehydrateState() {\r\n const state: GlobalState | undefined = await readStorage(\r\n MiddlewareHelper.getContainer(),\r\n botProviderGlobalStateSessionKey\r\n );\r\n if (state) {\r\n this.setGlobalState(state);\r\n }\r\n }\r\n}\r\n","import { ContactMethodPlatform } from '@telia-ace/knowledge-widget-adapters';\r\nimport { DataClient, DataType } from '@telia-ace/knowledge-widget-types-grid';\r\nimport { FormBuilder, submitButton } from '@telia-ace/widget-forms';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { StoreHelper } from '../helper/store.helper';\r\nimport ChatClient from './chat.client';\r\n\r\nexport class ContactMethodClient {\r\n private static dataClient: DataClient;\r\n private static contactMethodPlatform: ContactMethodPlatform;\r\n private static contactMessageEntryArray: any[] = [];\r\n private static agent: any;\r\n private chatClient: ChatClient;\r\n private static container: any;\r\n\r\n constructor(container: Container) {\r\n this.chatClient = new ChatClient(container);\r\n }\r\n\r\n static initialize(\r\n container: any,\r\n dataClient: DataClient,\r\n contactMethodPlatform: ContactMethodPlatform,\r\n agent: any\r\n ) {\r\n this.dataClient = dataClient;\r\n this.contactMethodPlatform = contactMethodPlatform;\r\n this.agent = agent;\r\n this.container = container;\r\n }\r\n\r\n // function for handling forms as contact methods\r\n handleNewForm = async (errors: any, entry: any) => {\r\n this.updateForm(entry.contactMethods, {\r\n submit: 'Submit',\r\n errors: errors,\r\n });\r\n entry.entry.update({\r\n contactMethods: entry.contactMethods,\r\n type: 'ace-knowledge-contact-method',\r\n noPadding: true,\r\n });\r\n };\r\n\r\n // function for receiving the contact method based on the input\r\n handleContactMethod = async (input: string = '') => {\r\n if (input == 'contact') {\r\n await this.handleContactCategoryList(input);\r\n } else {\r\n let contactMethods = await this.loadContactMethods(\r\n input.split('/')[1], // type\r\n input.split('/')[0] // id\r\n );\r\n\r\n if (!!contactMethods.body?.form) {\r\n this.handleForm(input, contactMethods);\r\n } else if (!contactMethods.expanded && contactMethods.inline) {\r\n this.handleSingleContactMethod(contactMethods);\r\n } else if (!!contactMethods.contactMethods) {\r\n this.handleContactMethodList(input, contactMethods);\r\n }\r\n }\r\n };\r\n\r\n // validation of the form provided\r\n validate(form: any) {\r\n let entry = ContactMethodClient.contactMessageEntryArray.find(\r\n (o) => o.id == form.schema.id\r\n );\r\n ContactMethodClient.contactMethodPlatform.validate(entry.contactMethods).then((result) => {\r\n this.handleNewForm(result.errors, entry);\r\n if (result.valid) {\r\n this.submit(entry);\r\n this.removeForm(entry);\r\n }\r\n });\r\n }\r\n\r\n private handleContactCategoryList = async (input: string) => {\r\n let newGuid = uuidv4();\r\n let type = DataType.ContactMethodCategories;\r\n let contactMethods = await this.loadContactMethods(type);\r\n this.chatClient.printUserMessageAndStoreIt(input);\r\n this.printMessage(newGuid, contactMethods);\r\n };\r\n\r\n private handleForm(input: string, contactMethods: any) {\r\n let title = input.split('/')[2];\r\n contactMethods.expanded = true;\r\n this.updateForm(contactMethods, {\r\n submit: 'Submit',\r\n errors: undefined,\r\n });\r\n this.printMessage(contactMethods.id, contactMethods, title);\r\n }\r\n\r\n addContactMethod(contactMethod: any) {\r\n contactMethod.expanded = true;\r\n this.updateForm(contactMethod, {\r\n submit: 'Submit',\r\n errors: undefined,\r\n });\r\n return this.printMessage(contactMethod.id, contactMethod);\r\n }\r\n\r\n expandContactMethod(input: { entryId: string; contactMethodId: string }) {\r\n const message = StoreHelper.getMessage(input.entryId);\r\n\r\n if (message?.conversationEntry && Array.isArray(message.message)) {\r\n const messageItemIndex = message.message.findIndex(\r\n ([listType]: any[]) => listType === 'ace-knowledge-contact-method'\r\n );\r\n if (messageItemIndex > -1) {\r\n const [messageItemType, messageItemContent] = message.message[messageItemIndex];\r\n const updatedMessageItemContent = {\r\n ...messageItemContent,\r\n contactMethods: messageItemContent.contactMethods.map((cm: any) => {\r\n cm.expanded = true;\r\n return cm;\r\n }),\r\n };\r\n const updatedMessageItems = [\r\n ...message.message.slice(0, messageItemIndex),\r\n [messageItemType, updatedMessageItemContent],\r\n ...message.message.slice(messageItemIndex + 1),\r\n ];\r\n\r\n message.conversationEntry.writer({ items: updatedMessageItems });\r\n }\r\n }\r\n }\r\n\r\n private handleContactMethodList(input: string, contactMethods: any) {\r\n let title = input.split('/')[2];\r\n let newGuid = uuidv4();\r\n this.printMessage(newGuid, contactMethods, title);\r\n }\r\n\r\n private handleSingleContactMethod(contactMethods: any) {\r\n let entry = ContactMethodClient.contactMessageEntryArray.find((o) =>\r\n o.contactMethods.contactMethods.find((t: any) => t.id == contactMethods.id)\r\n );\r\n let curCM = entry.contactMethods.contactMethods.find((t: any) => t.id == contactMethods.id);\r\n curCM.expanded = true;\r\n let message = {\r\n contactMethods: entry.contactMethods,\r\n type: 'ace-knowledge-contact-method',\r\n noPadding: true,\r\n };\r\n StoreHelper.insertOrUpdateMessageArrayStore([\r\n {\r\n id: entry.id,\r\n message: message,\r\n isUser: false,\r\n },\r\n ]);\r\n entry.entry.update(message);\r\n }\r\n\r\n private submit(entry: any) {\r\n ContactMethodClient.contactMethodPlatform.submit(entry.contactMethods).then((result) => {\r\n if (!!result) ContactMethodClient.agent.print(result);\r\n });\r\n }\r\n\r\n private removeForm(entry: any) {\r\n entry.entry.remove();\r\n ContactMethodClient.contactMessageEntryArray.splice(\r\n ContactMethodClient.contactMessageEntryArray.indexOf(entry),\r\n 1\r\n );\r\n }\r\n\r\n private printMessage(\r\n newGuid: string,\r\n contactMethods: any,\r\n title: string | undefined = undefined\r\n ) {\r\n if (ContactMethodClient.contactMessageEntryArray.find((o) => o.id == contactMethods.id)) {\r\n let entry = ContactMethodClient.contactMessageEntryArray.find(\r\n (o) => o.id == contactMethods.id\r\n );\r\n let message = {\r\n contactMethods: contactMethods,\r\n type: 'ace-knowledge-contact-method',\r\n noPadding: true,\r\n };\r\n entry.entry.update(message);\r\n StoreHelper.insertOrUpdateMessageArrayStore([\r\n {\r\n id: entry.guid,\r\n message: message,\r\n isUser: false,\r\n },\r\n ]);\r\n return message;\r\n } else {\r\n if (title) this.chatClient.printUserMessageAndStoreIt(title);\r\n let message = {\r\n contactMethods: contactMethods,\r\n type: 'ace-knowledge-contact-method',\r\n noPadding: true,\r\n };\r\n let entry = ContactMethodClient.agent.print(message);\r\n StoreHelper.insertOrUpdateMessageArrayStore([\r\n {\r\n id: newGuid,\r\n message: message,\r\n isUser: false,\r\n },\r\n ]);\r\n ContactMethodClient.contactMessageEntryArray.push({\r\n id: newGuid,\r\n contactMethods: contactMethods,\r\n entry: entry,\r\n });\r\n return message;\r\n }\r\n }\r\n\r\n private loadContactMethods(dataType: string, id: string | undefined = undefined): Promise<any> {\r\n switch (dataType) {\r\n case DataType.ContactMethodCategories: {\r\n return ContactMethodClient.container\r\n .getAsync('matchingClient')\r\n .then((matchingClient: any) => {\r\n return matchingClient.customRequest('/contactmethods', 'GET', {});\r\n })\r\n .then((contactMethods: any) => {\r\n return contactMethods;\r\n });\r\n // return ContactMethodClient.dataClient\r\n // .fetch(DataType.ContactMethods, { contactMethodCategoryId: id })\r\n // .then((contactMethods) => contactMethods);\r\n }\r\n case DataType.ContactMethods: {\r\n if (!!id) {\r\n return ContactMethodClient.dataClient\r\n .fetch(DataType.ContactMethod, { contactMethodId: id })\r\n .then((contactMethods) => contactMethods);\r\n } else {\r\n return ContactMethodClient.dataClient\r\n .fetch(DataType.ContactMethods, {})\r\n .then((contactMethods) => contactMethods);\r\n }\r\n }\r\n case DataType.ContactMethodCategories: {\r\n return ContactMethodClient.dataClient\r\n .fetch(DataType.ContactMethods, { contactMethodCategoryId: id })\r\n .then((contactMethods) => contactMethods);\r\n }\r\n default: {\r\n return Promise.resolve(undefined);\r\n }\r\n }\r\n }\r\n\r\n private updateForm = (contactMethod: any, properties: any) => {\r\n if (contactMethod?.body?.form) {\r\n const { body } = contactMethod;\r\n const builder = new FormBuilder(body.form);\r\n\r\n if (!body.form.layout || !body.form.layout.submit) {\r\n builder.createComponent(submitButton(properties.submit, 'submit'));\r\n }\r\n\r\n if (properties.errors) {\r\n builder.setValidationErrors(properties.errors);\r\n }\r\n\r\n return {\r\n ...body,\r\n form: builder.get(),\r\n };\r\n }\r\n return contactMethod?.body || {};\r\n };\r\n}\r\n","import { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\nimport { StoreHelper } from './helper/store.helper';\r\n\r\nexport const getContactMethodEntry = (contactMethodId: string) => {\r\n const entries = StoreHelper.getEntryStore();\r\n\r\n return entries.find((e) => e.content.id === +contactMethodId);\r\n};\r\n\r\nconst convertLegacySymbol = (symbol?: { type: string; content: string }): Symbol | undefined => {\r\n if (symbol) {\r\n const { type, content } = symbol;\r\n if (type && content) {\r\n return { type, content };\r\n }\r\n }\r\n};\r\n\r\nexport const contactMethodFromLegacy = (\r\n {\r\n id,\r\n title,\r\n defaultIcon,\r\n exits: [exit],\r\n exitType,\r\n confirmationText,\r\n expandFormAutomatically,\r\n form,\r\n description,\r\n }: any,\r\n validation?: any\r\n): any => {\r\n const { adapter } = exit || { Adapter: {} };\r\n const { clientName = '', settings: adapterSettings = {}, customClientName = '' } = adapter;\r\n\r\n const settings: any = {\r\n id: id.toString(),\r\n title: title,\r\n description: description,\r\n symbol: convertLegacySymbol(defaultIcon),\r\n clientName: clientName === 'custom.adapter' ? customClientName : clientName,\r\n expanded: true,\r\n inline: true,\r\n body: {},\r\n };\r\n\r\n if (clientName.indexOf('phone') > -1 || clientName.indexOf('freetext') > -1) {\r\n const { displayTextBeforeClick, textBeforeClick } = adapterSettings;\r\n if (displayTextBeforeClick === 'true') {\r\n settings.expanded = false;\r\n settings.title = textBeforeClick;\r\n }\r\n\r\n if (clientName.indexOf('phone.text') > -1) {\r\n settings.body.phoneNumber = adapterSettings.phoneNumber;\r\n } else {\r\n settings.body.freetext = adapterSettings.freetext;\r\n }\r\n }\r\n\r\n if (\r\n clientName.indexOf('chat.popup') > -1 ||\r\n clientName.indexOf('link') > -1 ||\r\n (clientName === 'custom.adapter' && exitType === 'custom')\r\n ) {\r\n settings.body = adapterSettings;\r\n settings.body.confirmationFallback = confirmationText;\r\n }\r\n\r\n if (clientName.indexOf('ace') > -1) {\r\n settings.body = adapterSettings;\r\n }\r\n\r\n if (form && form.hasValueComponents) {\r\n if (validation) {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form, validation).get();\r\n } else {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form).get();\r\n }\r\n if (!expandFormAutomatically) {\r\n settings.expanded = settings.inline = false;\r\n }\r\n }\r\n\r\n return settings;\r\n};\r\n","import { DataClient, DataType } from '@telia-ace/knowledge-widget-types-grid';\r\nimport {\r\n ConversationMessageListItemType,\r\n ConverstationMessageItem,\r\n} from '@telia-ace/widget-conversation';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ContactMethodClient } from '../client/contact-method.client';\r\nimport { ServerEntryTypeEnum } from '../contract/enum/server-entry-type.enum';\r\nimport { Message } from '../contract/model/conversation-api-model/message.model';\r\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\r\nimport { StoreHelper } from '../helper/store.helper';\r\nimport { contactMethodFromLegacy } from '../utils';\r\n\r\nexport default class EntryInterface {\r\n private helpActionKey = 'help';\r\n private nextActionKey = 'next';\r\n\r\n constructor(private container: Container) {}\r\n\r\n // transform the entry based on its type\r\n async transform(entry: ServerEntry, feedbackEntry?: ServerEntry): Promise<Message | undefined> {\r\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\r\n switch (entryType) {\r\n case ServerEntryTypeEnum.List:\r\n return {\r\n id: entry.id,\r\n message: this.listTransform(entry, feedbackEntry),\r\n entry: entry,\r\n isUser: false,\r\n };\r\n case ServerEntryTypeEnum.Text:\r\n return {\r\n id: entry.id,\r\n message: this.textTransform(entry, feedbackEntry),\r\n entry: entry,\r\n isUser: false,\r\n };\r\n case ServerEntryTypeEnum.Contact:\r\n return {\r\n id: entry.id,\r\n message: await this.transformContactMethod(entry),\r\n entry: entry,\r\n isUser: false,\r\n };\r\n }\r\n }\r\n\r\n async transformContactMethod(entry: ServerEntry): Promise<any> {\r\n const dataClient: DataClient = await this.container.getAsync('dataClient');\r\n\r\n const contactMethod = await dataClient.fetch(DataType.ContactMethod, {\r\n contactMethodId: entry.content.id,\r\n });\r\n\r\n const cmClient = new ContactMethodClient(this.container);\r\n cmClient.addContactMethod(contactMethod);\r\n }\r\n\r\n // transform an array of entries\r\n async transformArray(entryArray: ServerEntry[]): Promise<Message[]> {\r\n let feedbackEntry = entryArray.find((o) =>\r\n o.tags.find((t) => t == 'gentle' || t == 'feedback')\r\n );\r\n let returnArray: Message[] = [];\r\n for (const o of entryArray.filter((t) => t !== feedbackEntry)) {\r\n let x = await this.transform(o, feedbackEntry);\r\n if (!!x) returnArray.push(x);\r\n }\r\n return returnArray;\r\n }\r\n\r\n // gets the text that should be printed as a user message on action\r\n getUserMessage(action: string) {\r\n let entry = StoreHelper.getEntry(action);\r\n\r\n return this.getTitleFromEntry(entry, action);\r\n }\r\n\r\n private listTransform(entry: ServerEntry, feedbackEntry?: ServerEntry): any {\r\n if (entry.type === 'Contact') {\r\n return;\r\n }\r\n\r\n if (!entry.content) return;\r\n\r\n let object = this.getListActions(\r\n entry.content.items,\r\n this.getContentText(entry),\r\n entry.actions,\r\n entry.localState\r\n );\r\n\r\n if (!!feedbackEntry) {\r\n let feedbackObject = this.getListActions(\r\n feedbackEntry.content.items,\r\n this.getContentText(feedbackEntry),\r\n feedbackEntry.actions,\r\n feedbackEntry.localState\r\n );\r\n //TODO this will be remade\r\n StoreHelper.insertMessageToStore({\r\n id: feedbackEntry.id,\r\n message: undefined,\r\n entry: feedbackEntry,\r\n isUser: false,\r\n });\r\n\r\n return object.concat(feedbackObject);\r\n }\r\n\r\n return object;\r\n }\r\n\r\n private getContentText(entry: ServerEntry): object | undefined {\r\n if (entry.content.html) return { body: entry.content.html };\r\n if (entry.content.header) return { title: entry.content.header };\r\n }\r\n\r\n private textTransform(entry: ServerEntry, feedbackEntry?: ServerEntry): any {\r\n //TODO this will be remade with the embeded contact methods\r\n\r\n if (!!entry.content.items) return this.listTransform(entry, feedbackEntry);\r\n\r\n let returnObj: ConverstationMessageItem<any> = [\r\n ConversationMessageListItemType.HTML,\r\n { body: entry.content.html.replace('\\n', '') },\r\n ];\r\n\r\n if (!!feedbackEntry) {\r\n let feedbackObject = this.getListActions(\r\n feedbackEntry.content.items,\r\n this.getContentText(feedbackEntry),\r\n feedbackEntry.actions,\r\n feedbackEntry.localState\r\n );\r\n StoreHelper.insertMessageToStore({\r\n id: feedbackEntry.id,\r\n message: undefined,\r\n entry: feedbackEntry,\r\n isUser: false,\r\n });\r\n\r\n feedbackObject.unshift(returnObj);\r\n return feedbackObject;\r\n }\r\n\r\n return returnObj;\r\n }\r\n\r\n private getListActions(\r\n items: any[],\r\n text: any,\r\n actions: any,\r\n state: any\r\n ): ConverstationMessageItem<any>[] {\r\n let list: ConverstationMessageItem<any>[] = [];\r\n let mainListContent: { [key: string]: string } = {};\r\n const mainListType = this.getListType(state);\r\n\r\n let mainList: any = [mainListType, { actions: mainListContent }];\r\n\r\n if (mainListType === 'ace-knowledge-contact-method') {\r\n mainList[1] = {\r\n ...mainList[1],\r\n contactMethods: items.map((item) => {\r\n const formatted = contactMethodFromLegacy(item.data);\r\n return formatted;\r\n }),\r\n entry: {\r\n entryId: state.entryId,\r\n },\r\n };\r\n }\r\n\r\n if (text && text.title) {\r\n list.push([ConversationMessageListItemType.Header, text.title]);\r\n }\r\n if (text && text.body) {\r\n list.push([ConversationMessageListItemType.HTML, { body: text.body }]);\r\n }\r\n list.push(mainList);\r\n items.forEach((o) => {\r\n switch (o.actionKey) {\r\n case this.helpActionKey: {\r\n list.push([ConversationMessageListItemType.Separator, undefined]);\r\n list.push([\r\n ConversationMessageListItemType.NoGoodAlternative,\r\n { body: o.title },\r\n ]);\r\n break;\r\n }\r\n case this.nextActionKey: {\r\n if (\r\n !!actions['next'] &&\r\n actions['next'].take ===\r\n items.filter((o) => o.actionKey !== 'help').length + 2\r\n )\r\n mainListContent[o.actionKey] = o.title;\r\n break;\r\n }\r\n default: {\r\n mainListContent[o.actionKey] = o.title;\r\n }\r\n }\r\n });\r\n return list;\r\n }\r\n\r\n private getListType(state: any) {\r\n if (state?.$type === 'Humany.Matching.Bots.Conversations.GuideListState, Humany.Matching') {\r\n return ConversationMessageListItemType.LinkList;\r\n } else if (\r\n state?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.GuideFeedbackState, Humany.Matching'\r\n ) {\r\n return ConversationMessageListItemType.FeedbackList;\r\n } else if (\r\n state?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\r\n ) {\r\n return 'ace-knowledge-contact-method';\r\n } else return ConversationMessageListItemType.ButtonList;\r\n }\r\n\r\n private getTitleFromEntry(entry: ServerEntry | undefined, action: string): string | undefined {\r\n if (!!entry) {\r\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\r\n switch (entryType) {\r\n case ServerEntryTypeEnum.List:\r\n return this.getTitleFromList(entry, action);\r\n case ServerEntryTypeEnum.Text:\r\n return this.textTransform(entry);\r\n }\r\n }\r\n }\r\n\r\n private getTitleFromList(entry: ServerEntry, action: string): string {\r\n return (<Array<any>>entry.content.items).find((o) => o.actionKey == action).title;\r\n }\r\n}\r\n","import { Container } from '@webprovisions/platform';\r\nimport { v4 as newGuid } from 'uuid';\r\nimport { ServerEntryTypeEnum } from '../contract/enum/server-entry-type.enum';\r\nimport { Message } from '../contract/model/conversation-api-model/message.model';\r\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\r\nimport { ChatHelper } from '../helper/chat.helper';\r\nimport { StoreHelper } from '../helper/store.helper';\r\nimport EntryInterface from '../interface/entry.interface';\r\n\r\nexport default class ChatClient {\r\n entryInterface: EntryInterface;\r\n constructor(container: Container) {\r\n this.entryInterface = new EntryInterface(container);\r\n }\r\n\r\n // Initialize from setting the user and agent for the Helper\r\n static initialize(user: any, agent: any) {\r\n ChatHelper.setUser(user);\r\n ChatHelper.setAgent(agent);\r\n }\r\n\r\n // function for posting the messages\r\n async processMessageArrayAndStoreIt(messages: Message[]) {\r\n for (const message of messages.filter((o) => o && o != null && !!o.message)) {\r\n if (message.isUser) this.postUserMessage(message);\r\n else this.postAgentMessage(message);\r\n }\r\n\r\n await StoreHelper.insertOrUpdateMessageArrayStore(messages);\r\n }\r\n\r\n // function for updating current messages\r\n updateMessageArrayAndStoreIt(messages: Message[]) {\r\n let conversationEntry = undefined;\r\n messages.forEach((o) => {\r\n let message = StoreHelper.getMessage(o.id);\r\n message?.conversationEntry.update(o.message);\r\n conversationEntry = message?.conversationEntry;\r\n });\r\n\r\n StoreHelper.insertOrUpdateMessageArrayStore(messages, conversationEntry);\r\n }\r\n\r\n // function for posting a message for the user actions, such as button clicks\r\n printUserMessageAndStoreIt(action: string) {\r\n if (action == 'next' || action == 'help') return;\r\n\r\n let entry = StoreHelper.getEntry(action);\r\n\r\n let message = {\r\n id: newGuid(),\r\n message: !entry ? action : this.getTitleFromEntry(entry, action),\r\n isUser: true,\r\n };\r\n\r\n this.postUserMessage(message);\r\n StoreHelper.insertOrUpdateMessageArrayStore([message]);\r\n }\r\n\r\n private postUserMessage(message: Message) {\r\n ChatHelper.getUser().print(message.message);\r\n }\r\n\r\n private postAgentMessage(message: Message) {\r\n message.conversationEntry = ChatHelper.getAgent().print(message.message);\r\n }\r\n\r\n private getTitleFromEntry(entry: ServerEntry, action: string): string {\r\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\r\n switch (entryType) {\r\n case ServerEntryTypeEnum.List:\r\n return this.getTitleFromList(entry, action);\r\n case ServerEntryTypeEnum.Text:\r\n return this.getTitleFromText(entry, action);\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n private getTitleFromText(entry: ServerEntry, action: string): any {\r\n if (!!entry.content.items) return this.getTitleFromList(entry, action);\r\n else return entry.content.html;\r\n }\r\n\r\n private getTitleFromList(entry: ServerEntry, action: string): string {\r\n return (<Array<any>>entry.content.items).find((o) => o.actionKey == action).title;\r\n }\r\n}\r\n","export class HttpHelper {\r\n static fetchOptions = {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n };\r\n\r\n static combineUrl(basePath: string, path: string) {\r\n return basePath + path;\r\n }\r\n\r\n static managedSubdomainSuffixes = ['stage', 'alpha', 'beta', 'gamma'];\r\n\r\n static parseSubdomain = (input: string) => {\r\n const index = input.lastIndexOf('-');\r\n const lastPart = input.substr(index + 1);\r\n if (HttpHelper.managedSubdomainSuffixes.indexOf(lastPart) > -1) {\r\n return input.substr(0, index);\r\n }\r\n return input;\r\n };\r\n\r\n static getCredentials(): string | undefined {\r\n return 'same-origin';\r\n }\r\n}\r\n","import { ServerEntry } from \"../../contract/model/http/server-entry.model\";\r\nimport { StoreHelper } from \"../../helper/store.helper\";\r\n\r\nexport default class PagingInterface {\r\n process(entries: ServerEntry[]): ServerEntry[] {\r\n const pagingEntry = entries.find((e) => e.tags.indexOf(\"paging\") > -1);\r\n\r\n if (pagingEntry) {\r\n const stream = StoreHelper.getEntryStore().filter(\r\n (e) => e.tags.indexOf(\"paging\") > -1 && e.id === pagingEntry.id\r\n );\r\n\r\n if (stream.length > 0) {\r\n // Get the paging entry with the highest take count\r\n const last = stream.reduce((acc, entry) => {\r\n if (\r\n entry.actions.next &&\r\n entry.actions.next.take >= acc.actions.next.take\r\n ) {\r\n return entry;\r\n }\r\n return acc;\r\n }, stream[0]); // tslint:disable-line:align\r\n\r\n // If there is a paging entry with higher take count than the entry to be written,\r\n // it should be updated to use the paging data from the highest take count entry\r\n if (last.actions.next.take > pagingEntry.actions.next.take) {\r\n entries.forEach((entry) => {\r\n if (entry.id === pagingEntry.id) {\r\n entry.actions.next = {\r\n ...entry.actions.next,\r\n take: last.actions.next.take,\r\n skip: last.actions.next.skip,\r\n };\r\n }\r\n });\r\n }\r\n }\r\n\r\n // if items is null or undefined it should\r\n // overwrite with an empty array\r\n entries.forEach((entry) => {\r\n if (\r\n entry.id === pagingEntry.id &&\r\n entry.content &&\r\n entry.content.timestamp\r\n ) {\r\n entry.content = {\r\n ...entry.content,\r\n items: (entry.content && entry.content.items) || [],\r\n };\r\n }\r\n });\r\n }\r\n\r\n return entries;\r\n }\r\n}\r\n","import { Action } from '../../contract/model/http/action.model';\r\nimport { ServerEntry } from '../../contract/model/http/server-entry.model';\r\n\r\nexport default class ProcessorInterface {\r\n process(entries: ServerEntry[]): ServerEntry[] {\r\n let processedEntries = entries;\r\n\r\n processedEntries = this.deletePaging(processedEntries);\r\n processedEntries = this.delete(processedEntries);\r\n processedEntries = this.merge(processedEntries);\r\n processedEntries = this.moveLoader(processedEntries);\r\n\r\n return processedEntries;\r\n }\r\n\r\n processUpdate(entry: ServerEntry | undefined, updateEntryArray: ServerEntry[]): ServerEntry[] {\r\n updateEntryArray\r\n .filter((t) => t.type == 'List')\r\n .forEach((o) => {\r\n o.content?.items.forEach((t: any) => {\r\n if (!entry?.content.items.find((p: any) => p.actionKey == t.actionKey))\r\n entry?.content.items.push(t);\r\n });\r\n Object.keys(o.actions).forEach((t) => {\r\n this.handleActionUpdateOrInsert(entry?.actions, t, o.actions);\r\n });\r\n });\r\n\r\n //moves the show more and if it helped to the end if it is needed\r\n var itemArray: any[] = entry?.content.items;\r\n\r\n if (itemArray.find((o) => o.actionKey == 'next')) {\r\n itemArray.push(\r\n itemArray.splice(\r\n itemArray.indexOf(itemArray.find((o) => o.actionKey == 'next')),\r\n 1\r\n )[0]\r\n );\r\n }\r\n\r\n if (itemArray.find((o) => o.actionKey == 'help')) {\r\n itemArray.push(\r\n itemArray.splice(\r\n itemArray.indexOf(itemArray.find((o) => o.actionKey == 'help')),\r\n 1\r\n )[0]\r\n );\r\n }\r\n\r\n return entry ? [entry] : [];\r\n }\r\n\r\n private handleActionUpdateOrInsert(\r\n currentArray: Action | undefined,\r\n actionKey: string,\r\n action: Action\r\n ) {\r\n if (!!currentArray) currentArray[actionKey] = action[actionKey];\r\n }\r\n\r\n private deletePaging(entries: ServerEntry[]): ServerEntry[] {\r\n return entries.filter((entry) => {\r\n const isEmptyPaging =\r\n entry.type === 'List' &&\r\n entry.tags &&\r\n entry.tags.indexOf('paging') > -1 &&\r\n typeof entry.content === 'undefined';\r\n return !isEmptyPaging;\r\n });\r\n }\r\n\r\n private delete(entries: ServerEntry[]): ServerEntry[] {\r\n return entries.filter((entry) => entry.content !== null);\r\n }\r\n\r\n private merge(entries: ServerEntry[]): ServerEntry[] {\r\n const output: ServerEntry[] = [];\r\n\r\n const merge = (source: any, target: any = {}): any => {\r\n const content: any = {};\r\n if (source == null) {\r\n return null;\r\n }\r\n\r\n if (target) {\r\n Object.keys(target).forEach((key) => {\r\n content[key] = target[key];\r\n });\r\n }\r\n\r\n Object.keys(source).forEach((key) => {\r\n if (key == 'items') {\r\n if (!content[key]) content[key] = [];\r\n content[key] = content[key].concat(source[key]);\r\n } else if (key == 'html') content[key] = content[key] + source[key];\r\n else content[key] = source[key];\r\n });\r\n\r\n return content;\r\n };\r\n\r\n const mergeLocalState = (source: any, target: any): any => {\r\n if (source == null) return null;\r\n\r\n if (Object.keys(source.actions).length === 0) return target.localState;\r\n\r\n if (Object.keys(target.actions).length === 0) return source.localState;\r\n\r\n return target.localState;\r\n };\r\n\r\n entries.forEach((entry) => {\r\n if (entry.relation && !entry.tags.find((o) => o == 'gentle' || o == 'feedback')) {\r\n let existingEntry = entries.find((o) => o.id == entry.relation);\r\n\r\n if (existingEntry) {\r\n const existingIndex = output.indexOf(existingEntry);\r\n existingEntry.localState = mergeLocalState(entry, existingEntry);\r\n existingEntry.content = merge(entry.content, existingEntry.content);\r\n existingEntry.actions = merge(entry.actions, existingEntry.actions);\r\n output[existingIndex] = existingEntry;\r\n }\r\n } else {\r\n output.push(entry);\r\n }\r\n });\r\n\r\n return output;\r\n }\r\n\r\n private moveLoader(entries: ServerEntry[]): ServerEntry[] {\r\n // Moves the loader component to last position in stream\r\n const loaderEntry = entries.find((e) => e.id === 'loader');\r\n\r\n if (!loaderEntry) {\r\n return entries;\r\n }\r\n\r\n const loaderIndex = entries.indexOf(loaderEntry);\r\n if (loaderIndex > -1) {\r\n entries.splice(entries.length - 1, 0, entries.splice(loaderIndex, 1)[0]);\r\n }\r\n return entries;\r\n }\r\n}\r\n","import { createStorageWriter, StorageCategory } from '@telia-ace/widget-services';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\r\nimport { ChatHelper } from '../helper/chat.helper';\r\nimport { MiddlewareHelper } from '../helper/middleware.helper';\r\nimport { StoreHelper } from '../helper/store.helper';\r\nimport EntryInterface from '../interface/entry.interface';\r\nimport PagingInterface from '../interface/middleware/paging.interface';\r\nimport ProcessorInterface from '../interface/middleware/processor.interface';\r\nimport ChatClient from './chat.client';\r\n\r\nexport default class MiddlewareClient {\r\n private paging: PagingInterface;\r\n private processor: ProcessorInterface;\r\n private entryInterface: EntryInterface;\r\n private chatClient: ChatClient;\r\n\r\n constructor(container: Container) {\r\n this.paging = new PagingInterface();\r\n this.processor = new ProcessorInterface();\r\n this.entryInterface = new EntryInterface(container);\r\n this.chatClient = new ChatClient(container);\r\n }\r\n\r\n static initialize(container: any, widget: any) {\r\n MiddlewareHelper.setContainer(container);\r\n MiddlewareHelper.setWidget(widget);\r\n }\r\n\r\n // called on all standard scenarios like actions and user messages\r\n async handleEntries(entries: ServerEntry[], action?: string) {\r\n const widgetEntry = (entries || []).find((e) => e.type === 'Widget');\r\n\r\n if (widgetEntry) {\r\n const agent = ChatHelper.getAgent();\r\n\r\n if (agent) {\r\n agent.update({\r\n name: widgetEntry.content.agent.name,\r\n avatar: widgetEntry.content.agent.avatar,\r\n });\r\n\r\n const write = await createStorageWriter(\r\n MiddlewareHelper.getContainer(),\r\n 'bot-provider-conversation-meta',\r\n StorageCategory.Necessary\r\n );\r\n write({\r\n agent: {\r\n name: widgetEntry.content.agent.name,\r\n avatar: widgetEntry.content.agent.avatar,\r\n },\r\n });\r\n }\r\n }\r\n\r\n let o = this.executeMiddlewares(entries, false, action);\r\n let messageArray = await this.entryInterface.transformArray(o);\r\n this.chatClient.processMessageArrayAndStoreIt(messageArray);\r\n }\r\n\r\n // called on situations such as paging changes\r\n // when no new entries will be printed\r\n async handleUpdate(entries: ServerEntry[], action?: string) {\r\n let o = this.executeMiddlewares(entries, true, action);\r\n let messageArray = await this.entryInterface.transformArray(o);\r\n this.chatClient.updateMessageArrayAndStoreIt(messageArray);\r\n }\r\n\r\n // checks whether the action was of an update type\r\n checkForUpdate(input: string) {\r\n return input === 'next';\r\n }\r\n\r\n private executeMiddlewares(\r\n entries: ServerEntry[],\r\n isUpdate: boolean,\r\n action?: string\r\n ): ServerEntry[] {\r\n if (isUpdate && action)\r\n entries = this.processor.processUpdate(StoreHelper.getEntry(action), entries);\r\n else {\r\n entries = this.processor.process(entries);\r\n }\r\n entries = this.paging.process(entries);\r\n\r\n return entries;\r\n }\r\n}\r\n","import { readStorage } from '@telia-ace/widget-services';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { v4 as newGuid } from 'uuid';\r\nimport { Message } from '../contract/model/conversation-api-model/message.model';\r\nimport { ClientEnvelope } from '../contract/model/http/client-envelope.model';\r\nimport { HttpClientOptions } from '../contract/model/http/http-client-options.model';\r\nimport { ServerEnvelope } from '../contract/model/http/server-envelope.model';\r\nimport { ChatHelper } from '../helper/chat.helper';\r\nimport { HttpHelper } from '../helper/http.helper';\r\nimport { MiddlewareHelper } from '../helper/middleware.helper';\r\nimport { StoreHelper } from '../helper/store.helper';\r\nimport ChatClient from './chat.client';\r\nimport MiddlewareClient from './middleware.client';\r\n\r\nexport class HttpClient {\r\n private endpointUrl: string;\r\n private clientId: string | undefined;\r\n private projectionPath: string;\r\n private apiEndpoint: string;\r\n private options: HttpClientOptions;\r\n private middlewareClient: MiddlewareClient;\r\n private chatClient: ChatClient;\r\n private container: Container;\r\n\r\n constructor(endpoint: string, clientId: string, container: Container) {\r\n this.options = {\r\n credentials: HttpHelper.getCredentials(),\r\n clientId: clientId,\r\n };\r\n this.apiEndpoint = endpoint;\r\n this.projectionPath = window.location.href;\r\n this.endpointUrl = HttpHelper.combineUrl(this.projectionPath, 'conversations');\r\n this.clientId = this.options.clientId;\r\n this.middlewareClient = new MiddlewareClient(container);\r\n this.chatClient = new ChatClient(container);\r\n this.container = container;\r\n }\r\n\r\n async firstHit() {\r\n // On first hit if there are entries stored in the storage, use them\r\n // Otherwise start a new session\r\n const entries = (await MiddlewareHelper.getEntrySessionStorage()) as Message[];\r\n\r\n if (entries && entries.length > 0) {\r\n await StoreHelper.rehydrateState();\r\n\r\n const meta: any = await readStorage(this.container, 'bot-provider-conversation-meta');\r\n\r\n if (meta?.agent) {\r\n const agent = ChatHelper.getAgent();\r\n agent.update({\r\n name: meta.agent.name,\r\n avatar: meta.agent.avatar,\r\n });\r\n }\r\n\r\n await this.chatClient.processMessageArrayAndStoreIt(entries);\r\n } else {\r\n let envelope = this.constructFirstHitEnvelope();\r\n await this.postAndHandleTheData(envelope);\r\n }\r\n }\r\n\r\n // for updates, such as paging changes\r\n handleUpdate(action: string) {\r\n let envelope = this.constructInputEnvelope(action);\r\n return this.postAndHandleTheUpdateData(envelope, action);\r\n }\r\n\r\n // for action clicks\r\n handleInput(action: string) {\r\n let envelope = this.constructInputEnvelope(action);\r\n return this.postAndHandleTheData(envelope, action);\r\n }\r\n\r\n // for category burger\r\n handleCategories() {\r\n let envelope = this.constructCategoriesEnvelope();\r\n return this.postAndHandleTheData(envelope);\r\n }\r\n\r\n // for text entries by user\r\n handlePhrase(phrase: string) {\r\n const envelope = this.constructPhraseEnvelope(phrase);\r\n\r\n const id = newGuid();\r\n const entry = {\r\n id,\r\n type: 'Text',\r\n timestamp: new Date(),\r\n content: {\r\n $type: 'Humany.Matching.Bots.Conversations.Content.Text, Humany.Matching',\r\n html: `${phrase}`,\r\n },\r\n actions: {},\r\n tags: {},\r\n };\r\n\r\n const message = {\r\n id,\r\n message: ['html', { body: `<p>${phrase}</p>` }],\r\n entry,\r\n isUser: true,\r\n conversationEntry: {},\r\n };\r\n\r\n StoreHelper.insertMessageToStore(message);\r\n\r\n return this.postAndHandleTheData(envelope);\r\n }\r\n\r\n private postAndHandleTheData(envelope: ClientEnvelope, action?: string) {\r\n return fetch(this.apiEndpoint, this.getHttpOptions(envelope))\r\n .then((response) => {\r\n if (response.ok) return response.json();\r\n throw response;\r\n })\r\n .then((data) => {\r\n this.handleResponseData(data, action);\r\n })\r\n .catch((err) => console.log(err));\r\n }\r\n\r\n private postAndHandleTheUpdateData(envelope: ClientEnvelope, action?: string): Promise<any> {\r\n return fetch(this.apiEndpoint, this.getHttpOptions(envelope))\r\n .then((response) => {\r\n if (response.ok) return response.json();\r\n throw response;\r\n })\r\n .then((data) => {\r\n this.handleUpdateResponseData(data, action);\r\n })\r\n .catch((err) => console.log(err));\r\n }\r\n\r\n private getHttpOptions(envelope: ClientEnvelope) {\r\n return Object.assign({}, HttpHelper.fetchOptions, {\r\n body: JSON.stringify(envelope),\r\n credentials: <RequestCredentials>this.options.credentials,\r\n });\r\n }\r\n\r\n private constructInputEnvelope(action: string): ClientEnvelope {\r\n return {\r\n action: StoreHelper.getAction(action),\r\n localState: StoreHelper.getLocalState(action),\r\n globalState: StoreHelper.getGlobalState(),\r\n clientId: this.clientId,\r\n };\r\n }\r\n\r\n private constructCategoriesEnvelope(): ClientEnvelope {\r\n return {\r\n action: {\r\n content: {\r\n $type: 'Humany.Matching.Bots.Conversations.Actions.BrowseCategories, Humany.Matching',\r\n },\r\n key: 'browseCategories',\r\n },\r\n globalState: StoreHelper.getGlobalState(),\r\n clientId: this.clientId,\r\n };\r\n }\r\n\r\n private constructPhraseEnvelope(phrase: string): ClientEnvelope {\r\n return {\r\n command: { phrase: phrase },\r\n globalState: StoreHelper.getGlobalState(),\r\n clientId: this.clientId,\r\n };\r\n }\r\n\r\n private constructFirstHitEnvelope(): ClientEnvelope {\r\n return {\r\n command: { site: this.endpointUrl },\r\n clientId: this.clientId,\r\n globalState: {},\r\n };\r\n }\r\n\r\n private handleResponseData(envelope: ServerEnvelope, action?: string) {\r\n StoreHelper.setGlobalState(envelope.globalState);\r\n return this.middlewareClient.handleEntries(envelope.entries, action);\r\n }\r\n\r\n private handleUpdateResponseData(envelope: ServerEnvelope, action?: string) {\r\n return this.middlewareClient.handleUpdate(envelope.entries, action);\r\n }\r\n}\r\n","import { ContactMethodPlatform } from '@telia-ace/knowledge-widget-adapters';\r\nimport { DataClient } from '@telia-ace/knowledge-widget-types-grid';\r\nimport {\r\n ConversationPlatform,\r\n registerCustomMessageComponent,\r\n} from '@telia-ace/widget-conversation';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { v4 } from 'uuid';\r\nimport ChatClient from './client/chat.client';\r\nimport { ContactMethodClient } from './client/contact-method.client';\r\nimport { HttpClient } from './client/http.client';\r\nimport MiddlewareClient from './client/middleware.client';\r\nimport { getContactMethodEntry } from './utils';\r\n\r\nconst getKnowledgeBotEndpoint = (\r\n container: Container,\r\n component: any /*: ComponentNodeController */\r\n // ComponentNodeController type differs from component passed into registerProvider\r\n) => {\r\n const { knowledgeBotEndpoint } = component.properties();\r\n\r\n if (knowledgeBotEndpoint) {\r\n return `${knowledgeBotEndpoint}/conversations`;\r\n }\r\n\r\n const { data } = container.get('$settings');\r\n\r\n if (!data || !data.projection) throw new Error('Missing Knowledge Bot endpoint');\r\n\r\n return `${data.projection}/conversations`;\r\n};\r\n\r\nconst KnowledgeBotProviderPlugin = async (container: Container) => {\r\n const dataClient = await DataClient.getInstance(container);\r\n const platform = await ConversationPlatform.getInstance(container);\r\n const contactMethodPlatform = await ContactMethodPlatform.getInstance(container);\r\n registerCustomMessageComponent(\r\n container,\r\n 'ace-knowledge-contact-method',\r\n import('./contract/custom-component/contact-method')\r\n );\r\n\r\n platform.registerProvider('chat.bot', (conversation, component) => {\r\n const endpoint = getKnowledgeBotEndpoint(container, component);\r\n\r\n const clientId = v4();\r\n\r\n const agent = conversation.createAgent({\r\n name: '',\r\n avatar: undefined,\r\n });\r\n\r\n // passes the user and the agent to the Chat Helper\r\n ChatClient.initialize(conversation.user, agent);\r\n\r\n // passes the conversation provider to the Contact Method Client\r\n ContactMethodClient.initialize(container, dataClient, contactMethodPlatform, agent);\r\n\r\n // passes the container and the widget to the Middleware Store\r\n MiddlewareClient.initialize(container, container.get('$widget'));\r\n\r\n // executes to decide on what to do on first load\r\n const httpClient = new HttpClient(endpoint, clientId, container);\r\n\r\n const firstLoader = conversation.loading();\r\n httpClient.firstHit().then(firstLoader);\r\n\r\n component.actions.create(\r\n 'expand',\r\n (input: { entryId: string; contactMethodId: string }) => {\r\n const cmClient = new ContactMethodClient(container);\r\n cmClient.expandContactMethod(input);\r\n }\r\n );\r\n\r\n component.actions.create('evaluate', (input) => {\r\n const cmClient = new ContactMethodClient(container);\r\n cmClient.handleNewForm(input.form, input.form.id);\r\n });\r\n component.actions.create('validate', (input) => {\r\n const cmClient = new ContactMethodClient(container);\r\n cmClient.validate(input.form);\r\n });\r\n component.actions.create('submit', (input) => {\r\n if (input?.form?.schema.id) {\r\n const contactMethodEntry = getContactMethodEntry(input.form.schema.id);\r\n }\r\n const cmClient = new ContactMethodClient(container);\r\n cmClient.validate(input.form);\r\n });\r\n\r\n component.actions.watch('conversation.user-typing', (input, next) => {\r\n return next(input);\r\n });\r\n\r\n component.actions.watch('conversation.user-submit', (input, next) => {\r\n const httpClient = new HttpClient(endpoint, clientId, container);\r\n const loader = conversation.loading();\r\n httpClient.handlePhrase(input.text).then(loader);\r\n return next(input);\r\n });\r\n\r\n component.actions.watch('conversation.form', (input, next) => {\r\n return next(input);\r\n });\r\n\r\n component.actions.watch('conversation.action', (input, next) => {\r\n const chatClient = new ChatClient(container);\r\n const cmClient = new ContactMethodClient(container);\r\n // if (input === 'contact' || input.split('/').length > 1) {\r\n // cmClient.handleContactMethod(input);\r\n // return next(input);\r\n // }\r\n const loader = conversation.loading();\r\n\r\n if (input.split('/').length > 1) {\r\n cmClient.handleContactMethod(input).then(loader);\r\n return next(input);\r\n }\r\n\r\n const httpClient = new HttpClient(endpoint, clientId, container);\r\n\r\n if (input == 'burger-clicked') {\r\n httpClient.handleCategories().then(loader);\r\n return next(input);\r\n }\r\n\r\n const middlewareClient = new MiddlewareClient(container);\r\n // this is an update check, as it requires\r\n // a lot different logic and no user message\r\n if (middlewareClient.checkForUpdate(input)) {\r\n httpClient.handleUpdate(input).then(loader);\r\n\r\n return next(input);\r\n }\r\n\r\n chatClient.printUserMessageAndStoreIt(input);\r\n\r\n httpClient.handleInput(input).then(loader);\r\n\r\n return next(input);\r\n });\r\n });\r\n};\r\n\r\nexport default KnowledgeBotProviderPlugin;\r\n"],"names":["uuidv4","newGuid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/contract/enum/server-entry-type.enum.ts","../src/helper/chat.helper.ts","../src/helper/middleware.helper.ts","../src/helper/store.helper.ts","../src/client/contact-method.client.ts","../src/utils.ts","../src/interface/entry.interface.ts","../src/client/chat.client.ts","../src/helper/http.helper.ts","../src/interface/middleware/paging.interface.ts","../src/interface/middleware/processor.interface.ts","../src/client/middleware.client.ts","../src/client/http.client.ts","../src/plugin.ts"],"sourcesContent":["export enum ServerEntryTypeEnum {\n Widget,\n Text,\n Contact,\n List,\n Error,\n}\n","export class ChatHelper {\n private static user: any;\n private static agent: any;\n\n static setUser(user: any) {\n this.user = user;\n }\n\n static setAgent(agent: any) {\n this.agent = agent;\n }\n \n static getUser(): any {\n return this.user;\n }\n \n static getAgent(): any {\n return this.agent;\n }\n}\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Message } from '../contract/model/conversation-api-model/message.model';\n\nexport class MiddlewareHelper {\n private static sessionMessageStorageVariable: string = 'conversation-plugin-messages';\n private static container: any;\n private static widget: any;\n\n static setContainer(container: any) {\n MiddlewareHelper.container = container;\n }\n\n static setWidget(widget: any) {\n this.widget = widget;\n }\n\n static getContainer(): any {\n return this.container;\n }\n\n static getWidget(): any {\n return this.widget;\n }\n\n static setEntrySessionStorage = async (messages: Message[]) => {\n return createStorageWriter(\n MiddlewareHelper.container,\n MiddlewareHelper.sessionMessageStorageVariable,\n StorageCategory.Necessary\n ).then((write) => {\n return write(messages);\n });\n };\n\n static getEntrySessionStorage(): Promise<any> {\n return readStorage(this.container, this.sessionMessageStorageVariable);\n }\n}\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Message } from '../contract/model/conversation-api-model/message.model';\nimport { ClientAction } from '../contract/model/http/client-action.model';\nimport { GlobalState } from '../contract/model/http/global-state.model';\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\nimport { LooseObject } from '../contract/model/shared/loose-object.model';\nimport { MiddlewareHelper } from './middleware.helper';\n\nconst botProviderGlobalStateSessionKey = 'bot-provider-global-state';\n\nexport class StoreHelper {\n private static messageStore: Message[] = [];\n private static globalState: GlobalState;\n\n constructor() {\n StoreHelper.globalState = {\n completedInteractionsCount: 0,\n lastBotGuide: 0,\n site: '',\n invincibleParameters: {},\n };\n }\n\n static async insertOrUpdateMessageArrayStore(messageArray: Message[], entry?: any) {\n for (const message of messageArray.filter((o) => !!o)) {\n if (!this.messageStore.find((o) => o.id == message.id)) {\n this.insertMessageToStore(message);\n } else {\n this.updateMessageInStore(message, entry);\n }\n }\n\n await MiddlewareHelper.setEntrySessionStorage(this.messageStore);\n }\n\n static insertMessageToStore(message: Message) {\n this.messageStore.push(message);\n }\n\n private static updateMessageInStore(message: Message, entry?: any) {\n message.conversationEntry = entry;\n let index = this.messageStore.findIndex((o) => o.id == message.id);\n this.messageStore[index] = message;\n }\n\n static checkIdInMessageStore(id: string): boolean {\n return this.messageStore.find((o) => o.id == id) === undefined;\n }\n\n static getLocalState(action: string): LooseObject | undefined {\n const entry: ServerEntry | undefined = this.getEntry(action);\n return entry?.localState;\n }\n\n static getGlobalState(): GlobalState {\n return StoreHelper.globalState;\n }\n\n static setGlobalState(state: GlobalState) {\n StoreHelper.globalState = state;\n\n return createStorageWriter(\n MiddlewareHelper.getContainer(),\n botProviderGlobalStateSessionKey,\n StorageCategory.Necessary\n ).then((write) => {\n return write(state);\n });\n }\n\n static getAction(action: string): ClientAction {\n const entry: ServerEntry | undefined = this.getEntry(action);\n\n return {\n key: action,\n content: entry?.actions[action],\n };\n }\n\n static getCommand(text: string): LooseObject {\n return { phrase: text };\n }\n\n static getEntry(action: string): ServerEntry | undefined {\n let entry: ServerEntry | undefined = undefined;\n this.getEntryStore().forEach((o) => {\n if (o.actions[action]) {\n entry = o;\n }\n });\n return entry;\n }\n\n static getMessage(id: string): Message | undefined {\n return this.messageStore.find((o) => o.id == id);\n }\n\n static getEntryStore(): ServerEntry[] {\n return this.messageStore\n .filter((o) => !!o.entry)\n .map((o) => {\n return o.entry;\n });\n }\n\n static async rehydrateState() {\n const state: GlobalState | undefined = await readStorage(\n MiddlewareHelper.getContainer(),\n botProviderGlobalStateSessionKey\n );\n if (state) {\n this.setGlobalState(state);\n }\n }\n}\n","import { ContactMethodPlatform } from '@telia-ace/knowledge-widget-adapters';\nimport { DataClient, DataType } from '@telia-ace/knowledge-widget-types-grid';\nimport { FormBuilder, submitButton } from '@telia-ace/widget-forms';\nimport { Container } from '@webprovisions/platform';\nimport { v4 as uuidv4 } from 'uuid';\nimport { StoreHelper } from '../helper/store.helper';\nimport ChatClient from './chat.client';\n\nexport class ContactMethodClient {\n private static dataClient: DataClient;\n private static contactMethodPlatform: ContactMethodPlatform;\n private static contactMessageEntryArray: any[] = [];\n private static agent: any;\n private chatClient: ChatClient;\n private static container: any;\n\n constructor(container: Container) {\n this.chatClient = new ChatClient(container);\n }\n\n static initialize(\n container: any,\n dataClient: DataClient,\n contactMethodPlatform: ContactMethodPlatform,\n agent: any\n ) {\n this.dataClient = dataClient;\n this.contactMethodPlatform = contactMethodPlatform;\n this.agent = agent;\n this.container = container;\n }\n\n // function for handling forms as contact methods\n handleNewForm = async (errors: any, entry: any) => {\n this.updateForm(entry.contactMethods, {\n submit: 'Submit',\n errors: errors,\n });\n entry.entry.update({\n contactMethods: entry.contactMethods,\n type: 'ace-knowledge-contact-method',\n noPadding: true,\n });\n };\n\n // function for receiving the contact method based on the input\n handleContactMethod = async (input: string = '') => {\n if (input == 'contact') {\n await this.handleContactCategoryList(input);\n } else {\n let contactMethods = await this.loadContactMethods(\n input.split('/')[1], // type\n input.split('/')[0] // id\n );\n\n if (!!contactMethods.body?.form) {\n this.handleForm(input, contactMethods);\n } else if (!contactMethods.expanded && contactMethods.inline) {\n this.handleSingleContactMethod(contactMethods);\n } else if (!!contactMethods.contactMethods) {\n this.handleContactMethodList(input, contactMethods);\n }\n }\n };\n\n // validation of the form provided\n validate(form: any) {\n let entry = ContactMethodClient.contactMessageEntryArray.find(\n (o) => o.id == form.schema.id\n );\n ContactMethodClient.contactMethodPlatform.validate(entry.contactMethods).then((result) => {\n this.handleNewForm(result.errors, entry);\n if (result.valid) {\n this.submit(entry);\n this.removeForm(entry);\n }\n });\n }\n\n private handleContactCategoryList = async (input: string) => {\n let newGuid = uuidv4();\n let type = DataType.ContactMethodCategories;\n let contactMethods = await this.loadContactMethods(type);\n this.chatClient.printUserMessageAndStoreIt(input);\n this.printMessage(newGuid, contactMethods);\n };\n\n private handleForm(input: string, contactMethods: any) {\n let title = input.split('/')[2];\n contactMethods.expanded = true;\n this.updateForm(contactMethods, {\n submit: 'Submit',\n errors: undefined,\n });\n this.printMessage(contactMethods.id, contactMethods, title);\n }\n\n addContactMethod(contactMethod: any) {\n contactMethod.expanded = true;\n this.updateForm(contactMethod, {\n submit: 'Submit',\n errors: undefined,\n });\n return this.printMessage(contactMethod.id, contactMethod);\n }\n\n expandContactMethod(input: { entryId: string; contactMethodId: string }) {\n const message = StoreHelper.getMessage(input.entryId);\n\n if (message?.conversationEntry && Array.isArray(message.message)) {\n const messageItemIndex = message.message.findIndex(\n ([listType]: any[]) => listType === 'ace-knowledge-contact-method'\n );\n if (messageItemIndex > -1) {\n const [messageItemType, messageItemContent] = message.message[messageItemIndex];\n const updatedMessageItemContent = {\n ...messageItemContent,\n contactMethods: messageItemContent.contactMethods.map((cm: any) => {\n cm.expanded = true;\n return cm;\n }),\n };\n const updatedMessageItems = [\n ...message.message.slice(0, messageItemIndex),\n [messageItemType, updatedMessageItemContent],\n ...message.message.slice(messageItemIndex + 1),\n ];\n\n message.conversationEntry.writer({ items: updatedMessageItems });\n }\n }\n }\n\n private handleContactMethodList(input: string, contactMethods: any) {\n let title = input.split('/')[2];\n let newGuid = uuidv4();\n this.printMessage(newGuid, contactMethods, title);\n }\n\n private handleSingleContactMethod(contactMethods: any) {\n let entry = ContactMethodClient.contactMessageEntryArray.find((o) =>\n o.contactMethods.contactMethods.find((t: any) => t.id == contactMethods.id)\n );\n let curCM = entry.contactMethods.contactMethods.find((t: any) => t.id == contactMethods.id);\n curCM.expanded = true;\n let message = {\n contactMethods: entry.contactMethods,\n type: 'ace-knowledge-contact-method',\n noPadding: true,\n };\n StoreHelper.insertOrUpdateMessageArrayStore([\n {\n id: entry.id,\n message: message,\n isUser: false,\n },\n ]);\n entry.entry.update(message);\n }\n\n private submit(entry: any) {\n ContactMethodClient.contactMethodPlatform.submit(entry.contactMethods).then((result) => {\n if (!!result) ContactMethodClient.agent.print(result);\n });\n }\n\n private removeForm(entry: any) {\n entry.entry.remove();\n ContactMethodClient.contactMessageEntryArray.splice(\n ContactMethodClient.contactMessageEntryArray.indexOf(entry),\n 1\n );\n }\n\n private printMessage(\n newGuid: string,\n contactMethods: any,\n title: string | undefined = undefined\n ) {\n if (ContactMethodClient.contactMessageEntryArray.find((o) => o.id == contactMethods.id)) {\n let entry = ContactMethodClient.contactMessageEntryArray.find(\n (o) => o.id == contactMethods.id\n );\n let message = {\n contactMethods: contactMethods,\n type: 'ace-knowledge-contact-method',\n noPadding: true,\n };\n entry.entry.update(message);\n StoreHelper.insertOrUpdateMessageArrayStore([\n {\n id: entry.guid,\n message: message,\n isUser: false,\n },\n ]);\n return message;\n } else {\n if (title) this.chatClient.printUserMessageAndStoreIt(title);\n let message = {\n contactMethods: contactMethods,\n type: 'ace-knowledge-contact-method',\n noPadding: true,\n };\n let entry = ContactMethodClient.agent.print(message);\n StoreHelper.insertOrUpdateMessageArrayStore([\n {\n id: newGuid,\n message: message,\n isUser: false,\n },\n ]);\n ContactMethodClient.contactMessageEntryArray.push({\n id: newGuid,\n contactMethods: contactMethods,\n entry: entry,\n });\n return message;\n }\n }\n\n private loadContactMethods(dataType: string, id: string | undefined = undefined): Promise<any> {\n switch (dataType) {\n case DataType.ContactMethodCategories: {\n return ContactMethodClient.container\n .getAsync('matchingClient')\n .then((matchingClient: any) => {\n return matchingClient.customRequest('/contactmethods', 'GET', {});\n })\n .then((contactMethods: any) => {\n return contactMethods;\n });\n // return ContactMethodClient.dataClient\n // .fetch(DataType.ContactMethods, { contactMethodCategoryId: id })\n // .then((contactMethods) => contactMethods);\n }\n case DataType.ContactMethods: {\n if (!!id) {\n return ContactMethodClient.dataClient\n .fetch(DataType.ContactMethod, { contactMethodId: id })\n .then((contactMethods) => contactMethods);\n } else {\n return ContactMethodClient.dataClient\n .fetch(DataType.ContactMethods, {})\n .then((contactMethods) => contactMethods);\n }\n }\n case DataType.ContactMethodCategories: {\n return ContactMethodClient.dataClient\n .fetch(DataType.ContactMethods, { contactMethodCategoryId: id })\n .then((contactMethods) => contactMethods);\n }\n default: {\n return Promise.resolve(undefined);\n }\n }\n }\n\n private updateForm = (contactMethod: any, properties: any) => {\n if (contactMethod?.body?.form) {\n const { body } = contactMethod;\n const builder = new FormBuilder(body.form);\n\n if (!body.form.layout || !body.form.layout.submit) {\n builder.createComponent(submitButton(properties.submit, 'submit'));\n }\n\n if (properties.errors) {\n builder.setValidationErrors(properties.errors);\n }\n\n return {\n ...body,\n form: builder.get(),\n };\n }\n return contactMethod?.body || {};\n };\n}\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\nimport { StoreHelper } from './helper/store.helper';\n\nexport const getContactMethodEntry = (contactMethodId: string) => {\n const entries = StoreHelper.getEntryStore();\n\n return entries.find((e) => e.content.id === +contactMethodId);\n};\n\nconst convertLegacySymbol = (symbol?: { type: string; content: string }): Symbol | undefined => {\n if (symbol) {\n const { type, content } = symbol;\n if (type && content) {\n return { type, content };\n }\n }\n};\n\nexport const contactMethodFromLegacy = (\n {\n id,\n title,\n defaultIcon,\n exits: [exit],\n exitType,\n confirmationText,\n expandFormAutomatically,\n form,\n description,\n }: any,\n validation?: any\n): any => {\n const { adapter } = exit || { Adapter: {} };\n const { clientName = '', settings: adapterSettings = {}, customClientName = '' } = adapter;\n\n const settings: any = {\n id: id.toString(),\n title: title,\n description: description,\n symbol: convertLegacySymbol(defaultIcon),\n clientName: clientName === 'custom.adapter' ? customClientName : clientName,\n expanded: true,\n inline: true,\n body: {},\n };\n\n if (clientName.indexOf('phone') > -1 || clientName.indexOf('freetext') > -1) {\n const { displayTextBeforeClick, textBeforeClick } = adapterSettings;\n if (displayTextBeforeClick === 'true') {\n settings.expanded = false;\n settings.title = textBeforeClick;\n }\n\n if (clientName.indexOf('phone.text') > -1) {\n settings.body.phoneNumber = adapterSettings.phoneNumber;\n } else {\n settings.body.freetext = adapterSettings.freetext;\n }\n }\n\n if (\n clientName.indexOf('chat.popup') > -1 ||\n clientName.indexOf('link') > -1 ||\n (clientName === 'custom.adapter' && exitType === 'custom')\n ) {\n settings.body = adapterSettings;\n settings.body.confirmationFallback = confirmationText;\n }\n\n if (clientName.indexOf('ace') > -1) {\n settings.body = adapterSettings;\n }\n\n if (form && form.hasValueComponents) {\n if (validation) {\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form, validation).get();\n } else {\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form).get();\n }\n if (!expandFormAutomatically) {\n settings.expanded = settings.inline = false;\n }\n }\n\n return settings;\n};\n","import { DataClient, DataType } from '@telia-ace/knowledge-widget-types-grid';\nimport { Symbol } from '@telia-ace/knowledge-widget-ui';\nimport {\n ConversationMessageListItemType,\n ConverstationMessageItem,\n} from '@telia-ace/widget-conversation';\nimport { Container } from '@webprovisions/platform';\nimport { ContactMethodClient } from '../client/contact-method.client';\nimport { ServerEntryTypeEnum } from '../contract/enum/server-entry-type.enum';\nimport { Message } from '../contract/model/conversation-api-model/message.model';\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\nimport { StoreHelper } from '../helper/store.helper';\nimport { contactMethodFromLegacy } from '../utils';\n\nexport default class EntryInterface {\n private helpActionKey = 'help';\n private nextActionKey = 'next';\n\n constructor(private container: Container) {}\n\n // transform the entry based on its type\n async transform(entry: ServerEntry, feedbackEntry?: ServerEntry): Promise<Message | undefined> {\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\n switch (entryType) {\n case ServerEntryTypeEnum.List:\n return {\n id: entry.id,\n message: this.listTransform(entry, feedbackEntry),\n entry: entry,\n isUser: false,\n };\n case ServerEntryTypeEnum.Text:\n return {\n id: entry.id,\n message: this.textTransform(entry, feedbackEntry),\n entry: entry,\n isUser: false,\n };\n case ServerEntryTypeEnum.Contact:\n return {\n id: entry.id,\n message: await this.transformContactMethod(entry),\n entry: entry,\n isUser: false,\n };\n }\n }\n\n async transformContactMethod(entry: ServerEntry): Promise<any> {\n const dataClient: DataClient = await this.container.getAsync('dataClient');\n\n const contactMethod = await dataClient.fetch(DataType.ContactMethod, {\n contactMethodId: entry.content.id,\n });\n\n const cmClient = new ContactMethodClient(this.container);\n cmClient.addContactMethod(contactMethod);\n }\n\n // transform an array of entries\n async transformArray(entryArray: ServerEntry[]): Promise<Message[]> {\n let feedbackEntry = entryArray.find((o) =>\n o.tags.find((t) => t == 'gentle' || t == 'feedback')\n );\n let returnArray: Message[] = [];\n for (const o of entryArray.filter((t) => t !== feedbackEntry)) {\n let x = await this.transform(o, feedbackEntry);\n if (!!x) returnArray.push(x);\n }\n return returnArray;\n }\n\n // gets the text that should be printed as a user message on action\n getUserMessage(action: string) {\n let entry = StoreHelper.getEntry(action);\n\n return this.getTitleFromEntry(entry, action);\n }\n\n private listTransform(entry: ServerEntry, feedbackEntry?: ServerEntry): any {\n if (entry.type === 'Contact') {\n return;\n }\n\n if (!entry.content) return;\n\n let object = this.getListActions(\n entry.content.items,\n this.getContentText(entry),\n entry.actions,\n entry.localState\n );\n\n if (!!feedbackEntry) {\n let feedbackObject = this.getListActions(\n feedbackEntry.content.items,\n this.getContentText(feedbackEntry),\n feedbackEntry.actions,\n feedbackEntry.localState\n );\n //TODO this will be remade\n StoreHelper.insertMessageToStore({\n id: feedbackEntry.id,\n message: undefined,\n entry: feedbackEntry,\n isUser: false,\n });\n\n return object.concat(feedbackObject);\n }\n\n return object;\n }\n\n private getContentText(entry: ServerEntry): object | undefined {\n if (entry.content.html) return { body: entry.content.html };\n if (entry.content.header) return { title: entry.content.header };\n }\n\n private textTransform(entry: ServerEntry, feedbackEntry?: ServerEntry): any {\n //TODO this will be remade with the embeded contact methods\n\n if (!!entry.content.items) return this.listTransform(entry, feedbackEntry);\n\n let returnObj: ConverstationMessageItem<any> = [\n ConversationMessageListItemType.HTML,\n { body: entry.content.html.replace('\\n', '') },\n ];\n\n if (!!feedbackEntry) {\n let feedbackObject = this.getListActions(\n feedbackEntry.content.items,\n this.getContentText(feedbackEntry),\n feedbackEntry.actions,\n feedbackEntry.localState\n );\n StoreHelper.insertMessageToStore({\n id: feedbackEntry.id,\n message: undefined,\n entry: feedbackEntry,\n isUser: false,\n });\n\n feedbackObject.unshift(returnObj);\n return feedbackObject;\n }\n\n return returnObj;\n }\n\n private getListActions(\n items: any[],\n text: any,\n actions: any,\n state: any\n ): ConverstationMessageItem<any>[] {\n let list: any[] = [];\n const mainListType = this.getListType(state);\n\n const createMainList = (\n type: ConversationMessageListItemType | string\n ): { [key: string]: string } | { actionKey: string; label: string; symbol?: Symbol }[] => {\n if (type === ConversationMessageListItemType.ButtonList) {\n return [];\n }\n return {};\n };\n\n let mainListContent = createMainList(mainListType);\n let mainList: any = [mainListType, { actions: mainListContent }];\n\n if (mainListType === 'ace-knowledge-contact-method') {\n mainList[1] = {\n ...mainList[1],\n contactMethods: items.map((item) => {\n const formatted = contactMethodFromLegacy(item.data);\n return formatted;\n }),\n entry: {\n entryId: state.entryId,\n },\n };\n }\n\n if (text && text.title) {\n list.push([ConversationMessageListItemType.Header, text.title]);\n }\n if (text && text.body) {\n list.push([ConversationMessageListItemType.HTML, { body: text.body }]);\n }\n list.push(mainList);\n items.forEach((o) => {\n switch (o.actionKey) {\n case this.helpActionKey: {\n list.push([ConversationMessageListItemType.Separator, undefined]);\n list.push(['no-good-alternative', { body: o.title }]);\n break;\n }\n case this.nextActionKey: {\n if (\n !!actions['next'] &&\n actions['next'].take ===\n items.filter((o) => o.actionKey !== 'help').length + 2\n ) {\n if (Array.isArray(mainListContent)) {\n mainListContent.push({\n label: o.title,\n actionKey: o.actionKey,\n });\n } else {\n mainListContent[o.actionKey] = o.title;\n }\n }\n break;\n }\n default: {\n if (Array.isArray(mainListContent)) {\n mainListContent.push({\n label: o.title,\n actionKey: o.actionKey,\n symbol: o.symbol,\n });\n } else {\n mainListContent[o.actionKey] = o.title;\n }\n }\n }\n });\n return list;\n }\n\n private getListType(state: any) {\n if (state?.$type === 'Humany.Matching.Bots.Conversations.GuideListState, Humany.Matching') {\n return ConversationMessageListItemType.LinkList;\n } else if (\n state?.$type ===\n 'Humany.Matching.Bots.Conversations.States.GuideFeedbackState, Humany.Matching'\n ) {\n return 'feedback-list';\n } else if (\n state?.$type ===\n 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\n ) {\n return 'ace-knowledge-contact-method';\n } else return ConversationMessageListItemType.ButtonList;\n }\n\n private getTitleFromEntry(entry: ServerEntry | undefined, action: string): string | undefined {\n if (!!entry) {\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\n switch (entryType) {\n case ServerEntryTypeEnum.List:\n return this.getTitleFromList(entry, action);\n case ServerEntryTypeEnum.Text:\n return this.textTransform(entry);\n }\n }\n }\n\n private getTitleFromList(entry: ServerEntry, action: string): string {\n return (<Array<any>>entry.content.items).find((o) => o.actionKey == action).title;\n }\n}\n","import { Container } from '@webprovisions/platform';\nimport { v4 as newGuid } from 'uuid';\nimport { ServerEntryTypeEnum } from '../contract/enum/server-entry-type.enum';\nimport { Message } from '../contract/model/conversation-api-model/message.model';\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\nimport { ChatHelper } from '../helper/chat.helper';\nimport { StoreHelper } from '../helper/store.helper';\nimport EntryInterface from '../interface/entry.interface';\n\nexport default class ChatClient {\n entryInterface: EntryInterface;\n constructor(container: Container) {\n this.entryInterface = new EntryInterface(container);\n }\n\n // Initialize from setting the user and agent for the Helper\n static initialize(user: any, agent: any) {\n ChatHelper.setUser(user);\n ChatHelper.setAgent(agent);\n }\n\n // function for posting the messages\n async processMessageArrayAndStoreIt(messages: Message[]) {\n for (const message of messages.filter((o) => o && o != null && !!o.message)) {\n if (message.isUser) this.postUserMessage(message);\n else this.postAgentMessage(message);\n }\n\n await StoreHelper.insertOrUpdateMessageArrayStore(messages);\n }\n\n // function for updating current messages\n updateMessageArrayAndStoreIt(messages: Message[]) {\n let conversationEntry = undefined;\n messages.forEach((o) => {\n let message = StoreHelper.getMessage(o.id);\n message?.conversationEntry.update(o.message);\n conversationEntry = message?.conversationEntry;\n });\n\n StoreHelper.insertOrUpdateMessageArrayStore(messages, conversationEntry);\n }\n\n // function for posting a message for the user actions, such as button clicks\n printUserMessageAndStoreIt(action: string) {\n if (action == 'next' || action == 'help') return;\n\n let entry = StoreHelper.getEntry(action);\n\n let message = {\n id: newGuid(),\n message: !entry ? action : this.getTitleFromEntry(entry, action),\n isUser: true,\n };\n\n this.postUserMessage(message);\n StoreHelper.insertOrUpdateMessageArrayStore([message]);\n }\n\n private postUserMessage(message: Message) {\n ChatHelper.getUser().print(message.message);\n }\n\n private postAgentMessage(message: Message) {\n message.conversationEntry = ChatHelper.getAgent().print(message.message);\n }\n\n private getTitleFromEntry(entry: ServerEntry, action: string): string {\n const entryType = (<any>ServerEntryTypeEnum)[entry.type];\n switch (entryType) {\n case ServerEntryTypeEnum.List:\n return this.getTitleFromList(entry, action);\n case ServerEntryTypeEnum.Text:\n return this.getTitleFromText(entry, action);\n default:\n return '';\n }\n }\n\n private getTitleFromText(entry: ServerEntry, action: string): any {\n if (!!entry.content.items) return this.getTitleFromList(entry, action);\n else return entry.content.html;\n }\n\n private getTitleFromList(entry: ServerEntry, action: string): string {\n return (<Array<any>>entry.content.items).find((o) => o.actionKey == action).title;\n }\n}\n","export class HttpHelper {\n static fetchOptions = {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n };\n\n static combineUrl(basePath: string, path: string) {\n return basePath + path;\n }\n\n static managedSubdomainSuffixes = ['stage', 'alpha', 'beta', 'gamma'];\n\n static parseSubdomain = (input: string) => {\n const index = input.lastIndexOf('-');\n const lastPart = input.substr(index + 1);\n if (HttpHelper.managedSubdomainSuffixes.indexOf(lastPart) > -1) {\n return input.substr(0, index);\n }\n return input;\n };\n\n static getCredentials(): string | undefined {\n return 'same-origin';\n }\n}\n","import { ServerEntry } from \"../../contract/model/http/server-entry.model\";\nimport { StoreHelper } from \"../../helper/store.helper\";\n\nexport default class PagingInterface {\n process(entries: ServerEntry[]): ServerEntry[] {\n const pagingEntry = entries.find((e) => e.tags.indexOf(\"paging\") > -1);\n\n if (pagingEntry) {\n const stream = StoreHelper.getEntryStore().filter(\n (e) => e.tags.indexOf(\"paging\") > -1 && e.id === pagingEntry.id\n );\n\n if (stream.length > 0) {\n // Get the paging entry with the highest take count\n const last = stream.reduce((acc, entry) => {\n if (\n entry.actions.next &&\n entry.actions.next.take >= acc.actions.next.take\n ) {\n return entry;\n }\n return acc;\n }, stream[0]); // tslint:disable-line:align\n\n // If there is a paging entry with higher take count than the entry to be written,\n // it should be updated to use the paging data from the highest take count entry\n if (last.actions.next.take > pagingEntry.actions.next.take) {\n entries.forEach((entry) => {\n if (entry.id === pagingEntry.id) {\n entry.actions.next = {\n ...entry.actions.next,\n take: last.actions.next.take,\n skip: last.actions.next.skip,\n };\n }\n });\n }\n }\n\n // if items is null or undefined it should\n // overwrite with an empty array\n entries.forEach((entry) => {\n if (\n entry.id === pagingEntry.id &&\n entry.content &&\n entry.content.timestamp\n ) {\n entry.content = {\n ...entry.content,\n items: (entry.content && entry.content.items) || [],\n };\n }\n });\n }\n\n return entries;\n }\n}\n","import { Action } from '../../contract/model/http/action.model';\nimport { ServerEntry } from '../../contract/model/http/server-entry.model';\n\nexport default class ProcessorInterface {\n process(entries: ServerEntry[]): ServerEntry[] {\n let processedEntries = entries;\n\n processedEntries = this.deletePaging(processedEntries);\n processedEntries = this.delete(processedEntries);\n processedEntries = this.merge(processedEntries);\n processedEntries = this.moveLoader(processedEntries);\n\n return processedEntries;\n }\n\n processUpdate(entry: ServerEntry | undefined, updateEntryArray: ServerEntry[]): ServerEntry[] {\n updateEntryArray\n .filter((t) => t.type == 'List')\n .forEach((o) => {\n o.content?.items.forEach((t: any) => {\n if (!entry?.content.items.find((p: any) => p.actionKey == t.actionKey))\n entry?.content.items.push(t);\n });\n Object.keys(o.actions).forEach((t) => {\n this.handleActionUpdateOrInsert(entry?.actions, t, o.actions);\n });\n });\n\n //moves the show more and if it helped to the end if it is needed\n var itemArray: any[] = entry?.content.items;\n\n if (itemArray.find((o) => o.actionKey == 'next')) {\n itemArray.push(\n itemArray.splice(\n itemArray.indexOf(itemArray.find((o) => o.actionKey == 'next')),\n 1\n )[0]\n );\n }\n\n if (itemArray.find((o) => o.actionKey == 'help')) {\n itemArray.push(\n itemArray.splice(\n itemArray.indexOf(itemArray.find((o) => o.actionKey == 'help')),\n 1\n )[0]\n );\n }\n\n return entry ? [entry] : [];\n }\n\n private handleActionUpdateOrInsert(\n currentArray: Action | undefined,\n actionKey: string,\n action: Action\n ) {\n if (!!currentArray) currentArray[actionKey] = action[actionKey];\n }\n\n private deletePaging(entries: ServerEntry[]): ServerEntry[] {\n return entries.filter((entry) => {\n const isEmptyPaging =\n entry.type === 'List' &&\n entry.tags &&\n entry.tags.indexOf('paging') > -1 &&\n typeof entry.content === 'undefined';\n return !isEmptyPaging;\n });\n }\n\n private delete(entries: ServerEntry[]): ServerEntry[] {\n return entries.filter((entry) => entry.content !== null);\n }\n\n private merge(entries: ServerEntry[]): ServerEntry[] {\n const output: ServerEntry[] = [];\n\n const merge = (source: any, target: any = {}): any => {\n const content: any = {};\n if (source == null) {\n return null;\n }\n\n if (target) {\n Object.keys(target).forEach((key) => {\n content[key] = target[key];\n });\n }\n\n Object.keys(source).forEach((key) => {\n if (key == 'items') {\n if (!content[key]) content[key] = [];\n content[key] = content[key].concat(source[key]);\n } else if (key == 'html') content[key] = content[key] + source[key];\n else content[key] = source[key];\n });\n\n return content;\n };\n\n const mergeLocalState = (source: any, target: any): any => {\n if (source == null) return null;\n\n if (Object.keys(source.actions).length === 0) return target.localState;\n\n if (Object.keys(target.actions).length === 0) return source.localState;\n\n return target.localState;\n };\n\n entries.forEach((entry) => {\n if (entry.relation && !entry.tags.find((o) => o == 'gentle' || o == 'feedback')) {\n let existingEntry = entries.find((o) => o.id == entry.relation);\n\n if (existingEntry) {\n const existingIndex = output.indexOf(existingEntry);\n existingEntry.localState = mergeLocalState(entry, existingEntry);\n existingEntry.content = merge(entry.content, existingEntry.content);\n existingEntry.actions = merge(entry.actions, existingEntry.actions);\n output[existingIndex] = existingEntry;\n }\n } else {\n output.push(entry);\n }\n });\n\n return output;\n }\n\n private moveLoader(entries: ServerEntry[]): ServerEntry[] {\n // Moves the loader component to last position in stream\n const loaderEntry = entries.find((e) => e.id === 'loader');\n\n if (!loaderEntry) {\n return entries;\n }\n\n const loaderIndex = entries.indexOf(loaderEntry);\n if (loaderIndex > -1) {\n entries.splice(entries.length - 1, 0, entries.splice(loaderIndex, 1)[0]);\n }\n return entries;\n }\n}\n","import { createStorageWriter, StorageCategory } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { ServerEntry } from '../contract/model/http/server-entry.model';\nimport { ChatHelper } from '../helper/chat.helper';\nimport { MiddlewareHelper } from '../helper/middleware.helper';\nimport { StoreHelper } from '../helper/store.helper';\nimport EntryInterface from '../interface/entry.interface';\nimport PagingInterface from '../interface/middleware/paging.interface';\nimport ProcessorInterface from '../interface/middleware/processor.interface';\nimport ChatClient from './chat.client';\n\nexport default class MiddlewareClient {\n private paging: PagingInterface;\n private processor: ProcessorInterface;\n private entryInterface: EntryInterface;\n private chatClient: ChatClient;\n\n constructor(container: Container) {\n this.paging = new PagingInterface();\n this.processor = new ProcessorInterface();\n this.entryInterface = new EntryInterface(container);\n this.chatClient = new ChatClient(container);\n }\n\n static initialize(container: any, widget: any) {\n MiddlewareHelper.setContainer(container);\n MiddlewareHelper.setWidget(widget);\n }\n\n // called on all standard scenarios like actions and user messages\n async handleEntries(entries: ServerEntry[], action?: string) {\n const widgetEntry = (entries || []).find((e) => e.type === 'Widget');\n\n if (widgetEntry) {\n const agent = ChatHelper.getAgent();\n\n if (agent) {\n agent.update({\n name: widgetEntry.content.agent.name,\n avatar: widgetEntry.content.agent.avatar,\n });\n\n const write = await createStorageWriter(\n MiddlewareHelper.getContainer(),\n 'bot-provider-conversation-meta',\n StorageCategory.Necessary\n );\n write({\n agent: {\n name: widgetEntry.content.agent.name,\n avatar: widgetEntry.content.agent.avatar,\n },\n });\n }\n }\n\n let o = this.executeMiddlewares(entries, false, action);\n let messageArray = await this.entryInterface.transformArray(o);\n this.chatClient.processMessageArrayAndStoreIt(messageArray);\n }\n\n // called on situations such as paging changes\n // when no new entries will be printed\n async handleUpdate(entries: ServerEntry[], action?: string) {\n let o = this.executeMiddlewares(entries, true, action);\n let messageArray = await this.entryInterface.transformArray(o);\n this.chatClient.updateMessageArrayAndStoreIt(messageArray);\n }\n\n // checks whether the action was of an update type\n checkForUpdate(input: string) {\n return input === 'next';\n }\n\n private executeMiddlewares(\n entries: ServerEntry[],\n isUpdate: boolean,\n action?: string\n ): ServerEntry[] {\n if (isUpdate && action)\n entries = this.processor.processUpdate(StoreHelper.getEntry(action), entries);\n else {\n entries = this.processor.process(entries);\n }\n entries = this.paging.process(entries);\n\n return entries;\n }\n}\n","import { readStorage } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { v4 as newGuid } from 'uuid';\nimport { Message } from '../contract/model/conversation-api-model/message.model';\nimport { ClientEnvelope } from '../contract/model/http/client-envelope.model';\nimport { HttpClientOptions } from '../contract/model/http/http-client-options.model';\nimport { ServerEnvelope } from '../contract/model/http/server-envelope.model';\nimport { ChatHelper } from '../helper/chat.helper';\nimport { HttpHelper } from '../helper/http.helper';\nimport { MiddlewareHelper } from '../helper/middleware.helper';\nimport { StoreHelper } from '../helper/store.helper';\nimport ChatClient from './chat.client';\nimport MiddlewareClient from './middleware.client';\n\nexport class HttpClient {\n private endpointUrl: string;\n private clientId: string | undefined;\n private projectionPath: string;\n private apiEndpoint: string;\n private options: HttpClientOptions;\n private middlewareClient: MiddlewareClient;\n private chatClient: ChatClient;\n private container: Container;\n\n constructor(endpoint: string, clientId: string, container: Container) {\n this.options = {\n credentials: HttpHelper.getCredentials(),\n clientId: clientId,\n };\n this.apiEndpoint = endpoint;\n this.projectionPath = window.location.href;\n this.endpointUrl = HttpHelper.combineUrl(this.projectionPath, 'conversations');\n this.clientId = this.options.clientId;\n this.middlewareClient = new MiddlewareClient(container);\n this.chatClient = new ChatClient(container);\n this.container = container;\n }\n\n async firstHit() {\n // On first hit if there are entries stored in the storage, use them\n // Otherwise start a new session\n const entries = (await MiddlewareHelper.getEntrySessionStorage()) as Message[];\n\n if (entries && entries.length > 0) {\n await StoreHelper.rehydrateState();\n\n const meta: any = await readStorage(this.container, 'bot-provider-conversation-meta');\n\n if (meta?.agent) {\n const agent = ChatHelper.getAgent();\n agent.update({\n name: meta.agent.name,\n avatar: meta.agent.avatar,\n });\n }\n\n await this.chatClient.processMessageArrayAndStoreIt(entries);\n } else {\n let envelope = this.constructFirstHitEnvelope();\n await this.postAndHandleTheData(envelope);\n }\n }\n\n // for updates, such as paging changes\n handleUpdate(action: string) {\n let envelope = this.constructInputEnvelope(action);\n return this.postAndHandleTheUpdateData(envelope, action);\n }\n\n // for action clicks\n handleInput(action: string) {\n let envelope = this.constructInputEnvelope(action);\n return this.postAndHandleTheData(envelope, action);\n }\n\n // for category burger\n handleCategories() {\n let envelope = this.constructCategoriesEnvelope();\n return this.postAndHandleTheData(envelope);\n }\n\n // for text entries by user\n handlePhrase(phrase: string) {\n const envelope = this.constructPhraseEnvelope(phrase);\n\n const id = newGuid();\n const entry = {\n id,\n type: 'Text',\n timestamp: new Date(),\n content: {\n $type: 'Humany.Matching.Bots.Conversations.Content.Text, Humany.Matching',\n html: `${phrase}`,\n },\n actions: {},\n tags: {},\n };\n\n const message = {\n id,\n message: ['html', { body: `<p>${phrase}</p>` }],\n entry,\n isUser: true,\n conversationEntry: {},\n };\n\n StoreHelper.insertMessageToStore(message);\n\n return this.postAndHandleTheData(envelope);\n }\n\n private postAndHandleTheData(envelope: ClientEnvelope, action?: string) {\n return fetch(this.apiEndpoint, this.getHttpOptions(envelope))\n .then((response) => {\n if (response.ok) return response.json();\n throw response;\n })\n .then((data) => {\n this.handleResponseData(data, action);\n })\n .catch((err) => console.log(err));\n }\n\n private postAndHandleTheUpdateData(envelope: ClientEnvelope, action?: string): Promise<any> {\n return fetch(this.apiEndpoint, this.getHttpOptions(envelope))\n .then((response) => {\n if (response.ok) return response.json();\n throw response;\n })\n .then((data) => {\n this.handleUpdateResponseData(data, action);\n })\n .catch((err) => console.log(err));\n }\n\n private getHttpOptions(envelope: ClientEnvelope) {\n return Object.assign({}, HttpHelper.fetchOptions, {\n body: JSON.stringify(envelope),\n credentials: <RequestCredentials>this.options.credentials,\n });\n }\n\n private constructInputEnvelope(action: string): ClientEnvelope {\n return {\n action: StoreHelper.getAction(action),\n localState: StoreHelper.getLocalState(action),\n globalState: StoreHelper.getGlobalState(),\n clientId: this.clientId,\n };\n }\n\n private constructCategoriesEnvelope(): ClientEnvelope {\n return {\n action: {\n content: {\n $type: 'Humany.Matching.Bots.Conversations.Actions.BrowseCategories, Humany.Matching',\n },\n key: 'browseCategories',\n },\n globalState: StoreHelper.getGlobalState(),\n clientId: this.clientId,\n };\n }\n\n private constructPhraseEnvelope(phrase: string): ClientEnvelope {\n return {\n command: { phrase: phrase },\n globalState: StoreHelper.getGlobalState(),\n clientId: this.clientId,\n };\n }\n\n private constructFirstHitEnvelope(): ClientEnvelope {\n return {\n command: { site: this.endpointUrl },\n clientId: this.clientId,\n globalState: {},\n };\n }\n\n private handleResponseData(envelope: ServerEnvelope, action?: string) {\n StoreHelper.setGlobalState(envelope.globalState);\n return this.middlewareClient.handleEntries(envelope.entries, action);\n }\n\n private handleUpdateResponseData(envelope: ServerEnvelope, action?: string) {\n return this.middlewareClient.handleUpdate(envelope.entries, action);\n }\n}\n","import { ContactMethodPlatform } from '@telia-ace/knowledge-widget-adapters';\nimport { DataClient } from '@telia-ace/knowledge-widget-types-grid';\nimport { ConversationPlatform } from '@telia-ace/widget-conversation';\nimport { Container } from '@webprovisions/platform';\nimport { v4 } from 'uuid';\nimport ChatClient from './client/chat.client';\nimport { ContactMethodClient } from './client/contact-method.client';\nimport { HttpClient } from './client/http.client';\nimport MiddlewareClient from './client/middleware.client';\nimport { getContactMethodEntry } from './utils';\n\nconst getKnowledgeBotEndpoint = (\n container: Container,\n component: any /*: ComponentNodeController */\n // ComponentNodeController type differs from component passed into registerProvider\n) => {\n const { knowledgeBotEndpoint } = component.properties();\n\n if (knowledgeBotEndpoint) {\n return `${knowledgeBotEndpoint}/conversations`;\n }\n\n const { data } = container.get('$settings');\n\n if (!data || !data.projection) throw new Error('Missing Knowledge Bot endpoint');\n\n return `${data.projection}/conversations`;\n};\n\nconst KnowledgeBotProviderPlugin = async (container: Container) => {\n const dataClient = await DataClient.getInstance(container);\n const platform = await ConversationPlatform.getInstance(container);\n const contactMethodPlatform = await ContactMethodPlatform.getInstance(container);\n\n platform.registerConversationItem(\n 'ace-knowledge-contact-method',\n import('./contract/custom-component/contact-method')\n );\n\n platform.registerConversationItem('no-good-alternative', import('./ui/no-good-alternative'));\n\n platform.registerConversationItem('feedback-list', import('./ui/feedback-list'));\n\n platform.registerProvider('chat.bot', (conversation, component) => {\n const endpoint = getKnowledgeBotEndpoint(container, component);\n\n const clientId = v4();\n\n const agent = conversation.createAgent({\n name: '',\n avatar: undefined,\n });\n\n // passes the user and the agent to the Chat Helper\n ChatClient.initialize(conversation.user, agent);\n\n // passes the conversation provider to the Contact Method Client\n ContactMethodClient.initialize(container, dataClient, contactMethodPlatform, agent);\n\n // passes the container and the widget to the Middleware Store\n MiddlewareClient.initialize(container, container.get('$widget'));\n\n // executes to decide on what to do on first load\n const httpClient = new HttpClient(endpoint, clientId, container);\n\n const firstLoader = conversation.loading();\n httpClient.firstHit().then(firstLoader);\n\n component.actions.create(\n 'expand',\n (input: { entryId: string; contactMethodId: string }) => {\n const cmClient = new ContactMethodClient(container);\n cmClient.expandContactMethod(input);\n }\n );\n\n component.actions.create('evaluate', (input) => {\n const cmClient = new ContactMethodClient(container);\n cmClient.handleNewForm(input.form, input.form.id);\n });\n component.actions.create('validate', (input) => {\n const cmClient = new ContactMethodClient(container);\n cmClient.validate(input.form);\n });\n component.actions.create('submit', (input) => {\n if (input?.form?.schema.id) {\n const contactMethodEntry = getContactMethodEntry(input.form.schema.id);\n }\n const cmClient = new ContactMethodClient(container);\n cmClient.validate(input.form);\n });\n\n component.actions.watch('conversation.user-typing', (input, next) => {\n return next(input);\n });\n\n component.actions.watch('conversation.user-submit', (input, next) => {\n const httpClient = new HttpClient(endpoint, clientId, container);\n const loader = conversation.loading();\n httpClient.handlePhrase(input.text).then(loader);\n return next(input);\n });\n\n component.actions.watch('conversation.form', (input, next) => {\n return next(input);\n });\n\n component.actions.watch('conversation.action', (input, next) => {\n const chatClient = new ChatClient(container);\n const cmClient = new ContactMethodClient(container);\n // if (input === 'contact' || input.split('/').length > 1) {\n // cmClient.handleContactMethod(input);\n // return next(input);\n // }\n const loader = conversation.loading();\n\n if (input.split('/').length > 1) {\n cmClient.handleContactMethod(input).then(loader);\n return next(input);\n }\n\n const httpClient = new HttpClient(endpoint, clientId, container);\n\n if (input == 'burger-clicked') {\n httpClient.handleCategories().then(loader);\n return next(input);\n }\n\n const middlewareClient = new MiddlewareClient(container);\n // this is an update check, as it requires\n // a lot different logic and no user message\n if (middlewareClient.checkForUpdate(input)) {\n httpClient.handleUpdate(input).then(loader);\n\n return next(input);\n }\n\n chatClient.printUserMessageAndStoreIt(input);\n\n httpClient.handleInput(input).then(loader);\n\n return next(input);\n });\n });\n};\n\nexport default KnowledgeBotProviderPlugin;\n"],"names":["uuidv4","newGuid"],"mappings":"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"}
|