@telia-ace/widget-conversation 1.0.13 → 1.0.16
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/README.md +51 -0
- package/dist/conversation-platform.d.ts +2 -1
- package/dist/conversation.js +40 -61
- package/dist/conversation.js.map +1 -1
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +3 -18
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -254,3 +254,54 @@ component.actions.watch('conversation.form', (input, next) => {
|
|
|
254
254
|
return next(input);
|
|
255
255
|
});
|
|
256
256
|
```
|
|
257
|
+
|
|
258
|
+
### Adding custom list items
|
|
259
|
+
|
|
260
|
+
In order to add custom list items to the conversation you may register your own custom React component, which will be mapped to a key also provided by you.
|
|
261
|
+
|
|
262
|
+
You register the component like below:
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
const platform = await ConversationPlatform.getInstance(container);
|
|
266
|
+
|
|
267
|
+
platform.registerConversationItem('my-custom-list-item', import('./my-custom-list-item'));
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Once the component has been registered it will be available to be used as any other item in the `print` method on the Conversation API.
|
|
271
|
+
|
|
272
|
+
### Secondary action
|
|
273
|
+
|
|
274
|
+
You may add a secondary action next to the user input field, which will fire a custom event that you provide.
|
|
275
|
+
|
|
276
|
+
In order to accomplish this you need to add the `secondaryAction` property to the conversation component in the configuration.
|
|
277
|
+
It accepts an object with the following properties:
|
|
278
|
+
|
|
279
|
+
| Name | Type | Description |
|
|
280
|
+
| -------- | -------- | ------------------------------------------------------------------- |
|
|
281
|
+
| `action` | `string` | An action that will be dispatched when the button is pressed |
|
|
282
|
+
| `label` | `string` | Will be used as a "title" and aria-label on the HTML button element |
|
|
283
|
+
| `icon` | `string` | An icon to be displayed, defaults to "browse" icon if left empty |
|
|
284
|
+
|
|
285
|
+
```json
|
|
286
|
+
"conversation": {
|
|
287
|
+
"type": "conversation",
|
|
288
|
+
"properties": {
|
|
289
|
+
"secondaryAction": {
|
|
290
|
+
"action": "my-secondary-action",
|
|
291
|
+
"label": "Label for the secondary action",
|
|
292
|
+
"icon": "my-icon"
|
|
293
|
+
}
|
|
294
|
+
// ...other properties
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
When you have added this property to the component, you may listen to it in your code.
|
|
300
|
+
|
|
301
|
+
```ts
|
|
302
|
+
component.actions.watch('conversation.action', (input, next) => {
|
|
303
|
+
if (input === 'my-secondary-action') {
|
|
304
|
+
// handle action
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ComponentNodeController, ComponentPlatform } from '@telia-ace/widget-core';
|
|
1
|
+
import { ComponentNodeController, ComponentPlatform, ReactComponent } from '@telia-ace/widget-core';
|
|
2
2
|
import { RouteData } from '@telia-ace/widget-routing';
|
|
3
3
|
import { Container, EventManager, EventSubscriptionCancellation } from '@webprovisions/platform';
|
|
4
4
|
import { ConversationController } from './conversation-controller';
|
|
@@ -38,6 +38,7 @@ export declare class ConversationPlatform {
|
|
|
38
38
|
navigateToConversationIfActive(id: string): Promise<void>;
|
|
39
39
|
setConversationEndedBehavior(behavior: ConversationEndedBehavior): Promise<void>;
|
|
40
40
|
createController(id: string): ConversationController;
|
|
41
|
+
registerConversationItem(name: string, component: ReactComponent): Promise<void>;
|
|
41
42
|
registerProvider(name: string, handler: ConversationHandler): void;
|
|
42
43
|
registerController(conversation: ConversationController, component: ComponentNodeController): boolean;
|
|
43
44
|
private writeToComponents;
|
package/dist/conversation.js
CHANGED
|
@@ -29,7 +29,7 @@ var __objRest = (source, exclude) => {
|
|
|
29
29
|
}
|
|
30
30
|
return target;
|
|
31
31
|
};
|
|
32
|
-
import { Input, Button, borderTabStyle, SymbolBadge, useDispatch, useProperties, useScroll, Typography, useComponent, invertedHoverButton, Html, List, buttonCss,
|
|
32
|
+
import { Input, Button, borderTabStyle, SymbolBadge, useDispatch, useProperties, useScroll, Typography, useComponent, invertedHoverButton, Html, List, buttonCss, Lightbox, useTransitionEnd, headingElement } from "@telia-ace/widget-ui";
|
|
33
33
|
import { appendClassNames, uuid } from "@telia-ace/widget-utilities";
|
|
34
34
|
import React, { useState, useEffect, Suspense, Fragment, useRef, useCallback } from "react";
|
|
35
35
|
import styled, { css, keyframes } from "styled-components";
|
|
@@ -123,7 +123,7 @@ const ConversationInput = ({ className }) => {
|
|
|
123
123
|
title: secondaryAction.label,
|
|
124
124
|
"aria-label": secondaryAction.label
|
|
125
125
|
}, /* @__PURE__ */ React.createElement(SymbolBadge, {
|
|
126
|
-
size:
|
|
126
|
+
size: 24,
|
|
127
127
|
symbol: { type: "Svg", content: secondaryAction.icon || "browse" }
|
|
128
128
|
})), multiline ? /* @__PURE__ */ React.createElement(StyledTextArea, {
|
|
129
129
|
value: inputText,
|
|
@@ -695,15 +695,16 @@ const ConversationContent = ({ content, isUser, stacked }) => {
|
|
|
695
695
|
}, /* @__PURE__ */ React.createElement(SeparatorPadding, null, /* @__PURE__ */ React.createElement(Separator, null)));
|
|
696
696
|
}
|
|
697
697
|
case ConversationMessageListItemType.LinkList: {
|
|
698
|
+
const items2 = Array.isArray(item.content.actions) ? item.content.actions : Object.keys(item.content.actions).map((i) => {
|
|
699
|
+
return {
|
|
700
|
+
label: item.content.actions[i],
|
|
701
|
+
actionKey: i
|
|
702
|
+
};
|
|
703
|
+
});
|
|
698
704
|
return /* @__PURE__ */ React.createElement(ConversationListItem, {
|
|
699
705
|
key: itemKey
|
|
700
706
|
}, /* @__PURE__ */ React.createElement(StyledLinkList, {
|
|
701
|
-
items:
|
|
702
|
-
return {
|
|
703
|
-
label: item.content.actions[i],
|
|
704
|
-
actionKey: i
|
|
705
|
-
};
|
|
706
|
-
}),
|
|
707
|
+
items: items2,
|
|
707
708
|
renderItem: (item2) => {
|
|
708
709
|
return /* @__PURE__ */ React.createElement("li", {
|
|
709
710
|
key: item2.actionKey
|
|
@@ -723,15 +724,16 @@ const ConversationContent = ({ content, isUser, stacked }) => {
|
|
|
723
724
|
}));
|
|
724
725
|
}
|
|
725
726
|
case ConversationMessageListItemType.ButtonList: {
|
|
727
|
+
const items2 = Array.isArray(item.content.actions) ? item.content.actions : Object.keys(item.content.actions).map((i) => {
|
|
728
|
+
return {
|
|
729
|
+
label: item.content.actions[i],
|
|
730
|
+
actionKey: i
|
|
731
|
+
};
|
|
732
|
+
});
|
|
726
733
|
return /* @__PURE__ */ React.createElement(ConversationListItem, {
|
|
727
734
|
key: itemKey
|
|
728
735
|
}, /* @__PURE__ */ React.createElement(StyledButtonList, {
|
|
729
|
-
items:
|
|
730
|
-
return {
|
|
731
|
-
label: item.content.actions[i],
|
|
732
|
-
actionKey: i
|
|
733
|
-
};
|
|
734
|
-
}),
|
|
736
|
+
items: items2,
|
|
735
737
|
renderItem: (item2) => {
|
|
736
738
|
return /* @__PURE__ */ React.createElement("li", {
|
|
737
739
|
key: item2.actionKey
|
|
@@ -739,50 +741,9 @@ const ConversationContent = ({ content, isUser, stacked }) => {
|
|
|
739
741
|
onClick: () => {
|
|
740
742
|
dispatch("action", item2.actionKey);
|
|
741
743
|
}
|
|
742
|
-
},
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
}
|
|
746
|
-
case ConversationMessageListItemType.NoGoodAlternative: {
|
|
747
|
-
return /* @__PURE__ */ React.createElement(ConversationListItem, {
|
|
748
|
-
key: itemKey
|
|
749
|
-
}, /* @__PURE__ */ React.createElement(NoGoodAlternativeWrapper, {
|
|
750
|
-
onClick: () => {
|
|
751
|
-
dispatch("action", "help");
|
|
752
|
-
}
|
|
753
|
-
}, /* @__PURE__ */ React.createElement(SymbolBadge, {
|
|
754
|
-
size: 14,
|
|
755
|
-
symbol: {
|
|
756
|
-
type: "FontAwesome",
|
|
757
|
-
content: "meh-o"
|
|
758
|
-
}
|
|
759
|
-
}), /* @__PURE__ */ React.createElement("span", null, item.content.body)));
|
|
760
|
-
}
|
|
761
|
-
case ConversationMessageListItemType.FeedbackList: {
|
|
762
|
-
return /* @__PURE__ */ React.createElement(ConversationListItem, {
|
|
763
|
-
key: itemKey
|
|
764
|
-
}, /* @__PURE__ */ React.createElement(StyledButtonList, {
|
|
765
|
-
items: Object.keys(item.content.actions).map((i) => {
|
|
766
|
-
return {
|
|
767
|
-
label: item.content.actions[i],
|
|
768
|
-
actionKey: i
|
|
769
|
-
};
|
|
770
|
-
}),
|
|
771
|
-
renderItem: (item2) => {
|
|
772
|
-
return /* @__PURE__ */ React.createElement(FeedbackItem, {
|
|
773
|
-
key: item2.actionKey
|
|
774
|
-
}, /* @__PURE__ */ React.createElement(FeedbackButton, {
|
|
775
|
-
className: "humany-feedback-button",
|
|
776
|
-
disabled: false,
|
|
777
|
-
"aria-pressed": true,
|
|
778
|
-
"data-selected": true,
|
|
779
|
-
"data-direction": "vertical",
|
|
780
|
-
onClick: () => {
|
|
781
|
-
dispatch("action", item2.actionKey);
|
|
782
|
-
}
|
|
783
|
-
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
784
|
-
faIcon: item2.actionKey == "yes" ? "smile-o" : "frown-o"
|
|
785
|
-
}), /* @__PURE__ */ React.createElement("span", null, item2.label)));
|
|
744
|
+
}, /* @__PURE__ */ React.createElement(SymbolBadge, {
|
|
745
|
+
symbol: item2.symbol
|
|
746
|
+
}), item2.label));
|
|
786
747
|
}
|
|
787
748
|
}));
|
|
788
749
|
}
|
|
@@ -887,6 +848,14 @@ const StyledButtonListButton = styled.button`
|
|
|
887
848
|
`;
|
|
888
849
|
}}
|
|
889
850
|
}
|
|
851
|
+
|
|
852
|
+
i,
|
|
853
|
+
svg {
|
|
854
|
+
margin-right: ${(p) => {
|
|
855
|
+
var _a;
|
|
856
|
+
return (_a = p.theme.sizes) == null ? void 0 : _a.small;
|
|
857
|
+
}};
|
|
858
|
+
}
|
|
890
859
|
`;
|
|
891
860
|
const StyledLinkList = styled(List)`
|
|
892
861
|
padding: 0;
|
|
@@ -935,6 +904,16 @@ const StyledLinkButton = styled.button`
|
|
|
935
904
|
`;
|
|
936
905
|
}}
|
|
937
906
|
`;
|
|
907
|
+
styled(SymbolBadge)`
|
|
908
|
+
font-size: ${(p) => {
|
|
909
|
+
var _a;
|
|
910
|
+
return (_a = p.theme.fonts) == null ? void 0 : _a.large;
|
|
911
|
+
}} !important;
|
|
912
|
+
margin-right: ${(p) => {
|
|
913
|
+
var _a;
|
|
914
|
+
return (_a = p.theme.sizes) == null ? void 0 : _a.normal;
|
|
915
|
+
}};
|
|
916
|
+
`;
|
|
938
917
|
const StyledActionButton = styled.button`
|
|
939
918
|
${buttonCss};
|
|
940
919
|
display: block;
|
|
@@ -981,7 +960,7 @@ const Separator = styled.div`
|
|
|
981
960
|
height: 1px;
|
|
982
961
|
width: 100%;
|
|
983
962
|
`;
|
|
984
|
-
|
|
963
|
+
styled.div`
|
|
985
964
|
display: flex;
|
|
986
965
|
align-items: center;
|
|
987
966
|
justify-content: center;
|
|
@@ -1005,7 +984,7 @@ const ConversationListItem = styled.li`
|
|
|
1005
984
|
return p.noPadding ? 0 : (_a = p.theme.sizes) == null ? void 0 : _a.medium;
|
|
1006
985
|
}};
|
|
1007
986
|
`;
|
|
1008
|
-
|
|
987
|
+
styled.li`
|
|
1009
988
|
@media (min-width: 768px) {
|
|
1010
989
|
display: list-item !important;
|
|
1011
990
|
margin-right: 0 !important;
|
|
@@ -1015,7 +994,7 @@ const FeedbackItem = styled.li`
|
|
|
1015
994
|
}} !important;
|
|
1016
995
|
}
|
|
1017
996
|
`;
|
|
1018
|
-
|
|
997
|
+
styled.button`
|
|
1019
998
|
@media (min-width: 768px) {
|
|
1020
999
|
min-width: 100%;
|
|
1021
1000
|
margin-right: 0;
|
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sources":["../src/ui/conversation/conversation-input.tsx","../src/ui/conversation/conversation-styles.tsx","../src/ui/conversation/conversation-loader.tsx","../src/ui/conversation/message-types/timestamp.tsx","../src/ui/conversation/message-types/agent.tsx","../src/ui/conversation/message-types/custom.tsx","../src/ui/conversation/message-types/system.tsx","../src/ui/conversation/message-types/user.tsx","../src/ui/conversation/message-types/custom-message-list-item.tsx","../src/ui/conversation/conversation-content.tsx","../src/ui/conversation/conversation-message.tsx","../src/ui/conversation/conversation.tsx"],"sourcesContent":["import {\r\n borderTabStyle,\r\n Button,\r\n Input,\r\n SymbolBadge,\r\n useDispatch,\r\n useProperties,\r\n useScroll,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useEffect, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationComponentProperties } from './conversation-component';\r\n\r\ntype Props = {\r\n className?: string;\r\n};\r\n\r\nconst ConversationInput: React.FC<Props> = ({ className }) => {\r\n const [inputText, setInputText] = useState('');\r\n const [inputFocus, setInputFocus] = useState(false);\r\n const [calculatedLineHeight, setCalculatedLineHeight] = useState(0);\r\n const [textareaMaxHeight, setTextareaMaxHeight] = useState(0);\r\n const dispatch = useDispatch();\r\n const {\r\n inputPlaceholder = 'Type your message',\r\n inputHidden = false,\r\n inputDisabled = false,\r\n sendButtonLabel = 'Send message',\r\n inputMultiline: multiline = true,\r\n secondaryAction,\r\n } = useProperties<ConversationComponentProperties>();\r\n const [scrollableCss, inputRef] = useScroll(true);\r\n\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n const { lineHeight, maxHeight } = getComputedStyle(inputRef.current);\r\n if (lineHeight && lineHeight.indexOf('px') > -1) {\r\n const lineHeightNumber = lineHeight.split('px');\r\n const calcLH = parseInt(lineHeightNumber[0], 10);\r\n setCalculatedLineHeight(calcLH);\r\n const maxHeightNumber = maxHeight.split('px');\r\n setTextareaMaxHeight(parseInt(maxHeightNumber[0], 10));\r\n }\r\n }\r\n }, [inputRef.current]);\r\n\r\n const submit = (e: any) => {\r\n if (!e.shiftKey || !multiline) {\r\n e.preventDefault();\r\n if (inputText && inputText.length > 0) {\r\n dispatch('user-submit', { text: inputText });\r\n setInputText('');\r\n onChange('');\r\n }\r\n } else if (inputText.length < 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const onSecondaryActionButtonClick = (e: any) => {\r\n if (!secondaryAction) {\r\n return;\r\n }\r\n e.preventDefault();\r\n dispatch('action', secondaryAction.action);\r\n };\r\n\r\n const calculateHeight = (value: string) => {\r\n if (multiline && inputRef.current) {\r\n const scrollHeight = inputRef.current.scrollHeight;\r\n if (scrollHeight > calculatedLineHeight) {\r\n inputRef.current.style.height = 'auto';\r\n let areaHeight = scrollHeight;\r\n if (value.length < 1) {\r\n areaHeight = calculatedLineHeight;\r\n }\r\n inputRef.current.style.height = `${areaHeight}px`;\r\n\r\n if (areaHeight >= textareaMaxHeight) {\r\n inputRef.current.style.overflowY = 'scroll';\r\n } else {\r\n inputRef.current.style.overflowY = 'hidden';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const onChange = (value: string) => {\r\n calculateHeight(value);\r\n setInputText(value);\r\n if (value && value.length > 0) {\r\n dispatch('user-typing', { textLength: value.length });\r\n }\r\n };\r\n\r\n if (inputHidden) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Wrapper\r\n grow={multiline}\r\n className={appendClassNames('humany-conversation-input', className)}\r\n data-has-focus={inputFocus}\r\n scrollableCss={scrollableCss}\r\n >\r\n {secondaryAction && (\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={onSecondaryActionButtonClick}\r\n title={secondaryAction.label}\r\n aria-label={secondaryAction.label}\r\n >\r\n <SymbolBadge\r\n size={22}\r\n symbol={{ type: 'Svg', content: secondaryAction.icon || 'browse' }}\r\n />\r\n </StyledButton>\r\n )}\r\n {multiline ? (\r\n <StyledTextArea\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n type={'textarea'}\r\n rows={1}\r\n ref={inputRef}\r\n />\r\n ) : (\r\n <StyledInput\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n />\r\n )}\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={submit}\r\n title={sendButtonLabel}\r\n aria-label={sendButtonLabel}\r\n >\r\n <SendSymbol\r\n size={22}\r\n symbol={{ type: 'Svg', content: 'send' }}\r\n hasContent={inputText && inputText.length}\r\n />\r\n </StyledButton>\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst StyledTextArea = styled(Input)<any>`\r\n resize: none;\r\n flex: 1;\r\n flex-shrink: 1;\r\n min-height: 1.2em;\r\n max-height: 148px;\r\n line-height: 1.2em;\r\n height: 1.2em;\r\n padding: 0;\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.medium};\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border: none;\r\n transition: height 200ms linear;\r\n outline: none;\r\n`;\r\n\r\nconst StyledInput = styled(Input)<any>`\r\n flex: 1;\r\n border: none;\r\n background-color: transparent;\r\n font-weight: 300;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n line-height: 1.2em;\r\n outline: none;\r\n padding-left: ${(p) => p.theme.sizes?.large};\r\n color: ${(p) => p.theme.colors?.text};\r\n &::placeholder {\r\n color: ${(p) => p.theme.colors?.textLight};\r\n font-style: italic;\r\n }\r\n`;\r\n\r\nconst StyledButton = styled(Button)<any>`\r\n flex: 0 0 50px;\r\n align-self: stretch;\r\n background-color: transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n color: #a6a6a6;\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst Wrapper = styled.div<{ 'data-has-focus': boolean } & any>`\r\n ${(p) =>\r\n p.grow\r\n ? css`\r\n min-height: 50px;\r\n max-height: 150px;\r\n `\r\n : css`\r\n height: 50px;\r\n `}\r\n flex: 0 0 auto;\r\n display: flex;\r\n align-items: center;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border-top: ${(p) => p.theme.inputBorder};\r\n ${(p) =>\r\n p['data-has-focus'] &&\r\n css`\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n `}\r\n ${StyledTextArea} {\r\n ${(p) => !!p.scrollableCss && p.scrollableCss}\r\n }\r\n`;\r\n\r\nconst SendSymbol = styled(({ hasContent, ...other }) => <SymbolBadge {...other} />)`\r\n line,\r\n path {\r\n stroke: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n fill: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n }\r\n`;\r\n\r\nexport default ConversationInput;\r\n","import { Typography } from '@telia-ace/widget-ui';\r\nimport styled, { css, keyframes } from 'styled-components';\r\n\r\nexport const Avatar = styled.div<any>`\r\n width: ${(p) => p.avatarSize || '32px'};\r\n height: ${(p) => p.avatarSize || '32px'};\r\n border-radius: 50%;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border: ${(p) => p.theme.border};\r\n grid-area: avatar;\r\n align-self: flex-end;\r\n justify-self: center;\r\n overflow: hidden;\r\n margin-right: ${(p) => p.theme.sizes?.normal};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n > img {\r\n height: 100%;\r\n width: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n > svg {\r\n width: 90%;\r\n height: 90%;\r\n padding: 10%;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n line,\r\n path,\r\n circle,\r\n fill {\r\n stroke: ${(p) => p.theme.colors?.text};\r\n }\r\n }\r\n`;\r\n\r\nexport const LoaderAnimation = keyframes`\r\n 0% {\r\n opacity: 0;\r\n }\r\n 75% {\r\n opacity: 1;\r\n }\r\n 100% {\r\n opacity: 0;\r\n }\r\n`;\r\n\r\nexport const Loader = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n > div {\r\n height: 10px;\r\n width: 10px;\r\n border-radius: 50%;\r\n margin: 5px;\r\n background-color: ${(p) => p.theme.colors?.text};\r\n animation: ${LoaderAnimation} 1s infinite;\r\n }\r\n > div:nth-child(2) {\r\n animation-delay: 100ms;\r\n }\r\n > div:nth-child(3) {\r\n animation-delay: 200ms;\r\n }\r\n`;\r\n\r\nexport const ContentBundle = styled.div`\r\n grid-area: content;\r\n max-width: 100%;\r\n overflow: hidden;\r\n`;\r\n\r\nexport const MessageTitle = styled(Typography)`\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n font-weight: normal;\r\n margin: 0;\r\n`;\r\n\r\nexport const MessageContainer = styled.div`\r\n display: flex;\r\n`;\r\n\r\nexport const MessageContent = styled.div<any>`\r\n background-color: ${(p) => (p.user ? p.theme.colors?.primary : p.theme.colors?.accent)};\r\n color: ${(p) => (p.user ? p.theme.colors?.accent : p.theme.colors?.text)};\r\n border-radius: 5px; // TODO: prop?\r\n border: 1px solid rgb(231, 231, 231);\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n margin-top: ${(p) => p.theme.sizes?.normal};\r\n display: inline-block;\r\n && > * {\r\n overflow-wrap: break-word;\r\n word-wrap: break-word;\r\n word-break: break-all;\r\n word-break: break-word;\r\n hyphens: auto;\r\n }\r\n max-width: 100%;\r\n ${(p) => p.fullWidth && 'width: 100%;'}\r\n\r\n ${(p) =>\r\n !p.user &&\r\n css`\r\n border: ${p.theme.border};\r\n `}\r\n ${(p) => p.user && 'margin-left: auto'};\r\n\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px; // TODO: Prop?\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px;\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n p.user &&\r\n css<any>`\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n border-top-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n !p.user &&\r\n css<any>`\r\n border-top-left-radius: 1px;\r\n `};\r\n\r\n ${(p) =>\r\n !p.stacked &&\r\n css<any>`\r\n ${p.user ? 'border-bottom-right-radius: 1px;' : 'border-bottom-left-radius: 1px;'}\r\n `};\r\n\r\n transition: border-radius 500ms linear;\r\n`;\r\n\r\nexport const MessageContentPart = styled.div<{ noPadding?: boolean }>`\r\n padding: ${(p) => p.theme.sizes?.normal} ${(p) => p.theme.sizes?.medium};\r\n\r\n ${(p) =>\r\n p.noPadding &&\r\n css`\r\n padding: 0;\r\n `}\r\n\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './conversation-styles';\r\n\r\ntype Props = {\r\n className?: string;\r\n agentData?: ConversationMessageSender;\r\n};\r\n\r\nconst ConversationLoader: React.FC<Props> = ({ className, agentData }) => {\r\n return (\r\n <ContentBundle>\r\n <MessageContainer>\r\n <MessageContent>\r\n <Loader>\r\n <div />\r\n <div />\r\n <div />\r\n </Loader>\r\n </MessageContent>\r\n </MessageContainer>\r\n </ContentBundle>\r\n );\r\n};\r\n\r\nexport default ConversationLoader;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n className?: string;\r\n name?: string;\r\n timestamp?: number | null;\r\n};\r\n\r\nconst StyledTimestamp = styled.p`\r\n && {\r\n font-size: ${(p) => p.theme.fonts?.small};\r\n font-weight: 300;\r\n }\r\n padding-top: ${(p) => p.theme.sizes?.small};\r\n margin: 0;\r\n line-height: 1.5em;\r\n grid-area: info;\r\n color: ${(p) => p.theme.colors?.text};\r\n`;\r\n\r\nconst getTimestamp = (raw: number) => {\r\n return new Date(raw).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n};\r\n\r\nconst Timestamp: React.FC<Props> = ({ className, name, timestamp }) => {\r\n if (!name && !timestamp) {\r\n return null;\r\n }\r\n\r\n let output = '';\r\n if (name) {\r\n if (timestamp) {\r\n output = `${name}: ${getTimestamp(timestamp)}`;\r\n } else {\r\n output = name;\r\n }\r\n } else if (timestamp) {\r\n output = getTimestamp(timestamp);\r\n }\r\n\r\n return <StyledTimestamp>{output}</StyledTimestamp>;\r\n};\r\n\r\nexport default Timestamp;\r\n","import { SymbolBadge, useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../../types';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport { Avatar } from '../conversation-styles';\r\nimport Timestamp from './timestamp';\r\n\r\ntype Props = {\r\n className?: string;\r\n children: any;\r\n sender: ConversationMessageSender;\r\n timestamp: number | null;\r\n};\r\n\r\nconst AgentMessage: React.FC<Props> = ({ className, children, sender, timestamp }) => {\r\n const { avatar, name } = sender;\r\n const { avatarSize } = useProperties<ConversationComponentProperties>();\r\n\r\n return (\r\n <StyledAgentMessage\r\n hasAvatar={!!avatar}\r\n className={appendClassNames(className, 'humany-conversation-agent-message')}\r\n >\r\n {avatar && (\r\n <Avatar avatarSize={avatarSize}>\r\n {typeof avatar === 'string' ? (\r\n <img src={avatar} />\r\n ) : (\r\n <SymbolBadge symbol={avatar} />\r\n )}\r\n </Avatar>\r\n )}\r\n {children}\r\n <Timestamp name={name} timestamp={timestamp}></Timestamp>\r\n </StyledAgentMessage>\r\n );\r\n};\r\n\r\nexport const StyledAgentMessage = styled.div<any>`\r\n display: grid;\r\n margin-right: 10%;\r\n width: 90%;\r\n ${(p) =>\r\n p.hasAvatar\r\n ? css`\r\n grid-template-columns: auto 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'avatar content'\r\n '. info';\r\n `\r\n : css`\r\n grid-template-columns: 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'content'\r\n 'info';\r\n `};\r\n`;\r\n\r\nexport default AgentMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React, { Suspense } from 'react';\r\nimport { MessageContent, MessageContentPart } from '../conversation-styles';\r\n\r\nexport type Props = {\r\n type: any;\r\n content: any;\r\n isUser: any;\r\n stacked: any;\r\n};\r\n\r\nconst CustomMessage: React.FC<Props> = (props) => {\r\n const CustomComponent = useComponent(props.type);\r\n\r\n if (!CustomComponent) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <MessageContent\r\n user={props.isUser}\r\n stacked={!!props.stacked && props.stacked}\r\n fullWidth={!!props.content.form || !!props.content.actions}\r\n >\r\n <MessageContentPart\r\n noPadding={!!props.content.noPadding && props.content.noPadding}\r\n >\r\n <CustomComponent {...props.content} />\r\n </MessageContentPart>\r\n </MessageContent>\r\n </Suspense>\r\n );\r\n};\r\n\r\nexport default CustomMessage;\r\n","import { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n discrete?: boolean;\r\n fullWidth?: boolean;\r\n children: any;\r\n};\r\n\r\nconst SystemMessage: React.FC<Props> = ({\r\n className,\r\n children,\r\n timestamp,\r\n discrete,\r\n fullWidth,\r\n}) => {\r\n return (\r\n <StyledSystemMessage\r\n className={appendClassNames(className, 'humany-conversation-system-message')}\r\n fullWidth={fullWidth}\r\n >\r\n {discrete ? (\r\n <Discrete className=\"humany-conversation-discrete-message\">\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </Discrete>\r\n ) : (\r\n <>\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </>\r\n )}\r\n </StyledSystemMessage>\r\n );\r\n};\r\n\r\nexport const StyledSystemMessage = styled.div<any>`\r\n ${(p) => p.fullWidth && 'width: 100%'};\r\n padding: 0 ${(p) => p.theme.sizes?.large};\r\n overflow: auto;\r\n`;\r\n\r\nexport const Discrete = styled.div`\r\n text-align: center;\r\n word-wrap: break-word;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n color: ${(p) => p.theme.colors?.text};\r\n > p {\r\n margin: 0;\r\n }\r\n`;\r\n\r\nexport default SystemMessage;\r\n","import { useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n children: any;\r\n};\r\n\r\nconst UserMessage: React.FC<Props> = ({ className, children, timestamp }) => {\r\n const { userLabel = '' } = useProperties<ConversationComponentProperties>();\r\n return (\r\n <StyledUserMessage\r\n className={appendClassNames(className, 'humany-conversation-user-message')}\r\n >\r\n {children}\r\n <Timestamp name={userLabel} timestamp={timestamp}></Timestamp>\r\n </StyledUserMessage>\r\n );\r\n};\r\n\r\nconst StyledUserMessage = styled.div`\r\n margin-left: 10%;\r\n width: 90%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n`;\r\n\r\nexport default UserMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\n\r\ntype Props = {\r\n type: string;\r\n content?: { [key: string]: any };\r\n};\r\nconst CustomMessageListItem: React.FC<Props> = ({ type, content = {} }) => {\r\n const Component = useComponent(type);\r\n\r\n if (!Component || !type) {\r\n return null;\r\n }\r\n return <Component {...content} />;\r\n};\r\n\r\nexport default CustomMessageListItem;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n Icon,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n SymbolBadge,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport React, { Fragment } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageListItemType,\r\n ConverstationMessageItem,\r\n} from '../../types';\r\nimport { MessageContent, MessageContentPart as Part, MessageTitle } from './conversation-styles';\r\nimport { CustomMessage } from './message-types';\r\nimport CustomMessageListItem from './message-types/custom-message-list-item';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n content: ConversationMessageContent;\r\n isUser: boolean;\r\n stacked?: string;\r\n CustomComponent?: any;\r\n};\r\n\r\nconst ConversationContent: React.FC<Props> = ({ content, isUser, stacked }) => {\r\n const dispatch = useDispatch();\r\n const { title, body, actions, form, type, items } = content;\r\n\r\n if (type)\r\n return <CustomMessage type={type} content={content} isUser={isUser} stacked={stacked} />;\r\n\r\n return (\r\n <MessageContent\r\n noPadding\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {items && (\r\n <Fragment>\r\n <Part key={uuid()} noPadding>\r\n <StyledActionList\r\n items={items.map(([type, content]: ConverstationMessageItem<any>) => {\r\n return { type, content };\r\n })}\r\n renderItem={(item: any) => {\r\n const itemKey = uuid();\r\n switch (item.type) {\r\n case ConversationMessageListItemType.Header: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <HeaderText>{item.content}</HeaderText>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Text: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <span>{item.content}</span>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.HTML: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledHtml\r\n html={item.content.body}\r\n htmlParseInstruction={htmlParseInstructions}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Separator: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <SeparatorPadding>\r\n <Separator />\r\n </SeparatorPadding>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.LinkList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledLinkList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledLinkButton\r\n help={item.actionKey === 'help'}\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n {item.label}\r\n {item.actionKey === 'help' && (\r\n <SymbolBadge\r\n size={14}\r\n symbol={{\r\n type: 'Svg',\r\n content:\r\n 'caret-down',\r\n }}\r\n />\r\n )}\r\n </StyledLinkButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.ButtonList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledButtonList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledButtonListButton\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n {item.label}\r\n </StyledButtonListButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.NoGoodAlternative: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <NoGoodAlternativeWrapper\r\n onClick={() => {\r\n dispatch('action', 'help');\r\n }}\r\n >\r\n <SymbolBadge\r\n size={14}\r\n symbol={{\r\n type: 'FontAwesome',\r\n content: 'meh-o',\r\n }}\r\n />\r\n <span>{item.content.body}</span>\r\n </NoGoodAlternativeWrapper>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.FeedbackList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledButtonList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <FeedbackItem key={item.actionKey}>\r\n <FeedbackButton\r\n className=\"humany-feedback-button\"\r\n disabled={false}\r\n aria-pressed={true}\r\n data-selected={true}\r\n data-direction={'vertical'}\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n <Icon\r\n faIcon={\r\n item.actionKey == 'yes'\r\n ? 'smile-o'\r\n : 'frown-o'\r\n }\r\n />\r\n <span>{item.label}</span>\r\n </FeedbackButton>\r\n </FeedbackItem>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n default: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <CustomMessageListItem\r\n type={item.type}\r\n content={item.content}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n }\r\n }}\r\n />\r\n </Part>\r\n </Fragment>\r\n )}\r\n </MessageContent>\r\n );\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledButtonList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.normal};\r\n margin-left: 0;\r\n display: inline-block;\r\n }\r\n`;\r\n\r\nconst StyledButtonListButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n text-align: left;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nconst StyledLinkList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst HeaderText = styled.strong`\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n`;\r\n\r\nconst StyledLinkButton = styled.button<{ help: boolean }>`\r\n display: block;\r\n background-color: transparent;\r\n text-align: left;\r\n border: none;\r\n padding: 0;\r\n font-weight: 300;\r\n font-family: inherit;\r\n cursor: pointer;\r\n color: ${(p) => p.theme.colors?.primary};\r\n\r\n ${(p) =>\r\n p.help &&\r\n css`\r\n color: ${p.theme.colors?.text};\r\n text-decoration: underline;\r\n\r\n i,\r\n svg {\r\n margin-left: ${p.theme.sizes?.small};\r\n }\r\n `}\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n font-family: Lato;\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n font-weight: 300;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nconst SeparatorPadding = styled.div`\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n`;\r\n\r\nconst Separator = styled.div`\r\n background-color: #efefef;\r\n height: 1px;\r\n width: 100%;\r\n`;\r\n\r\nconst NoGoodAlternativeWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n\r\n > i,\r\n svg {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n`;\r\n\r\nconst ConversationListItem = styled.li<{ noPadding?: boolean }>`\r\n padding-left: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n padding-right: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n`;\r\n\r\nconst FeedbackItem = styled.li`\r\n @media (min-width: 768px) {\r\n display: list-item !important;\r\n margin-right: 0 !important;\r\n margin-top: ${(p) => p.theme.sizes?.normal} !important;\r\n }\r\n`;\r\n\r\nconst FeedbackButton = styled.button<{\r\n 'data-selected': boolean;\r\n 'data-direction': 'horizontal' | 'vertical';\r\n}>`\r\n @media (min-width: 768px) {\r\n min-width: 100%;\r\n margin-right: 0;\r\n }\r\n display: inline-block;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border-color: ${(p) => p.theme.colors?.primary} !important;\r\n font-weight: 300;\r\n && {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n ${(p) =>\r\n p['data-direction'] === 'horizontal' &&\r\n css`\r\n width: 225px;\r\n max-width: calc(50% - ${p.theme.sizes?.large} - ${p.theme.sizes?.small});\r\n `}\r\n ${(p) =>\r\n p['data-direction'] === 'vertical' &&\r\n css`\r\n min-width: 150px;\r\n `}\r\n ${(p) =>\r\n invertedHoverButton({\r\n primaryColor: `${p.theme.colors?.primary}`,\r\n secondaryColor: '#FFFFFF',\r\n })}\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.small} 0 0;\r\n }\r\n span {\r\n }\r\n`;\r\n\r\nexport default ConversationContent;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationMessageContent } from '../../types';\r\nimport { BundledConversationMessage } from './conversation-component';\r\nimport ConversationContent from './conversation-content';\r\nimport {\r\n ContentBundle,\r\n MessageContainer,\r\n MessageContent,\r\n MessageContentPart as Part,\r\n MessageTitle,\r\n} from './conversation-styles';\r\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n} & BundledConversationMessage;\r\n\r\nconst ConversationMessageComponent: React.FC<Props> = ({\r\n className,\r\n timestamp,\r\n sender,\r\n type,\r\n content,\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n const getMessageStackPosition = (index: number) => {\r\n let messageOrder = undefined;\r\n if (content.length > 1) {\r\n messageOrder = index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\r\n }\r\n return messageOrder;\r\n };\r\n\r\n const renderContent = (content: ConversationMessageContent, isUser = false, stacked?: any) => {\r\n const { title, body, actions, form } = content;\r\n return (\r\n <MessageContent\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n </MessageContent>\r\n );\r\n };\r\n\r\n const createSystemMessage = () => {\r\n return (\r\n <>\r\n {content.map((item) => {\r\n const { key, body, title, form, actions } = item;\r\n const discrete = !!body && !title && !form && !actions;\r\n return (\r\n <SystemMessage\r\n className={className}\r\n key={key}\r\n discrete={discrete}\r\n timestamp={timestamp}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {discrete && body ? (\r\n <Html html={body} htmlParseInstruction={htmlParseInstructions} />\r\n ) : (\r\n <ConversationContent content={item} isUser={false} />\r\n )}\r\n </SystemMessage>\r\n );\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n const createAgentMessage = () => {\r\n return (\r\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={false}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </AgentMessage>\r\n );\r\n };\r\n\r\n const createUserMessage = () => {\r\n return (\r\n <UserMessage timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={true}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </UserMessage>\r\n );\r\n };\r\n\r\n switch (type) {\r\n case ConversationMessageType.System:\r\n return createSystemMessage();\r\n case ConversationMessageType.Agent:\r\n return createAgentMessage();\r\n case ConversationMessageType.User:\r\n return createUserMessage();\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nexport default ConversationMessageComponent;\r\n","import {\r\n borderTabStyle,\r\n headingElement,\r\n useProperties,\r\n useScroll,\r\n useTransitionEnd,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport {\r\n BundledConversationMessage,\r\n ConversationComponentProperties,\r\n} from './conversation-component';\r\nimport ConversationInput from './conversation-input';\r\nimport ConversationLoader from './conversation-loader';\r\nimport ConversationMessageComponent from './conversation-message';\r\nimport { AgentMessage } from './message-types';\r\n\r\ntype Props = {\r\n className: string;\r\n};\r\n\r\nconst Conversation: React.FC<Props> = ({ className }) => {\r\n const lastEntry = useRef(document.createElement('div'));\r\n const [scrollableCss, viewElem] = useScroll(true);\r\n const { messages, loading, typingActors } = useProperties<ConversationComponentProperties>();\r\n const [canSmooth, setCanSmooth] = useState(false);\r\n const scrollView = useCallback(\r\n (lastEntry: any, smooth = true) => {\r\n if (lastEntry !== null && lastEntry.current !== null) {\r\n if (messages && messages.length === 1) {\r\n lastEntry.current.focus();\r\n }\r\n /**\r\n * Don't scroll on typing state if the user has scrolled up a bit.\r\n */\r\n if (\r\n lastEntry.current.id.indexOf('typing_') !== -1 &&\r\n viewElem.current.scrollTopMax - viewElem.current.scrollTop >\r\n lastEntry.current.clientHeight + 100\r\n ) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n if (lastEntry.current) {\r\n lastEntry.current.scrollIntoView({\r\n block: 'end',\r\n behavior: smooth ? 'smooth' : 'auto',\r\n });\r\n }\r\n }, 0);\r\n }\r\n },\r\n [lastEntry]\r\n );\r\n\r\n useEffect(() => {\r\n if (canSmooth) {\r\n scrollView(lastEntry);\r\n }\r\n }, [messages, typingActors]);\r\n\r\n useTransitionEnd(() => {\r\n setCanSmooth(true);\r\n scrollView(lastEntry, false);\r\n });\r\n\r\n const renderTypingActors = () => {\r\n if (typingActors && typingActors.length) {\r\n return typingActors.map((actor: ConversationMessageSender, index) => {\r\n return (\r\n <MessageEntry\r\n id={`typing_${actor.name}`}\r\n ref={typingActors.length ? lastEntry : null}\r\n key={`typing_${actor.name}`}\r\n >\r\n <AgentMessage timestamp={Date.now()} sender={actor}>\r\n <ConversationLoader></ConversationLoader>\r\n </AgentMessage>\r\n </MessageEntry>\r\n );\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <Wrapper className={appendClassNames(className, 'humany-conversation-component')}>\r\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\r\n {messages && messages.length\r\n ? messages.map((message: BundledConversationMessage, index: any) => {\r\n const { type, timestamp, sender, content } = message;\r\n return (\r\n <MessageEntry\r\n className={'humany-conversation-entry'}\r\n tabIndex={-1}\r\n key={`${type}_${sender?.name}_${timestamp}_${content[0].key}`}\r\n ref={\r\n index + 1 < messages.length\r\n ? null\r\n : typingActors.length\r\n ? null\r\n : lastEntry\r\n }\r\n >\r\n <ConversationMessageComponent {...message} />\r\n </MessageEntry>\r\n );\r\n })\r\n : null}\r\n {renderTypingActors()}\r\n {loading && (\r\n <MessageEntry>\r\n <ConversationLoader />\r\n </MessageEntry>\r\n )}\r\n </Scrollable>\r\n <ConversationInput />\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n position: absolute;\r\n right: 0;\r\n left: 0;\r\n bottom: 0;\r\n top: 0;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst Scrollable = styled.div<{ scrolling: boolean } & any>`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: stretch;\r\n flex: 0 1 100%;\r\n padding: 0 ${(p) => p.theme.sizes?.normal};\r\n ${(p) => !!p.scrollableCss && p.scrollableCss};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst MessageEntry = styled.div`\r\n margin: 0;\r\n margin-bottom: ${(p) => p.theme.sizes?.medium};\r\n\r\n &:first-of-type {\r\n margin-top: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n &:last-of-type {\r\n padding-bottom: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n * {\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n }\r\n\r\n & span,\r\n p,\r\n a,\r\n div {\r\n font-weight: 300;\r\n }\r\n\r\n & b,\r\n h1 {\r\n font-weight: normal;\r\n }\r\n\r\n ${headingElement(\r\n 'h1',\r\n css`\r\n font-weight: normal;\r\n `\r\n )}\r\n`;\r\n\r\nexport default Conversation;\r\n"],"names":["Wrapper","imageLightboxRenderer","htmlParseInstructions","Part"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation.js","sources":["../src/ui/conversation/conversation-input.tsx","../src/ui/conversation/conversation-styles.tsx","../src/ui/conversation/conversation-loader.tsx","../src/ui/conversation/message-types/timestamp.tsx","../src/ui/conversation/message-types/agent.tsx","../src/ui/conversation/message-types/custom.tsx","../src/ui/conversation/message-types/system.tsx","../src/ui/conversation/message-types/user.tsx","../src/ui/conversation/message-types/custom-message-list-item.tsx","../src/ui/conversation/conversation-content.tsx","../src/ui/conversation/conversation-message.tsx","../src/ui/conversation/conversation.tsx"],"sourcesContent":["import {\r\n borderTabStyle,\r\n Button,\r\n Input,\r\n SymbolBadge,\r\n useDispatch,\r\n useProperties,\r\n useScroll,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useEffect, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationComponentProperties } from './conversation-component';\r\n\r\ntype Props = {\r\n className?: string;\r\n};\r\n\r\nconst ConversationInput: React.FC<Props> = ({ className }) => {\r\n const [inputText, setInputText] = useState('');\r\n const [inputFocus, setInputFocus] = useState(false);\r\n const [calculatedLineHeight, setCalculatedLineHeight] = useState(0);\r\n const [textareaMaxHeight, setTextareaMaxHeight] = useState(0);\r\n const dispatch = useDispatch();\r\n const {\r\n inputPlaceholder = 'Type your message',\r\n inputHidden = false,\r\n inputDisabled = false,\r\n sendButtonLabel = 'Send message',\r\n inputMultiline: multiline = true,\r\n secondaryAction,\r\n } = useProperties<ConversationComponentProperties>();\r\n const [scrollableCss, inputRef] = useScroll(true);\r\n\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n const { lineHeight, maxHeight } = getComputedStyle(inputRef.current);\r\n if (lineHeight && lineHeight.indexOf('px') > -1) {\r\n const lineHeightNumber = lineHeight.split('px');\r\n const calcLH = parseInt(lineHeightNumber[0], 10);\r\n setCalculatedLineHeight(calcLH);\r\n const maxHeightNumber = maxHeight.split('px');\r\n setTextareaMaxHeight(parseInt(maxHeightNumber[0], 10));\r\n }\r\n }\r\n }, [inputRef.current]);\r\n\r\n const submit = (e: any) => {\r\n if (!e.shiftKey || !multiline) {\r\n e.preventDefault();\r\n if (inputText && inputText.length > 0) {\r\n dispatch('user-submit', { text: inputText });\r\n setInputText('');\r\n onChange('');\r\n }\r\n } else if (inputText.length < 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const onSecondaryActionButtonClick = (e: any) => {\r\n if (!secondaryAction) {\r\n return;\r\n }\r\n e.preventDefault();\r\n dispatch('action', secondaryAction.action);\r\n };\r\n\r\n const calculateHeight = (value: string) => {\r\n if (multiline && inputRef.current) {\r\n const scrollHeight = inputRef.current.scrollHeight;\r\n if (scrollHeight > calculatedLineHeight) {\r\n inputRef.current.style.height = 'auto';\r\n let areaHeight = scrollHeight;\r\n if (value.length < 1) {\r\n areaHeight = calculatedLineHeight;\r\n }\r\n inputRef.current.style.height = `${areaHeight}px`;\r\n\r\n if (areaHeight >= textareaMaxHeight) {\r\n inputRef.current.style.overflowY = 'scroll';\r\n } else {\r\n inputRef.current.style.overflowY = 'hidden';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const onChange = (value: string) => {\r\n calculateHeight(value);\r\n setInputText(value);\r\n if (value && value.length > 0) {\r\n dispatch('user-typing', { textLength: value.length });\r\n }\r\n };\r\n\r\n if (inputHidden) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Wrapper\r\n grow={multiline}\r\n className={appendClassNames('humany-conversation-input', className)}\r\n data-has-focus={inputFocus}\r\n scrollableCss={scrollableCss}\r\n >\r\n {secondaryAction && (\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={onSecondaryActionButtonClick}\r\n title={secondaryAction.label}\r\n aria-label={secondaryAction.label}\r\n >\r\n <SymbolBadge\r\n size={24}\r\n symbol={{ type: 'Svg', content: secondaryAction.icon || 'browse' }}\r\n />\r\n </StyledButton>\r\n )}\r\n {multiline ? (\r\n <StyledTextArea\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n type={'textarea'}\r\n rows={1}\r\n ref={inputRef}\r\n />\r\n ) : (\r\n <StyledInput\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n />\r\n )}\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={submit}\r\n title={sendButtonLabel}\r\n aria-label={sendButtonLabel}\r\n >\r\n <SendSymbol\r\n size={22}\r\n symbol={{ type: 'Svg', content: 'send' }}\r\n hasContent={inputText && inputText.length}\r\n />\r\n </StyledButton>\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst StyledTextArea = styled(Input)<any>`\r\n resize: none;\r\n flex: 1;\r\n flex-shrink: 1;\r\n min-height: 1.2em;\r\n max-height: 148px;\r\n line-height: 1.2em;\r\n height: 1.2em;\r\n padding: 0;\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.medium};\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border: none;\r\n transition: height 200ms linear;\r\n outline: none;\r\n`;\r\n\r\nconst StyledInput = styled(Input)<any>`\r\n flex: 1;\r\n border: none;\r\n background-color: transparent;\r\n font-weight: 300;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n line-height: 1.2em;\r\n outline: none;\r\n padding-left: ${(p) => p.theme.sizes?.large};\r\n color: ${(p) => p.theme.colors?.text};\r\n &::placeholder {\r\n color: ${(p) => p.theme.colors?.textLight};\r\n font-style: italic;\r\n }\r\n`;\r\n\r\nconst StyledButton = styled(Button)<any>`\r\n flex: 0 0 50px;\r\n align-self: stretch;\r\n background-color: transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n color: #a6a6a6;\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst Wrapper = styled.div<{ 'data-has-focus': boolean } & any>`\r\n ${(p) =>\r\n p.grow\r\n ? css`\r\n min-height: 50px;\r\n max-height: 150px;\r\n `\r\n : css`\r\n height: 50px;\r\n `}\r\n flex: 0 0 auto;\r\n display: flex;\r\n align-items: center;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border-top: ${(p) => p.theme.inputBorder};\r\n ${(p) =>\r\n p['data-has-focus'] &&\r\n css`\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n `}\r\n ${StyledTextArea} {\r\n ${(p) => !!p.scrollableCss && p.scrollableCss}\r\n }\r\n`;\r\n\r\nconst SendSymbol = styled(({ hasContent, ...other }) => <SymbolBadge {...other} />)`\r\n line,\r\n path {\r\n stroke: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n fill: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n }\r\n`;\r\n\r\nexport default ConversationInput;\r\n","import { Typography } from '@telia-ace/widget-ui';\r\nimport styled, { css, keyframes } from 'styled-components';\r\n\r\nexport const Avatar = styled.div<any>`\r\n width: ${(p) => p.avatarSize || '32px'};\r\n height: ${(p) => p.avatarSize || '32px'};\r\n border-radius: 50%;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border: ${(p) => p.theme.border};\r\n grid-area: avatar;\r\n align-self: flex-end;\r\n justify-self: center;\r\n overflow: hidden;\r\n margin-right: ${(p) => p.theme.sizes?.normal};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n > img {\r\n height: 100%;\r\n width: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n > svg {\r\n width: 90%;\r\n height: 90%;\r\n padding: 10%;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n line,\r\n path,\r\n circle,\r\n fill {\r\n stroke: ${(p) => p.theme.colors?.text};\r\n }\r\n }\r\n`;\r\n\r\nexport const LoaderAnimation = keyframes`\r\n 0% {\r\n opacity: 0;\r\n }\r\n 75% {\r\n opacity: 1;\r\n }\r\n 100% {\r\n opacity: 0;\r\n }\r\n`;\r\n\r\nexport const Loader = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n > div {\r\n height: 10px;\r\n width: 10px;\r\n border-radius: 50%;\r\n margin: 5px;\r\n background-color: ${(p) => p.theme.colors?.text};\r\n animation: ${LoaderAnimation} 1s infinite;\r\n }\r\n > div:nth-child(2) {\r\n animation-delay: 100ms;\r\n }\r\n > div:nth-child(3) {\r\n animation-delay: 200ms;\r\n }\r\n`;\r\n\r\nexport const ContentBundle = styled.div`\r\n grid-area: content;\r\n max-width: 100%;\r\n overflow: hidden;\r\n`;\r\n\r\nexport const MessageTitle = styled(Typography)`\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n font-weight: normal;\r\n margin: 0;\r\n`;\r\n\r\nexport const MessageContainer = styled.div`\r\n display: flex;\r\n`;\r\n\r\nexport const MessageContent = styled.div<any>`\r\n background-color: ${(p) => (p.user ? p.theme.colors?.primary : p.theme.colors?.accent)};\r\n color: ${(p) => (p.user ? p.theme.colors?.accent : p.theme.colors?.text)};\r\n border-radius: 5px; // TODO: prop?\r\n border: 1px solid rgb(231, 231, 231);\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n margin-top: ${(p) => p.theme.sizes?.normal};\r\n display: inline-block;\r\n && > * {\r\n overflow-wrap: break-word;\r\n word-wrap: break-word;\r\n word-break: break-all;\r\n word-break: break-word;\r\n hyphens: auto;\r\n }\r\n max-width: 100%;\r\n ${(p) => p.fullWidth && 'width: 100%;'}\r\n\r\n ${(p) =>\r\n !p.user &&\r\n css`\r\n border: ${p.theme.border};\r\n `}\r\n ${(p) => p.user && 'margin-left: auto'};\r\n\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px; // TODO: Prop?\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px;\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n p.user &&\r\n css<any>`\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n border-top-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n !p.user &&\r\n css<any>`\r\n border-top-left-radius: 1px;\r\n `};\r\n\r\n ${(p) =>\r\n !p.stacked &&\r\n css<any>`\r\n ${p.user ? 'border-bottom-right-radius: 1px;' : 'border-bottom-left-radius: 1px;'}\r\n `};\r\n\r\n transition: border-radius 500ms linear;\r\n`;\r\n\r\nexport const MessageContentPart = styled.div<{ noPadding?: boolean }>`\r\n padding: ${(p) => p.theme.sizes?.normal} ${(p) => p.theme.sizes?.medium};\r\n\r\n ${(p) =>\r\n p.noPadding &&\r\n css`\r\n padding: 0;\r\n `}\r\n\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './conversation-styles';\r\n\r\ntype Props = {\r\n className?: string;\r\n agentData?: ConversationMessageSender;\r\n};\r\n\r\nconst ConversationLoader: React.FC<Props> = ({ className, agentData }) => {\r\n return (\r\n <ContentBundle>\r\n <MessageContainer>\r\n <MessageContent>\r\n <Loader>\r\n <div />\r\n <div />\r\n <div />\r\n </Loader>\r\n </MessageContent>\r\n </MessageContainer>\r\n </ContentBundle>\r\n );\r\n};\r\n\r\nexport default ConversationLoader;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n className?: string;\r\n name?: string;\r\n timestamp?: number | null;\r\n};\r\n\r\nconst StyledTimestamp = styled.p`\r\n && {\r\n font-size: ${(p) => p.theme.fonts?.small};\r\n font-weight: 300;\r\n }\r\n padding-top: ${(p) => p.theme.sizes?.small};\r\n margin: 0;\r\n line-height: 1.5em;\r\n grid-area: info;\r\n color: ${(p) => p.theme.colors?.text};\r\n`;\r\n\r\nconst getTimestamp = (raw: number) => {\r\n return new Date(raw).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n};\r\n\r\nconst Timestamp: React.FC<Props> = ({ className, name, timestamp }) => {\r\n if (!name && !timestamp) {\r\n return null;\r\n }\r\n\r\n let output = '';\r\n if (name) {\r\n if (timestamp) {\r\n output = `${name}: ${getTimestamp(timestamp)}`;\r\n } else {\r\n output = name;\r\n }\r\n } else if (timestamp) {\r\n output = getTimestamp(timestamp);\r\n }\r\n\r\n return <StyledTimestamp>{output}</StyledTimestamp>;\r\n};\r\n\r\nexport default Timestamp;\r\n","import { SymbolBadge, useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../../types';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport { Avatar } from '../conversation-styles';\r\nimport Timestamp from './timestamp';\r\n\r\ntype Props = {\r\n className?: string;\r\n children: any;\r\n sender: ConversationMessageSender;\r\n timestamp: number | null;\r\n};\r\n\r\nconst AgentMessage: React.FC<Props> = ({ className, children, sender, timestamp }) => {\r\n const { avatar, name } = sender;\r\n const { avatarSize } = useProperties<ConversationComponentProperties>();\r\n\r\n return (\r\n <StyledAgentMessage\r\n hasAvatar={!!avatar}\r\n className={appendClassNames(className, 'humany-conversation-agent-message')}\r\n >\r\n {avatar && (\r\n <Avatar avatarSize={avatarSize}>\r\n {typeof avatar === 'string' ? (\r\n <img src={avatar} />\r\n ) : (\r\n <SymbolBadge symbol={avatar} />\r\n )}\r\n </Avatar>\r\n )}\r\n {children}\r\n <Timestamp name={name} timestamp={timestamp}></Timestamp>\r\n </StyledAgentMessage>\r\n );\r\n};\r\n\r\nexport const StyledAgentMessage = styled.div<any>`\r\n display: grid;\r\n margin-right: 10%;\r\n width: 90%;\r\n ${(p) =>\r\n p.hasAvatar\r\n ? css`\r\n grid-template-columns: auto 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'avatar content'\r\n '. info';\r\n `\r\n : css`\r\n grid-template-columns: 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'content'\r\n 'info';\r\n `};\r\n`;\r\n\r\nexport default AgentMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React, { Suspense } from 'react';\r\nimport { MessageContent, MessageContentPart } from '../conversation-styles';\r\n\r\nexport type Props = {\r\n type: any;\r\n content: any;\r\n isUser: any;\r\n stacked: any;\r\n};\r\n\r\nconst CustomMessage: React.FC<Props> = (props) => {\r\n const CustomComponent = useComponent(props.type);\r\n\r\n if (!CustomComponent) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <MessageContent\r\n user={props.isUser}\r\n stacked={!!props.stacked && props.stacked}\r\n fullWidth={!!props.content.form || !!props.content.actions}\r\n >\r\n <MessageContentPart\r\n noPadding={!!props.content.noPadding && props.content.noPadding}\r\n >\r\n <CustomComponent {...props.content} />\r\n </MessageContentPart>\r\n </MessageContent>\r\n </Suspense>\r\n );\r\n};\r\n\r\nexport default CustomMessage;\r\n","import { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n discrete?: boolean;\r\n fullWidth?: boolean;\r\n children: any;\r\n};\r\n\r\nconst SystemMessage: React.FC<Props> = ({\r\n className,\r\n children,\r\n timestamp,\r\n discrete,\r\n fullWidth,\r\n}) => {\r\n return (\r\n <StyledSystemMessage\r\n className={appendClassNames(className, 'humany-conversation-system-message')}\r\n fullWidth={fullWidth}\r\n >\r\n {discrete ? (\r\n <Discrete className=\"humany-conversation-discrete-message\">\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </Discrete>\r\n ) : (\r\n <>\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </>\r\n )}\r\n </StyledSystemMessage>\r\n );\r\n};\r\n\r\nexport const StyledSystemMessage = styled.div<any>`\r\n ${(p) => p.fullWidth && 'width: 100%'};\r\n padding: 0 ${(p) => p.theme.sizes?.large};\r\n overflow: auto;\r\n`;\r\n\r\nexport const Discrete = styled.div`\r\n text-align: center;\r\n word-wrap: break-word;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n color: ${(p) => p.theme.colors?.text};\r\n > p {\r\n margin: 0;\r\n }\r\n`;\r\n\r\nexport default SystemMessage;\r\n","import { useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n children: any;\r\n};\r\n\r\nconst UserMessage: React.FC<Props> = ({ className, children, timestamp }) => {\r\n const { userLabel = '' } = useProperties<ConversationComponentProperties>();\r\n return (\r\n <StyledUserMessage\r\n className={appendClassNames(className, 'humany-conversation-user-message')}\r\n >\r\n {children}\r\n <Timestamp name={userLabel} timestamp={timestamp}></Timestamp>\r\n </StyledUserMessage>\r\n );\r\n};\r\n\r\nconst StyledUserMessage = styled.div`\r\n margin-left: 10%;\r\n width: 90%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n`;\r\n\r\nexport default UserMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\n\r\ntype Props = {\r\n type: string;\r\n content?: { [key: string]: any };\r\n};\r\nconst CustomMessageListItem: React.FC<Props> = ({ type, content = {} }) => {\r\n const Component = useComponent(type);\r\n\r\n if (!Component || !type) {\r\n return null;\r\n }\r\n return <Component {...content} />;\r\n};\r\n\r\nexport default CustomMessageListItem;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n SymbolBadge,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport React, { Fragment } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageListItemType,\r\n ConverstationMessageItem,\r\n} from '../../types';\r\nimport { MessageContent, MessageContentPart as Part, MessageTitle } from './conversation-styles';\r\nimport { CustomMessage } from './message-types';\r\nimport CustomMessageListItem from './message-types/custom-message-list-item';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n content: ConversationMessageContent;\r\n isUser: boolean;\r\n stacked?: string;\r\n CustomComponent?: any;\r\n};\r\n\r\nconst ConversationContent: React.FC<Props> = ({ content, isUser, stacked }) => {\r\n const dispatch = useDispatch();\r\n const { title, body, actions, form, type, items } = content;\r\n\r\n if (type)\r\n return <CustomMessage type={type} content={content} isUser={isUser} stacked={stacked} />;\r\n\r\n return (\r\n <MessageContent\r\n noPadding\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {items && (\r\n <Fragment>\r\n <Part key={uuid()} noPadding>\r\n <StyledActionList\r\n items={items.map(([type, content]: ConverstationMessageItem<any>) => {\r\n return { type, content };\r\n })}\r\n renderItem={(item: any) => {\r\n const itemKey = uuid();\r\n switch (item.type) {\r\n case ConversationMessageListItemType.Header: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <HeaderText>{item.content}</HeaderText>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Text: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <span>{item.content}</span>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.HTML: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledHtml\r\n html={item.content.body}\r\n htmlParseInstruction={htmlParseInstructions}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Separator: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <SeparatorPadding>\r\n <Separator />\r\n </SeparatorPadding>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.LinkList: {\r\n const items = Array.isArray(item.content.actions)\r\n ? item.content.actions\r\n : Object.keys(item.content.actions).map((i) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n });\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledLinkList\r\n items={items}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledLinkButton\r\n help={item.actionKey === 'help'}\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n {item.label}\r\n {item.actionKey === 'help' && (\r\n <SymbolBadge\r\n size={14}\r\n symbol={{\r\n type: 'Svg',\r\n content:\r\n 'caret-down',\r\n }}\r\n />\r\n )}\r\n </StyledLinkButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.ButtonList: {\r\n const items = Array.isArray(item.content.actions)\r\n ? item.content.actions\r\n : Object.keys(item.content.actions).map((i) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n });\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledButtonList\r\n items={items}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledButtonListButton\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n <SymbolBadge\r\n symbol={item.symbol}\r\n />\r\n {item.label}\r\n </StyledButtonListButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n // case ConversationMessageListItemType.NoGoodAlternative: {\r\n // return (\r\n // <ConversationListItem key={itemKey}>\r\n // <NoGoodAlternativeWrapper\r\n // onClick={() => {\r\n // dispatch('action', 'help');\r\n // }}\r\n // >\r\n // <SymbolBadge\r\n // size={14}\r\n // symbol={{\r\n // type: 'FontAwesome',\r\n // content: 'meh-o',\r\n // }}\r\n // />\r\n // <span>{item.content.body}</span>\r\n // </NoGoodAlternativeWrapper>\r\n // </ConversationListItem>\r\n // );\r\n // }\r\n // case ConversationMessageListItemType.FeedbackList: {\r\n // return (\r\n // <ConversationListItem key={itemKey}>\r\n // <StyledButtonList\r\n // items={Object.keys(item.content.actions).map(\r\n // (i: any) => {\r\n // return {\r\n // label: item.content.actions[i],\r\n // actionKey: i,\r\n // };\r\n // }\r\n // )}\r\n // renderItem={(item: any) => {\r\n // return (\r\n // <FeedbackItem key={item.actionKey}>\r\n // <FeedbackButton\r\n // className=\"humany-feedback-button\"\r\n // disabled={false}\r\n // aria-pressed={true}\r\n // data-selected={true}\r\n // data-direction={'vertical'}\r\n // onClick={() => {\r\n // dispatch(\r\n // 'action',\r\n // item.actionKey\r\n // );\r\n // }}\r\n // >\r\n // <Icon\r\n // faIcon={\r\n // item.actionKey == 'yes'\r\n // ? 'smile-o'\r\n // : 'frown-o'\r\n // }\r\n // />\r\n // <span>{item.label}</span>\r\n // </FeedbackButton>\r\n // </FeedbackItem>\r\n // );\r\n // }}\r\n // />\r\n // </ConversationListItem>\r\n // );\r\n // }\r\n default: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <CustomMessageListItem\r\n type={item.type}\r\n content={item.content}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n }\r\n }}\r\n />\r\n </Part>\r\n </Fragment>\r\n )}\r\n </MessageContent>\r\n );\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledButtonList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.normal};\r\n margin-left: 0;\r\n display: inline-block;\r\n }\r\n`;\r\n\r\nconst StyledButtonListButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n text-align: left;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n\r\n i,\r\n svg {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n`;\r\n\r\nconst StyledLinkList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst HeaderText = styled.strong`\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n`;\r\n\r\nconst StyledLinkButton = styled.button<{ help: boolean }>`\r\n display: block;\r\n background-color: transparent;\r\n text-align: left;\r\n border: none;\r\n padding: 0;\r\n font-weight: 300;\r\n font-family: inherit;\r\n cursor: pointer;\r\n color: ${(p) => p.theme.colors?.primary};\r\n\r\n ${(p) =>\r\n p.help &&\r\n css`\r\n color: ${p.theme.colors?.text};\r\n text-decoration: underline;\r\n\r\n i,\r\n svg {\r\n margin-left: ${p.theme.sizes?.small};\r\n }\r\n `}\r\n`;\r\n\r\nconst StyledSymbolBadge = styled(SymbolBadge)`\r\n font-size: ${(p) => p.theme.fonts?.large} !important;\r\n margin-right: ${(p) => p.theme.sizes?.normal};\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n font-family: Lato;\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n font-weight: 300;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nconst SeparatorPadding = styled.div`\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n`;\r\n\r\nconst Separator = styled.div`\r\n background-color: #efefef;\r\n height: 1px;\r\n width: 100%;\r\n`;\r\n\r\nconst NoGoodAlternativeWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n\r\n > i,\r\n svg {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n`;\r\n\r\nconst ConversationListItem = styled.li<{ noPadding?: boolean }>`\r\n padding-left: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n padding-right: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n`;\r\n\r\nconst FeedbackItem = styled.li`\r\n @media (min-width: 768px) {\r\n display: list-item !important;\r\n margin-right: 0 !important;\r\n margin-top: ${(p) => p.theme.sizes?.normal} !important;\r\n }\r\n`;\r\n\r\nconst FeedbackButton = styled.button<{\r\n 'data-selected': boolean;\r\n 'data-direction': 'horizontal' | 'vertical';\r\n}>`\r\n @media (min-width: 768px) {\r\n min-width: 100%;\r\n margin-right: 0;\r\n }\r\n display: inline-block;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border-color: ${(p) => p.theme.colors?.primary} !important;\r\n font-weight: 300;\r\n && {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n ${(p) =>\r\n p['data-direction'] === 'horizontal' &&\r\n css`\r\n width: 225px;\r\n max-width: calc(50% - ${p.theme.sizes?.large} - ${p.theme.sizes?.small});\r\n `}\r\n ${(p) =>\r\n p['data-direction'] === 'vertical' &&\r\n css`\r\n min-width: 150px;\r\n `}\r\n ${(p) =>\r\n invertedHoverButton({\r\n primaryColor: `${p.theme.colors?.primary}`,\r\n secondaryColor: '#FFFFFF',\r\n })}\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.small} 0 0;\r\n }\r\n span {\r\n }\r\n`;\r\n\r\nexport default ConversationContent;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationMessageContent } from '../../types';\r\nimport { BundledConversationMessage } from './conversation-component';\r\nimport ConversationContent from './conversation-content';\r\nimport {\r\n ContentBundle,\r\n MessageContainer,\r\n MessageContent,\r\n MessageContentPart as Part,\r\n MessageTitle,\r\n} from './conversation-styles';\r\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n} & BundledConversationMessage;\r\n\r\nconst ConversationMessageComponent: React.FC<Props> = ({\r\n className,\r\n timestamp,\r\n sender,\r\n type,\r\n content,\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n const getMessageStackPosition = (index: number) => {\r\n let messageOrder = undefined;\r\n if (content.length > 1) {\r\n messageOrder = index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\r\n }\r\n return messageOrder;\r\n };\r\n\r\n const renderContent = (content: ConversationMessageContent, isUser = false, stacked?: any) => {\r\n const { title, body, actions, form } = content;\r\n return (\r\n <MessageContent\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n </MessageContent>\r\n );\r\n };\r\n\r\n const createSystemMessage = () => {\r\n return (\r\n <>\r\n {content.map((item) => {\r\n const { key, body, title, form, actions } = item;\r\n const discrete = !!body && !title && !form && !actions;\r\n return (\r\n <SystemMessage\r\n className={className}\r\n key={key}\r\n discrete={discrete}\r\n timestamp={timestamp}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {discrete && body ? (\r\n <Html html={body} htmlParseInstruction={htmlParseInstructions} />\r\n ) : (\r\n <ConversationContent content={item} isUser={false} />\r\n )}\r\n </SystemMessage>\r\n );\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n const createAgentMessage = () => {\r\n return (\r\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={false}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </AgentMessage>\r\n );\r\n };\r\n\r\n const createUserMessage = () => {\r\n return (\r\n <UserMessage timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={true}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </UserMessage>\r\n );\r\n };\r\n\r\n switch (type) {\r\n case ConversationMessageType.System:\r\n return createSystemMessage();\r\n case ConversationMessageType.Agent:\r\n return createAgentMessage();\r\n case ConversationMessageType.User:\r\n return createUserMessage();\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nexport default ConversationMessageComponent;\r\n","import {\r\n borderTabStyle,\r\n headingElement,\r\n useProperties,\r\n useScroll,\r\n useTransitionEnd,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport {\r\n BundledConversationMessage,\r\n ConversationComponentProperties,\r\n} from './conversation-component';\r\nimport ConversationInput from './conversation-input';\r\nimport ConversationLoader from './conversation-loader';\r\nimport ConversationMessageComponent from './conversation-message';\r\nimport { AgentMessage } from './message-types';\r\n\r\ntype Props = {\r\n className: string;\r\n};\r\n\r\nconst Conversation: React.FC<Props> = ({ className }) => {\r\n const lastEntry = useRef(document.createElement('div'));\r\n const [scrollableCss, viewElem] = useScroll(true);\r\n const { messages, loading, typingActors } = useProperties<ConversationComponentProperties>();\r\n const [canSmooth, setCanSmooth] = useState(false);\r\n const scrollView = useCallback(\r\n (lastEntry: any, smooth = true) => {\r\n if (lastEntry !== null && lastEntry.current !== null) {\r\n if (messages && messages.length === 1) {\r\n lastEntry.current.focus();\r\n }\r\n /**\r\n * Don't scroll on typing state if the user has scrolled up a bit.\r\n */\r\n if (\r\n lastEntry.current.id.indexOf('typing_') !== -1 &&\r\n viewElem.current.scrollTopMax - viewElem.current.scrollTop >\r\n lastEntry.current.clientHeight + 100\r\n ) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n if (lastEntry.current) {\r\n lastEntry.current.scrollIntoView({\r\n block: 'end',\r\n behavior: smooth ? 'smooth' : 'auto',\r\n });\r\n }\r\n }, 0);\r\n }\r\n },\r\n [lastEntry]\r\n );\r\n\r\n useEffect(() => {\r\n if (canSmooth) {\r\n scrollView(lastEntry);\r\n }\r\n }, [messages, typingActors]);\r\n\r\n useTransitionEnd(() => {\r\n setCanSmooth(true);\r\n scrollView(lastEntry, false);\r\n });\r\n\r\n const renderTypingActors = () => {\r\n if (typingActors && typingActors.length) {\r\n return typingActors.map((actor: ConversationMessageSender, index) => {\r\n return (\r\n <MessageEntry\r\n id={`typing_${actor.name}`}\r\n ref={typingActors.length ? lastEntry : null}\r\n key={`typing_${actor.name}`}\r\n >\r\n <AgentMessage timestamp={Date.now()} sender={actor}>\r\n <ConversationLoader></ConversationLoader>\r\n </AgentMessage>\r\n </MessageEntry>\r\n );\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <Wrapper className={appendClassNames(className, 'humany-conversation-component')}>\r\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\r\n {messages && messages.length\r\n ? messages.map((message: BundledConversationMessage, index: any) => {\r\n const { type, timestamp, sender, content } = message;\r\n return (\r\n <MessageEntry\r\n className={'humany-conversation-entry'}\r\n tabIndex={-1}\r\n key={`${type}_${sender?.name}_${timestamp}_${content[0].key}`}\r\n ref={\r\n index + 1 < messages.length\r\n ? null\r\n : typingActors.length\r\n ? null\r\n : lastEntry\r\n }\r\n >\r\n <ConversationMessageComponent {...message} />\r\n </MessageEntry>\r\n );\r\n })\r\n : null}\r\n {renderTypingActors()}\r\n {loading && (\r\n <MessageEntry>\r\n <ConversationLoader />\r\n </MessageEntry>\r\n )}\r\n </Scrollable>\r\n <ConversationInput />\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n position: absolute;\r\n right: 0;\r\n left: 0;\r\n bottom: 0;\r\n top: 0;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst Scrollable = styled.div<{ scrolling: boolean } & any>`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: stretch;\r\n flex: 0 1 100%;\r\n padding: 0 ${(p) => p.theme.sizes?.normal};\r\n ${(p) => !!p.scrollableCss && p.scrollableCss};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst MessageEntry = styled.div`\r\n margin: 0;\r\n margin-bottom: ${(p) => p.theme.sizes?.medium};\r\n\r\n &:first-of-type {\r\n margin-top: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n &:last-of-type {\r\n padding-bottom: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n * {\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n }\r\n\r\n & span,\r\n p,\r\n a,\r\n div {\r\n font-weight: 300;\r\n }\r\n\r\n & b,\r\n h1 {\r\n font-weight: normal;\r\n }\r\n\r\n ${headingElement(\r\n 'h1',\r\n css`\r\n font-weight: normal;\r\n `\r\n )}\r\n`;\r\n\r\nexport default Conversation;\r\n"],"names":["Wrapper","imageLightboxRenderer","htmlParseInstructions","Part"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -524,6 +524,12 @@ const navigateToConversation = (container, contactMethod, routeName = "conversat
|
|
|
524
524
|
});
|
|
525
525
|
});
|
|
526
526
|
};
|
|
527
|
+
const registerCustomMessageComponent = (container, type, component) => {
|
|
528
|
+
return container.getAsync("componentResolver").then((o) => __async(this, null, function* () {
|
|
529
|
+
const platform = yield ConversationPlatform.getInstance(container);
|
|
530
|
+
platform.addSubscription(o.registerComponent(type, lazy(() => component)));
|
|
531
|
+
}));
|
|
532
|
+
};
|
|
527
533
|
const STORAGE_KEY = "conversations";
|
|
528
534
|
var ConversationEndedBehavior = /* @__PURE__ */ ((ConversationEndedBehavior2) => {
|
|
529
535
|
ConversationEndedBehavior2["Deactivate"] = "deactivate";
|
|
@@ -628,6 +634,9 @@ class ConversationPlatform {
|
|
|
628
634
|
}
|
|
629
635
|
return new ConversationController(this.container, id);
|
|
630
636
|
}
|
|
637
|
+
registerConversationItem(name, component) {
|
|
638
|
+
return registerCustomMessageComponent(this.container, name, component);
|
|
639
|
+
}
|
|
631
640
|
registerProvider(name, handler) {
|
|
632
641
|
const provider = {
|
|
633
642
|
name,
|
|
@@ -747,11 +756,10 @@ var ConversationMessageListItemType = /* @__PURE__ */ ((ConversationMessageListI
|
|
|
747
756
|
ConversationMessageListItemType2["Header"] = "header";
|
|
748
757
|
ConversationMessageListItemType2["LinkList"] = "link-list";
|
|
749
758
|
ConversationMessageListItemType2["Separator"] = "separator";
|
|
750
|
-
ConversationMessageListItemType2["NoGoodAlternative"] = "no-good-alternative";
|
|
751
759
|
ConversationMessageListItemType2["ButtonList"] = "button-list";
|
|
760
|
+
ConversationMessageListItemType2["CategoryButtonList"] = "category-button-list";
|
|
752
761
|
ConversationMessageListItemType2["Text"] = "text";
|
|
753
762
|
ConversationMessageListItemType2["HTML"] = "html";
|
|
754
|
-
ConversationMessageListItemType2["FeedbackList"] = "feedback-list";
|
|
755
763
|
return ConversationMessageListItemType2;
|
|
756
764
|
})(ConversationMessageListItemType || {});
|
|
757
765
|
const groupedMessages = (messages, timeout) => {
|
|
@@ -857,11 +865,5 @@ const ConversationReturnButtonComponent = (container) => {
|
|
|
857
865
|
});
|
|
858
866
|
});
|
|
859
867
|
};
|
|
860
|
-
const registerCustomMessageComponent = (container, type, component) => {
|
|
861
|
-
return container.getAsync("componentResolver").then((o) => __async(this, null, function* () {
|
|
862
|
-
const platform = yield ConversationPlatform.getInstance(container);
|
|
863
|
-
platform.addSubscription(o.registerComponent(type, lazy(() => component)));
|
|
864
|
-
}));
|
|
865
|
-
};
|
|
866
868
|
export { ConversationComponent, ConversationController, ConversationEndedBehavior, ConversationEntry, ConversationMessageListItemType, ConversationMessageType, ConversationPlatform, ConversationReturnButtonComponent, registerCustomMessageComponent };
|
|
867
869
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/user.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/types.ts","../src/ui/conversation/conversation-component.ts","../src/ui/return-button/return-button-component.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\r\nimport {\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConverstationMessageItem,\r\n} from './types';\r\n\r\nexport type AgentSettings = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport class Agent {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n\r\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\r\n this.name = settings.name;\r\n this.avatar = settings.avatar;\r\n }\r\n\r\n print = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ): ConversationEntry | undefined => {\r\n const sender: ConversationMessageSender = { name: this.name, avatar: this.avatar };\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.provider.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.Agent,\r\n sender,\r\n normalized.timestamp\r\n );\r\n };\r\n typing = () => {\r\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\r\n };\r\n\r\n update(settings: AgentSettings): void {\r\n const { name, avatar } = settings;\r\n if (avatar === null) {\r\n this.avatar = undefined;\r\n } else if (avatar) {\r\n this.avatar = avatar;\r\n }\r\n\r\n if (name === null) {\r\n this.name = undefined;\r\n } else if (name) {\r\n this.name = name;\r\n }\r\n }\r\n}\r\n","import {\r\n Container,\r\n EventListener,\r\n EventObject,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\nimport { Agent, AgentSettings } from './agent';\r\nimport {\r\n CancelLoaderDelegate,\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n} from './conversation-controller';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n} from './types';\r\n\r\nexport class ConversationProvider {\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n public user: any;\r\n\r\n private constructor(\r\n public name: string,\r\n private container: Container,\r\n public controller: ConversationController | null\r\n ) {\r\n this.user = controller?.user;\r\n }\r\n\r\n static create(name: string, container: Container, controller: ConversationController) {\r\n return new ConversationProvider(name, container, controller);\r\n }\r\n\r\n createAgent(settings: AgentSettings = {}): Agent | undefined {\r\n if (this.controller) {\r\n return new Agent(this, settings);\r\n }\r\n }\r\n\r\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\r\n return this.controller?.print(settings);\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n return this.controller?.setTypingState(sender, type);\r\n }\r\n\r\n loading(): CancelLoaderDelegate {\r\n if (!this.controller) {\r\n return () => () => {};\r\n }\r\n return this.controller.loader();\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ) {\r\n return this.controller?.createEntry(key, content, type, sender, timestamp);\r\n }\r\n\r\n dispose() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log(`conversation-provider: dispose (${this.name})`);\r\n }\r\n this.controller?.disposeProvider(this);\r\n this.controller = null;\r\n this.subscriptions.forEach((unsub) => unsub());\r\n }\r\n\r\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.onUnreadMessage(fn);\r\n this.subscriptions.push(unsubscribe);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n\r\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.events.subscribe(\r\n 'conversation:component-mount-changed',\r\n fn\r\n );\r\n this.subscriptions.push(unsubscribe);\r\n fn({} as EventObject, this.controller.getComponentMountedState());\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default ConversationProvider;\r\n","import {\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationMessageSettings } from './types';\r\n\r\nexport class User {\r\n constructor(private controller: ConversationController) {}\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n return this.controller.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.User,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n}\r\n","import { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConversationMessageUpdateSettings,\r\n ConverstationMessageItem,\r\n NormalizedMessageSettings,\r\n} from './types';\r\nimport { User } from './user';\r\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\r\n\r\nexport type FormHandlers = { [key: string]: FormHandler };\r\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\r\n\r\nexport type CancelLoaderDelegate = () => void;\r\n\r\nexport class ConversationEntry {\r\n constructor(private writer: EntryWriter) {}\r\n\r\n update(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n const normalized = this.getNormalizedSettings(content);\r\n // const normalized = typeof content === 'string' ? { body: content } : content;\r\n this.writer(<ConversationMessageUpdateSettings>normalized);\r\n }\r\n\r\n remove() {\r\n this.writer(null);\r\n }\r\n\r\n private getNormalizedSettings(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n if (typeof content === 'string') return { body: content };\r\n else if (content.length > -1 && typeof content === 'object') return { items: content };\r\n else return content;\r\n }\r\n}\r\n\r\nexport enum ConversationMessageType {\r\n User = 'user',\r\n Agent = 'agent',\r\n System = 'system',\r\n}\r\n\r\nexport type ConversationMessage = {\r\n key: string;\r\n timestamp: number | null;\r\n content: ConversationMessageContent | null;\r\n sender: ConversationMessageSender | null;\r\n type: ConversationMessageType;\r\n};\r\n\r\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\r\n\r\nexport const getNormalizedMessageSettings = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n): NormalizedMessageSettings => {\r\n let content: ConversationMessageContent;\r\n let key = uuid();\r\n let timestamp: number | null = Date.now();\r\n\r\n if (Array.isArray(settings) && settings.length > -1) {\r\n if (typeof settings[0] === 'string') {\r\n content = { items: [<ConverstationMessageItem<any>>settings] };\r\n } else {\r\n content = { items: <ConverstationMessageItem<any>[]>settings };\r\n }\r\n } else if (typeof settings === 'string') {\r\n content = { body: settings };\r\n } else {\r\n settings = <ConversationMessageSettings>settings || {};\r\n\r\n if (settings.type) {\r\n content = {\r\n ...(<any>settings),\r\n };\r\n } else {\r\n content = {\r\n body: settings.body,\r\n actions: settings.actions,\r\n title: settings.title,\r\n };\r\n if (settings.key) {\r\n key = settings.key;\r\n }\r\n if (settings.timestamp) {\r\n timestamp = settings.timestamp;\r\n }\r\n if (settings.form) {\r\n const builder = FormBuilder.create(key);\r\n settings.form(builder);\r\n const builtForm = builder.get();\r\n content.form = builtForm;\r\n }\r\n if (settings.timestamp === null) {\r\n timestamp = null;\r\n }\r\n }\r\n }\r\n return { content, key, timestamp };\r\n};\r\n\r\nconst removeTypingState = (\r\n typingActors: ConversationMessageSender[],\r\n sender?: ConversationMessageSender\r\n) => {\r\n if (!sender) {\r\n return;\r\n }\r\n const senderString = JSON.stringify(sender);\r\n const indexToRemove = typingActors.findIndex((item) => {\r\n return senderString === JSON.stringify(item);\r\n });\r\n if (indexToRemove > -1) {\r\n return typingActors.splice(indexToRemove, 1);\r\n }\r\n};\r\n\r\n/**\r\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\r\n * access to it as well as exposing emitted actions.\r\n */\r\nexport class ConversationController {\r\n formHandlers: FormHandlers = {};\r\n\r\n /**\r\n * Represents the current end user.\r\n */\r\n user: User = new User(this);\r\n\r\n events: EventManager;\r\n\r\n providers: string[] = [];\r\n\r\n active: boolean = false;\r\n\r\n private registeredProviders: ConversationProvider[] = [];\r\n\r\n private loaders: number = 0;\r\n private componentMounted: boolean = false;\r\n\r\n messages: ConversationMessage[] = [];\r\n private typingActors: ConversationMessageSender[] = [];\r\n\r\n constructor(public container: Container, public id: string) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n setProviders(providers: string[]) {\r\n const removed: string[] = [];\r\n const added: string[] = [];\r\n\r\n // remove\r\n this.providers\r\n .reduce<string[]>((acc, provider) => {\r\n if (providers.indexOf(provider) === -1) {\r\n acc.push(provider);\r\n }\r\n return acc;\r\n }, [])\r\n .forEach((providerToRemove) => {\r\n const indexToRemove = this.providers.indexOf(providerToRemove);\r\n if (indexToRemove > -1) {\r\n removed.push(providerToRemove);\r\n this.providers.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n // add\r\n providers.forEach((provider) => {\r\n if (this.providers.indexOf(provider) === -1) {\r\n added.push(provider);\r\n this.providers.push(provider);\r\n }\r\n });\r\n\r\n if (added.length || removed.length) {\r\n this.events.dispatch('conversation:providers-changed', { added, removed });\r\n }\r\n }\r\n\r\n createProvider(name: string): ConversationProvider {\r\n const index = this.providerIndex(name);\r\n if (index > -1) {\r\n return this.registeredProviders[index];\r\n }\r\n const provider = ConversationProvider.create(name, this.container, this);\r\n this.registeredProviders.push(provider);\r\n return provider;\r\n }\r\n\r\n providerIndex(name: string) {\r\n return this.registeredProviders.findIndex((p) => p.name === name);\r\n }\r\n\r\n dispose() {\r\n this.registeredProviders.forEach((provider) => provider.dispose());\r\n this.messages = [];\r\n this.events.dispatch('conversation:controller-disposed', this);\r\n this.active = false;\r\n }\r\n\r\n onDispose(fn: EventListener) {\r\n return this.events.subscribe('conversation:controller-disposed', fn);\r\n }\r\n\r\n onStarted(fn: EventListener) {\r\n return this.events.subscribe('conversation:started', fn);\r\n }\r\n\r\n disposeProvider(target: ConversationProvider) {\r\n const index = this.providerIndex(target.name);\r\n index > -1 && this.registeredProviders.splice(index, 1);\r\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\r\n if (!this.registeredProviders.length) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n onProvidersChange(fn: EventListener) {\r\n return this.events.subscribe('conversation:providers-changed', fn);\r\n }\r\n\r\n setComponentMountedState(mounted: boolean) {\r\n if (this.componentMounted === mounted) {\r\n return;\r\n }\r\n this.componentMounted = mounted;\r\n if (mounted) {\r\n this.events.dispatch('conversation:unread-message', false);\r\n this.events.dispatch('conversation:started', true);\r\n this.active = true;\r\n }\r\n this.events.dispatch('conversation:component-mount-changed', mounted);\r\n }\r\n\r\n getComponentMountedState() {\r\n return this.componentMounted;\r\n }\r\n\r\n onUnreadMessage(fn: EventListener) {\r\n return this.events.subscribe('conversation:unread-message', fn);\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ): ConversationEntry {\r\n const message: ConversationMessage = {\r\n key,\r\n content,\r\n type,\r\n sender: sender || null,\r\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\r\n };\r\n this.messages.push(message);\r\n message.type === ConversationMessageType.Agent &&\r\n removeTypingState(this.typingActors, sender);\r\n const entry = new ConversationEntry((updated) => {\r\n if (updated !== null) {\r\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\r\n message.content = content;\r\n if (updatedTimestamp) {\r\n message.timestamp = updatedTimestamp;\r\n }\r\n } else {\r\n const indexToRemove = this.messages.indexOf(message);\r\n message.content = null;\r\n if (indexToRemove > -1) {\r\n this.messages.splice(indexToRemove, 1);\r\n }\r\n }\r\n this.events.dispatch('conversation:message-updated', { message });\r\n this.update();\r\n });\r\n this.events.dispatch('conversation:message-created', { message });\r\n this.update();\r\n if (!this.componentMounted) {\r\n this.events.dispatch('conversation:unread-message', true);\r\n }\r\n return entry;\r\n }\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.System,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n\r\n update() {\r\n this.events.dispatch('conversation:updated', {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n });\r\n }\r\n\r\n getMessageStream() {\r\n return {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n };\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n if (this.typingActors.indexOf(sender) === -1) {\r\n this.typingActors.push(sender);\r\n this.update();\r\n }\r\n\r\n return () => {\r\n removeTypingState(this.typingActors, sender);\r\n this.update();\r\n };\r\n }\r\n\r\n /**\r\n * Displays a loader in the conversation.\r\n */\r\n loader(): CancelLoaderDelegate {\r\n this.loaders = this.loaders + 1;\r\n let dismissed = false;\r\n if (this.loaders === 1) {\r\n this.update();\r\n }\r\n return () => {\r\n if (!dismissed) {\r\n dismissed = true;\r\n this.loaders = this.loaders - 1;\r\n if (this.loaders === 0) {\r\n this.update();\r\n }\r\n }\r\n };\r\n }\r\n\r\n submitForm(key: string, handler: SubmitHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\r\n }\r\n\r\n validateForm(key: string, handler: ValidateHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\r\n }\r\n}\r\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\r\nimport { closeAllModals } from '@telia-ace/widget-plugins';\r\nimport {\r\n createStorageWriter,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageScope,\r\n} from '@telia-ace/widget-services';\r\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\r\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\r\n\r\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\r\n const mainWidgetName = widgetName.split('_contact');\r\n return implementation.widgets.get(mainWidgetName[0]);\r\n};\r\n\r\nconst getSeparateWidget = (container: Container) => {\r\n const originWidget = container.get('$widget');\r\n const { name, implementation }: Widget = container.get('$widget');\r\n\r\n const mainWidget =\r\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\r\n const { data }: WidgetSettings = container.get('$settings');\r\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\r\n const chatWidgetName = `${name\r\n .replace('_contact-method', '')\r\n .replace('_contact', '')}_contact-method`;\r\n\r\n const chatWidget = implementation.widgets.get(chatWidgetName);\r\n if (chatWidget && !trigger) {\r\n return { chatWidget, mainWidget, data };\r\n }\r\n return { mainWidget, data };\r\n};\r\n\r\nexport const shouldPreventDefault = (container: Container) => {\r\n const { chatWidget } = getSeparateWidget(container);\r\n return !!chatWidget;\r\n};\r\n\r\nexport const openChatWidget = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n triggerDOMTarget?: HTMLElement\r\n) => {\r\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\r\n\r\n if (chatWidget) {\r\n if (chatWidget.state === 'activated') {\r\n return chatWidget.invoke('open').then(() => {\r\n chatWidget.container.getAsync('conversation').then((conversation) => {\r\n conversation\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => closeAllModals(container));\r\n });\r\n });\r\n }\r\n return chatWidget\r\n .activate()\r\n .then(() => {\r\n const { trigger } = chatWidget.container.get('$settings');\r\n trigger.action = 'hide'; // could be default in configuration\r\n return chatWidget\r\n .invoke('setSettings', () => ({\r\n data,\r\n trigger,\r\n activate: true,\r\n }))\r\n .then(() => {\r\n return chatWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n /**\r\n * Could cause issues if target widget is no longer as specific for this use case\r\n */\r\n const contactMethodsQuery = components\r\n .components()\r\n .ofType('contact-method');\r\n components.write({\r\n key: 'setContactMethodId',\r\n attributes: {\r\n properties: {\r\n id: contactMethod.id,\r\n guideId: contactMethod.guideId,\r\n },\r\n },\r\n target: contactMethodsQuery,\r\n provider: 'localStorage',\r\n });\r\n const conversationsQuery = components\r\n .components()\r\n .ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: {\r\n properties: { providers: [contactMethod.clientName] },\r\n },\r\n target: conversationsQuery,\r\n provider: 'localStorage',\r\n });\r\n });\r\n });\r\n })\r\n .then(() => {\r\n return chatWidget.invoke('attach', {\r\n key: 'contact-method',\r\n triggerDOMElement: triggerDOMTarget,\r\n withRenderState: 'open',\r\n });\r\n })\r\n .then(() => {\r\n createStorageWriter(\r\n chatWidget.container,\r\n 'activeStickyWidget',\r\n StorageCategory.Necessary,\r\n {\r\n medium: StorageMedium.Local,\r\n scope: StorageScope.Implementation,\r\n }\r\n ).then((write) => write(chatWidget.name));\r\n\r\n return chatWidget.container\r\n .getAsync('conversation')\r\n .then((platform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\r\n })\r\n .then(() => closeAllModals(container))\r\n .then(() => false);\r\n });\r\n }\r\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n return platform\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\r\n });\r\n return chatWidget ? false : true;\r\n};\r\n\r\nexport const navigateToConversation = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n routeName = 'conversation'\r\n) => {\r\n const { mainWidget, chatWidget } = getSeparateWidget(container);\r\n if (chatWidget) {\r\n return chatWidget.container.getAsync('router').then((router: any) => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n }\r\n\r\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\r\n mainWidget.container.getAsync('router').then((router: any) => {\r\n mainWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n const conversationQuery = components.components().ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: { properties: { providers: [contactMethod.clientName] } },\r\n target: conversationQuery,\r\n provider: 'localStorage',\r\n });\r\n })\r\n .then(() => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n });\r\n });\r\n });\r\n};\r\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\r\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageWriter,\r\n} from '@telia-ace/widget-services';\r\nimport { lock } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ConversationController } from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\r\n\r\nconst STORAGE_KEY = 'conversations';\r\n\r\nexport type ConversationHandler = (\r\n conversation: ConversationProvider,\r\n component: ComponentNodeController\r\n) => void | (() => void);\r\n\r\nexport type UnregisterControllerDelegate = () => void;\r\n\r\nexport type ConversationProviderRegistration = {\r\n name: string;\r\n handler: ConversationHandler;\r\n};\r\n\r\nexport enum ConversationEndedBehavior {\r\n Deactivate = 'deactivate',\r\n Navigate = 'navigate',\r\n None = 'none',\r\n}\r\n\r\nexport type SessionInfo = {\r\n id?: string;\r\n route?: RouteData;\r\n conversationEndedBehavior?: ConversationEndedBehavior;\r\n};\r\n\r\nexport class ConversationPlatform {\r\n events: EventManager;\r\n private controllers: {\r\n conversation: ConversationController;\r\n component: ComponentNodeController;\r\n }[] = [];\r\n private providers: ConversationProviderRegistration[] = [];\r\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private storageWriter: StorageWriter | null = null;\r\n private router: RoutingService | null = null;\r\n private buttonQuery: ComponentQuery | null = null;\r\n private sessionInfo: SessionInfo | null = null;\r\n\r\n constructor(private container: Container, private components: ComponentPlatform) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n initialize() {\r\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }).then((writer) => (this.storageWriter = writer));\r\n\r\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n this.buttonQuery = this.components\r\n .components()\r\n .ofType('conversation-return-button');\r\n if (storedSession) {\r\n this.sessionInfo = storedSession;\r\n if (storedSession.id && storedSession.route) {\r\n this.writeToComponents({ active: true, alert: { show: false } });\r\n }\r\n }\r\n }\r\n );\r\n this.container.getAsync('router').then((router) => (this.router = router));\r\n this.events.subscribe('conversation:ended', (event, data) => {\r\n switch (this.sessionInfo?.conversationEndedBehavior) {\r\n case ConversationEndedBehavior.Deactivate:\r\n const widget: Widget = this.container.get('$widget');\r\n widget.deactivate();\r\n break;\r\n case ConversationEndedBehavior.Navigate:\r\n const initialRoute = this.router?.getInitialRoute();\r\n if (initialRoute) {\r\n this.router?.navigate(initialRoute.name);\r\n }\r\n break;\r\n case ConversationEndedBehavior.None:\r\n default:\r\n break;\r\n }\r\n this.writeToComponents({ active: false });\r\n this.sessionInfo = null;\r\n this.storageWriter && this.storageWriter();\r\n });\r\n }\r\n\r\n addSubscription(sub: EventSubscriptionCancellation) {\r\n this.subscriptions.push(sub);\r\n }\r\n\r\n static getInstance(\r\n container: Container,\r\n key: string = 'conversation'\r\n ): Promise<ConversationPlatform> {\r\n return lock(container)(() => {\r\n return container.getAsync(key).then((value: ConversationPlatform) => {\r\n let conversation = value;\r\n if (!conversation) {\r\n return ComponentPlatform.getInstance(container).then((components) => {\r\n conversation = new ConversationPlatform(container, components);\r\n conversation.initialize();\r\n container.registerAsync(key, () => conversation);\r\n return conversation;\r\n });\r\n }\r\n return conversation;\r\n });\r\n });\r\n }\r\n\r\n navigateToConversationIfActive(id: string): Promise<void> {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n if (storedSession && storedSession.id === id) {\r\n if (storedSession.route) {\r\n const { name, params } = storedSession.route;\r\n this.router?.navigate(name, params);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => {\r\n let storedSession = stored;\r\n if (storedSession) {\r\n storedSession.conversationEndedBehavior = behavior;\r\n } else {\r\n storedSession = { conversationEndedBehavior: behavior };\r\n }\r\n this.sessionInfo = storedSession;\r\n return (\r\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\r\n Promise.resolve()\r\n );\r\n }\r\n );\r\n }\r\n\r\n createController(id: string) {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\r\n if (index > -1) {\r\n return this.controllers[index].conversation;\r\n }\r\n return new ConversationController(this.container, id);\r\n }\r\n\r\n registerProvider(name: string, handler: ConversationHandler): void {\r\n const provider = {\r\n name,\r\n handler,\r\n };\r\n this.providers.push(provider);\r\n // execute provider for all matching controllers\r\n this.controllers\r\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\r\n .forEach((controller) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n\r\n registerController(\r\n conversation: ConversationController,\r\n component: ComponentNodeController\r\n ): boolean {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\r\n let controller: any;\r\n if (index < 0) {\r\n controller = { conversation, component };\r\n this.controllers.push(controller);\r\n const invokeHandlers = (providers: string[]) => {\r\n if (providers) {\r\n this.providers\r\n .filter((provider) => providers.indexOf(provider.name) > -1)\r\n .forEach((provider) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n };\r\n\r\n this.subscriptions.push(\r\n conversation.onDispose((event, data) => {\r\n const index = this.controllers.findIndex((c) => c.conversation === data);\r\n index > -1 && this.controllers.splice(index, 1);\r\n this.components\r\n .components()\r\n .ofType('conversation-return-button')\r\n .select()\r\n .writeProperties({ active: false });\r\n\r\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\r\n })\r\n );\r\n this.subscriptions.push(\r\n conversation.onProvidersChange((event, data) => {\r\n const { added, removed }: { added: string[]; removed: string[] } = data;\r\n removed.forEach((removedProvider) => {\r\n this.disposeProviders[removedProvider].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n invokeHandlers(added);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onStarted((event, isActive) => {\r\n const session: SessionInfo = {\r\n id: conversation.id,\r\n route: this.router?.getRouteData(),\r\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\r\n };\r\n this.sessionInfo = session;\r\n this.storageWriter && this.storageWriter(session);\r\n\r\n this.writeToComponents({ active: isActive });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onUnreadMessage((event, data) => {\r\n this.events.dispatch('conversation:unread-message', data);\r\n this.writeToComponents({ alert: { show: data } });\r\n })\r\n );\r\n\r\n invokeHandlers(conversation.providers);\r\n return true;\r\n }\r\n controller = this.controllers[index];\r\n return false;\r\n }\r\n\r\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\r\n if (this.buttonQuery) {\r\n this.components.write({\r\n key: 'conversationReturnButtonState',\r\n attributes: { properties },\r\n target: this.buttonQuery,\r\n provider: 'localStorage',\r\n });\r\n }\r\n }\r\n\r\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\r\n const dispose = provider.handler(\r\n controller.conversation.createProvider(provider.name),\r\n controller.component\r\n );\r\n if (dispose) {\r\n if (!this.disposeProviders[provider.name]) {\r\n this.disposeProviders[provider.name] = [];\r\n }\r\n this.disposeProviders[provider.name].push(dispose);\r\n }\r\n }\r\n\r\n getComponentRoute() {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => stored?.route\r\n );\r\n }\r\n\r\n dispose() {\r\n Object.keys(this.disposeProviders).forEach((key) => {\r\n this.disposeProviders[key].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n this.subscriptions.forEach((unsubscribe) => {\r\n unsubscribe();\r\n });\r\n this.controllers = [];\r\n this.providers = [];\r\n }\r\n\r\n public static async handleContactMethodClick(\r\n event: any,\r\n container: Container,\r\n contactMethod: any,\r\n callback?: Function\r\n ) {\r\n if (shouldPreventDefault(container)) {\r\n event.preventDefault();\r\n let triggerEl = document.getElementById('humany-dynamic-anchor');\r\n if (!triggerEl) {\r\n triggerEl = document.createElement('a');\r\n triggerEl.setAttribute('href', '#');\r\n triggerEl.id = 'humany-dynamic-anchor';\r\n document.body.appendChild(triggerEl);\r\n }\r\n openChatWidget(container, contactMethod, triggerEl);\r\n }\r\n openChatWidget(container, contactMethod);\r\n }\r\n\r\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\r\n return navigateToConversation(container, contactMethod);\r\n }\r\n}\r\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\n\r\nexport type ConversationMessageSettings = {\r\n key?: string;\r\n timestamp?: number;\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n form?: (builder: FormBuilder) => void;\r\n type?: string;\r\n items?: ConversationMessageList[];\r\n [key: string]: any;\r\n};\r\n\r\nexport type NormalizedMessageSettings = {\r\n content: ConversationMessageContent;\r\n key: string;\r\n timestamp: number | null;\r\n};\r\n\r\nexport type ConversationMessageList = {\r\n header?: string;\r\n itemKey: string;\r\n type?: ConversationMessageListType;\r\n items: ConversationMessageListItem[];\r\n};\r\n\r\nexport type ConversationMessageListItem = {\r\n icon?: string;\r\n type?: ConversationMessageListItemType;\r\n actions?: { [actionKey: string]: any };\r\n form?: Form;\r\n body?: string;\r\n key: string;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConversationMessageContent = {\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n items?: ConverstationMessageItem<any>[];\r\n form?: Form;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\r\n\r\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\r\n timestamp?: number;\r\n};\r\n\r\nexport type ConversationMessageSender = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport enum ConversationMessageListType {\r\n Ordinary = 'ordinary',\r\n Seperator = 'seperator',\r\n}\r\n\r\nexport enum ConversationMessageListItemType {\r\n Header = 'header',\r\n LinkList = 'link-list',\r\n Separator = 'separator',\r\n NoGoodAlternative = 'no-good-alternative',\r\n ButtonList = 'button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n FeedbackList = 'feedback-list',\r\n}\r\n\r\ntype LinkListItem = [\r\n ConversationMessageListItemType.LinkList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HeaderItem = [ConversationMessageListItemType.Header, string];\r\ntype TextItem = [ConversationMessageListItemType.Text, string];\r\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\r\ntype NoGoodAlternativeItem = [\r\n ConversationMessageListItemType.NoGoodAlternative,\r\n {\r\n body: string;\r\n }\r\n];\r\ntype ButtonListItem = [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype FeedbackListItem = [\r\n ConversationMessageListItemType.FeedbackList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HTMLItem = [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: string;\r\n }\r\n];\r\n\r\ntype ItemPayload =\r\n | LinkListItem\r\n | HeaderItem\r\n | TextItem\r\n | SeparatorItem\r\n | NoGoodAlternativeItem\r\n | ButtonListItem\r\n | HTMLItem\r\n | FeedbackListItem;\r\n","import { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationPlatform } from '../../conversation-platform';\r\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\r\n\r\nexport type BundledConversationMessage = {\r\n timestamp: number;\r\n content: [BundledMessageContent];\r\n sender: ConversationMessageSender;\r\n type: ConversationMessageType;\r\n};\r\n\r\ntype BundledMessageContent = {\r\n key: string;\r\n} & ConversationMessageContent;\r\n\r\nexport type ConversationContent = {\r\n loading: boolean;\r\n typingActors: ConversationMessageSender[];\r\n messages: ConversationMessage[];\r\n};\r\n\r\n/**\r\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\r\n * Put this as a property on either the component or on the provider?\r\n * Could possibly be implemented directly in the createEntry method\r\n * of the conversation controller to avoid iterating over the entire array on\r\n * each update.\r\n */\r\nconst groupedMessages = (\r\n messages: ConversationMessage[],\r\n timeout?: number\r\n): BundledConversationMessage[] => {\r\n return messages.reduce((acc: any[], current: any, index: number) => {\r\n const newItem = {\r\n ...current,\r\n content: [{ ...current.content, key: current.key }],\r\n };\r\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\r\n const previous = acc[acc.length - 1];\r\n if (\r\n (!timeout && timeout !== 0) ||\r\n Math.abs(previous.timestamp - current.timestamp) < timeout\r\n ) {\r\n if (\r\n previous.sender?.name === current.sender?.name &&\r\n previous.type === current.type\r\n ) {\r\n previous.timestamp = current.timestamp;\r\n previous.content.push({ ...current.content, key: current.key });\r\n return acc;\r\n }\r\n }\r\n }\r\n acc.push(newItem);\r\n return acc;\r\n }, []);\r\n};\r\n\r\nexport type ConversationComponentProperties = {\r\n providers: string[];\r\n messages: BundledConversationMessage[]; // internal\r\n loading: boolean;\r\n inputPlaceholder: string;\r\n inputDisabled: boolean;\r\n inputHidden: boolean;\r\n inputMultiline: boolean;\r\n userLabel: string;\r\n avatarSize: string;\r\n typingActors: any[]; // internal\r\n sendButtonLabel: string;\r\n secondaryAction?: { icon?: string; action: string; label: string };\r\n};\r\n\r\nconst ConversationComponent = (container: Container) => {\r\n return Promise.all([\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation',\r\n import('./conversation'),\r\n (component) => {\r\n const routeData = router.getRouteData();\r\n const name = routeData.params.id || component.node.name || 'component';\r\n const conversation = platform.createController(name);\r\n const isNewController = platform.registerController(conversation, component);\r\n\r\n const messageGroupingTimeout = 3 * 60 * 1000;\r\n\r\n const setProperties = (properties: ConversationComponentProperties) => {\r\n const { providers = [] } = properties;\r\n if (providers) {\r\n const providerKeys = Array.isArray(providers) ? providers : [providers];\r\n conversation.setProviders(providerKeys);\r\n return providerKeys;\r\n }\r\n };\r\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\r\n\r\n conversation.setComponentMountedState(true);\r\n\r\n const writeMessages = (messageStream: any) => {\r\n const { loading, typingActors, messages } = messageStream;\r\n component.writeProperties({\r\n loading,\r\n typingActors,\r\n messages: groupedMessages(messages, messageGroupingTimeout),\r\n });\r\n };\r\n\r\n writeMessages(conversation.getMessageStream());\r\n\r\n if (isNewController) {\r\n // todo: dont create actions here, there will be duplicates due to reuseController = true\r\n component.actions.create('user-submit', (data, options) => {\r\n if (options) {\r\n const { preventDefault, validationPromise } = options;\r\n if (preventDefault) {\r\n if (validationPromise) {\r\n validationPromise().then((text: string) => {\r\n if (text) {\r\n conversation.user.print(text);\r\n }\r\n });\r\n }\r\n return;\r\n }\r\n }\r\n conversation.user.print(data.text);\r\n });\r\n\r\n component.actions.create('user-typing', (data, options) => {});\r\n\r\n component.actions.create('form', (data, options) => {});\r\n\r\n component.actions.create('action', (data, options) => {});\r\n }\r\n\r\n const unsubscribe = conversation.events.subscribe(\r\n 'conversation:updated',\r\n (e: any, conversationData: ConversationContent) => {\r\n writeMessages(conversationData);\r\n }\r\n );\r\n\r\n return () => {\r\n conversation.setComponentMountedState(false);\r\n unsubscribe();\r\n if (!conversation.active) {\r\n // unregisterController();\r\n // todo: add possibility to dispose this through extendComponent()\r\n // component.dispose();\r\n writeMessages({ messages: [], typingActors: [], loading: false });\r\n }\r\n };\r\n },\r\n { reuseController: true }\r\n );\r\n });\r\n};\r\n\r\nexport default ConversationComponent;\r\n","import { ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationPlatform } from '../../';\r\n\r\nexport enum ButtonMode {\r\n flat = 'flat',\r\n flashing = 'flashing',\r\n flashingGradient = 'flashingGradient',\r\n}\r\n\r\nexport type ReturnButtonProps = {\r\n label: string;\r\n active: boolean;\r\n mode: ButtonMode;\r\n alert?: {\r\n symbol?: Symbol;\r\n show?: boolean;\r\n label?: string;\r\n };\r\n};\r\n\r\nconst ConversationReturnButtonComponent = (container: Container) => {\r\n return Promise.all([\r\n ComponentPlatform.getInstance(container),\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(\r\n ([components, platform, router]: [\r\n ComponentPlatform,\r\n ConversationPlatform,\r\n RoutingService\r\n ]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation-return-button',\r\n import('./return-button'),\r\n (component) => {\r\n component.actions.create('toggle', (options = {}) => {\r\n platform.getComponentRoute()?.then((route) => {\r\n route && router.navigate(route.name, route.params);\r\n });\r\n });\r\n }\r\n );\r\n }\r\n );\r\n};\r\n\r\nexport default ConversationReturnButtonComponent;\r\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { lazy } from 'react';\r\nimport { ConversationPlatform } from '..';\r\n\r\nexport const registerCustomMessageComponent = (\r\n container: Container,\r\n type: string,\r\n component: ReactComponent\r\n) => {\r\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n platform.addSubscription(\r\n o.registerComponent(\r\n type,\r\n lazy(() => component)\r\n )\r\n );\r\n });\r\n};\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/user.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/utils/custom-message.ts","../src/conversation-platform.ts","../src/types.ts","../src/ui/conversation/conversation-component.ts","../src/ui/return-button/return-button-component.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\r\nimport {\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConverstationMessageItem,\r\n} from './types';\r\n\r\nexport type AgentSettings = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport class Agent {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n\r\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\r\n this.name = settings.name;\r\n this.avatar = settings.avatar;\r\n }\r\n\r\n print = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ): ConversationEntry | undefined => {\r\n const sender: ConversationMessageSender = { name: this.name, avatar: this.avatar };\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.provider.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.Agent,\r\n sender,\r\n normalized.timestamp\r\n );\r\n };\r\n typing = () => {\r\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\r\n };\r\n\r\n update(settings: AgentSettings): void {\r\n const { name, avatar } = settings;\r\n if (avatar === null) {\r\n this.avatar = undefined;\r\n } else if (avatar) {\r\n this.avatar = avatar;\r\n }\r\n\r\n if (name === null) {\r\n this.name = undefined;\r\n } else if (name) {\r\n this.name = name;\r\n }\r\n }\r\n}\r\n","import {\r\n Container,\r\n EventListener,\r\n EventObject,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\nimport { Agent, AgentSettings } from './agent';\r\nimport {\r\n CancelLoaderDelegate,\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n} from './conversation-controller';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n} from './types';\r\n\r\nexport class ConversationProvider {\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n public user: any;\r\n\r\n private constructor(\r\n public name: string,\r\n private container: Container,\r\n public controller: ConversationController | null\r\n ) {\r\n this.user = controller?.user;\r\n }\r\n\r\n static create(name: string, container: Container, controller: ConversationController) {\r\n return new ConversationProvider(name, container, controller);\r\n }\r\n\r\n createAgent(settings: AgentSettings = {}): Agent | undefined {\r\n if (this.controller) {\r\n return new Agent(this, settings);\r\n }\r\n }\r\n\r\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\r\n return this.controller?.print(settings);\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n return this.controller?.setTypingState(sender, type);\r\n }\r\n\r\n loading(): CancelLoaderDelegate {\r\n if (!this.controller) {\r\n return () => () => {};\r\n }\r\n return this.controller.loader();\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ) {\r\n return this.controller?.createEntry(key, content, type, sender, timestamp);\r\n }\r\n\r\n dispose() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log(`conversation-provider: dispose (${this.name})`);\r\n }\r\n this.controller?.disposeProvider(this);\r\n this.controller = null;\r\n this.subscriptions.forEach((unsub) => unsub());\r\n }\r\n\r\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.onUnreadMessage(fn);\r\n this.subscriptions.push(unsubscribe);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n\r\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.events.subscribe(\r\n 'conversation:component-mount-changed',\r\n fn\r\n );\r\n this.subscriptions.push(unsubscribe);\r\n fn({} as EventObject, this.controller.getComponentMountedState());\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default ConversationProvider;\r\n","import {\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationMessageSettings } from './types';\r\n\r\nexport class User {\r\n constructor(private controller: ConversationController) {}\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n return this.controller.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.User,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n}\r\n","import { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConversationMessageUpdateSettings,\r\n ConverstationMessageItem,\r\n NormalizedMessageSettings,\r\n} from './types';\r\nimport { User } from './user';\r\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\r\n\r\nexport type FormHandlers = { [key: string]: FormHandler };\r\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\r\n\r\nexport type CancelLoaderDelegate = () => void;\r\n\r\nexport class ConversationEntry {\r\n constructor(private writer: EntryWriter) {}\r\n\r\n update(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n const normalized = this.getNormalizedSettings(content);\r\n // const normalized = typeof content === 'string' ? { body: content } : content;\r\n this.writer(<ConversationMessageUpdateSettings>normalized);\r\n }\r\n\r\n remove() {\r\n this.writer(null);\r\n }\r\n\r\n private getNormalizedSettings(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n if (typeof content === 'string') return { body: content };\r\n else if (content.length > -1 && typeof content === 'object') return { items: content };\r\n else return content;\r\n }\r\n}\r\n\r\nexport enum ConversationMessageType {\r\n User = 'user',\r\n Agent = 'agent',\r\n System = 'system',\r\n}\r\n\r\nexport type ConversationMessage = {\r\n key: string;\r\n timestamp: number | null;\r\n content: ConversationMessageContent | null;\r\n sender: ConversationMessageSender | null;\r\n type: ConversationMessageType;\r\n};\r\n\r\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\r\n\r\nexport const getNormalizedMessageSettings = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n): NormalizedMessageSettings => {\r\n let content: ConversationMessageContent;\r\n let key = uuid();\r\n let timestamp: number | null = Date.now();\r\n\r\n if (Array.isArray(settings) && settings.length > -1) {\r\n if (typeof settings[0] === 'string') {\r\n content = { items: [<ConverstationMessageItem<any>>settings] };\r\n } else {\r\n content = { items: <ConverstationMessageItem<any>[]>settings };\r\n }\r\n } else if (typeof settings === 'string') {\r\n content = { body: settings };\r\n } else {\r\n settings = <ConversationMessageSettings>settings || {};\r\n\r\n if (settings.type) {\r\n content = {\r\n ...(<any>settings),\r\n };\r\n } else {\r\n content = {\r\n body: settings.body,\r\n actions: settings.actions,\r\n title: settings.title,\r\n };\r\n if (settings.key) {\r\n key = settings.key;\r\n }\r\n if (settings.timestamp) {\r\n timestamp = settings.timestamp;\r\n }\r\n if (settings.form) {\r\n const builder = FormBuilder.create(key);\r\n settings.form(builder);\r\n const builtForm = builder.get();\r\n content.form = builtForm;\r\n }\r\n if (settings.timestamp === null) {\r\n timestamp = null;\r\n }\r\n }\r\n }\r\n return { content, key, timestamp };\r\n};\r\n\r\nconst removeTypingState = (\r\n typingActors: ConversationMessageSender[],\r\n sender?: ConversationMessageSender\r\n) => {\r\n if (!sender) {\r\n return;\r\n }\r\n const senderString = JSON.stringify(sender);\r\n const indexToRemove = typingActors.findIndex((item) => {\r\n return senderString === JSON.stringify(item);\r\n });\r\n if (indexToRemove > -1) {\r\n return typingActors.splice(indexToRemove, 1);\r\n }\r\n};\r\n\r\n/**\r\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\r\n * access to it as well as exposing emitted actions.\r\n */\r\nexport class ConversationController {\r\n formHandlers: FormHandlers = {};\r\n\r\n /**\r\n * Represents the current end user.\r\n */\r\n user: User = new User(this);\r\n\r\n events: EventManager;\r\n\r\n providers: string[] = [];\r\n\r\n active: boolean = false;\r\n\r\n private registeredProviders: ConversationProvider[] = [];\r\n\r\n private loaders: number = 0;\r\n private componentMounted: boolean = false;\r\n\r\n messages: ConversationMessage[] = [];\r\n private typingActors: ConversationMessageSender[] = [];\r\n\r\n constructor(public container: Container, public id: string) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n setProviders(providers: string[]) {\r\n const removed: string[] = [];\r\n const added: string[] = [];\r\n\r\n // remove\r\n this.providers\r\n .reduce<string[]>((acc, provider) => {\r\n if (providers.indexOf(provider) === -1) {\r\n acc.push(provider);\r\n }\r\n return acc;\r\n }, [])\r\n .forEach((providerToRemove) => {\r\n const indexToRemove = this.providers.indexOf(providerToRemove);\r\n if (indexToRemove > -1) {\r\n removed.push(providerToRemove);\r\n this.providers.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n // add\r\n providers.forEach((provider) => {\r\n if (this.providers.indexOf(provider) === -1) {\r\n added.push(provider);\r\n this.providers.push(provider);\r\n }\r\n });\r\n\r\n if (added.length || removed.length) {\r\n this.events.dispatch('conversation:providers-changed', { added, removed });\r\n }\r\n }\r\n\r\n createProvider(name: string): ConversationProvider {\r\n const index = this.providerIndex(name);\r\n if (index > -1) {\r\n return this.registeredProviders[index];\r\n }\r\n const provider = ConversationProvider.create(name, this.container, this);\r\n this.registeredProviders.push(provider);\r\n return provider;\r\n }\r\n\r\n providerIndex(name: string) {\r\n return this.registeredProviders.findIndex((p) => p.name === name);\r\n }\r\n\r\n dispose() {\r\n this.registeredProviders.forEach((provider) => provider.dispose());\r\n this.messages = [];\r\n this.events.dispatch('conversation:controller-disposed', this);\r\n this.active = false;\r\n }\r\n\r\n onDispose(fn: EventListener) {\r\n return this.events.subscribe('conversation:controller-disposed', fn);\r\n }\r\n\r\n onStarted(fn: EventListener) {\r\n return this.events.subscribe('conversation:started', fn);\r\n }\r\n\r\n disposeProvider(target: ConversationProvider) {\r\n const index = this.providerIndex(target.name);\r\n index > -1 && this.registeredProviders.splice(index, 1);\r\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\r\n if (!this.registeredProviders.length) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n onProvidersChange(fn: EventListener) {\r\n return this.events.subscribe('conversation:providers-changed', fn);\r\n }\r\n\r\n setComponentMountedState(mounted: boolean) {\r\n if (this.componentMounted === mounted) {\r\n return;\r\n }\r\n this.componentMounted = mounted;\r\n if (mounted) {\r\n this.events.dispatch('conversation:unread-message', false);\r\n this.events.dispatch('conversation:started', true);\r\n this.active = true;\r\n }\r\n this.events.dispatch('conversation:component-mount-changed', mounted);\r\n }\r\n\r\n getComponentMountedState() {\r\n return this.componentMounted;\r\n }\r\n\r\n onUnreadMessage(fn: EventListener) {\r\n return this.events.subscribe('conversation:unread-message', fn);\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ): ConversationEntry {\r\n const message: ConversationMessage = {\r\n key,\r\n content,\r\n type,\r\n sender: sender || null,\r\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\r\n };\r\n this.messages.push(message);\r\n message.type === ConversationMessageType.Agent &&\r\n removeTypingState(this.typingActors, sender);\r\n const entry = new ConversationEntry((updated) => {\r\n if (updated !== null) {\r\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\r\n message.content = content;\r\n if (updatedTimestamp) {\r\n message.timestamp = updatedTimestamp;\r\n }\r\n } else {\r\n const indexToRemove = this.messages.indexOf(message);\r\n message.content = null;\r\n if (indexToRemove > -1) {\r\n this.messages.splice(indexToRemove, 1);\r\n }\r\n }\r\n this.events.dispatch('conversation:message-updated', { message });\r\n this.update();\r\n });\r\n this.events.dispatch('conversation:message-created', { message });\r\n this.update();\r\n if (!this.componentMounted) {\r\n this.events.dispatch('conversation:unread-message', true);\r\n }\r\n return entry;\r\n }\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.System,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n\r\n update() {\r\n this.events.dispatch('conversation:updated', {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n });\r\n }\r\n\r\n getMessageStream() {\r\n return {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n };\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n if (this.typingActors.indexOf(sender) === -1) {\r\n this.typingActors.push(sender);\r\n this.update();\r\n }\r\n\r\n return () => {\r\n removeTypingState(this.typingActors, sender);\r\n this.update();\r\n };\r\n }\r\n\r\n /**\r\n * Displays a loader in the conversation.\r\n */\r\n loader(): CancelLoaderDelegate {\r\n this.loaders = this.loaders + 1;\r\n let dismissed = false;\r\n if (this.loaders === 1) {\r\n this.update();\r\n }\r\n return () => {\r\n if (!dismissed) {\r\n dismissed = true;\r\n this.loaders = this.loaders - 1;\r\n if (this.loaders === 0) {\r\n this.update();\r\n }\r\n }\r\n };\r\n }\r\n\r\n submitForm(key: string, handler: SubmitHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\r\n }\r\n\r\n validateForm(key: string, handler: ValidateHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\r\n }\r\n}\r\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\r\nimport { closeAllModals } from '@telia-ace/widget-plugins';\r\nimport {\r\n createStorageWriter,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageScope,\r\n} from '@telia-ace/widget-services';\r\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\r\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\r\n\r\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\r\n const mainWidgetName = widgetName.split('_contact');\r\n return implementation.widgets.get(mainWidgetName[0]);\r\n};\r\n\r\nconst getSeparateWidget = (container: Container) => {\r\n const originWidget = container.get('$widget');\r\n const { name, implementation }: Widget = container.get('$widget');\r\n\r\n const mainWidget =\r\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\r\n const { data }: WidgetSettings = container.get('$settings');\r\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\r\n const chatWidgetName = `${name\r\n .replace('_contact-method', '')\r\n .replace('_contact', '')}_contact-method`;\r\n\r\n const chatWidget = implementation.widgets.get(chatWidgetName);\r\n if (chatWidget && !trigger) {\r\n return { chatWidget, mainWidget, data };\r\n }\r\n return { mainWidget, data };\r\n};\r\n\r\nexport const shouldPreventDefault = (container: Container) => {\r\n const { chatWidget } = getSeparateWidget(container);\r\n return !!chatWidget;\r\n};\r\n\r\nexport const openChatWidget = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n triggerDOMTarget?: HTMLElement\r\n) => {\r\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\r\n\r\n if (chatWidget) {\r\n if (chatWidget.state === 'activated') {\r\n return chatWidget.invoke('open').then(() => {\r\n chatWidget.container.getAsync('conversation').then((conversation) => {\r\n conversation\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => closeAllModals(container));\r\n });\r\n });\r\n }\r\n return chatWidget\r\n .activate()\r\n .then(() => {\r\n const { trigger } = chatWidget.container.get('$settings');\r\n trigger.action = 'hide'; // could be default in configuration\r\n return chatWidget\r\n .invoke('setSettings', () => ({\r\n data,\r\n trigger,\r\n activate: true,\r\n }))\r\n .then(() => {\r\n return chatWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n /**\r\n * Could cause issues if target widget is no longer as specific for this use case\r\n */\r\n const contactMethodsQuery = components\r\n .components()\r\n .ofType('contact-method');\r\n components.write({\r\n key: 'setContactMethodId',\r\n attributes: {\r\n properties: {\r\n id: contactMethod.id,\r\n guideId: contactMethod.guideId,\r\n },\r\n },\r\n target: contactMethodsQuery,\r\n provider: 'localStorage',\r\n });\r\n const conversationsQuery = components\r\n .components()\r\n .ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: {\r\n properties: { providers: [contactMethod.clientName] },\r\n },\r\n target: conversationsQuery,\r\n provider: 'localStorage',\r\n });\r\n });\r\n });\r\n })\r\n .then(() => {\r\n return chatWidget.invoke('attach', {\r\n key: 'contact-method',\r\n triggerDOMElement: triggerDOMTarget,\r\n withRenderState: 'open',\r\n });\r\n })\r\n .then(() => {\r\n createStorageWriter(\r\n chatWidget.container,\r\n 'activeStickyWidget',\r\n StorageCategory.Necessary,\r\n {\r\n medium: StorageMedium.Local,\r\n scope: StorageScope.Implementation,\r\n }\r\n ).then((write) => write(chatWidget.name));\r\n\r\n return chatWidget.container\r\n .getAsync('conversation')\r\n .then((platform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\r\n })\r\n .then(() => closeAllModals(container))\r\n .then(() => false);\r\n });\r\n }\r\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n return platform\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\r\n });\r\n return chatWidget ? false : true;\r\n};\r\n\r\nexport const navigateToConversation = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n routeName = 'conversation'\r\n) => {\r\n const { mainWidget, chatWidget } = getSeparateWidget(container);\r\n if (chatWidget) {\r\n return chatWidget.container.getAsync('router').then((router: any) => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n }\r\n\r\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\r\n mainWidget.container.getAsync('router').then((router: any) => {\r\n mainWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n const conversationQuery = components.components().ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: { properties: { providers: [contactMethod.clientName] } },\r\n target: conversationQuery,\r\n provider: 'localStorage',\r\n });\r\n })\r\n .then(() => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n });\r\n });\r\n });\r\n};\r\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { lazy } from 'react';\r\nimport { ConversationPlatform } from '..';\r\n\r\nexport const registerCustomMessageComponent = (\r\n container: Container,\r\n type: string,\r\n component: ReactComponent\r\n) => {\r\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n platform.addSubscription(\r\n o.registerComponent(\r\n type,\r\n lazy(() => component)\r\n )\r\n );\r\n });\r\n};\r\n","import {\r\n ComponentNodeController,\r\n ComponentPlatform,\r\n ComponentQuery,\r\n ReactComponent,\r\n} from '@telia-ace/widget-core';\r\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageWriter,\r\n} from '@telia-ace/widget-services';\r\nimport { lock } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ConversationController } from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\r\nimport { registerCustomMessageComponent } from './utils/custom-message';\r\n\r\nconst STORAGE_KEY = 'conversations';\r\n\r\nexport type ConversationHandler = (\r\n conversation: ConversationProvider,\r\n component: ComponentNodeController\r\n) => void | (() => void);\r\n\r\nexport type UnregisterControllerDelegate = () => void;\r\n\r\nexport type ConversationProviderRegistration = {\r\n name: string;\r\n handler: ConversationHandler;\r\n};\r\n\r\nexport enum ConversationEndedBehavior {\r\n Deactivate = 'deactivate',\r\n Navigate = 'navigate',\r\n None = 'none',\r\n}\r\n\r\nexport type SessionInfo = {\r\n id?: string;\r\n route?: RouteData;\r\n conversationEndedBehavior?: ConversationEndedBehavior;\r\n};\r\n\r\nexport class ConversationPlatform {\r\n events: EventManager;\r\n private controllers: {\r\n conversation: ConversationController;\r\n component: ComponentNodeController;\r\n }[] = [];\r\n private providers: ConversationProviderRegistration[] = [];\r\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private storageWriter: StorageWriter | null = null;\r\n private router: RoutingService | null = null;\r\n private buttonQuery: ComponentQuery | null = null;\r\n private sessionInfo: SessionInfo | null = null;\r\n\r\n constructor(private container: Container, private components: ComponentPlatform) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n initialize() {\r\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }).then((writer) => (this.storageWriter = writer));\r\n\r\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n this.buttonQuery = this.components\r\n .components()\r\n .ofType('conversation-return-button');\r\n if (storedSession) {\r\n this.sessionInfo = storedSession;\r\n if (storedSession.id && storedSession.route) {\r\n this.writeToComponents({ active: true, alert: { show: false } });\r\n }\r\n }\r\n }\r\n );\r\n this.container.getAsync('router').then((router) => (this.router = router));\r\n this.events.subscribe('conversation:ended', (event, data) => {\r\n switch (this.sessionInfo?.conversationEndedBehavior) {\r\n case ConversationEndedBehavior.Deactivate:\r\n const widget: Widget = this.container.get('$widget');\r\n widget.deactivate();\r\n break;\r\n case ConversationEndedBehavior.Navigate:\r\n const initialRoute = this.router?.getInitialRoute();\r\n if (initialRoute) {\r\n this.router?.navigate(initialRoute.name);\r\n }\r\n break;\r\n case ConversationEndedBehavior.None:\r\n default:\r\n break;\r\n }\r\n this.writeToComponents({ active: false });\r\n this.sessionInfo = null;\r\n this.storageWriter && this.storageWriter();\r\n });\r\n }\r\n\r\n addSubscription(sub: EventSubscriptionCancellation) {\r\n this.subscriptions.push(sub);\r\n }\r\n\r\n static getInstance(\r\n container: Container,\r\n key: string = 'conversation'\r\n ): Promise<ConversationPlatform> {\r\n return lock(container)(() => {\r\n return container.getAsync(key).then((value: ConversationPlatform) => {\r\n let conversation = value;\r\n if (!conversation) {\r\n return ComponentPlatform.getInstance(container).then((components) => {\r\n conversation = new ConversationPlatform(container, components);\r\n conversation.initialize();\r\n container.registerAsync(key, () => conversation);\r\n return conversation;\r\n });\r\n }\r\n return conversation;\r\n });\r\n });\r\n }\r\n\r\n navigateToConversationIfActive(id: string): Promise<void> {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n if (storedSession && storedSession.id === id) {\r\n if (storedSession.route) {\r\n const { name, params } = storedSession.route;\r\n this.router?.navigate(name, params);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => {\r\n let storedSession = stored;\r\n if (storedSession) {\r\n storedSession.conversationEndedBehavior = behavior;\r\n } else {\r\n storedSession = { conversationEndedBehavior: behavior };\r\n }\r\n this.sessionInfo = storedSession;\r\n return (\r\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\r\n Promise.resolve()\r\n );\r\n }\r\n );\r\n }\r\n\r\n createController(id: string) {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\r\n if (index > -1) {\r\n return this.controllers[index].conversation;\r\n }\r\n return new ConversationController(this.container, id);\r\n }\r\n\r\n registerConversationItem(name: string, component: ReactComponent) {\r\n return registerCustomMessageComponent(this.container, name, component);\r\n }\r\n\r\n registerProvider(name: string, handler: ConversationHandler): void {\r\n const provider = {\r\n name,\r\n handler,\r\n };\r\n this.providers.push(provider);\r\n // execute provider for all matching controllers\r\n this.controllers\r\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\r\n .forEach((controller) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n\r\n registerController(\r\n conversation: ConversationController,\r\n component: ComponentNodeController\r\n ): boolean {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\r\n let controller: any;\r\n if (index < 0) {\r\n controller = { conversation, component };\r\n this.controllers.push(controller);\r\n const invokeHandlers = (providers: string[]) => {\r\n if (providers) {\r\n this.providers\r\n .filter((provider) => providers.indexOf(provider.name) > -1)\r\n .forEach((provider) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n };\r\n\r\n this.subscriptions.push(\r\n conversation.onDispose((event, data) => {\r\n const index = this.controllers.findIndex((c) => c.conversation === data);\r\n index > -1 && this.controllers.splice(index, 1);\r\n this.components\r\n .components()\r\n .ofType('conversation-return-button')\r\n .select()\r\n .writeProperties({ active: false });\r\n\r\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\r\n })\r\n );\r\n this.subscriptions.push(\r\n conversation.onProvidersChange((event, data) => {\r\n const { added, removed }: { added: string[]; removed: string[] } = data;\r\n removed.forEach((removedProvider) => {\r\n this.disposeProviders[removedProvider].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n invokeHandlers(added);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onStarted((event, isActive) => {\r\n const session: SessionInfo = {\r\n id: conversation.id,\r\n route: this.router?.getRouteData(),\r\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\r\n };\r\n this.sessionInfo = session;\r\n this.storageWriter && this.storageWriter(session);\r\n\r\n this.writeToComponents({ active: isActive });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onUnreadMessage((event, data) => {\r\n this.events.dispatch('conversation:unread-message', data);\r\n this.writeToComponents({ alert: { show: data } });\r\n })\r\n );\r\n\r\n invokeHandlers(conversation.providers);\r\n return true;\r\n }\r\n controller = this.controllers[index];\r\n return false;\r\n }\r\n\r\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\r\n if (this.buttonQuery) {\r\n this.components.write({\r\n key: 'conversationReturnButtonState',\r\n attributes: { properties },\r\n target: this.buttonQuery,\r\n provider: 'localStorage',\r\n });\r\n }\r\n }\r\n\r\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\r\n const dispose = provider.handler(\r\n controller.conversation.createProvider(provider.name),\r\n controller.component\r\n );\r\n if (dispose) {\r\n if (!this.disposeProviders[provider.name]) {\r\n this.disposeProviders[provider.name] = [];\r\n }\r\n this.disposeProviders[provider.name].push(dispose);\r\n }\r\n }\r\n\r\n getComponentRoute() {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => stored?.route\r\n );\r\n }\r\n\r\n dispose() {\r\n Object.keys(this.disposeProviders).forEach((key) => {\r\n this.disposeProviders[key].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n this.subscriptions.forEach((unsubscribe) => {\r\n unsubscribe();\r\n });\r\n this.controllers = [];\r\n this.providers = [];\r\n }\r\n\r\n public static async handleContactMethodClick(\r\n event: any,\r\n container: Container,\r\n contactMethod: any,\r\n callback?: Function\r\n ) {\r\n if (shouldPreventDefault(container)) {\r\n event.preventDefault();\r\n let triggerEl = document.getElementById('humany-dynamic-anchor');\r\n if (!triggerEl) {\r\n triggerEl = document.createElement('a');\r\n triggerEl.setAttribute('href', '#');\r\n triggerEl.id = 'humany-dynamic-anchor';\r\n document.body.appendChild(triggerEl);\r\n }\r\n openChatWidget(container, contactMethod, triggerEl);\r\n }\r\n openChatWidget(container, contactMethod);\r\n }\r\n\r\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\r\n return navigateToConversation(container, contactMethod);\r\n }\r\n}\r\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\n\r\nexport type ConversationMessageSettings = {\r\n key?: string;\r\n timestamp?: number;\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n form?: (builder: FormBuilder) => void;\r\n type?: string;\r\n items?: ConversationMessageList[];\r\n [key: string]: any;\r\n};\r\n\r\nexport type NormalizedMessageSettings = {\r\n content: ConversationMessageContent;\r\n key: string;\r\n timestamp: number | null;\r\n};\r\n\r\nexport type ConversationMessageList = {\r\n header?: string;\r\n itemKey: string;\r\n type?: ConversationMessageListType;\r\n items: ConversationMessageListItem[];\r\n};\r\n\r\nexport type ConversationMessageListItem = {\r\n icon?: string;\r\n type?: ConversationMessageListItemType;\r\n actions?: { [actionKey: string]: any };\r\n form?: Form;\r\n body?: string;\r\n key: string;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConversationMessageContent = {\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n items?: ConverstationMessageItem<any>[];\r\n form?: Form;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\r\n\r\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\r\n timestamp?: number;\r\n};\r\n\r\nexport type ConversationMessageSender = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport enum ConversationMessageListType {\r\n Ordinary = 'ordinary',\r\n Seperator = 'seperator',\r\n}\r\n\r\nexport enum ConversationMessageListItemType {\r\n Header = 'header',\r\n LinkList = 'link-list',\r\n Separator = 'separator',\r\n ButtonList = 'button-list',\r\n CategoryButtonList = 'category-button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n}\r\n\r\ntype CategoryButton = {\r\n action: string;\r\n symbol: any;\r\n label: string;\r\n};\r\n\r\ntype LinkListItem = [\r\n ConversationMessageListItemType.LinkList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HeaderItem = [ConversationMessageListItemType.Header, string];\r\ntype TextItem = [ConversationMessageListItemType.Text, string];\r\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\r\ntype ButtonListItem = [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HTMLItem = [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: string;\r\n }\r\n];\r\n\r\ntype ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem | ButtonListItem | HTMLItem;\r\n","import { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationPlatform } from '../../conversation-platform';\r\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\r\n\r\nexport type BundledConversationMessage = {\r\n timestamp: number;\r\n content: [BundledMessageContent];\r\n sender: ConversationMessageSender;\r\n type: ConversationMessageType;\r\n};\r\n\r\ntype BundledMessageContent = {\r\n key: string;\r\n} & ConversationMessageContent;\r\n\r\nexport type ConversationContent = {\r\n loading: boolean;\r\n typingActors: ConversationMessageSender[];\r\n messages: ConversationMessage[];\r\n};\r\n\r\n/**\r\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\r\n * Put this as a property on either the component or on the provider?\r\n * Could possibly be implemented directly in the createEntry method\r\n * of the conversation controller to avoid iterating over the entire array on\r\n * each update.\r\n */\r\nconst groupedMessages = (\r\n messages: ConversationMessage[],\r\n timeout?: number\r\n): BundledConversationMessage[] => {\r\n return messages.reduce((acc: any[], current: any, index: number) => {\r\n const newItem = {\r\n ...current,\r\n content: [{ ...current.content, key: current.key }],\r\n };\r\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\r\n const previous = acc[acc.length - 1];\r\n if (\r\n (!timeout && timeout !== 0) ||\r\n Math.abs(previous.timestamp - current.timestamp) < timeout\r\n ) {\r\n if (\r\n previous.sender?.name === current.sender?.name &&\r\n previous.type === current.type\r\n ) {\r\n previous.timestamp = current.timestamp;\r\n previous.content.push({ ...current.content, key: current.key });\r\n return acc;\r\n }\r\n }\r\n }\r\n acc.push(newItem);\r\n return acc;\r\n }, []);\r\n};\r\n\r\nexport type ConversationComponentProperties = {\r\n providers: string[];\r\n messages: BundledConversationMessage[]; // internal\r\n loading: boolean;\r\n inputPlaceholder: string;\r\n inputDisabled: boolean;\r\n inputHidden: boolean;\r\n inputMultiline: boolean;\r\n userLabel: string;\r\n avatarSize: string;\r\n typingActors: any[]; // internal\r\n sendButtonLabel: string;\r\n secondaryAction?: { icon?: string; action: string; label: string };\r\n};\r\n\r\nconst ConversationComponent = (container: Container) => {\r\n return Promise.all([\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation',\r\n import('./conversation'),\r\n (component) => {\r\n const routeData = router.getRouteData();\r\n const name = routeData.params.id || component.node.name || 'component';\r\n const conversation = platform.createController(name);\r\n const isNewController = platform.registerController(conversation, component);\r\n\r\n const messageGroupingTimeout = 3 * 60 * 1000;\r\n\r\n const setProperties = (properties: ConversationComponentProperties) => {\r\n const { providers = [] } = properties;\r\n if (providers) {\r\n const providerKeys = Array.isArray(providers) ? providers : [providers];\r\n conversation.setProviders(providerKeys);\r\n return providerKeys;\r\n }\r\n };\r\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\r\n\r\n conversation.setComponentMountedState(true);\r\n\r\n const writeMessages = (messageStream: any) => {\r\n const { loading, typingActors, messages } = messageStream;\r\n component.writeProperties({\r\n loading,\r\n typingActors,\r\n messages: groupedMessages(messages, messageGroupingTimeout),\r\n });\r\n };\r\n\r\n writeMessages(conversation.getMessageStream());\r\n\r\n if (isNewController) {\r\n // todo: dont create actions here, there will be duplicates due to reuseController = true\r\n component.actions.create('user-submit', (data, options) => {\r\n if (options) {\r\n const { preventDefault, validationPromise } = options;\r\n if (preventDefault) {\r\n if (validationPromise) {\r\n validationPromise().then((text: string) => {\r\n if (text) {\r\n conversation.user.print(text);\r\n }\r\n });\r\n }\r\n return;\r\n }\r\n }\r\n conversation.user.print(data.text);\r\n });\r\n\r\n component.actions.create('user-typing', (data, options) => {});\r\n\r\n component.actions.create('form', (data, options) => {});\r\n\r\n component.actions.create('action', (data, options) => {});\r\n }\r\n\r\n const unsubscribe = conversation.events.subscribe(\r\n 'conversation:updated',\r\n (e: any, conversationData: ConversationContent) => {\r\n writeMessages(conversationData);\r\n }\r\n );\r\n\r\n return () => {\r\n conversation.setComponentMountedState(false);\r\n unsubscribe();\r\n if (!conversation.active) {\r\n // unregisterController();\r\n // todo: add possibility to dispose this through extendComponent()\r\n // component.dispose();\r\n writeMessages({ messages: [], typingActors: [], loading: false });\r\n }\r\n };\r\n },\r\n { reuseController: true }\r\n );\r\n });\r\n};\r\n\r\nexport default ConversationComponent;\r\n","import { ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationPlatform } from '../../';\r\n\r\nexport enum ButtonMode {\r\n flat = 'flat',\r\n flashing = 'flashing',\r\n flashingGradient = 'flashingGradient',\r\n}\r\n\r\nexport type ReturnButtonProps = {\r\n label: string;\r\n active: boolean;\r\n mode: ButtonMode;\r\n alert?: {\r\n symbol?: Symbol;\r\n show?: boolean;\r\n label?: string;\r\n };\r\n};\r\n\r\nconst ConversationReturnButtonComponent = (container: Container) => {\r\n return Promise.all([\r\n ComponentPlatform.getInstance(container),\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(\r\n ([components, platform, router]: [\r\n ComponentPlatform,\r\n ConversationPlatform,\r\n RoutingService\r\n ]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation-return-button',\r\n import('./return-button'),\r\n (component) => {\r\n component.actions.create('toggle', (options = {}) => {\r\n platform.getComponentRoute()?.then((route) => {\r\n route && router.navigate(route.name, route.params);\r\n });\r\n });\r\n }\r\n );\r\n }\r\n );\r\n};\r\n\r\nexport default ConversationReturnButtonComponent;\r\n"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -61,11 +61,10 @@ export declare enum ConversationMessageListItemType {
|
|
|
61
61
|
Header = "header",
|
|
62
62
|
LinkList = "link-list",
|
|
63
63
|
Separator = "separator",
|
|
64
|
-
NoGoodAlternative = "no-good-alternative",
|
|
65
64
|
ButtonList = "button-list",
|
|
65
|
+
CategoryButtonList = "category-button-list",
|
|
66
66
|
Text = "text",
|
|
67
|
-
HTML = "html"
|
|
68
|
-
FeedbackList = "feedback-list"
|
|
67
|
+
HTML = "html"
|
|
69
68
|
}
|
|
70
69
|
declare type LinkListItem = [
|
|
71
70
|
ConversationMessageListItemType.LinkList,
|
|
@@ -78,12 +77,6 @@ declare type LinkListItem = [
|
|
|
78
77
|
declare type HeaderItem = [ConversationMessageListItemType.Header, string];
|
|
79
78
|
declare type TextItem = [ConversationMessageListItemType.Text, string];
|
|
80
79
|
declare type SeparatorItem = [ConversationMessageListItemType.Separator, undefined];
|
|
81
|
-
declare type NoGoodAlternativeItem = [
|
|
82
|
-
ConversationMessageListItemType.NoGoodAlternative,
|
|
83
|
-
{
|
|
84
|
-
body: string;
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
80
|
declare type ButtonListItem = [
|
|
88
81
|
ConversationMessageListItemType.ButtonList,
|
|
89
82
|
{
|
|
@@ -92,19 +85,11 @@ declare type ButtonListItem = [
|
|
|
92
85
|
};
|
|
93
86
|
}
|
|
94
87
|
];
|
|
95
|
-
declare type FeedbackListItem = [
|
|
96
|
-
ConversationMessageListItemType.FeedbackList,
|
|
97
|
-
{
|
|
98
|
-
actions: {
|
|
99
|
-
[key: string]: string;
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
];
|
|
103
88
|
declare type HTMLItem = [
|
|
104
89
|
ConversationMessageListItemType.HTML,
|
|
105
90
|
{
|
|
106
91
|
body: string;
|
|
107
92
|
}
|
|
108
93
|
];
|
|
109
|
-
declare type ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem |
|
|
94
|
+
declare type ItemPayload = LinkListItem | HeaderItem | TextItem | SeparatorItem | ButtonListItem | HTMLItem;
|
|
110
95
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/widget-conversation",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "ACE Widget Conversation Platform",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@telia-ace/widget-core": "^1.0.
|
|
28
|
-
"@telia-ace/widget-forms": "^1.0.
|
|
29
|
-
"@telia-ace/widget-plugins": "^1.0.
|
|
30
|
-
"@telia-ace/widget-routing": "^1.0.
|
|
31
|
-
"@telia-ace/widget-services": "^1.0.
|
|
32
|
-
"@telia-ace/widget-ui": "^1.0.
|
|
33
|
-
"@telia-ace/widget-utilities": "^1.0.
|
|
27
|
+
"@telia-ace/widget-core": "^1.0.8",
|
|
28
|
+
"@telia-ace/widget-forms": "^1.0.12",
|
|
29
|
+
"@telia-ace/widget-plugins": "^1.0.9",
|
|
30
|
+
"@telia-ace/widget-routing": "^1.0.9",
|
|
31
|
+
"@telia-ace/widget-services": "^1.0.8",
|
|
32
|
+
"@telia-ace/widget-ui": "^1.0.12",
|
|
33
|
+
"@telia-ace/widget-utilities": "^1.0.2",
|
|
34
34
|
"@webprovisions/platform": "^1.1.2"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/react": "^16.8.0"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "58ed2317a3d94d1eaae4747035949447e0a31d54"
|
|
44
44
|
}
|