@telia-ace/widget-conversation 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +5 -5
- package/README.md +256 -256
- package/dist/agent.d.ts +17 -17
- package/dist/conversation-controller.d.ts +88 -88
- package/dist/conversation-form-adapter.d.ts +7 -7
- package/dist/conversation-platform.d.ts +50 -49
- package/dist/conversation-provider.d.ts +22 -22
- package/dist/conversation.js +6 -805
- package/dist/conversation.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.js +9 -866
- package/dist/index.js.map +1 -1
- package/dist/index2.js +1678 -0
- package/dist/index2.js.map +1 -0
- package/dist/resolve-entity-value.d.ts +10 -10
- package/dist/return-button.js.map +1 -1
- package/dist/types.d.ts +110 -110
- package/dist/ui/conversation/conversation-component.d.ts +37 -37
- package/dist/ui/conversation/conversation-content.d.ts +12 -11
- package/dist/ui/conversation/conversation-input.d.ts +6 -6
- package/dist/ui/conversation/conversation-loader.d.ts +8 -8
- package/dist/ui/conversation/conversation-message.d.ts +7 -7
- package/dist/ui/conversation/conversation-styles.d.ts +11 -11
- package/dist/ui/conversation/conversation.d.ts +6 -6
- package/dist/ui/conversation/index.d.ts +3 -2
- package/dist/ui/conversation/message-types/agent.d.ts +11 -11
- package/dist/ui/conversation/message-types/custom-message-list-item.d.ts +9 -9
- package/dist/ui/conversation/message-types/custom.d.ts +9 -9
- package/dist/ui/conversation/message-types/index.d.ts +5 -5
- package/dist/ui/conversation/message-types/system.d.ts +12 -12
- package/dist/ui/conversation/message-types/timestamp.d.ts +8 -8
- package/dist/ui/conversation/message-types/user.d.ts +8 -8
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/return-button/index.d.ts +2 -2
- package/dist/ui/return-button/return-button-component.d.ts +19 -19
- package/dist/ui/return-button/return-button.d.ts +6 -6
- package/dist/user.d.ts +7 -7
- package/dist/utils/custom-message.d.ts +3 -3
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/open-chat-widget.d.ts +4 -4
- package/package.json +8 -8
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sources":["../src/ui/conversation/conversation-input.tsx","../src/ui/conversation/conversation-styles.tsx","../src/ui/conversation/conversation-loader.tsx","../src/ui/conversation/message-types/timestamp.tsx","../src/ui/conversation/message-types/agent.tsx","../src/ui/conversation/message-types/custom.tsx","../src/ui/conversation/message-types/system.tsx","../src/ui/conversation/message-types/user.tsx","../src/ui/conversation/message-types/custom-message-list-item.tsx","../src/ui/conversation/conversation-content.tsx","../src/ui/conversation/conversation-message.tsx","../src/ui/conversation/conversation.tsx"],"sourcesContent":["import {\r\n borderTabStyle,\r\n Button,\r\n Input,\r\n SymbolBadge,\r\n useDispatch,\r\n useProperties,\r\n useScroll,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useEffect, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationComponentProperties } from './conversation-component';\r\n\r\ntype Props = {\r\n className?: string;\r\n};\r\n\r\nconst ConversationInput: React.FC<Props> = ({ className }) => {\r\n const [inputText, setInputText] = useState('');\r\n const [inputFocus, setInputFocus] = useState(false);\r\n const [calculatedLineHeight, setCalculatedLineHeight] = useState(0);\r\n const [textareaMaxHeight, setTextareaMaxHeight] = useState(0);\r\n const dispatch = useDispatch();\r\n const {\r\n inputPlaceholder = 'Type your message',\r\n inputHidden = false,\r\n inputDisabled = false,\r\n sendButtonLabel = 'Send message',\r\n inputMultiline: multiline = true,\r\n secondaryAction,\r\n } = useProperties<ConversationComponentProperties>();\r\n const [scrollableCss, inputRef] = useScroll(true);\r\n\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n const { lineHeight, maxHeight } = getComputedStyle(inputRef.current);\r\n if (lineHeight && lineHeight.indexOf('px') > -1) {\r\n const lineHeightNumber = lineHeight.split('px');\r\n const calcLH = parseInt(lineHeightNumber[0], 10);\r\n setCalculatedLineHeight(calcLH);\r\n const maxHeightNumber = maxHeight.split('px');\r\n setTextareaMaxHeight(parseInt(maxHeightNumber[0], 10));\r\n }\r\n }\r\n }, [inputRef.current]);\r\n\r\n const submit = (e: any) => {\r\n if (!e.shiftKey || !multiline) {\r\n e.preventDefault();\r\n if (inputText && inputText.length > 0) {\r\n dispatch('user-submit', { text: inputText });\r\n setInputText('');\r\n onChange('');\r\n }\r\n } else if (inputText.length < 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const onSecondaryActionButtonClick = (e: any) => {\r\n if (!secondaryAction) {\r\n return;\r\n }\r\n e.preventDefault();\r\n dispatch('action', secondaryAction.action);\r\n };\r\n\r\n const calculateHeight = (value: string) => {\r\n if (multiline && inputRef.current) {\r\n const scrollHeight = inputRef.current.scrollHeight;\r\n if (scrollHeight > calculatedLineHeight) {\r\n inputRef.current.style.height = 'auto';\r\n let areaHeight = scrollHeight;\r\n if (value.length < 1) {\r\n areaHeight = calculatedLineHeight;\r\n }\r\n inputRef.current.style.height = `${areaHeight}px`;\r\n\r\n if (areaHeight >= textareaMaxHeight) {\r\n inputRef.current.style.overflowY = 'scroll';\r\n } else {\r\n inputRef.current.style.overflowY = 'hidden';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const onChange = (value: string) => {\r\n calculateHeight(value);\r\n setInputText(value);\r\n if (value && value.length > 0) {\r\n dispatch('user-typing', { textLength: value.length });\r\n }\r\n };\r\n\r\n if (inputHidden) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Wrapper\r\n grow={multiline}\r\n className={appendClassNames('humany-conversation-input', className)}\r\n data-has-focus={inputFocus}\r\n scrollableCss={scrollableCss}\r\n >\r\n {secondaryAction && (\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={onSecondaryActionButtonClick}\r\n title={secondaryAction.label}\r\n aria-label={secondaryAction.label}\r\n >\r\n <SymbolBadge\r\n size={22}\r\n symbol={{ type: 'Svg', content: secondaryAction.icon || 'browse' }}\r\n />\r\n </StyledButton>\r\n )}\r\n {multiline ? (\r\n <StyledTextArea\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n type={'textarea'}\r\n rows={1}\r\n ref={inputRef}\r\n />\r\n ) : (\r\n <StyledInput\r\n value={inputText}\r\n onChange={onChange}\r\n onEnter={submit}\r\n disabled={inputDisabled}\r\n aria-label={inputPlaceholder}\r\n placeholder={inputPlaceholder}\r\n onFocusChange={setInputFocus}\r\n />\r\n )}\r\n <StyledButton\r\n disabled={inputDisabled}\r\n onClick={submit}\r\n title={sendButtonLabel}\r\n aria-label={sendButtonLabel}\r\n >\r\n <SendSymbol\r\n size={22}\r\n symbol={{ type: 'Svg', content: 'send' }}\r\n hasContent={inputText && inputText.length}\r\n />\r\n </StyledButton>\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst StyledTextArea = styled(Input)<any>`\r\n resize: none;\r\n flex: 1;\r\n flex-shrink: 1;\r\n min-height: 1.2em;\r\n max-height: 148px;\r\n line-height: 1.2em;\r\n height: 1.2em;\r\n padding: 0;\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.medium};\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border: none;\r\n transition: height 200ms linear;\r\n outline: none;\r\n`;\r\n\r\nconst StyledInput = styled(Input)<any>`\r\n flex: 1;\r\n border: none;\r\n background-color: transparent;\r\n font-weight: 300;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n line-height: 1.2em;\r\n outline: none;\r\n padding-left: ${(p) => p.theme.sizes?.large};\r\n color: ${(p) => p.theme.colors?.text};\r\n &::placeholder {\r\n color: ${(p) => p.theme.colors?.textLight};\r\n font-style: italic;\r\n }\r\n`;\r\n\r\nconst StyledButton = styled(Button)<any>`\r\n flex: 0 0 50px;\r\n align-self: stretch;\r\n background-color: transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n color: #a6a6a6;\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst Wrapper = styled.div<{ 'data-has-focus': boolean } & any>`\r\n ${(p) =>\r\n p.grow\r\n ? css`\r\n min-height: 50px;\r\n max-height: 150px;\r\n `\r\n : css`\r\n height: 50px;\r\n `}\r\n flex: 0 0 auto;\r\n display: flex;\r\n align-items: center;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border-top: ${(p) => p.theme.inputBorder};\r\n ${(p) =>\r\n p['data-has-focus'] &&\r\n css`\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n `}\r\n ${StyledTextArea} {\r\n ${(p) => !!p.scrollableCss && p.scrollableCss}\r\n }\r\n`;\r\n\r\nconst SendSymbol = styled(({ hasContent, ...other }) => <SymbolBadge {...other} />)`\r\n line,\r\n path {\r\n stroke: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n fill: ${(p) => (p.hasContent ? p.theme.colors?.primary : '#a6a6a6')};\r\n }\r\n`;\r\n\r\nexport default ConversationInput;\r\n","import { Typography } from '@telia-ace/widget-ui';\r\nimport styled, { css, keyframes } from 'styled-components';\r\n\r\nexport const Avatar = styled.div<any>`\r\n width: ${(p) => p.avatarSize || '32px'};\r\n height: ${(p) => p.avatarSize || '32px'};\r\n border-radius: 50%;\r\n background-color: ${(p) => p.theme.colors?.accent};\r\n border: ${(p) => p.theme.border};\r\n grid-area: avatar;\r\n align-self: flex-end;\r\n justify-self: center;\r\n overflow: hidden;\r\n margin-right: ${(p) => p.theme.sizes?.normal};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n > img {\r\n height: 100%;\r\n width: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n > svg {\r\n width: 90%;\r\n height: 90%;\r\n padding: 10%;\r\n color: ${(p) => p.theme.colors?.text};\r\n\r\n line,\r\n path,\r\n circle,\r\n fill {\r\n stroke: ${(p) => p.theme.colors?.text};\r\n }\r\n }\r\n`;\r\n\r\nexport const LoaderAnimation = keyframes`\r\n 0% {\r\n opacity: 0;\r\n }\r\n 75% {\r\n opacity: 1;\r\n }\r\n 100% {\r\n opacity: 0;\r\n }\r\n`;\r\n\r\nexport const Loader = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n > div {\r\n height: 10px;\r\n width: 10px;\r\n border-radius: 50%;\r\n margin: 5px;\r\n background-color: ${(p) => p.theme.colors?.text};\r\n animation: ${LoaderAnimation} 1s infinite;\r\n }\r\n > div:nth-child(2) {\r\n animation-delay: 100ms;\r\n }\r\n > div:nth-child(3) {\r\n animation-delay: 200ms;\r\n }\r\n`;\r\n\r\nexport const ContentBundle = styled.div`\r\n grid-area: content;\r\n max-width: 100%;\r\n overflow: hidden;\r\n`;\r\n\r\nexport const MessageTitle = styled(Typography)`\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n font-weight: normal;\r\n margin: 0;\r\n`;\r\n\r\nexport const MessageContainer = styled.div`\r\n display: flex;\r\n`;\r\n\r\nexport const MessageContent = styled.div<any>`\r\n background-color: ${(p) => (p.user ? p.theme.colors?.primary : p.theme.colors?.accent)};\r\n color: ${(p) => (p.user ? p.theme.colors?.accent : p.theme.colors?.text)};\r\n border-radius: 5px; // TODO: prop?\r\n border: 1px solid rgb(231, 231, 231);\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n margin-top: ${(p) => p.theme.sizes?.normal};\r\n display: inline-block;\r\n && > * {\r\n overflow-wrap: break-word;\r\n word-wrap: break-word;\r\n word-break: break-all;\r\n word-break: break-word;\r\n hyphens: auto;\r\n }\r\n max-width: 100%;\r\n ${(p) => p.fullWidth && 'width: 100%;'}\r\n\r\n ${(p) =>\r\n !p.user &&\r\n css`\r\n border: ${p.theme.border};\r\n `}\r\n ${(p) => p.user && 'margin-left: auto'};\r\n\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px; // TODO: Prop?\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n p.user &&\r\n css<any>`\r\n border-bottom-right-radius: 1px;\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n p.user &&\r\n css<any>`\r\n border-top-right-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'first' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'middle' &&\r\n !p.user &&\r\n css<any>`\r\n border-bottom-left-radius: 1px;\r\n border-top-left-radius: 1px;\r\n `}\r\n ${(p) =>\r\n p.stacked === 'last' &&\r\n !p.user &&\r\n css<any>`\r\n border-top-left-radius: 1px;\r\n `};\r\n\r\n ${(p) =>\r\n !p.stacked &&\r\n css<any>`\r\n ${p.user ? 'border-bottom-right-radius: 1px;' : 'border-bottom-left-radius: 1px;'}\r\n `};\r\n\r\n transition: border-radius 500ms linear;\r\n`;\r\n\r\nexport const MessageContentPart = styled.div<{ noPadding?: boolean }>`\r\n padding: ${(p) => p.theme.sizes?.normal} ${(p) => p.theme.sizes?.medium};\r\n\r\n ${(p) =>\r\n p.noPadding &&\r\n css`\r\n padding: 0;\r\n `}\r\n\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './conversation-styles';\r\n\r\ntype Props = {\r\n className?: string;\r\n agentData?: ConversationMessageSender;\r\n};\r\n\r\nconst ConversationLoader: React.FC<Props> = ({ className, agentData }) => {\r\n return (\r\n <ContentBundle>\r\n <MessageContainer>\r\n <MessageContent>\r\n <Loader>\r\n <div />\r\n <div />\r\n <div />\r\n </Loader>\r\n </MessageContent>\r\n </MessageContainer>\r\n </ContentBundle>\r\n );\r\n};\r\n\r\nexport default ConversationLoader;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ntype Props = {\r\n className?: string;\r\n name?: string;\r\n timestamp?: number | null;\r\n};\r\n\r\nconst StyledTimestamp = styled.p`\r\n && {\r\n font-size: ${(p) => p.theme.fonts?.small};\r\n font-weight: 300;\r\n }\r\n padding-top: ${(p) => p.theme.sizes?.small};\r\n margin: 0;\r\n line-height: 1.5em;\r\n grid-area: info;\r\n color: ${(p) => p.theme.colors?.text};\r\n`;\r\n\r\nconst getTimestamp = (raw: number) => {\r\n return new Date(raw).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n};\r\n\r\nconst Timestamp: React.FC<Props> = ({ className, name, timestamp }) => {\r\n if (!name && !timestamp) {\r\n return null;\r\n }\r\n\r\n let output = '';\r\n if (name) {\r\n if (timestamp) {\r\n output = `${name}: ${getTimestamp(timestamp)}`;\r\n } else {\r\n output = name;\r\n }\r\n } else if (timestamp) {\r\n output = getTimestamp(timestamp);\r\n }\r\n\r\n return <StyledTimestamp>{output}</StyledTimestamp>;\r\n};\r\n\r\nexport default Timestamp;\r\n","import { SymbolBadge, useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../../types';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport { Avatar } from '../conversation-styles';\r\nimport Timestamp from './timestamp';\r\n\r\ntype Props = {\r\n className?: string;\r\n children: any;\r\n sender: ConversationMessageSender;\r\n timestamp: number | null;\r\n};\r\n\r\nconst AgentMessage: React.FC<Props> = ({ className, children, sender, timestamp }) => {\r\n const { avatar, name } = sender;\r\n const { avatarSize } = useProperties<ConversationComponentProperties>();\r\n\r\n return (\r\n <StyledAgentMessage\r\n hasAvatar={!!avatar}\r\n className={appendClassNames(className, 'humany-conversation-agent-message')}\r\n >\r\n {avatar && (\r\n <Avatar avatarSize={avatarSize}>\r\n {typeof avatar === 'string' ? (\r\n <img src={avatar} />\r\n ) : (\r\n <SymbolBadge symbol={avatar} />\r\n )}\r\n </Avatar>\r\n )}\r\n {children}\r\n <Timestamp name={name} timestamp={timestamp}></Timestamp>\r\n </StyledAgentMessage>\r\n );\r\n};\r\n\r\nexport const StyledAgentMessage = styled.div<any>`\r\n display: grid;\r\n margin-right: 10%;\r\n width: 90%;\r\n ${(p) =>\r\n p.hasAvatar\r\n ? css`\r\n grid-template-columns: auto 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'avatar content'\r\n '. info';\r\n `\r\n : css`\r\n grid-template-columns: 1fr;\r\n grid-template-rows: 1fr auto;\r\n grid-template-areas:\r\n 'content'\r\n 'info';\r\n `};\r\n`;\r\n\r\nexport default AgentMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React, { Suspense } from 'react';\r\nimport { MessageContent, MessageContentPart } from '../conversation-styles';\r\n\r\nexport type Props = {\r\n type: any;\r\n content: any;\r\n isUser: any;\r\n stacked: any;\r\n};\r\n\r\nconst CustomMessage: React.FC<Props> = (props) => {\r\n const CustomComponent = useComponent(props.type);\r\n\r\n if (!CustomComponent) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <MessageContent\r\n user={props.isUser}\r\n stacked={!!props.stacked && props.stacked}\r\n fullWidth={!!props.content.form || !!props.content.actions}\r\n >\r\n <MessageContentPart\r\n noPadding={!!props.content.noPadding && props.content.noPadding}\r\n >\r\n <CustomComponent {...props.content} />\r\n </MessageContentPart>\r\n </MessageContent>\r\n </Suspense>\r\n );\r\n};\r\n\r\nexport default CustomMessage;\r\n","import { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n discrete?: boolean;\r\n fullWidth?: boolean;\r\n children: any;\r\n};\r\n\r\nconst SystemMessage: React.FC<Props> = ({\r\n className,\r\n children,\r\n timestamp,\r\n discrete,\r\n fullWidth,\r\n}) => {\r\n return (\r\n <StyledSystemMessage\r\n className={appendClassNames(className, 'humany-conversation-system-message')}\r\n fullWidth={fullWidth}\r\n >\r\n {discrete ? (\r\n <Discrete className=\"humany-conversation-discrete-message\">\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </Discrete>\r\n ) : (\r\n <>\r\n {children}\r\n <Timestamp timestamp={timestamp}></Timestamp>\r\n </>\r\n )}\r\n </StyledSystemMessage>\r\n );\r\n};\r\n\r\nexport const StyledSystemMessage = styled.div<any>`\r\n ${(p) => p.fullWidth && 'width: 100%'};\r\n padding: 0 ${(p) => p.theme.sizes?.large};\r\n overflow: auto;\r\n`;\r\n\r\nexport const Discrete = styled.div`\r\n text-align: center;\r\n word-wrap: break-word;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n color: ${(p) => p.theme.colors?.text};\r\n > p {\r\n margin: 0;\r\n }\r\n`;\r\n\r\nexport default SystemMessage;\r\n","import { useProperties } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ConversationComponentProperties } from '../conversation-component';\r\nimport Timestamp from './timestamp';\r\n\r\nexport type Props = {\r\n className?: string;\r\n timestamp: number;\r\n children: any;\r\n};\r\n\r\nconst UserMessage: React.FC<Props> = ({ className, children, timestamp }) => {\r\n const { userLabel = '' } = useProperties<ConversationComponentProperties>();\r\n return (\r\n <StyledUserMessage\r\n className={appendClassNames(className, 'humany-conversation-user-message')}\r\n >\r\n {children}\r\n <Timestamp name={userLabel} timestamp={timestamp}></Timestamp>\r\n </StyledUserMessage>\r\n );\r\n};\r\n\r\nconst StyledUserMessage = styled.div`\r\n margin-left: 10%;\r\n width: 90%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n`;\r\n\r\nexport default UserMessage;\r\n","import { useComponent } from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\n\r\ntype Props = {\r\n type: string;\r\n content?: { [key: string]: any };\r\n};\r\nconst CustomMessageListItem: React.FC<Props> = ({ type, content = {} }) => {\r\n const Component = useComponent(type);\r\n\r\n if (!Component || !type) {\r\n return null;\r\n }\r\n return <Component {...content} />;\r\n};\r\n\r\nexport default CustomMessageListItem;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n Icon,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n SymbolBadge,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport React, { Fragment } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageListItemType,\r\n ConverstationMessageItem,\r\n} from '../../types';\r\nimport { MessageContent, MessageContentPart as Part, MessageTitle } from './conversation-styles';\r\nimport { CustomMessage } from './message-types';\r\nimport CustomMessageListItem from './message-types/custom-message-list-item';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n content: ConversationMessageContent;\r\n isUser: boolean;\r\n stacked?: string;\r\n CustomComponent?: any;\r\n};\r\n\r\nconst ConversationContent: React.FC<Props> = ({ content, isUser, stacked }) => {\r\n const dispatch = useDispatch();\r\n const { title, body, actions, form, type, items } = content;\r\n\r\n if (type)\r\n return <CustomMessage type={type} content={content} isUser={isUser} stacked={stacked} />;\r\n\r\n return (\r\n <MessageContent\r\n noPadding\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {items && (\r\n <Fragment>\r\n <Part key={uuid()} noPadding>\r\n <StyledActionList\r\n items={items.map(([type, content]: ConverstationMessageItem<any>) => {\r\n return { type, content };\r\n })}\r\n renderItem={(item: any) => {\r\n const itemKey = uuid();\r\n switch (item.type) {\r\n case ConversationMessageListItemType.Header: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <HeaderText>{item.content}</HeaderText>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Text: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <span>{item.content}</span>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.HTML: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledHtml\r\n html={item.content.body}\r\n htmlParseInstruction={htmlParseInstructions}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.Separator: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <SeparatorPadding>\r\n <Separator />\r\n </SeparatorPadding>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.LinkList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledLinkList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledLinkButton\r\n help={item.actionKey === 'help'}\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n {item.label}\r\n {item.actionKey === 'help' && (\r\n <SymbolBadge\r\n size={14}\r\n symbol={{\r\n type: 'Svg',\r\n content:\r\n 'caret-down',\r\n }}\r\n />\r\n )}\r\n </StyledLinkButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.ButtonList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledButtonList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledButtonListButton\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n {item.label}\r\n </StyledButtonListButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.NoGoodAlternative: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <NoGoodAlternativeWrapper\r\n onClick={() => {\r\n dispatch('action', 'help');\r\n }}\r\n >\r\n <SymbolBadge\r\n size={14}\r\n symbol={{\r\n type: 'FontAwesome',\r\n content: 'meh-o',\r\n }}\r\n />\r\n <span>{item.content.body}</span>\r\n </NoGoodAlternativeWrapper>\r\n </ConversationListItem>\r\n );\r\n }\r\n case ConversationMessageListItemType.FeedbackList: {\r\n return (\r\n <ConversationListItem key={itemKey}>\r\n <StyledButtonList\r\n items={Object.keys(item.content.actions).map(\r\n (i: any) => {\r\n return {\r\n label: item.content.actions[i],\r\n actionKey: i,\r\n };\r\n }\r\n )}\r\n renderItem={(item: any) => {\r\n return (\r\n <FeedbackItem key={item.actionKey}>\r\n <FeedbackButton\r\n className=\"humany-feedback-button\"\r\n disabled={false}\r\n aria-pressed={true}\r\n data-selected={true}\r\n data-direction={'vertical'}\r\n onClick={() => {\r\n dispatch(\r\n 'action',\r\n item.actionKey\r\n );\r\n }}\r\n >\r\n <Icon\r\n faIcon={\r\n item.actionKey == 'yes'\r\n ? 'smile-o'\r\n : 'frown-o'\r\n }\r\n />\r\n <span>{item.label}</span>\r\n </FeedbackButton>\r\n </FeedbackItem>\r\n );\r\n }}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n default: {\r\n return (\r\n <ConversationListItem key={itemKey} noPadding>\r\n <CustomMessageListItem\r\n type={item.type}\r\n content={item.content}\r\n />\r\n </ConversationListItem>\r\n );\r\n }\r\n }\r\n }}\r\n />\r\n </Part>\r\n </Fragment>\r\n )}\r\n </MessageContent>\r\n );\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledButtonList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.small} ${(p) => p.theme.sizes?.normal};\r\n margin-left: 0;\r\n display: inline-block;\r\n }\r\n`;\r\n\r\nconst StyledButtonListButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n text-align: left;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nconst StyledLinkList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n > li {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst HeaderText = styled.strong`\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n`;\r\n\r\nconst StyledLinkButton = styled.button<{ help: boolean }>`\r\n display: block;\r\n background-color: transparent;\r\n text-align: left;\r\n border: none;\r\n padding: 0;\r\n font-weight: 300;\r\n font-family: inherit;\r\n cursor: pointer;\r\n color: ${(p) => p.theme.colors?.primary};\r\n\r\n ${(p) =>\r\n p.help &&\r\n css`\r\n color: ${p.theme.colors?.text};\r\n text-decoration: underline;\r\n\r\n i,\r\n svg {\r\n margin-left: ${p.theme.sizes?.small};\r\n }\r\n `}\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n font-family: Lato;\r\n font-size: ${(p) => p.theme.fonts?.huge};\r\n font-weight: 300;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nconst SeparatorPadding = styled.div`\r\n padding-top: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n padding-bottom: calc(${(p) => p.theme.sizes?.medium} - ${(p) => p.theme.sizes?.normal});\r\n`;\r\n\r\nconst Separator = styled.div`\r\n background-color: #efefef;\r\n height: 1px;\r\n width: 100%;\r\n`;\r\n\r\nconst NoGoodAlternativeWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n\r\n > i,\r\n svg {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n`;\r\n\r\nconst ConversationListItem = styled.li<{ noPadding?: boolean }>`\r\n padding-left: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n padding-right: ${(p) => (p.noPadding ? 0 : p.theme.sizes?.medium)};\r\n`;\r\n\r\nconst FeedbackItem = styled.li`\r\n @media (min-width: 768px) {\r\n display: list-item !important;\r\n margin-right: 0 !important;\r\n margin-top: ${(p) => p.theme.sizes?.normal} !important;\r\n }\r\n`;\r\n\r\nconst FeedbackButton = styled.button<{\r\n 'data-selected': boolean;\r\n 'data-direction': 'horizontal' | 'vertical';\r\n}>`\r\n @media (min-width: 768px) {\r\n min-width: 100%;\r\n margin-right: 0;\r\n }\r\n display: inline-block;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n border-color: ${(p) => p.theme.colors?.primary} !important;\r\n font-weight: 300;\r\n && {\r\n margin-right: ${(p) => p.theme.sizes?.small};\r\n }\r\n ${(p) =>\r\n p['data-direction'] === 'horizontal' &&\r\n css`\r\n width: 225px;\r\n max-width: calc(50% - ${p.theme.sizes?.large} - ${p.theme.sizes?.small});\r\n `}\r\n ${(p) =>\r\n p['data-direction'] === 'vertical' &&\r\n css`\r\n min-width: 150px;\r\n `}\r\n ${(p) =>\r\n invertedHoverButton({\r\n primaryColor: `${p.theme.colors?.primary}`,\r\n secondaryColor: '#FFFFFF',\r\n })}\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.small} 0 0;\r\n }\r\n span {\r\n }\r\n`;\r\n\r\nexport default ConversationContent;\r\n","import { FormComponent } from '@telia-ace/widget-forms';\r\nimport {\r\n borderTabStyle,\r\n buttonCss,\r\n Html,\r\n invertedHoverButton,\r\n Lightbox,\r\n List,\r\n useDispatch,\r\n} from '@telia-ace/widget-ui';\r\nimport React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationMessageContent } from '../../types';\r\nimport { BundledConversationMessage } from './conversation-component';\r\nimport ConversationContent from './conversation-content';\r\nimport {\r\n ContentBundle,\r\n MessageContainer,\r\n MessageContent,\r\n MessageContentPart as Part,\r\n MessageTitle,\r\n} from './conversation-styles';\r\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\r\n\r\nconst imageLightboxRenderer = (\r\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\r\n) => <Lightbox attrs={attrs} />;\r\n\r\nconst htmlParseInstructions = {\r\n transform: {\r\n img: imageLightboxRenderer,\r\n },\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n} & BundledConversationMessage;\r\n\r\nconst ConversationMessageComponent: React.FC<Props> = ({\r\n className,\r\n timestamp,\r\n sender,\r\n type,\r\n content,\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n const getMessageStackPosition = (index: number) => {\r\n let messageOrder = undefined;\r\n if (content.length > 1) {\r\n messageOrder = index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\r\n }\r\n return messageOrder;\r\n };\r\n\r\n const renderContent = (content: ConversationMessageContent, isUser = false, stacked?: any) => {\r\n const { title, body, actions, form } = content;\r\n return (\r\n <MessageContent\r\n user={isUser}\r\n stacked={!!stacked && stacked}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {title && (\r\n <Part>\r\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\r\n </Part>\r\n )}\r\n {body && (\r\n <Part>\r\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\r\n </Part>\r\n )}\r\n {form && (\r\n <Part>\r\n <StyledForm\r\n {...form}\r\n onChange={(key: string, data: any) => {\r\n dispatch('form', {\r\n data,\r\n formKey: form.schema.id,\r\n actionKey: key,\r\n });\r\n }}\r\n />\r\n </Part>\r\n )}\r\n {actions && (\r\n <Part>\r\n <StyledActionList\r\n items={Object.keys(actions).map((i: any) => {\r\n return { label: actions[i], actionKey: i };\r\n })}\r\n renderItem={(item: any) => {\r\n return (\r\n <li key={item.actionKey}>\r\n <StyledActionButton\r\n onClick={() => {\r\n dispatch('action', item.actionKey);\r\n }}\r\n >\r\n {item.label}\r\n </StyledActionButton>\r\n </li>\r\n );\r\n }}\r\n />\r\n </Part>\r\n )}\r\n </MessageContent>\r\n );\r\n };\r\n\r\n const createSystemMessage = () => {\r\n return (\r\n <>\r\n {content.map((item) => {\r\n const { key, body, title, form, actions } = item;\r\n const discrete = !!body && !title && !form && !actions;\r\n return (\r\n <SystemMessage\r\n className={className}\r\n key={key}\r\n discrete={discrete}\r\n timestamp={timestamp}\r\n fullWidth={!!form || !!actions}\r\n >\r\n {discrete && body ? (\r\n <Html html={body} htmlParseInstruction={htmlParseInstructions} />\r\n ) : (\r\n <ConversationContent content={item} isUser={false} />\r\n )}\r\n </SystemMessage>\r\n );\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n const createAgentMessage = () => {\r\n return (\r\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={false}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </AgentMessage>\r\n );\r\n };\r\n\r\n const createUserMessage = () => {\r\n return (\r\n <UserMessage timestamp={timestamp} className={className}>\r\n <ContentBundle>\r\n {content.map((item, index) => {\r\n return (\r\n <MessageContainer key={item.key}>\r\n <ConversationContent\r\n content={item}\r\n isUser={true}\r\n stacked={getMessageStackPosition(index)}\r\n />\r\n </MessageContainer>\r\n );\r\n })}\r\n </ContentBundle>\r\n </UserMessage>\r\n );\r\n };\r\n\r\n switch (type) {\r\n case ConversationMessageType.System:\r\n return createSystemMessage();\r\n case ConversationMessageType.Agent:\r\n return createAgentMessage();\r\n case ConversationMessageType.User:\r\n return createUserMessage();\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst StyledForm = styled(FormComponent)`\r\n & button.humany-form-component-button {\r\n ${(p) =>\r\n invertedHoverButton({\r\n active: false,\r\n primaryColor: p.theme.colors?.primary,\r\n secondaryColor: p.theme.colors?.accent,\r\n })};\r\n display: block;\r\n width: 100%;\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n\r\n & button.humany-form-component-submit {\r\n width: 100%;\r\n margin: 0;\r\n :not(:last-child) {\r\n margin-bottom: ${(p) => p.theme.sizes?.normal};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledHtml = styled(Html)<any>`\r\n white-space: pre-wrap;\r\n\r\n a {\r\n color: ${(p) => p.theme.colors.link};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n }\r\n`;\r\n\r\nconst StyledActionList = styled(List)`\r\n padding: 0;\r\n list-style: none;\r\n margin: 0 -${(p) => p.theme.sizes?.normal};\r\n > li {\r\n margin: ${(p) => p.theme.sizes?.normal};\r\n }\r\n`;\r\n\r\nconst StyledActionButton = styled.button`\r\n ${buttonCss};\r\n display: block;\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n width: 100%;\r\n color: #fff;\r\n &:focus {\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n `}\r\n }\r\n`;\r\n\r\nexport default ConversationMessageComponent;\r\n","import {\r\n borderTabStyle,\r\n headingElement,\r\n useProperties,\r\n useScroll,\r\n useTransitionEnd,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ConversationMessageSender } from '../../types';\r\nimport {\r\n BundledConversationMessage,\r\n ConversationComponentProperties,\r\n} from './conversation-component';\r\nimport ConversationInput from './conversation-input';\r\nimport ConversationLoader from './conversation-loader';\r\nimport ConversationMessageComponent from './conversation-message';\r\nimport { AgentMessage } from './message-types';\r\n\r\ntype Props = {\r\n className: string;\r\n};\r\n\r\nconst Conversation: React.FC<Props> = ({ className }) => {\r\n const lastEntry = useRef(document.createElement('div'));\r\n const [scrollableCss, viewElem] = useScroll(true);\r\n const { messages, loading, typingActors } = useProperties<ConversationComponentProperties>();\r\n const [canSmooth, setCanSmooth] = useState(false);\r\n const scrollView = useCallback(\r\n (lastEntry: any, smooth = true) => {\r\n if (lastEntry !== null && lastEntry.current !== null) {\r\n if (messages && messages.length === 1) {\r\n lastEntry.current.focus();\r\n }\r\n /**\r\n * Don't scroll on typing state if the user has scrolled up a bit.\r\n */\r\n if (\r\n lastEntry.current.id.indexOf('typing_') !== -1 &&\r\n viewElem.current.scrollTopMax - viewElem.current.scrollTop >\r\n lastEntry.current.clientHeight + 100\r\n ) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n if (lastEntry.current) {\r\n lastEntry.current.scrollIntoView({\r\n block: 'end',\r\n behavior: smooth ? 'smooth' : 'auto',\r\n });\r\n }\r\n }, 0);\r\n }\r\n },\r\n [lastEntry]\r\n );\r\n\r\n useEffect(() => {\r\n if (canSmooth) {\r\n scrollView(lastEntry);\r\n }\r\n }, [messages, typingActors]);\r\n\r\n useTransitionEnd(() => {\r\n setCanSmooth(true);\r\n scrollView(lastEntry, false);\r\n });\r\n\r\n const renderTypingActors = () => {\r\n if (typingActors && typingActors.length) {\r\n return typingActors.map((actor: ConversationMessageSender, index) => {\r\n return (\r\n <MessageEntry\r\n id={`typing_${actor.name}`}\r\n ref={typingActors.length ? lastEntry : null}\r\n key={`typing_${actor.name}`}\r\n >\r\n <AgentMessage timestamp={Date.now()} sender={actor}>\r\n <ConversationLoader></ConversationLoader>\r\n </AgentMessage>\r\n </MessageEntry>\r\n );\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n <Wrapper className={appendClassNames(className, 'humany-conversation-component')}>\r\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\r\n {messages && messages.length\r\n ? messages.map((message: BundledConversationMessage, index: any) => {\r\n const { type, timestamp, sender, content } = message;\r\n return (\r\n <MessageEntry\r\n className={'humany-conversation-entry'}\r\n tabIndex={-1}\r\n key={`${type}_${sender?.name}_${timestamp}_${content[0].key}`}\r\n ref={\r\n index + 1 < messages.length\r\n ? null\r\n : typingActors.length\r\n ? null\r\n : lastEntry\r\n }\r\n >\r\n <ConversationMessageComponent {...message} />\r\n </MessageEntry>\r\n );\r\n })\r\n : null}\r\n {renderTypingActors()}\r\n {loading && (\r\n <MessageEntry>\r\n <ConversationLoader />\r\n </MessageEntry>\r\n )}\r\n </Scrollable>\r\n <ConversationInput />\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n position: absolute;\r\n right: 0;\r\n left: 0;\r\n bottom: 0;\r\n top: 0;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst Scrollable = styled.div<{ scrolling: boolean } & any>`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: stretch;\r\n flex: 0 1 100%;\r\n padding: 0 ${(p) => p.theme.sizes?.normal};\r\n ${(p) => !!p.scrollableCss && p.scrollableCss};\r\n &:focus {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\r\n }\r\n`;\r\n\r\nconst MessageEntry = styled.div`\r\n margin: 0;\r\n margin-bottom: ${(p) => p.theme.sizes?.medium};\r\n\r\n &:first-of-type {\r\n margin-top: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n &:last-of-type {\r\n padding-bottom: ${(p) => p.theme.sizes?.medium};\r\n }\r\n\r\n * {\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n }\r\n\r\n & span,\r\n p,\r\n a,\r\n div {\r\n font-weight: 300;\r\n }\r\n\r\n & b,\r\n h1 {\r\n font-weight: normal;\r\n }\r\n\r\n ${headingElement(\r\n 'h1',\r\n css`\r\n font-weight: normal;\r\n `\r\n )}\r\n`;\r\n\r\nexport default Conversation;\r\n"],"names":["Wrapper","imageLightboxRenderer","htmlParseInstructions","Part"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation.js","sources":["../src/ui/conversation/conversation-input.tsx","../src/ui/conversation/conversation-loader.tsx","../src/ui/conversation/conversation-message.tsx","../src/ui/conversation/conversation.tsx"],"sourcesContent":["import {\n borderTabStyle,\n Button,\n Input,\n SymbolBadge,\n useDispatch,\n useProperties,\n useScroll,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { ConversationComponentProperties } from './conversation-component';\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 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', secondaryAction.action);\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 >\n {secondaryAction && (\n <StyledButton\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 </StyledButton>\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?.small} ${(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-left: ${(p) => p.theme.sizes?.large};\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 {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\n }\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) =>\n p['data-has-focus'] &&\n css`\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\n `}\n ${StyledTextArea} {\n ${(p) => !!p.scrollableCss && p.scrollableCss}\n }\n`;\n\nconst SendSymbol = styled(({ hasContent, ...other }) => <SymbolBadge {...other} />)`\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 React from 'react';\nimport { ConversationMessageSender } from '../../types';\nimport { ContentBundle, Loader, MessageContainer, MessageContent } from './conversation-styles';\n\ntype Props = {\n className?: string;\n agentData?: ConversationMessageSender;\n};\n\nconst ConversationLoader: React.FC<Props> = ({ className, agentData }) => {\n return (\n <ContentBundle>\n <MessageContainer>\n <MessageContent>\n <Loader>\n <div />\n <div />\n <div />\n </Loader>\n </MessageContent>\n </MessageContainer>\n </ContentBundle>\n );\n};\n\nexport default ConversationLoader;\n","import { FormComponent } from '@telia-ace/widget-forms';\nimport {\n borderTabStyle,\n buttonCss,\n Html,\n invertedHoverButton,\n Lightbox,\n List,\n useDispatch,\n} from '@telia-ace/widget-ui';\nimport React from 'react';\nimport styled, { css } from 'styled-components';\nimport { ConversationMessageType } from '../../conversation-controller';\nimport { ConversationMessageContent } from '../../types';\nimport { BundledConversationMessage } from './conversation-component';\nimport ConversationContent from './conversation-content';\nimport {\n ContentBundle,\n MessageContainer,\n MessageContent,\n MessageContentPart as Part,\n MessageTitle,\n} from './conversation-styles';\nimport { AgentMessage, SystemMessage, UserMessage } from './message-types';\n\nconst imageLightboxRenderer = (\n attrs: React.DetailedHTMLProps<React.HtmlHTMLAttributes<HTMLImageElement>, HTMLImageElement>\n) => <Lightbox attrs={attrs} />;\n\nconst htmlParseInstructions = {\n transform: {\n img: imageLightboxRenderer,\n },\n};\n\ntype Props = {\n className?: string;\n} & BundledConversationMessage;\n\nconst ConversationMessageComponent: React.FC<Props> = ({\n className,\n timestamp,\n sender,\n type,\n content,\n}) => {\n const dispatch = useDispatch();\n\n const getMessageStackPosition = (index: number) => {\n let messageOrder = undefined;\n if (content.length > 1) {\n messageOrder = index === 0 ? 'first' : index + 1 === content.length ? 'last' : 'middle';\n }\n return messageOrder;\n };\n\n const renderContent = (content: ConversationMessageContent, isUser = false, stacked?: any) => {\n const { title, body, actions, form } = content;\n return (\n <MessageContent\n user={isUser}\n stacked={!!stacked && stacked}\n fullWidth={!!form || !!actions}\n >\n {title && (\n <Part>\n <MessageTitle variant=\"h2\">{title}</MessageTitle>\n </Part>\n )}\n {body && (\n <Part>\n <StyledHtml html={body} htmlParseInstruction={htmlParseInstructions} />\n </Part>\n )}\n {form && (\n <Part>\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 </Part>\n )}\n {actions && (\n <Part>\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 </Part>\n )}\n </MessageContent>\n );\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 timestamp={timestamp}\n fullWidth={!!form || !!actions}\n >\n {discrete && body ? (\n <Html html={body} htmlParseInstruction={htmlParseInstructions} />\n ) : (\n <ConversationContent content={item} isUser={false} />\n )}\n </SystemMessage>\n );\n })}\n </>\n );\n };\n\n const createAgentMessage = () => {\n return (\n <AgentMessage sender={sender} timestamp={timestamp} className={className}>\n <ContentBundle>\n {content.map((item, index) => {\n return (\n <MessageContainer key={item.key}>\n <ConversationContent\n content={item}\n isUser={false}\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>\n {content.map((item, index) => {\n return (\n <MessageContainer key={item.key}>\n <ConversationContent\n content={item}\n isUser={true}\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\nconst StyledForm = styled(FormComponent)`\n & button.humany-form-component-button {\n ${(p) =>\n invertedHoverButton({\n active: false,\n primaryColor: p.theme.colors?.primary,\n secondaryColor: p.theme.colors?.accent,\n })};\n display: block;\n width: 100%;\n margin-bottom: ${(p) => p.theme.sizes?.normal};\n }\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\nconst StyledHtml = styled(Html)<any>`\n white-space: pre-wrap;\n\n a {\n color: ${(p) => p.theme.colors.link};\n &:focus {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\n }\n }\n`;\n\nconst 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\nconst StyledActionButton = styled.button`\n ${buttonCss};\n display: block;\n background-color: ${(p) => p.theme.colors?.primary};\n width: 100%;\n color: #fff;\n &:focus {\n ${(p) =>\n p.theme.accessibility?.isTabbing &&\n css`\n ${borderTabStyle}\n background-color: transparent;\n `}\n }\n`;\n\nexport default ConversationMessageComponent;\n","import {\n borderTabStyle,\n headingElement,\n useProperties,\n useScroll,\n useTransitionEnd,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { ConversationMessageSender } from '../../types';\nimport {\n BundledConversationMessage,\n ConversationComponentProperties,\n} from './conversation-component';\nimport ConversationInput from './conversation-input';\nimport ConversationLoader from './conversation-loader';\nimport ConversationMessageComponent from './conversation-message';\nimport { AgentMessage } from './message-types';\n\ntype Props = {\n className: string;\n};\n\nconst Conversation: React.FC<Props> = ({ className }) => {\n const lastEntry = useRef(document.createElement('div'));\n const [scrollableCss, viewElem] = useScroll(true);\n const { messages, loading, typingActors } = useProperties<ConversationComponentProperties>();\n const [canSmooth, setCanSmooth] = useState(false);\n const scrollView = useCallback(\n (lastEntry: any, smooth = true) => {\n if (lastEntry !== null && lastEntry.current !== null) {\n if (messages && messages.length === 1) {\n lastEntry.current.focus();\n }\n /**\n * Don't scroll on typing state if the user has scrolled up a bit.\n */\n if (\n lastEntry.current.id.indexOf('typing_') !== -1 &&\n viewElem.current.scrollTopMax - viewElem.current.scrollTop >\n lastEntry.current.clientHeight + 100\n ) {\n return;\n }\n setTimeout(() => {\n if (lastEntry.current) {\n lastEntry.current.scrollIntoView({\n block: 'end',\n behavior: smooth ? 'smooth' : 'auto',\n });\n }\n }, 0);\n }\n },\n [lastEntry]\n );\n\n useEffect(() => {\n if (canSmooth) {\n scrollView(lastEntry);\n }\n }, [messages, typingActors]);\n\n useTransitionEnd(() => {\n setCanSmooth(true);\n scrollView(lastEntry, false);\n });\n\n const renderTypingActors = () => {\n if (typingActors && typingActors.length) {\n return typingActors.map((actor: ConversationMessageSender, index) => {\n return (\n <MessageEntry\n id={`typing_${actor.name}`}\n ref={typingActors.length ? lastEntry : null}\n key={`typing_${actor.name}`}\n >\n <AgentMessage timestamp={Date.now()} sender={actor}>\n <ConversationLoader></ConversationLoader>\n </AgentMessage>\n </MessageEntry>\n );\n });\n }\n return null;\n };\n\n return (\n <Wrapper className={appendClassNames(className, 'humany-conversation-component')}>\n <Scrollable tabIndex={0} scrollableCss={scrollableCss} ref={viewElem}>\n {messages && messages.length\n ? messages.map((message: BundledConversationMessage, index: any) => {\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 ref={\n index + 1 < messages.length\n ? null\n : typingActors.length\n ? null\n : lastEntry\n }\n >\n <ConversationMessageComponent {...message} />\n </MessageEntry>\n );\n })\n : null}\n {renderTypingActors()}\n {loading && (\n <MessageEntry>\n <ConversationLoader />\n </MessageEntry>\n )}\n </Scrollable>\n <ConversationInput />\n </Wrapper>\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\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?.normal};\n ${(p) => !!p.scrollableCss && p.scrollableCss};\n &:focus {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle};\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 * {\n font-size: ${(p) => p.theme.fonts?.normal};\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\n ${headingElement(\n 'h1',\n css`\n font-weight: normal;\n `\n )}\n`;\n\nexport default Conversation;\n"],"names":["Wrapper"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ConversationEndedBehavior, ConversationPlatform, UnregisterControllerDelegate } from './conversation-platform';
|
|
2
|
-
export { ConversationController, ConversationEntry, ConversationMessageType, } from './conversation-controller';
|
|
3
|
-
export type { ConversationMessage } from './conversation-controller';
|
|
4
|
-
export { ConversationMessageListItemType } from './types';
|
|
5
|
-
export type { ConversationMessageContent, ConversationMessageSender, ConverstationMessageItem, } from './types';
|
|
6
|
-
export { ConversationComponent, ConversationReturnButtonComponent } from './ui';
|
|
7
|
-
export { registerCustomMessageComponent } from './utils/custom-message';
|
|
8
|
-
export { ConversationPlatform, ConversationEndedBehavior };
|
|
9
|
-
export type { UnregisterControllerDelegate };
|
|
1
|
+
import { ConversationEndedBehavior, ConversationPlatform, UnregisterControllerDelegate } from './conversation-platform';
|
|
2
|
+
export { ConversationController, ConversationEntry, ConversationMessageType, } from './conversation-controller';
|
|
3
|
+
export type { ConversationMessage } from './conversation-controller';
|
|
4
|
+
export { ConversationMessageListItemType } from './types';
|
|
5
|
+
export type { ConversationMessageContent, ConversationMessageSender, ConverstationMessageItem, } from './types';
|
|
6
|
+
export { ConversationComponent, ConversationReturnButtonComponent, StyledButtonList } from './ui';
|
|
7
|
+
export { registerCustomMessageComponent } from './utils/custom-message';
|
|
8
|
+
export { ConversationPlatform, ConversationEndedBehavior };
|
|
9
|
+
export type { UnregisterControllerDelegate };
|