diff --git a/dist/react-simple-chatbot.js b/dist/react-simple-chatbot.js index eaca4755..0e388b2d 100644 --- a/dist/react-simple-chatbot.js +++ b/dist/react-simple-chatbot.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("styled-components")):"function"==typeof define&&define.amd?define(["react","styled-components"],t):"object"==typeof exports?exports.ReactSimpleChatbot=t(require("react"),require("styled-components")):e.ReactSimpleChatbot=t(e.react,e["styled-components"])}("undefined"!=typeof self?self:this,function(e,t){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="dist/",n(n.s=7)}([function(e,t,n){e.exports=n(5)()},function(t,n){t.exports=e},function(e,n){e.exports=t},function(e,t){var n=function(e,t){return{parse:function(t,r){var a=JSON.parse(t,i).map(o),s=a[0],u=r||n,c="object"==typeof s&&s?function t(n,r,o,i){return Object.keys(o).reduce(function(o,a){var s=o[a];if(s instanceof e){var u=n[s];"object"!=typeof u||r.has(u)?o[a]=i.call(o,a,u):(r.add(u),o[a]=i.call(o,a,t(n,r,u,i)))}else o[a]=i.call(o,a,s);return o},o)}(a,new Set,s,u):s;return u.call({"":c},"",c)},stringify:function(e,o,i){for(var a,s=new Map,u=[],c=[],l=o&&typeof o==typeof u?function(e,t){if(""===e||-11&&void 0!==arguments[1]?arguments[1]:1,n=function(e){e=e.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(e,t,n,r){return t+t+n+n+r+r});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}(e);return"rgba(".concat(n.r,", ").concat(n.g,", ").concat(n.b,", ").concat(t,")")};function f(){var e=g(["\n 0% { box-shadow: 0 0 0 0 ","; }\n 70% { box-shadow: 0 0 0 10px ","; }\n 100% { box-shadow: 0 0 0 0 ","; }\n"]);return f=function(){return e},e}function d(){var e=g(["\n 25% { transform: rotate(-1deg); }\n 100% { transform: rotate(1deg); }\n"]);return d=function(){return e},e}function b(){var e=g(["\n 100% { transform: scale(1); }\n"]);return b=function(){return e},e}function h(){var e=g(["\n 0% { opacity: .2; }\n 20% { opacity: 1; }\n 100% { opacity: .2; }\n"]);return h=function(){return e},e}function g(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var y=Object(c.keyframes)(h()),v=Object(c.keyframes)(b()),m=Object(c.keyframes)(d());function S(){var e=function(e,t){t||(t=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}(["\n animation: "," 1.4s infinite both;\n animation-delay: ",";\n"]);return S=function(){return e},e}var x=l.a.span(S(),y,function(e){return e.delay}),O=function(){return o.a.createElement("span",{className:"rsc-loading"},o.a.createElement(x,{delay:"0s"},"."),o.a.createElement(x,{delay:".2s"},"."),o.a.createElement(x,{delay:".4s"},"."))};function w(){var e=function(e,t){t||(t=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}(["\n background: #fff;\n border-radius: 5px;\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n display: flex;\n justify-content: center;\n margin: 0 6px 10px 6px;\n padding: 16px;\n"]);return w=function(){return e},e}var j=l.a.div(w());function k(e){return(k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function E(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:nt,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:nt,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:nt,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"en";return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),tt||(tt=this),this.state={inputValue:"",lang:o,onChange:t,onEnd:n,onStop:r},this.onResult=this.onResult.bind(this),this.onEnd=this.onEnd.bind(this),this.setup(),tt}return et(e,null,[{key:"isSupported",value:function(){return"webkitSpeechRecognition"in window}}]),et(e,[{key:"onChange",value:function(e){var t=this.state.onChange;this.setState({inputValue:e}),t(e)}},{key:"onFinal",value:function(e){this.setState({inputValue:e}),this.recognition.stop()}},{key:"onEnd",value:function(){var e=this.state,t=e.onStop,n=e.onEnd,r=e.force;this.setState({speaking:!1}),r?t():n()}},{key:"onResult",value:function(e){for(var t="",n="",r=e.resultIndex;r0?t.length-1:0,o=n.generateRenderedStepsById(),i=t[r].value;return"function"==typeof e?e({previousValue:i,steps:o}):e}),mt(vt(vt(n)),"generateRenderedStepsById",function(){for(var e=n.state.previousSteps,t={},r=0,o=e.length;r0?r[t-1]:{};return b&&!h?o.a.createElement(I,{key:t,speak:n.speak,step:e,steps:g,style:c,previousStep:y,previousValue:y.value,triggerNextStep:n.triggerNextStep}):d?o.a.createElement(Z,{key:t,step:e,speak:n.speak,previousValue:y.value,triggerNextStep:n.triggerNextStep,bubbleOptionStyle:u}):o.a.createElement(de,{key:t,step:e,steps:g,speak:n.speak,previousStep:y,previousValue:y.value,triggerNextStep:n.triggerNextStep,avatarStyle:a,bubbleStyle:s,hideBotAvatar:l,hideUserAvatar:p,speechSynthesis:f,isFirst:n.isFirstPosition(e),isLast:n.isLastPosition(e)})}),n.content=null,n.input=null,n.supportsScrollBehavior=!1,n.setContentRef=function(e){n.content=e},n.setInputRef=function(e){n.input=e},n.state={renderedSteps:[],previousSteps:[],currentStep:{},previousStep:{},steps:{},disabled:!0,opened:e.opened||!e.floating,inputValue:"",inputInvalid:!1,speaking:!1,recognitionEnable:e.recognitionEnable&&rt.isSupported(),defaultUserSettings:{}},n.speak=ft(e.speechSynthesis),n}var n,i,a;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&yt(e,t)}(t,r["Component"]),n=t,a=[{key:"getDerivedStateFromProps",value:function(e,t){var n=e.opened;return void 0!==e.toggleFloating&&void 0!==n&&n!==t.opened?function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:1,n=function(e){e=e.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(e,t,n,r){return t+t+n+n+r+r});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}(e);return"rgba(".concat(n.r,", ").concat(n.g,", ").concat(n.b,", ").concat(t,")")};function f(){var e=g(["\n 0% { box-shadow: 0 0 0 0 ","; }\n 70% { box-shadow: 0 0 0 10px ","; }\n 100% { box-shadow: 0 0 0 0 ","; }\n"]);return f=function(){return e},e}function d(){var e=g(["\n 25% { transform: rotate(-1deg); }\n 100% { transform: rotate(1deg); }\n"]);return d=function(){return e},e}function b(){var e=g(["\n 100% { transform: scale(1); }\n"]);return b=function(){return e},e}function h(){var e=g(["\n 0% { opacity: .2; }\n 20% { opacity: 1; }\n 100% { opacity: .2; }\n"]);return h=function(){return e},e}function g(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var y=Object(c.keyframes)(h()),v=Object(c.keyframes)(b()),m=Object(c.keyframes)(d());function S(){var e=function(e,t){t||(t=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}(["\n animation: "," 1.4s infinite both;\n animation-delay: ",";\n"]);return S=function(){return e},e}var x=l.a.span(S(),y,function(e){return e.delay}),O=function(){return o.a.createElement("span",{className:"rsc-loading"},o.a.createElement(x,{delay:"0s"},"."),o.a.createElement(x,{delay:".2s"},"."),o.a.createElement(x,{delay:".4s"},"."))};function w(){var e=function(e,t){t||(t=e.slice(0));return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}(["\n background: #fff;\n border-radius: 5px;\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n display: flex;\n justify-content: center;\n margin: 0 6px 10px 6px;\n padding: 16px;\n"]);return w=function(){return e},e}var j=l.a.div(w());function k(e){return(k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function E(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:nt,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:nt,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:nt,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"en";return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),tt||(tt=this),this.state={inputValue:"",lang:o,onChange:t,onEnd:n,onStop:r},this.onResult=this.onResult.bind(this),this.onEnd=this.onEnd.bind(this),this.setup(),tt}return et(e,null,[{key:"isSupported",value:function(){return"webkitSpeechRecognition"in window}}]),et(e,[{key:"onChange",value:function(e){var t=this.state.onChange;this.setState({inputValue:e}),t(e)}},{key:"onFinal",value:function(e){this.setState({inputValue:e}),this.recognition.stop()}},{key:"onEnd",value:function(){var e=this.state,t=e.onStop,n=e.onEnd,r=e.force;this.setState({speaking:!1}),r?t():n()}},{key:"onResult",value:function(e){for(var t="",n="",r=e.resultIndex;r0?t.length-1:0,o=n.generateRenderedStepsById(),i=t[r].value;return"function"==typeof e?e({previousValue:i,steps:o}):e}),mt(vt(vt(n)),"generateRenderedStepsById",function(){for(var e=n.state.previousSteps,t={},r=0,o=e.length;r0?r[t-1]:{};return b&&!h?o.a.createElement(R,{key:t,speak:n.speak,step:e,steps:g,style:c,previousStep:y,previousValue:y.value,triggerNextStep:n.triggerNextStep}):d?o.a.createElement(Z,{key:t,step:e,previousValue:y.value,triggerNextStep:n.triggerNextStep,bubbleOptionStyle:u}):o.a.createElement(de,{key:t,step:e,steps:g,speak:n.speak,previousStep:y,previousValue:y.value,triggerNextStep:n.triggerNextStep,avatarStyle:a,bubbleStyle:s,hideBotAvatar:l,hideUserAvatar:p,speechSynthesis:f,isFirst:n.isFirstPosition(e),isLast:n.isLastPosition(e)})}),n.content=null,n.input=null,n.supportsScrollBehavior=!1,n.setContentRef=function(e){n.content=e},n.setInputRef=function(e){n.input=e},n.state={renderedSteps:[],previousSteps:[],currentStep:{},previousStep:{},steps:{},disabled:!0,opened:e.opened||!e.floating,inputValue:"",inputInvalid:!1,speaking:!1,recognitionEnable:e.recognitionEnable&&rt.isSupported(),defaultUserSettings:{}},n.speak=ft(e.speechSynthesis),n}var n,i,a;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&yt(e,t)}(t,r["Component"]),n=t,a=[{key:"getDerivedStateFromProps",value:function(e,t){var n=e.opened;return void 0!==e.toggleFloating&&void 0!==n&&n!==t.opened?function(e){for(var t=1;t {\n // http://stackoverflow.com/a/5624139\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n }\n : null;\n};\n\n/**\n * Transform hex+alpha to rgba\n * @param {string} hex hex color code\n * @param {number} [alpha=1]\n * @returns {string} the rgba as string\n */\nconst rgba = (hex, alpha = 1) => {\n const color = hexToRgb(hex);\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${alpha})`;\n};\n\nexport default rgba;\n","import { keyframes } from 'styled-components';\nimport rgba from './rgba';\n\nconst loading = keyframes`\n 0% { opacity: .2; }\n 20% { opacity: 1; }\n 100% { opacity: .2; }\n`;\n\nconst scale = keyframes`\n 100% { transform: scale(1); }\n`;\n\nconst invalidInput = keyframes`\n 25% { transform: rotate(-1deg); }\n 100% { transform: rotate(1deg); }\n`;\n\nconst pulse = color => keyframes`\n 0% { box-shadow: 0 0 0 0 ${rgba(color, 0.4)}; }\n 70% { box-shadow: 0 0 0 10px ${rgba(color, 0)}; }\n 100% { box-shadow: 0 0 0 0 ${rgba(color, 0)}; }\n`;\n\nexport { loading, scale, invalidInput, pulse };\n","import styled from 'styled-components';\nimport { loading } from '../../common/animations';\n\nconst LoadingStep = styled.span`\n animation: ${loading} 1.4s infinite both;\n animation-delay: ${props => props.delay};\n`;\n\nexport default LoadingStep;\n","import React from 'react';\nimport LoadingStep from './LoadingStep';\n\nconst Loading = () => (\n \n .\n .\n .\n \n);\n\nexport default Loading;\n","import styled from 'styled-components';\n\nconst ChatStepContainer = styled.div`\n background: #fff;\n border-radius: 5px;\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n display: flex;\n justify-content: center;\n margin: 0 6px 10px 6px;\n padding: 16px;\n`;\n\nexport default ChatStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Loading from '../common/Loading';\nimport CustomStepContainer from './CustomStepContainer';\n\nclass CustomStep extends Component {\n state = {\n loading: true\n };\n\n componentDidMount() {\n const { speak, step, previousValue, triggerNextStep } = this.props;\n const { delay, waitAction } = step;\n\n setTimeout(() => {\n this.setState({ loading: false }, () => {\n if (!waitAction && !step.rendered) {\n triggerNextStep();\n }\n speak(step, previousValue);\n });\n }, delay);\n }\n\n renderComponent = () => {\n const { step, steps, previousStep, triggerNextStep } = this.props;\n const { component } = step;\n\n return React.cloneElement(component, {\n step,\n steps,\n previousStep,\n triggerNextStep\n });\n };\n\n render() {\n const { loading } = this.state;\n const { style } = this.props;\n\n return (\n \n {loading ? : this.renderComponent()}\n \n );\n }\n}\n\nCustomStep.propTypes = {\n previousStep: PropTypes.objectOf(PropTypes.any).isRequired,\n previousValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.number,\n PropTypes.object,\n PropTypes.array\n ]),\n speak: PropTypes.func,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n steps: PropTypes.objectOf(PropTypes.any).isRequired,\n style: PropTypes.objectOf(PropTypes.any).isRequired,\n triggerNextStep: PropTypes.func.isRequired\n};\nCustomStep.defaultProps = {\n previousValue: '',\n speak: () => {}\n};\n\nexport default CustomStep;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\n\nconst Option = styled.li`\n animation: ${scale} 0.3s ease forwards;\n cursor: pointer;\n display: inline-block;\n margin: 2px;\n transform: scale(0);\n`;\n\nexport default Option;\n","export default {\n background: '#f5f8fb',\n fontFamily: 'monospace',\n headerBgColor: '#6e48aa',\n headerFontColor: '#fff',\n headerFontSize: '16px',\n botBubbleColor: '#6E48AA',\n botFontColor: '#fff',\n userBubbleColor: '#fff',\n userFontColor: '#4a4a4a'\n};\n","import styled from 'styled-components';\nimport defaultTheme from '../../theme';\n\nconst OptionElement = styled.button`\n background: ${({ theme }) => theme.botBubbleColor};\n border: 0;\n border-radius: 22px;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);\n color: ${({ theme }) => theme.botFontColor};\n display: inline-block;\n font-size: 14px;\n padding: 12px;\n\n &:hover {\n opacity: 0.7;\n }\n &:active,\n &:hover:focus {\n outline:none;\n }\n`;\n\nOptionElement.defaultProps = {\n theme: defaultTheme\n};\n\nexport default OptionElement;\n","import styled from 'styled-components';\n\nconst Options = styled.ul`\n margin: 2px 0 12px 0;\n padding: 0 6px;\n`;\n\nexport default Options;\n","import styled from 'styled-components';\n\nconst OptionsStepContainer = styled.div``;\n\nexport default OptionsStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Option from './Option';\nimport OptionElement from './OptionElement';\nimport Options from './Options';\nimport OptionsStepContainer from './OptionsStepContainer';\n\nclass OptionsStep extends Component {\n onOptionClick = ({ value }) => {\n const { triggerNextStep } = this.props;\n\n triggerNextStep({ value });\n };\n\n renderOption = option => {\n const { bubbleOptionStyle, step } = this.props;\n const { user } = step;\n const { value, label } = option;\n\n return (\n \n );\n };\n\n render() {\n const { step } = this.props;\n const { options } = step;\n\n return (\n \n \n {Object.keys(options).map(key => options[key]).map(this.renderOption)}\n \n \n );\n }\n}\n\nOptionsStep.propTypes = {\n bubbleOptionStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n triggerNextStep: PropTypes.func.isRequired\n};\n\nexport default OptionsStep;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\nimport defaultTheme from '../../theme';\n\nconst Bubble = styled.div`\n animation: ${scale} 0.3s ease forwards;\n background: ${props => (props.user ? props.theme.userBubbleColor : props.theme.botBubbleColor)};\n border-radius: ${props => {\n const { isFirst, isLast, user } = props;\n\n if (!isFirst && !isLast) {\n return user ? '18px 0 0 18px' : '0 18px 18px 0px';\n }\n\n if (!isFirst && isLast) {\n return user ? '18px 0 18px 18px' : '0 18px 18px 18px';\n }\n\n return props.user ? '18px 18px 0 18px' : '18px 18px 18px 0';\n }};\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);\n color: ${props => (props.user ? props.theme.userFontColor : props.theme.botFontColor)};\n display: inline-block;\n font-size: 14px;\n max-width: 50%;\n margin: ${props => {\n const { isFirst, showAvatar, user } = props;\n\n if (!isFirst && showAvatar) {\n return user ? '-8px 46px 10px 0' : '-8px 0 10px 46px';\n }\n\n if (!isFirst && !showAvatar) {\n return user ? '-8px 0px 10px 0' : '-8px 0 10px 0px';\n }\n\n return '0 0 10px 0';\n }};\n overflow: hidden;\n position: relative;\n padding: 12px;\n transform: scale(0);\n transform-origin: ${props => {\n const { isFirst, user } = props;\n\n if (isFirst) {\n return user ? 'bottom right' : 'bottom left';\n }\n\n return user ? 'top right' : 'top left';\n }};\n`;\n\nBubble.defaultProps = {\n theme: defaultTheme\n};\n\nexport default Bubble;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\n\nconst Image = styled.img`\n animation: ${scale} 0.3s ease forwards;\n border-radius: ${props => (props.user ? '50% 50% 50% 0' : '50% 50% 0 50%')};\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n height: 40px;\n min-width: 40px;\n padding: 3px;\n transform: scale(0);\n transform-origin: ${props => (props.user ? 'bottom left' : 'bottom right')};\n width: 40;\n`;\n\nexport default Image;\n","import styled from 'styled-components';\n\nconst ImageContainer = styled.div`\n display: inline-block;\n order: ${props => (props.user ? '1' : '0')};\n padding: 6px;\n`;\n\nexport default ImageContainer;\n","import styled from 'styled-components';\n\nconst TextStepContainer = styled.div`\n align-items: flex-end;\n display: flex;\n justify-content: ${props => (props.user ? 'flex-end' : 'flex-start')};\n`;\n\nexport default TextStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Bubble from './Bubble';\nimport Image from './Image';\nimport ImageContainer from './ImageContainer';\nimport Loading from '../common/Loading';\nimport TextStepContainer from './TextStepContainer';\n\nclass TextStep extends Component {\n /* istanbul ignore next */\n state = {\n loading: true\n };\n\n componentDidMount() {\n const { step, speak, previousValue, triggerNextStep } = this.props;\n const { component, delay, waitAction } = step;\n const isComponentWatingUser = component && waitAction;\n\n setTimeout(() => {\n this.setState({ loading: false }, () => {\n if (!isComponentWatingUser && !step.rendered) {\n triggerNextStep();\n }\n speak(step, previousValue);\n });\n }, delay);\n }\n\n getMessage = () => {\n const { previousValue, step } = this.props;\n const { message } = step;\n\n return message ? message.replace(/{previousValue}/g, previousValue) : '';\n };\n\n renderMessage = () => {\n const { step, steps, previousStep, triggerNextStep } = this.props;\n const { component } = step;\n\n if (component) {\n return React.cloneElement(component, {\n step,\n steps,\n previousStep,\n triggerNextStep\n });\n }\n\n return this.getMessage();\n };\n\n render() {\n const {\n step,\n isFirst,\n isLast,\n avatarStyle,\n bubbleStyle,\n hideBotAvatar,\n hideUserAvatar\n } = this.props;\n const { loading } = this.state;\n const { avatar, user } = step;\n\n const showAvatar = user ? !hideUserAvatar : !hideBotAvatar;\n\n return (\n \n \n {isFirst && showAvatar && (\n \n )}\n \n \n {loading ? : this.renderMessage()}\n \n \n );\n }\n}\n\nTextStep.propTypes = {\n avatarStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n isFirst: PropTypes.bool.isRequired,\n isLast: PropTypes.bool.isRequired,\n bubbleStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n hideBotAvatar: PropTypes.bool.isRequired,\n hideUserAvatar: PropTypes.bool.isRequired,\n previousStep: PropTypes.objectOf(PropTypes.any),\n previousValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.number,\n PropTypes.object,\n PropTypes.array\n ]),\n speak: PropTypes.func,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n steps: PropTypes.objectOf(PropTypes.any),\n triggerNextStep: PropTypes.func.isRequired\n};\n\nTextStep.defaultProps = {\n previousStep: {},\n previousValue: '',\n speak: () => {},\n steps: {}\n};\n\nexport default TextStep;\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'user',\n types: ['boolean'],\n required: true\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'validator',\n types: ['function'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'message',\n types: ['string', 'function'],\n required: true\n },\n {\n key: 'avatar',\n types: ['string'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'delay',\n types: ['number'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'options',\n types: ['object'],\n required: true\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'component',\n types: ['any'],\n required: true\n },\n {\n key: 'avatar',\n types: ['string'],\n required: false\n },\n {\n key: 'replace',\n types: ['boolean'],\n required: false\n },\n {\n key: 'waitAction',\n types: ['boolean'],\n required: false\n },\n {\n key: 'asMessage',\n types: ['boolean'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'delay',\n types: ['number'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'update',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: true\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","import userSchema from './userSchema';\nimport textSchema from './textSchema';\nimport optionsSchema from './optionsSchema';\nimport customSchema from './customSchema';\nimport updateSchema from './updateSchema';\nimport { stringify } from 'flatted/cjs';\n\nconst schema = {\n parse(step) {\n let parser = [];\n\n if (step.user) {\n parser = userSchema;\n } else if (step.message) {\n parser = textSchema;\n } else if (step.options) {\n parser = optionsSchema;\n } else if (step.component) {\n parser = customSchema;\n } else if (step.update) {\n parser = updateSchema;\n } else {\n throw new Error(`The step ${stringify(step)} is invalid`);\n }\n\n for (let i = 0, len = parser.length; i < len; i += 1) {\n const { key, types, required } = parser[i];\n\n if (!step[key] && required) {\n throw new Error(`Key '${key}' is required in step ${stringify(step)}`);\n } else if (step[key]) {\n if (types[0] !== 'any' && types.indexOf(typeof step[key]) < 0) {\n throw new Error(\n `The type of '${key}' value must be ${types.join(' or ')} instead of ${typeof step[\n key\n ]}`\n );\n }\n }\n }\n\n const keys = parser.map(p => p.key);\n\n for (const key in step) {\n if (keys.indexOf(key) < 0) {\n console.error(`Invalid key '${key}' in step '${step.id}'`);\n delete step[key];\n }\n }\n\n return step;\n },\n\n checkInvalidIds(steps) {\n for (const key in steps) {\n const step = steps[key];\n const triggerId = steps[key].trigger;\n\n if (typeof triggerId !== 'function') {\n if (step.options) {\n const triggers = step.options.filter(option => typeof option.trigger !== 'function');\n const optionsTriggerIds = triggers.map(option => option.trigger);\n\n for (let i = 0, len = optionsTriggerIds.length; i < len; i += 1) {\n const optionTriggerId = optionsTriggerIds[i];\n if (optionTriggerId && !steps[optionTriggerId]) {\n throw new Error(\n `The id '${optionTriggerId}' triggered by option ${i + 1} in step '${\n steps[key].id\n }' does not exist`\n );\n }\n }\n } else if (triggerId && !steps[triggerId]) {\n throw new Error(\n `The id '${triggerId}' triggered by step '${steps[key].id}' does not exist`\n );\n }\n }\n }\n }\n};\n\nexport default schema;\n","import { stringify, parse } from 'flatted/cjs'\n\n/* istanbul ignore next */\nconst getData = (params, callback) => {\n const { cacheName, cache, firstStep, steps } = params;\n const currentStep = firstStep;\n const renderedSteps = [steps[currentStep.id]];\n const previousSteps = [steps[currentStep.id]];\n const previousStep = {};\n const unParsedCache = localStorage.getItem(cacheName);\n\n if (cache && unParsedCache) {\n try {\n const data = parse(unParsedCache);\n const lastStep = data.renderedSteps[data.renderedSteps.length - 1];\n\n if (lastStep && lastStep.end) {\n localStorage.removeItem(cacheName);\n } else {\n for (let i = 0, len = data.renderedSteps.length; i < len; i += 1) {\n const renderedStep = data.renderedSteps[i];\n // remove delay of cached rendered steps\n data.renderedSteps[i].delay = 0;\n // flag used to avoid call triggerNextStep in cached rendered steps\n data.renderedSteps[i].rendered = true;\n\n // an error is thrown when render a component from localStorage.\n // So it's necessary reassing the component\n if (renderedStep.component) {\n const { id } = renderedStep;\n data.renderedSteps[i].component = steps[id].component;\n }\n }\n\n const { trigger, end, options } = data.currentStep;\n const { id } = data.currentStep;\n\n if (options) {\n delete data.currentStep.rendered;\n }\n\n // add trigger function to current step\n if (!trigger && !end) {\n if (options) {\n for (let i = 0; i < options.length; i += 1) {\n data.currentStep.options[i].trigger = steps[id].options[i].trigger;\n }\n } else {\n data.currentStep.trigger = steps[id].trigger;\n }\n }\n\n // execute callback function to enable input if last step is\n // waiting user type\n if (data.currentStep.user) {\n callback();\n }\n\n return data;\n }\n } catch (error) {\n console.info(`Unable to parse cache named:${cacheName}. \\nThe cache where probably created with an older version of react-simple-chatbot.\\n`, error);\n }\n }\n\n return {\n currentStep,\n previousStep,\n previousSteps,\n renderedSteps\n };\n};\n\n/* istanbul ignore next */\nconst setData = (cacheName, cachedData) => {\n const data = parse(stringify(cachedData));\n // clean components\n for (const key in data) {\n for (let i = 0, len = data[key].length; i < len; i += 1) {\n if (data[key][i].component) {\n data[key][i].component = data[key][i].id;\n }\n }\n }\n\n localStorage.setItem(cacheName, stringify(data));\n};\n\nexport { getData, setData };\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst ChatBotContainer = styled.div`\n background: ${({ theme }) => theme.background};\n border-radius: 10px;\n box-shadow: 0 12px 24px 0 rgba(0, 0, 0, 0.15);\n font-family: ${({ theme }) => theme.fontFamily};\n overflow: hidden;\n position: ${({ floating }) => (floating ? 'fixed' : 'relative')};\n bottom: ${({ floating, floatingStyle }) =>\n floating ? floatingStyle.bottom || '32px' : 'initial'};\n top: ${({ floating, floatingStyle }) => (floating ? floatingStyle.top || 'initial' : 'initial')};\n right: ${({ floating, floatingStyle }) => (floating ? floatingStyle.right || '32px' : 'initial')};\n left: ${({ floating, floatingStyle }) =>\n floating ? floatingStyle.left || 'initial' : 'initial'};\n width: ${({ width }) => width};\n height: ${({ height }) => height};\n z-index: 999;\n transform: ${({ opened }) => (opened ? 'scale(1)' : 'scale(0)')};\n transform-origin: ${({ floatingStyle }) => floatingStyle.transformOrigin || 'bottom right'};\n transition: transform 0.3s ease;\n\n @media screen and (max-width: 568px) {\n border-radius: ${({ floating }) => (floating ? '0' : '')};\n bottom: 0 !important;\n left: initial !important;\n height: 100%;\n right: 0 !important;\n top: initial !important;\n width: 100%;\n }\n`;\n\nChatBotContainer.defaultProps = {\n theme: defaultTheme\n};\n\nexport default ChatBotContainer;\n","import styled from 'styled-components';\n\nconst Content = styled.div`\n height: calc(${props => props.height} - ${props => (props.hideInput ? '56px' : '112px')});\n overflow-y: scroll;\n margin-top: 2px;\n padding-top: 6px;\n\n @media screen and (max-width: 568px) {\n height: ${props => (props.floating ? 'calc(100% - 112px)' : '')};\n }\n`;\n\nexport default Content;\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst Header = styled.div`\n align-items: center;\n background: ${({ theme }) => theme.headerBgColor};\n color: ${({ theme }) => theme.headerFontColor};\n display: flex;\n fill: ${({ theme }) => theme.headerFontColor};\n height: 56px;\n justify-content: space-between;\n padding: 0 10px;\n`;\n\nHeader.defaultProps = {\n theme: defaultTheme\n};\n\nexport default Header;\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst HeaderTitle = styled.h2`\n margin: 0;\n font-size: ${({ theme }) => theme.headerFontSize};\n`;\n\nHeaderTitle.defaultProps = {\n theme: defaultTheme\n};\n\nexport default HeaderTitle;\n","import styled from 'styled-components';\n\nconst HeaderIcon = styled.a`\n cursor: pointer;\n`;\n\nexport default HeaderIcon;\n","import styled from 'styled-components';\n\nconst FloatButton = styled.a`\n align-items: center;\n cursor: pointer;\n background: ${({ theme }) => theme.headerBgColor};\n bottom: 32px;\n border-radius: 100%;\n box-shadow: 0 12px 24px 0 rgba(0, 0, 0, 0.15);\n display: flex;\n fill: ${({ theme }) => theme.headerFontColor};\n height: 56px;\n justify-content: center;\n position: fixed;\n right: 32px;\n transform: ${props => (props.opened ? 'scale(0)' : 'scale(1)')};\n transition: transform 0.3s ease;\n width: 56px;\n z-index: 999;\n`;\n\nFloatButton.defaultProps = {\n theme: {\n headerBgColor: '#6e48aa',\n headerFontColor: '#fff'\n }\n};\n\nexport default FloatButton;\n","import styled from 'styled-components';\n\nconst FloatingIcon = styled.img`\n height: 24px;\n width: 24px;\n`;\n\nexport default FloatingIcon;\n","import styled from 'styled-components';\n\nconst Footer = styled.div`\n position: relative;\n`;\n\nexport default Footer;\n","import { invalidInput } from '../common/animations';\nimport styled, { css } from 'styled-components';\n\nconst Input = styled.input`\n animation: ${props =>\n props.invalid\n ? css`\n ${invalidInput} .2s ease\n `\n : ''};\n border: 0;\n border-radius: 0;\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n border-top: ${props => (props.invalid ? '0' : '1px solid #eee')};\n box-shadow: ${props => (props.invalid ? 'inset 0 0 2px #E53935' : 'none')};\n box-sizing: border-box;\n color: ${props => (props.invalid ? '#E53935' : '')};\n font-size: 16px;\n opacity: ${props => (props.disabled && !props.invalid ? '.5' : '1')};\n outline: none;\n padding: ${props => (props.hasButton ? '16px 52px 16px 10px' : '16px 10px')};\n width: 100%;\n -webkit-appearance: none;\n\n &:disabled {\n background: #fff;\n }\n\n @media screen and (max-width: 568px) {\n border-bottom-left-radius: ${props => (props.floating ? '0' : '10px')};\n border-bottom-right-radius: ${props => (props.floating ? '0' : '10px')};\n }\n`;\n\nexport default Input;\n","import styled, { css } from 'styled-components';\nimport defaultTheme from '../theme';\nimport { pulse } from '../common/animations';\n\nconst fillFunc = props => {\n const { speaking, invalid, theme } = props;\n\n if (speaking) {\n return theme.headerBgColor;\n }\n return invalid ? '#E53935' : '#4a4a4a';\n};\n\nconst SubmitButton = styled.button`\n background-color: transparent;\n border: 0;\n border-bottom-right-radius: 10px;\n box-shadow: none;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n fill: ${fillFunc};\n opacity: ${props => (props.disabled && !props.invalid ? '.5' : '1')};\n outline: none;\n padding: 14px 16px 12px 16px;\n &:before {\n content: '';\n position: absolute;\n width: 23px;\n height: 23px;\n border-radius: 50%;\n animation: ${({ theme, speaking }) =>\n speaking\n ? css`\n ${pulse(theme.headerBgColor)} 2s ease infinite\n `\n : ''};\n }\n &:not(:disabled):hover {\n opacity: 0.7;\n }\n`;\n\nSubmitButton.defaultProps = {\n theme: defaultTheme\n};\n\nexport default SubmitButton;\n","let instance = null;\n\nconst noop = () => {};\n\nexport default class Recognition {\n static isSupported() {\n return 'webkitSpeechRecognition' in window;\n }\n\n /**\n * Creates an instance of Recognition.\n * @param {function} [onChange] callback on change\n * @param {function} [onEnd] callback on and\n * @param {function} [onStop] callback on stop\n * @param {string} [lang='en'] recognition lang\n * @memberof Recognition\n * @constructor\n */\n constructor(onChange = noop, onEnd = noop, onStop = noop, lang = 'en') {\n if (!instance) {\n instance = this;\n }\n this.state = {\n inputValue: '',\n lang,\n onChange,\n onEnd,\n onStop\n };\n\n this.onResult = this.onResult.bind(this);\n this.onEnd = this.onEnd.bind(this);\n\n this.setup();\n\n return instance;\n }\n\n /**\n * Handler for recognition change event\n * @param {string} interimTranscript\n * @memberof Recognition\n * @private\n */\n onChange(interimTranscript) {\n const { onChange } = this.state;\n this.setState({\n inputValue: interimTranscript\n });\n onChange(interimTranscript);\n }\n\n /**\n * Handler for recognition change event when its final\n * @param {string} finalTranscript\n * @memberof Recognition\n * @private\n */\n onFinal(finalTranscript) {\n this.setState({\n inputValue: finalTranscript\n });\n this.recognition.stop();\n }\n\n /**\n * Handler for recognition end event\n * @memberof Recognition\n * @private\n */\n onEnd() {\n const { onStop, onEnd, force } = this.state;\n this.setState({ speaking: false });\n if (force) {\n onStop();\n } else {\n onEnd();\n }\n }\n\n /**\n * Handler for recognition result event\n * @memberof Recognition\n * @private\n */\n onResult(event) {\n let interimTranscript = '';\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i += 1) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n this.onFinal(finalTranscript);\n } else {\n interimTranscript += event.results[i][0].transcript;\n this.onChange(interimTranscript);\n }\n }\n }\n\n /**\n * method for updating the instance state\n * @param {object} nextState\n * @memberof Recognition\n * @private\n */\n setState(nextState) {\n this.state = Object.assign({}, this.state, nextState);\n }\n\n /**\n * setup the browser recognition\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n setup() {\n if (!Recognition.isSupported()) {\n return this;\n }\n\n const { webkitSpeechRecognition } = window;\n\n this.recognition = new webkitSpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n this.recognition.lang = this.state.lang;\n this.recognition.onresult = this.onResult;\n this.recognition.onend = this.onEnd;\n return this;\n }\n\n /**\n * change the recognition lang and resetup\n * @param {string} lang the new lang\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n setLang(lang) {\n this.setState({ lang });\n this.setup();\n return this;\n }\n\n /**\n * toggle the recognition\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n speak() {\n if (!Recognition.isSupported()) {\n return this;\n }\n const { speaking } = this.state;\n if (!speaking) {\n this.recognition.start();\n this.setState({\n speaking: true,\n inputValue: ''\n });\n } else {\n this.setState({\n force: true\n });\n this.recognition.stop();\n }\n return this;\n }\n}\n","import React from 'react';\n\nconst ChatIcon = () => (\n \n \n \n \n);\n\nexport default ChatIcon;\n","import React from 'react';\n\nconst CloseIcon = () => (\n \n \n \n \n);\n\nexport default CloseIcon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SubmitIcon = ({ size }) => (\n \n \n \n \n \n \n \n);\n\nSubmitIcon.propTypes = {\n size: PropTypes.number\n};\n\nSubmitIcon.defaultProps = {\n size: 20\n};\n\nexport default SubmitIcon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst MicIcon = ({ size }) => (\n \n \n \n \n \n \n);\n\nMicIcon.propTypes = {\n size: PropTypes.number\n};\n\nMicIcon.defaultProps = {\n size: 20\n};\n\nexport default MicIcon;\n","export const isMobile = () => /iphone|ipod|android|ie|blackberry|fennec/i.test(navigator.userAgent);\n\nexport const isString = value => typeof value === 'string';\n","import { isString } from './utils';\n\nexport const getSpeakText = step => {\n const { message, metadata = {} } = step;\n if (isString(metadata.speak)) {\n return metadata.speak;\n }\n if (isString(message)) {\n return message;\n }\n return '';\n};\n\nexport const speakFn = speechSynthesisOptions => (step, previousValue) => {\n const { lang, voice, enable } = speechSynthesisOptions;\n const { user } = step;\n\n if (!window.SpeechSynthesisUtterance || !window.speechSynthesis) {\n return;\n }\n if (user) {\n return;\n }\n if (!enable) {\n return;\n }\n const text = getSpeakText(step);\n const msg = new window.SpeechSynthesisUtterance();\n msg.text = text.replace(/{previousValue}/g, previousValue);\n msg.lang = lang;\n msg.voice = voice;\n window.speechSynthesis.speak(msg);\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Random from 'random-id';\nimport { CustomStep, OptionsStep, TextStep } from './steps_components';\nimport schema from './schemas/schema';\nimport * as storage from './storage';\nimport {\n ChatBotContainer,\n Content,\n Header,\n HeaderTitle,\n HeaderIcon,\n FloatButton,\n FloatingIcon,\n Footer,\n Input,\n SubmitButton\n} from './components';\nimport Recognition from './recognition';\nimport { ChatIcon, CloseIcon, SubmitIcon, MicIcon } from './icons';\nimport { isMobile } from './utils';\nimport { speakFn } from './speechSynthesis';\n\nclass ChatBot extends Component {\n /* istanbul ignore next */\n constructor(props) {\n super(props);\n\n this.content = null;\n this.input = null;\n\n this.supportsScrollBehavior = false;\n\n this.setContentRef = element => {\n this.content = element;\n };\n\n this.setInputRef = element => {\n this.input = element;\n };\n\n this.state = {\n renderedSteps: [],\n previousSteps: [],\n currentStep: {},\n previousStep: {},\n steps: {},\n disabled: true,\n opened: props.opened || !props.floating,\n inputValue: '',\n inputInvalid: false,\n speaking: false,\n recognitionEnable: props.recognitionEnable && Recognition.isSupported(),\n defaultUserSettings: {}\n };\n\n this.speak = speakFn(props.speechSynthesis);\n }\n\n componentDidMount() {\n const { steps } = this.props;\n const {\n botDelay,\n botAvatar,\n cache,\n cacheName,\n customDelay,\n enableMobileAutoFocus,\n userAvatar,\n userDelay\n } = this.props;\n const chatSteps = {};\n\n const defaultBotSettings = { delay: botDelay, avatar: botAvatar };\n const defaultUserSettings = {\n delay: userDelay,\n avatar: userAvatar,\n hideInput: false,\n hideExtraControl: false\n };\n const defaultCustomSettings = { delay: customDelay };\n\n for (let i = 0, len = steps.length; i < len; i += 1) {\n const step = steps[i];\n let settings = {};\n\n if (step.user) {\n settings = defaultUserSettings;\n } else if (step.message || step.asMessage) {\n settings = defaultBotSettings;\n } else if (step.component) {\n settings = defaultCustomSettings;\n }\n\n chatSteps[step.id] = Object.assign({}, settings, schema.parse(step));\n }\n\n schema.checkInvalidIds(chatSteps);\n\n const firstStep = steps[0];\n\n if (firstStep.message) {\n const { message } = firstStep;\n firstStep.message = typeof message === 'function' ? message() : message;\n chatSteps[firstStep.id].message = firstStep.message;\n }\n\n const { recognitionEnable } = this.state;\n const { recognitionLang } = this.props;\n\n if (recognitionEnable) {\n this.recognition = new Recognition(\n this.onRecognitionChange,\n this.onRecognitionEnd,\n this.onRecognitionStop,\n recognitionLang\n );\n }\n\n this.supportsScrollBehavior = 'scrollBehavior' in document.documentElement.style;\n\n if (this.content) {\n this.content.addEventListener('DOMNodeInserted', this.onNodeInserted);\n window.addEventListener('resize', this.onResize);\n }\n\n const { currentStep, previousStep, previousSteps, renderedSteps } = storage.getData(\n {\n cacheName,\n cache,\n firstStep,\n steps: chatSteps\n },\n () => {\n // focus input if last step cached is a user step\n this.setState({ disabled: false }, () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n });\n }\n );\n\n this.setState({\n currentStep,\n defaultUserSettings,\n previousStep,\n previousSteps,\n renderedSteps,\n steps: chatSteps\n });\n }\n\n static getDerivedStateFromProps(props, state) {\n const { opened, toggleFloating } = props;\n if (toggleFloating !== undefined && opened !== undefined && opened !== state.opened) {\n return {\n ...state,\n opened\n };\n }\n return state;\n }\n\n componentWillUnmount() {\n if (this.content) {\n this.content.removeEventListener('DOMNodeInserted', this.onNodeInserted);\n window.removeEventListener('resize', this.onResize);\n }\n }\n\n onNodeInserted = event => {\n const { currentTarget: target } = event;\n const { enableSmoothScroll } = this.props;\n\n if (enableSmoothScroll && this.supportsScrollBehavior) {\n target.scroll({\n top: target.scrollHeight,\n left: 0,\n behavior: 'smooth'\n });\n } else {\n target.scrollTop = target.scrollHeight;\n }\n };\n\n onResize = () => {\n this.content.scrollTop = this.content.scrollHeight;\n };\n\n onRecognitionChange = value => {\n this.setState({ inputValue: value });\n };\n\n onRecognitionEnd = () => {\n this.setState({ speaking: false });\n this.handleSubmitButton();\n };\n\n onRecognitionStop = () => {\n this.setState({ speaking: false });\n };\n\n onValueChange = event => {\n this.setState({ inputValue: event.target.value });\n };\n\n getTriggeredStep = (trigger, value) => {\n const steps = this.generateRenderedStepsById();\n return typeof trigger === 'function' ? trigger({ value, steps }) : trigger;\n };\n\n getStepMessage = message => {\n const { previousSteps } = this.state;\n const lastStepIndex = previousSteps.length > 0 ? previousSteps.length - 1 : 0;\n const steps = this.generateRenderedStepsById();\n const previousValue = previousSteps[lastStepIndex].value;\n return typeof message === 'function' ? message({ previousValue, steps }) : message;\n };\n\n generateRenderedStepsById = () => {\n const { previousSteps } = this.state;\n const steps = {};\n\n for (let i = 0, len = previousSteps.length; i < len; i += 1) {\n const { id, message, value, metadata } = previousSteps[i];\n\n steps[id] = {\n id,\n message,\n value,\n metadata\n };\n }\n\n return steps;\n };\n\n triggerNextStep = data => {\n const { enableMobileAutoFocus } = this.props;\n const { defaultUserSettings, previousSteps, renderedSteps, steps } = this.state;\n\n let { currentStep, previousStep } = this.state;\n const isEnd = currentStep.end;\n\n if (data && data.value) {\n currentStep.value = data.value;\n }\n if (data && data.hideInput) {\n currentStep.hideInput = data.hideInput;\n }\n if (data && data.hideExtraControl) {\n currentStep.hideExtraControl = data.hideExtraControl;\n }\n if (data && data.trigger) {\n currentStep.trigger = this.getTriggeredStep(data.trigger, data.value);\n }\n\n if (isEnd) {\n this.handleEnd();\n } else if (currentStep.options && data) {\n const option = currentStep.options.filter(o => o.value === data.value)[0];\n const trigger = this.getTriggeredStep(option.trigger, currentStep.value);\n delete currentStep.options;\n\n // replace choose option for user message\n currentStep = Object.assign({}, currentStep, option, defaultUserSettings, {\n user: true,\n message: option.label,\n trigger\n });\n\n renderedSteps.pop();\n previousSteps.pop();\n renderedSteps.push(currentStep);\n previousSteps.push(currentStep);\n\n this.setState({\n currentStep,\n renderedSteps,\n previousSteps\n });\n } else if (currentStep.trigger) {\n if (currentStep.replace) {\n renderedSteps.pop();\n }\n\n const trigger = this.getTriggeredStep(currentStep.trigger, currentStep.value);\n let nextStep = Object.assign({}, steps[trigger]);\n\n if (nextStep.message) {\n nextStep.message = this.getStepMessage(nextStep.message);\n } else if (nextStep.update) {\n const updateStep = nextStep;\n nextStep = Object.assign({}, steps[updateStep.update]);\n\n if (nextStep.options) {\n for (let i = 0, len = nextStep.options.length; i < len; i += 1) {\n nextStep.options[i].trigger = updateStep.trigger;\n }\n } else {\n nextStep.trigger = updateStep.trigger;\n }\n }\n\n nextStep.key = Random(24);\n\n previousStep = currentStep;\n currentStep = nextStep;\n\n this.setState({ renderedSteps, currentStep, previousStep }, () => {\n if (nextStep.user) {\n this.setState({ disabled: false }, () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n });\n } else {\n renderedSteps.push(nextStep);\n previousSteps.push(nextStep);\n\n this.setState({ renderedSteps, previousSteps });\n }\n });\n }\n\n const { cache, cacheName } = this.props;\n if (cache) {\n setTimeout(() => {\n storage.setData(cacheName, {\n currentStep,\n previousStep,\n previousSteps,\n renderedSteps\n });\n }, 300);\n }\n };\n\n handleEnd = () => {\n const { handleEnd } = this.props;\n\n if (handleEnd) {\n const { previousSteps } = this.state;\n\n const renderedSteps = previousSteps.map(step => {\n const { id, message, value, metadata } = step;\n\n return {\n id,\n message,\n value,\n metadata\n };\n });\n\n const steps = [];\n\n for (let i = 0, len = previousSteps.length; i < len; i += 1) {\n const { id, message, value, metadata } = previousSteps[i];\n\n steps[id] = {\n id,\n message,\n value,\n metadata\n };\n }\n\n const values = previousSteps.filter(step => step.value).map(step => step.value);\n\n handleEnd({ renderedSteps, steps, values });\n }\n };\n\n isInputValueEmpty = () => {\n const { inputValue } = this.state;\n return !inputValue || inputValue.length === 0;\n };\n\n isLastPosition = step => {\n const { renderedSteps } = this.state;\n const { length } = renderedSteps;\n const stepIndex = renderedSteps.map(s => s.key).indexOf(step.key);\n\n if (length <= 1 || stepIndex + 1 === length) {\n return true;\n }\n\n const nextStep = renderedSteps[stepIndex + 1];\n const hasMessage = nextStep.message || nextStep.asMessage;\n\n if (!hasMessage) {\n return true;\n }\n\n const isLast = step.user !== nextStep.user;\n return isLast;\n };\n\n isFirstPosition = step => {\n const { renderedSteps } = this.state;\n const stepIndex = renderedSteps.map(s => s.key).indexOf(step.key);\n\n if (stepIndex === 0) {\n return true;\n }\n\n const lastStep = renderedSteps[stepIndex - 1];\n const hasMessage = lastStep.message || lastStep.asMessage;\n\n if (!hasMessage) {\n return true;\n }\n\n const isFirst = step.user !== lastStep.user;\n return isFirst;\n };\n\n handleKeyPress = event => {\n if (event.key === 'Enter') {\n this.submitUserMessage();\n }\n };\n\n handleSubmitButton = () => {\n const { speaking, recognitionEnable } = this.state;\n\n if ((this.isInputValueEmpty() || speaking) && recognitionEnable) {\n this.recognition.speak();\n if (!speaking) {\n this.setState({ speaking: true });\n }\n return;\n }\n\n this.submitUserMessage();\n };\n\n submitUserMessage = () => {\n const { defaultUserSettings, inputValue, previousSteps, renderedSteps } = this.state;\n let { currentStep } = this.state;\n\n const isInvalid = currentStep.validator && this.checkInvalidInput();\n\n if (!isInvalid) {\n const step = {\n message: inputValue,\n value: inputValue\n };\n\n currentStep = Object.assign({}, defaultUserSettings, currentStep, step);\n\n renderedSteps.push(currentStep);\n previousSteps.push(currentStep);\n\n this.setState(\n {\n currentStep,\n renderedSteps,\n previousSteps,\n disabled: true,\n inputValue: ''\n },\n () => {\n if (this.input) {\n this.input.blur();\n }\n }\n );\n }\n };\n\n checkInvalidInput = () => {\n const { enableMobileAutoFocus } = this.props;\n const { currentStep, inputValue } = this.state;\n const result = currentStep.validator(inputValue);\n const value = inputValue;\n\n if (typeof result !== 'boolean' || !result) {\n this.setState(\n {\n inputValue: result.toString(),\n inputInvalid: true,\n disabled: true\n },\n () => {\n setTimeout(() => {\n this.setState(\n {\n inputValue: value,\n inputInvalid: false,\n disabled: false\n },\n () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n }\n );\n }, 2000);\n }\n );\n\n return true;\n }\n\n return false;\n };\n\n toggleChatBot = opened => {\n const { toggleFloating } = this.props;\n\n if (toggleFloating) {\n toggleFloating({ opened });\n } else {\n this.setState({ opened });\n }\n };\n\n renderStep = (step, index) => {\n const { renderedSteps } = this.state;\n const {\n avatarStyle,\n bubbleStyle,\n bubbleOptionStyle,\n customStyle,\n hideBotAvatar,\n hideUserAvatar,\n speechSynthesis\n } = this.props;\n const { options, component, asMessage } = step;\n const steps = this.generateRenderedStepsById();\n const previousStep = index > 0 ? renderedSteps[index - 1] : {};\n\n if (component && !asMessage) {\n return (\n \n );\n }\n\n if (options) {\n return (\n \n );\n }\n\n return (\n \n );\n };\n\n render() {\n const {\n currentStep,\n disabled,\n inputInvalid,\n inputValue,\n opened,\n renderedSteps,\n speaking,\n recognitionEnable\n } = this.state;\n const {\n className,\n contentStyle,\n extraControl,\n controlStyle,\n floating,\n floatingIcon,\n floatingStyle,\n footerStyle,\n headerComponent,\n headerTitle,\n hideHeader,\n hideSubmitButton,\n inputStyle,\n placeholder,\n inputAttributes,\n recognitionPlaceholder,\n style,\n submitButtonStyle,\n width,\n height\n } = this.props;\n\n const header = headerComponent || (\n
\n {headerTitle}\n {floating && (\n this.toggleChatBot(false)}>\n \n \n )}\n
\n );\n\n let customControl;\n if (extraControl !== undefined) {\n customControl = React.cloneElement(extraControl, {\n disabled,\n speaking,\n invalid: inputInvalid\n });\n }\n\n const icon =\n (this.isInputValueEmpty() || speaking) && recognitionEnable ? : ;\n\n const inputPlaceholder = speaking\n ? recognitionPlaceholder\n : currentStep.placeholder || placeholder;\n\n const inputAttributesOverride = currentStep.inputAttributes || inputAttributes;\n\n return (\n
\n {floating && (\n this.toggleChatBot(true)}\n >\n {typeof floatingIcon === 'string' ? : floatingIcon}\n \n )}\n \n {!hideHeader && header}\n \n {renderedSteps.map(this.renderStep)}\n \n
\n {!currentStep.hideInput && (\n \n )}\n
\n {!currentStep.hideInput && !currentStep.hideExtraControl && customControl}\n {!currentStep.hideInput && !hideSubmitButton && (\n \n {icon}\n \n )}\n
\n
\n \n
\n );\n }\n}\n\nChatBot.propTypes = {\n avatarStyle: PropTypes.objectOf(PropTypes.any),\n botAvatar: PropTypes.string,\n botDelay: PropTypes.number,\n bubbleOptionStyle: PropTypes.objectOf(PropTypes.any),\n bubbleStyle: PropTypes.objectOf(PropTypes.any),\n cache: PropTypes.bool,\n cacheName: PropTypes.string,\n className: PropTypes.string,\n contentStyle: PropTypes.objectOf(PropTypes.any),\n customDelay: PropTypes.number,\n customStyle: PropTypes.objectOf(PropTypes.any),\n controlStyle: PropTypes.objectOf(PropTypes.any),\n enableMobileAutoFocus: PropTypes.bool,\n enableSmoothScroll: PropTypes.bool,\n extraControl: PropTypes.objectOf(PropTypes.element),\n floating: PropTypes.bool,\n floatingIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n floatingStyle: PropTypes.objectOf(PropTypes.any),\n footerStyle: PropTypes.objectOf(PropTypes.any),\n handleEnd: PropTypes.func,\n headerComponent: PropTypes.element,\n headerTitle: PropTypes.string,\n height: PropTypes.string,\n hideBotAvatar: PropTypes.bool,\n hideHeader: PropTypes.bool,\n hideSubmitButton: PropTypes.bool,\n hideUserAvatar: PropTypes.bool,\n inputAttributes: PropTypes.objectOf(PropTypes.any),\n inputStyle: PropTypes.objectOf(PropTypes.any),\n opened: PropTypes.bool,\n toggleFloating: PropTypes.func,\n placeholder: PropTypes.string,\n recognitionEnable: PropTypes.bool,\n recognitionLang: PropTypes.string,\n recognitionPlaceholder: PropTypes.string,\n speechSynthesis: PropTypes.shape({\n enable: PropTypes.bool,\n lang: PropTypes.string,\n voice:\n typeof window !== 'undefined'\n ? PropTypes.instanceOf(window.SpeechSynthesisVoice)\n : PropTypes.any\n }),\n steps: PropTypes.arrayOf(PropTypes.object).isRequired,\n style: PropTypes.objectOf(PropTypes.any),\n submitButtonStyle: PropTypes.objectOf(PropTypes.any),\n userAvatar: PropTypes.string,\n userDelay: PropTypes.number,\n width: PropTypes.string\n};\n\nChatBot.defaultProps = {\n avatarStyle: {},\n botDelay: 1000,\n bubbleOptionStyle: {},\n bubbleStyle: {},\n cache: false,\n cacheName: 'rsc_cache',\n className: '',\n contentStyle: {},\n customStyle: {},\n controlStyle: { position: 'absolute', right: '0', top: '0' },\n customDelay: 1000,\n enableMobileAutoFocus: false,\n enableSmoothScroll: false,\n extraControl: undefined,\n floating: false,\n floatingIcon: ,\n floatingStyle: {},\n footerStyle: {},\n handleEnd: undefined,\n headerComponent: undefined,\n headerTitle: 'Chat',\n height: '520px',\n hideBotAvatar: false,\n hideHeader: false,\n hideSubmitButton: false,\n hideUserAvatar: false,\n inputStyle: {},\n opened: undefined,\n placeholder: 'Type the message ...',\n inputAttributes: {},\n recognitionEnable: false,\n recognitionLang: 'en',\n recognitionPlaceholder: 'Listening ...',\n speechSynthesis: {\n enable: false,\n lang: 'en',\n voice: null\n },\n style: {},\n submitButtonStyle: {},\n toggleFloating: undefined,\n userDelay: 1000,\n width: '350px',\n botAvatar:\n \"data:image/svg+xml,%3csvg version='1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath d='M303 70a47 47 0 1 0-70 40v84h46v-84c14-8 24-23 24-40z' fill='%2393c7ef'/%3e%3cpath d='M256 23v171h23v-84a47 47 0 0 0-23-87z' fill='%235a8bb0'/%3e%3cpath fill='%2393c7ef' d='M0 240h248v124H0z'/%3e%3cpath fill='%235a8bb0' d='M264 240h248v124H264z'/%3e%3cpath fill='%2393c7ef' d='M186 365h140v124H186z'/%3e%3cpath fill='%235a8bb0' d='M256 365h70v124h-70z'/%3e%3cpath fill='%23cce9f9' d='M47 163h419v279H47z'/%3e%3cpath fill='%2393c7ef' d='M256 163h209v279H256z'/%3e%3cpath d='M194 272a31 31 0 0 1-62 0c0-18 14-32 31-32s31 14 31 32z' fill='%233c5d76'/%3e%3cpath d='M380 272a31 31 0 0 1-62 0c0-18 14-32 31-32s31 14 31 32z' fill='%231e2e3b'/%3e%3cpath d='M186 349a70 70 0 1 0 140 0H186z' fill='%233c5d76'/%3e%3cpath d='M256 349v70c39 0 70-31 70-70h-70z' fill='%231e2e3b'/%3e%3c/svg%3e\",\n userAvatar:\n \"data:image/svg+xml,%3csvg viewBox='-208.5 21 100 100' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3ccircle cx='-158.5' cy='71' fill='%23F5EEE5' r='50'/%3e%3cdefs%3e%3ccircle cx='-158.5' cy='71' id='a' r='50'/%3e%3c/defs%3e%3cclipPath id='b'%3e%3cuse overflow='visible' xlink:href='%23a'/%3e%3c/clipPath%3e%3cpath clip-path='url(%23b)' d='M-108.5 121v-14s-21.2-4.9-28-6.7c-2.5-.7-7-3.3-7-12V82h-30v6.3c0 8.7-4.5 11.3-7 12-6.8 1.9-28.1 7.3-28.1 6.7v14h100.1z' fill='%23E6C19C'/%3e%3cg clip-path='url(%23b)'%3e%3cdefs%3e%3cpath d='M-108.5 121v-14s-21.2-4.9-28-6.7c-2.5-.7-7-3.3-7-12V82h-30v6.3c0 8.7-4.5 11.3-7 12-6.8 1.9-28.1 7.3-28.1 6.7v14h100.1z' id='c'/%3e%3c/defs%3e%3cclipPath id='d'%3e%3cuse overflow='visible' xlink:href='%23c'/%3e%3c/clipPath%3e%3cpath clip-path='url(%23d)' d='M-158.5 100.1c12.7 0 23-18.6 23-34.4 0-16.2-10.3-24.7-23-24.7s-23 8.5-23 24.7c0 15.8 10.3 34.4 23 34.4z' fill='%23D4B08C'/%3e%3c/g%3e%3cpath d='M-158.5 96c12.7 0 23-16.3 23-31 0-15.1-10.3-23-23-23s-23 7.9-23 23c0 14.7 10.3 31 23 31z' fill='%23F2CEA5'/%3e%3c/svg%3e\"\n};\n\nexport default ChatBot;\n","import ChatBot from './ChatBot';\nimport Loading from './steps_components/common/Loading';\n\nexport default ChatBot;\nexport { Loading };\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://ReactSimpleChatbot/webpack/universalModuleDefinition","webpack://ReactSimpleChatbot/webpack/bootstrap","webpack://ReactSimpleChatbot/./node_modules/prop-types/index.js","webpack://ReactSimpleChatbot/external \"react\"","webpack://ReactSimpleChatbot/external \"styled-components\"","webpack://ReactSimpleChatbot/./node_modules/flatted/cjs/index.js","webpack://ReactSimpleChatbot/./node_modules/random-id/randomID.js","webpack://ReactSimpleChatbot/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://ReactSimpleChatbot/./node_modules/prop-types/node_modules/fbjs/lib/emptyFunction.js","webpack://ReactSimpleChatbot/./node_modules/prop-types/node_modules/fbjs/lib/invariant.js","webpack://ReactSimpleChatbot/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://ReactSimpleChatbot/./lib/common/rgba.js","webpack://ReactSimpleChatbot/./lib/common/animations.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/common/LoadingStep.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/common/Loading.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/custom/CustomStepContainer.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/custom/CustomStep.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/options/Option.jsx","webpack://ReactSimpleChatbot/./lib/theme.js","webpack://ReactSimpleChatbot/./lib/steps_components/options/OptionElement.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/options/Options.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/options/OptionsStepContainer.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/options/OptionsStep.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/text/Bubble.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/text/Image.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/text/ImageContainer.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/text/TextStepContainer.jsx","webpack://ReactSimpleChatbot/./lib/steps_components/text/TextStep.jsx","webpack://ReactSimpleChatbot/./lib/schemas/userSchema.js","webpack://ReactSimpleChatbot/./lib/schemas/textSchema.js","webpack://ReactSimpleChatbot/./lib/schemas/optionsSchema.js","webpack://ReactSimpleChatbot/./lib/schemas/customSchema.js","webpack://ReactSimpleChatbot/./lib/schemas/updateSchema.js","webpack://ReactSimpleChatbot/./lib/schemas/schema.js","webpack://ReactSimpleChatbot/./lib/storage.js","webpack://ReactSimpleChatbot/./lib/components/ChatBotContainer.jsx","webpack://ReactSimpleChatbot/./lib/components/Content.jsx","webpack://ReactSimpleChatbot/./lib/components/Header.jsx","webpack://ReactSimpleChatbot/./lib/components/HeaderTitle.jsx","webpack://ReactSimpleChatbot/./lib/components/HeaderIcon.jsx","webpack://ReactSimpleChatbot/./lib/components/FloatButton.jsx","webpack://ReactSimpleChatbot/./lib/components/FloatingIcon.jsx","webpack://ReactSimpleChatbot/./lib/components/Footer.jsx","webpack://ReactSimpleChatbot/./lib/components/Input.jsx","webpack://ReactSimpleChatbot/./lib/components/SubmitButton.jsx","webpack://ReactSimpleChatbot/./lib/recognition.js","webpack://ReactSimpleChatbot/./lib/icons/ChatIcon.jsx","webpack://ReactSimpleChatbot/./lib/icons/CloseIcon.jsx","webpack://ReactSimpleChatbot/./lib/icons/SubmitIcon.jsx","webpack://ReactSimpleChatbot/./lib/icons/MicIcon.jsx","webpack://ReactSimpleChatbot/./lib/utils.js","webpack://ReactSimpleChatbot/./lib/speechSynthesis.js","webpack://ReactSimpleChatbot/./lib/ChatBot.jsx","webpack://ReactSimpleChatbot/./lib/index.js"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__1__","__WEBPACK_EXTERNAL_MODULE__2__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Flatted","Primitive","primitive","parse","text","reviver","input","JSON","Primitives","map","primitives","$","noop","tmp","revive","parsed","output","keys","reduce","has","add","Set","","stringify","replacer","space","firstRun","known","Map","k","v","indexOf","set","replace","after","length","join","index","push","String","len","pattern","possibilities","chars","split","forEach","a","isNaN","parseInt","test","result","charAt","Math","floor","random","emptyFunction","invariant","ReactPropTypesSecret","shim","props","propName","componentName","location","propFullName","secret","getShim","isRequired","ReactPropTypes","array","bool","func","number","string","symbol","any","arrayOf","element","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","makeEmptyFunction","arg","thatReturns","thatReturnsFalse","thatReturnsTrue","thatReturnsNull","thatReturnsThis","thatReturnsArgument","validateFormat","format","condition","b","e","f","error","undefined","Error","args","argIndex","framesToPop","rgba","hex","alpha","arguments","color","g","exec","hexToRgb","concat","loading","keyframes","_templateObject","scale","_templateObject2","invalidInput","_templateObject3","LoadingStep","styled","span","LoadingStep_templateObject","delay","Loading","external_react_default","createElement","className","common_LoadingStep","ChatStepContainer","div","CustomStepContainer_templateObject","CustomStep","_this$props","_this","step","steps","previousStep","triggerNextStep","component","React","cloneElement","Component","_this2","_this$props2","speak","previousValue","waitAction","setTimeout","setState","rendered","state","style","CustomStepContainer","common_Loading","renderComponent","propTypes","defaultProps","Option","li","Option_templateObject","lib_theme","background","fontFamily","headerBgColor","headerFontColor","headerFontSize","botBubbleColor","botFontColor","userBubbleColor","userFontColor","OptionElement","button","OptionElement_templateObject","_ref","theme","_ref2","defaultTheme","Options","ul","Options_templateObject","OptionsStepContainer","OptionsStepContainer_templateObject","OptionsStep","option","bubbleOptionStyle","user","label","options_Option","options_OptionElement","onClick","onOptionClick","options","options_OptionsStepContainer","options_Options","renderOption","Bubble","Bubble_templateObject","isFirst","isLast","showAvatar","Image","img","Image_templateObject","ImageContainer","ImageContainer_templateObject","TextStepContainer","TextStepContainer_templateObject","TextStep","message","getMessage","_this$props3","isComponentWatingUser","_this$props4","avatarStyle","bubbleStyle","hideBotAvatar","hideUserAvatar","avatar","botName","imageAltText","text_TextStepContainer","text_ImageContainer","text_Image","src","alt","text_Bubble","renderMessage","userSchema","types","required","textSchema","optionsSchema","customSchema","updateSchema","schema","parser","update","_parser$i","schema_typeof","console","id","checkInvalidIds","triggerId","trigger","optionsTriggerIds","filter","optionTriggerId","setData","cacheName","cachedData","data","localStorage","setItem","ChatBotContainer","ChatBotContainer_templateObject","_ref3","floating","_ref4","floatingStyle","bottom","_ref5","top","_ref6","right","_ref7","left","_ref8","width","_ref9","height","_ref10","opened","_ref11","transformOrigin","_ref12","Content","Content_templateObject","hideInput","Header","Header_templateObject","HeaderTitle","h2","HeaderTitle_templateObject","HeaderIcon","HeaderIcon_templateObject","FloatButton","FloatButton_templateObject","FloatingIcon","FloatingIcon_templateObject","Footer","Footer_templateObject","Input","Input_templateObject","invalid","css","Input_templateObject2","disabled","hasButton","SubmitButton","SubmitButton_templateObject","speaking","SubmitButton_templateObject2","_templateObject4","instance","Recognition","onChange","onEnd","onStop","lang","recognition_classCallCheck","inputValue","onResult","setup","window","interimTranscript","finalTranscript","recognition","stop","_this$state","force","event","resultIndex","results","isFinal","transcript","onFinal","nextState","_extends","isSupported","webkitSpeechRecognition","continuous","interimResults","onresult","onend","start","ChatIcon","viewBox","xmlns","fill","CloseIcon","SubmitIcon","size","version","points","MicIcon","isMobile","navigator","userAgent","isString","speakFn","speechSynthesisOptions","voice","enable","SpeechSynthesisUtterance","speechSynthesis","_step$metadata","metadata","getSpeakText","msg","ChatBot","ChatBot_classCallCheck","ChatBot_getPrototypeOf","ChatBot_defineProperty","ChatBot_assertThisInitialized","target","currentTarget","enableSmoothScroll","supportsScrollBehavior","scroll","scrollHeight","behavior","scrollTop","content","handleSubmitButton","generateRenderedStepsById","previousSteps","lastStepIndex","_previousSteps$i","enableMobileAutoFocus","defaultUserSettings","renderedSteps","_this$state2","currentStep","isEnd","end","hideExtraControl","getTriggeredStep","handleEnd","ChatBot_extends","pop","nextStep","getStepMessage","updateStep","Random","focus","cache","storage","_previousSteps$i2","values","stepIndex","asMessage","lastStep","submitUserMessage","_this$state3","recognitionEnable","isInputValueEmpty","_this$state4","validator","checkInvalidInput","blur","_this$state5","toString","inputInvalid","toggleFloating","customStyle","custom_CustomStep","options_OptionsStep","text_TextStep","isFirstPosition","isLastPosition","setContentRef","setInputRef","_objectSpread","botDelay","botAvatar","customDelay","userAvatar","chatSteps","defaultBotSettings","userDelay","defaultCustomSettings","settings","firstStep","recognitionLang","onRecognitionChange","onRecognitionEnd","onRecognitionStop","document","documentElement","addEventListener","onNodeInserted","onResize","_storage$getData","params","callback","unParsedCache","getItem","renderedStep","_data$currentStep","removeItem","info","removeEventListener","customControl","_this3","_this$state6","contentStyle","extraControl","controlStyle","floatingIcon","footerStyle","headerComponent","headerTitle","hideHeader","hideSubmitButton","inputStyle","placeholder","inputAttributes","recognitionPlaceholder","submitButtonStyle","header","components_Header","components_HeaderTitle","components_HeaderIcon","toggleChatBot","icons_CloseIcon","icon","icons_MicIcon","icons_SubmitIcon","inputPlaceholder","inputAttributesOverride","components_FloatButton","components_FloatingIcon","components_ChatBotContainer","components_Content","ref","renderStep","components_Footer","components_Input","type","onKeyPress","handleKeyPress","onValueChange","components_SubmitButton","SpeechSynthesisVoice","position","icons_ChatIcon","__webpack_exports__"],"mappings":"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","file":"react-simple-chatbot.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"), require(\"styled-components\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\", \"styled-components\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactSimpleChatbot\"] = factory(require(\"react\"), require(\"styled-components\"));\n\telse\n\t\troot[\"ReactSimpleChatbot\"] = factory(root[\"react\"], root[\"styled-components\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__1__, __WEBPACK_EXTERNAL_MODULE__2__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"dist/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&\n Symbol.for &&\n Symbol.for('react.element')) ||\n 0xeac7;\n\n var isValidElement = function(object) {\n return typeof object === 'object' &&\n object !== null &&\n object.$$typeof === REACT_ELEMENT_TYPE;\n };\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(isValidElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1__;","module.exports = __WEBPACK_EXTERNAL_MODULE__2__;","var Flatted = (function (Primitive, primitive) {\n\n /*!\n * ISC License\n *\n * Copyright (c) 2018, Andrea Giammarchi, @WebReflection\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE\n * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n var Flatted = {\n\n parse: function parse(text, reviver) {\n var input = JSON.parse(text, Primitives).map(primitives);\n var value = input[0];\n var $ = reviver || noop;\n var tmp = typeof value === 'object' && value ?\n revive(input, new Set, value, $) :\n value;\n return $.call({'': tmp}, '', tmp);\n },\n\n stringify: function stringify(value, replacer, space) {\n for (var\n firstRun,\n known = new Map,\n input = [],\n output = [],\n $ = replacer && typeof replacer === typeof input ?\n function (k, v) {\n if (k === '' || -1 < replacer.indexOf(k)) return v;\n } :\n (replacer || noop),\n i = +set(known, input, $.call({'': value}, '', value)),\n replace = function (key, value) {\n if (firstRun) {\n firstRun = !firstRun;\n return value;\n // this was invoking twice each root object\n // return i < 1 ? value : $.call(this, key, value);\n }\n var after = $.call(this, key, value);\n switch (typeof after) {\n case 'object':\n if (after === null) return after;\n case primitive:\n return known.get(after) || set(known, input, after);\n }\n return after;\n };\n i < input.length; i++\n ) {\n firstRun = true;\n output[i] = JSON.stringify(input[i], replace, space);\n }\n return '[' + output.join(',') + ']';\n }\n\n };\n\n return Flatted;\n\n function noop(key, value) {\n return value;\n }\n\n function revive(input, parsed, output, $) {\n return Object.keys(output).reduce(\n function (output, key) {\n var value = output[key];\n if (value instanceof Primitive) {\n var tmp = input[value];\n if (typeof tmp === 'object' && !parsed.has(tmp)) {\n parsed.add(tmp);\n output[key] = $.call(output, key, revive(input, parsed, tmp, $));\n } else {\n output[key] = $.call(output, key, tmp);\n }\n } else\n output[key] = $.call(output, key, value);\n return output;\n },\n output\n );\n }\n\n function set(known, input, value) {\n var index = Primitive(input.push(value) - 1);\n known.set(value, index);\n return index;\n }\n\n // the two kinds of primitives\n // 1. the real one\n // 2. the wrapped one\n\n function primitives(value) {\n return value instanceof Primitive ? Primitive(value) : value;\n }\n\n function Primitives(key, value) {\n return typeof value === primitive ? new Primitive(value) : value;\n }\n\n}(String, 'string'));\nmodule.exports = Flatted;\n","(function(){\n\tvar randomID = function(len,pattern){\n\t\tvar possibilities = [\"abcdefghijklmnopqrstuvwxyz\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", \"0123456789\", \"~!@#$%^&()_+-={}[];\\',\"];\n\t\tvar chars = \"\";\n\n\t\tvar pattern = pattern ? pattern : \"aA0\";\n\t\tpattern.split('').forEach(function(a){\n\t\t\tif(!isNaN(parseInt(a))){\n\t\t\t\tchars += possibilities[2];\n\t\t\t}else if(/[a-z]/.test(a)){\n\t\t\t\tchars += possibilities[0];\n\t\t\t}else if(/[A-Z]/.test(a)){\n\t\t\t\tchars += possibilities[1];\n\t\t\t}else{\n\t\t\t\tchars += possibilities[3];\n\t\t\t}\n\t\t});\n\t\t\n\t\tvar len = len ? len : 30;\n\n\t\tvar result = '';\n\n\t\twhile(len--){ \n\t\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length)); \n\t\t};\n\n\t\treturn result;\n\t};\n\n\tif(typeof module !== \"undefined\" && typeof require !== \"undefined\"){\n\t\tmodule.exports = randomID;\n\t} else {\n\t\twindow[\"randomID\"] = randomID;\n\t};\n\n})();","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar invariant = require('fbjs/lib/invariant');\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n invariant(\n false,\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim\n };\n\n ReactPropTypes.checkPropTypes = emptyFunction;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nmodule.exports = invariant;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","const hexToRgb = hex => {\n // http://stackoverflow.com/a/5624139\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n }\n : null;\n};\n\n/**\n * Transform hex+alpha to rgba\n * @param {string} hex hex color code\n * @param {number} [alpha=1]\n * @returns {string} the rgba as string\n */\nconst rgba = (hex, alpha = 1) => {\n const color = hexToRgb(hex);\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${alpha})`;\n};\n\nexport default rgba;\n","import { keyframes } from 'styled-components';\nimport rgba from './rgba';\n\nconst loading = keyframes`\n 0% { opacity: .2; }\n 20% { opacity: 1; }\n 100% { opacity: .2; }\n`;\n\nconst scale = keyframes`\n 100% { transform: scale(1); }\n`;\n\nconst invalidInput = keyframes`\n 25% { transform: rotate(-1deg); }\n 100% { transform: rotate(1deg); }\n`;\n\nconst pulse = color => keyframes`\n 0% { box-shadow: 0 0 0 0 ${rgba(color, 0.4)}; }\n 70% { box-shadow: 0 0 0 10px ${rgba(color, 0)}; }\n 100% { box-shadow: 0 0 0 0 ${rgba(color, 0)}; }\n`;\n\nexport { loading, scale, invalidInput, pulse };\n","import styled from 'styled-components';\nimport { loading } from '../../common/animations';\n\nconst LoadingStep = styled.span`\n animation: ${loading} 1.4s infinite both;\n animation-delay: ${props => props.delay};\n`;\n\nexport default LoadingStep;\n","import React from 'react';\nimport LoadingStep from './LoadingStep';\n\nconst Loading = () => (\n \n .\n .\n .\n \n);\n\nexport default Loading;\n","import styled from 'styled-components';\n\nconst ChatStepContainer = styled.div`\n background: #fff;\n border-radius: 5px;\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n display: flex;\n justify-content: center;\n margin: 0 6px 10px 6px;\n padding: 16px;\n`;\n\nexport default ChatStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Loading from '../common/Loading';\nimport CustomStepContainer from './CustomStepContainer';\n\nclass CustomStep extends Component {\n state = {\n loading: true\n };\n\n componentDidMount() {\n const { speak, step, previousValue, triggerNextStep } = this.props;\n const { delay, waitAction } = step;\n\n setTimeout(() => {\n this.setState({ loading: false }, () => {\n if (!waitAction && !step.rendered) {\n triggerNextStep();\n }\n speak(step, previousValue);\n });\n }, delay);\n }\n\n renderComponent = () => {\n const { step, steps, previousStep, triggerNextStep } = this.props;\n const { component } = step;\n\n return React.cloneElement(component, {\n step,\n steps,\n previousStep,\n triggerNextStep\n });\n };\n\n render() {\n const { loading } = this.state;\n const { style } = this.props;\n\n return (\n \n {loading ? : this.renderComponent()}\n \n );\n }\n}\n\nCustomStep.propTypes = {\n previousStep: PropTypes.objectOf(PropTypes.any).isRequired,\n previousValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.number,\n PropTypes.object,\n PropTypes.array\n ]),\n speak: PropTypes.func,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n steps: PropTypes.objectOf(PropTypes.any).isRequired,\n style: PropTypes.objectOf(PropTypes.any).isRequired,\n triggerNextStep: PropTypes.func.isRequired\n};\nCustomStep.defaultProps = {\n previousValue: '',\n speak: () => {}\n};\n\nexport default CustomStep;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\n\nconst Option = styled.li`\n animation: ${scale} 0.3s ease forwards;\n cursor: pointer;\n display: inline-block;\n margin: 2px;\n transform: scale(0);\n`;\n\nexport default Option;\n","export default {\n background: '#f5f8fb',\n fontFamily: 'monospace',\n headerBgColor: '#6e48aa',\n headerFontColor: '#fff',\n headerFontSize: '16px',\n botBubbleColor: '#6E48AA',\n botFontColor: '#fff',\n userBubbleColor: '#fff',\n userFontColor: '#4a4a4a'\n};\n","import styled from 'styled-components';\nimport defaultTheme from '../../theme';\n\nconst OptionElement = styled.button`\n background: ${({ theme }) => theme.botBubbleColor};\n border: 0;\n border-radius: 22px;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);\n color: ${({ theme }) => theme.botFontColor};\n display: inline-block;\n font-size: 14px;\n padding: 12px;\n\n &:hover {\n opacity: 0.7;\n }\n &:active,\n &:hover:focus {\n outline:none;\n }\n`;\n\nOptionElement.defaultProps = {\n theme: defaultTheme\n};\n\nexport default OptionElement;\n","import styled from 'styled-components';\n\nconst Options = styled.ul`\n margin: 2px 0 12px 0;\n padding: 0 6px;\n`;\n\nexport default Options;\n","import styled from 'styled-components';\n\nconst OptionsStepContainer = styled.div``;\n\nexport default OptionsStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Option from './Option';\nimport OptionElement from './OptionElement';\nimport Options from './Options';\nimport OptionsStepContainer from './OptionsStepContainer';\n\nclass OptionsStep extends Component {\n onOptionClick = ({ value }) => {\n const { triggerNextStep } = this.props;\n\n triggerNextStep({ value });\n };\n\n renderOption = option => {\n const { bubbleOptionStyle, step } = this.props;\n const { user } = step;\n const { value, label } = option;\n\n return (\n \n );\n };\n\n render() {\n const { step } = this.props;\n const { options } = step;\n\n return (\n \n \n {Object.keys(options).map(key => options[key]).map(this.renderOption)}\n \n \n );\n }\n}\n\nOptionsStep.propTypes = {\n bubbleOptionStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n triggerNextStep: PropTypes.func.isRequired\n};\n\nexport default OptionsStep;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\nimport defaultTheme from '../../theme';\n\nconst Bubble = styled.div`\n animation: ${scale} 0.3s ease forwards;\n background: ${props => (props.user ? props.theme.userBubbleColor : props.theme.botBubbleColor)};\n border-radius: ${props => {\n const { isFirst, isLast, user } = props;\n\n if (!isFirst && !isLast) {\n return user ? '18px 0 0 18px' : '0 18px 18px 0px';\n }\n\n if (!isFirst && isLast) {\n return user ? '18px 0 18px 18px' : '0 18px 18px 18px';\n }\n\n return props.user ? '18px 18px 0 18px' : '18px 18px 18px 0';\n }};\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);\n color: ${props => (props.user ? props.theme.userFontColor : props.theme.botFontColor)};\n display: inline-block;\n font-size: 14px;\n max-width: 50%;\n margin: ${props => {\n const { isFirst, showAvatar, user } = props;\n\n if (!isFirst && showAvatar) {\n return user ? '-8px 46px 10px 0' : '-8px 0 10px 46px';\n }\n\n if (!isFirst && !showAvatar) {\n return user ? '-8px 0px 10px 0' : '-8px 0 10px 0px';\n }\n\n return '0 0 10px 0';\n }};\n overflow: hidden;\n position: relative;\n padding: 12px;\n transform: scale(0);\n transform-origin: ${props => {\n const { isFirst, user } = props;\n\n if (isFirst) {\n return user ? 'bottom right' : 'bottom left';\n }\n\n return user ? 'top right' : 'top left';\n }};\n`;\n\nBubble.defaultProps = {\n theme: defaultTheme\n};\n\nexport default Bubble;\n","import styled from 'styled-components';\nimport { scale } from '../../common/animations';\n\nconst Image = styled.img`\n animation: ${scale} 0.3s ease forwards;\n border-radius: ${props => (props.user ? '50% 50% 50% 0' : '50% 50% 0 50%')};\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 2px 0px;\n height: 40px;\n min-width: 40px;\n padding: 3px;\n transform: scale(0);\n transform-origin: ${props => (props.user ? 'bottom left' : 'bottom right')};\n width: 40;\n`;\n\nexport default Image;\n","import styled from 'styled-components';\n\nconst ImageContainer = styled.div`\n display: inline-block;\n order: ${props => (props.user ? '1' : '0')};\n padding: 6px;\n`;\n\nexport default ImageContainer;\n","import styled from 'styled-components';\n\nconst TextStepContainer = styled.div`\n align-items: flex-end;\n display: flex;\n justify-content: ${props => (props.user ? 'flex-end' : 'flex-start')};\n`;\n\nexport default TextStepContainer;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Bubble from './Bubble';\nimport Image from './Image';\nimport ImageContainer from './ImageContainer';\nimport Loading from '../common/Loading';\nimport TextStepContainer from './TextStepContainer';\n\nclass TextStep extends Component {\n /* istanbul ignore next */\n state = {\n loading: true\n };\n\n componentDidMount() {\n const { step, speak, previousValue, triggerNextStep } = this.props;\n const { component, delay, waitAction } = step;\n const isComponentWatingUser = component && waitAction;\n\n setTimeout(() => {\n this.setState({ loading: false }, () => {\n if (!isComponentWatingUser && !step.rendered) {\n triggerNextStep();\n }\n speak(step, previousValue);\n });\n }, delay);\n }\n\n getMessage = () => {\n const { previousValue, step } = this.props;\n const { message } = step;\n\n return message ? message.replace(/{previousValue}/g, previousValue) : '';\n };\n\n renderMessage = () => {\n const { step, steps, previousStep, triggerNextStep } = this.props;\n const { component } = step;\n\n if (component) {\n return React.cloneElement(component, {\n step,\n steps,\n previousStep,\n triggerNextStep\n });\n }\n\n return this.getMessage();\n };\n\n render() {\n const {\n step,\n isFirst,\n isLast,\n avatarStyle,\n bubbleStyle,\n hideBotAvatar,\n hideUserAvatar\n } = this.props;\n const { loading } = this.state;\n const { avatar, user, botName } = step;\n\n const showAvatar = user ? !hideUserAvatar : !hideBotAvatar;\n\n const imageAltText = user ? \"Your avatar\" : `${botName}'s avatar`;\n\n return (\n \n \n {isFirst && showAvatar && (\n \n )}\n \n \n {loading ? : this.renderMessage()}\n \n \n );\n }\n}\n\nTextStep.propTypes = {\n avatarStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n isFirst: PropTypes.bool.isRequired,\n isLast: PropTypes.bool.isRequired,\n bubbleStyle: PropTypes.objectOf(PropTypes.any).isRequired,\n hideBotAvatar: PropTypes.bool.isRequired,\n hideUserAvatar: PropTypes.bool.isRequired,\n previousStep: PropTypes.objectOf(PropTypes.any),\n previousValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.number,\n PropTypes.object,\n PropTypes.array\n ]),\n speak: PropTypes.func,\n step: PropTypes.objectOf(PropTypes.any).isRequired,\n steps: PropTypes.objectOf(PropTypes.any),\n triggerNextStep: PropTypes.func.isRequired\n};\n\nTextStep.defaultProps = {\n previousStep: {},\n previousValue: '',\n speak: () => {},\n steps: {}\n};\n\nexport default TextStep;\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'user',\n types: ['boolean'],\n required: true\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'validator',\n types: ['function'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'message',\n types: ['string', 'function'],\n required: true\n },\n {\n key: 'avatar',\n types: ['string'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'delay',\n types: ['number'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'options',\n types: ['object'],\n required: true\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'component',\n types: ['any'],\n required: true\n },\n {\n key: 'avatar',\n types: ['string'],\n required: false\n },\n {\n key: 'replace',\n types: ['boolean'],\n required: false\n },\n {\n key: 'waitAction',\n types: ['boolean'],\n required: false\n },\n {\n key: 'asMessage',\n types: ['boolean'],\n required: false\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: false\n },\n {\n key: 'delay',\n types: ['number'],\n required: false\n },\n {\n key: 'end',\n types: ['boolean'],\n required: false\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'hideInput',\n types: ['boolean'],\n required: false\n },\n {\n key: 'hideExtraControl',\n types: ['boolean'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","export default [\n {\n key: 'id',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'update',\n types: ['string', 'number'],\n required: true\n },\n {\n key: 'trigger',\n types: ['string', 'number', 'function'],\n required: true\n },\n {\n key: 'placeholder',\n types: ['string'],\n required: false\n },\n {\n key: 'inputAttributes',\n types: ['object'],\n required: false\n },\n {\n key: 'metadata',\n types: ['object'],\n required: false\n }\n];\n","import userSchema from './userSchema';\nimport textSchema from './textSchema';\nimport optionsSchema from './optionsSchema';\nimport customSchema from './customSchema';\nimport updateSchema from './updateSchema';\nimport { stringify } from 'flatted/cjs';\n\nconst schema = {\n parse(step) {\n let parser = [];\n\n if (step.user) {\n parser = userSchema;\n } else if (step.message) {\n parser = textSchema;\n } else if (step.options) {\n parser = optionsSchema;\n } else if (step.component) {\n parser = customSchema;\n } else if (step.update) {\n parser = updateSchema;\n } else {\n throw new Error(`The step ${stringify(step)} is invalid`);\n }\n\n for (let i = 0, len = parser.length; i < len; i += 1) {\n const { key, types, required } = parser[i];\n\n if (!step[key] && required) {\n throw new Error(`Key '${key}' is required in step ${stringify(step)}`);\n } else if (step[key]) {\n if (types[0] !== 'any' && types.indexOf(typeof step[key]) < 0) {\n throw new Error(\n `The type of '${key}' value must be ${types.join(' or ')} instead of ${typeof step[\n key\n ]}`\n );\n }\n }\n }\n\n const keys = parser.map(p => p.key);\n\n for (const key in step) {\n if (keys.indexOf(key) < 0) {\n console.error(`Invalid key '${key}' in step '${step.id}'`);\n delete step[key];\n }\n }\n\n return step;\n },\n\n checkInvalidIds(steps) {\n for (const key in steps) {\n const step = steps[key];\n const triggerId = steps[key].trigger;\n\n if (typeof triggerId !== 'function') {\n if (step.options) {\n const triggers = step.options.filter(option => typeof option.trigger !== 'function');\n const optionsTriggerIds = triggers.map(option => option.trigger);\n\n for (let i = 0, len = optionsTriggerIds.length; i < len; i += 1) {\n const optionTriggerId = optionsTriggerIds[i];\n if (optionTriggerId && !steps[optionTriggerId]) {\n throw new Error(\n `The id '${optionTriggerId}' triggered by option ${i + 1} in step '${\n steps[key].id\n }' does not exist`\n );\n }\n }\n } else if (triggerId && !steps[triggerId]) {\n throw new Error(\n `The id '${triggerId}' triggered by step '${steps[key].id}' does not exist`\n );\n }\n }\n }\n }\n};\n\nexport default schema;\n","import { stringify, parse } from 'flatted/cjs'\n\n/* istanbul ignore next */\nconst getData = (params, callback) => {\n const { cacheName, cache, firstStep, steps } = params;\n const currentStep = firstStep;\n const renderedSteps = [steps[currentStep.id]];\n const previousSteps = [steps[currentStep.id]];\n const previousStep = {};\n const unParsedCache = localStorage.getItem(cacheName);\n\n if (cache && unParsedCache) {\n try {\n const data = parse(unParsedCache);\n const lastStep = data.renderedSteps[data.renderedSteps.length - 1];\n\n if (lastStep && lastStep.end) {\n localStorage.removeItem(cacheName);\n } else {\n for (let i = 0, len = data.renderedSteps.length; i < len; i += 1) {\n const renderedStep = data.renderedSteps[i];\n // remove delay of cached rendered steps\n data.renderedSteps[i].delay = 0;\n // flag used to avoid call triggerNextStep in cached rendered steps\n data.renderedSteps[i].rendered = true;\n\n // an error is thrown when render a component from localStorage.\n // So it's necessary reassing the component\n if (renderedStep.component) {\n const { id } = renderedStep;\n data.renderedSteps[i].component = steps[id].component;\n }\n }\n\n const { trigger, end, options } = data.currentStep;\n const { id } = data.currentStep;\n\n if (options) {\n delete data.currentStep.rendered;\n }\n\n // add trigger function to current step\n if (!trigger && !end) {\n if (options) {\n for (let i = 0; i < options.length; i += 1) {\n data.currentStep.options[i].trigger = steps[id].options[i].trigger;\n }\n } else {\n data.currentStep.trigger = steps[id].trigger;\n }\n }\n\n // execute callback function to enable input if last step is\n // waiting user type\n if (data.currentStep.user) {\n callback();\n }\n\n return data;\n }\n } catch (error) {\n console.info(`Unable to parse cache named:${cacheName}. \\nThe cache where probably created with an older version of react-simple-chatbot.\\n`, error);\n }\n }\n\n return {\n currentStep,\n previousStep,\n previousSteps,\n renderedSteps\n };\n};\n\n/* istanbul ignore next */\nconst setData = (cacheName, cachedData) => {\n const data = parse(stringify(cachedData));\n // clean components\n for (const key in data) {\n for (let i = 0, len = data[key].length; i < len; i += 1) {\n if (data[key][i].component) {\n data[key][i].component = data[key][i].id;\n }\n }\n }\n\n localStorage.setItem(cacheName, stringify(data));\n};\n\nexport { getData, setData };\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst ChatBotContainer = styled.div`\n background: ${({ theme }) => theme.background};\n border-radius: 10px;\n box-shadow: 0 12px 24px 0 rgba(0, 0, 0, 0.15);\n font-family: ${({ theme }) => theme.fontFamily};\n overflow: hidden;\n position: ${({ floating }) => (floating ? 'fixed' : 'relative')};\n bottom: ${({ floating, floatingStyle }) =>\n floating ? floatingStyle.bottom || '32px' : 'initial'};\n top: ${({ floating, floatingStyle }) => (floating ? floatingStyle.top || 'initial' : 'initial')};\n right: ${({ floating, floatingStyle }) => (floating ? floatingStyle.right || '32px' : 'initial')};\n left: ${({ floating, floatingStyle }) =>\n floating ? floatingStyle.left || 'initial' : 'initial'};\n width: ${({ width }) => width};\n height: ${({ height }) => height};\n z-index: 999;\n transform: ${({ opened }) => (opened ? 'scale(1)' : 'scale(0)')};\n transform-origin: ${({ floatingStyle }) => floatingStyle.transformOrigin || 'bottom right'};\n transition: transform 0.3s ease;\n\n @media screen and (max-width: 568px) {\n border-radius: ${({ floating }) => (floating ? '0' : '')};\n bottom: 0 !important;\n left: initial !important;\n height: 100%;\n right: 0 !important;\n top: initial !important;\n width: 100%;\n }\n`;\n\nChatBotContainer.defaultProps = {\n theme: defaultTheme\n};\n\nexport default ChatBotContainer;\n","import styled from 'styled-components';\n\nconst Content = styled.div`\n height: calc(${props => props.height} - ${props => (props.hideInput ? '56px' : '112px')});\n overflow-y: scroll;\n margin-top: 2px;\n padding-top: 6px;\n\n @media screen and (max-width: 568px) {\n height: ${props => (props.floating ? 'calc(100% - 112px)' : '')};\n }\n`;\n\nexport default Content;\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst Header = styled.div`\n align-items: center;\n background: ${({ theme }) => theme.headerBgColor};\n color: ${({ theme }) => theme.headerFontColor};\n display: flex;\n fill: ${({ theme }) => theme.headerFontColor};\n height: 56px;\n justify-content: space-between;\n padding: 0 10px;\n`;\n\nHeader.defaultProps = {\n theme: defaultTheme\n};\n\nexport default Header;\n","import styled from 'styled-components';\nimport defaultTheme from '../theme';\n\nconst HeaderTitle = styled.h2`\n margin: 0;\n font-size: ${({ theme }) => theme.headerFontSize};\n`;\n\nHeaderTitle.defaultProps = {\n theme: defaultTheme\n};\n\nexport default HeaderTitle;\n","import styled from 'styled-components';\n\nconst HeaderIcon = styled.a`\n cursor: pointer;\n`;\n\nexport default HeaderIcon;\n","import styled from 'styled-components';\n\nconst FloatButton = styled.a`\n align-items: center;\n cursor: pointer;\n background: ${({ theme }) => theme.headerBgColor};\n bottom: 32px;\n border-radius: 100%;\n box-shadow: 0 12px 24px 0 rgba(0, 0, 0, 0.15);\n display: flex;\n fill: ${({ theme }) => theme.headerFontColor};\n height: 56px;\n justify-content: center;\n position: fixed;\n right: 32px;\n transform: ${props => (props.opened ? 'scale(0)' : 'scale(1)')};\n transition: transform 0.3s ease;\n width: 56px;\n z-index: 999;\n`;\n\nFloatButton.defaultProps = {\n theme: {\n headerBgColor: '#6e48aa',\n headerFontColor: '#fff'\n }\n};\n\nexport default FloatButton;\n","import styled from 'styled-components';\n\nconst FloatingIcon = styled.img`\n height: 24px;\n width: 24px;\n`;\n\nexport default FloatingIcon;\n","import styled from 'styled-components';\n\nconst Footer = styled.div`\n position: relative;\n`;\n\nexport default Footer;\n","import { invalidInput } from '../common/animations';\nimport styled, { css } from 'styled-components';\n\nconst Input = styled.input`\n animation: ${props =>\n props.invalid\n ? css`\n ${invalidInput} .2s ease\n `\n : ''};\n border: 0;\n border-radius: 0;\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n border-top: ${props => (props.invalid ? '0' : '1px solid #eee')};\n box-shadow: ${props => (props.invalid ? 'inset 0 0 2px #E53935' : 'none')};\n box-sizing: border-box;\n color: ${props => (props.invalid ? '#E53935' : '')};\n font-size: 16px;\n opacity: ${props => (props.disabled && !props.invalid ? '.5' : '1')};\n outline: none;\n padding: ${props => (props.hasButton ? '16px 52px 16px 10px' : '16px 10px')};\n width: 100%;\n -webkit-appearance: none;\n\n &:disabled {\n background: #fff;\n }\n\n @media screen and (max-width: 568px) {\n border-bottom-left-radius: ${props => (props.floating ? '0' : '10px')};\n border-bottom-right-radius: ${props => (props.floating ? '0' : '10px')};\n }\n`;\n\nexport default Input;\n","import styled, { css } from 'styled-components';\nimport defaultTheme from '../theme';\nimport { pulse } from '../common/animations';\n\nconst fillFunc = props => {\n const { speaking, invalid, theme } = props;\n\n if (speaking) {\n return theme.headerBgColor;\n }\n return invalid ? '#E53935' : '#4a4a4a';\n};\n\nconst SubmitButton = styled.button`\n background-color: transparent;\n border: 0;\n border-bottom-right-radius: 10px;\n box-shadow: none;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n fill: ${fillFunc};\n opacity: ${props => (props.disabled && !props.invalid ? '.5' : '1')};\n outline: none;\n padding: 14px 16px 12px 16px;\n &:before {\n content: '';\n position: absolute;\n width: 23px;\n height: 23px;\n border-radius: 50%;\n animation: ${({ theme, speaking }) =>\n speaking\n ? css`\n ${pulse(theme.headerBgColor)} 2s ease infinite\n `\n : ''};\n }\n &:not(:disabled):hover {\n opacity: 0.7;\n }\n`;\n\nSubmitButton.defaultProps = {\n theme: defaultTheme\n};\n\nexport default SubmitButton;\n","let instance = null;\n\nconst noop = () => {};\n\nexport default class Recognition {\n static isSupported() {\n return 'webkitSpeechRecognition' in window;\n }\n\n /**\n * Creates an instance of Recognition.\n * @param {function} [onChange] callback on change\n * @param {function} [onEnd] callback on and\n * @param {function} [onStop] callback on stop\n * @param {string} [lang='en'] recognition lang\n * @memberof Recognition\n * @constructor\n */\n constructor(onChange = noop, onEnd = noop, onStop = noop, lang = 'en') {\n if (!instance) {\n instance = this;\n }\n this.state = {\n inputValue: '',\n lang,\n onChange,\n onEnd,\n onStop\n };\n\n this.onResult = this.onResult.bind(this);\n this.onEnd = this.onEnd.bind(this);\n\n this.setup();\n\n return instance;\n }\n\n /**\n * Handler for recognition change event\n * @param {string} interimTranscript\n * @memberof Recognition\n * @private\n */\n onChange(interimTranscript) {\n const { onChange } = this.state;\n this.setState({\n inputValue: interimTranscript\n });\n onChange(interimTranscript);\n }\n\n /**\n * Handler for recognition change event when its final\n * @param {string} finalTranscript\n * @memberof Recognition\n * @private\n */\n onFinal(finalTranscript) {\n this.setState({\n inputValue: finalTranscript\n });\n this.recognition.stop();\n }\n\n /**\n * Handler for recognition end event\n * @memberof Recognition\n * @private\n */\n onEnd() {\n const { onStop, onEnd, force } = this.state;\n this.setState({ speaking: false });\n if (force) {\n onStop();\n } else {\n onEnd();\n }\n }\n\n /**\n * Handler for recognition result event\n * @memberof Recognition\n * @private\n */\n onResult(event) {\n let interimTranscript = '';\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i += 1) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n this.onFinal(finalTranscript);\n } else {\n interimTranscript += event.results[i][0].transcript;\n this.onChange(interimTranscript);\n }\n }\n }\n\n /**\n * method for updating the instance state\n * @param {object} nextState\n * @memberof Recognition\n * @private\n */\n setState(nextState) {\n this.state = Object.assign({}, this.state, nextState);\n }\n\n /**\n * setup the browser recognition\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n setup() {\n if (!Recognition.isSupported()) {\n return this;\n }\n\n const { webkitSpeechRecognition } = window;\n\n this.recognition = new webkitSpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n this.recognition.lang = this.state.lang;\n this.recognition.onresult = this.onResult;\n this.recognition.onend = this.onEnd;\n return this;\n }\n\n /**\n * change the recognition lang and resetup\n * @param {string} lang the new lang\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n setLang(lang) {\n this.setState({ lang });\n this.setup();\n return this;\n }\n\n /**\n * toggle the recognition\n * @returns {Recognition}\n * @memberof Recognition\n * @public\n */\n speak() {\n if (!Recognition.isSupported()) {\n return this;\n }\n const { speaking } = this.state;\n if (!speaking) {\n this.recognition.start();\n this.setState({\n speaking: true,\n inputValue: ''\n });\n } else {\n this.setState({\n force: true\n });\n this.recognition.stop();\n }\n return this;\n }\n}\n","import React from 'react';\n\nconst ChatIcon = () => (\n \n \n \n \n);\n\nexport default ChatIcon;\n","import React from 'react';\n\nconst CloseIcon = () => (\n \n \n \n \n);\n\nexport default CloseIcon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SubmitIcon = ({ size }) => (\n \n \n \n \n \n \n \n);\n\nSubmitIcon.propTypes = {\n size: PropTypes.number\n};\n\nSubmitIcon.defaultProps = {\n size: 20\n};\n\nexport default SubmitIcon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst MicIcon = ({ size }) => (\n \n \n \n \n \n \n);\n\nMicIcon.propTypes = {\n size: PropTypes.number\n};\n\nMicIcon.defaultProps = {\n size: 20\n};\n\nexport default MicIcon;\n","export const isMobile = () => /iphone|ipod|android|ie|blackberry|fennec/i.test(navigator.userAgent);\n\nexport const isString = value => typeof value === 'string';\n","import { isString } from './utils';\n\nexport const getSpeakText = step => {\n const { message, metadata = {} } = step;\n if (isString(metadata.speak)) {\n return metadata.speak;\n }\n if (isString(message)) {\n return message;\n }\n return '';\n};\n\nexport const speakFn = speechSynthesisOptions => (step, previousValue) => {\n const { lang, voice, enable } = speechSynthesisOptions;\n const { user } = step;\n\n if (!window.SpeechSynthesisUtterance || !window.speechSynthesis) {\n return;\n }\n if (user) {\n return;\n }\n if (!enable) {\n return;\n }\n const text = getSpeakText(step);\n const msg = new window.SpeechSynthesisUtterance();\n msg.text = text.replace(/{previousValue}/g, previousValue);\n msg.lang = lang;\n msg.voice = voice;\n window.speechSynthesis.speak(msg);\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Random from 'random-id';\nimport { CustomStep, OptionsStep, TextStep } from './steps_components';\nimport schema from './schemas/schema';\nimport * as storage from './storage';\nimport {\n ChatBotContainer,\n Content,\n Header,\n HeaderTitle,\n HeaderIcon,\n FloatButton,\n FloatingIcon,\n Footer,\n Input,\n SubmitButton\n} from './components';\nimport Recognition from './recognition';\nimport { ChatIcon, CloseIcon, SubmitIcon, MicIcon } from './icons';\nimport { isMobile } from './utils';\nimport { speakFn } from './speechSynthesis';\n\nclass ChatBot extends Component {\n /* istanbul ignore next */\n constructor(props) {\n super(props);\n\n this.content = null;\n this.input = null;\n\n this.supportsScrollBehavior = false;\n\n this.setContentRef = element => {\n this.content = element;\n };\n\n this.setInputRef = element => {\n this.input = element;\n };\n\n this.state = {\n renderedSteps: [],\n previousSteps: [],\n currentStep: {},\n previousStep: {},\n steps: {},\n disabled: true,\n opened: props.opened || !props.floating,\n inputValue: '',\n inputInvalid: false,\n speaking: false,\n recognitionEnable: props.recognitionEnable && Recognition.isSupported(),\n defaultUserSettings: {}\n };\n\n this.speak = speakFn(props.speechSynthesis);\n }\n\n componentDidMount() {\n const { steps } = this.props;\n const {\n botDelay,\n botAvatar,\n botName,\n cache,\n cacheName,\n customDelay,\n enableMobileAutoFocus,\n userAvatar,\n userDelay\n } = this.props;\n const chatSteps = {};\n\n const defaultBotSettings = { delay: botDelay, avatar: botAvatar, botName };\n const defaultUserSettings = {\n delay: userDelay,\n avatar: userAvatar,\n hideInput: false,\n hideExtraControl: false\n };\n const defaultCustomSettings = { delay: customDelay };\n\n for (let i = 0, len = steps.length; i < len; i += 1) {\n const step = steps[i];\n let settings = {};\n\n if (step.user) {\n settings = defaultUserSettings;\n } else if (step.message || step.asMessage) {\n settings = defaultBotSettings;\n } else if (step.component) {\n settings = defaultCustomSettings;\n }\n\n chatSteps[step.id] = Object.assign({}, settings, schema.parse(step));\n }\n\n schema.checkInvalidIds(chatSteps);\n\n const firstStep = steps[0];\n\n if (firstStep.message) {\n const { message } = firstStep;\n firstStep.message = typeof message === 'function' ? message() : message;\n chatSteps[firstStep.id].message = firstStep.message;\n }\n\n const { recognitionEnable } = this.state;\n const { recognitionLang } = this.props;\n\n if (recognitionEnable) {\n this.recognition = new Recognition(\n this.onRecognitionChange,\n this.onRecognitionEnd,\n this.onRecognitionStop,\n recognitionLang\n );\n }\n\n this.supportsScrollBehavior = 'scrollBehavior' in document.documentElement.style;\n\n if (this.content) {\n this.content.addEventListener('DOMNodeInserted', this.onNodeInserted);\n window.addEventListener('resize', this.onResize);\n }\n\n const { currentStep, previousStep, previousSteps, renderedSteps } = storage.getData(\n {\n cacheName,\n cache,\n firstStep,\n steps: chatSteps\n },\n () => {\n // focus input if last step cached is a user step\n this.setState({ disabled: false }, () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n });\n }\n );\n\n this.setState({\n currentStep,\n defaultUserSettings,\n previousStep,\n previousSteps,\n renderedSteps,\n steps: chatSteps\n });\n }\n\n static getDerivedStateFromProps(props, state) {\n const { opened, toggleFloating } = props;\n if (toggleFloating !== undefined && opened !== undefined && opened !== state.opened) {\n return {\n ...state,\n opened\n };\n }\n return state;\n }\n\n componentWillUnmount() {\n if (this.content) {\n this.content.removeEventListener('DOMNodeInserted', this.onNodeInserted);\n window.removeEventListener('resize', this.onResize);\n }\n }\n\n onNodeInserted = event => {\n const { currentTarget: target } = event;\n const { enableSmoothScroll } = this.props;\n\n if (enableSmoothScroll && this.supportsScrollBehavior) {\n target.scroll({\n top: target.scrollHeight,\n left: 0,\n behavior: 'smooth'\n });\n } else {\n target.scrollTop = target.scrollHeight;\n }\n };\n\n onResize = () => {\n this.content.scrollTop = this.content.scrollHeight;\n };\n\n onRecognitionChange = value => {\n this.setState({ inputValue: value });\n };\n\n onRecognitionEnd = () => {\n this.setState({ speaking: false });\n this.handleSubmitButton();\n };\n\n onRecognitionStop = () => {\n this.setState({ speaking: false });\n };\n\n onValueChange = event => {\n this.setState({ inputValue: event.target.value });\n };\n\n getTriggeredStep = (trigger, value) => {\n const steps = this.generateRenderedStepsById();\n return typeof trigger === 'function' ? trigger({ value, steps }) : trigger;\n };\n\n getStepMessage = message => {\n const { previousSteps } = this.state;\n const lastStepIndex = previousSteps.length > 0 ? previousSteps.length - 1 : 0;\n const steps = this.generateRenderedStepsById();\n const previousValue = previousSteps[lastStepIndex].value;\n return typeof message === 'function' ? message({ previousValue, steps }) : message;\n };\n\n generateRenderedStepsById = () => {\n const { previousSteps } = this.state;\n const steps = {};\n\n for (let i = 0, len = previousSteps.length; i < len; i += 1) {\n const { id, message, value, metadata } = previousSteps[i];\n\n steps[id] = {\n id,\n message,\n value,\n metadata\n };\n }\n\n return steps;\n };\n\n triggerNextStep = data => {\n const { enableMobileAutoFocus } = this.props;\n const { defaultUserSettings, previousSteps, renderedSteps, steps } = this.state;\n\n let { currentStep, previousStep } = this.state;\n const isEnd = currentStep.end;\n\n if (data && data.value) {\n currentStep.value = data.value;\n }\n if (data && data.hideInput) {\n currentStep.hideInput = data.hideInput;\n }\n if (data && data.hideExtraControl) {\n currentStep.hideExtraControl = data.hideExtraControl;\n }\n if (data && data.trigger) {\n currentStep.trigger = this.getTriggeredStep(data.trigger, data.value);\n }\n\n if (isEnd) {\n this.handleEnd();\n } else if (currentStep.options && data) {\n const option = currentStep.options.filter(o => o.value === data.value)[0];\n const trigger = this.getTriggeredStep(option.trigger, currentStep.value);\n delete currentStep.options;\n\n // replace choose option for user message\n currentStep = Object.assign({}, currentStep, option, defaultUserSettings, {\n user: true,\n message: option.label,\n trigger\n });\n\n renderedSteps.pop();\n previousSteps.pop();\n renderedSteps.push(currentStep);\n previousSteps.push(currentStep);\n\n this.setState({\n currentStep,\n renderedSteps,\n previousSteps\n });\n } else if (currentStep.trigger) {\n if (currentStep.replace) {\n renderedSteps.pop();\n }\n\n const trigger = this.getTriggeredStep(currentStep.trigger, currentStep.value);\n let nextStep = Object.assign({}, steps[trigger]);\n\n if (nextStep.message) {\n nextStep.message = this.getStepMessage(nextStep.message);\n } else if (nextStep.update) {\n const updateStep = nextStep;\n nextStep = Object.assign({}, steps[updateStep.update]);\n\n if (nextStep.options) {\n for (let i = 0, len = nextStep.options.length; i < len; i += 1) {\n nextStep.options[i].trigger = updateStep.trigger;\n }\n } else {\n nextStep.trigger = updateStep.trigger;\n }\n }\n\n nextStep.key = Random(24);\n\n previousStep = currentStep;\n currentStep = nextStep;\n\n this.setState({ renderedSteps, currentStep, previousStep }, () => {\n if (nextStep.user) {\n this.setState({ disabled: false }, () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n });\n } else {\n renderedSteps.push(nextStep);\n previousSteps.push(nextStep);\n\n this.setState({ renderedSteps, previousSteps });\n }\n });\n }\n\n const { cache, cacheName } = this.props;\n if (cache) {\n setTimeout(() => {\n storage.setData(cacheName, {\n currentStep,\n previousStep,\n previousSteps,\n renderedSteps\n });\n }, 300);\n }\n };\n\n handleEnd = () => {\n const { handleEnd } = this.props;\n\n if (handleEnd) {\n const { previousSteps } = this.state;\n\n const renderedSteps = previousSteps.map(step => {\n const { id, message, value, metadata } = step;\n\n return {\n id,\n message,\n value,\n metadata\n };\n });\n\n const steps = [];\n\n for (let i = 0, len = previousSteps.length; i < len; i += 1) {\n const { id, message, value, metadata } = previousSteps[i];\n\n steps[id] = {\n id,\n message,\n value,\n metadata\n };\n }\n\n const values = previousSteps.filter(step => step.value).map(step => step.value);\n\n handleEnd({ renderedSteps, steps, values });\n }\n };\n\n isInputValueEmpty = () => {\n const { inputValue } = this.state;\n return !inputValue || inputValue.length === 0;\n };\n\n isLastPosition = step => {\n const { renderedSteps } = this.state;\n const { length } = renderedSteps;\n const stepIndex = renderedSteps.map(s => s.key).indexOf(step.key);\n\n if (length <= 1 || stepIndex + 1 === length) {\n return true;\n }\n\n const nextStep = renderedSteps[stepIndex + 1];\n const hasMessage = nextStep.message || nextStep.asMessage;\n\n if (!hasMessage) {\n return true;\n }\n\n const isLast = step.user !== nextStep.user;\n return isLast;\n };\n\n isFirstPosition = step => {\n const { renderedSteps } = this.state;\n const stepIndex = renderedSteps.map(s => s.key).indexOf(step.key);\n\n if (stepIndex === 0) {\n return true;\n }\n\n const lastStep = renderedSteps[stepIndex - 1];\n const hasMessage = lastStep.message || lastStep.asMessage;\n\n if (!hasMessage) {\n return true;\n }\n\n const isFirst = step.user !== lastStep.user;\n return isFirst;\n };\n\n handleKeyPress = event => {\n if (event.key === 'Enter') {\n this.submitUserMessage();\n }\n };\n\n handleSubmitButton = () => {\n const { speaking, recognitionEnable } = this.state;\n\n if ((this.isInputValueEmpty() || speaking) && recognitionEnable) {\n this.recognition.speak();\n if (!speaking) {\n this.setState({ speaking: true });\n }\n return;\n }\n\n this.submitUserMessage();\n };\n\n submitUserMessage = () => {\n const { defaultUserSettings, inputValue, previousSteps, renderedSteps } = this.state;\n let { currentStep } = this.state;\n\n const isInvalid = currentStep.validator && this.checkInvalidInput();\n\n if (!isInvalid) {\n const step = {\n message: inputValue,\n value: inputValue\n };\n\n currentStep = Object.assign({}, defaultUserSettings, currentStep, step);\n\n renderedSteps.push(currentStep);\n previousSteps.push(currentStep);\n\n this.setState(\n {\n currentStep,\n renderedSteps,\n previousSteps,\n disabled: true,\n inputValue: ''\n },\n () => {\n if (this.input) {\n this.input.blur();\n }\n }\n );\n }\n };\n\n checkInvalidInput = () => {\n const { enableMobileAutoFocus } = this.props;\n const { currentStep, inputValue } = this.state;\n const result = currentStep.validator(inputValue);\n const value = inputValue;\n\n if (typeof result !== 'boolean' || !result) {\n this.setState(\n {\n inputValue: result.toString(),\n inputInvalid: true,\n disabled: true\n },\n () => {\n setTimeout(() => {\n this.setState(\n {\n inputValue: value,\n inputInvalid: false,\n disabled: false\n },\n () => {\n if (enableMobileAutoFocus || !isMobile()) {\n if (this.input) {\n this.input.focus();\n }\n }\n }\n );\n }, 2000);\n }\n );\n\n return true;\n }\n\n return false;\n };\n\n toggleChatBot = opened => {\n const { toggleFloating } = this.props;\n\n if (toggleFloating) {\n toggleFloating({ opened });\n } else {\n this.setState({ opened });\n }\n };\n\n renderStep = (step, index) => {\n const { renderedSteps } = this.state;\n const {\n avatarStyle,\n bubbleStyle,\n bubbleOptionStyle,\n customStyle,\n hideBotAvatar,\n hideUserAvatar,\n speechSynthesis\n } = this.props;\n const { options, component, asMessage } = step;\n const steps = this.generateRenderedStepsById();\n const previousStep = index > 0 ? renderedSteps[index - 1] : {};\n\n if (component && !asMessage) {\n return (\n \n );\n }\n\n if (options) {\n return (\n \n );\n }\n\n return (\n \n );\n };\n\n render() {\n const {\n currentStep,\n disabled,\n inputInvalid,\n inputValue,\n opened,\n renderedSteps,\n speaking,\n recognitionEnable\n } = this.state;\n const {\n className,\n contentStyle,\n extraControl,\n controlStyle,\n floating,\n floatingIcon,\n floatingStyle,\n footerStyle,\n headerComponent,\n headerTitle,\n hideHeader,\n hideSubmitButton,\n inputStyle,\n placeholder,\n inputAttributes,\n recognitionPlaceholder,\n style,\n submitButtonStyle,\n width,\n height\n } = this.props;\n\n const header = headerComponent || (\n
\n {headerTitle}\n {floating && (\n this.toggleChatBot(false)}>\n \n \n )}\n
\n );\n\n let customControl;\n if (extraControl !== undefined) {\n customControl = React.cloneElement(extraControl, {\n disabled,\n speaking,\n invalid: inputInvalid\n });\n }\n\n const icon =\n (this.isInputValueEmpty() || speaking) && recognitionEnable ? : ;\n\n const inputPlaceholder = speaking\n ? recognitionPlaceholder\n : currentStep.placeholder || placeholder;\n\n const inputAttributesOverride = currentStep.inputAttributes || inputAttributes;\n\n return (\n
\n {floating && (\n this.toggleChatBot(true)}\n >\n {typeof floatingIcon === 'string' ? : floatingIcon}\n \n )}\n \n {!hideHeader && header}\n \n {renderedSteps.map(this.renderStep)}\n \n
\n {!currentStep.hideInput && (\n \n )}\n
\n {!currentStep.hideInput && !currentStep.hideExtraControl && customControl}\n {!currentStep.hideInput && !hideSubmitButton && (\n \n {icon}\n \n )}\n
\n
\n \n
\n );\n }\n}\n\nChatBot.propTypes = {\n avatarStyle: PropTypes.objectOf(PropTypes.any),\n botAvatar: PropTypes.string,\n botName: PropTypes.string,\n botDelay: PropTypes.number,\n bubbleOptionStyle: PropTypes.objectOf(PropTypes.any),\n bubbleStyle: PropTypes.objectOf(PropTypes.any),\n cache: PropTypes.bool,\n cacheName: PropTypes.string,\n className: PropTypes.string,\n contentStyle: PropTypes.objectOf(PropTypes.any),\n customDelay: PropTypes.number,\n customStyle: PropTypes.objectOf(PropTypes.any),\n controlStyle: PropTypes.objectOf(PropTypes.any),\n enableMobileAutoFocus: PropTypes.bool,\n enableSmoothScroll: PropTypes.bool,\n extraControl: PropTypes.objectOf(PropTypes.element),\n floating: PropTypes.bool,\n floatingIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n floatingStyle: PropTypes.objectOf(PropTypes.any),\n footerStyle: PropTypes.objectOf(PropTypes.any),\n handleEnd: PropTypes.func,\n headerComponent: PropTypes.element,\n headerTitle: PropTypes.string,\n height: PropTypes.string,\n hideBotAvatar: PropTypes.bool,\n hideHeader: PropTypes.bool,\n hideSubmitButton: PropTypes.bool,\n hideUserAvatar: PropTypes.bool,\n inputAttributes: PropTypes.objectOf(PropTypes.any),\n inputStyle: PropTypes.objectOf(PropTypes.any),\n opened: PropTypes.bool,\n toggleFloating: PropTypes.func,\n placeholder: PropTypes.string,\n recognitionEnable: PropTypes.bool,\n recognitionLang: PropTypes.string,\n recognitionPlaceholder: PropTypes.string,\n speechSynthesis: PropTypes.shape({\n enable: PropTypes.bool,\n lang: PropTypes.string,\n voice:\n typeof window !== 'undefined'\n ? PropTypes.instanceOf(window.SpeechSynthesisVoice)\n : PropTypes.any\n }),\n steps: PropTypes.arrayOf(PropTypes.object).isRequired,\n style: PropTypes.objectOf(PropTypes.any),\n submitButtonStyle: PropTypes.objectOf(PropTypes.any),\n userAvatar: PropTypes.string,\n userDelay: PropTypes.number,\n width: PropTypes.string\n};\n\nChatBot.defaultProps = {\n avatarStyle: {},\n botDelay: 1000,\n botName: 'The bot',\n bubbleOptionStyle: {},\n bubbleStyle: {},\n cache: false,\n cacheName: 'rsc_cache',\n className: '',\n contentStyle: {},\n customStyle: {},\n controlStyle: { position: 'absolute', right: '0', top: '0' },\n customDelay: 1000,\n enableMobileAutoFocus: false,\n enableSmoothScroll: false,\n extraControl: undefined,\n floating: false,\n floatingIcon: ,\n floatingStyle: {},\n footerStyle: {},\n handleEnd: undefined,\n headerComponent: undefined,\n headerTitle: 'Chat',\n height: '520px',\n hideBotAvatar: false,\n hideHeader: false,\n hideSubmitButton: false,\n hideUserAvatar: false,\n inputStyle: {},\n opened: undefined,\n placeholder: 'Type the message ...',\n inputAttributes: {},\n recognitionEnable: false,\n recognitionLang: 'en',\n recognitionPlaceholder: 'Listening ...',\n speechSynthesis: {\n enable: false,\n lang: 'en',\n voice: null\n },\n style: {},\n submitButtonStyle: {},\n toggleFloating: undefined,\n userDelay: 1000,\n width: '350px',\n botAvatar:\n \"data:image/svg+xml,%3csvg version='1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath d='M303 70a47 47 0 1 0-70 40v84h46v-84c14-8 24-23 24-40z' fill='%2393c7ef'/%3e%3cpath d='M256 23v171h23v-84a47 47 0 0 0-23-87z' fill='%235a8bb0'/%3e%3cpath fill='%2393c7ef' d='M0 240h248v124H0z'/%3e%3cpath fill='%235a8bb0' d='M264 240h248v124H264z'/%3e%3cpath fill='%2393c7ef' d='M186 365h140v124H186z'/%3e%3cpath fill='%235a8bb0' d='M256 365h70v124h-70z'/%3e%3cpath fill='%23cce9f9' d='M47 163h419v279H47z'/%3e%3cpath fill='%2393c7ef' d='M256 163h209v279H256z'/%3e%3cpath d='M194 272a31 31 0 0 1-62 0c0-18 14-32 31-32s31 14 31 32z' fill='%233c5d76'/%3e%3cpath d='M380 272a31 31 0 0 1-62 0c0-18 14-32 31-32s31 14 31 32z' fill='%231e2e3b'/%3e%3cpath d='M186 349a70 70 0 1 0 140 0H186z' fill='%233c5d76'/%3e%3cpath d='M256 349v70c39 0 70-31 70-70h-70z' fill='%231e2e3b'/%3e%3c/svg%3e\",\n userAvatar:\n \"data:image/svg+xml,%3csvg viewBox='-208.5 21 100 100' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3ccircle cx='-158.5' cy='71' fill='%23F5EEE5' r='50'/%3e%3cdefs%3e%3ccircle cx='-158.5' cy='71' id='a' r='50'/%3e%3c/defs%3e%3cclipPath id='b'%3e%3cuse overflow='visible' xlink:href='%23a'/%3e%3c/clipPath%3e%3cpath clip-path='url(%23b)' d='M-108.5 121v-14s-21.2-4.9-28-6.7c-2.5-.7-7-3.3-7-12V82h-30v6.3c0 8.7-4.5 11.3-7 12-6.8 1.9-28.1 7.3-28.1 6.7v14h100.1z' fill='%23E6C19C'/%3e%3cg clip-path='url(%23b)'%3e%3cdefs%3e%3cpath d='M-108.5 121v-14s-21.2-4.9-28-6.7c-2.5-.7-7-3.3-7-12V82h-30v6.3c0 8.7-4.5 11.3-7 12-6.8 1.9-28.1 7.3-28.1 6.7v14h100.1z' id='c'/%3e%3c/defs%3e%3cclipPath id='d'%3e%3cuse overflow='visible' xlink:href='%23c'/%3e%3c/clipPath%3e%3cpath clip-path='url(%23d)' d='M-158.5 100.1c12.7 0 23-18.6 23-34.4 0-16.2-10.3-24.7-23-24.7s-23 8.5-23 24.7c0 15.8 10.3 34.4 23 34.4z' fill='%23D4B08C'/%3e%3c/g%3e%3cpath d='M-158.5 96c12.7 0 23-16.3 23-31 0-15.1-10.3-23-23-23s-23 7.9-23 23c0 14.7 10.3 31 23 31z' fill='%23F2CEA5'/%3e%3c/svg%3e\"\n};\n\nexport default ChatBot;\n","import ChatBot from './ChatBot';\nimport Loading from './steps_components/common/Loading';\n\nexport default ChatBot;\nexport { Loading };\n"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/ChatBot.jsx b/lib/ChatBot.jsx index 4b5e212c..94bf1d5a 100644 --- a/lib/ChatBot.jsx +++ b/lib/ChatBot.jsx @@ -62,6 +62,7 @@ class ChatBot extends Component { const { botDelay, botAvatar, + botName, cache, cacheName, customDelay, @@ -71,7 +72,7 @@ class ChatBot extends Component { } = this.props; const chatSteps = {}; - const defaultBotSettings = { delay: botDelay, avatar: botAvatar }; + const defaultBotSettings = { delay: botDelay, avatar: botAvatar, botName }; const defaultUserSettings = { delay: userDelay, avatar: userAvatar, @@ -724,6 +725,7 @@ class ChatBot extends Component { ChatBot.propTypes = { avatarStyle: PropTypes.objectOf(PropTypes.any), botAvatar: PropTypes.string, + botName: PropTypes.string, botDelay: PropTypes.number, bubbleOptionStyle: PropTypes.objectOf(PropTypes.any), bubbleStyle: PropTypes.objectOf(PropTypes.any), @@ -776,6 +778,7 @@ ChatBot.propTypes = { ChatBot.defaultProps = { avatarStyle: {}, botDelay: 1000, + botName: 'The bot', bubbleOptionStyle: {}, bubbleStyle: {}, cache: false, diff --git a/lib/steps_components/text/TextStep.jsx b/lib/steps_components/text/TextStep.jsx index 9118317a..a226fe21 100644 --- a/lib/steps_components/text/TextStep.jsx +++ b/lib/steps_components/text/TextStep.jsx @@ -61,10 +61,12 @@ class TextStep extends Component { hideUserAvatar } = this.props; const { loading } = this.state; - const { avatar, user } = step; + const { avatar, user, botName } = step; const showAvatar = user ? !hideUserAvatar : !hideBotAvatar; + const imageAltText = user ? "Your avatar" : `${botName}'s avatar`; + return ( @@ -75,7 +77,7 @@ class TextStep extends Component { showAvatar={showAvatar} user={user} src={avatar} - alt="avatar" + alt={imageAltText} /> )} diff --git a/package-lock.json b/package-lock.json index 64d2cffe..cb277520 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3057,12 +3057,6 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3084,12 +3078,6 @@ "safe-buffer": "~5.1.1" } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -7127,12 +7115,6 @@ } } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, "neo-async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",