@telia-ace/widget-conversation 1.0.41 → 1.0.42
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.
|
@@ -49,7 +49,7 @@ export declare const StyledForm: import("@emotion/styled").StyledComponent<{
|
|
|
49
49
|
theme?: Theme | undefined;
|
|
50
50
|
}, {}, {}>;
|
|
51
51
|
export declare const StyledHtml: import("@emotion/styled").StyledComponent<any, {}, {}>;
|
|
52
|
-
export declare const StyledActionList: import("@emotion/styled").StyledComponent<
|
|
52
|
+
export declare const StyledActionList: import("@emotion/styled").StyledComponent<Omit<import("@telia-ace/widget-ui").ListProps, "ref"> & import("react").RefAttributes<HTMLUListElement> & {
|
|
53
53
|
theme?: Theme | undefined;
|
|
54
54
|
}, {}, {}>;
|
|
55
55
|
export declare const StyledActionButton: import("@emotion/styled").StyledComponent<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-5f8374bf.js","sources":["../src/components/conversation/ui/input.tsx","../src/components/conversation/ui/styles.tsx","../src/components/conversation/ui/loader.tsx","../src/components/conversation/ui/message-types/timestamp.tsx","../src/components/conversation/ui/message-types/agent.tsx","../src/components/conversation/ui/message-types/system.tsx","../src/components/conversation/ui/message-types/user.tsx","../src/utils/map-actions.ts","../src/components/conversation/ui/message-list-items/button-list.tsx","../src/components/conversation/ui/message-list-items/custom.tsx","../src/components/conversation/ui/message-list-items/html.tsx","../src/components/conversation/ui/message-list-items/item-list.tsx","../src/components/conversation/ui/message-list-items/link-list.tsx","../src/components/conversation/ui/message-list-items/separator.tsx","../src/components/conversation/ui/message-list-items/text.tsx","../src/components/conversation/ui/message-list-items/video-request.tsx","../src/components/conversation/ui/message-types/message-list.tsx","../src/components/conversation/ui/message.tsx","../src/components/conversation/ui/content.tsx","../src/components/conversation/ui/overlay-outlets.tsx","../src/components/conversation/conversation.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n Input,\n SymbolBadge,\n useDispatch,\n useIsTabbing,\n useProperties,\n useScroll,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useEffect, useState } from 'react';\nimport { ConversationComponentProperties } from '../plugin';\n\ntype Props = {\n className?: string;\n};\n\nconst ConversationInput: React.FC<Props> = ({ className }) => {\n const [inputText, setInputText] = useState('');\n const [inputFocus, setInputFocus] = useState(false);\n const [calculatedLineHeight, setCalculatedLineHeight] = useState(0);\n const [textareaMaxHeight, setTextareaMaxHeight] = useState(0);\n const isTabbing = useIsTabbing();\n const dispatch = useDispatch();\n const {\n inputPlaceholder = 'Type your message',\n inputHidden = false,\n inputDisabled = false,\n sendButtonLabel = 'Send message',\n inputMultiline: multiline = true,\n secondaryAction,\n } = useProperties<ConversationComponentProperties>();\n const [scrollableCss, inputRef] = useScroll(true);\n\n useEffect(() => {\n if (inputRef.current) {\n const { lineHeight, maxHeight } = getComputedStyle(inputRef.current);\n if (lineHeight && lineHeight.indexOf('px') > -1) {\n const lineHeightNumber = lineHeight.split('px');\n const calcLH = parseInt(lineHeightNumber[0], 10);\n setCalculatedLineHeight(calcLH);\n const maxHeightNumber = maxHeight.split('px');\n setTextareaMaxHeight(parseInt(maxHeightNumber[0], 10));\n }\n }\n }, [inputRef.current]);\n\n const submit = (e: any) => {\n if (!e.shiftKey || !multiline) {\n e.preventDefault();\n if (inputText && inputText.length > 0) {\n dispatch('user-submit', { text: inputText });\n setInputText('');\n onChange('');\n }\n } else if (inputText.length < 1) {\n e.preventDefault();\n }\n };\n\n const onSecondaryActionButtonClick = (e: any) => {\n if (!secondaryAction) {\n return;\n }\n e.preventDefault();\n dispatch('action', {\n actionKey: secondaryAction.action,\n ...secondaryAction,\n });\n };\n\n const calculateHeight = (value: string) => {\n if (multiline && inputRef.current) {\n const scrollHeight = inputRef.current.scrollHeight;\n if (scrollHeight > calculatedLineHeight) {\n inputRef.current.style.height = 'auto';\n let areaHeight = scrollHeight;\n if (value.length < 1) {\n areaHeight = calculatedLineHeight;\n }\n inputRef.current.style.height = `${areaHeight}px`;\n\n if (areaHeight >= textareaMaxHeight) {\n inputRef.current.style.overflowY = 'scroll';\n } else {\n inputRef.current.style.overflowY = 'hidden';\n }\n }\n }\n };\n\n const onChange = (value: string) => {\n calculateHeight(value);\n setInputText(value);\n if (value && value.length > 0) {\n dispatch('user-typing', { textLength: value.length });\n }\n };\n\n if (inputHidden) {\n return null;\n }\n\n return (\n <Wrapper\n grow={multiline}\n className={appendClassNames('humany-conversation-input', className)}\n data-has-focus={inputFocus}\n scrollableCss={scrollableCss}\n isTabbing={isTabbing}\n >\n {secondaryAction && (\n <SecondaryActionButton\n disabled={inputDisabled}\n onClick={onSecondaryActionButtonClick}\n title={secondaryAction.label}\n aria-label={secondaryAction.label}\n >\n <SymbolBadge\n size={24}\n symbol={{ type: 'Svg', content: secondaryAction.icon || 'browse' }}\n />\n </SecondaryActionButton>\n )}\n {multiline ? (\n <StyledTextArea\n value={inputText}\n onChange={onChange}\n onEnter={submit}\n disabled={inputDisabled}\n aria-label={inputPlaceholder}\n placeholder={inputPlaceholder}\n onFocusChange={setInputFocus}\n type={'textarea'}\n rows={1}\n ref={inputRef}\n />\n ) : (\n <StyledInput\n value={inputText}\n onChange={onChange}\n onEnter={submit}\n disabled={inputDisabled}\n aria-label={inputPlaceholder}\n placeholder={inputPlaceholder}\n onFocusChange={setInputFocus}\n />\n )}\n <StyledButton\n disabled={inputDisabled}\n onClick={submit}\n title={sendButtonLabel}\n aria-label={sendButtonLabel}\n >\n <SendSymbol\n size={22}\n symbol={{ type: 'Svg', content: 'send' }}\n hasContent={!!inputText && !!inputText.length}\n />\n </StyledButton>\n </Wrapper>\n );\n};\n\nconst StyledTextArea = styled(Input)<any>`\n resize: none;\n flex: 1;\n flex-shrink: 1;\n min-height: 1.2em;\n max-height: 148px;\n line-height: 1.2em;\n height: 1.2em;\n padding: 0;\n margin: ${(p) => p.theme.sizes?.medium};\n font-size: ${(p) => p.theme.fonts?.normal};\n border: none;\n transition: height 200ms linear;\n outline: none;\n`;\n\nconst StyledInput = styled(Input)<any>`\n flex: 1;\n border: none;\n background-color: transparent;\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n line-height: 1.2em;\n outline: none;\n padding: ${(p) => p.theme.sizes?.medium};\n color: ${(p) => p.theme.colors?.text};\n &::placeholder {\n color: ${(p) => p.theme.colors?.textLight};\n font-style: italic;\n }\n`;\n\nconst StyledButton = styled(Button)<any>`\n flex: 0 0 50px;\n align-self: stretch;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n color: #a6a6a6;\n &:focus-visible {\n ${borderTabStyle};\n }\n`;\n\nconst SecondaryActionButton = styled(StyledButton)`\n border-right: ${(p) => p.theme.border};\n margin: ${(p) => p.theme.sizes?.normal} 0;\n`;\n\nconst Wrapper = styled.div<{ 'data-has-focus': boolean } & any>`\n ${(p) =>\n p.grow\n ? css`\n min-height: 50px;\n max-height: 150px;\n `\n : css`\n height: 50px;\n `}\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n background-color: ${(p) => p.theme.colors?.accent};\n border-top: ${(p) => p.theme.inputBorder};\n ${(p) => p['data-has-focus'] && p.isTabbing && borderTabStyle}\n textarea {\n ${(p) => !!p.scrollableCss && p.scrollableCss}\n }\n`;\n\nconst SendSymbol = styled(\n ({\n hasContent,\n ...other\n }: {\n hasContent: boolean;\n size: number;\n symbol: { type: string; content: string };\n }) => <SymbolBadge {...other} />\n)`\n line,\n path {\n stroke: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\n fill: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\n }\n`;\n\nexport default ConversationInput;\n","import { css, keyframes, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { FormComponent } from '@telia-ace/widget-forms';\nimport {\n borderTabStyle,\n buttonCss,\n Html,\n invertedHoverButton,\n List,\n Typography,\n} from '@telia-ace/widget-ui';\n\nexport const Avatar = styled.div<any>`\n width: ${(p) => p.avatarSize || '32px'};\n height: ${(p) => p.avatarSize || '32px'};\n border-radius: 50%;\n background-color: ${(p) => p.theme.colors?.accent};\n border: ${(p) => p.theme.border};\n grid-area: avatar;\n align-self: flex-end;\n justify-self: center;\n overflow: hidden;\n margin-right: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n color: ${(p) => p.theme.colors?.text};\n\n > img {\n height: 100%;\n width: 100%;\n object-fit: cover;\n }\n\n > svg {\n width: 90%;\n height: 90%;\n padding: 10%;\n color: ${(p) => p.theme.colors?.text};\n\n line,\n path,\n circle,\n fill {\n stroke: ${(p) => p.theme.colors?.text};\n }\n }\n`;\n\nexport const LoaderAnimation = keyframes`\n 0% {\n opacity: 0;\n }\n 75% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n`;\n\nexport const Loader = styled.div`\n display: flex;\n justify-content: center;\n > div {\n height: 10px;\n width: 10px;\n border-radius: 50%;\n margin: 5px;\n background-color: ${(p) => p.theme.colors?.text};\n animation: ${LoaderAnimation} 1s infinite;\n }\n > div:nth-of-type(2) {\n animation-delay: 100ms;\n }\n > div:nth-of-type(3) {\n animation-delay: 200ms;\n }\n`;\n\nexport const ContentBundle = styled.div`\n grid-area: content;\n max-width: 100%;\n overflow: hidden;\n`;\n\nexport const MessageTitle = styled(Typography)`\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: normal;\n margin: 0;\n`;\n\nexport const MessageContainer = styled.div<{ left?: boolean; center?: boolean; right?: boolean }>`\n display: flex;\n ${(p) => p.left && 'justify-content: start;'};\n ${(p) => p.center && 'justify-content: center;'};\n ${(p) => p.right && 'justify-content: end;'};\n`;\n\nexport type Stacked = 'first' | 'last' | 'middle';\n\nexport const MessageContent = styled.div<{\n user?: boolean;\n fullWidth?: boolean;\n stacked?: Stacked;\n padded?: boolean;\n}>`\n ${(p) => p.padded && `padding: ${p.theme.sizes?.medium};`}\n ${(p) => !p.user && p.stacked && nonUserMessageStyling(p.stacked, p.theme)}\n ${(p) => p.user && p.stacked && userMessageStyling(p.stacked, p.theme)}\n\n display: inline-block;\n margin-top: ${(p) => p.theme.sizes?.normal};\n && > * {\n overflow-wrap: break-word;\n word-wrap: break-word;\n word-break: break-all;\n word-break: break-word;\n hyphens: auto;\n }\n max-width: 100%;\n ${(p) => p.fullWidth && 'width: 100%;'}\n`;\n\nconst nonUserMessageStyling = (stacked: Stacked, theme: any) => {\n const colors = css`\n background-color: ${theme.colors?.accent};\n color: ${theme.colors?.text};\n ${theme.border && `border: ${theme.border};`};\n `;\n\n if (!theme.borderRadius) {\n return colors;\n }\n\n return css`\n ${colors}\n\n border-top-right-radius: ${theme.borderRadius};\n border-bottom-right-radius: ${theme.borderRadius};\n\n ${stacked === 'first' &&\n `\n border-top-left-radius: ${theme.borderRadius};\n `}\n\n ${stacked === 'last' &&\n `\n border-bottom-left-radius: ${theme.borderRadius};\n `}\n `;\n};\n\nconst userMessageStyling = (stacked: Stacked, theme: any) => {\n const colors = css`\n background-color: ${theme.colors?.primary};\n color: ${theme.colors?.accent};\n `;\n\n if (!theme.borderRadius) {\n return colors;\n }\n\n return css`\n ${colors}\n\n border-top-left-radius: ${theme.borderRadius};\n border-bottom-left-radius: ${theme.borderRadius};\n\n ${stacked === 'first' &&\n `\n border-top-right-radius: ${theme.borderRadius};\n `}\n\n ${stacked === 'last' &&\n `\n border-bottom-right-radius: ${theme.borderRadius};\n `}\n `;\n};\n\nexport const MessageContentPart = styled.div`\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n &:last-child {\n margin-bottom: 0;\n }\n`;\n\nexport const messageContentPadding = (p: { theme: Theme }) => css`\n margin: ${p.theme.sizes?.medium} 0;\n padding: 0 ${p.theme.sizes?.medium};\n`;\n\nexport const StyledForm = styled(FormComponent)`\n & button.humany-form-component-button {\n ${(p) =>\n p.theme.colors?.primary &&\n p.theme.colors?.accent &&\n invertedHoverButton({\n active: false,\n primaryColor: p.theme.colors?.primary,\n secondaryColor: p.theme.colors?.accent,\n theme: p.theme,\n })};\n display: block;\n width: 100%;\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n }\n & button.humany-form-component-submit {\n width: 100%;\n margin: 0;\n :not(:last-child) {\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n }\n }\n`;\n\nexport const StyledHtml = styled(Html)<any>`\n white-space: pre-wrap;\n a {\n color: ${(p) => p.theme.colors.link};\n &:focus {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\n }\n }\n`;\n\nexport const StyledActionList = styled(List)`\n padding: 0;\n list-style: none;\n margin: 0 -${(p) => p.theme.sizes?.normal};\n > li {\n margin: ${(p) => p.theme.sizes?.normal};\n }\n`;\n\nexport const StyledActionButton = styled.button`\n ${(p) => buttonCss(p)};\n display: block;\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #fff;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n`;\n","import React, { forwardRef } from 'react';\nimport { ConversationMessageSender } from '../../../types';\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './styles';\n\ntype Props = {\n className?: string;\n agentData?: ConversationMessageSender;\n boxed?: boolean;\n};\n\nconst ConversationLoader = forwardRef<HTMLDivElement, Props>(\n ({ boxed, className, agentData }, ref) => {\n return (\n <ContentBundle ref={ref}>\n <MessageContainer left={boxed} center={!boxed}>\n <MessageContent padded={!!boxed} stacked={boxed ? 'first' : undefined}>\n <Loader>\n <div />\n <div />\n <div />\n </Loader>\n </MessageContent>\n </MessageContainer>\n </ContentBundle>\n );\n }\n);\n\nexport default ConversationLoader;\n","import styled from '@emotion/styled';\nimport React from 'react';\n\ntype Props = {\n className?: string;\n name?: string;\n timestamp?: number | null;\n};\n\nconst StyledTimestamp = styled.p`\n && {\n font-size: ${(p) => p.theme.fonts?.small};\n font-weight: 300;\n }\n margin: 0;\n line-height: 1.5em;\n grid-area: info;\n color: ${(p) => p.theme.colors?.text};\n`;\n\nconst getTimestamp = (raw: number) => {\n return new Date(raw).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n};\n\nconst Timestamp: React.FC<Props> = ({ className, name, timestamp }) => {\n if (!name && !timestamp) {\n return null;\n }\n\n let output = '';\n if (name) {\n if (timestamp) {\n output = `${name}: ${getTimestamp(timestamp)}`;\n } else {\n output = name;\n }\n } else if (timestamp) {\n output = getTimestamp(timestamp);\n }\n\n return <StyledTimestamp>{output}</StyledTimestamp>;\n};\n\nexport default Timestamp;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { SymbolBadge, useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationMessageSender } from '../../../../types';\nimport { ConversationComponentProperties } from '../../plugin';\nimport { Avatar } from '../styles';\nimport Timestamp from './timestamp';\n\ntype Props = {\n className?: string;\n children: any;\n sender: ConversationMessageSender;\n timestamp: number | null;\n};\n\nconst AgentMessage: React.FC<Props> = ({ className, children, sender, timestamp }) => {\n const { avatar, name } = sender;\n const { avatarSize } = useProperties<ConversationComponentProperties>();\n\n return (\n <StyledAgentMessage\n hasAvatar={!!avatar}\n className={appendClassNames(className, 'humany-conversation-agent-message')}\n >\n {avatar && (\n <Avatar avatarSize={avatarSize}>\n {typeof avatar === 'string' ? (\n <img src={avatar} />\n ) : (\n <SymbolBadge symbol={avatar} />\n )}\n </Avatar>\n )}\n {children}\n <Timestamp name={name} timestamp={timestamp}></Timestamp>\n </StyledAgentMessage>\n );\n};\n\nexport const StyledAgentMessage = styled.div<any>`\n display: grid;\n margin-right: 10%;\n width: 90%;\n ${(p) =>\n p.hasAvatar\n ? css`\n grid-template-columns: auto 1fr;\n grid-template-rows: 1fr auto;\n grid-template-areas:\n 'avatar content'\n '. info';\n `\n : css`\n grid-template-columns: 1fr;\n grid-template-rows: 1fr auto;\n grid-template-areas:\n 'content'\n 'info';\n `};\n`;\n\nexport default AgentMessage;\n","import styled from '@emotion/styled';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { forwardRef } from 'react';\nimport Timestamp from './timestamp';\n\nexport type Props = {\n className?: string;\n timestamp: number;\n discrete?: boolean;\n fullWidth?: boolean;\n children: any;\n};\n\nconst SystemMessage = forwardRef<HTMLDivElement, Props>(\n ({ className, children, timestamp, discrete, fullWidth }, ref) => {\n return (\n <StyledSystemMessage\n ref={ref}\n className={appendClassNames(className, 'humany-conversation-system-message')}\n fullWidth={fullWidth}\n >\n {discrete ? (\n <Discrete className=\"humany-conversation-discrete-message\">\n {children}\n <Timestamp timestamp={timestamp}></Timestamp>\n </Discrete>\n ) : (\n <>\n {children}\n <Timestamp timestamp={timestamp}></Timestamp>\n </>\n )}\n </StyledSystemMessage>\n );\n }\n);\n\nexport const StyledSystemMessage = styled.div<any>`\n ${(p) => p.fullWidth && 'width: 100%'};\n padding: 0 ${(p) => p.theme.sizes?.large};\n overflow: auto;\n`;\n\nexport const Discrete = styled.div`\n text-align: center;\n word-wrap: break-word;\n font-size: ${(p) => p.theme.fonts?.normal};\n color: ${(p) => p.theme.colors?.text};\n > p {\n margin: 0;\n }\n`;\n\nexport default SystemMessage;\n","import styled from '@emotion/styled';\nimport { useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationComponentProperties } from '../../plugin';\nimport Timestamp from './timestamp';\n\nexport type Props = {\n className?: string;\n timestamp: number;\n children: any;\n};\n\nconst UserMessage: React.FC<Props> = ({ className, children, timestamp }) => {\n const { userLabel = '' } = useProperties<ConversationComponentProperties>();\n return (\n <StyledUserMessage\n className={appendClassNames(className, 'humany-conversation-user-message')}\n >\n {children}\n <Timestamp name={userLabel} timestamp={timestamp}></Timestamp>\n </StyledUserMessage>\n );\n};\n\nconst StyledUserMessage = styled.div`\n margin-left: 10%;\n width: 90%;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n`;\n\nexport default UserMessage;\n","export const mapActions = (actions: any) =>\n Array.isArray(actions)\n ? actions\n : Object.keys(actions).map((i) => {\n return {\n label: actions[i],\n actionKey: i,\n };\n });\n","import styled from '@emotion/styled';\nimport {\n Button,\n DispatchAction,\n ItemList,\n Link,\n SymbolBadge,\n borderTabStyle,\n buttonCss,\n itemList\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { ButtonListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & ButtonListProperties;\n\nexport const ButtonList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledButtonList\n className=\"humany-conversation-button-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n const isLink: boolean = !!item?.data?.href;\n return (\n <li key={item.actionKey}>\n {isLink ? \n (\n <StyledButtonListLink\n onClick={() => {\n dispatch('action', item);\n }}\n href={item.data.href}\n target={item.data.target}\n aria-label={item.label}\n title={item.label}\n >\n <SymbolBadge symbol={item.symbol} />\n {item.label}\n </StyledButtonListLink>\n )\n :\n (\n <StyledButtonListButton\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n <SymbolBadge symbol={item.symbol} />\n {item.label}\n </StyledButtonListButton>\n )}\n </li>\n\n );\n }}\n />\n );\n};\n\nconst StyledButtonList = styled(ItemList)`\n ${itemList}\n > ul {\n display: flex;\n flex-wrap: wrap;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n ${messageContentPadding}\n`;\n\nconst StyledButtonListLink = styled(Link)`\n ${buttonCss};\n\n display: block;\n padding: ${(p) => p.theme.sizes?.normal};\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #ffffff;\n overflow: hidden;\n text-overflow: ellipsis;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n\n i,\n svg {\n margin-right: ${(p) => p.theme.sizes?.small};\n }\n`;\n\nconst StyledButtonListButton = styled(Button)`\n ${buttonCss};\n\n display: block;\n padding: ${(p) => p.theme.sizes?.normal};\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #ffffff;\n overflow: hidden;\n text-overflow: ellipsis;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n\n i,\n svg {\n margin-right: ${(p) => p.theme.sizes?.small};\n }\n`;\n","import { useComponent } from '@telia-ace/widget-ui';\nimport React, { Suspense } from 'react';\n\ntype Props = {\n type: string;\n content?: { [key: string]: any };\n};\nexport const Custom: React.FC<Props> = ({ type, content = {} }) => {\n const Component = useComponent(type);\n\n if (!Component || !type) {\n return null;\n }\n return (\n <Suspense fallback={null}>\n <Component {...content} />\n </Suspense>\n );\n};\n","import styled from '@emotion/styled';\nimport { borderTabStyle, genericHtml, Html as UiHtml } from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { HtmlProperties } from '../../../../types';\nimport { messageContentPadding } from '../styles';\n\ntype Props = HtmlProperties;\n\nexport const Html: FC<Props> = ({ body }) => {\n return <StyledHtml html={body} />;\n};\n\nconst StyledHtml = styled(UiHtml)<any>`\n ${genericHtml}\n color: inherit;\n white-space: pre-wrap;\n ${messageContentPadding}\n a {\n color: ${(p) => p.theme.colors.link};\n &:focus-visible {\n ${borderTabStyle};\n }\n }\n`;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n headingElement,\n itemList,\n ItemList as ItemListUi,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { LinkListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & LinkListProperties;\n\nexport const ItemList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledItemList\n className=\"humany-conversation-item-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <ListItem>\n {item.symbol?.content && (\n <div className=\"item-icon\">\n <SymbolBadge\n size={22}\n symbol={{\n type: item.symbol.type,\n content: item.symbol.content,\n }}\n />\n </div>\n )}\n <div className=\"item-body\">\n <Button\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n {item.label}\n </Button>\n\n {item.description && <p>{item.description}</p>}\n </div>\n </ListItem>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledItemList = styled(ItemListUi)`\n ${itemList}\n\n > .humany-paragraph {\n ${messageContentPadding}\n margin-bottom: 0;\n\n h1 {\n margin: 0;\n }\n }\n\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n white-space: normal;\n `\n )}\n\n > ul {\n display: flex;\n flex-direction: column;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n\n li {\n border-bottom: ${(p) => p.theme.border};\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n`;\n\nconst ListItem = styled.div`\n display: flex;\n gap: ${(p) => p.theme.sizes?.medium};\n ${messageContentPadding}\n\n .item-icon {\n }\n\n .item-body {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: ${(p) => p.theme.sizes?.normal};\n\n p {\n margin: 0;\n white-space: normal;\n }\n }\n\n button {\n background: transparent;\n border: none;\n font-family: inherit;\n font-size: ${(p) => p.theme.fonts?.normal};\n cursor: pointer;\n padding: 0;\n margin: 0;\n\n &:focus-visible {\n ${borderTabStyle}\n span {\n color: ${(p) => p.theme.colors?.primary};\n text-decoration: underline;\n }\n }\n }\n`;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n headingElement,\n itemList,\n ItemList,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { LinkListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & LinkListProperties;\n\nexport const LinkList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledLinkList\n className=\"humany-conversation-link-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <StyledLinkButton\n help={item.actionKey === 'help'}\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n {item.label}\n {item.actionKey === 'help' && (\n <SymbolBadge\n size={14}\n symbol={{\n type: 'Svg',\n content: 'caret-down',\n }}\n />\n )}\n </StyledLinkButton>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledLinkList = styled(ItemList)`\n ${itemList}\n ${messageContentPadding}\n\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n white-space: normal;\n `\n )}\n\n > ul {\n display: flex;\n flex-direction: column;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n`;\n\nconst StyledLinkButton = styled(Button)<{ help: boolean }>`\n display: block;\n text-align: left;\n font-weight: 300;\n color: ${(p) => p.theme.colors?.primary};\n max-width: 100%;\n text-overflow: ellipsis;\n overflow: hidden;\n\n ${(p) =>\n p.help &&\n css`\n color: ${p.theme.colors?.text};\n text-decoration: underline;\n\n i,\n svg {\n margin-left: ${p.theme.sizes?.small};\n }\n `}\n\n &:focus-visible {\n ${borderTabStyle}\n span {\n color: ${(p) => p.theme.colors?.primary};\n text-decoration: underline;\n }\n }\n`;\n","import styled from '@emotion/styled';\nimport React, { FC } from 'react';\n\nexport const Separator: FC = () => {\n return <StyledSeparator className=\"humany-conversation-separator\" />;\n};\n\nconst StyledSeparator = styled.div`\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\n width: 100%;\n`;\n","import styled from '@emotion/styled';\nimport { Typography } from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { text: string };\n\nexport const Text: FC<Props> = ({ text }) => {\n return (\n <StyledTypography className=\"humany-conversation-text\" variant=\"span\">\n {text}\n </StyledTypography>\n );\n};\n\nconst StyledTypography = styled(Typography)`\n ${messageContentPadding}\n`;\n","import styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n buttonCss,\n DispatchAction,\n ItemList,\n itemList,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC, useMemo } from 'react';\nimport { VideoRequestProperties } from '../../../../types';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & VideoRequestProperties;\n\nexport const VideoRequest: FC<Props> = ({\n header = 'Video call',\n acceptLabel = 'Accept',\n declineLabel = 'Decline',\n dispatch,\n}) => {\n const actions = useMemo(() => {\n return [\n {\n label: acceptLabel,\n actionKey: 'accept-video-call',\n symbol: {\n type: 'Svg',\n content: 'video',\n },\n },\n {\n label: declineLabel,\n actionKey: 'decline-video-call',\n symbol: {\n type: 'Svg',\n content: 'close',\n },\n },\n ];\n }, [acceptLabel, declineLabel]);\n return (\n <StyledItemList\n className=\"humany-conversation-video-request\"\n header={header}\n items={actions}\n renderItem={(item: any) => {\n const bgColor = item.actionKey === 'accept-video-call' ? '#70c48e' : '#da5c85';\n return (\n <li key={item.actionKey}>\n <StyledButton\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n bgColor={bgColor}\n >\n <SymbolBadge symbol={item.symbol} size={25} />\n </StyledButton>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledItemList = styled(ItemList)`\n ${(p) => itemList(p)}\n > ul {\n display: flex;\n flex-wrap: wrap;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n ${(p) => messageContentPadding(p)}\n`;\n\nconst StyledButton = styled(Button)<{ bgColor: string }>`\n ${buttonCss};\n\n background-color: ${(p) => p.bgColor};\n display: flex;\n justify-content: center;\n align-items: center;\n color: #ffffff;\n width: 46px;\n height: 46px;\n border-radius: 100%;\n\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n\n i,\n svg {\n color: ${(p) => p.theme.colors?.primary};\n\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n }\n\n i,\n svg {\n color: #fff;\n\n path {\n stroke: #fff;\n }\n }\n`;\n","import React, { FC } from 'react';\n\nimport styled from '@emotion/styled';\nimport { DispatchAction, List, list } from '@telia-ace/widget-ui';\nimport { ConversationMessageListItemType, ConverstationMessageItem } from '../../../../types';\nimport { ButtonList } from '../message-list-items/button-list';\nimport { Custom } from '../message-list-items/custom';\nimport { Html } from '../message-list-items/html';\nimport { ItemList } from '../message-list-items/item-list';\nimport { LinkList } from '../message-list-items/link-list';\nimport { Separator } from '../message-list-items/separator';\nimport { Text } from '../message-list-items/text';\nimport { VideoRequest } from '../message-list-items/video-request';\n\ntype Props = {\n items: ConverstationMessageItem<any>[];\n dispatch: DispatchAction;\n};\n\nconst mapItem = ([type, content]: ConverstationMessageItem<any>) => {\n return { type, content };\n};\n\nexport const MessageList: FC<Props> = ({ items, dispatch }) => {\n return (\n <StyledList\n className=\"humany-message-list\"\n items={items.map(mapItem)}\n renderLi\n renderItem={(item: any) => {\n switch (item.type) {\n case ConversationMessageListItemType.Text: {\n return <Text text={item.content} />;\n }\n case ConversationMessageListItemType.HTML: {\n return <Html {...item.content} />;\n }\n case ConversationMessageListItemType.Separator: {\n return <Separator {...item.content} />;\n }\n case ConversationMessageListItemType.ItemList: {\n return <ItemList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.LinkList: {\n return <LinkList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.ButtonList: {\n return <ButtonList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.VideoRequest: {\n return <VideoRequest {...item.content} dispatch={dispatch} />;\n }\n default: {\n return <Custom type={item.type} content={item.content} />;\n }\n }\n }}\n />\n );\n};\n\nconst StyledList = styled(List)<any>`\n ${list}\n\n > li {\n margin: 0;\n }\n`;\n","import { Html, useDispatch } from '@telia-ace/widget-ui';\nimport React, { forwardRef, useCallback } from 'react';\nimport { ConversationMessageType } from '../../../conversation-controller';\nimport { ConversationMessageContent } from '../../../types';\nimport { BundledConversationMessage } from '../plugin';\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\nimport { MessageList } from './message-types/message-list';\nimport {\n ContentBundle,\n MessageContainer,\n MessageContent,\n MessageContentPart,\n MessageTitle,\n Stacked,\n StyledActionButton,\n StyledActionList,\n StyledForm,\n StyledHtml,\n} from './styles';\n\ntype Props = {\n className?: string;\n} & BundledConversationMessage;\n\nexport const ConversationMessage = forwardRef<HTMLDivElement, Props>(\n ({ className, timestamp, sender, type, content }, ref) => {\n const getMessageStackPosition = useCallback(\n (index: number): Stacked => {\n let messageOrder: Stacked = 'first';\n if (content.length > 1) {\n messageOrder =\n index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\n }\n return messageOrder;\n },\n [content]\n );\n\n const createSystemMessage = () => {\n return (\n <>\n {content.map((item) => {\n const { key, body, title, form, actions } = item;\n const discrete = !!body && !title && !form && !actions;\n return (\n <SystemMessage\n className={className}\n key={key}\n discrete={discrete}\n ref={ref}\n timestamp={timestamp}\n fullWidth={!!form || !!actions}\n >\n {discrete && body ? (\n <Html html={body} />\n ) : (\n <Message isSystem content={item} />\n )}\n </SystemMessage>\n );\n })}\n </>\n );\n };\n\n const createAgentMessage = () => {\n return (\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\n <ContentBundle className=\"humany-message-content-bundle\">\n {content.map((item, index) => {\n return (\n <MessageContainer\n className=\"humany-message-container\"\n left\n key={item.key}\n ref={ref}\n >\n <Message\n content={item}\n stacked={getMessageStackPosition(index)}\n />\n </MessageContainer>\n );\n })}\n </ContentBundle>\n </AgentMessage>\n );\n };\n\n const createUserMessage = () => {\n return (\n <UserMessage timestamp={timestamp} className={className}>\n <ContentBundle className=\"humany-message-content-bundle\">\n {content.map((item, index) => {\n return (\n <MessageContainer\n className=\"humany-message-container\"\n right\n key={item.key}\n ref={ref}\n >\n <Message\n isUser\n content={item}\n stacked={getMessageStackPosition(index)}\n />\n </MessageContainer>\n );\n })}\n </ContentBundle>\n </UserMessage>\n );\n };\n\n switch (type) {\n case ConversationMessageType.System:\n return createSystemMessage();\n case ConversationMessageType.Agent:\n return createAgentMessage();\n case ConversationMessageType.User:\n return createUserMessage();\n default:\n return null;\n }\n }\n);\n\ntype MessageContentProps = {\n className?: string;\n content: ConversationMessageContent;\n isUser?: boolean;\n isSystem?: boolean;\n stacked?: Stacked;\n CustomComponent?: any;\n};\n\nconst Message: React.FC<MessageContentProps> = ({ content, isUser, isSystem, stacked }) => {\n const dispatch = useDispatch();\n const { title, body, actions, form, items } = content;\n\n // Using print(string) or print(object) is considered legacy in favor of print(array).\n const isLegacyMessage = !items;\n if (isLegacyMessage) {\n return (\n <MessageContent\n className=\"humany-message-content\"\n padded={!isSystem}\n user={!!isUser}\n stacked={stacked}\n fullWidth={!!form || !!actions}\n >\n {title && (\n <MessageContentPart>\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\n </MessageContentPart>\n )}\n {body && (\n <MessageContentPart>\n <StyledHtml html={body} />\n </MessageContentPart>\n )}\n {form && (\n <MessageContentPart>\n <StyledForm\n {...form}\n onChange={(key: string, data: any) => {\n dispatch('form', {\n data,\n formKey: form.schema.id,\n actionKey: key,\n });\n }}\n />\n </MessageContentPart>\n )}\n {actions && (\n <MessageContentPart>\n <StyledActionList\n items={Object.keys(actions).map((i: any) => {\n return { label: actions[i], actionKey: i };\n })}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <StyledActionButton\n onClick={() => {\n dispatch('action', item.actionKey);\n }}\n >\n {item.label}\n </StyledActionButton>\n </li>\n );\n }}\n />\n </MessageContentPart>\n )}\n </MessageContent>\n );\n }\n\n return (\n <MessageContent className=\"humany-message-content\" user={!!isUser} stacked={stacked}>\n <MessageList items={items} dispatch={dispatch} />\n </MessageContent>\n );\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { borderTabStyle, headingElement, useProperties, useScroll } from '@telia-ace/widget-ui';\nimport React, { useCallback } from 'react';\nimport { ConversationMessageSender } from '../../../types';\nimport { BundledConversationMessage, ConversationComponentProperties } from '../plugin';\nimport ConversationInput from './input';\nimport ConversationLoader from './loader';\nimport { ConversationMessage } from './message';\nimport { AgentMessage } from './message-types';\n\nexport const ConversationContent: React.FC = () => {\n const setLastEntryRef = useCallback((node: HTMLDivElement) => {\n if (node) {\n setTimeout(() => {\n node.scrollIntoView({\n block: 'start',\n behavior: 'smooth',\n });\n }, 250);\n }\n }, []);\n\n const [scrollableCss, viewElem] = useScroll(true);\n const {\n messages,\n loading,\n typingActors = [],\n } = useProperties<ConversationComponentProperties>();\n\n const renderTypingActors = () => {\n if (typingActors && typingActors.length) {\n return typingActors.map((actor: ConversationMessageSender, index) => {\n return (\n <MessageEntry id={`typing_${actor.name}`} key={`typing_${actor.name}`}>\n <AgentMessage timestamp={Date.now()} sender={actor}>\n <ConversationLoader boxed ref={setLastEntryRef}></ConversationLoader>\n </AgentMessage>\n </MessageEntry>\n );\n });\n }\n return null;\n };\n\n return (\n <>\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\n {messages && messages.length\n ? messages.map((message: BundledConversationMessage, index) => {\n const { type, timestamp, sender, content } = message;\n return (\n <MessageEntry\n className={'humany-conversation-entry'}\n tabIndex={-1}\n key={`${type}_${sender?.name}_${timestamp}_${content[0].key}`}\n >\n <ConversationMessage {...message} ref={setLastEntryRef} />\n </MessageEntry>\n );\n })\n : null}\n {renderTypingActors()}\n {loading && (\n <MessageEntry>\n <ConversationLoader ref={setLastEntryRef} />\n </MessageEntry>\n )}\n </Scrollable>\n <ConversationInput />\n </>\n );\n};\n\nconst Scrollable = styled.div<{ scrolling: boolean } & any>`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 0 1 100%;\n padding: 0 ${(p) => p.theme.sizes?.medium};\n ${(p) => !!p.scrollableCss && p.scrollableCss};\n &:focus-visible {\n ${(p) => borderTabStyle(p)};\n }\n`;\n\nconst MessageEntry = styled.div`\n margin: 0;\n margin-bottom: ${(p) => p.theme.sizes?.medium};\n\n &:first-of-type {\n margin-top: ${(p) => p.theme.sizes?.medium};\n }\n\n &:last-of-type {\n padding-bottom: ${(p) => p.theme.sizes?.medium};\n }\n\n & span,\n p,\n a,\n div {\n font-weight: 300;\n }\n\n & b,\n h1 {\n font-weight: normal;\n }\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n font-weight: normal;\n `\n )}\n`;\n","import styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n SymbolBadge,\n Typography,\n WidgetOverlayOutlet,\n} from '@telia-ace/widget-ui';\nimport React, { FC, useEffect, useRef } from 'react';\nimport { ConversationContent } from './content';\n\ntype OverlayOutletProps = {\n dispatch: DispatchAction;\n};\n\nexport const OverlayOutlet: FC<OverlayOutletProps> = ({ dispatch }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (wrapperRef.current && wrapperRef.current.parentNode) {\n dispatch('overlay-mounted', wrapperRef.current);\n }\n }, [wrapperRef]);\n\n return (\n <WidgetOverlayOutlet\n portalId=\"humany-conversation-overlay-portal\"\n className=\"humany-conversation-overlay-outlet\"\n ref={wrapperRef}\n />\n );\n};\n\ntype ConversationOverlayProps = {\n dispatch: DispatchAction;\n header?: string;\n buttonLabel?: string;\n};\n\nexport const ConversationOverlayOutlet: FC<ConversationOverlayProps> = ({\n dispatch,\n header,\n buttonLabel,\n}) => {\n return (\n <StyledWidgetOverlayOutlet\n portalId=\"humany-conversation-portal\"\n className=\"humany-conversation-outlet\"\n >\n <ConversationOverlayHead className=\"humany-conversation-outlet-head\">\n <ConversationOverlayHeadButton\n className=\"humany-conversation-outlet-head-button\"\n aria-label={buttonLabel}\n title={buttonLabel}\n onClick={() => dispatch('hide-overlay-conversation')}\n >\n <SymbolBadge\n symbol={{\n type: 'Svg',\n content: 'caret-down',\n }}\n size={20}\n />\n </ConversationOverlayHeadButton>\n {header && (\n <ConversationOverlayHeader\n className=\"humany-conversation-outlet-header\"\n variant=\"h1\"\n >\n {header}\n </ConversationOverlayHeader>\n )}\n </ConversationOverlayHead>\n <ConversationContent />\n </StyledWidgetOverlayOutlet>\n );\n};\n\nconst StyledWidgetOverlayOutlet = styled(WidgetOverlayOutlet)`\n z-index: 11;\n top: auto;\n height: 65%;\n background-color: #ffffff;\n display: flex;\n flex-direction: column;\n border-top-right-radius: ${(p) => p.theme.sizes?.large};\n border-top-left-radius: ${(p) => p.theme.sizes?.large};\n`;\n\nconst ConversationOverlayHead = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(p) => p.theme.sizes?.normal};\n padding: ${(p) => p.theme.sizes?.normal};\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\n`;\n\nconst ConversationOverlayHeader = styled(Typography)`\n font-size: ${(p) => p.theme.fonts?.medium};\n color: ${(p) => p.theme.colors?.text};\n margin: 0;\n`;\n\nconst ConversationOverlayHeadButton = styled(Button)`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.medium};\n ${(p) => p.theme.borderRadius && `border-radius: ${p.theme.borderRadius};`}\n\n &:focus-visible {\n ${borderTabStyle};\n }\n\n svg line {\n stroke: ${(p) => p.theme.colors?.text};\n }\n`;\n","import styled from '@emotion/styled';\nimport { ConversationContext, useDispatch, useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationComponentProperties } from './plugin';\nimport { ConversationContent } from './ui/content';\nimport { ConversationOverlayOutlet, OverlayOutlet } from './ui/overlay-outlets';\n\ntype Props = {\n className: string;\n};\n\nconst Conversation: React.FC<Props> = ({ className, ...other }) => {\n const {\n overlay,\n overlayConversationHeader,\n overlayConversationCloseLabel,\n conversationControllerId,\n } = useProperties<ConversationComponentProperties>();\n const dispatch = useDispatch();\n\n return (\n <ConversationContext.Provider\n value={conversationControllerId ? { id: conversationControllerId } : null}\n >\n <Wrapper\n {...other}\n className={appendClassNames(className, 'humany-conversation-component')}\n >\n <ConversationContent />\n </Wrapper>\n {overlay && (\n <>\n <OverlayOutlet dispatch={dispatch} />\n {overlay.conversation && (\n <ConversationOverlayOutlet\n dispatch={dispatch}\n header={overlayConversationHeader}\n buttonLabel={overlayConversationCloseLabel}\n />\n )}\n </>\n )}\n </ConversationContext.Provider>\n );\n};\n\nconst Wrapper = styled.div`\n position: absolute;\n right: 0;\n left: 0;\n bottom: 0;\n top: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`;\n\nexport default Conversation;\n"],"names":["ConversationInput","className","inputText","setInputText","useState","inputFocus","setInputFocus","calculatedLineHeight","setCalculatedLineHeight","textareaMaxHeight","setTextareaMaxHeight","isTabbing","useIsTabbing","dispatch","useDispatch","inputPlaceholder","inputHidden","inputDisabled","sendButtonLabel","multiline","secondaryAction","useProperties","scrollableCss","inputRef","useScroll","useEffect","lineHeight","maxHeight","lineHeightNumber","calcLH","maxHeightNumber","submit","e","onChange","onSecondaryActionButtonClick","__spreadValues","calculateHeight","value","scrollHeight","areaHeight","React","Wrapper","appendClassNames","SecondaryActionButton","SymbolBadge","StyledTextArea","StyledInput","StyledButton","SendSymbol","styled","Input","p","_a","Button","borderTabStyle","css","_b","hasContent","other","__objRest","ConversationInput$1","Avatar","LoaderAnimation","keyframes","Loader","ContentBundle","MessageTitle","Typography","MessageContainer","MessageContent","nonUserMessageStyling","userMessageStyling","stacked","theme","colors","MessageContentPart","messageContentPadding","StyledForm","FormComponent","invertedHoverButton","_c","_d","StyledHtml","Html","StyledActionList","List","StyledActionButton","buttonCss","ConversationLoader","forwardRef","boxed","agentData","ref","ConversationLoader$1","StyledTimestamp","getTimestamp","raw","Timestamp","name","timestamp","output","Timestamp$1","AgentMessage","children","sender","avatar","avatarSize","StyledAgentMessage","AgentMessage$1","SystemMessage","discrete","fullWidth","StyledSystemMessage","Discrete","SystemMessage$1","UserMessage","userLabel","StyledUserMessage","UserMessage$1","mapActions","actions","i","ButtonList","header","StyledButtonList","item","isLink","StyledButtonListLink","StyledButtonListButton","ItemList","itemList","Link","Custom","type","content","Component","useComponent","Suspense","body","UiHtml","genericHtml","StyledItemList","ListItem","ItemListUi","headingElement","LinkList","StyledLinkList","StyledLinkButton","Separator","StyledSeparator","Text","text","StyledTypography","VideoRequest","acceptLabel","declineLabel","useMemo","bgColor","mapItem","MessageList","items","StyledList","ConversationMessageListItemType","__spreadProps","list","ConversationMessage","getMessageStackPosition","useCallback","index","messageOrder","createSystemMessage","key","title","form","Message","createAgentMessage","createUserMessage","ConversationMessageType","isUser","isSystem","data","ConversationContent","setLastEntryRef","node","viewElem","messages","loading","typingActors","renderTypingActors","actor","MessageEntry","Scrollable","message","OverlayOutlet","wrapperRef","useRef","WidgetOverlayOutlet","ConversationOverlayOutlet","buttonLabel","StyledWidgetOverlayOutlet","ConversationOverlayHead","ConversationOverlayHeadButton","ConversationOverlayHeader","Conversation","overlay","overlayConversationHeader","overlayConversationCloseLabel","conversationControllerId","ConversationContext"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAMA,KAAqC,CAAC,EAAE,WAAAC,QAAgB;AAC1D,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAE,GACvC,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAK,GAC5C,CAACG,GAAsBC,CAAuB,IAAIJ,EAAS,CAAC,GAC5D,CAACK,GAAmBC,CAAoB,IAAIN,EAAS,CAAC,GACtDO,IAAYC,MACZC,IAAWC,KACX;AAAA,IACF,kBAAAC,IAAmB;AAAA,IACnB,aAAAC,IAAc;AAAA,IACd,eAAAC,IAAgB;AAAA,IAChB,iBAAAC,IAAkB;AAAA,IAClB,gBAAgBC,IAAY;AAAA,IAC5B,iBAAAC;AAAA,MACAC,EAA+C,GAC7C,CAACC,IAAeC,CAAQ,IAAIC,GAAU,EAAI;AAEhD,EAAAC,GAAU,MAAM;AACZ,QAAIF,EAAS,SAAS;AAClB,YAAM,EAAE,YAAAG,GAAY,WAAAC,EAAA,IAAc,iBAAiBJ,EAAS,OAAO;AACnE,UAAIG,KAAcA,EAAW,QAAQ,IAAI,IAAI,IAAI;AACvC,cAAAE,IAAmBF,EAAW,MAAM,IAAI,GACxCG,KAAS,SAASD,EAAiB,CAAC,GAAG,EAAE;AAC/C,QAAApB,EAAwBqB,EAAM;AACxB,cAAAC,KAAkBH,EAAU,MAAM,IAAI;AAC5C,QAAAjB,EAAqB,SAASoB,GAAgB,CAAC,GAAG,EAAE,CAAC;AAAA;AAAA;AAAA,EAE7D,GACD,CAACP,EAAS,OAAO,CAAC;AAEf,QAAAQ,IAAS,CAACC,MAAW;AACvB,IAAI,CAACA,EAAE,YAAY,CAACb,KAChBa,EAAE,eAAe,GACb9B,KAAaA,EAAU,SAAS,MAChCW,EAAS,eAAe,EAAE,MAAMX,EAAW,CAAA,GAC3CC,EAAa,EAAE,GACf8B,EAAS,EAAE,MAER/B,EAAU,SAAS,KAC1B8B,EAAE,eAAe;AAAA,EACrB,GAGEE,KAA+B,CAACF,MAAW;AAC7C,IAAKZ,MAGLY,EAAE,eAAe,GACjBnB,EAAS,UAAUsB,EAAA;AAAA,MACf,WAAWf,EAAgB;AAAA,OACxBA,EACN;AAAA,EAAA,GAGCgB,KAAkB,CAACC,MAAkB;AACnC,QAAAlB,KAAaI,EAAS,SAAS;AACzB,YAAAe,IAAef,EAAS,QAAQ;AACtC,UAAIe,IAAe/B,GAAsB;AAC5B,QAAAgB,EAAA,QAAQ,MAAM,SAAS;AAChC,YAAIgB,IAAaD;AACb,QAAAD,EAAM,SAAS,MACFE,IAAAhC,IAERgB,EAAA,QAAQ,MAAM,SAAS,GAAGgB,OAE/BA,KAAc9B,IACLc,EAAA,QAAQ,MAAM,YAAY,WAE1BA,EAAA,QAAQ,MAAM,YAAY;AAAA;AAAA;AAAA,EAG/C,GAGEU,IAAW,CAACI,MAAkB;AAChC,IAAAD,GAAgBC,CAAK,GACrBlC,EAAakC,CAAK,GACdA,KAASA,EAAM,SAAS,KACxBxB,EAAS,eAAe,EAAE,YAAYwB,EAAM,OAAQ,CAAA;AAAA,EACxD;AAGJ,SAAIrB,IACO,OAIP,gBAAAwB,EAAA;AAAA,IAACC;AAAAA,IAAA;AAAA,MACG,MAAMtB;AAAA,MACN,WAAWuB,EAAiB,6BAA6BzC,CAAS;AAAA,MAClE,kBAAgBI;AAAA,MAChB,eAAAiB;AAAA,MACA,WAAAX;AAAA,IAAA;AAAA,IAECS,KACG,gBAAAoB,EAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,UAAU1B;AAAA,QACV,SAASiB;AAAA,QACT,OAAOd,EAAgB;AAAA,QACvB,cAAYA,EAAgB;AAAA,MAAA;AAAA,MAE5B,gBAAAoB,EAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACG,MAAM;AAAA,UACN,QAAQ,EAAE,MAAM,OAAO,SAASxB,EAAgB,QAAQ,SAAS;AAAA,QAAA;AAAA,MACrE;AAAA,IACJ;AAAA,IAEHD,IACG,gBAAAqB,EAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACG,OAAO3C;AAAA,QACP,UAAA+B;AAAA,QACA,SAASF;AAAA,QACT,UAAUd;AAAA,QACV,cAAYF;AAAA,QACZ,aAAaA;AAAA,QACb,eAAeT;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAKiB;AAAA,MAAA;AAAA,IAGT,IAAA,gBAAAiB,EAAA;AAAA,MAACM;AAAA,MAAA;AAAA,QACG,OAAO5C;AAAA,QACP,UAAA+B;AAAA,QACA,SAASF;AAAA,QACT,UAAUd;AAAA,QACV,cAAYF;AAAA,QACZ,aAAaA;AAAA,QACb,eAAeT;AAAA,MAAA;AAAA,IACnB;AAAA,IAEJ,gBAAAkC,EAAA;AAAA,MAACO;AAAAA,MAAA;AAAA,QACG,UAAU9B;AAAA,QACV,SAASc;AAAA,QACT,OAAOb;AAAA,QACP,cAAYA;AAAA,MAAA;AAAA,MAEZ,gBAAAsB,EAAA;AAAA,QAACQ;AAAA,QAAA;AAAA,UACG,MAAM;AAAA,UACN,QAAQ,EAAE,MAAM,OAAO,SAAS,OAAO;AAAA,UACvC,YAAY,CAAC,CAAC9C,KAAa,CAAC,CAACA,EAAU;AAAA,QAAA;AAAA,MAC3C;AAAA,IACJ;AAAA,EAAA;AAGZ,GAEM2C,KAAiBI,EAAOC,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cASrB,CAACC,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,iBACnB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA,GAMjCN,KAAcG,EAAOC,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKf,CAACC,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA,eAGxB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,aACxB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA,iBAEnB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA,GAKlCL,KAAeE,EAAOI,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUxBC;AAAA;AAAA,GAIJX,KAAwBM,EAAOF,EAAY;AAAA,oBAC7B,CAACI,MAAMA,EAAE,MAAM;AAAA,cACrB,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,GAG9BX,KAAUQ,EAAO;AAAA,MACjB,CAACE,MACCA,EAAE,OACII;AAAA;AAAA;AAAA,kBAIAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMU,CAACJ,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA,kBAC7B,CAACD,MAAMA,EAAE,MAAM;AAAA,MAC3B,CAACA,MAAMA,EAAE,gBAAgB,KAAKA,EAAE,aAAaG;AAAA;AAAA,UAEzC,CAACH,MAAM,CAAC,CAACA,EAAE,iBAAiBA,EAAE;AAAA;AAAA,GAIlCH,KAAaC;AAAA,EACf,CAACG,MAOK;AAPL,QAAAI,IAAAJ,GACG;AAAA,kBAAAK;AAAA,QADHD,GAEME,IAAAC,EAFNH,GAEM;AAAA,MADH;AAAA;AAME,2BAAAhB,EAAA,cAACI,GAAaT,EAAA,IAAGuB,EAAO;AAAA;AAClC;AAAA;AAAA;AAAA,kBAGkB,CAACP,MAAO;;AAAA,SAAAA,EAAE,cAAaC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB,UAAU;AAAA;AAAA,gBACnD,CAACD,MAAO;;AAAA,SAAAA,EAAE,cAAaC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB,UAAU;AAAA;AAAA;AAAA,GAIjEQ,KAAe5D,ICpPF6D,KAASZ,EAAO;AAAA,aAChB,CAACE,MAAMA,EAAE,cAAc;AAAA,cACtB,CAACA,MAAMA,EAAE,cAAc;AAAA;AAAA,wBAEb,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA,cACjC,CAACD,MAAMA,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAShB,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAYnB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMlB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA,GAKhCU,KAAkBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYlBC,KAASf,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAQD,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA,qBAC9BU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAURG,IAAgBhB,EAAO;AAAA;AAAA;AAAA;AAAA,GAMvBiB,KAAejB,EAAOkB,CAAU;AAAA,iBAC5B,CAAChB,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA,GAK1BgB,IAAmBnB,EAAO;AAAA;AAAA,MAEjC,CAACE,MAAMA,EAAE,QAAQ;AAAA,MACjB,CAACA,MAAMA,EAAE,UAAU;AAAA,MACnB,CAACA,MAAMA,EAAE,SAAS;AAAA,GAKXkB,IAAiBpB,EAAO;AAAA,MAM/B,CAACE,MAAM;;AAAA,SAAAA,EAAE,UAAU,aAAYC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,MAC9C,CAACD,MAAM,CAACA,EAAE,QAAQA,EAAE,WAAWmB,GAAsBnB,EAAE,SAASA,EAAE,KAAK;AAAA,MACvE,CAACA,MAAMA,EAAE,QAAQA,EAAE,WAAWoB,GAAmBpB,EAAE,SAASA,EAAE,KAAK;AAAA;AAAA;AAAA,kBAGvD,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASlC,CAACD,MAAMA,EAAE,aAAa;AAAA,GAGtBmB,KAAwB,CAACE,GAAkBC,MAAe;;AAC5D,QAAMC,IAASnB;AAAA,6BACSH,IAAAqB,EAAM,WAAN,gBAAArB,EAAc;AAAA,kBACzBI,IAAAiB,EAAM,WAAN,gBAAAjB,EAAc;AAAA,UACrBiB,EAAM,UAAU,WAAWA,EAAM;AAAA;AAGnC,SAACA,EAAM,eAIJlB;AAAA,UACDmB;AAAA;AAAA,mCAEyBD,EAAM;AAAA,sCACHA,EAAM;AAAA;AAAA,UAElCD,MAAY,WACd;AAAA,sCAC8BC,EAAM;AAAA;AAAA;AAAA,UAGlCD,MAAY,UACd;AAAA,yCACiCC,EAAM;AAAA;AAAA,QAhBhCC;AAmBf,GAEMH,KAAqB,CAACC,GAAkBC,MAAe;;AACzD,QAAMC,IAASnB;AAAA,6BACSH,IAAAqB,EAAM,WAAN,gBAAArB,EAAc;AAAA,kBACzBI,IAAAiB,EAAM,WAAN,gBAAAjB,EAAc;AAAA;AAGvB,SAACiB,EAAM,eAIJlB;AAAA,UACDmB;AAAA;AAAA,kCAEwBD,EAAM;AAAA,qCACHA,EAAM;AAAA;AAAA,UAEjCD,MAAY,WACd;AAAA,uCAC+BC,EAAM;AAAA;AAAA;AAAA,UAGnCD,MAAY,UACd;AAAA,0CACkCC,EAAM;AAAA;AAAA,QAhBjCC;AAmBf,GAEaC,IAAqB1B,EAAO;AAAA,qBACpB,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA,GAM9BwB,IAAwB,CAACzB,MAAwB;;AAAA,SAAAI;AAAA,eAChDH,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA,kBACZI,IAAAL,EAAE,MAAM,UAAR,gBAAAK,EAAe;AAAA;AAAA,GAGnBqB,KAAa5B,EAAO6B,EAAa;AAAA;AAAA,UAEpC,CAAC3B,MACC;;AAAA,WAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB,cAChBI,IAAAL,EAAE,MAAM,WAAR,gBAAAK,EAAgB,WAChBuB,GAAoB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAcC,IAAA7B,EAAE,MAAM,WAAR,gBAAA6B,EAAgB;AAAA,IAC9B,iBAAgBC,IAAA9B,EAAE,MAAM,WAAR,gBAAA8B,EAAgB;AAAA,IAChC,OAAO9B,EAAE;AAAA,EACb,CAAC;AAAA;AAAA;AAAA;AAAA,yBAGY,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMlB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA,GAKtC8B,KAAajC,EAAOkC,CAAI;AAAA;AAAA;AAAA,iBAGpB,CAAChC,MAAMA,EAAE,MAAM,OAAO;AAAA;AAAA,cAEzB,CAACA,MAAA;;AAAM,WAAAC,IAAAD,EAAE,MAAM,kBAAR,gBAAAC,EAAuB,cAAaE;AAAA;AAAA;AAAA;AAAA,GAK5C8B,KAAmBnC,EAAOoC,EAAI;AAAA;AAAA;AAAA,iBAG1B,CAAClC,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA,kBAErB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA,GAI3BkC,KAAqBrC,EAAO;AAAA,MACnC,CAACE,MAAMoC,EAAUpC,CAAC;AAAA;AAAA,wBAEA,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,UAIrCE;AAAA;AAAA;AAAA,GCzOJkC,KAAqBC;AAAA,EACvB,CAAC,EAAE,OAAAC,GAAO,WAAAzF,GAAW,WAAA0F,EAAA,GAAaC,MAEzB,gBAAApD,EAAA,cAAAyB,GAAA,EAAc,KAAA2B,KACX,gBAAApD,EAAA,cAAC4B,KAAiB,MAAMsB,GAAO,QAAQ,CAACA,KACpC,gBAAAlD,EAAA,cAAC6B,GAAe,EAAA,QAAQ,CAAC,CAACqB,GAAO,SAASA,IAAQ,UAAU,UACvD,gBAAAlD,EAAA,cAAAwB,IAAA,sCACI,OAAI,IAAA,GACJ,gBAAAxB,EAAA,cAAA,OAAA,IAAI,GACJ,gBAAAA,EAAA,cAAA,OAAA,IAAI,CACT,CACJ,CACJ,CACJ;AAGZ,GAEAqD,KAAeL,ICnBTM,KAAkB7C,EAAO;AAAA;AAAA,qBAEV,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAM9B,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA,GAG9B2C,KAAe,CAACC,MACX,IAAI,KAAKA,CAAG,EAAE,mBAAmB,CAAA,GAAI,EAAE,MAAM,WAAW,QAAQ,UAAW,CAAA,GAGhFC,KAA6B,CAAC,EAAE,WAAAhG,GAAW,MAAAiG,GAAM,WAAAC,QAAgB;AAC/D,MAAA,CAACD,KAAQ,CAACC;AACH,WAAA;AAGX,MAAIC,IAAS;AACb,SAAIF,IACIC,IACSC,IAAA,GAAGF,MAASH,GAAaI,CAAS,MAElCC,IAAAF,IAENC,MACPC,IAASL,GAAaI,CAAS,IAG5B,gBAAA3D,EAAA,cAACsD,UAAiBM,CAAO;AACpC,GAEAC,IAAeJ,IC1BTK,KAAgC,CAAC,EAAE,WAAArG,GAAW,UAAAsG,GAAU,QAAAC,GAAQ,WAAAL,QAAgB;AAC5E,QAAA,EAAE,QAAAM,GAAQ,MAAAP,EAAS,IAAAM,GACnB,EAAE,YAAAE,MAAerF;AAGnB,SAAA,gBAAAmB,EAAA;AAAA,IAACmE;AAAA,IAAA;AAAA,MACG,WAAW,CAAC,CAACF;AAAA,MACb,WAAW/D,EAAiBzC,GAAW,mCAAmC;AAAA,IAAA;AAAA,IAEzEwG,KACI,gBAAAjE,EAAA,cAAAqB,IAAA,EAAO,YAAA6C,EACH,GAAA,OAAOD,KAAW,WACf,gBAAAjE,EAAA,cAAC,OAAI,EAAA,KAAKiE,EAAQ,CAAA,IAElB,gBAAAjE,EAAA,cAACI,GAAY,EAAA,QAAQ6D,GAAQ,CAErC;AAAA,IAEHF;AAAA,IACD,gBAAA/D,EAAA,cAACyD,GAAU,EAAA,MAAAC,GAAY,WAAAC,EAAsB,CAAA;AAAA,EAAA;AAGzD,GAEaQ,KAAqB1D,EAAO;AAAA;AAAA;AAAA;AAAA,MAInC,CAACE,MACCA,EAAE,YACII;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASdqD,KAAeN,IClDTO,KAAgBpB;AAAA,EAClB,CAAC,EAAE,WAAAxF,GAAW,UAAAsG,GAAU,WAAAJ,GAAW,UAAAW,GAAU,WAAAC,KAAanB,MAElD,gBAAApD,EAAA;AAAA,IAACwE;AAAA,IAAA;AAAA,MACG,KAAApB;AAAA,MACA,WAAWlD,EAAiBzC,GAAW,oCAAoC;AAAA,MAC3E,WAAA8G;AAAA,IAAA;AAAA,IAECD,IACI,gBAAAtE,EAAA,cAAAyE,IAAA,EAAS,WAAU,uCAAA,GACfV,GACA,gBAAA/D,EAAA,cAAAyD,GAAA,EAAU,WAAAE,EAAsB,CAAA,CACrC,IAGK,gBAAA3D,EAAA,cAAAA,EAAA,UAAA,MAAA+D,GACA,gBAAA/D,EAAA,cAAAyD,GAAA,EAAU,WAAAE,EAAsB,CAAA,CACrC;AAAA,EAAA;AAKpB,GAEaa,KAAsB/D,EAAO;AAAA,MACpC,CAACE,MAAMA,EAAE,aAAa;AAAA,iBACX,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA,GAI1B6D,KAAWhE,EAAO;AAAA;AAAA;AAAA,iBAGd,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,aAC1B,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,GAMpC8D,KAAeL,ICxCTM,KAA+B,CAAC,EAAE,WAAAlH,GAAW,UAAAsG,GAAU,WAAAJ,QAAgB;AACzE,QAAM,EAAE,WAAAiB,IAAY,GAAG,IAAI/F,EAA+C;AAEtE,SAAA,gBAAAmB,EAAA;AAAA,IAAC6E;AAAA,IAAA;AAAA,MACG,WAAW3E,EAAiBzC,GAAW,kCAAkC;AAAA,IAAA;AAAA,IAExEsG;AAAA,IACA,gBAAA/D,EAAA,cAAAyD,GAAA,EAAU,MAAMmB,GAAW,WAAAjB,GAAsB;AAAA,EAAA;AAG9D,GAEMkB,KAAoBpE,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQjCqE,KAAeH,ICjCFI,KAAa,CAACC,MACvB,MAAM,QAAQA,CAAO,IACfA,IACA,OAAO,KAAKA,CAAO,EAAE,IAAI,CAACC,OACf;AAAA,EACH,OAAOD,EAAQC,CAAC;AAAA,EAChB,WAAWA;AAAA,EAElB,GCUEC,KAAwB,CAAC,EAAE,QAAAC,GAAQ,SAAAH,GAAS,UAAA3G,QAEjD,gBAAA2B,EAAA;AAAA,EAACoF;AAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,QAAAD;AAAA,IACA,OAAOJ,GAAWC,CAAO;AAAA,IACzB,YAAY,CAACK,MAAc;;AACvB,YAAMC,IAAkB,CAAC,GAAC1E,IAAAyE,KAAA,gBAAAA,EAAM,SAAN,QAAAzE,EAAY;AACtC,aACK,gBAAAZ,EAAA,cAAA,MAAA,EAAG,KAAKqF,EAAK,aACbC,IAEG,gBAAAtF,EAAA;AAAA,QAACuF;AAAA,QAAA;AAAA,UACG,SAAS,MAAM;AACX,YAAAlH,EAAS,UAAUgH,CAAI;AAAA,UAC3B;AAAA,UACA,MAAMA,EAAK,KAAK;AAAA,UAChB,QAAQA,EAAK,KAAK;AAAA,UAClB,cAAYA,EAAK;AAAA,UACjB,OAAOA,EAAK;AAAA,QAAA;AAAA,QAEX,gBAAArF,EAAA,cAAAI,GAAA,EAAY,QAAQiF,EAAK,QAAQ;AAAA,QACjCA,EAAK;AAAA,MAKV,IAAA,gBAAArF,EAAA;AAAA,QAACwF;AAAA,QAAA;AAAA,UACG,SAAS,MAAM;AACX,YAAAnH,EAAS,UAAUgH,CAAI;AAAA,UAC3B;AAAA,UACA,cAAYA,EAAK;AAAA,UACjB,OAAOA,EAAK;AAAA,QAAA;AAAA,QAEX,gBAAArF,EAAA,cAAAI,GAAA,EAAY,QAAQiF,EAAK,QAAQ;AAAA,QACjCA,EAAK;AAAA,MAAA,CAGd;AAAA,IAGR;AAAA,EAAA;AAAA,GAKND,KAAmB3E,EAAOgF,CAAQ;AAAA,MAClCC;AAAA;AAAA;AAAA;AAAA,eAIS,CAAC/E,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAK/BwB;AAAA,GAGAmD,KAAuB9E,EAAOkF,EAAI;AAAA,MAClC5C;AAAA;AAAA;AAAA,eAGS,CAACpC,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,wBACb,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMrCE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMc,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA,GAIxC4E,KAAyB/E,EAAOI,CAAM;AAAA,MACtCkC;AAAA;AAAA;AAAA,eAGS,CAACpC,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,wBACb,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMrCE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMc,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA,GC5GjCgF,KAA0B,CAAC,EAAE,MAAAC,GAAM,SAAAC,IAAU,SAAS;AACzD,QAAAC,IAAYC,GAAaH,CAAI;AAE/B,SAAA,CAACE,KAAa,CAACF,IACR,OAGP,gBAAA7F,EAAA,cAACiG,MAAS,UAAU,KAAA,mCACfF,GAAWpG,EAAA,IAAGmG,EAAS,CAC5B;AAER,GCVanD,KAAkB,CAAC,EAAE,MAAAuD,QACvB,gBAAAlG,EAAA,cAAC0C,IAAW,EAAA,MAAMwD,EAAM,CAAA,GAG7BxD,KAAajC,EAAO0F,CAAM;AAAA,MAC1BC;AAAA;AAAA;AAAA,MAGAhE;AAAA;AAAA,iBAEW,CAACzB,MAAMA,EAAE,MAAM,OAAO;AAAA;AAAA,cAEzBG;AAAA;AAAA;AAAA,GCFD2E,KAAsB,CAAC,EAAE,QAAAN,GAAQ,SAAAH,GAAS,UAAA3G,QAE/C,gBAAA2B,EAAA;AAAA,EAACqG;AAAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,QAAAlB;AAAA,IACA,OAAOJ,GAAWC,CAAO;AAAA,IACzB,YAAY,CAACK,MAAc;;AACvB,aACK,gBAAArF,EAAA,cAAA,MAAA,EAAG,KAAKqF,EAAK,UACV,GAAA,gBAAArF,EAAA,cAACsG,IACI,QAAA1F,IAAAyE,EAAK,WAAL,gBAAAzE,EAAa,YACT,gBAAAZ,EAAA,cAAA,OAAA,EAAI,WAAU,eACX,gBAAAA,EAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACG,MAAM;AAAA,UACN,QAAQ;AAAA,YACJ,MAAMiF,EAAK,OAAO;AAAA,YAClB,SAASA,EAAK,OAAO;AAAA,UACzB;AAAA,QAAA;AAAA,MAAA,CAER,GAEH,gBAAArF,EAAA,cAAA,OAAA,EAAI,WAAU,YACX,GAAA,gBAAAA,EAAA;AAAA,QAACa;AAAA,QAAA;AAAA,UACG,SAAS,MAAM;AACX,YAAAxC,EAAS,UAAUgH,CAAI;AAAA,UAC3B;AAAA,UACA,cAAYA,EAAK;AAAA,UACjB,OAAOA,EAAK;AAAA,QAAA;AAAA,QAEXA,EAAK;AAAA,MACV,GAECA,EAAK,eAAe,gBAAArF,EAAA,cAAC,WAAGqF,EAAK,WAAY,CAC9C,CACJ,CACJ;AAAA,IAER;AAAA,EAAA;AAAA,GAKNgB,KAAiB5F,EAAO8F,CAAU;AAAA,MAClCb;AAAA;AAAA;AAAA,UAGItD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQJ,CAACzB,MACC6F,EAAe7F,CAAC;AAAA,EACZ;AAAA,EACAI;AAAA;AAAA;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA,eAKO,CAACJ,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOZ,CAACD,MAAMA,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQlC2F,KAAW7F,EAAO;AAAA;AAAA,WAEb,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,MAC3BwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASS,CAACzB,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAYhB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAM7BE;AAAA;AAAA,yBAEW,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GChHnC6F,KAAsB,CAAC,EAAE,QAAAtB,GAAQ,SAAAH,GAAS,UAAA3G,QAE/C,gBAAA2B,EAAA;AAAA,EAAC0G;AAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,QAAAvB;AAAA,IACA,OAAOJ,GAAWC,CAAO;AAAA,IACzB,YAAY,CAACK,MAEJ,gBAAArF,EAAA,cAAA,MAAA,EAAG,KAAKqF,EAAK,aACV,gBAAArF,EAAA;AAAA,MAAC2G;AAAA,MAAA;AAAA,QACG,MAAMtB,EAAK,cAAc;AAAA,QACzB,SAAS,MAAM;AACX,UAAAhH,EAAS,UAAUgH,CAAI;AAAA,QAC3B;AAAA,QACA,cAAYA,EAAK;AAAA,QACjB,OAAOA,EAAK;AAAA,MAAA;AAAA,MAEXA,EAAK;AAAA,MACLA,EAAK,cAAc,UAChB,gBAAArF,EAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACG,MAAM;AAAA,UACN,QAAQ;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA,CAGZ;AAAA,EAER;AAAA,GAKNsG,KAAiBjG,EAAOgF,CAAQ;AAAA,MAChCC;AAAA,MACAtD;AAAA;AAAA,MAEA,CAACzB,MACC6F,EAAe7F,CAAC;AAAA,EACZ;AAAA,EACAI;AAAA;AAAA;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA,eAKO,CAACJ,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAO/B+F,KAAmBlG,EAAOI,CAAM;AAAA;AAAA;AAAA;AAAA,aAIzB,CAACF,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAK9B,CAACD,MACC;;AAAA,SAAAA,EAAE,QACFI;AAAA,sBACaH,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,gCAKNI,IAAAL,EAAE,MAAM,UAAR,gBAAAK,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKpCF;AAAA;AAAA,qBAEW,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,GChG/BgG,KAAgB,MAClB,gBAAA5G,EAAA,cAAC6G,IAAgB,EAAA,WAAU,gCAAgC,CAAA,GAGhEA,KAAkBpG,EAAO;AAAA,MACzB,CAACE,MAAMA,EAAE,MAAM,UAAU,kBAAkBA,EAAE,MAAM;AAAA;AAAA,GCD5CmG,KAAkB,CAAC,EAAE,MAAAC,wCAEzBC,IAAiB,EAAA,WAAU,4BAA2B,SAAQ,UAC1DD,CACL,GAIFC,KAAmBvG,EAAOkB,CAAU;AAAA,MACpCS;AAAA,GCAO6E,KAA0B,CAAC;AAAA,EACpC,QAAA9B,IAAS;AAAA,EACT,aAAA+B,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,UAAA9I;AACJ,MAAM;AACI,QAAA2G,IAAUoC,GAAQ,MACb;AAAA,IACH;AAAA,MACI,OAAOF;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACb;AAAA,IACJ;AAAA,IACA;AAAA,MACI,OAAOC;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACb;AAAA,IACJ;AAAA,EAAA,GAEL,CAACD,GAAaC,CAAY,CAAC;AAE1B,SAAA,gBAAAnH,EAAA;AAAA,IAACqG;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,QAAAlB;AAAA,MACA,OAAOH;AAAA,MACP,YAAY,CAACK,MAAc;AACvB,cAAMgC,IAAUhC,EAAK,cAAc,sBAAsB,YAAY;AACrE,eACK,gBAAArF,EAAA,cAAA,MAAA,EAAG,KAAKqF,EAAK,aACV,gBAAArF,EAAA;AAAA,UAACO;AAAA,UAAA;AAAA,YACG,SAAS,MAAM;AACX,cAAAlC,EAAS,UAAUgH,CAAI;AAAA,YAC3B;AAAA,YACA,cAAYA,EAAK;AAAA,YACjB,OAAOA,EAAK;AAAA,YACZ,SAAAgC;AAAA,UAAA;AAAA,0CAECjH,GAAY,EAAA,QAAQiF,EAAK,QAAQ,MAAM,IAAI;AAAA,QAAA,CAEpD;AAAA,MAER;AAAA,IAAA;AAAA,EAAA;AAGZ,GAEMgB,KAAiB5F,EAAOgF,CAAQ;AAAA,MAChC,CAAC9E,MAAM+E,EAAS/E,CAAC;AAAA;AAAA;AAAA;AAAA,eAIR,CAACA,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAK/B,CAACD,MAAMyB,EAAsBzB,CAAC;AAAA,GAG9BJ,KAAeE,EAAOI,CAAM;AAAA,MAC5BkC;AAAA;AAAA,wBAEkB,CAACpC,MAAMA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvBG;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKW,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA,0BAGlB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCnF3C0G,KAAU,CAAC,CAACzB,GAAMC,CAAO,OACpB,EAAE,MAAAD,GAAM,SAAAC,MAGNyB,KAAyB,CAAC,EAAE,OAAAC,GAAO,UAAAnJ,QAExC,gBAAA2B,EAAA;AAAA,EAACyH;AAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,OAAOD,EAAM,IAAIF,EAAO;AAAA,IACxB,UAAQ;AAAA,IACR,YAAY,CAACjC,MAAc;AACvB,cAAQA,EAAK,MAAM;AAAA,QACf,KAAKqC,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAA8G,IAAA,EAAK,MAAMzB,EAAK,QAAS,CAAA;AAAA,QAErC,KAAKqC,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAA2C,IAAAhD,EAAA,IAAS0F,EAAK,QAAS;AAAA,QAEnC,KAAKqC,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAA4G,IAAAjH,EAAA,IAAc0F,EAAK,QAAS;AAAA,QAExC,KAAKqC,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAAyF,IAAAkC,EAAAhI,EAAA,IAAa0F,EAAK,UAAlB,EAA2B,UAAAhH,EAAoB,EAAA;AAAA,QAE3D,KAAKqJ,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAAyG,IAAAkB,EAAAhI,EAAA,IAAa0F,EAAK,UAAlB,EAA2B,UAAAhH,EAAoB,EAAA;AAAA,QAE3D,KAAKqJ,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAAkF,IAAAyC,EAAAhI,EAAA,IAAe0F,EAAK,UAApB,EAA6B,UAAAhH,EAAoB,EAAA;AAAA,QAE7D,KAAKqJ,EAAgC;AACjC,iBAAQ,gBAAA1H,EAAA,cAAAiH,IAAAU,EAAAhI,EAAA,IAAiB0F,EAAK,UAAtB,EAA+B,UAAAhH,EAAoB,EAAA;AAAA,QAE/D;AACI,iDAAQuH,IAAO,EAAA,MAAMP,EAAK,MAAM,SAASA,EAAK,QAAS,CAAA;AAAA,MAE/D;AAAA,IACJ;AAAA,EAAA;AAAA,GAKNoC,KAAahH,EAAOoC,EAAI;AAAA,MACxB+E;AAAA;AAAA;AAAA;AAAA;AAAA,GCtCOC,KAAsB5E;AAAA,EAC/B,CAAC,EAAE,WAAAxF,GAAW,WAAAkG,GAAW,QAAAK,GAAQ,MAAA6B,GAAM,SAAAC,KAAW1C,MAAQ;AACtD,UAAM0E,IAA0BC;AAAA,MAC5B,CAACC,MAA2B;AACxB,YAAIC,IAAwB;AACxB,eAAAnC,EAAQ,SAAS,MACjBmC,IACID,MAAU,IAAI,UAAUA,IAAQ,MAAMlC,EAAQ,SAAS,SAAS,WAEjEmC;AAAA,MACX;AAAA,MACA,CAACnC,CAAO;AAAA,IAAA,GAGNoC,IAAsB,MAGf,gBAAAlI,EAAA,cAAAA,EAAA,UAAA,MAAA8F,EAAQ,IAAI,CAACT,MAAS;AACnB,YAAM,EAAE,KAAA8C,GAAK,MAAAjC,GAAM,OAAAkC,GAAO,MAAAC,GAAM,SAAArD,EAAY,IAAAK,GACtCf,IAAW,CAAC,CAAC4B,KAAQ,CAACkC,KAAS,CAACC,KAAQ,CAACrD;AAE3C,aAAA,gBAAAhF,EAAA;AAAA,QAACqE;AAAAA,QAAA;AAAA,UACG,WAAA5G;AAAA,UACA,KAAA0K;AAAA,UACA,UAAA7D;AAAA,UACA,KAAAlB;AAAA,UACA,WAAAO;AAAA,UACA,WAAW,CAAC,CAAC0E,KAAQ,CAAC,CAACrD;AAAA,QAAA;AAAA,QAEtBV,KAAY4B,IACR,gBAAAlG,EAAA,cAAA2C,GAAA,EAAK,MAAMuD,EAAM,CAAA,IAElB,gBAAAlG,EAAA,cAACsI,GAAQ,EAAA,UAAQ,IAAC,SAASjD,GAAM;AAAA,MAAA;AAAA,IAIhD,CAAA,CACL,GAIFkD,IAAqB,MAElB,gBAAAvI,EAAA,cAAA8D,IAAA,EAAa,QAAAE,GAAgB,WAAAL,GAAsB,WAAAlG,EAChD,GAAA,gBAAAuC,EAAA,cAACyB,GAAc,EAAA,WAAU,gCACpB,GAAAqE,EAAQ,IAAI,CAACT,GAAM2C,MAEZ,gBAAAhI,EAAA;AAAA,MAAC4B;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,MAAI;AAAA,QACJ,KAAKyD,EAAK;AAAA,QACV,KAAAjC;AAAA,MAAA;AAAA,MAEA,gBAAApD,EAAA;AAAA,QAACsI;AAAA,QAAA;AAAA,UACG,SAASjD;AAAA,UACT,SAASyC,EAAwBE,CAAK;AAAA,QAAA;AAAA,MAC1C;AAAA,IAAA,CAGX,CACL,CACJ,GAIFQ,IAAoB,MAEjB,gBAAAxI,EAAA,cAAA2E,IAAA,EAAY,WAAAhB,GAAsB,WAAAlG,EAAA,GAC9B,gBAAAuC,EAAA,cAAAyB,GAAA,EAAc,WAAU,gCAAA,GACpBqE,EAAQ,IAAI,CAACT,GAAM2C,MAEZ,gBAAAhI,EAAA;AAAA,MAAC4B;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,OAAK;AAAA,QACL,KAAKyD,EAAK;AAAA,QACV,KAAAjC;AAAA,MAAA;AAAA,MAEA,gBAAApD,EAAA;AAAA,QAACsI;AAAA,QAAA;AAAA,UACG,QAAM;AAAA,UACN,SAASjD;AAAA,UACT,SAASyC,EAAwBE,CAAK;AAAA,QAAA;AAAA,MAC1C;AAAA,IAAA,CAGX,CACL,CACJ;AAIR,YAAQnC,GAAM;AAAA,MACV,KAAK4C,EAAwB;AACzB,eAAOP,EAAoB;AAAA,MAC/B,KAAKO,EAAwB;AACzB,eAAOF,EAAmB;AAAA,MAC9B,KAAKE,EAAwB;AACzB,eAAOD,EAAkB;AAAA,MAC7B;AACW,eAAA;AAAA,IACf;AAAA,EACJ;AACJ,GAWMF,IAAyC,CAAC,EAAE,SAAAxC,GAAS,QAAA4C,GAAQ,UAAAC,GAAU,SAAA3G,QAAc;AACvF,QAAM3D,IAAWC,KACX,EAAE,OAAA8J,GAAO,MAAAlC,GAAM,SAAAlB,GAAS,MAAAqD,GAAM,OAAAb,EAAU,IAAA1B;AAI9C,SADyB0B,IA6DpB,gBAAAxH,EAAA,cAAA6B,GAAA,EAAe,WAAU,0BAAyB,MAAM,CAAC,CAAC6G,GAAQ,SAAA1G,EAC/D,GAAA,gBAAAhC,EAAA,cAACuH,IAAY,EAAA,OAAAC,GAAc,UAAAnJ,EAAoB,CAAA,CACnD,IA5DI,gBAAA2B,EAAA;AAAA,IAAC6B;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,QAAQ,CAAC8G;AAAA,MACT,MAAM,CAAC,CAACD;AAAA,MACR,SAAA1G;AAAA,MACA,WAAW,CAAC,CAACqG,KAAQ,CAAC,CAACrD;AAAA,IAAA;AAAA,IAEtBoD,qCACIjG,GACG,MAAA,gBAAAnC,EAAA,cAAC0B,MAAa,SAAQ,KAAA,GAAM0G,CAAM,CACtC;AAAA,IAEHlC,KACI,gBAAAlG,EAAA,cAAAmC,GAAA,sCACIO,IAAW,EAAA,MAAMwD,EAAM,CAAA,CAC5B;AAAA,IAEHmC,qCACIlG,GACG,MAAA,gBAAAnC,EAAA;AAAA,MAACqC;AAAA,MAAAsF,EAAAhI,EAAA,IACO0I,IADP;AAAA,QAEG,UAAU,CAACF,GAAaS,MAAc;AAClC,UAAAvK,EAAS,QAAQ;AAAA,YACb,MAAAuK;AAAA,YACA,SAASP,EAAK,OAAO;AAAA,YACrB,WAAWF;AAAA,UAAA,CACd;AAAA,QACL;AAAA,MAAA;AAAA,IAAA,CAER;AAAA,IAEHnD,qCACI7C,GACG,MAAA,gBAAAnC,EAAA;AAAA,MAAC4C;AAAA,MAAA;AAAA,QACG,OAAO,OAAO,KAAKoC,CAAO,EAAE,IAAI,CAAC,OACtB,EAAE,OAAOA,EAAQ,CAAC,GAAG,WAAW,IAC1C;AAAA,QACD,YAAY,CAACK,MAEJ,gBAAArF,EAAA,cAAA,MAAA,EAAG,KAAKqF,EAAK,aACV,gBAAArF,EAAA;AAAA,UAAC8C;AAAA,UAAA;AAAA,YACG,SAAS,MAAM;AACF,cAAAzE,EAAA,UAAUgH,EAAK,SAAS;AAAA,YACrC;AAAA,UAAA;AAAA,UAECA,EAAK;AAAA,QAAA,CAEd;AAAA,MAER;AAAA,IAAA,CAER;AAAA,EAAA;AAWpB,GCnMawD,KAAgC,MAAM;AACzC,QAAAC,IAAkBf,GAAY,CAACgB,MAAyB;AAC1D,IAAIA,KACA,WAAW,MAAM;AACb,MAAAA,EAAK,eAAe;AAAA,QAChB,OAAO;AAAA,QACP,UAAU;AAAA,MAAA,CACb;AAAA,OACF,GAAG;AAAA,EAEd,GAAG,CAAE,CAAA,GAEC,CAACjK,GAAekK,CAAQ,IAAIhK,GAAU,EAAI,GAC1C;AAAA,IACF,UAAAiK;AAAA,IACA,SAAAC;AAAA,IACA,cAAAC,IAAe,CAAC;AAAA,MAChBtK,EAA+C,GAE7CuK,IAAqB,MACnBD,KAAgBA,EAAa,SACtBA,EAAa,IAAI,CAACE,GAAkCrB,MAEnD,gBAAAhI,EAAA,cAACsJ,GAAa,EAAA,IAAI,UAAUD,EAAM,QAAQ,KAAK,UAAUA,EAAM,OAAA,GAC1D,gBAAArJ,EAAA,cAAA8D,IAAA,EAAa,WAAW,KAAK,IAAO,GAAA,QAAQuF,EACzC,GAAA,gBAAArJ,EAAA,cAACgD,IAAmB,EAAA,OAAK,IAAC,KAAK8F,EAAiB,CAAA,CACpD,CACJ,CAEP,IAEE;AAGX,SAEQ,gBAAA9I,EAAA,cAAAA,EAAA,UAAA,MAAA,gBAAAA,EAAA,cAACuJ,IAAW,EAAA,UAAU,GAAG,eAAAzK,GAA8B,KAAKkK,KACvDC,KAAYA,EAAS,SAChBA,EAAS,IAAI,CAACO,GAAqCxB,MAAU;AACzD,UAAM,EAAE,MAAAnC,GAAM,WAAAlC,GAAW,QAAAK,GAAQ,SAAA8B,MAAY0D;AAEzC,WAAA,gBAAAxJ,EAAA;AAAA,MAACsJ;AAAA,MAAA;AAAA,QACG,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK,GAAGzD,KAAQ7B,KAAA,gBAAAA,EAAQ,QAAQL,KAAamC,EAAQ,CAAC,EAAE;AAAA,MAAA;AAAA,MAEvD,gBAAA9F,EAAA,cAAA6H,IAAAF,EAAAhI,EAAA,IAAwB6J,IAAxB,EAAiC,KAAKV,IAAiB;AAAA,IAAA;AAAA,EAC5D,CAEP,IACD,MACLM,EAAmB,GACnBF,KACI,gBAAAlJ,EAAA,cAAAsJ,GAAA,MACI,gBAAAtJ,EAAA,cAAAgD,IAAA,EAAmB,KAAK8F,EAAiB,CAAA,CAC9C,CAER,GACA,gBAAA9I,EAAA,cAACxC,QAAkB,CACvB;AAER,GAEM+L,KAAa9I,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKT,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,MACjC,CAACD,MAAM,CAAC,CAACA,EAAE,iBAAiBA,EAAE;AAAA;AAAA,UAE1B,CAACA,MAAMG,EAAeH,CAAC;AAAA;AAAA,GAI3B2I,IAAe7I,EAAO;AAAA;AAAA,qBAEP,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA,sBAGrB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA,0BAIlB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc1C,CAACD,MACC6F,EAAe7F,CAAC;AAAA,EACZ;AAAA,EACAI;AAAA;AAAA;AAGJ;AAAA,GCnGK0I,KAAwC,CAAC,EAAE,UAAApL,QAAe;AAC7D,QAAAqL,IAAaC,GAAuB,IAAI;AAE9C,SAAA1K,GAAU,MAAM;AACZ,IAAIyK,EAAW,WAAWA,EAAW,QAAQ,cAChCrL,EAAA,mBAAmBqL,EAAW,OAAO;AAAA,EAClD,GACD,CAACA,CAAU,CAAC,GAGX,gBAAA1J,EAAA;AAAA,IAAC4J;AAAA,IAAA;AAAA,MACG,UAAS;AAAA,MACT,WAAU;AAAA,MACV,KAAKF;AAAA,IAAA;AAAA,EAAA;AAGjB,GAQaG,KAA0D,CAAC;AAAA,EACpE,UAAAxL;AAAA,EACA,QAAA8G;AAAA,EACA,aAAA2E;AACJ,MAEQ,gBAAA9J,EAAA;AAAA,EAAC+J;AAAA,EAAA;AAAA,IACG,UAAS;AAAA,IACT,WAAU;AAAA,EAAA;AAAA,EAEV,gBAAA/J,EAAA,cAACgK,IAAwB,EAAA,WAAU,kCAC/B,GAAA,gBAAAhK,EAAA;AAAA,IAACiK;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,cAAYH;AAAA,MACZ,OAAOA;AAAA,MACP,SAAS,MAAMzL,EAAS,2BAA2B;AAAA,IAAA;AAAA,IAEnD,gBAAA2B,EAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AAAA,QACA,MAAM;AAAA,MAAA;AAAA,IACV;AAAA,EAAA,GAEH+E,KACG,gBAAAnF,EAAA;AAAA,IAACkK;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAQ;AAAA,IAAA;AAAA,IAEP/E;AAAA,EAAA,CAGb;AAAA,kCACC0D,IAAoB,IAAA;AAAA,GAK3BkB,KAA4BtJ,EAAOmJ,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAO7B,CAACjJ,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,8BACvB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,GAG9CoJ,KAA0BvJ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAK5B,CAACE,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,eAClB,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,MAC/B,CAACD,MAAMA,EAAE,MAAM,UAAU,kBAAkBA,EAAE,MAAM;AAAA,GAGnDuJ,KAA4BzJ,EAAOkB,CAAU;AAAA,iBAClC,CAAChB,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,aAC1B,CAACD,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA,GAI9BqJ,KAAgCxJ,EAAOI,CAAM;AAAA;AAAA;AAAA;AAAA,eAIpC,CAACF,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA,KAAS,CAACD,MAAA;;AAAM,UAAAC,IAAAD,EAAE,MAAM,UAAR,gBAAAC,EAAe;AAAA;AAAA,MAC9D,CAACD,MAAMA,EAAE,MAAM,gBAAgB,kBAAkBA,EAAE,MAAM;AAAA;AAAA;AAAA,UAGrDG;AAAA;AAAA;AAAA;AAAA,kBAIQ,CAACH,MAAM;;AAAA,UAAAC,IAAAD,EAAE,MAAM,WAAR,gBAAAC,EAAgB;AAAA;AAAA;AAAA,GC1GnCuJ,KAAgC,CAACvJ,MAA4B;AAA5B,MAAAI,IAAAJ,GAAE,aAAAnD,MAAFuD,GAAgBE,IAAAC,EAAhBH,GAAgB,CAAd;AAC/B,QAAA;AAAA,IACF,SAAAoJ;AAAA,IACA,2BAAAC;AAAA,IACA,+BAAAC;AAAA,IACA,0BAAAC;AAAA,MACA1L,EAA+C,GAC7CR,IAAWC;AAGb,SAAA,gBAAA0B,EAAA;AAAA,IAACwK,GAAoB;AAAA,IAApB;AAAA,MACG,OAAOD,IAA2B,EAAE,IAAIA,EAA6B,IAAA;AAAA,IAAA;AAAA,IAErE,gBAAAvK,EAAA;AAAA,MAACC;AAAA,MAAA0H,EAAAhI,EAAA,IACOuB,IADP;AAAA,QAEG,WAAWhB,EAAiBzC,GAAW,+BAA+B;AAAA,MAAA;AAAA,sCAErEoL,IAAoB,IAAA;AAAA,IACzB;AAAA,IACCuB,KAEO,gBAAApK,EAAA,cAAAA,EAAA,UAAA,MAAA,gBAAAA,EAAA,cAACyJ,MAAc,UAAApL,EAAoB,CAAA,GAClC+L,EAAQ,gBACL,gBAAApK,EAAA;AAAA,MAAC6J;AAAA,MAAA;AAAA,QACG,UAAAxL;AAAA,QACA,QAAQgM;AAAA,QACR,aAAaC;AAAA,MAAA;AAAA,IAAA,CAGzB;AAAA,EAAA;AAIhB,GAEMrK,KAAUQ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
|
1
|
+
{"version":3,"file":"conversation-5f8374bf.js","sources":["../src/components/conversation/ui/input.tsx","../src/components/conversation/ui/styles.tsx","../src/components/conversation/ui/loader.tsx","../src/components/conversation/ui/message-types/timestamp.tsx","../src/components/conversation/ui/message-types/agent.tsx","../src/components/conversation/ui/message-types/system.tsx","../src/components/conversation/ui/message-types/user.tsx","../src/utils/map-actions.ts","../src/components/conversation/ui/message-list-items/button-list.tsx","../src/components/conversation/ui/message-list-items/custom.tsx","../src/components/conversation/ui/message-list-items/html.tsx","../src/components/conversation/ui/message-list-items/item-list.tsx","../src/components/conversation/ui/message-list-items/link-list.tsx","../src/components/conversation/ui/message-list-items/separator.tsx","../src/components/conversation/ui/message-list-items/text.tsx","../src/components/conversation/ui/message-list-items/video-request.tsx","../src/components/conversation/ui/message-types/message-list.tsx","../src/components/conversation/ui/message.tsx","../src/components/conversation/ui/content.tsx","../src/components/conversation/ui/overlay-outlets.tsx","../src/components/conversation/conversation.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n Input,\n SymbolBadge,\n useDispatch,\n useIsTabbing,\n useProperties,\n useScroll,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useEffect, useState } from 'react';\nimport { ConversationComponentProperties } from '../plugin';\n\ntype Props = {\n className?: string;\n};\n\nconst ConversationInput: React.FC<Props> = ({ className }) => {\n const [inputText, setInputText] = useState('');\n const [inputFocus, setInputFocus] = useState(false);\n const [calculatedLineHeight, setCalculatedLineHeight] = useState(0);\n const [textareaMaxHeight, setTextareaMaxHeight] = useState(0);\n const isTabbing = useIsTabbing();\n const dispatch = useDispatch();\n const {\n inputPlaceholder = 'Type your message',\n inputHidden = false,\n inputDisabled = false,\n sendButtonLabel = 'Send message',\n inputMultiline: multiline = true,\n secondaryAction,\n } = useProperties<ConversationComponentProperties>();\n const [scrollableCss, inputRef] = useScroll(true);\n\n useEffect(() => {\n if (inputRef.current) {\n const { lineHeight, maxHeight } = getComputedStyle(inputRef.current);\n if (lineHeight && lineHeight.indexOf('px') > -1) {\n const lineHeightNumber = lineHeight.split('px');\n const calcLH = parseInt(lineHeightNumber[0], 10);\n setCalculatedLineHeight(calcLH);\n const maxHeightNumber = maxHeight.split('px');\n setTextareaMaxHeight(parseInt(maxHeightNumber[0], 10));\n }\n }\n }, [inputRef.current]);\n\n const submit = (e: any) => {\n if (!e.shiftKey || !multiline) {\n e.preventDefault();\n if (inputText && inputText.length > 0) {\n dispatch('user-submit', { text: inputText });\n setInputText('');\n onChange('');\n }\n } else if (inputText.length < 1) {\n e.preventDefault();\n }\n };\n\n const onSecondaryActionButtonClick = (e: any) => {\n if (!secondaryAction) {\n return;\n }\n e.preventDefault();\n dispatch('action', {\n actionKey: secondaryAction.action,\n ...secondaryAction,\n });\n };\n\n const calculateHeight = (value: string) => {\n if (multiline && inputRef.current) {\n const scrollHeight = inputRef.current.scrollHeight;\n if (scrollHeight > calculatedLineHeight) {\n inputRef.current.style.height = 'auto';\n let areaHeight = scrollHeight;\n if (value.length < 1) {\n areaHeight = calculatedLineHeight;\n }\n inputRef.current.style.height = `${areaHeight}px`;\n\n if (areaHeight >= textareaMaxHeight) {\n inputRef.current.style.overflowY = 'scroll';\n } else {\n inputRef.current.style.overflowY = 'hidden';\n }\n }\n }\n };\n\n const onChange = (value: string) => {\n calculateHeight(value);\n setInputText(value);\n if (value && value.length > 0) {\n dispatch('user-typing', { textLength: value.length });\n }\n };\n\n if (inputHidden) {\n return null;\n }\n\n return (\n <Wrapper\n grow={multiline}\n className={appendClassNames('humany-conversation-input', className)}\n data-has-focus={inputFocus}\n scrollableCss={scrollableCss}\n isTabbing={isTabbing}\n >\n {secondaryAction && (\n <SecondaryActionButton\n disabled={inputDisabled}\n onClick={onSecondaryActionButtonClick}\n title={secondaryAction.label}\n aria-label={secondaryAction.label}\n >\n <SymbolBadge\n size={24}\n symbol={{ type: 'Svg', content: secondaryAction.icon || 'browse' }}\n />\n </SecondaryActionButton>\n )}\n {multiline ? (\n <StyledTextArea\n value={inputText}\n onChange={onChange}\n onEnter={submit}\n disabled={inputDisabled}\n aria-label={inputPlaceholder}\n placeholder={inputPlaceholder}\n onFocusChange={setInputFocus}\n type={'textarea'}\n rows={1}\n ref={inputRef}\n />\n ) : (\n <StyledInput\n value={inputText}\n onChange={onChange}\n onEnter={submit}\n disabled={inputDisabled}\n aria-label={inputPlaceholder}\n placeholder={inputPlaceholder}\n onFocusChange={setInputFocus}\n />\n )}\n <StyledButton\n disabled={inputDisabled}\n onClick={submit}\n title={sendButtonLabel}\n aria-label={sendButtonLabel}\n >\n <SendSymbol\n size={22}\n symbol={{ type: 'Svg', content: 'send' }}\n hasContent={!!inputText && !!inputText.length}\n />\n </StyledButton>\n </Wrapper>\n );\n};\n\nconst StyledTextArea = styled(Input)<any>`\n resize: none;\n flex: 1;\n flex-shrink: 1;\n min-height: 1.2em;\n max-height: 148px;\n line-height: 1.2em;\n height: 1.2em;\n padding: 0;\n margin: ${(p) => p.theme.sizes?.medium};\n font-size: ${(p) => p.theme.fonts?.normal};\n border: none;\n transition: height 200ms linear;\n outline: none;\n`;\n\nconst StyledInput = styled(Input)<any>`\n flex: 1;\n border: none;\n background-color: transparent;\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n line-height: 1.2em;\n outline: none;\n padding: ${(p) => p.theme.sizes?.medium};\n color: ${(p) => p.theme.colors?.text};\n &::placeholder {\n color: ${(p) => p.theme.colors?.textLight};\n font-style: italic;\n }\n`;\n\nconst StyledButton = styled(Button)<any>`\n flex: 0 0 50px;\n align-self: stretch;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n color: #a6a6a6;\n &:focus-visible {\n ${borderTabStyle};\n }\n`;\n\nconst SecondaryActionButton = styled(StyledButton)`\n border-right: ${(p) => p.theme.border};\n margin: ${(p) => p.theme.sizes?.normal} 0;\n`;\n\nconst Wrapper = styled.div<{ 'data-has-focus': boolean } & any>`\n ${(p) =>\n p.grow\n ? css`\n min-height: 50px;\n max-height: 150px;\n `\n : css`\n height: 50px;\n `}\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n background-color: ${(p) => p.theme.colors?.accent};\n border-top: ${(p) => p.theme.inputBorder};\n ${(p) => p['data-has-focus'] && p.isTabbing && borderTabStyle}\n textarea {\n ${(p) => !!p.scrollableCss && p.scrollableCss}\n }\n`;\n\nconst SendSymbol = styled(\n ({\n hasContent,\n ...other\n }: {\n hasContent: boolean;\n size: number;\n symbol: { type: string; content: string };\n }) => <SymbolBadge {...other} />\n)`\n line,\n path {\n stroke: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\n fill: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\n }\n`;\n\nexport default ConversationInput;\n","import { css, keyframes, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { FormComponent } from '@telia-ace/widget-forms';\nimport {\n borderTabStyle,\n buttonCss,\n Html,\n invertedHoverButton,\n List,\n Typography,\n} from '@telia-ace/widget-ui';\n\nexport const Avatar = styled.div<any>`\n width: ${(p) => p.avatarSize || '32px'};\n height: ${(p) => p.avatarSize || '32px'};\n border-radius: 50%;\n background-color: ${(p) => p.theme.colors?.accent};\n border: ${(p) => p.theme.border};\n grid-area: avatar;\n align-self: flex-end;\n justify-self: center;\n overflow: hidden;\n margin-right: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n color: ${(p) => p.theme.colors?.text};\n\n > img {\n height: 100%;\n width: 100%;\n object-fit: cover;\n }\n\n > svg {\n width: 90%;\n height: 90%;\n padding: 10%;\n color: ${(p) => p.theme.colors?.text};\n\n line,\n path,\n circle,\n fill {\n stroke: ${(p) => p.theme.colors?.text};\n }\n }\n`;\n\nexport const LoaderAnimation = keyframes`\n 0% {\n opacity: 0;\n }\n 75% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n`;\n\nexport const Loader = styled.div`\n display: flex;\n justify-content: center;\n > div {\n height: 10px;\n width: 10px;\n border-radius: 50%;\n margin: 5px;\n background-color: ${(p) => p.theme.colors?.text};\n animation: ${LoaderAnimation} 1s infinite;\n }\n > div:nth-of-type(2) {\n animation-delay: 100ms;\n }\n > div:nth-of-type(3) {\n animation-delay: 200ms;\n }\n`;\n\nexport const ContentBundle = styled.div`\n grid-area: content;\n max-width: 100%;\n overflow: hidden;\n`;\n\nexport const MessageTitle = styled(Typography)`\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: normal;\n margin: 0;\n`;\n\nexport const MessageContainer = styled.div<{ left?: boolean; center?: boolean; right?: boolean }>`\n display: flex;\n ${(p) => p.left && 'justify-content: start;'};\n ${(p) => p.center && 'justify-content: center;'};\n ${(p) => p.right && 'justify-content: end;'};\n`;\n\nexport type Stacked = 'first' | 'last' | 'middle';\n\nexport const MessageContent = styled.div<{\n user?: boolean;\n fullWidth?: boolean;\n stacked?: Stacked;\n padded?: boolean;\n}>`\n ${(p) => p.padded && `padding: ${p.theme.sizes?.medium};`}\n ${(p) => !p.user && p.stacked && nonUserMessageStyling(p.stacked, p.theme)}\n ${(p) => p.user && p.stacked && userMessageStyling(p.stacked, p.theme)}\n\n display: inline-block;\n margin-top: ${(p) => p.theme.sizes?.normal};\n && > * {\n overflow-wrap: break-word;\n word-wrap: break-word;\n word-break: break-all;\n word-break: break-word;\n hyphens: auto;\n }\n max-width: 100%;\n ${(p) => p.fullWidth && 'width: 100%;'}\n`;\n\nconst nonUserMessageStyling = (stacked: Stacked, theme: any) => {\n const colors = css`\n background-color: ${theme.colors?.accent};\n color: ${theme.colors?.text};\n ${theme.border && `border: ${theme.border};`};\n `;\n\n if (!theme.borderRadius) {\n return colors;\n }\n\n return css`\n ${colors}\n\n border-top-right-radius: ${theme.borderRadius};\n border-bottom-right-radius: ${theme.borderRadius};\n\n ${stacked === 'first' &&\n `\n border-top-left-radius: ${theme.borderRadius};\n `}\n\n ${stacked === 'last' &&\n `\n border-bottom-left-radius: ${theme.borderRadius};\n `}\n `;\n};\n\nconst userMessageStyling = (stacked: Stacked, theme: any) => {\n const colors = css`\n background-color: ${theme.colors?.primary};\n color: ${theme.colors?.accent};\n `;\n\n if (!theme.borderRadius) {\n return colors;\n }\n\n return css`\n ${colors}\n\n border-top-left-radius: ${theme.borderRadius};\n border-bottom-left-radius: ${theme.borderRadius};\n\n ${stacked === 'first' &&\n `\n border-top-right-radius: ${theme.borderRadius};\n `}\n\n ${stacked === 'last' &&\n `\n border-bottom-right-radius: ${theme.borderRadius};\n `}\n `;\n};\n\nexport const MessageContentPart = styled.div`\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n &:last-child {\n margin-bottom: 0;\n }\n`;\n\nexport const messageContentPadding = (p: { theme: Theme }) => css`\n margin: ${p.theme.sizes?.medium} 0;\n padding: 0 ${p.theme.sizes?.medium};\n`;\n\nexport const StyledForm = styled(FormComponent)`\n & button.humany-form-component-button {\n ${(p) =>\n p.theme.colors?.primary &&\n p.theme.colors?.accent &&\n invertedHoverButton({\n active: false,\n primaryColor: p.theme.colors?.primary,\n secondaryColor: p.theme.colors?.accent,\n theme: p.theme,\n })};\n display: block;\n width: 100%;\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n }\n & button.humany-form-component-submit {\n width: 100%;\n margin: 0;\n :not(:last-child) {\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n }\n }\n`;\n\nexport const StyledHtml = styled(Html)<any>`\n white-space: pre-wrap;\n a {\n color: ${(p) => p.theme.colors.link};\n &:focus {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\n }\n }\n`;\n\nexport const StyledActionList = styled(List)`\n padding: 0;\n list-style: none;\n margin: 0 -${(p) => p.theme.sizes?.normal};\n > li {\n margin: ${(p) => p.theme.sizes?.normal};\n }\n`;\n\nexport const StyledActionButton = styled.button`\n ${(p) => buttonCss(p)};\n display: block;\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #fff;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n`;\n","import React, { forwardRef } from 'react';\nimport { ConversationMessageSender } from '../../../types';\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './styles';\n\ntype Props = {\n className?: string;\n agentData?: ConversationMessageSender;\n boxed?: boolean;\n};\n\nconst ConversationLoader = forwardRef<HTMLDivElement, Props>(\n ({ boxed, className, agentData }, ref) => {\n return (\n <ContentBundle ref={ref}>\n <MessageContainer left={boxed} center={!boxed}>\n <MessageContent padded={!!boxed} stacked={boxed ? 'first' : undefined}>\n <Loader>\n <div />\n <div />\n <div />\n </Loader>\n </MessageContent>\n </MessageContainer>\n </ContentBundle>\n );\n }\n);\n\nexport default ConversationLoader;\n","import styled from '@emotion/styled';\nimport React from 'react';\n\ntype Props = {\n className?: string;\n name?: string;\n timestamp?: number | null;\n};\n\nconst StyledTimestamp = styled.p`\n && {\n font-size: ${(p) => p.theme.fonts?.small};\n font-weight: 300;\n }\n margin: 0;\n line-height: 1.5em;\n grid-area: info;\n color: ${(p) => p.theme.colors?.text};\n`;\n\nconst getTimestamp = (raw: number) => {\n return new Date(raw).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n};\n\nconst Timestamp: React.FC<Props> = ({ className, name, timestamp }) => {\n if (!name && !timestamp) {\n return null;\n }\n\n let output = '';\n if (name) {\n if (timestamp) {\n output = `${name}: ${getTimestamp(timestamp)}`;\n } else {\n output = name;\n }\n } else if (timestamp) {\n output = getTimestamp(timestamp);\n }\n\n return <StyledTimestamp>{output}</StyledTimestamp>;\n};\n\nexport default Timestamp;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { SymbolBadge, useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationMessageSender } from '../../../../types';\nimport { ConversationComponentProperties } from '../../plugin';\nimport { Avatar } from '../styles';\nimport Timestamp from './timestamp';\n\ntype Props = {\n className?: string;\n children: any;\n sender: ConversationMessageSender;\n timestamp: number | null;\n};\n\nconst AgentMessage: React.FC<Props> = ({ className, children, sender, timestamp }) => {\n const { avatar, name } = sender;\n const { avatarSize } = useProperties<ConversationComponentProperties>();\n\n return (\n <StyledAgentMessage\n hasAvatar={!!avatar}\n className={appendClassNames(className, 'humany-conversation-agent-message')}\n >\n {avatar && (\n <Avatar avatarSize={avatarSize}>\n {typeof avatar === 'string' ? (\n <img src={avatar} />\n ) : (\n <SymbolBadge symbol={avatar} />\n )}\n </Avatar>\n )}\n {children}\n <Timestamp name={name} timestamp={timestamp}></Timestamp>\n </StyledAgentMessage>\n );\n};\n\nexport const StyledAgentMessage = styled.div<any>`\n display: grid;\n margin-right: 10%;\n width: 90%;\n ${(p) =>\n p.hasAvatar\n ? css`\n grid-template-columns: auto 1fr;\n grid-template-rows: 1fr auto;\n grid-template-areas:\n 'avatar content'\n '. info';\n `\n : css`\n grid-template-columns: 1fr;\n grid-template-rows: 1fr auto;\n grid-template-areas:\n 'content'\n 'info';\n `};\n`;\n\nexport default AgentMessage;\n","import styled from '@emotion/styled';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { forwardRef } from 'react';\nimport Timestamp from './timestamp';\n\nexport type Props = {\n className?: string;\n timestamp: number;\n discrete?: boolean;\n fullWidth?: boolean;\n children: any;\n};\n\nconst SystemMessage = forwardRef<HTMLDivElement, Props>(\n ({ className, children, timestamp, discrete, fullWidth }, ref) => {\n return (\n <StyledSystemMessage\n ref={ref}\n className={appendClassNames(className, 'humany-conversation-system-message')}\n fullWidth={fullWidth}\n >\n {discrete ? (\n <Discrete className=\"humany-conversation-discrete-message\">\n {children}\n <Timestamp timestamp={timestamp}></Timestamp>\n </Discrete>\n ) : (\n <>\n {children}\n <Timestamp timestamp={timestamp}></Timestamp>\n </>\n )}\n </StyledSystemMessage>\n );\n }\n);\n\nexport const StyledSystemMessage = styled.div<any>`\n ${(p) => p.fullWidth && 'width: 100%'};\n padding: 0 ${(p) => p.theme.sizes?.large};\n overflow: auto;\n`;\n\nexport const Discrete = styled.div`\n text-align: center;\n word-wrap: break-word;\n font-size: ${(p) => p.theme.fonts?.normal};\n color: ${(p) => p.theme.colors?.text};\n > p {\n margin: 0;\n }\n`;\n\nexport default SystemMessage;\n","import styled from '@emotion/styled';\nimport { useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationComponentProperties } from '../../plugin';\nimport Timestamp from './timestamp';\n\nexport type Props = {\n className?: string;\n timestamp: number;\n children: any;\n};\n\nconst UserMessage: React.FC<Props> = ({ className, children, timestamp }) => {\n const { userLabel = '' } = useProperties<ConversationComponentProperties>();\n return (\n <StyledUserMessage\n className={appendClassNames(className, 'humany-conversation-user-message')}\n >\n {children}\n <Timestamp name={userLabel} timestamp={timestamp}></Timestamp>\n </StyledUserMessage>\n );\n};\n\nconst StyledUserMessage = styled.div`\n margin-left: 10%;\n width: 90%;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n`;\n\nexport default UserMessage;\n","export const mapActions = (actions: any) =>\n Array.isArray(actions)\n ? actions\n : Object.keys(actions).map((i) => {\n return {\n label: actions[i],\n actionKey: i,\n };\n });\n","import styled from '@emotion/styled';\nimport {\n Button,\n DispatchAction,\n ItemList,\n Link,\n SymbolBadge,\n borderTabStyle,\n buttonCss,\n itemList\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { ButtonListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & ButtonListProperties;\n\nexport const ButtonList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledButtonList\n className=\"humany-conversation-button-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n const isLink: boolean = !!item?.data?.href;\n return (\n <li key={item.actionKey}>\n {isLink ? \n (\n <StyledButtonListLink\n onClick={() => {\n dispatch('action', item);\n }}\n href={item.data.href}\n target={item.data.target}\n aria-label={item.label}\n title={item.label}\n >\n <SymbolBadge symbol={item.symbol} />\n {item.label}\n </StyledButtonListLink>\n )\n :\n (\n <StyledButtonListButton\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n <SymbolBadge symbol={item.symbol} />\n {item.label}\n </StyledButtonListButton>\n )}\n </li>\n\n );\n }}\n />\n );\n};\n\nconst StyledButtonList = styled(ItemList)`\n ${itemList}\n > ul {\n display: flex;\n flex-wrap: wrap;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n ${messageContentPadding}\n`;\n\nconst StyledButtonListLink = styled(Link)`\n ${buttonCss};\n\n display: block;\n padding: ${(p) => p.theme.sizes?.normal};\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #ffffff;\n overflow: hidden;\n text-overflow: ellipsis;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n\n i,\n svg {\n margin-right: ${(p) => p.theme.sizes?.small};\n }\n`;\n\nconst StyledButtonListButton = styled(Button)`\n ${buttonCss};\n\n display: block;\n padding: ${(p) => p.theme.sizes?.normal};\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #ffffff;\n overflow: hidden;\n text-overflow: ellipsis;\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n }\n\n i,\n svg {\n margin-right: ${(p) => p.theme.sizes?.small};\n }\n`;\n","import { useComponent } from '@telia-ace/widget-ui';\nimport React, { Suspense } from 'react';\n\ntype Props = {\n type: string;\n content?: { [key: string]: any };\n};\nexport const Custom: React.FC<Props> = ({ type, content = {} }) => {\n const Component = useComponent(type);\n\n if (!Component || !type) {\n return null;\n }\n return (\n <Suspense fallback={null}>\n <Component {...content} />\n </Suspense>\n );\n};\n","import styled from '@emotion/styled';\nimport { borderTabStyle, genericHtml, Html as UiHtml } from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { HtmlProperties } from '../../../../types';\nimport { messageContentPadding } from '../styles';\n\ntype Props = HtmlProperties;\n\nexport const Html: FC<Props> = ({ body }) => {\n return <StyledHtml html={body} />;\n};\n\nconst StyledHtml = styled(UiHtml)<any>`\n ${genericHtml}\n color: inherit;\n white-space: pre-wrap;\n ${messageContentPadding}\n a {\n color: ${(p) => p.theme.colors.link};\n &:focus-visible {\n ${borderTabStyle};\n }\n }\n`;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n headingElement,\n itemList,\n ItemList as ItemListUi,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { LinkListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & LinkListProperties;\n\nexport const ItemList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledItemList\n className=\"humany-conversation-item-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <ListItem>\n {item.symbol?.content && (\n <div className=\"item-icon\">\n <SymbolBadge\n size={22}\n symbol={{\n type: item.symbol.type,\n content: item.symbol.content,\n }}\n />\n </div>\n )}\n <div className=\"item-body\">\n <Button\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n {item.label}\n </Button>\n\n {item.description && <p>{item.description}</p>}\n </div>\n </ListItem>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledItemList = styled(ItemListUi)`\n ${itemList}\n\n > .humany-paragraph {\n ${messageContentPadding}\n margin-bottom: 0;\n\n h1 {\n margin: 0;\n }\n }\n\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n white-space: normal;\n `\n )}\n\n > ul {\n display: flex;\n flex-direction: column;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n\n li {\n border-bottom: ${(p) => p.theme.border};\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n`;\n\nconst ListItem = styled.div`\n display: flex;\n gap: ${(p) => p.theme.sizes?.medium};\n ${messageContentPadding}\n\n .item-icon {\n }\n\n .item-body {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: ${(p) => p.theme.sizes?.normal};\n\n p {\n margin: 0;\n white-space: normal;\n }\n }\n\n button {\n background: transparent;\n border: none;\n font-family: inherit;\n font-size: ${(p) => p.theme.fonts?.normal};\n cursor: pointer;\n padding: 0;\n margin: 0;\n\n &:focus-visible {\n ${borderTabStyle}\n span {\n color: ${(p) => p.theme.colors?.primary};\n text-decoration: underline;\n }\n }\n }\n`;\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n headingElement,\n itemList,\n ItemList,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { LinkListProperties } from '../../../../types';\nimport { mapActions } from '../../../../utils/map-actions';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & LinkListProperties;\n\nexport const LinkList: FC<Props> = ({ header, actions, dispatch }) => {\n return (\n <StyledLinkList\n className=\"humany-conversation-link-list\"\n header={header}\n items={mapActions(actions)}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <StyledLinkButton\n help={item.actionKey === 'help'}\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n >\n {item.label}\n {item.actionKey === 'help' && (\n <SymbolBadge\n size={14}\n symbol={{\n type: 'Svg',\n content: 'caret-down',\n }}\n />\n )}\n </StyledLinkButton>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledLinkList = styled(ItemList)`\n ${itemList}\n ${messageContentPadding}\n\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n white-space: normal;\n `\n )}\n\n > ul {\n display: flex;\n flex-direction: column;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n`;\n\nconst StyledLinkButton = styled(Button)<{ help: boolean }>`\n display: block;\n text-align: left;\n font-weight: 300;\n color: ${(p) => p.theme.colors?.primary};\n max-width: 100%;\n text-overflow: ellipsis;\n overflow: hidden;\n\n ${(p) =>\n p.help &&\n css`\n color: ${p.theme.colors?.text};\n text-decoration: underline;\n\n i,\n svg {\n margin-left: ${p.theme.sizes?.small};\n }\n `}\n\n &:focus-visible {\n ${borderTabStyle}\n span {\n color: ${(p) => p.theme.colors?.primary};\n text-decoration: underline;\n }\n }\n`;\n","import styled from '@emotion/styled';\nimport React, { FC } from 'react';\n\nexport const Separator: FC = () => {\n return <StyledSeparator className=\"humany-conversation-separator\" />;\n};\n\nconst StyledSeparator = styled.div`\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\n width: 100%;\n`;\n","import styled from '@emotion/styled';\nimport { Typography } from '@telia-ace/widget-ui';\nimport React, { FC } from 'react';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { text: string };\n\nexport const Text: FC<Props> = ({ text }) => {\n return (\n <StyledTypography className=\"humany-conversation-text\" variant=\"span\">\n {text}\n </StyledTypography>\n );\n};\n\nconst StyledTypography = styled(Typography)`\n ${messageContentPadding}\n`;\n","import styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n buttonCss,\n DispatchAction,\n ItemList,\n itemList,\n SymbolBadge,\n} from '@telia-ace/widget-ui';\nimport React, { FC, useMemo } from 'react';\nimport { VideoRequestProperties } from '../../../../types';\nimport { messageContentPadding } from '../styles';\n\ntype Props = { dispatch: DispatchAction } & VideoRequestProperties;\n\nexport const VideoRequest: FC<Props> = ({\n header = 'Video call',\n acceptLabel = 'Accept',\n declineLabel = 'Decline',\n dispatch,\n}) => {\n const actions = useMemo(() => {\n return [\n {\n label: acceptLabel,\n actionKey: 'accept-video-call',\n symbol: {\n type: 'Svg',\n content: 'video',\n },\n },\n {\n label: declineLabel,\n actionKey: 'decline-video-call',\n symbol: {\n type: 'Svg',\n content: 'close',\n },\n },\n ];\n }, [acceptLabel, declineLabel]);\n return (\n <StyledItemList\n className=\"humany-conversation-video-request\"\n header={header}\n items={actions}\n renderItem={(item: any) => {\n const bgColor = item.actionKey === 'accept-video-call' ? '#70c48e' : '#da5c85';\n return (\n <li key={item.actionKey}>\n <StyledButton\n onClick={() => {\n dispatch('action', item);\n }}\n aria-label={item.label}\n title={item.label}\n bgColor={bgColor}\n >\n <SymbolBadge symbol={item.symbol} size={25} />\n </StyledButton>\n </li>\n );\n }}\n />\n );\n};\n\nconst StyledItemList = styled(ItemList)`\n ${(p) => itemList(p)}\n > ul {\n display: flex;\n flex-wrap: wrap;\n gap: ${(p) => p.theme.sizes?.normal};\n > li {\n margin: 0;\n }\n }\n ${(p) => messageContentPadding(p)}\n`;\n\nconst StyledButton = styled(Button)<{ bgColor: string }>`\n ${buttonCss};\n\n background-color: ${(p) => p.bgColor};\n display: flex;\n justify-content: center;\n align-items: center;\n color: #ffffff;\n width: 46px;\n height: 46px;\n border-radius: 100%;\n\n &:focus-visible {\n ${borderTabStyle}\n background-color: transparent;\n\n i,\n svg {\n color: ${(p) => p.theme.colors?.primary};\n\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n }\n\n i,\n svg {\n color: #fff;\n\n path {\n stroke: #fff;\n }\n }\n`;\n","import React, { FC } from 'react';\n\nimport styled from '@emotion/styled';\nimport { DispatchAction, List, list } from '@telia-ace/widget-ui';\nimport { ConversationMessageListItemType, ConverstationMessageItem } from '../../../../types';\nimport { ButtonList } from '../message-list-items/button-list';\nimport { Custom } from '../message-list-items/custom';\nimport { Html } from '../message-list-items/html';\nimport { ItemList } from '../message-list-items/item-list';\nimport { LinkList } from '../message-list-items/link-list';\nimport { Separator } from '../message-list-items/separator';\nimport { Text } from '../message-list-items/text';\nimport { VideoRequest } from '../message-list-items/video-request';\n\ntype Props = {\n items: ConverstationMessageItem<any>[];\n dispatch: DispatchAction;\n};\n\nconst mapItem = ([type, content]: ConverstationMessageItem<any>) => {\n return { type, content };\n};\n\nexport const MessageList: FC<Props> = ({ items, dispatch }) => {\n return (\n <StyledList\n className=\"humany-message-list\"\n items={items.map(mapItem)}\n renderLi\n renderItem={(item: any) => {\n switch (item.type) {\n case ConversationMessageListItemType.Text: {\n return <Text text={item.content} />;\n }\n case ConversationMessageListItemType.HTML: {\n return <Html {...item.content} />;\n }\n case ConversationMessageListItemType.Separator: {\n return <Separator {...item.content} />;\n }\n case ConversationMessageListItemType.ItemList: {\n return <ItemList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.LinkList: {\n return <LinkList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.ButtonList: {\n return <ButtonList {...item.content} dispatch={dispatch} />;\n }\n case ConversationMessageListItemType.VideoRequest: {\n return <VideoRequest {...item.content} dispatch={dispatch} />;\n }\n default: {\n return <Custom type={item.type} content={item.content} />;\n }\n }\n }}\n />\n );\n};\n\nconst StyledList = styled(List)<any>`\n ${list}\n\n > li {\n margin: 0;\n }\n`;\n","import { Html, useDispatch } from '@telia-ace/widget-ui';\nimport React, { forwardRef, useCallback } from 'react';\nimport { ConversationMessageType } from '../../../conversation-controller';\nimport { ConversationMessageContent } from '../../../types';\nimport { BundledConversationMessage } from '../plugin';\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\nimport { MessageList } from './message-types/message-list';\nimport {\n ContentBundle,\n MessageContainer,\n MessageContent,\n MessageContentPart,\n MessageTitle,\n Stacked,\n StyledActionButton,\n StyledActionList,\n StyledForm,\n StyledHtml,\n} from './styles';\n\ntype Props = {\n className?: string;\n} & BundledConversationMessage;\n\nexport const ConversationMessage = forwardRef<HTMLDivElement, Props>(\n ({ className, timestamp, sender, type, content }, ref) => {\n const getMessageStackPosition = useCallback(\n (index: number): Stacked => {\n let messageOrder: Stacked = 'first';\n if (content.length > 1) {\n messageOrder =\n index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\n }\n return messageOrder;\n },\n [content]\n );\n\n const createSystemMessage = () => {\n return (\n <>\n {content.map((item) => {\n const { key, body, title, form, actions } = item;\n const discrete = !!body && !title && !form && !actions;\n return (\n <SystemMessage\n className={className}\n key={key}\n discrete={discrete}\n ref={ref}\n timestamp={timestamp}\n fullWidth={!!form || !!actions}\n >\n {discrete && body ? (\n <Html html={body} />\n ) : (\n <Message isSystem content={item} />\n )}\n </SystemMessage>\n );\n })}\n </>\n );\n };\n\n const createAgentMessage = () => {\n return (\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\n <ContentBundle className=\"humany-message-content-bundle\">\n {content.map((item, index) => {\n return (\n <MessageContainer\n className=\"humany-message-container\"\n left\n key={item.key}\n ref={ref}\n >\n <Message\n content={item}\n stacked={getMessageStackPosition(index)}\n />\n </MessageContainer>\n );\n })}\n </ContentBundle>\n </AgentMessage>\n );\n };\n\n const createUserMessage = () => {\n return (\n <UserMessage timestamp={timestamp} className={className}>\n <ContentBundle className=\"humany-message-content-bundle\">\n {content.map((item, index) => {\n return (\n <MessageContainer\n className=\"humany-message-container\"\n right\n key={item.key}\n ref={ref}\n >\n <Message\n isUser\n content={item}\n stacked={getMessageStackPosition(index)}\n />\n </MessageContainer>\n );\n })}\n </ContentBundle>\n </UserMessage>\n );\n };\n\n switch (type) {\n case ConversationMessageType.System:\n return createSystemMessage();\n case ConversationMessageType.Agent:\n return createAgentMessage();\n case ConversationMessageType.User:\n return createUserMessage();\n default:\n return null;\n }\n }\n);\n\ntype MessageContentProps = {\n className?: string;\n content: ConversationMessageContent;\n isUser?: boolean;\n isSystem?: boolean;\n stacked?: Stacked;\n CustomComponent?: any;\n};\n\nconst Message: React.FC<MessageContentProps> = ({ content, isUser, isSystem, stacked }) => {\n const dispatch = useDispatch();\n const { title, body, actions, form, items } = content;\n\n // Using print(string) or print(object) is considered legacy in favor of print(array).\n const isLegacyMessage = !items;\n if (isLegacyMessage) {\n return (\n <MessageContent\n className=\"humany-message-content\"\n padded={!isSystem}\n user={!!isUser}\n stacked={stacked}\n fullWidth={!!form || !!actions}\n >\n {title && (\n <MessageContentPart>\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\n </MessageContentPart>\n )}\n {body && (\n <MessageContentPart>\n <StyledHtml html={body} />\n </MessageContentPart>\n )}\n {form && (\n <MessageContentPart>\n <StyledForm\n {...form}\n onChange={(key: string, data: any) => {\n dispatch('form', {\n data,\n formKey: form.schema.id,\n actionKey: key,\n });\n }}\n />\n </MessageContentPart>\n )}\n {actions && (\n <MessageContentPart>\n <StyledActionList\n items={Object.keys(actions).map((i: any) => {\n return { label: actions[i], actionKey: i };\n })}\n renderItem={(item: any) => {\n return (\n <li key={item.actionKey}>\n <StyledActionButton\n onClick={() => {\n dispatch('action', item.actionKey);\n }}\n >\n {item.label}\n </StyledActionButton>\n </li>\n );\n }}\n />\n </MessageContentPart>\n )}\n </MessageContent>\n );\n }\n\n return (\n <MessageContent className=\"humany-message-content\" user={!!isUser} stacked={stacked}>\n <MessageList items={items} dispatch={dispatch} />\n </MessageContent>\n );\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { borderTabStyle, headingElement, useProperties, useScroll } from '@telia-ace/widget-ui';\nimport React, { useCallback } from 'react';\nimport { ConversationMessageSender } from '../../../types';\nimport { BundledConversationMessage, ConversationComponentProperties } from '../plugin';\nimport ConversationInput from './input';\nimport ConversationLoader from './loader';\nimport { ConversationMessage } from './message';\nimport { AgentMessage } from './message-types';\n\nexport const ConversationContent: React.FC = () => {\n const setLastEntryRef = useCallback((node: HTMLDivElement) => {\n if (node) {\n setTimeout(() => {\n node.scrollIntoView({\n block: 'start',\n behavior: 'smooth',\n });\n }, 250);\n }\n }, []);\n\n const [scrollableCss, viewElem] = useScroll(true);\n const {\n messages,\n loading,\n typingActors = [],\n } = useProperties<ConversationComponentProperties>();\n\n const renderTypingActors = () => {\n if (typingActors && typingActors.length) {\n return typingActors.map((actor: ConversationMessageSender, index) => {\n return (\n <MessageEntry id={`typing_${actor.name}`} key={`typing_${actor.name}`}>\n <AgentMessage timestamp={Date.now()} sender={actor}>\n <ConversationLoader boxed ref={setLastEntryRef}></ConversationLoader>\n </AgentMessage>\n </MessageEntry>\n );\n });\n }\n return null;\n };\n\n return (\n <>\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\n {messages && messages.length\n ? messages.map((message: BundledConversationMessage, index) => {\n const { type, timestamp, sender, content } = message;\n return (\n <MessageEntry\n className={'humany-conversation-entry'}\n tabIndex={-1}\n key={`${type}_${sender?.name}_${timestamp}_${content[0].key}`}\n >\n <ConversationMessage {...message} ref={setLastEntryRef} />\n </MessageEntry>\n );\n })\n : null}\n {renderTypingActors()}\n {loading && (\n <MessageEntry>\n <ConversationLoader ref={setLastEntryRef} />\n </MessageEntry>\n )}\n </Scrollable>\n <ConversationInput />\n </>\n );\n};\n\nconst Scrollable = styled.div<{ scrolling: boolean } & any>`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 0 1 100%;\n padding: 0 ${(p) => p.theme.sizes?.medium};\n ${(p) => !!p.scrollableCss && p.scrollableCss};\n &:focus-visible {\n ${(p) => borderTabStyle(p)};\n }\n`;\n\nconst MessageEntry = styled.div`\n margin: 0;\n margin-bottom: ${(p) => p.theme.sizes?.medium};\n\n &:first-of-type {\n margin-top: ${(p) => p.theme.sizes?.medium};\n }\n\n &:last-of-type {\n padding-bottom: ${(p) => p.theme.sizes?.medium};\n }\n\n & span,\n p,\n a,\n div {\n font-weight: 300;\n }\n\n & b,\n h1 {\n font-weight: normal;\n }\n ${(p) =>\n headingElement(p)(\n 'h1',\n css`\n font-weight: normal;\n `\n )}\n`;\n","import styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n DispatchAction,\n SymbolBadge,\n Typography,\n WidgetOverlayOutlet,\n} from '@telia-ace/widget-ui';\nimport React, { FC, useEffect, useRef } from 'react';\nimport { ConversationContent } from './content';\n\ntype OverlayOutletProps = {\n dispatch: DispatchAction;\n};\n\nexport const OverlayOutlet: FC<OverlayOutletProps> = ({ dispatch }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (wrapperRef.current && wrapperRef.current.parentNode) {\n dispatch('overlay-mounted', wrapperRef.current);\n }\n }, [wrapperRef]);\n\n return (\n <WidgetOverlayOutlet\n portalId=\"humany-conversation-overlay-portal\"\n className=\"humany-conversation-overlay-outlet\"\n ref={wrapperRef}\n />\n );\n};\n\ntype ConversationOverlayProps = {\n dispatch: DispatchAction;\n header?: string;\n buttonLabel?: string;\n};\n\nexport const ConversationOverlayOutlet: FC<ConversationOverlayProps> = ({\n dispatch,\n header,\n buttonLabel,\n}) => {\n return (\n <StyledWidgetOverlayOutlet\n portalId=\"humany-conversation-portal\"\n className=\"humany-conversation-outlet\"\n >\n <ConversationOverlayHead className=\"humany-conversation-outlet-head\">\n <ConversationOverlayHeadButton\n className=\"humany-conversation-outlet-head-button\"\n aria-label={buttonLabel}\n title={buttonLabel}\n onClick={() => dispatch('hide-overlay-conversation')}\n >\n <SymbolBadge\n symbol={{\n type: 'Svg',\n content: 'caret-down',\n }}\n size={20}\n />\n </ConversationOverlayHeadButton>\n {header && (\n <ConversationOverlayHeader\n className=\"humany-conversation-outlet-header\"\n variant=\"h1\"\n >\n {header}\n </ConversationOverlayHeader>\n )}\n </ConversationOverlayHead>\n <ConversationContent />\n </StyledWidgetOverlayOutlet>\n );\n};\n\nconst StyledWidgetOverlayOutlet = styled(WidgetOverlayOutlet)`\n z-index: 11;\n top: auto;\n height: 65%;\n background-color: #ffffff;\n display: flex;\n flex-direction: column;\n border-top-right-radius: ${(p) => p.theme.sizes?.large};\n border-top-left-radius: ${(p) => p.theme.sizes?.large};\n`;\n\nconst ConversationOverlayHead = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(p) => p.theme.sizes?.normal};\n padding: ${(p) => p.theme.sizes?.normal};\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\n`;\n\nconst ConversationOverlayHeader = styled(Typography)`\n font-size: ${(p) => p.theme.fonts?.medium};\n color: ${(p) => p.theme.colors?.text};\n margin: 0;\n`;\n\nconst ConversationOverlayHeadButton = styled(Button)`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.medium};\n ${(p) => p.theme.borderRadius && `border-radius: ${p.theme.borderRadius};`}\n\n &:focus-visible {\n ${borderTabStyle};\n }\n\n svg line {\n stroke: ${(p) => p.theme.colors?.text};\n }\n`;\n","import styled from '@emotion/styled';\nimport { ConversationContext, useDispatch, useProperties } from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport { ConversationComponentProperties } from './plugin';\nimport { ConversationContent } from './ui/content';\nimport { ConversationOverlayOutlet, OverlayOutlet } from './ui/overlay-outlets';\n\ntype Props = {\n className: string;\n};\n\nconst Conversation: React.FC<Props> = ({ className, ...other }) => {\n const {\n overlay,\n overlayConversationHeader,\n overlayConversationCloseLabel,\n conversationControllerId,\n } = useProperties<ConversationComponentProperties>();\n const dispatch = useDispatch();\n\n return (\n <ConversationContext.Provider\n value={conversationControllerId ? { id: conversationControllerId } : null}\n >\n <Wrapper\n {...other}\n className={appendClassNames(className, 'humany-conversation-component')}\n >\n <ConversationContent />\n </Wrapper>\n {overlay && (\n <>\n <OverlayOutlet dispatch={dispatch} />\n {overlay.conversation && (\n <ConversationOverlayOutlet\n dispatch={dispatch}\n header={overlayConversationHeader}\n buttonLabel={overlayConversationCloseLabel}\n />\n )}\n </>\n )}\n </ConversationContext.Provider>\n );\n};\n\nconst Wrapper = styled.div`\n position: absolute;\n right: 0;\n left: 0;\n bottom: 0;\n top: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`;\n\nexport default Conversation;\n"],"names":["ConversationInput","className","inputText","setInputText","useState","inputFocus","setInputFocus","calculatedLineHeight","setCalculatedLineHeight","textareaMaxHeight","setTextareaMaxHeight","isTabbing","useIsTabbing","dispatch","useDispatch","inputPlaceholder","inputHidden","inputDisabled","sendButtonLabel","multiline","secondaryAction","useProperties","scrollableCss","inputRef","useScroll","useEffect","lineHeight","maxHeight","lineHeightNumber","calcLH","maxHeightNumber","submit","e","onChange","onSecondaryActionButtonClick","__spreadValues","calculateHeight","value","scrollHeight","areaHeight","React","Wrapper","appendClassNames","SecondaryActionButton","SymbolBadge","StyledTextArea","StyledInput","StyledButton","SendSymbol","styled","Input","p","_a","Button","borderTabStyle","css","_b","hasContent","other","__objRest","ConversationInput$1","Avatar","LoaderAnimation","keyframes","Loader","ContentBundle","MessageTitle","Typography","MessageContainer","MessageContent","nonUserMessageStyling","userMessageStyling","stacked","theme","colors","MessageContentPart","messageContentPadding","StyledForm","FormComponent","invertedHoverButton","_c","_d","StyledHtml","Html","StyledActionList","List","StyledActionButton","buttonCss","ConversationLoader","forwardRef","boxed","agentData","ref","ConversationLoader$1","StyledTimestamp","getTimestamp","raw","Timestamp","name","timestamp","output","Timestamp$1","AgentMessage","children","sender","avatar","avatarSize","StyledAgentMessage","AgentMessage$1","SystemMessage","discrete","fullWidth","StyledSystemMessage","Discrete","SystemMessage$1","UserMessage","userLabel","StyledUserMessage","UserMessage$1","mapActions","actions","i","ButtonList","header","StyledButtonList","item","isLink","StyledButtonListLink","StyledButtonListButton","ItemList","itemList","Link","Custom","type","content","Component","useComponent","Suspense","body","UiHtml","genericHtml","StyledItemList","ListItem","ItemListUi","headingElement","LinkList","StyledLinkList","StyledLinkButton","Separator","StyledSeparator","Text","text","StyledTypography","VideoRequest","acceptLabel","declineLabel","useMemo","bgColor","mapItem","MessageList","items","StyledList","ConversationMessageListItemType","__spreadProps","list","ConversationMessage","getMessageStackPosition","useCallback","index","messageOrder","createSystemMessage","key","title","form","Message","createAgentMessage","createUserMessage","ConversationMessageType","isUser","isSystem","data","ConversationContent","setLastEntryRef","node","viewElem","messages","loading","typingActors","renderTypingActors","actor","MessageEntry","Scrollable","message","OverlayOutlet","wrapperRef","useRef","WidgetOverlayOutlet","ConversationOverlayOutlet","buttonLabel","StyledWidgetOverlayOutlet","ConversationOverlayHead","ConversationOverlayHeadButton","ConversationOverlayHeader","Conversation","overlay","overlayConversationHeader","overlayConversationCloseLabel","conversationControllerId","ConversationContext"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/conversation-history.ts","../src/agent.ts","../src/conversation-provider.ts","../src/store.ts","../src/user.ts","../src/utils/swap-provider.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';\nimport {\n ConversationController,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageContent, ConversationMessageSender } from './types';\n\ntype ConversationLogMessage = {\n message?: string;\n options?: string[];\n alias: string;\n source: string;\n timestamp: number | null;\n};\n\nexport class ConversationHistory {\n private cache: Map<string, any> = new Map();\n\n private subscriptions: EventSubscriptionCancellation[] = [];\n\n constructor(private controller: ConversationController) {\n const { events } = controller.container.get('$widget') as Widget;\n\n const unsubscribe = events.subscribe('data-client:fetched', (e, data) => {\n if (data.type === 'contact-method') {\n this.cache.set(data.response.id, data.response);\n }\n });\n this.subscriptions.push(unsubscribe);\n }\n\n getConversationLogs(): ConversationLogMessage[] {\n const logs = this.controller.messages.reduce<ConversationLogMessage[]>((acc, message) => {\n const normalized = getNormalizedMessageSettings(message as any);\n const { key, content, type, sender, timestamp } = normalized.content;\n\n const parsed = this.parseEntry(content, type, sender, timestamp);\n\n if (parsed) {\n acc.push(parsed);\n }\n\n return acc;\n }, []);\n\n return logs;\n }\n\n parseEntry(\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: any | null\n ) {\n const handle = (body: any | any[]) => {\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n let messageData: any;\n\n // the actual content could also be an array,\n if (Array.isArray(body)) {\n const [_type, data] = body;\n messageData = data;\n } else {\n messageData = body;\n }\n\n const message = this.createMessageContent(messageData);\n if (message.length) {\n messagesAsList = [...messagesAsList, this.createMessageContent(messageData)];\n }\n options = [...options, ...this.createMessageOptions(messageData)];\n\n return {\n messagesAsList,\n options,\n };\n };\n\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n // a message could be either an array or just the content itself\n if (Array.isArray(content.items)) {\n const { items } = content;\n items.forEach((item) => {\n const res = handle(item);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n });\n } else {\n const res = handle(content);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n }\n\n const result: ConversationLogMessage = {\n options: options,\n message: messagesAsList.length ? messagesAsList.join('\\n') : undefined,\n source: this.createMessageSource(type),\n alias: this.createAlias(type, sender),\n timestamp,\n };\n\n return result;\n }\n\n private createMessageSource(type: ConversationMessageType) {\n return type;\n }\n\n private createAlias(type: ConversationMessageType, sender?: ConversationMessageSender) {\n if (type === ConversationMessageType.System) {\n return 'system';\n }\n return sender?.name || 'Me';\n }\n\n private handleContactMethod(contactMethodId: string) {\n if (!this.cache.has(contactMethodId)) {\n return;\n }\n\n const method = this.cache.get(contactMethodId);\n\n let result = '';\n\n result = this.appendText(result, `${method.clientName}:`);\n result = this.appendText(result, method.title);\n if (method.description) {\n result = this.appendText(result, method.title);\n }\n\n return result;\n }\n\n private getDetails(item: any, linebreak = true) {\n if (!item) {\n return '';\n }\n\n const { header, title, label, description, text, html, body, contactMethodId } = item;\n let result = '';\n\n if (contactMethodId) {\n const text = this.handleContactMethod(contactMethodId.toString());\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n }\n\n if (header) {\n result = this.appendText(result, header, linebreak);\n }\n if (title) {\n result = this.appendText(result, title, linebreak);\n }\n if (description) {\n result = this.appendText(result, description, linebreak);\n }\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n if (label) {\n result = this.appendText(result, label, linebreak);\n }\n if (html) {\n result = this.appendText(result, html, linebreak);\n }\n if (body) {\n if (typeof body === 'string') {\n result = this.appendText(result, body, linebreak);\n }\n }\n return result;\n }\n\n private createMessageContent(data: any) {\n let message = '';\n\n message = this.getDetails(data);\n\n return message;\n }\n\n private createMessageOptions(data: any): any[] {\n let options = [];\n let actions = [];\n\n if (Array.isArray(data?.actions)) {\n actions = data.actions;\n } else if (typeof data?.actions === 'object') {\n actions = Object.entries(data.actions).map(([key, value]) => {\n return {\n actionKey: key,\n label: value,\n };\n });\n }\n\n if (actions.length) {\n options = actions.map((option: any) => {\n return this.getDetails(option, false);\n });\n }\n return options;\n }\n\n private appendText(target: string, value: string, linebreak = true) {\n if (linebreak) {\n if (target.length) {\n return `${target}\\n${value}`;\n }\n }\n return target.length ? `${target} ${value}` : value;\n }\n\n dispose() {\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n }\n}\n","import { Symbol } from '@telia-ace/widget-ui';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport {\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageSender,\n ConversationMessageSettings,\n ConverstationMessageItem,\n} from './types';\n\nexport type AgentSettings = {\n id?: string;\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport class Agent {\n id: string;\n name?: string;\n avatar?: string | Symbol;\n\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\n this.id = settings.id || uuid();\n this.name = settings.name;\n this.avatar = settings.avatar;\n }\n\n print = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n ): ConversationEntry | undefined => {\n const sender: ConversationMessageSender = {\n name: this.name,\n avatar: this.avatar,\n id: this.id,\n };\n const normalized = getNormalizedMessageSettings(settings, options);\n\n return this.provider.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.Agent,\n sender,\n normalized.timestamp\n );\n };\n typing = () => {\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\n };\n\n update(settings: AgentSettings): void {\n const { name, avatar } = settings;\n if (avatar === null) {\n this.avatar = undefined;\n } else if (avatar) {\n this.avatar = avatar;\n }\n\n if (name === null) {\n this.name = undefined;\n } else if (name) {\n this.name = name;\n }\n\n this.provider.controller?.events.dispatch('conversation:agent-updated', {\n agent: this,\n });\n }\n}\n","import {\n Container,\n EventListener,\n EventObject,\n EventSubscriptionCancellation,\n} from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport {\n CancelLoaderDelegate,\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n ConversationOptions,\n} from './conversation-controller';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n} from './types';\n\nexport class ConversationProvider {\n private subscriptions: EventSubscriptionCancellation[] = [];\n public options: ConversationOptions;\n public user: any;\n\n private constructor(\n public name: string,\n private container: Container,\n public controller: ConversationController | null\n ) {\n this.user = controller?.user;\n this.options = {\n silent: false,\n };\n }\n\n static create(name: string, container: Container, controller: ConversationController) {\n return new ConversationProvider(name, container, controller);\n }\n\n createAgent(settings: AgentSettings = {}): Agent | undefined {\n if (this.controller) {\n const storedAgent = this.controller.getAgentById(settings.id);\n\n const agent = storedAgent\n ? new Agent(this, { ...storedAgent, ...settings })\n : new Agent(this, settings);\n if (!storedAgent) {\n this.controller?.events.dispatch('conversation:agent-created', {\n agent,\n });\n }\n return agent;\n }\n }\n\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\n return this.controller?.print(settings);\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n return this.controller?.setTypingState(sender, type);\n }\n\n loading(): CancelLoaderDelegate {\n if (!this.controller) {\n return () => () => {};\n }\n return this.controller.loader();\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ) {\n return this.controller?.createEntry(key, content, type, sender, timestamp);\n }\n\n dispose() {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`conversation-provider: dispose (${this.name})`);\n }\n this.controller?.disposeProvider(this);\n this.controller = null;\n this.subscriptions.forEach((unsub) => unsub());\n }\n\n isRehydrated() {\n return this.controller?.isRehydrated() || Promise.resolve(false);\n }\n\n getHistory() {\n return this.controller?.getHistory() || [];\n }\n\n complete() {\n this.controller?.onCompleteProvider();\n }\n\n setOptions(options: ConversationOptions = { silent: false }) {\n this.options = options;\n }\n\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.onUnreadMessage(fn);\n this.subscriptions.push(unsubscribe);\n return () => {\n unsubscribe();\n };\n }\n }\n\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.events.subscribe(\n 'conversation:component-mount-changed',\n fn\n );\n this.subscriptions.push(unsubscribe);\n fn({} as EventObject, this.controller.getComponentMountedState());\n return () => {\n unsubscribe();\n };\n }\n }\n}\n\nexport default ConversationProvider;\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\n\ntype StoredConversationAgent = {\n id: string;\n name: string;\n avatar?: string;\n providerName: string;\n};\ntype StoredConversationMessage = any;\n\ntype StoredConversation = {\n agents: StoredConversationAgent[];\n messages: StoredConversationMessage[];\n};\n\nexport const createSessionStorageKey = (id: string) => {\n return `conversation-${id}`;\n};\n\nclass Locker {\n private _locking: Promise<void> = Promise.resolve();\n private _locks: number = 0;\n\n isLocked() {\n return this._locks > 0;\n }\n\n lock() {\n this._locks += 1;\n\n let unlockNext: () => void;\n\n let willLock = new Promise<void>(\n (resolve) =>\n (unlockNext = () => {\n this._locks -= 1;\n\n resolve();\n })\n );\n\n let willUnlock = this._locking.then(() => unlockNext);\n\n this._locking = this._locking.then(() => willLock);\n\n return willUnlock;\n }\n}\n\nclass Store {\n private sessionStorageKey: string;\n private locker = new Locker();\n private initialStoredAgents: StoredConversationAgent[] = [];\n\n constructor(\n private container: Container,\n private conversation: ConversationController,\n private enabled: boolean // whether or not to store data\n ) {\n this.sessionStorageKey = createSessionStorageKey(conversation.id);\n\n conversation.onStarted(async () => {\n if (conversation.messages.length > 0) {\n // if the conversation already contains messages\n // for example when re-opening a minimized widget,\n // we do not want to do anything\n return;\n }\n const { agents: storedAgents } = await this.read();\n\n const agents: Agent[] = [];\n\n if (storedAgents) {\n storedAgents.forEach((a) => {\n const providerIndex = conversation.providerIndex(a.providerName);\n const provider =\n providerIndex > -1\n ? conversation.registeredProviders[providerIndex]\n : conversation.createProvider(a.providerName);\n\n const agent = new Agent(provider, { name: a.name, avatar: a.avatar, id: a.id });\n agents.push(agent);\n });\n }\n\n const { messages: storedMessages } = await this.read();\n storedMessages.forEach((message) => {\n switch (message.type) {\n case 'agent': {\n const agent = agents.find((a) => a.id === message.sender?.id);\n if (agent) {\n agent.print(message.content.items || message.content, {\n key: message.key,\n });\n }\n return;\n }\n case 'user': {\n conversation.user.print(message.content.items || message.content, {\n key: message.key,\n });\n return;\n }\n case 'system':\n default: {\n conversation.print(message.content.items || message.content);\n }\n }\n });\n });\n conversation.onMessageCreated(async (_, data) => {\n this.write(data.message, 'messages');\n });\n\n conversation.events.subscribe('conversation:agent-created', async (_, data) => {\n const agent = {\n id: data.agent.id,\n name: data.agent.name,\n avatar: data.agent.avatar,\n providerName: data.agent.provider.name,\n };\n await this.write(agent, 'agents');\n });\n\n conversation.events.subscribe('conversation:agent-updated', async (_, data) => {\n const { agents } = await this.read();\n\n await this.write(\n [\n ...agents.map((a) => {\n if (a.id === data.agent.id) {\n return {\n ...a,\n name: data.agent.name,\n avatar: data.agent.avatar,\n };\n }\n return a;\n }),\n ],\n 'agents',\n 'update'\n );\n });\n }\n\n setInitialData(data: { agents: AgentSettings[] }) {\n this.initialStoredAgents = data.agents as StoredConversationAgent[];\n }\n\n async isRehydrated() {\n const { messages } = await this.read();\n return messages.length > 0;\n }\n\n getStoredAgent(agentId: string) {\n if (!this.enabled) {\n return;\n }\n return this.initialStoredAgents.find((a) => a.id === agentId);\n }\n\n async write(data: any, type: 'messages' | 'agents', action: 'add' | 'update' = 'add') {\n if (!this.enabled) {\n return;\n }\n\n const unlock = await this.locker.lock();\n return createStorageWriter(\n this.container,\n this.sessionStorageKey,\n StorageCategory.Necessary\n ).then(async (write) => {\n if (action === 'add') {\n const prev = await this.read();\n\n // ensure that we don't duplicate messages by looking at their unqiue keys\n if (\n type === 'messages' &&\n prev.messages.findIndex((m) => m.key === data.key) > -1\n ) {\n unlock();\n return;\n }\n\n let newData = {\n ...prev,\n };\n\n if (type === 'messages') {\n newData.messages = [...newData.messages, data];\n } else if (type === 'agents') {\n newData.agents = [...newData.agents, data];\n }\n\n return write({\n ...prev,\n ...newData,\n }).then(() => {\n unlock();\n });\n }\n\n if (action === 'update') {\n if (type === 'agents') {\n const prev = await this.read();\n\n return write({\n ...prev,\n agents: data,\n }).then(() => {\n unlock();\n });\n }\n }\n\n return write(data).then(() => {\n unlock();\n });\n });\n }\n\n async read() {\n return readStorage(this.container, this.sessionStorageKey).then((data) => {\n if (!data) {\n return {\n messages: [],\n agents: [],\n };\n }\n return data as StoredConversation;\n });\n }\n}\n\nexport default Store;\n","import {\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageSettings } from './types';\n\nexport class User {\n constructor(private controller: ConversationController) {}\n\n print = (\n settings: string | ConversationMessageSettings,\n options?: {\n key?: string;\n }\n ): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings, options);\n return this.controller.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.User,\n undefined,\n normalized.timestamp\n );\n };\n}\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../conversation-platform';\n\n/**\n * This will put the current provider(s) in a queue and\n * swap current provider to another one based on the providerName.\n * When ConversationProvider.complete() is called, the provider(s) in the\n * queue will become active again\n */\nexport const swapProvider = async (\n container: Container,\n conversationId: string,\n providerName: string\n) => {\n const conversation: ConversationPlatform = await container.getAsync('conversation');\n const components: ComponentPlatform = await container.getAsync('components');\n const currentInstance = conversation.controllers.find((c) => {\n return c.conversation.id === conversationId;\n });\n\n if (currentInstance) {\n const toQueue = [...currentInstance.conversation.providers];\n toQueue.forEach((name) => {\n currentInstance.conversation.setProviderOptions(name, { silent: true });\n });\n currentInstance.conversation.queueProviders(toQueue);\n currentInstance.conversation.setProviders([providerName]);\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [providerName] },\n },\n target: conversationQuery,\n provider: 'localStorage',\n });\n }\n};\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationHistory } from './conversation-history';\nimport { ConversationProvider } from './conversation-provider';\nimport Store from './store';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n ConversationMessageUpdateSettings,\n ConverstationMessageItem,\n NormalizedMessageSettings,\n} from './types';\nimport { User } from './user';\nimport { swapProvider } from './utils/swap-provider';\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type ConversationOptions = { silent: boolean };\n\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\n\nexport type FormHandlers = { [key: string]: FormHandler };\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\n\nexport type CancelLoaderDelegate = () => void;\n\nexport class ConversationEntry {\n constructor(private writer: EntryWriter) {}\n\n update(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n const normalized = this.getNormalizedSettings(content);\n // const normalized = typeof content === 'string' ? { body: content } : content;\n this.writer(<ConversationMessageUpdateSettings>normalized);\n }\n\n remove() {\n this.writer(null);\n }\n\n private getNormalizedSettings(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n if (typeof content === 'string') return { body: content };\n else if (content.length > -1 && typeof content === 'object') return { items: content };\n else return content;\n }\n}\n\nexport enum ConversationMessageType {\n User = 'user',\n Agent = 'agent',\n System = 'system',\n}\n\nexport type ConversationMessage = {\n key: string;\n timestamp: number | null;\n content: ConversationMessageContent | null;\n sender: ConversationMessageSender | null;\n type: ConversationMessageType;\n};\n\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\n\nexport const getNormalizedMessageSettings = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n): NormalizedMessageSettings => {\n let content: ConversationMessageContent;\n let key = options?.key || uuid();\n let timestamp: number | null = Date.now();\n\n if (Array.isArray(settings) && settings.length > -1) {\n if (typeof settings[0] === 'string') {\n content = { items: [<ConverstationMessageItem<any>>settings] };\n } else {\n content = { items: <ConverstationMessageItem<any>[]>settings };\n }\n } else if (typeof settings === 'string') {\n content = { body: settings };\n } else {\n settings = <ConversationMessageSettings>settings || {};\n\n if (settings.type) {\n content = {\n ...(<any>settings),\n };\n } else {\n content = {\n body: settings.body,\n actions: settings.actions,\n title: settings.title,\n };\n if (settings.key) {\n key = settings.key;\n }\n if (settings.timestamp) {\n timestamp = settings.timestamp;\n }\n if (typeof settings.form === 'function') {\n const builder = FormBuilder.create(key);\n settings.form(builder);\n const builtForm = builder.get();\n content.form = builtForm;\n }\n if (settings.timestamp === null) {\n timestamp = null;\n }\n }\n }\n return { content, key, timestamp };\n};\n\nconst removeTypingState = (\n typingActors: ConversationMessageSender[],\n sender?: ConversationMessageSender\n) => {\n if (!sender) {\n return;\n }\n const senderString = JSON.stringify(sender);\n const indexToRemove = typingActors.findIndex((item) => {\n return senderString === JSON.stringify(item);\n });\n if (indexToRemove > -1) {\n return typingActors.splice(indexToRemove, 1);\n }\n};\n\n/**\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\n * access to it as well as exposing emitted actions.\n */\nexport class ConversationController {\n formHandlers: FormHandlers = {};\n\n /**\n * Represents the current end user.\n */\n user: User = new User(this);\n\n events: EventManager;\n\n providers: string[] = [];\n\n active: boolean = false;\n\n queuedProviders: string[] = [];\n\n registeredProviders: ConversationProvider[] = [];\n\n private loaders: number = 0;\n private componentMounted: boolean = false;\n\n private store: Store;\n\n messages: ConversationMessage[] = [];\n private typingActors: ConversationMessageSender[] = [];\n\n private conversationHistory: ConversationHistory;\n\n constructor(public container: Container, public id: string, options: { rehydrate: boolean }) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n this.store = new Store(container, this, options.rehydrate);\n this.conversationHistory = new ConversationHistory(this);\n }\n\n setInitialStorage(data: { agents: AgentSettings[] }) {\n this.store.setInitialData(data);\n }\n\n setProviders(providers: string[]) {\n const removed: string[] = [];\n const added: string[] = [];\n\n // remove\n this.providers\n .reduce<string[]>((acc, provider) => {\n if (providers.indexOf(provider) === -1) {\n acc.push(provider);\n }\n return acc;\n }, [])\n .forEach((providerToRemove) => {\n const indexToRemove = this.providers.indexOf(providerToRemove);\n if (indexToRemove > -1) {\n removed.push(providerToRemove);\n this.providers.splice(indexToRemove, 1);\n }\n });\n\n // add\n providers.forEach((provider) => {\n if (this.providers.indexOf(provider) === -1) {\n added.push(provider);\n this.providers.push(provider);\n }\n });\n\n if (added.length || removed.length) {\n this.events.dispatch('conversation:providers-changed', { added, removed });\n }\n }\n\n createProvider(name: string): ConversationProvider {\n const index = this.providerIndex(name);\n if (index > -1) {\n return this.registeredProviders[index];\n }\n const provider = ConversationProvider.create(name, this.container, this);\n this.registeredProviders.push(provider);\n return provider;\n }\n\n providerIndex(name: string) {\n return this.registeredProviders.findIndex((p) => p.name === name);\n }\n\n getAgentById(id?: string) {\n if (!id) {\n return;\n }\n return this.store.getStoredAgent(id);\n }\n\n dispose() {\n this.conversationHistory.dispose();\n this.registeredProviders.forEach((provider) => provider.dispose());\n this.messages = [];\n this.events.dispatch('conversation:controller-disposed', this);\n this.active = false;\n }\n\n onDispose(fn: EventListener) {\n return this.events.subscribe('conversation:controller-disposed', fn);\n }\n\n onStarted(fn: EventListener) {\n return this.events.subscribe('conversation:started', fn);\n }\n\n onMessageCreated(fn: EventListener) {\n return this.events.subscribe('conversation:message-created', fn);\n }\n\n isRehydrated() {\n return this.store.isRehydrated();\n }\n\n disposeProvider(target: ConversationProvider) {\n const index = this.providerIndex(target.name);\n index > -1 && this.registeredProviders.splice(index, 1);\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\n if (!this.registeredProviders.length) {\n this.dispose();\n }\n }\n\n onProvidersChange(fn: EventListener) {\n return this.events.subscribe('conversation:providers-changed', fn);\n }\n\n setComponentMountedState(mounted: boolean) {\n if (this.componentMounted === mounted) {\n return;\n }\n this.componentMounted = mounted;\n if (mounted) {\n this.events.dispatch('conversation:unread-message', false);\n this.events.dispatch('conversation:started', true);\n this.active = true;\n }\n this.events.dispatch('conversation:component-mount-changed', mounted);\n }\n\n setProviderOptions(providerName: string, options: ConversationOptions) {\n const index = this.providerIndex(providerName);\n\n if (index > -1) {\n this.registeredProviders[index].setOptions(options);\n }\n }\n\n changeProvider(providerName: string) {\n const provider = this.registeredProviders.find((p) => p.name === providerName);\n\n if (provider) {\n swapProvider(this.container, this.id, providerName);\n }\n }\n\n queueProviders(providers: string[]) {\n this.queuedProviders = providers;\n }\n\n onCompleteProvider() {\n const nextProvider = this.queuedProviders.pop();\n\n if (nextProvider) {\n swapProvider(this.container, this.id, nextProvider);\n }\n }\n\n getComponentMountedState() {\n return this.componentMounted;\n }\n\n onUnreadMessage(fn: EventListener) {\n return this.events.subscribe('conversation:unread-message', fn);\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ): ConversationEntry {\n const message: ConversationMessage = {\n key,\n content,\n type,\n sender: sender || null,\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\n };\n this.messages.push(message);\n message.type === ConversationMessageType.Agent &&\n removeTypingState(this.typingActors, sender);\n const entry = new ConversationEntry((updated) => {\n if (updated !== null) {\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\n message.content = content;\n if (updatedTimestamp) {\n message.timestamp = updatedTimestamp;\n }\n } else {\n const indexToRemove = this.messages.indexOf(message);\n message.content = null;\n if (indexToRemove > -1) {\n this.messages.splice(indexToRemove, 1);\n }\n }\n this.events.dispatch('conversation:message-updated', { message });\n this.update();\n });\n this.events.dispatch('conversation:message-created', { message });\n this.update();\n if (!this.componentMounted) {\n this.events.dispatch('conversation:unread-message', true);\n }\n return entry;\n }\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.System,\n undefined,\n normalized.timestamp\n );\n };\n\n update() {\n this.events.dispatch('conversation:updated', {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n });\n }\n\n getMessageStream() {\n return {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n };\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n if (this.typingActors.indexOf(sender) === -1) {\n this.typingActors.push(sender);\n this.update();\n }\n\n return () => {\n removeTypingState(this.typingActors, sender);\n this.update();\n };\n }\n\n /**\n * Displays a loader in the conversation.\n */\n loader(): CancelLoaderDelegate {\n this.loaders = this.loaders + 1;\n let dismissed = false;\n if (this.loaders === 1) {\n this.update();\n }\n return () => {\n if (!dismissed) {\n dismissed = true;\n this.loaders = this.loaders - 1;\n if (this.loaders === 0) {\n this.update();\n }\n }\n };\n }\n\n submitForm(key: string, handler: SubmitHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\n }\n\n validateForm(key: string, handler: ValidateHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\n }\n\n getHistory() {\n return this.conversationHistory.getConversationLogs();\n }\n}\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\nimport { closeAllModals } from '@telia-ace/widget-plugins';\nimport {\n createStorageWriter,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\n\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\n const mainWidgetName = widgetName.split('_contact');\n return implementation.widgets.get(mainWidgetName[0]);\n};\n\nconst getSeparateWidget = (container: Container) => {\n const originWidget = container.get('$widget');\n const { name, implementation }: Widget = container.get('$widget');\n\n const mainWidget =\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\n const { data }: WidgetSettings = container.get('$settings');\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\n const chatWidgetName = `${name\n .replace('_contact-method', '')\n .replace('_contact', '')}_contact-method`;\n\n const chatWidget = implementation.widgets.get(chatWidgetName);\n if (chatWidget && !trigger) {\n return { chatWidget, mainWidget, data };\n }\n return { mainWidget, data };\n};\n\nexport const shouldPreventDefault = (container: Container) => {\n const { chatWidget } = getSeparateWidget(container);\n return !!chatWidget;\n};\n\nexport const openChatWidget = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n triggerDOMTarget?: HTMLElement\n) => {\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\n\n if (chatWidget) {\n if (chatWidget.state === 'activated') {\n return chatWidget.invoke('open').then(() => {\n chatWidget.container.getAsync('conversation').then((conversation) => {\n conversation\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => closeAllModals(container));\n });\n });\n }\n return chatWidget\n .activate()\n .then(() => {\n const { trigger } = chatWidget.container.get('$settings');\n trigger.action = 'hide'; // could be default in configuration\n return chatWidget\n .invoke('setSettings', () => ({\n data,\n trigger,\n activate: true,\n }))\n .then(() => {\n return chatWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n /**\n * Could cause issues if target widget is no longer as specific for this use case\n */\n const contactMethodsQuery = components\n .components()\n .ofType('contact-method');\n components.write({\n key: 'setContactMethodId',\n attributes: {\n properties: {\n id: contactMethod.id,\n guideId: contactMethod.guideId,\n },\n },\n target: contactMethodsQuery,\n provider: 'localStorage',\n });\n const conversationsQuery = components\n .components()\n .ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [contactMethod.clientName] },\n },\n target: conversationsQuery,\n provider: 'localStorage',\n });\n });\n });\n })\n .then(() => {\n return chatWidget.invoke('attach', {\n key: 'contact-method',\n triggerDOMElement: triggerDOMTarget,\n withRenderState: 'open',\n });\n })\n .then(() => {\n createStorageWriter(\n chatWidget.container,\n 'activeStickyWidget',\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n ).then((write) => write(chatWidget.name));\n\n return chatWidget.container\n .getAsync('conversation')\n .then((platform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\n })\n .then(() => closeAllModals(container))\n .then(() => false);\n });\n }\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n return platform\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\n });\n return chatWidget ? false : true;\n};\n\nexport const navigateToConversation = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n routeName = 'conversation'\n) => {\n const { mainWidget, chatWidget } = getSeparateWidget(container);\n if (chatWidget) {\n return chatWidget.container.getAsync('router').then((router: any) => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n }\n\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\n mainWidget.container.getAsync('router').then((router: any) => {\n mainWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: { properties: { providers: [contactMethod.clientName] } },\n target: conversationQuery,\n provider: 'localStorage',\n });\n })\n .then(() => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n });\n });\n });\n};\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport {\n Container,\n EventManager,\n EventSubscriptionCancellation,\n Widget,\n} from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport { createSessionStorageKey } from './store';\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\nimport { swapProvider } from './utils/swap-provider';\n\nconst STORAGE_KEY = 'conversations';\n\nexport type ConversationHandler = (\n conversation: ConversationProvider,\n component: ComponentNodeController\n) => void | (() => void);\n\nexport type UnregisterControllerDelegate = () => void;\n\nexport type ConversationProviderRegistration = {\n name: string;\n handler: ConversationHandler;\n};\n\nexport enum ConversationEndedBehavior {\n Deactivate = 'deactivate',\n Navigate = 'navigate',\n None = 'none',\n}\n\nexport type SessionInfo = {\n id?: string;\n route?: RouteData;\n conversationEndedBehavior?: ConversationEndedBehavior;\n};\n\nexport class ConversationPlatform {\n events: EventManager;\n public controllers: {\n conversation: ConversationController;\n component: ComponentNodeController;\n }[] = [];\n private providers: ConversationProviderRegistration[] = [];\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\n private subscriptions: EventSubscriptionCancellation[] = [];\n private storageWriter: StorageWriter | null = null;\n private router: RoutingService | null = null;\n private buttonQuery: ComponentQuery | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(private container: Container, private components: ComponentPlatform) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n initialize() {\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((writer) => (this.storageWriter = writer));\n\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n this.buttonQuery = this.components\n .components()\n .ofType('conversation-return-button');\n if (storedSession) {\n this.sessionInfo = storedSession;\n if (storedSession.id && storedSession.route) {\n this.writeToComponents({ active: true, alert: { show: false } });\n }\n }\n }\n );\n this.container.getAsync('router').then((router) => (this.router = router));\n this.events.subscribe('conversation:ended', (event, data) => {\n switch (this.sessionInfo?.conversationEndedBehavior) {\n case ConversationEndedBehavior.Deactivate:\n const widget: Widget = this.container.get('$widget');\n widget.deactivate();\n break;\n case ConversationEndedBehavior.Navigate:\n const initialRoute = this.router?.getInitialRoute();\n if (initialRoute) {\n this.router?.navigate(initialRoute.name);\n }\n break;\n case ConversationEndedBehavior.None:\n default:\n break;\n }\n this.writeToComponents({ active: false });\n this.sessionInfo = null;\n this.storageWriter && this.storageWriter();\n });\n }\n\n addSubscription(sub: EventSubscriptionCancellation) {\n this.subscriptions.push(sub);\n }\n\n static getInstance(\n container: Container,\n key: string = 'conversation'\n ): Promise<ConversationPlatform> {\n return lock(container)(() => {\n return container.getAsync(key).then((value: ConversationPlatform) => {\n let conversation = value;\n if (!conversation) {\n return ComponentPlatform.getInstance(container).then((components) => {\n conversation = new ConversationPlatform(container, components);\n conversation.initialize();\n container.registerAsync(key, () => conversation);\n return conversation;\n });\n }\n return conversation;\n });\n });\n }\n\n navigateToConversationIfActive(id: string): Promise<void> {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n if (storedSession && storedSession.id === id) {\n if (storedSession.route) {\n const { name, params } = storedSession.route;\n this.router?.navigate(name, params);\n }\n }\n }\n );\n }\n\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => {\n let storedSession = stored;\n if (storedSession) {\n storedSession.conversationEndedBehavior = behavior;\n } else {\n storedSession = { conversationEndedBehavior: behavior };\n }\n this.sessionInfo = storedSession;\n return (\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\n Promise.resolve()\n );\n }\n );\n }\n\n async createController(id: string, options: { rehydrate: boolean }) {\n const storageKey = createSessionStorageKey(id);\n const { agents: storedAgents } = (await readStorage<{ agents: AgentSettings[] }>(\n this.container,\n storageKey\n )) || { agents: [] };\n\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\n let controller;\n if (index > -1) {\n controller = this.controllers[index].conversation;\n } else {\n controller = new ConversationController(this.container, id, options);\n }\n\n controller.setInitialStorage({ agents: storedAgents || [] });\n return controller;\n }\n\n registerProvider(name: string, handler: ConversationHandler): void {\n const provider = {\n name,\n handler,\n };\n this.providers.push(provider);\n // execute provider for all matching controllers\n this.controllers\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\n .forEach((controller) => {\n this.invokeHandler(provider, controller);\n });\n }\n\n registerController(\n conversation: ConversationController,\n component: ComponentNodeController\n ): boolean {\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\n let controller: any;\n if (index < 0) {\n controller = { conversation, component };\n this.controllers.push(controller);\n const invokeHandlers = (providers: string[]) => {\n if (providers) {\n this.providers\n .filter((provider) => providers.indexOf(provider.name) > -1)\n .forEach((provider) => {\n this.invokeHandler(provider, controller);\n });\n }\n };\n\n this.subscriptions.push(\n conversation.onDispose((event, data) => {\n const index = this.controllers.findIndex((c) => c.conversation === data);\n index > -1 && this.controllers.splice(index, 1);\n this.components\n .components()\n .ofType('conversation-return-button')\n .select()\n .writeProperties({ active: false });\n\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\n })\n );\n this.subscriptions.push(\n conversation.onProvidersChange((event, data) => {\n const { added, removed = [] }: { added: string[]; removed: string[] } = data;\n removed.forEach((removedProvider) => {\n (this.disposeProviders[removedProvider] || []).forEach((dispose) => {\n dispose();\n });\n });\n invokeHandlers(added);\n })\n );\n\n this.subscriptions.push(\n conversation.onStarted((event, isActive) => {\n const session: SessionInfo = {\n id: conversation.id,\n route: this.router?.getRouteData(),\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\n };\n this.sessionInfo = session;\n this.storageWriter && this.storageWriter(session);\n\n this.writeToComponents({ active: isActive });\n })\n );\n\n this.subscriptions.push(\n conversation.onUnreadMessage((event, data) => {\n this.events.dispatch('conversation:unread-message', data);\n this.writeToComponents({ alert: { show: data } });\n })\n );\n\n invokeHandlers(conversation.providers);\n return true;\n }\n controller = this.controllers[index];\n return false;\n }\n\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\n if (this.buttonQuery) {\n this.components.write({\n key: 'conversationReturnButtonState',\n attributes: { properties },\n target: this.buttonQuery,\n provider: 'localStorage',\n });\n }\n }\n\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\n const dispose = provider.handler(\n controller.conversation.createProvider(provider.name),\n controller.component\n );\n if (dispose) {\n if (!this.disposeProviders[provider.name]) {\n this.disposeProviders[provider.name] = [];\n }\n this.disposeProviders[provider.name].push(dispose);\n }\n }\n\n getComponentRoute() {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => stored?.route\n );\n }\n\n dispose() {\n Object.keys(this.disposeProviders).forEach((key) => {\n this.disposeProviders[key].forEach((dispose) => {\n dispose();\n });\n });\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n this.controllers = [];\n this.providers = [];\n }\n\n public static async handleContactMethodClick(\n event: any,\n container: Container,\n contactMethod: any,\n callback?: Function\n ) {\n if (shouldPreventDefault(container)) {\n event.preventDefault();\n let triggerEl = document.getElementById('humany-dynamic-anchor');\n if (!triggerEl) {\n triggerEl = document.createElement('a');\n triggerEl.setAttribute('href', '#');\n triggerEl.id = 'humany-dynamic-anchor';\n document.body.appendChild(triggerEl);\n }\n openChatWidget(container, contactMethod, triggerEl);\n }\n openChatWidget(container, contactMethod);\n }\n\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\n if (contactMethod?.body.form.meta?.conversation?.id) {\n // if we already are in a conversational context, we always want to swap\n // the current provider instead of a route navigation\n return swapProvider(\n container,\n contactMethod.body.form.meta.conversation.id,\n contactMethod.clientName\n );\n }\n\n return navigateToConversation(container, contactMethod);\n }\n}\n","import { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\nimport { ConversationPlatform } from '../../conversation-platform';\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\n\nexport type BundledConversationMessage = {\n timestamp: number;\n content: [BundledMessageContent];\n sender: ConversationMessageSender;\n type: ConversationMessageType;\n};\n\ntype BundledMessageContent = {\n key: string;\n} & ConversationMessageContent;\n\nexport type ConversationContent = {\n loading: boolean;\n typingActors: ConversationMessageSender[];\n messages: ConversationMessage[];\n};\n\n/**\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\n * Put this as a property on either the component or on the provider?\n * Could possibly be implemented directly in the createEntry method\n * of the conversation controller to avoid iterating over the entire array on\n * each update.\n */\nconst groupedMessages = (\n messages: ConversationMessage[],\n timeout?: number\n): BundledConversationMessage[] => {\n return messages.reduce((acc: any[], current: any, index: number) => {\n const newItem = {\n ...current,\n content: [{ ...current.content, key: current.key }],\n };\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\n const previous = acc[acc.length - 1];\n if (\n (!timeout && timeout !== 0) ||\n Math.abs(previous.timestamp - current.timestamp) < timeout\n ) {\n if (\n previous.sender?.name === current.sender?.name &&\n previous.type === current.type\n ) {\n previous.timestamp = current.timestamp;\n previous.content.push({ ...current.content, key: current.key });\n return acc;\n }\n }\n }\n acc.push(newItem);\n return acc;\n }, []);\n};\n\nexport type ConversationComponentProperties = {\n providers: string[];\n messages: BundledConversationMessage[]; // internal\n overlay?: { conversation: boolean; secondary: boolean }; // internal\n overlayConversationHeader?: string;\n overlayConversationCloseLabel?: string;\n loading: boolean;\n inputPlaceholder: string;\n inputDisabled: boolean;\n inputHidden: boolean;\n inputMultiline: boolean;\n rehydrate?: boolean;\n userLabel: string;\n avatarSize: string;\n typingActors: any[]; // internal\n conversationControllerId?: string; // internal\n sendButtonLabel: string;\n secondaryAction?: { icon?: string; action: string; label: string };\n};\n\nexport const ConversationComponent = (container: Container) => {\n return Promise.all([\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\n return createReactComponent(\n container,\n 'conversation',\n import('./conversation'),\n async (component) => {\n const { rehydrate = false } =\n component.properties<ConversationComponentProperties>();\n const routeData = router.getRouteData();\n const name = routeData.params.id || component.node.name || 'component';\n const conversation = await platform.createController(name, { rehydrate });\n const isNewController = platform.registerController(conversation, component);\n\n const messageGroupingTimeout = 3 * 60 * 1000;\n\n const setProperties = (properties: ConversationComponentProperties) => {\n const { providers = [] } = properties;\n if (providers) {\n const providerKeys = Array.isArray(providers) ? providers : [providers];\n conversation.setProviders(providerKeys);\n return providerKeys;\n }\n };\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\n\n conversation.setComponentMountedState(true);\n\n const writeMessages = (messageStream: any) => {\n const { loading, typingActors, messages } = messageStream;\n component.writeProperties({\n loading,\n typingActors,\n messages: groupedMessages(messages, messageGroupingTimeout),\n });\n };\n\n writeMessages(conversation.getMessageStream());\n\n if (isNewController) {\n component.writeProperties({ conversationControllerId: conversation.id });\n // todo: dont create actions here, there will be duplicates due to reuseController = true\n component.actions.create('user-submit', (data, options) => {\n if (options) {\n const { preventDefault, validationPromise } = options;\n if (preventDefault) {\n if (validationPromise) {\n validationPromise().then((text: string) => {\n if (text) {\n conversation.user.print(text);\n }\n });\n }\n return;\n }\n }\n conversation.user.print(data.text);\n });\n\n component.actions.create('user-typing', (data, options) => {});\n\n component.actions.create('form', (data, options) => {});\n\n component.actions.create('action', (data, options) => {});\n\n component.actions.create('overlay-mounted', (data, options) => {});\n\n component.actions.create('show-overlay', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay', (data, options) => {\n component.writeProperties({\n overlay: null,\n });\n });\n\n component.actions.create('show-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: true, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n }\n\n const unsubscribe = conversation.events.subscribe(\n 'conversation:updated',\n (e: any, conversationData: ConversationContent) => {\n writeMessages(conversationData);\n }\n );\n\n return () => {\n conversation.setComponentMountedState(false);\n unsubscribe();\n if (!conversation.active) {\n // unregisterController();\n // todo: add possibility to dispose this through extendComponent()\n // component.dispose();\n writeMessages({ messages: [], typingActors: [], loading: false });\n }\n };\n },\n { reuseController: true }\n );\n });\n};\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../..';\n\nexport enum ButtonMode {\n flat = 'flat',\n flashing = 'flashing',\n flashingGradient = 'flashingGradient',\n}\n\nexport type ReturnButtonProps = {\n label: string;\n active: boolean;\n mode: ButtonMode;\n alert?: {\n symbol?: Symbol;\n show?: boolean;\n label?: string;\n };\n};\n\nexport const ConversationReturnButtonComponent = (container: Container) => {\n return Promise.all([\n ComponentPlatform.getInstance(container),\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(\n ([components, platform, router]: [\n ComponentPlatform,\n ConversationPlatform,\n RoutingService\n ]) => {\n return createReactComponent(\n container,\n 'conversation-return-button',\n import('./return-button'),\n (component) => {\n component.actions.create('toggle', (options = {}) => {\n platform.getComponentRoute()?.then((route) => {\n route && router.navigate(route.name, route.params);\n });\n });\n }\n );\n }\n );\n};\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\n\nexport type ConversationMessageSettings = {\n key?: string;\n timestamp?: number;\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n form?: (builder: FormBuilder) => void;\n type?: string;\n items?: ConversationMessageList[];\n [key: string]: any;\n};\n\nexport type NormalizedMessageSettings = {\n content: ConversationMessageContent;\n key: string;\n timestamp: number | null;\n};\n\nexport type ConversationMessageList = {\n header?: string;\n itemKey: string;\n type?: ConversationMessageListType;\n items: ConversationMessageListItem[];\n};\n\nexport type ConversationMessageListItem = {\n icon?: string;\n type?: ConversationMessageListItemType;\n actions?: { [actionKey: string]: any };\n form?: Form;\n body?: string;\n key: string;\n [key: string]: any;\n};\n\nexport type ConversationMessageContent = {\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n items?: ConverstationMessageItem<any>[];\n form?: Form;\n [key: string]: any;\n};\n\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\n\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\n timestamp?: number;\n};\n\nexport type ConversationMessageSender = {\n name?: string;\n avatar?: string | Symbol;\n id?: string;\n};\n\nexport enum ConversationMessageListType {\n Ordinary = 'ordinary',\n Seperator = 'seperator',\n}\n\nexport enum ConversationMessageListItemType {\n LinkList = 'link-list',\n Separator = 'separator',\n ButtonList = 'button-list',\n ItemList = 'item-list',\n Text = 'text',\n HTML = 'html',\n VideoRequest = 'video-request',\n}\n\nexport type LinkListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\n\ntype TextItem = [ConversationMessageListItemType.Text, string];\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\n\nexport type ButtonListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\n\nexport type ItemListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ItemListItem = [ConversationMessageListItemType.ItemList, ItemListProperties];\n\nexport type VideoRequestProperties = {\n header?: string;\n acceptLabel: string;\n declineLabel: string;\n};\n\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\n\nexport type HtmlProperties = {\n body: string;\n};\n\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\n\ntype ItemPayload =\n | LinkListItem\n | TextItem\n | SeparatorItem\n | ButtonListItem\n | HtmlItem\n | VideoRequestItem\n | ItemListItem;\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { lazy } from 'react';\nimport { ConversationPlatform } from '..';\n\nexport const registerCustomMessageComponent = (\n container: Container,\n type: string,\n component: ReactComponent\n) => {\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\n const platform = await ConversationPlatform.getInstance(container);\n platform.addSubscription(\n o.registerComponent(\n type,\n lazy(() => component)\n )\n );\n });\n};\n"],"names":["ConversationHistory","controller","events","unsubscribe","e","data","acc","message","normalized","getNormalizedMessageSettings","key","content","type","sender","timestamp","parsed","handle","body","options","messagesAsList","messageData","_type","items","item","res","ConversationMessageType","contactMethodId","method","result","linebreak","header","title","label","description","text","html","actions","value","option","target","Agent","provider","settings","uuid","name","avatar","_a","ConversationProvider","container","storedAgent","agent","__spreadValues","unsub","fn","createSessionStorageKey","id","Locker","unlockNext","willLock","resolve","willUnlock","Store","conversation","enabled","__async","storedAgents","agents","a","providerIndex","storedMessages","_","__spreadProps","messages","agentId","action","unlock","createStorageWriter","StorageCategory","write","prev","m","newData","readStorage","Store$1","User","swapProvider","conversationId","providerName","components","currentInstance","c","toQueue","conversationQuery","ConversationEntry","writer","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","ConversationController","widget","providers","removed","added","providerToRemove","index","p","mounted","nextProvider","entry","updated","updatedTimestamp","dismissed","handler","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","closeAllModals","contactMethodsQuery","conversationsQuery","StorageMedium","StorageScope","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","STORAGE_KEY","ConversationPlatform","storedSession","event","initialRoute","_b","_c","sub","lock","ComponentPlatform","params","behavior","stored","storageKey","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","triggerEl","groupedMessages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","rehydrate","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","preventDefault","validationPromise","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/conversation-history.ts","../src/agent.ts","../src/conversation-provider.ts","../src/store.ts","../src/user.ts","../src/utils/swap-provider.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/components/conversation/plugin.ts","../src/components/return-button/plugin.ts","../src/types.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { EventSubscriptionCancellation, Widget } from '@webprovisions/platform';\nimport {\n ConversationController,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageContent, ConversationMessageSender } from './types';\n\ntype ConversationLogMessage = {\n message?: string;\n options?: string[];\n alias: string;\n source: string;\n timestamp: number | null;\n};\n\nexport class ConversationHistory {\n private cache: Map<string, any> = new Map();\n\n private subscriptions: EventSubscriptionCancellation[] = [];\n\n constructor(private controller: ConversationController) {\n const { events } = controller.container.get('$widget') as Widget;\n\n const unsubscribe = events.subscribe('data-client:fetched', (e, data) => {\n if (data.type === 'contact-method') {\n this.cache.set(data.response.id, data.response);\n }\n });\n this.subscriptions.push(unsubscribe);\n }\n\n getConversationLogs(): ConversationLogMessage[] {\n const logs = this.controller.messages.reduce<ConversationLogMessage[]>((acc, message) => {\n const normalized = getNormalizedMessageSettings(message as any);\n const { key, content, type, sender, timestamp } = normalized.content;\n\n const parsed = this.parseEntry(content, type, sender, timestamp);\n\n if (parsed) {\n acc.push(parsed);\n }\n\n return acc;\n }, []);\n\n return logs;\n }\n\n parseEntry(\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: any | null\n ) {\n const handle = (body: any | any[]) => {\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n let messageData: any;\n\n // the actual content could also be an array,\n if (Array.isArray(body)) {\n const [_type, data] = body;\n messageData = data;\n } else {\n messageData = body;\n }\n\n const message = this.createMessageContent(messageData);\n if (message.length) {\n messagesAsList = [...messagesAsList, this.createMessageContent(messageData)];\n }\n options = [...options, ...this.createMessageOptions(messageData)];\n\n return {\n messagesAsList,\n options,\n };\n };\n\n let options: string[] = [];\n let messagesAsList: string[] = [];\n\n // a message could be either an array or just the content itself\n if (Array.isArray(content.items)) {\n const { items } = content;\n items.forEach((item) => {\n const res = handle(item);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n });\n } else {\n const res = handle(content);\n options = [...options, ...res.options];\n messagesAsList = [...messagesAsList, ...res.messagesAsList];\n }\n\n const result: ConversationLogMessage = {\n options: options,\n message: messagesAsList.length ? messagesAsList.join('\\n') : undefined,\n source: this.createMessageSource(type),\n alias: this.createAlias(type, sender),\n timestamp,\n };\n\n return result;\n }\n\n private createMessageSource(type: ConversationMessageType) {\n return type;\n }\n\n private createAlias(type: ConversationMessageType, sender?: ConversationMessageSender) {\n if (type === ConversationMessageType.System) {\n return 'system';\n }\n return sender?.name || 'Me';\n }\n\n private handleContactMethod(contactMethodId: string) {\n if (!this.cache.has(contactMethodId)) {\n return;\n }\n\n const method = this.cache.get(contactMethodId);\n\n let result = '';\n\n result = this.appendText(result, `${method.clientName}:`);\n result = this.appendText(result, method.title);\n if (method.description) {\n result = this.appendText(result, method.title);\n }\n\n return result;\n }\n\n private getDetails(item: any, linebreak = true) {\n if (!item) {\n return '';\n }\n\n const { header, title, label, description, text, html, body, contactMethodId } = item;\n let result = '';\n\n if (contactMethodId) {\n const text = this.handleContactMethod(contactMethodId.toString());\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n }\n\n if (header) {\n result = this.appendText(result, header, linebreak);\n }\n if (title) {\n result = this.appendText(result, title, linebreak);\n }\n if (description) {\n result = this.appendText(result, description, linebreak);\n }\n if (text) {\n result = this.appendText(result, text, linebreak);\n }\n if (label) {\n result = this.appendText(result, label, linebreak);\n }\n if (html) {\n result = this.appendText(result, html, linebreak);\n }\n if (body) {\n if (typeof body === 'string') {\n result = this.appendText(result, body, linebreak);\n }\n }\n return result;\n }\n\n private createMessageContent(data: any) {\n let message = '';\n\n message = this.getDetails(data);\n\n return message;\n }\n\n private createMessageOptions(data: any): any[] {\n let options = [];\n let actions = [];\n\n if (Array.isArray(data?.actions)) {\n actions = data.actions;\n } else if (typeof data?.actions === 'object') {\n actions = Object.entries(data.actions).map(([key, value]) => {\n return {\n actionKey: key,\n label: value,\n };\n });\n }\n\n if (actions.length) {\n options = actions.map((option: any) => {\n return this.getDetails(option, false);\n });\n }\n return options;\n }\n\n private appendText(target: string, value: string, linebreak = true) {\n if (linebreak) {\n if (target.length) {\n return `${target}\\n${value}`;\n }\n }\n return target.length ? `${target} ${value}` : value;\n }\n\n dispose() {\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n }\n}\n","import { Symbol } from '@telia-ace/widget-ui';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport {\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport {\n ConversationMessageSender,\n ConversationMessageSettings,\n ConverstationMessageItem,\n} from './types';\n\nexport type AgentSettings = {\n id?: string;\n name?: string;\n avatar?: string | Symbol;\n};\n\nexport class Agent {\n id: string;\n name?: string;\n avatar?: string | Symbol;\n\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\n this.id = settings.id || uuid();\n this.name = settings.name;\n this.avatar = settings.avatar;\n }\n\n print = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n ): ConversationEntry | undefined => {\n const sender: ConversationMessageSender = {\n name: this.name,\n avatar: this.avatar,\n id: this.id,\n };\n const normalized = getNormalizedMessageSettings(settings, options);\n\n return this.provider.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.Agent,\n sender,\n normalized.timestamp\n );\n };\n typing = () => {\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\n };\n\n update(settings: AgentSettings): void {\n const { name, avatar } = settings;\n if (avatar === null) {\n this.avatar = undefined;\n } else if (avatar) {\n this.avatar = avatar;\n }\n\n if (name === null) {\n this.name = undefined;\n } else if (name) {\n this.name = name;\n }\n\n this.provider.controller?.events.dispatch('conversation:agent-updated', {\n agent: this,\n });\n }\n}\n","import {\n Container,\n EventListener,\n EventObject,\n EventSubscriptionCancellation,\n} from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport {\n CancelLoaderDelegate,\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n ConversationOptions,\n} from './conversation-controller';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n} from './types';\n\nexport class ConversationProvider {\n private subscriptions: EventSubscriptionCancellation[] = [];\n public options: ConversationOptions;\n public user: any;\n\n private constructor(\n public name: string,\n private container: Container,\n public controller: ConversationController | null\n ) {\n this.user = controller?.user;\n this.options = {\n silent: false,\n };\n }\n\n static create(name: string, container: Container, controller: ConversationController) {\n return new ConversationProvider(name, container, controller);\n }\n\n createAgent(settings: AgentSettings = {}): Agent | undefined {\n if (this.controller) {\n const storedAgent = this.controller.getAgentById(settings.id);\n\n const agent = storedAgent\n ? new Agent(this, { ...storedAgent, ...settings })\n : new Agent(this, settings);\n if (!storedAgent) {\n this.controller?.events.dispatch('conversation:agent-created', {\n agent,\n });\n }\n return agent;\n }\n }\n\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\n return this.controller?.print(settings);\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n return this.controller?.setTypingState(sender, type);\n }\n\n loading(): CancelLoaderDelegate {\n if (!this.controller) {\n return () => () => {};\n }\n return this.controller.loader();\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ) {\n return this.controller?.createEntry(key, content, type, sender, timestamp);\n }\n\n dispose() {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`conversation-provider: dispose (${this.name})`);\n }\n this.controller?.disposeProvider(this);\n this.controller = null;\n this.subscriptions.forEach((unsub) => unsub());\n }\n\n isRehydrated() {\n return this.controller?.isRehydrated() || Promise.resolve(false);\n }\n\n getHistory() {\n return this.controller?.getHistory() || [];\n }\n\n complete() {\n this.controller?.onCompleteProvider();\n }\n\n setOptions(options: ConversationOptions = { silent: false }) {\n this.options = options;\n }\n\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.onUnreadMessage(fn);\n this.subscriptions.push(unsubscribe);\n return () => {\n unsubscribe();\n };\n }\n }\n\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\n if (this.controller) {\n const unsubscribe = this.controller?.events.subscribe(\n 'conversation:component-mount-changed',\n fn\n );\n this.subscriptions.push(unsubscribe);\n fn({} as EventObject, this.controller.getComponentMountedState());\n return () => {\n unsubscribe();\n };\n }\n }\n}\n\nexport default ConversationProvider;\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\nimport { Container } from '@webprovisions/platform';\nimport { Agent, AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\n\ntype StoredConversationAgent = {\n id: string;\n name: string;\n avatar?: string;\n providerName: string;\n};\ntype StoredConversationMessage = any;\n\ntype StoredConversation = {\n agents: StoredConversationAgent[];\n messages: StoredConversationMessage[];\n};\n\nexport const createSessionStorageKey = (id: string) => {\n return `conversation-${id}`;\n};\n\nclass Locker {\n private _locking: Promise<void> = Promise.resolve();\n private _locks: number = 0;\n\n isLocked() {\n return this._locks > 0;\n }\n\n lock() {\n this._locks += 1;\n\n let unlockNext: () => void;\n\n let willLock = new Promise<void>(\n (resolve) =>\n (unlockNext = () => {\n this._locks -= 1;\n\n resolve();\n })\n );\n\n let willUnlock = this._locking.then(() => unlockNext);\n\n this._locking = this._locking.then(() => willLock);\n\n return willUnlock;\n }\n}\n\nclass Store {\n private sessionStorageKey: string;\n private locker = new Locker();\n private initialStoredAgents: StoredConversationAgent[] = [];\n\n constructor(\n private container: Container,\n private conversation: ConversationController,\n private enabled: boolean // whether or not to store data\n ) {\n this.sessionStorageKey = createSessionStorageKey(conversation.id);\n\n conversation.onStarted(async () => {\n if (conversation.messages.length > 0) {\n // if the conversation already contains messages\n // for example when re-opening a minimized widget,\n // we do not want to do anything\n return;\n }\n const { agents: storedAgents } = await this.read();\n\n const agents: Agent[] = [];\n\n if (storedAgents) {\n storedAgents.forEach((a) => {\n const providerIndex = conversation.providerIndex(a.providerName);\n const provider =\n providerIndex > -1\n ? conversation.registeredProviders[providerIndex]\n : conversation.createProvider(a.providerName);\n\n const agent = new Agent(provider, { name: a.name, avatar: a.avatar, id: a.id });\n agents.push(agent);\n });\n }\n\n const { messages: storedMessages } = await this.read();\n storedMessages.forEach((message) => {\n switch (message.type) {\n case 'agent': {\n const agent = agents.find((a) => a.id === message.sender?.id);\n if (agent) {\n agent.print(message.content.items || message.content, {\n key: message.key,\n });\n }\n return;\n }\n case 'user': {\n conversation.user.print(message.content.items || message.content, {\n key: message.key,\n });\n return;\n }\n case 'system':\n default: {\n conversation.print(message.content.items || message.content);\n }\n }\n });\n });\n conversation.onMessageCreated(async (_, data) => {\n this.write(data.message, 'messages');\n });\n\n conversation.events.subscribe('conversation:agent-created', async (_, data) => {\n const agent = {\n id: data.agent.id,\n name: data.agent.name,\n avatar: data.agent.avatar,\n providerName: data.agent.provider.name,\n };\n await this.write(agent, 'agents');\n });\n\n conversation.events.subscribe('conversation:agent-updated', async (_, data) => {\n const { agents } = await this.read();\n\n await this.write(\n [\n ...agents.map((a) => {\n if (a.id === data.agent.id) {\n return {\n ...a,\n name: data.agent.name,\n avatar: data.agent.avatar,\n };\n }\n return a;\n }),\n ],\n 'agents',\n 'update'\n );\n });\n }\n\n setInitialData(data: { agents: AgentSettings[] }) {\n this.initialStoredAgents = data.agents as StoredConversationAgent[];\n }\n\n async isRehydrated() {\n const { messages } = await this.read();\n return messages.length > 0;\n }\n\n getStoredAgent(agentId: string) {\n if (!this.enabled) {\n return;\n }\n return this.initialStoredAgents.find((a) => a.id === agentId);\n }\n\n async write(data: any, type: 'messages' | 'agents', action: 'add' | 'update' = 'add') {\n if (!this.enabled) {\n return;\n }\n\n const unlock = await this.locker.lock();\n return createStorageWriter(\n this.container,\n this.sessionStorageKey,\n StorageCategory.Necessary\n ).then(async (write) => {\n if (action === 'add') {\n const prev = await this.read();\n\n // ensure that we don't duplicate messages by looking at their unqiue keys\n if (\n type === 'messages' &&\n prev.messages.findIndex((m) => m.key === data.key) > -1\n ) {\n unlock();\n return;\n }\n\n let newData = {\n ...prev,\n };\n\n if (type === 'messages') {\n newData.messages = [...newData.messages, data];\n } else if (type === 'agents') {\n newData.agents = [...newData.agents, data];\n }\n\n return write({\n ...prev,\n ...newData,\n }).then(() => {\n unlock();\n });\n }\n\n if (action === 'update') {\n if (type === 'agents') {\n const prev = await this.read();\n\n return write({\n ...prev,\n agents: data,\n }).then(() => {\n unlock();\n });\n }\n }\n\n return write(data).then(() => {\n unlock();\n });\n });\n }\n\n async read() {\n return readStorage(this.container, this.sessionStorageKey).then((data) => {\n if (!data) {\n return {\n messages: [],\n agents: [],\n };\n }\n return data as StoredConversation;\n });\n }\n}\n\nexport default Store;\n","import {\n ConversationController,\n ConversationEntry,\n ConversationMessageType,\n getNormalizedMessageSettings,\n} from './conversation-controller';\nimport { ConversationMessageSettings } from './types';\n\nexport class User {\n constructor(private controller: ConversationController) {}\n\n print = (\n settings: string | ConversationMessageSettings,\n options?: {\n key?: string;\n }\n ): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings, options);\n return this.controller.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.User,\n undefined,\n normalized.timestamp\n );\n };\n}\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../conversation-platform';\n\n/**\n * This will put the current provider(s) in a queue and\n * swap current provider to another one based on the providerName.\n * When ConversationProvider.complete() is called, the provider(s) in the\n * queue will become active again\n */\nexport const swapProvider = async (\n container: Container,\n conversationId: string,\n providerName: string\n) => {\n const conversation: ConversationPlatform = await container.getAsync('conversation');\n const components: ComponentPlatform = await container.getAsync('components');\n const currentInstance = conversation.controllers.find((c) => {\n return c.conversation.id === conversationId;\n });\n\n if (currentInstance) {\n const toQueue = [...currentInstance.conversation.providers];\n toQueue.forEach((name) => {\n currentInstance.conversation.setProviderOptions(name, { silent: true });\n });\n currentInstance.conversation.queueProviders(toQueue);\n currentInstance.conversation.setProviders([providerName]);\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [providerName] },\n },\n target: conversationQuery,\n provider: 'localStorage',\n });\n }\n};\n","import { FormBuilder } from '@telia-ace/widget-forms';\nimport { uuid } from '@telia-ace/widget-utilities';\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationHistory } from './conversation-history';\nimport { ConversationProvider } from './conversation-provider';\nimport Store from './store';\nimport {\n ConversationMessageContent,\n ConversationMessageSender,\n ConversationMessageSettings,\n ConversationMessageUpdateSettings,\n ConverstationMessageItem,\n NormalizedMessageSettings,\n} from './types';\nimport { User } from './user';\nimport { swapProvider } from './utils/swap-provider';\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\n\nexport type ConversationOptions = { silent: boolean };\n\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\n\nexport type FormHandlers = { [key: string]: FormHandler };\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\n\nexport type CancelLoaderDelegate = () => void;\n\nexport class ConversationEntry {\n constructor(private writer: EntryWriter) {}\n\n update(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n const normalized = this.getNormalizedSettings(content);\n // const normalized = typeof content === 'string' ? { body: content } : content;\n this.writer(<ConversationMessageUpdateSettings>normalized);\n }\n\n remove() {\n this.writer(null);\n }\n\n private getNormalizedSettings(\n content:\n | string\n | ConversationMessageUpdateSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[]\n ) {\n if (typeof content === 'string') return { body: content };\n else if (content.length > -1 && typeof content === 'object') return { items: content };\n else return content;\n }\n}\n\nexport enum ConversationMessageType {\n User = 'user',\n Agent = 'agent',\n System = 'system',\n}\n\nexport type ConversationMessage = {\n key: string;\n timestamp: number | null;\n content: ConversationMessageContent | null;\n sender: ConversationMessageSender | null;\n type: ConversationMessageType;\n};\n\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\n\nexport const getNormalizedMessageSettings = (\n settings:\n | string\n | ConversationMessageSettings\n | ConverstationMessageItem<any>\n | ConverstationMessageItem<any>[],\n options?: {\n key?: string;\n }\n): NormalizedMessageSettings => {\n let content: ConversationMessageContent;\n let key = options?.key || uuid();\n let timestamp: number | null = Date.now();\n\n if (Array.isArray(settings) && settings.length > -1) {\n if (typeof settings[0] === 'string') {\n content = { items: [<ConverstationMessageItem<any>>settings] };\n } else {\n content = { items: <ConverstationMessageItem<any>[]>settings };\n }\n } else if (typeof settings === 'string') {\n content = { body: settings };\n } else {\n settings = <ConversationMessageSettings>settings || {};\n\n if (settings.type) {\n content = {\n ...(<any>settings),\n };\n } else {\n content = {\n body: settings.body,\n actions: settings.actions,\n title: settings.title,\n };\n if (settings.key) {\n key = settings.key;\n }\n if (settings.timestamp) {\n timestamp = settings.timestamp;\n }\n if (typeof settings.form === 'function') {\n const builder = FormBuilder.create(key);\n settings.form(builder);\n const builtForm = builder.get();\n content.form = builtForm;\n }\n if (settings.timestamp === null) {\n timestamp = null;\n }\n }\n }\n return { content, key, timestamp };\n};\n\nconst removeTypingState = (\n typingActors: ConversationMessageSender[],\n sender?: ConversationMessageSender\n) => {\n if (!sender) {\n return;\n }\n const senderString = JSON.stringify(sender);\n const indexToRemove = typingActors.findIndex((item) => {\n return senderString === JSON.stringify(item);\n });\n if (indexToRemove > -1) {\n return typingActors.splice(indexToRemove, 1);\n }\n};\n\n/**\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\n * access to it as well as exposing emitted actions.\n */\nexport class ConversationController {\n formHandlers: FormHandlers = {};\n\n /**\n * Represents the current end user.\n */\n user: User = new User(this);\n\n events: EventManager;\n\n providers: string[] = [];\n\n active: boolean = false;\n\n queuedProviders: string[] = [];\n\n registeredProviders: ConversationProvider[] = [];\n\n private loaders: number = 0;\n private componentMounted: boolean = false;\n\n private store: Store;\n\n messages: ConversationMessage[] = [];\n private typingActors: ConversationMessageSender[] = [];\n\n private conversationHistory: ConversationHistory;\n\n constructor(public container: Container, public id: string, options: { rehydrate: boolean }) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n this.store = new Store(container, this, options.rehydrate);\n this.conversationHistory = new ConversationHistory(this);\n }\n\n setInitialStorage(data: { agents: AgentSettings[] }) {\n this.store.setInitialData(data);\n }\n\n setProviders(providers: string[]) {\n const removed: string[] = [];\n const added: string[] = [];\n\n // remove\n this.providers\n .reduce<string[]>((acc, provider) => {\n if (providers.indexOf(provider) === -1) {\n acc.push(provider);\n }\n return acc;\n }, [])\n .forEach((providerToRemove) => {\n const indexToRemove = this.providers.indexOf(providerToRemove);\n if (indexToRemove > -1) {\n removed.push(providerToRemove);\n this.providers.splice(indexToRemove, 1);\n }\n });\n\n // add\n providers.forEach((provider) => {\n if (this.providers.indexOf(provider) === -1) {\n added.push(provider);\n this.providers.push(provider);\n }\n });\n\n if (added.length || removed.length) {\n this.events.dispatch('conversation:providers-changed', { added, removed });\n }\n }\n\n createProvider(name: string): ConversationProvider {\n const index = this.providerIndex(name);\n if (index > -1) {\n return this.registeredProviders[index];\n }\n const provider = ConversationProvider.create(name, this.container, this);\n this.registeredProviders.push(provider);\n return provider;\n }\n\n providerIndex(name: string) {\n return this.registeredProviders.findIndex((p) => p.name === name);\n }\n\n getAgentById(id?: string) {\n if (!id) {\n return;\n }\n return this.store.getStoredAgent(id);\n }\n\n dispose() {\n this.conversationHistory.dispose();\n this.registeredProviders.forEach((provider) => provider.dispose());\n this.messages = [];\n this.events.dispatch('conversation:controller-disposed', this);\n this.active = false;\n }\n\n onDispose(fn: EventListener) {\n return this.events.subscribe('conversation:controller-disposed', fn);\n }\n\n onStarted(fn: EventListener) {\n return this.events.subscribe('conversation:started', fn);\n }\n\n onMessageCreated(fn: EventListener) {\n return this.events.subscribe('conversation:message-created', fn);\n }\n\n isRehydrated() {\n return this.store.isRehydrated();\n }\n\n disposeProvider(target: ConversationProvider) {\n const index = this.providerIndex(target.name);\n index > -1 && this.registeredProviders.splice(index, 1);\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\n if (!this.registeredProviders.length) {\n this.dispose();\n }\n }\n\n onProvidersChange(fn: EventListener) {\n return this.events.subscribe('conversation:providers-changed', fn);\n }\n\n setComponentMountedState(mounted: boolean) {\n if (this.componentMounted === mounted) {\n return;\n }\n this.componentMounted = mounted;\n if (mounted) {\n this.events.dispatch('conversation:unread-message', false);\n this.events.dispatch('conversation:started', true);\n this.active = true;\n }\n this.events.dispatch('conversation:component-mount-changed', mounted);\n }\n\n setProviderOptions(providerName: string, options: ConversationOptions) {\n const index = this.providerIndex(providerName);\n\n if (index > -1) {\n this.registeredProviders[index].setOptions(options);\n }\n }\n\n changeProvider(providerName: string) {\n const provider = this.registeredProviders.find((p) => p.name === providerName);\n\n if (provider) {\n swapProvider(this.container, this.id, providerName);\n }\n }\n\n queueProviders(providers: string[]) {\n this.queuedProviders = providers;\n }\n\n onCompleteProvider() {\n const nextProvider = this.queuedProviders.pop();\n\n if (nextProvider) {\n swapProvider(this.container, this.id, nextProvider);\n }\n }\n\n getComponentMountedState() {\n return this.componentMounted;\n }\n\n onUnreadMessage(fn: EventListener) {\n return this.events.subscribe('conversation:unread-message', fn);\n }\n\n createEntry(\n key: string,\n content: ConversationMessageContent,\n type: ConversationMessageType,\n sender?: ConversationMessageSender,\n timestamp?: number | null\n ): ConversationEntry {\n const message: ConversationMessage = {\n key,\n content,\n type,\n sender: sender || null,\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\n };\n this.messages.push(message);\n message.type === ConversationMessageType.Agent &&\n removeTypingState(this.typingActors, sender);\n const entry = new ConversationEntry((updated) => {\n if (updated !== null) {\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\n message.content = content;\n if (updatedTimestamp) {\n message.timestamp = updatedTimestamp;\n }\n } else {\n const indexToRemove = this.messages.indexOf(message);\n message.content = null;\n if (indexToRemove > -1) {\n this.messages.splice(indexToRemove, 1);\n }\n }\n this.events.dispatch('conversation:message-updated', { message });\n this.update();\n });\n this.events.dispatch('conversation:message-created', { message });\n this.update();\n if (!this.componentMounted) {\n this.events.dispatch('conversation:unread-message', true);\n }\n return entry;\n }\n\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\n const normalized = getNormalizedMessageSettings(settings);\n\n return this.createEntry(\n normalized.key,\n normalized.content,\n ConversationMessageType.System,\n undefined,\n normalized.timestamp\n );\n };\n\n update() {\n this.events.dispatch('conversation:updated', {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n });\n }\n\n getMessageStream() {\n return {\n messages: this.messages,\n loading: this.loaders > 0,\n typingActors: this.typingActors,\n };\n }\n\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\n if (this.typingActors.indexOf(sender) === -1) {\n this.typingActors.push(sender);\n this.update();\n }\n\n return () => {\n removeTypingState(this.typingActors, sender);\n this.update();\n };\n }\n\n /**\n * Displays a loader in the conversation.\n */\n loader(): CancelLoaderDelegate {\n this.loaders = this.loaders + 1;\n let dismissed = false;\n if (this.loaders === 1) {\n this.update();\n }\n return () => {\n if (!dismissed) {\n dismissed = true;\n this.loaders = this.loaders - 1;\n if (this.loaders === 0) {\n this.update();\n }\n }\n };\n }\n\n submitForm(key: string, handler: SubmitHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\n }\n\n validateForm(key: string, handler: ValidateHandler) {\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\n }\n\n getHistory() {\n return this.conversationHistory.getConversationLogs();\n }\n}\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\nimport { closeAllModals } from '@telia-ace/widget-plugins';\nimport {\n createStorageWriter,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\n\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\n const mainWidgetName = widgetName.split('_contact');\n return implementation.widgets.get(mainWidgetName[0]);\n};\n\nconst getSeparateWidget = (container: Container) => {\n const originWidget = container.get('$widget');\n const { name, implementation }: Widget = container.get('$widget');\n\n const mainWidget =\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\n const { data }: WidgetSettings = container.get('$settings');\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\n const chatWidgetName = `${name\n .replace('_contact-method', '')\n .replace('_contact', '')}_contact-method`;\n\n const chatWidget = implementation.widgets.get(chatWidgetName);\n if (chatWidget && !trigger) {\n return { chatWidget, mainWidget, data };\n }\n return { mainWidget, data };\n};\n\nexport const shouldPreventDefault = (container: Container) => {\n const { chatWidget } = getSeparateWidget(container);\n return !!chatWidget;\n};\n\nexport const openChatWidget = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n triggerDOMTarget?: HTMLElement\n) => {\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\n\n if (chatWidget) {\n if (chatWidget.state === 'activated') {\n return chatWidget.invoke('open').then(() => {\n chatWidget.container.getAsync('conversation').then((conversation) => {\n conversation\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => closeAllModals(container));\n });\n });\n }\n return chatWidget\n .activate()\n .then(() => {\n const { trigger } = chatWidget.container.get('$settings');\n trigger.action = 'hide'; // could be default in configuration\n return chatWidget\n .invoke('setSettings', () => ({\n data,\n trigger,\n activate: true,\n }))\n .then(() => {\n return chatWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n /**\n * Could cause issues if target widget is no longer as specific for this use case\n */\n const contactMethodsQuery = components\n .components()\n .ofType('contact-method');\n components.write({\n key: 'setContactMethodId',\n attributes: {\n properties: {\n id: contactMethod.id,\n guideId: contactMethod.guideId,\n },\n },\n target: contactMethodsQuery,\n provider: 'localStorage',\n });\n const conversationsQuery = components\n .components()\n .ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: {\n properties: { providers: [contactMethod.clientName] },\n },\n target: conversationsQuery,\n provider: 'localStorage',\n });\n });\n });\n })\n .then(() => {\n return chatWidget.invoke('attach', {\n key: 'contact-method',\n triggerDOMElement: triggerDOMTarget,\n withRenderState: 'open',\n });\n })\n .then(() => {\n createStorageWriter(\n chatWidget.container,\n 'activeStickyWidget',\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n ).then((write) => write(chatWidget.name));\n\n return chatWidget.container\n .getAsync('conversation')\n .then((platform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\n })\n .then(() => closeAllModals(container))\n .then(() => false);\n });\n }\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n return platform\n .navigateToConversationIfActive(contactMethod.id)\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\n });\n return chatWidget ? false : true;\n};\n\nexport const navigateToConversation = (\n container: Container,\n contactMethod: any /*ContactMethodType*/,\n routeName = 'conversation'\n) => {\n const { mainWidget, chatWidget } = getSeparateWidget(container);\n if (chatWidget) {\n return chatWidget.container.getAsync('router').then((router: any) => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n }\n\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\n mainWidget.container.getAsync('router').then((router: any) => {\n mainWidget.container\n .getAsync('components')\n .then((components: ComponentPlatform) => {\n const conversationQuery = components.components().ofType('conversation');\n components.write({\n key: 'setConversationProvider',\n attributes: { properties: { providers: [contactMethod.clientName] } },\n target: conversationQuery,\n provider: 'localStorage',\n });\n })\n .then(() => {\n router.navigate(routeName, { id: contactMethod.id });\n });\n });\n });\n });\n};\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport {\n Container,\n EventManager,\n EventSubscriptionCancellation,\n Widget,\n} from '@webprovisions/platform';\nimport { AgentSettings } from './agent';\nimport { ConversationController } from './conversation-controller';\nimport { ConversationProvider } from './conversation-provider';\nimport { createSessionStorageKey } from './store';\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\nimport { swapProvider } from './utils/swap-provider';\n\nconst STORAGE_KEY = 'conversations';\n\nexport type ConversationHandler = (\n conversation: ConversationProvider,\n component: ComponentNodeController\n) => void | (() => void);\n\nexport type UnregisterControllerDelegate = () => void;\n\nexport type ConversationProviderRegistration = {\n name: string;\n handler: ConversationHandler;\n};\n\nexport enum ConversationEndedBehavior {\n Deactivate = 'deactivate',\n Navigate = 'navigate',\n None = 'none',\n}\n\nexport type SessionInfo = {\n id?: string;\n route?: RouteData;\n conversationEndedBehavior?: ConversationEndedBehavior;\n};\n\nexport class ConversationPlatform {\n events: EventManager;\n public controllers: {\n conversation: ConversationController;\n component: ComponentNodeController;\n }[] = [];\n private providers: ConversationProviderRegistration[] = [];\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\n private subscriptions: EventSubscriptionCancellation[] = [];\n private storageWriter: StorageWriter | null = null;\n private router: RoutingService | null = null;\n private buttonQuery: ComponentQuery | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(private container: Container, private components: ComponentPlatform) {\n const widget: Widget = container.get('$widget');\n this.events = widget.events.createChild(this);\n }\n\n initialize() {\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((writer) => (this.storageWriter = writer));\n\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n this.buttonQuery = this.components\n .components()\n .ofType('conversation-return-button');\n if (storedSession) {\n this.sessionInfo = storedSession;\n if (storedSession.id && storedSession.route) {\n this.writeToComponents({ active: true, alert: { show: false } });\n }\n }\n }\n );\n this.container.getAsync('router').then((router) => (this.router = router));\n this.events.subscribe('conversation:ended', (event, data) => {\n switch (this.sessionInfo?.conversationEndedBehavior) {\n case ConversationEndedBehavior.Deactivate:\n const widget: Widget = this.container.get('$widget');\n widget.deactivate();\n break;\n case ConversationEndedBehavior.Navigate:\n const initialRoute = this.router?.getInitialRoute();\n if (initialRoute) {\n this.router?.navigate(initialRoute.name);\n }\n break;\n case ConversationEndedBehavior.None:\n default:\n break;\n }\n this.writeToComponents({ active: false });\n this.sessionInfo = null;\n this.storageWriter && this.storageWriter();\n });\n }\n\n addSubscription(sub: EventSubscriptionCancellation) {\n this.subscriptions.push(sub);\n }\n\n static getInstance(\n container: Container,\n key: string = 'conversation'\n ): Promise<ConversationPlatform> {\n return lock(container)(() => {\n return container.getAsync(key).then((value: ConversationPlatform) => {\n let conversation = value;\n if (!conversation) {\n return ComponentPlatform.getInstance(container).then((components) => {\n conversation = new ConversationPlatform(container, components);\n conversation.initialize();\n container.registerAsync(key, () => conversation);\n return conversation;\n });\n }\n return conversation;\n });\n });\n }\n\n navigateToConversationIfActive(id: string): Promise<void> {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (storedSession) => {\n if (storedSession && storedSession.id === id) {\n if (storedSession.route) {\n const { name, params } = storedSession.route;\n this.router?.navigate(name, params);\n }\n }\n }\n );\n }\n\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => {\n let storedSession = stored;\n if (storedSession) {\n storedSession.conversationEndedBehavior = behavior;\n } else {\n storedSession = { conversationEndedBehavior: behavior };\n }\n this.sessionInfo = storedSession;\n return (\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\n Promise.resolve()\n );\n }\n );\n }\n\n async createController(id: string, options: { rehydrate: boolean }) {\n const storageKey = createSessionStorageKey(id);\n const { agents: storedAgents } = (await readStorage<{ agents: AgentSettings[] }>(\n this.container,\n storageKey\n )) || { agents: [] };\n\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\n let controller;\n if (index > -1) {\n controller = this.controllers[index].conversation;\n } else {\n controller = new ConversationController(this.container, id, options);\n }\n\n controller.setInitialStorage({ agents: storedAgents || [] });\n return controller;\n }\n\n registerProvider(name: string, handler: ConversationHandler): void {\n const provider = {\n name,\n handler,\n };\n this.providers.push(provider);\n // execute provider for all matching controllers\n this.controllers\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\n .forEach((controller) => {\n this.invokeHandler(provider, controller);\n });\n }\n\n registerController(\n conversation: ConversationController,\n component: ComponentNodeController\n ): boolean {\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\n let controller: any;\n if (index < 0) {\n controller = { conversation, component };\n this.controllers.push(controller);\n const invokeHandlers = (providers: string[]) => {\n if (providers) {\n this.providers\n .filter((provider) => providers.indexOf(provider.name) > -1)\n .forEach((provider) => {\n this.invokeHandler(provider, controller);\n });\n }\n };\n\n this.subscriptions.push(\n conversation.onDispose((event, data) => {\n const index = this.controllers.findIndex((c) => c.conversation === data);\n index > -1 && this.controllers.splice(index, 1);\n this.components\n .components()\n .ofType('conversation-return-button')\n .select()\n .writeProperties({ active: false });\n\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\n })\n );\n this.subscriptions.push(\n conversation.onProvidersChange((event, data) => {\n const { added, removed = [] }: { added: string[]; removed: string[] } = data;\n removed.forEach((removedProvider) => {\n (this.disposeProviders[removedProvider] || []).forEach((dispose) => {\n dispose();\n });\n });\n invokeHandlers(added);\n })\n );\n\n this.subscriptions.push(\n conversation.onStarted((event, isActive) => {\n const session: SessionInfo = {\n id: conversation.id,\n route: this.router?.getRouteData(),\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\n };\n this.sessionInfo = session;\n this.storageWriter && this.storageWriter(session);\n\n this.writeToComponents({ active: isActive });\n })\n );\n\n this.subscriptions.push(\n conversation.onUnreadMessage((event, data) => {\n this.events.dispatch('conversation:unread-message', data);\n this.writeToComponents({ alert: { show: data } });\n })\n );\n\n invokeHandlers(conversation.providers);\n return true;\n }\n controller = this.controllers[index];\n return false;\n }\n\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\n if (this.buttonQuery) {\n this.components.write({\n key: 'conversationReturnButtonState',\n attributes: { properties },\n target: this.buttonQuery,\n provider: 'localStorage',\n });\n }\n }\n\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\n const dispose = provider.handler(\n controller.conversation.createProvider(provider.name),\n controller.component\n );\n if (dispose) {\n if (!this.disposeProviders[provider.name]) {\n this.disposeProviders[provider.name] = [];\n }\n this.disposeProviders[provider.name].push(dispose);\n }\n }\n\n getComponentRoute() {\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\n (stored) => stored?.route\n );\n }\n\n dispose() {\n Object.keys(this.disposeProviders).forEach((key) => {\n this.disposeProviders[key].forEach((dispose) => {\n dispose();\n });\n });\n this.subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n this.controllers = [];\n this.providers = [];\n }\n\n public static async handleContactMethodClick(\n event: any,\n container: Container,\n contactMethod: any,\n callback?: Function\n ) {\n if (shouldPreventDefault(container)) {\n event.preventDefault();\n let triggerEl = document.getElementById('humany-dynamic-anchor');\n if (!triggerEl) {\n triggerEl = document.createElement('a');\n triggerEl.setAttribute('href', '#');\n triggerEl.id = 'humany-dynamic-anchor';\n document.body.appendChild(triggerEl);\n }\n openChatWidget(container, contactMethod, triggerEl);\n }\n openChatWidget(container, contactMethod);\n }\n\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\n if (contactMethod?.body.form.meta?.conversation?.id) {\n // if we already are in a conversational context, we always want to swap\n // the current provider instead of a route navigation\n return swapProvider(\n container,\n contactMethod.body.form.meta.conversation.id,\n contactMethod.clientName\n );\n }\n\n return navigateToConversation(container, contactMethod);\n }\n}\n","import { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\nimport { ConversationPlatform } from '../../conversation-platform';\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\n\nexport type BundledConversationMessage = {\n timestamp: number;\n content: [BundledMessageContent];\n sender: ConversationMessageSender;\n type: ConversationMessageType;\n};\n\ntype BundledMessageContent = {\n key: string;\n} & ConversationMessageContent;\n\nexport type ConversationContent = {\n loading: boolean;\n typingActors: ConversationMessageSender[];\n messages: ConversationMessage[];\n};\n\n/**\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\n * Put this as a property on either the component or on the provider?\n * Could possibly be implemented directly in the createEntry method\n * of the conversation controller to avoid iterating over the entire array on\n * each update.\n */\nconst groupedMessages = (\n messages: ConversationMessage[],\n timeout?: number\n): BundledConversationMessage[] => {\n return messages.reduce((acc: any[], current: any, index: number) => {\n const newItem = {\n ...current,\n content: [{ ...current.content, key: current.key }],\n };\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\n const previous = acc[acc.length - 1];\n if (\n (!timeout && timeout !== 0) ||\n Math.abs(previous.timestamp - current.timestamp) < timeout\n ) {\n if (\n previous.sender?.name === current.sender?.name &&\n previous.type === current.type\n ) {\n previous.timestamp = current.timestamp;\n previous.content.push({ ...current.content, key: current.key });\n return acc;\n }\n }\n }\n acc.push(newItem);\n return acc;\n }, []);\n};\n\nexport type ConversationComponentProperties = {\n providers: string[];\n messages: BundledConversationMessage[]; // internal\n overlay?: { conversation: boolean; secondary: boolean }; // internal\n overlayConversationHeader?: string;\n overlayConversationCloseLabel?: string;\n loading: boolean;\n inputPlaceholder: string;\n inputDisabled: boolean;\n inputHidden: boolean;\n inputMultiline: boolean;\n rehydrate?: boolean;\n userLabel: string;\n avatarSize: string;\n typingActors: any[]; // internal\n conversationControllerId?: string; // internal\n sendButtonLabel: string;\n secondaryAction?: { icon?: string; action: string; label: string };\n};\n\nexport const ConversationComponent = (container: Container) => {\n return Promise.all([\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\n return createReactComponent(\n container,\n 'conversation',\n import('./conversation'),\n async (component) => {\n const { rehydrate = false } =\n component.properties<ConversationComponentProperties>();\n const routeData = router.getRouteData();\n const name = routeData.params.id || component.node.name || 'component';\n const conversation = await platform.createController(name, { rehydrate });\n const isNewController = platform.registerController(conversation, component);\n\n const messageGroupingTimeout = 3 * 60 * 1000;\n\n const setProperties = (properties: ConversationComponentProperties) => {\n const { providers = [] } = properties;\n if (providers) {\n const providerKeys = Array.isArray(providers) ? providers : [providers];\n conversation.setProviders(providerKeys);\n return providerKeys;\n }\n };\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\n\n conversation.setComponentMountedState(true);\n\n const writeMessages = (messageStream: any) => {\n const { loading, typingActors, messages } = messageStream;\n component.writeProperties({\n loading,\n typingActors,\n messages: groupedMessages(messages, messageGroupingTimeout),\n });\n };\n\n writeMessages(conversation.getMessageStream());\n\n if (isNewController) {\n component.writeProperties({ conversationControllerId: conversation.id });\n // todo: dont create actions here, there will be duplicates due to reuseController = true\n component.actions.create('user-submit', (data, options) => {\n if (options) {\n const { preventDefault, validationPromise } = options;\n if (preventDefault) {\n if (validationPromise) {\n validationPromise().then((text: string) => {\n if (text) {\n conversation.user.print(text);\n }\n });\n }\n return;\n }\n }\n conversation.user.print(data.text);\n });\n\n component.actions.create('user-typing', (data, options) => {});\n\n component.actions.create('form', (data, options) => {});\n\n component.actions.create('action', (data, options) => {});\n\n component.actions.create('overlay-mounted', (data, options) => {});\n\n component.actions.create('show-overlay', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay', (data, options) => {\n component.writeProperties({\n overlay: null,\n });\n });\n\n component.actions.create('show-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: true, secondary: false },\n });\n });\n\n component.actions.create('hide-overlay-conversation', (data, options) => {\n component.writeProperties({\n overlay: { conversation: false, secondary: false },\n });\n });\n }\n\n const unsubscribe = conversation.events.subscribe(\n 'conversation:updated',\n (e: any, conversationData: ConversationContent) => {\n writeMessages(conversationData);\n }\n );\n\n return () => {\n conversation.setComponentMountedState(false);\n unsubscribe();\n if (!conversation.active) {\n // unregisterController();\n // todo: add possibility to dispose this through extendComponent()\n // component.dispose();\n writeMessages({ messages: [], typingActors: [], loading: false });\n }\n };\n },\n { reuseController: true }\n );\n });\n};\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\nimport { Container } from '@webprovisions/platform';\nimport { ConversationPlatform } from '../..';\n\nexport enum ButtonMode {\n flat = 'flat',\n flashing = 'flashing',\n flashingGradient = 'flashingGradient',\n}\n\nexport type ReturnButtonProps = {\n label: string;\n active: boolean;\n mode: ButtonMode;\n alert?: {\n symbol?: Symbol;\n show?: boolean;\n label?: string;\n };\n};\n\nexport const ConversationReturnButtonComponent = (container: Container) => {\n return Promise.all([\n ComponentPlatform.getInstance(container),\n ConversationPlatform.getInstance(container),\n container.getAsync('router'),\n ]).then(\n ([components, platform, router]: [\n ComponentPlatform,\n ConversationPlatform,\n RoutingService\n ]) => {\n return createReactComponent(\n container,\n 'conversation-return-button',\n import('./return-button'),\n (component) => {\n component.actions.create('toggle', (options = {}) => {\n platform.getComponentRoute()?.then((route) => {\n route && router.navigate(route.name, route.params);\n });\n });\n }\n );\n }\n );\n};\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\nimport { Symbol } from '@telia-ace/widget-ui';\n\nexport type ConversationMessageSettings = {\n key?: string;\n timestamp?: number;\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n form?: (builder: FormBuilder) => void;\n type?: string;\n items?: ConversationMessageList[];\n [key: string]: any;\n};\n\nexport type NormalizedMessageSettings = {\n content: ConversationMessageContent;\n key: string;\n timestamp: number | null;\n};\n\nexport type ConversationMessageList = {\n header?: string;\n itemKey: string;\n type?: ConversationMessageListType;\n items: ConversationMessageListItem[];\n};\n\nexport type ConversationMessageListItem = {\n icon?: string;\n type?: ConversationMessageListItemType;\n actions?: { [actionKey: string]: any };\n form?: Form;\n body?: string;\n key: string;\n [key: string]: any;\n};\n\nexport type ConversationMessageContent = {\n title?: string;\n body?: string;\n actions?: { [actionKey: string]: any };\n items?: ConverstationMessageItem<any>[];\n form?: Form;\n [key: string]: any;\n};\n\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\n\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\n timestamp?: number;\n};\n\nexport type ConversationMessageSender = {\n name?: string;\n avatar?: string | Symbol;\n id?: string;\n};\n\nexport enum ConversationMessageListType {\n Ordinary = 'ordinary',\n Seperator = 'seperator',\n}\n\nexport enum ConversationMessageListItemType {\n LinkList = 'link-list',\n Separator = 'separator',\n ButtonList = 'button-list',\n ItemList = 'item-list',\n Text = 'text',\n HTML = 'html',\n VideoRequest = 'video-request',\n}\n\nexport type LinkListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype LinkListItem = [ConversationMessageListItemType.LinkList, LinkListProperties];\n\ntype TextItem = [ConversationMessageListItemType.Text, string];\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\n\nexport type ButtonListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ButtonListItem = [ConversationMessageListItemType.ButtonList, ButtonListProperties];\n\nexport type ItemListProperties = {\n header?: string;\n actions: { [key: string]: string } | { label: string; actionKey: string; data: any }[];\n};\n\ntype ItemListItem = [ConversationMessageListItemType.ItemList, ItemListProperties];\n\nexport type VideoRequestProperties = {\n header?: string;\n acceptLabel: string;\n declineLabel: string;\n};\n\ntype VideoRequestItem = [ConversationMessageListItemType.VideoRequest, VideoRequestProperties];\n\nexport type HtmlProperties = {\n body: string;\n};\n\ntype HtmlItem = [ConversationMessageListItemType.HTML, HtmlProperties];\n\ntype ItemPayload =\n | LinkListItem\n | TextItem\n | SeparatorItem\n | ButtonListItem\n | HtmlItem\n | VideoRequestItem\n | ItemListItem;\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\nimport { Container } from '@webprovisions/platform';\nimport { lazy } from 'react';\nimport { ConversationPlatform } from '..';\n\nexport const registerCustomMessageComponent = (\n container: Container,\n type: string,\n component: ReactComponent\n) => {\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\n const platform = await ConversationPlatform.getInstance(container);\n platform.addSubscription(\n o.registerComponent(\n type,\n lazy(() => component)\n )\n );\n });\n};\n"],"names":["ConversationHistory","controller","events","unsubscribe","e","data","acc","message","normalized","getNormalizedMessageSettings","key","content","type","sender","timestamp","parsed","handle","body","options","messagesAsList","messageData","_type","items","item","res","ConversationMessageType","contactMethodId","method","result","linebreak","header","title","label","description","text","html","actions","value","option","target","Agent","provider","settings","uuid","name","avatar","_a","ConversationProvider","container","storedAgent","agent","__spreadValues","unsub","fn","createSessionStorageKey","id","Locker","unlockNext","willLock","resolve","willUnlock","Store","conversation","enabled","__async","storedAgents","agents","a","providerIndex","storedMessages","_","__spreadProps","messages","agentId","action","unlock","createStorageWriter","StorageCategory","write","prev","m","newData","readStorage","Store$1","User","swapProvider","conversationId","providerName","components","currentInstance","c","toQueue","conversationQuery","ConversationEntry","writer","builder","FormBuilder","builtForm","removeTypingState","typingActors","senderString","indexToRemove","ConversationController","widget","providers","removed","added","providerToRemove","index","p","mounted","nextProvider","entry","updated","updatedTimestamp","dismissed","handler","getParentWidget","widgetName","implementation","mainWidgetName","getSeparateWidget","originWidget","mainWidget","trigger","chatWidgetName","chatWidget","shouldPreventDefault","openChatWidget","contactMethod","triggerDOMTarget","closeAllModals","contactMethodsQuery","conversationsQuery","StorageMedium","StorageScope","platform","ConversationEndedBehavior","navigateToConversation","routeName","router","STORAGE_KEY","ConversationPlatform","storedSession","event","initialRoute","_b","_c","sub","lock","ComponentPlatform","params","behavior","stored","storageKey","component","invokeHandlers","removedProvider","dispose","isActive","session","properties","callback","triggerEl","groupedMessages","timeout","current","newItem","previous","ConversationComponent","createReactComponent","rehydrate","isNewController","messageGroupingTimeout","setProperties","providerKeys","writeMessages","messageStream","loading","preventDefault","validationPromise","conversationData","ConversationReturnButtonComponent","route","ConversationMessageListItemType","registerCustomMessageComponent","o","lazy"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"return-button-17ecf4af.js","sources":["../src/components/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\nimport { css, keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Theme } from '@telia-ace/widget-core';\nimport {\n borderTabStyle,\n Button,\n SymbolBadge,\n useDispatch,\n useProperties,\n} from '@telia-ace/widget-ui';\nimport React from 'react';\nimport { ReturnButtonProps } from './plugin';\n\ntype Props = {\n className: string;\n};\n\nconst ReturnButton: React.FC<Props> = ({ className, ...other }) => {\n const { label, active, mode = 'flat', alert = {} } = useProperties<ReturnButtonProps>();\n const { symbol, label: alertLabel, show: showAlert } = alert;\n // const [showAlert, setShowAlert] = useState(show);\n const dispatch = useDispatch();\n\n if (!active) {\n return null;\n }\n\n return (\n <StyledHighlightedButton\n className={className}\n mode={mode}\n aria-label={label}\n onClick={() => {\n dispatch('toggle');\n }}\n >\n <StyledLabel>{label}</StyledLabel>\n {symbol && (\n <StyledIconHolder showAlert={showAlert}>\n <SymbolBadge symbol={symbol} title={alertLabel} size={20}></SymbolBadge>\n </StyledIconHolder>\n )}\n </StyledHighlightedButton>\n );\n};\n\nconst FlashingColorAnimation = (props: any) => keyframes`\n 0% {\n background-color: ${props.theme.colors?.primary};\n }\n 50% {\n background-color: ${props.theme.colors?.accent};\n }\n 100 {\n background-color: ${props.theme.colors?.primary};\n }\n`;\n\nconst ScrollingGradientAnimation = keyframes`\n 0% {\n background-position:0% 51%\n }\n 50% {\n background-position:100% 0%\n }\n 100% {\n background-position:0% 51%\n }\n`;\n\nconst PulsatingIcon = keyframes`\n 0% {\n transform: rotate(0deg) scale(1.00);\n }\n 50% {\n transform: rotate(0deg) scale(1.00);\n }\n 55% {\n transform: rotate(-3deg) scale(0.80);\n }\n 60% {\n transform: rotate(-3deg) scale(0.80);\n }\n 65% {\n transform: rotate(3deg) scale(1.20);\n }\n 70% {\n transform: rotate(-3deg) scale(1.20);\n }\n 75% {\n transform: rotate(3deg) scale(1.20);\n }\n 80% {\n transform: rotate(-3deg) scale(1.20);\n }\n 85% {\n transform: rotate(3deg) scale(1.20);\n }\n 90% {\n transform: rotate(-3deg) scale(1.20);\n }\n 95% {\n transform: rotate(3deg) scale(1.20);\n }\n 100% {\n transform: rotate(0deg) scale(1);\n }\n`;\n\nconst StyledIconHolder = styled.span<any>`\n flex-grow: 0;\n transform: translateX(${(p) => (p.showAlert ? '0px' : '50px')});\n opacity: ${(p) => (p.showAlert ? 1 : 0)};\n transition: transform 0.5s ease, opacity 0.3s ease;\n`;\n\nconst StyledLabel = styled.span<any>`\n flex: 1;\n font-weight: 300;\n`;\n\nconst flashingStyle = (p: { theme: Theme }) => css`\n animation: ${FlashingColorAnimation(p)} 1s ease infinite;\n`;\n\nconst flashingGradientStyle = (p: { theme: Theme }) => css`\n background: linear-gradient(155deg, ${p.theme.colors?.primary}, ${p.theme.colors?.accent});\n background-position: 0px 0px;\n background-size: 200% 200%;\n animation: ${ScrollingGradientAnimation} 1.5s ease infinite;\n`;\n\nconst StyledHighlightedButton = styled(Button)<any>`\n overflow: hidden;\n padding: ${(p) => p.theme.sizes?.large};\n border-radius: ${(p) => p.theme.borderRadius};\n color: ${(p) => p.theme.colors?.text};\n ${(p) =>\n p.mode === 'flashing'\n ? flashingStyle\n : p.mode === 'flashingGradient'\n ? flashingGradientStyle\n : ''}\n background-color: ${(p) => p.theme.colors?.primary};\n display: flex;\n align-items: center;\n justify-content: center;\n i,\n svg {\n animation: ${PulsatingIcon} 3s ease infinite;\n }\n\n &:focus-visible {\n ${(p) => borderTabStyle(p)}\n background: ${(p) => p.theme.colors?.text};\n color: ${(p) => p.theme.colors?.primary};\n }\n`;\n\nexport default ReturnButton;\n"],"names":["ReturnButton","_a","_b","className","other","__objRest","label","active","mode","alert","useProperties","symbol","alertLabel","showAlert","dispatch","useDispatch","React","StyledHighlightedButton","StyledLabel","StyledIconHolder","SymbolBadge","FlashingColorAnimation","props","keyframes","_c","ScrollingGradientAnimation","PulsatingIcon","styled","p","flashingStyle","css","flashingGradientStyle","Button","borderTabStyle"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAMA,IAAgC,CAACC,MAA4B;AAA5B,MAAAC,IAAAD,GAAE,aAAAE,MAAFD,GAAgBE,IAAAC,EAAhBH,GAAgB,CAAd;AAC/B,QAAA,EAAE,OAAAI,GAAO,QAAAC,GAAQ,MAAAC,IAAO,QAAQ,OAAAC,IAAQ,CAAA,MAAOC,KAC/C,EAAE,QAAAC,GAAQ,OAAOC,GAAY,MAAMC,EAAc,IAAAJ,GAEjDK,IAAWC;AAEjB,SAAKR,IAKD,gBAAAS,EAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,WAAAd;AAAA,MACA,MAAAK;AAAA,MACA,cAAYF;AAAA,MACZ,SAAS,MAAM;AACX,QAAAQ,EAAS,QAAQ;AAAA,MACrB;AAAA,IAAA;AAAA,IAEA,gBAAAE,EAAA,cAACE,SAAaZ,CAAM;AAAA,IACnBK,KACI,gBAAAK,EAAA,cAAAG,GAAA,EAAiB,WAAAN,EACd,GAAA,gBAAAG,EAAA,cAACI,GAAY,EAAA,QAAAT,GAAgB,OAAOC,GAAY,MAAM,GAAA,CAAI,CAC9D;AAAA,EAAA,IAhBD;AAoBf,GAEMS,IAAyB,CAACC,MAAe;;AAAA,SAAAC;AAAA;AAAA,yBAEvBtB,IAAAqB,EAAM,MAAM,WAAZ,gBAAArB,EAAoB;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"return-button-17ecf4af.js","sources":["../src/components/return-button/return-button.tsx"],"sourcesContent":["// import { Component } from '@telia-ace/widget-types-grid';\nimport { css, keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Theme } from '@telia-ace/widget-core';\nimport {\n borderTabStyle,\n Button,\n SymbolBadge,\n useDispatch,\n useProperties,\n} from '@telia-ace/widget-ui';\nimport React from 'react';\nimport { ReturnButtonProps } from './plugin';\n\ntype Props = {\n className: string;\n};\n\nconst ReturnButton: React.FC<Props> = ({ className, ...other }) => {\n const { label, active, mode = 'flat', alert = {} } = useProperties<ReturnButtonProps>();\n const { symbol, label: alertLabel, show: showAlert } = alert;\n // const [showAlert, setShowAlert] = useState(show);\n const dispatch = useDispatch();\n\n if (!active) {\n return null;\n }\n\n return (\n <StyledHighlightedButton\n className={className}\n mode={mode}\n aria-label={label}\n onClick={() => {\n dispatch('toggle');\n }}\n >\n <StyledLabel>{label}</StyledLabel>\n {symbol && (\n <StyledIconHolder showAlert={showAlert}>\n <SymbolBadge symbol={symbol} title={alertLabel} size={20}></SymbolBadge>\n </StyledIconHolder>\n )}\n </StyledHighlightedButton>\n );\n};\n\nconst FlashingColorAnimation = (props: any) => keyframes`\n 0% {\n background-color: ${props.theme.colors?.primary};\n }\n 50% {\n background-color: ${props.theme.colors?.accent};\n }\n 100 {\n background-color: ${props.theme.colors?.primary};\n }\n`;\n\nconst ScrollingGradientAnimation = keyframes`\n 0% {\n background-position:0% 51%\n }\n 50% {\n background-position:100% 0%\n }\n 100% {\n background-position:0% 51%\n }\n`;\n\nconst PulsatingIcon = keyframes`\n 0% {\n transform: rotate(0deg) scale(1.00);\n }\n 50% {\n transform: rotate(0deg) scale(1.00);\n }\n 55% {\n transform: rotate(-3deg) scale(0.80);\n }\n 60% {\n transform: rotate(-3deg) scale(0.80);\n }\n 65% {\n transform: rotate(3deg) scale(1.20);\n }\n 70% {\n transform: rotate(-3deg) scale(1.20);\n }\n 75% {\n transform: rotate(3deg) scale(1.20);\n }\n 80% {\n transform: rotate(-3deg) scale(1.20);\n }\n 85% {\n transform: rotate(3deg) scale(1.20);\n }\n 90% {\n transform: rotate(-3deg) scale(1.20);\n }\n 95% {\n transform: rotate(3deg) scale(1.20);\n }\n 100% {\n transform: rotate(0deg) scale(1);\n }\n`;\n\nconst StyledIconHolder = styled.span<any>`\n flex-grow: 0;\n transform: translateX(${(p) => (p.showAlert ? '0px' : '50px')});\n opacity: ${(p) => (p.showAlert ? 1 : 0)};\n transition: transform 0.5s ease, opacity 0.3s ease;\n`;\n\nconst StyledLabel = styled.span<any>`\n flex: 1;\n font-weight: 300;\n`;\n\nconst flashingStyle = (p: { theme: Theme }) => css`\n animation: ${FlashingColorAnimation(p)} 1s ease infinite;\n`;\n\nconst flashingGradientStyle = (p: { theme: Theme }) => css`\n background: linear-gradient(155deg, ${p.theme.colors?.primary}, ${p.theme.colors?.accent});\n background-position: 0px 0px;\n background-size: 200% 200%;\n animation: ${ScrollingGradientAnimation} 1.5s ease infinite;\n`;\n\nconst StyledHighlightedButton = styled(Button)<any>`\n overflow: hidden;\n padding: ${(p) => p.theme.sizes?.large};\n border-radius: ${(p) => p.theme.borderRadius};\n color: ${(p) => p.theme.colors?.text};\n ${(p) =>\n p.mode === 'flashing'\n ? flashingStyle\n : p.mode === 'flashingGradient'\n ? flashingGradientStyle\n : ''}\n background-color: ${(p) => p.theme.colors?.primary};\n display: flex;\n align-items: center;\n justify-content: center;\n i,\n svg {\n animation: ${PulsatingIcon} 3s ease infinite;\n }\n\n &:focus-visible {\n ${(p) => borderTabStyle(p)}\n background: ${(p) => p.theme.colors?.text};\n color: ${(p) => p.theme.colors?.primary};\n }\n`;\n\nexport default ReturnButton;\n"],"names":["ReturnButton","_a","_b","className","other","__objRest","label","active","mode","alert","useProperties","symbol","alertLabel","showAlert","dispatch","useDispatch","React","StyledHighlightedButton","StyledLabel","StyledIconHolder","SymbolBadge","FlashingColorAnimation","props","keyframes","_c","ScrollingGradientAnimation","PulsatingIcon","styled","p","flashingStyle","css","flashingGradientStyle","Button","borderTabStyle"],"mappings":"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"}
|
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.42",
|
|
4
4
|
"description": "ACE Widget Conversation Platform",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -21,20 +21,20 @@
|
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@telia-ace/widget-core": "1.0.
|
|
25
|
-
"@telia-ace/widget-forms": "1.0.
|
|
26
|
-
"@telia-ace/widget-plugins": "1.0.
|
|
27
|
-
"@telia-ace/widget-routing": "1.0.
|
|
28
|
-
"@telia-ace/widget-services": "1.0.
|
|
29
|
-
"@telia-ace/widget-ui": "1.0.
|
|
30
|
-
"@telia-ace/widget-utilities": "1.0.
|
|
31
|
-
"@webprovisions/platform": "^1.1.
|
|
24
|
+
"@telia-ace/widget-core": "1.0.29",
|
|
25
|
+
"@telia-ace/widget-forms": "1.0.36",
|
|
26
|
+
"@telia-ace/widget-plugins": "1.0.30",
|
|
27
|
+
"@telia-ace/widget-routing": "1.0.30",
|
|
28
|
+
"@telia-ace/widget-services": "1.0.29",
|
|
29
|
+
"@telia-ace/widget-ui": "1.0.36",
|
|
30
|
+
"@telia-ace/widget-utilities": "1.0.18",
|
|
31
|
+
"@webprovisions/platform": "^1.1.4"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@emotion/react": "^11.
|
|
35
|
-
"@emotion/styled": "^11.
|
|
36
|
-
"@telia-ace/widget-developer-tools": "1.0.
|
|
37
|
-
"@types/react": "^18.
|
|
34
|
+
"@emotion/react": "^11.11.1",
|
|
35
|
+
"@emotion/styled": "^11.11.0",
|
|
36
|
+
"@telia-ace/widget-developer-tools": "1.0.24",
|
|
37
|
+
"@types/react": "^18.2.23",
|
|
38
38
|
"react": "^18.2.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|