@botfabrik/engine-webclient 4.33.3 → 4.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["components/conversation/message/detail-message/DetailMessage.module.scss","Global.module.scss","components/Chat.module.scss","components/conversation/MessageContainer.module.scss","components/user-input/quick-replies/QuickReplies.module.scss","components/conversation/message/Message.module.scss","Client.module.scss","components/conversation/message/Text.module.scss","components/powered-by/PoweredBy.module.scss","components/user-input/InputContainer.module.scss","components/transcript-mail/TranscriptMail.module.scss","locales sync /^/.//.*/.json$","index-a-polyfill.tsx","types.ts","actions/handleQuickReplyClick.ts","actions/sendMessageFromUser.ts","actions/index.ts","actions/connectionActions.ts","components/conversation/general-conditions/index.tsx","components/conversation/message/bot-message/ProblemReport.tsx","components/conversation/message/bot-message/index.tsx","components/conversation/message/detail-message/Buttons.tsx","components/conversation/message/Text.tsx","components/conversation/message/detail-message/Subtitle.tsx","components/conversation/message/MarkdownText.tsx","components/conversation/message/detail-message/Text.tsx","components/conversation/message/detail-message/Title.tsx","components/conversation/message/detail-message/Body.tsx","components/conversation/message/detail-message/Image.tsx","components/conversation/message/detail-message/index.tsx","components/conversation/message/guest-message/index.tsx","components/conversation/message/markdown-message/index.tsx","components/conversation/message/text-message/index.tsx","components/conversation/message/index.tsx","components/conversation/typing-indicator/index.tsx","components/conversation/index.tsx","components/powered-by/index.tsx","components/transcript-mail/index.tsx","components/user-input/conversation-rating/Star.tsx","components/user-input/conversation-rating/Stars.tsx","components/user-input/conversation-rating/CallToAction.tsx","components/user-input/conversation-rating/BotBubble.tsx","components/user-input/conversation-rating/GuestBubble.tsx","components/user-input/conversation-rating/RateOverlay.tsx","components/user-input/conversation-rating/index.tsx","components/user-input/input/audio-recorder.tsx","components/user-input/input/index.tsx","components/user-input/quick-replies/index.tsx","components/user-input/index.tsx","components/Chat.tsx","locales/initialize.ts","reducers/backendConnectionReducer.ts","reducers/chatReducer.ts","reducers/index.ts","store/localStorage.ts","store/socketMiddleware.ts","store/configureStore.ts","App.tsx","index-b-app.tsx","components/user-input/input/AudioRecorder.module.scss","components/user-input/conversation-rating/RateInput.module.scss","components/user-input/input/TextInput.module.scss","components/conversation/general-conditions/GeneralConditions.module.scss","components/conversation/message/bot-message/ProblemReport.module.scss","components/conversation/typing-indicator/TypingIndicator.module.scss"],"names":["module","exports","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","String","prototype","endsWith","searchString","position","subjectString","this","toString","isFinite","Math","floor","length","lastIndex","indexOf","includes","search","start","Array","defineProperty","value","searchElement","fromIndex","TypeError","len","x","y","n","k","max","abs","isNaN","find","predicate","thisArg","arguments","kValue","call","configurable","writable","ConnectionStateEnum","UserType","handleQuickReplyClick","reply","dispatch","payload","type","ActionTypes","MESSAGE_FROM_GUEST","receiveTextMessageWithoutAnalysisFromGuest","label","sendMessageFromUser","text","getState","matchedQuickReply","chat","quickReplies","qr","toLocaleLowerCase","receiveTextMessageFromGuest","MESSAGE_TO_PARENT_PAGE","RESTORE_PREVIOUS_CHAT_MESSAGES","AUDIO_MESSAGE_FROM_USER","ENABLE_SPEECH_SUPPORT","ENABLE_PROBLEM_REPORTING_SUPPORT","ENABLE_TRANSCRIPT_EXPORT","RECEIVE_SPEECH_TRANSCRIPTION","SHOW_GENERAL_CONDITIONS","ENABLE_CONVERSATION_RATING","GET_STARTED","EXPAND_WINDOW","DOWNLOAD_TRANSCRIPT_PDF","INTERNAL_ACTIONS","notifyParentToChangePath","url","message","CONNECT","CONNECTING","CONNECTED","DISCONNECTED","RECONNECTED","RESTORE_SESSION_ID","RESTART","connect","clientName","querystrings","parsedQuerystrings","queryString","parse","connectionState","connection","sessionId","undefined","uuid","userId","userIdCookie","Cookies","get","set","doConnect","stringify","doRestartChat","ACCEPT_KEY","GeneralConditions","translate","useState","showDetails","setShowDetails","toggleShowDetails","headerText","acceptText","className","styles","generalConditionsContainer","generalConditions","role","onClick","onKeyDown","event","key","tabIndex","generalConditionsHeader","generalConditionsBody","generalConditionsAccept","ProblemReport","reported","onReport","handleOnReport","problem","handleOnReportKeyDown","problemReport","classNames","problemReportIcon","problemReportIconActive","src","title","alt","problemReportIconInactive","BotMessage","problemReportingEnabled","onProblemReport","children","messageBot","avatar","sender","BOT","bubble","bubbleLeft","leftText","Buttons","buttons","onButtonClick","button","index","globalStyles","Text","onLinkClick","componentDecorator","decoratedHref","decoratedText","href","preventDefault","split","item","Emoji","emojify","Subtitle","subtitle","OPEN_LINK_IN_NEW_TAB_INDICATOR","MarkdownText","markdown","handleOnLinkClick","options","overrides","a","slice","target","rel","Title","Body","messageStyle","bubbleContent","Image","imageUrl","itemUrl","hasBody","video_container","video","only","width","frameBorder","allowFullScreen","imageContainer","image","DetailMessage","detailMessage","UserMessage","messageUser","bubbleRight","rightText","MarkdownMessage","TextMessage","Message","msgCmp","getMessageCmp","GUEST","_id","MessageTypeEnum","TEXT","textMessage","DETAIL","MARKDOWN","markdownMessage","areEqual","prevProps","nextProps","React","memo","TypingIndicator","isTyping","ticontainer","tiblock","tidot","Element","Scroll","Conversation","duration","delay","scroller","scrollTo","smooth","containerId","scrollToBottom","messages","props","isBotTyping","hasNewMessages","setTimeout","showGeneralConditions","messageContainer","msg","name","Component","Link","PoweredBy","powerdBy","container","TranscriptMail","visible","methods","onEmailExport","onPdfExport","onClose","internalVisible","setInternalVisible","submitted","setSubmitted","generatingPdf","setGeneratingPdf","email","setEmail","inputRef","useRef","useEffect","current","focus","containerOpen","containerClose","pdf","description","actions","buttonDefault","buttonPrimary","disabled","onSubmit","formContainer","ref","placeholder","emailInput","onChange","trim","emailIsValide","test","validationError","Star","count","readonly","onHover","star","starReadonly","onMouseOver","starIcon","viewBox","focusable","height","fill","d","Stars","size","hoverValue","setHoverValue","handleOnStarClick","starIndex","stars","starsSmall","starsLarge","chat__conversationRating__stars__small","chat__conversationRating__stars__large","onMouseOut","_","CallToAction","onRate","callToActionContainer","callToActionTitle","BotBubble","rest","rateFeedbackBotBubble","botBubble","GuestBubble","rateFeedbackGuestBubble","guestBubble","RateOverlay","rating","tempRating","setTempRating","rateText","setRateText","guestFeedbackInputRef","rateOverlay","rateOverlayOpen","rateOverlayClose","body","starsDescriptionContainer","starsDescription","bubbles","footer","ConversationRating","conversationRating","enabled","numberOfMessagesFromGuest","showOverlay","setShowOverlay","showCallToAction","OUTPUT_SAMPLE_RATE","AudioRecorder","audioInput","volume","leftchannel","recorder","recordingLength","sampleRate","mediaStream","state","recordingState","triggerAudioRecording","bind","triggerAudioRecordingSuccess","initRecording","processRecordingInput","handleClickSubmitAudio","handleClickStopAudio","setState","navigator","mediaDevices","getUserMedia","audio","then","stream","context","window","AudioContext","webkitAudioContext","createGain","createMediaStreamSource","createScriptProcessor","onaudioprocess","destination","left","inputBuffer","getChannelData","push","Float32Array","leftBuffer","mergeBuffers","downsampledBuffer","downsampleBuffer","blob","createWav","onAudioRecorded","disconnect","getAudioTracks","forEach","track","stop","audioRecorder","recordButton","xmlns","spinning","cancelButton","recorderIcon","submitButton","autoFocus","buffer","ArrayBuffer","view","DataView","writeUTFBytes","setUint32","setUint16","lng","i","setInt16","Blob","offset","val","setUint8","charCodeAt","channelBuffer","result","sampleRateRatio","newLength","round","offsetResult","offsetBuffer","nextOffsetBuffer","accum","TextInput","speechSupport","transcriptExportEnabled","onTextInput","onOpenTranscriptExportModal","hasText","setHasText","userTextInput","inputWrapper","currentUserInput","messageInputWrapper","messageInput","QuickReplies","onQuickReplyClick","quickReply","UserInput","inputContainer","INCOMMING_EVENTS","reduxConnect","uploadRequest","currentLanguage","getActiveLanguage","locale","getTranslate","onConnect","onRestartChat","restartChat","onMessageFromUser","feedback","CONVERSATION_RATING_FROM_GUEST","handleRatingFromUser","sendAudioMessageFromUser","onActionFromUser","action","onNluEvent","coreRequestNLUEvent","requestNLUEvent","ButtonTypeEnum","WEB_URL","POSTBACK","handleButtonClick","handleLinkClick","onUploadFile","filename","receiveFileFromGuest","sendUploadFileFromUser","onTranscriptExport","TRANSCRIPT_MAIL_REQUEST","parameters","mailTo","exportTranscript","actionId","reportProblemFromGuest","showTranscriptMailOverlay","setShowTranscriptMailOverlay","cssClassName","setCssClassName","document","documentElement","lang","location","handleOnMessageFromOutside","data","story","addEventListener","removeEventListener","anyExportEnabled","filter","m","chatwindow","chatcontent","init","languages","initialize","defaultLanguage","renderToStaticMarkup","onMissingTranslation","language","json","require","addTranslationForLanguage","initialState","backendConnectionReducer","ConnectionActions","assign","appendMessageFromGuestToState","lastMessage","sameText","concat","sendToParentPage","isIframe","top","postMessage","open","self","chatReducer","TYPING_ON","TYPING_OFF","MESSAGE_WITHOUT_ANALYSIS_FROM_GUEST","MESSAGE_TO_GUEST","meta","alreadyAdded","ClientActions","FILE_FROM_GUEST","uploadState","EVENT_TO_GUEST","transcription","GuestUser","chatMsg","PROBLEM_REPORT_FROM_GUEST","msgs","rootReducer","combineReducers","localizeReducer","LOCAL_STORAGE_LAST_SAVED_ITEM_NAME","LOCAL_STORAGE_STATE_ITEM_NAME","isExpired","lastSavedAt","expiresAt","Date","setHours","getHours","supportsLocalStorage","localStorage","getStoreItem","storeItemName","getItem","setStoreItem","setItem","blacklist","ChatActions","socketMiddleware","next","socket","io","on","translation","setActiveLanguage","uri","replace","console","log","devices","emit","JSON","configureStore","persistedState","serializedState","err","error","loadState","store","compose","applyMiddleware","thunk","createStore","reducer","subscribe","throttle","now","toISOString","saveState","extractClientNameFromPathname","pathname","pathElements","endsWithSlash","App","initTranslations","chatPage","Chat","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.2b32f3df.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"imageContainer\":\"DetailMessage_imageContainer__2ihF8\",\"title\":\"DetailMessage_title__1RlQT\",\"subtitle\":\"DetailMessage_subtitle__18WDj\",\"buttons\":\"DetailMessage_buttons__2xB0e\",\"button\":\"DetailMessage_button__2eSMw\",\"image\":\"DetailMessage_image__2Gyth\",\"video_container\":\"DetailMessage_video_container__7lOBq\",\"video\":\"DetailMessage_video__3VEwq\",\"only\":\"DetailMessage_only__3Pr5W\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"Global_button__33oEy\",\"buttonDefault\":\"Global_buttonDefault__3nUVN\",\"buttonPrimary\":\"Global_buttonPrimary__3ebHA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"chatwindow\":\"Chat_chatwindow__2gTsn\",\"chatcontent\":\"Chat_chatcontent__-wQ0P\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"messageContainer\":\"MessageContainer_messageContainer__1AKXT\",\"messages\":\"MessageContainer_messages__2GeSj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"quickReplies\":\"QuickReplies_quickReplies__26tJr\",\"quickReply\":\"QuickReplies_quickReply__PrklG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"messageBot\":\"Message_messageBot__3cmFc\",\"messageUser\":\"Message_messageUser__1PbuM\",\"avatar\":\"Message_avatar__1GG1t\",\"bubble\":\"Message_bubble__yOubG\",\"bubbleContent\":\"Message_bubbleContent__iwyjo\",\"bubbleLeft\":\"Message_bubbleLeft__11Sts\",\"leftText\":\"Message_leftText__1KoBc\",\"bubbleRight\":\"Message_bubbleRight__2Qu4n\",\"rightText\":\"Message_rightText__3RrIO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"chatPage\":\"Client_chatPage__126Ne\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"text\":\"Text_text__1zaFO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"PoweredBy_container__3PZQc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputContainer\":\"InputContainer_inputContainer__3uWNo\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"TranscriptMail_container__xZvk4\",\"containerOpen\":\"TranscriptMail_containerOpen__1hqU0\",\"slide-in\":\"TranscriptMail_slide-in__XH6FI\",\"containerClose\":\"TranscriptMail_containerClose__3O-kH\",\"slide-out\":\"TranscriptMail_slide-out__1UFOz\",\"formContainer\":\"TranscriptMail_formContainer__bJ8SH\",\"emailInput\":\"TranscriptMail_emailInput__3FwaM\",\"description\":\"TranscriptMail_description__1IsWl\",\"actions\":\"TranscriptMail_actions__2qBTc\",\"validationError\":\"TranscriptMail_validationError__3pqpz\",\"submitted\":\"TranscriptMail_submitted__q60CQ\"};","var map = {\n\t\"./de.json\": 342,\n\t\"./en.json\": 343,\n\t\"./fr.json\": 344,\n\t\"./it.json\": 345\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 341;","// TODO: remove this file, if IE11 is no longer supported\n\nimport 'react-app-polyfill/ie11';\n\n// Polyfill for IE11 support\nif (!String.prototype.endsWith) {\n String.prototype.endsWith = function (searchString, position) {\n var subjectString = this.toString();\n if (\n typeof position !== 'number' ||\n !isFinite(position) ||\n Math.floor(position) !== position ||\n position > subjectString.length\n ) {\n position = subjectString.length;\n }\n position -= searchString.length;\n var lastIndex = subjectString.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n };\n}\n\nif (!String.prototype.includes) {\n String.prototype.includes = function (search, start) {\n 'use strict';\n if (typeof start !== 'number') {\n start = 0;\n }\n\n if (start + search.length > this.length) {\n return false;\n } else {\n return this.indexOf(search, start) !== -1;\n }\n };\n}\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, 'includes', {\n value: function (searchElement: any, fromIndex: number) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x: any, y: any) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(searchElement, elementK) is true, return true.\n if (sameValueZero(o[k], searchElement)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n },\n });\n}\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate: any) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n var thisArg = arguments[1];\n\n // 5. Let k be 0.\n var k = 0;\n\n // 6. Repeat, while k < len\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n // e. Increase k by 1.\n k++;\n }\n\n // 7. Return undefined.\n return undefined;\n },\n configurable: true,\n writable: true,\n });\n}\n","import { Message, QuickReply, UploadRequest } from '@botfabrik/engine-domain';\nimport { LocalizeState } from 'react-localize-redux';\n\nexport interface RootState {\n chat: ChatState;\n connection: ConnectionState;\n locale: LocalizeState;\n}\n\nexport interface ChatMessage extends Message {\n _id: string;\n problemReport?: string;\n}\n\nexport interface ChatState {\n isBotTyping: boolean;\n messages: ChatMessage[];\n quickReplies: QuickReply[];\n uploadRequest?: UploadRequest;\n speechSupport: boolean;\n problemReportingEnabled: boolean;\n transcriptExportEnabled: {\n email: boolean;\n pdf: boolean;\n };\n showGeneralConditions: boolean;\n conversationRating: ConversationRatingState;\n}\n\nexport interface EnableConversationRatingType {\n rating?: ConversationRating;\n}\n\nexport interface ConversationRatingState {\n enabled: boolean;\n rating?: ConversationRating;\n}\n\nexport interface ConversationRating {\n value: number;\n feedback: string;\n}\n\nexport enum ConnectionStateEnum {\n CONNECTING,\n CONNECTED,\n RECONNECTED,\n DISCONNECTED,\n}\n\nexport interface ConnectionState {\n connectionState: ConnectionStateEnum;\n sessionId: string | undefined;\n userId: string | undefined;\n}\n\nexport interface Sender {\n avatar: string;\n type: UserType;\n}\n\nexport enum UserType {\n GUEST = 'GUEST',\n BOT = 'BOT',\n PERSON = 'PERSON',\n}\n","import { Action, ActionTypes, QuickReply, receiveTextMessageWithoutAnalysisFromGuest } from '@botfabrik/engine-domain';\nimport { AnyAction } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { RootState } from '../types';\n\nconst handleQuickReplyClick = (reply: QuickReply) => {\n return (dispatch: ThunkDispatch<RootState, void, Action>) => {\n if (reply.payload.type !== ActionTypes.MESSAGE_FROM_GUEST) {\n dispatch(receiveTextMessageWithoutAnalysisFromGuest(reply.label, reply.payload));\n }\n return dispatch(reply.payload as AnyAction);\n };\n};\n\nexport default handleQuickReplyClick;\n","import { Action, receiveTextMessageFromGuest } from '@botfabrik/engine-domain';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { RootState } from '../types';\nimport handleQuickReplyClick from './handleQuickReplyClick';\n\n/**\n * Informiere den Store, dass der Benutzer eine neue Nachricht gesendet hat.\n */\nconst sendMessageFromUser = (text: string) => {\n return (dispatch: ThunkDispatch<RootState, void, Action>, getState: () => RootState) => {\n const { quickReplies } = getState().chat;\n const matchedQuickReply = quickReplies.find(\n (qr) => text.toLocaleLowerCase().indexOf(qr.label.toLocaleLowerCase()) > -1\n );\n if (matchedQuickReply) {\n return dispatch(handleQuickReplyClick({ ...matchedQuickReply, label: text }));\n } else {\n return dispatch(receiveTextMessageFromGuest(text));\n }\n };\n};\n\nexport default sendMessageFromUser;\n","import {\n ActionTypes,\n Button,\n ButtonTypeEnum,\n Message,\n PostbackButton,\n receiveFileFromGuest,\n requestNLUEvent as coreRequestNLUEvent,\n UrlButton,\n} from '@botfabrik/engine-domain';\nimport { EnableConversationRatingType } from '../types';\nimport handleQuickReplyClick from './handleQuickReplyClick';\nimport sendMessageFromUser from './sendMessageFromUser';\n\nexport const MESSAGE_TO_PARENT_PAGE = 'MESSAGE_TO_PARENT_PAGE';\nexport const RESTORE_PREVIOUS_CHAT_MESSAGES = 'RESTORE_PREVIOUS_CHAT_MESSAGES';\nexport const AUDIO_MESSAGE_FROM_USER = 'AUDIO_MESSAGE_FROM_USER';\nexport const ENABLE_SPEECH_SUPPORT = 'ENABLE_SPEECH_SUPPORT';\nexport const ENABLE_PROBLEM_REPORTING_SUPPORT = 'ENABLE_BOT_REPLIES_VOTING_SUPPORT';\nexport const ENABLE_TRANSCRIPT_EXPORT = 'ENABLE_TRANSCRIPT_EXPORT';\nexport const EXPORT_TRANSCRIPT = 'EXPORT_TRANSCRIPT';\nexport const RECEIVE_SPEECH_TRANSCRIPTION = 'RECEIVE_SPEECH_TRANSCRIPTION';\nexport const SHOW_GENERAL_CONDITIONS = 'SHOW_GENERAL_CONDITIONS';\nexport const ENABLE_CONVERSATION_RATING = 'ENABLE_CONVERSATION_RATING';\n\nexport const GET_STARTED = 'webclient.get.started';\nexport const EXPAND_WINDOW = 'webclient.expand.window';\nexport const DOWNLOAD_TRANSCRIPT_PDF = 'webclient.transcript.pdf.download';\n\n/**\n * Diese Actions sollen nicht ans Backend übermittelt werden (siehe socketMiddleware.ts)\n */\nexport const INTERNAL_ACTIONS = [\n MESSAGE_TO_PARENT_PAGE,\n RESTORE_PREVIOUS_CHAT_MESSAGES,\n AUDIO_MESSAGE_FROM_USER,\n ENABLE_SPEECH_SUPPORT,\n ENABLE_PROBLEM_REPORTING_SUPPORT,\n ENABLE_TRANSCRIPT_EXPORT,\n EXPORT_TRANSCRIPT,\n RECEIVE_SPEECH_TRANSCRIPTION,\n SHOW_GENERAL_CONDITIONS,\n ENABLE_CONVERSATION_RATING,\n];\n\nexport { sendMessageFromUser, handleQuickReplyClick };\n\nexport const sendAudioMessageFromUser = (blob: Blob) => ({\n type: AUDIO_MESSAGE_FROM_USER,\n buffer: blob,\n});\n\nexport const enableSpeechSupport = () => ({\n type: ENABLE_SPEECH_SUPPORT,\n});\n\nexport const enableProblemReportingSupport = () => ({\n type: ENABLE_PROBLEM_REPORTING_SUPPORT,\n});\n\nexport const receiveSpeechTranscription = (transcription: string) => ({\n type: RECEIVE_SPEECH_TRANSCRIPTION,\n transcription,\n});\n\nexport const enableTranscriptExport = (methods: { email: boolean; pdf: boolean }) => ({\n type: ENABLE_TRANSCRIPT_EXPORT,\n methods,\n});\n\nexport const exportTranscript = (email: string) => ({\n type: ActionTypes.TRANSCRIPT_MAIL_REQUEST,\n payload: { parameters: { mailTo: email } },\n});\n\nexport const showGeneralConditions = () => ({\n type: SHOW_GENERAL_CONDITIONS,\n});\n\nexport const downloadTranscriptPdf = () => ({\n type: DOWNLOAD_TRANSCRIPT_PDF,\n});\n\nexport const enableConversationRating = ({ rating }: EnableConversationRatingType) => ({\n type: ENABLE_CONVERSATION_RATING,\n payload: { rating },\n});\n\nexport const handleRatingFromUser = (value: number, feedback: string) => ({\n type: ActionTypes.CONVERSATION_RATING_FROM_GUEST,\n payload: { value, feedback },\n});\n\nexport const requestNLUEvent = (event: string) => coreRequestNLUEvent(event);\n\nexport const restorePreviousChatMessages = (messages: Message[]) => ({\n type: RESTORE_PREVIOUS_CHAT_MESSAGES,\n messages,\n});\n\nexport const handleButtonClick = (button: Button) => {\n switch (button.type) {\n case ButtonTypeEnum.WEB_URL:\n const urlButton = button as UrlButton;\n return notifyParentToChangePath(urlButton.url);\n case ButtonTypeEnum.POSTBACK:\n const postbackButton = button as PostbackButton;\n return postbackButton.payload;\n default:\n throw new Error(`unknown button type ${button.type}`);\n }\n};\n\nexport const handleLinkClick = (url: string) => notifyParentToChangePath(url);\n\nexport const getStarted = () => ({\n type: GET_STARTED,\n});\n\nconst notifyParentToChangePath = (url: string) => ({\n type: MESSAGE_TO_PARENT_PAGE,\n message: {\n type: 'webclient.change.url',\n url,\n },\n});\n\nexport const sendUploadFileFromUser = (filename: string, blob: Blob, payload: object) =>\n receiveFileFromGuest(filename, blob, payload);\n","import Cookies from 'js-cookie';\nimport queryString from 'query-string';\nimport { AnyAction } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { v4 as uuid } from 'uuid';\nimport { RootState } from '../types';\n\nexport const CONNECT = 'CONNECT';\nexport const CONNECTING = 'CONNECTING';\nexport const CONNECTED = 'CONNECTED';\nexport const DISCONNECTED = 'DISCONNECTED';\nexport const RECONNECTED = 'RECONNECTED';\nexport const RESTORE_SESSION_ID = 'RESTORE_SESSION_ID';\nexport const RESTART = 'RESTART';\n\n/**\n * Diese Actions sollen nicht ans Backend übermittelt werden (siehe socketMiddleware.ts)\n */\nexport const INTERNAL_ACTIONS = [CONNECT, CONNECTING, CONNECTED, DISCONNECTED, RECONNECTED, RESTORE_SESSION_ID];\n\n/**\n * Erstelle eine Verbindung mit dem Backend Server\n */\nexport const connect = (clientName: string, querystrings: string) => {\n return (dispatch: ThunkDispatch<RootState, unknown, AnyAction>, getState: () => RootState) => {\n const parsedQuerystrings = queryString.parse(querystrings);\n const connectionState = getState().connection;\n\n // get session id\n let sessionId = connectionState.sessionId;\n if (sessionId === undefined) {\n sessionId = uuid();\n }\n\n // get user id\n let userId = connectionState.userId;\n if (userId === undefined) {\n const userIdCookie = Cookies.get('bf-webclient-userId');\n userId = userIdCookie ? userIdCookie : uuid();\n Cookies.set('bf-webclient-userId', userId!);\n }\n\n parsedQuerystrings.sessionId = sessionId;\n parsedQuerystrings.userId = userId;\n\n return dispatch(doConnect(sessionId!, userId!, clientName, queryString.stringify(parsedQuerystrings)));\n };\n};\n\nconst doConnect = (sessionId: string, userId: string, clientName: string, querystrings: string) => ({\n type: CONNECT,\n sessionId,\n userId,\n clientName,\n querystrings,\n});\n\nexport const restoreSessionId = (sessionId: string) => ({\n type: RESTORE_SESSION_ID,\n sessionId,\n});\n\n/**\n * Informiere den Store, dass wir eine Verbindung mit dem Server aufbauen.\n */\nexport const connecting = () => ({\n type: CONNECTING,\n});\n\n/**\n * Informiere den Store, dass wir mit dem Server verbunden sind.\n */\nexport const connected = () => ({\n type: CONNECTED,\n});\n\n/**\n * Informiere den Store, dass die Verbindung mit dem Server getrennt wurde.\n */\nexport const disconnected = () => ({\n type: DISCONNECTED,\n});\n\n/**\n * Informiere den Store, dass die Verbindung mit dem Server wiederhergestellt wurde.\n */\nexport const reconnected = () => ({\n type: RECONNECTED,\n});\n\nexport const restartChat = (clientName: string, querystrings: string) => {\n return (dispatch: ThunkDispatch<RootState, unknown, AnyAction>) => {\n dispatch(doRestartChat());\n return dispatch(connect(clientName, querystrings));\n };\n};\n\nconst doRestartChat = () => ({\n type: RESTART,\n});\n","import Markdown from 'markdown-to-jsx';\nimport React, { useState } from 'react';\nimport { FaAngleDown, FaAngleUp } from 'react-icons/fa';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './GeneralConditions.module.scss';\n\ninterface Props {\n translate: TranslateFunction;\n}\n\nconst HEADER_KEY = 'general-conditions.header';\nconst BODY_KEY = 'general-conditions.body';\nconst ACCEPT_KEY = 'general-conditions.accept-conditions-note';\n\nconst GeneralConditions = ({ translate }: Props) => {\n const [showDetails, setShowDetails] = useState(false);\n\n const toggleShowDetails = () => setShowDetails(!showDetails);\n\n const handleOnKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n setShowDetails(true);\n } else if (event.key === 'ArrowUp' || event.key === 'ArrowLeft' || event.key === 'Escape') {\n setShowDetails(false);\n } else if (event.key === 'Enter' || event.key === 'Space' || event.key === ' ') {\n toggleShowDetails();\n }\n };\n\n const headerText = translate(HEADER_KEY) as string;\n const acceptText = translate(ACCEPT_KEY) as string;\n\n return (\n <div className={styles.generalConditionsContainer}>\n {!!headerText?.length && (\n <div className={styles.generalConditions}>\n <div\n role=\"button\"\n onClick={toggleShowDetails}\n onKeyDown={handleOnKeyDown}\n tabIndex={0}\n className={styles.generalConditionsHeader}\n aria-controls=\"general-conditions-body\"\n aria-expanded={showDetails ? 'true' : 'false'}\n aria-pressed={showDetails ? 'true' : 'false'}\n >\n <Markdown>{headerText}</Markdown>\n {showDetails ? <FaAngleUp /> : <FaAngleDown />}\n </div>\n <div\n className={styles.generalConditionsBody}\n id=\"general-conditions-body\"\n role=\"region\"\n tabIndex={-1}\n >\n {showDetails && <Markdown>{translate(BODY_KEY) as string}</Markdown>}\n </div>\n </div>\n )}\n {!!acceptText?.length && (\n <div className={styles.generalConditionsAccept} tabIndex={0}>\n <Markdown>{translate(ACCEPT_KEY) as string}</Markdown>\n </div>\n )}\n </div>\n );\n};\n\nexport default GeneralConditions;\n","import classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './ProblemReport.module.scss';\n\ninterface Props {\n reported: boolean | undefined;\n onReport: (problem: string | null) => void;\n translate: TranslateFunction;\n}\n\nconst ProblemReport = ({ reported, onReport, translate }: Props) => {\n const handleOnReport = (problem: string | null) => () => onReport(problem);\n const handleOnReportKeyDown = (problem: string | null) => (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n onReport(problem);\n }\n };\n\n return (\n <div className={styles.problemReport}>\n {reported ? (\n <div\n role=\"button\"\n onClick={handleOnReport(null)}\n onKeyDown={handleOnReportKeyDown(null)}\n tabIndex={0}\n className={classNames(\n styles.problemReportIcon,\n 'chat__problemReportIcon',\n 'chat_problemReportIcon',\n styles.problemReportIconActive,\n 'chat__problemReportIcon-active',\n 'chat_problemReportIcon-active'\n )}\n >\n <img\n src=\"problem-report-active.svg\"\n title={translate('problem-report.action.unmark') as string}\n alt=\"Report\"\n />\n </div>\n ) : (\n <div\n role=\"button\"\n onClick={handleOnReport('unspecified')}\n onKeyDown={handleOnReportKeyDown('unspecified')}\n tabIndex={0}\n className={classNames(\n styles.problemReportIcon,\n 'chat_problemReportIcon',\n styles.problemReportIconInactive,\n 'chat_problemReportIcon-inactive'\n )}\n >\n <img\n src=\"problem-report-inactive.svg\"\n title={translate('problem-report.action.mark') as string}\n alt=\"Report\"\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default ProblemReport;\n","import { UserType } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React, { ReactNode } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ChatMessage } from '../../../../types';\nimport styles from '../Message.module.scss';\nimport ProblemReport from './ProblemReport';\n\ninterface Props {\n message: ChatMessage;\n problemReportingEnabled: boolean;\n children: ReactNode;\n onProblemReport: (problem: string | null) => void;\n translate: TranslateFunction;\n}\n\nconst BotMessage = ({ message, problemReportingEnabled, onProblemReport, translate, children }: Props) => (\n <li className={styles.messageBot}>\n <img\n className={classNames(styles.avatar, 'chat__avatar', 'chat__botAvatar', 'chat_avatar', 'chat_botAvatar')}\n src={`${message.sender.avatar}`}\n alt={message.sender.type === UserType.BOT ? 'Bot' : 'Agent'}\n />\n\n <div\n className={classNames(styles.bubble, styles.bubbleLeft, 'chat__bubble', 'chat__botBubble')}\n tabIndex={0}\n aria-label={\n translate(message.sender.type === UserType.BOT ? 'bot-bubble.label' : 'agent-bubble.label') as string\n }\n >\n <div className={classNames(styles.leftText)}>{children}</div>\n </div>\n\n {problemReportingEnabled && (\n <ProblemReport\n reported={!!message.problemReport?.length}\n onReport={onProblemReport}\n translate={translate}\n />\n )}\n </li>\n);\n\nexport default BotMessage;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport globalStyles from '../../../../Global.module.scss';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n}\n\nconst Buttons = ({ buttons, onButtonClick }: Props) => (\n <div className={classNames(styles.buttons, 'chat__bubbleButtons')}>\n {buttons.map((button, index) => (\n <button\n key={index}\n className={classNames(styles.button, globalStyles.button, 'chat__bubbleButton')}\n onClick={() => onButtonClick(button)}\n >\n {button.title}\n </button>\n ))}\n </div>\n);\n\nexport default Buttons;\n","import Emoji from 'node-emoji';\nimport React from 'react';\nimport Linkify from 'react-linkify';\nimport styles from './Text.module.scss';\n\ninterface Props {\n text: string;\n onLinkClick: (href: string) => void;\n}\n\nconst Text = ({ text, onLinkClick }: Props) => {\n const handleOnLinkClick = (href: string) => (event: any) => {\n event.preventDefault();\n if (href) {\n onLinkClick(href);\n }\n return false;\n };\n\n // TODO: Linus\n // - Button anstelle von a verwenden\n const componentDecorator = (decoratedHref: string, decoratedText: string, key: number) => (\n // eslint-disable-next-line\n <a key={key} onClick={handleOnLinkClick(decoratedHref)} role=\"button\">\n {decoratedText}\n </a>\n );\n\n return (\n <div>\n {text.split('\\n').map((item, key) => (\n <span key={key} className={styles.text}>\n <Linkify componentDecorator={componentDecorator}>{Emoji.emojify(item)}</Linkify>\n <br />\n </span>\n ))}\n </div>\n );\n};\n\nexport default Text;\n","import React from 'react';\nimport Text from '../Text';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n subtitle: string | undefined;\n onLinkClick: (href: string) => void;\n}\n\nconst Subtitle = ({ subtitle, onLinkClick }: Props) =>\n subtitle ? (\n <div className={styles.subtitle}>\n <Text text={subtitle} onLinkClick={onLinkClick} />\n </div>\n ) : null;\n\nexport default Subtitle;\n","import Markdown from 'markdown-to-jsx';\nimport React from 'react';\n\nconst OPEN_LINK_IN_NEW_TAB_INDICATOR = 'newtab#';\n\ninterface Props {\n markdown: string;\n onLinkClick: (href: string) => void;\n}\n\nconst MarkdownText = ({ markdown, onLinkClick }: Props) => {\n const handleOnLinkClick = (href: string) => (event: any) => {\n event.preventDefault();\n if (href) {\n onLinkClick(href);\n }\n return false;\n };\n\n const Link: React.FC<{ title: string; href: string; children: React.ReactChildren }> = ({\n title,\n href,\n children,\n }) => {\n const openInNewTab = href.indexOf(OPEN_LINK_IN_NEW_TAB_INDICATOR) === 0;\n return openInNewTab ? (\n <a\n href={href.slice(OPEN_LINK_IN_NEW_TAB_INDICATOR.length)}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ) : (\n // TODO: Linus\n // - Button anstelle von a verwenden\n // eslint-disable-next-line\n <a onClick={handleOnLinkClick(href)} title={title}>\n {children}\n </a>\n );\n };\n\n return (\n <Markdown\n options={{\n overrides: {\n a: Link,\n },\n }}\n >\n {markdown}\n </Markdown>\n );\n};\n\nexport default MarkdownText;\n","import React from 'react';\nimport MarkdownText from '../MarkdownText';\n\ninterface Props {\n text: string | undefined;\n onLinkClick: (href: string) => void;\n}\n\nconst Text = ({ text, onLinkClick }: Props) =>\n text ? (\n <div>\n <MarkdownText markdown={text} onLinkClick={onLinkClick} />\n </div>\n ) : null;\n\nexport default Text;\n","import React from 'react';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n title: string | undefined;\n}\n\nconst Title = ({ title }: Props) => (title ? <h1 className={styles.title}>{title}</h1> : null);\n\nexport default Title;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport messageStyle from '../Message.module.scss';\nimport Buttons from './Buttons';\nimport Subtitle from './Subtitle';\nimport Text from './Text';\nimport Title from './Title';\n\ninterface Props {\n title?: string;\n text?: string;\n subtitle: string;\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n}\n\nconst Body = ({ title, text, subtitle, buttons, onButtonClick, onLinkClick }: Props) => {\n const hasContent = title?.length || text?.length || subtitle?.length || buttons?.length;\n return hasContent ? (\n <div className={classNames(messageStyle.bubbleContent)}>\n <Title title={title} />\n <Text text={text} onLinkClick={onLinkClick} />\n <Subtitle subtitle={subtitle} onLinkClick={onLinkClick} />\n <Buttons buttons={buttons} onButtonClick={onButtonClick} />\n </div>\n ) : null;\n};\n\nexport default Body;\n","import classNames from 'classnames';\nimport React from 'react';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n alt: string;\n imageUrl?: string;\n itemUrl?: string;\n hasBody: boolean;\n}\n\nconst Image = ({ alt, imageUrl, itemUrl, hasBody }: Props) =>\n imageUrl ? (\n itemUrl ? (\n itemUrl.indexOf('youtube.com') > -1 ? (\n <div className={styles.video_container}>\n <iframe\n className={classNames(styles.video, { [styles.only]: !hasBody })}\n title=\"Youtube\"\n width=\"100%\"\n src={itemUrl + '?rel=0'}\n frameBorder=\"0\"\n allowFullScreen\n />\n </div>\n ) : (\n <a href={itemUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <div className={styles.imageContainer}>\n <img\n className={classNames(styles.image, { [styles.only]: !hasBody })}\n src={imageUrl}\n alt={alt}\n />\n </div>\n </a>\n )\n ) : (\n <div className={styles.imageContainer}>\n <img className={classNames(styles.image, { [styles.only]: !hasBody })} src={imageUrl} alt={alt} />\n </div>\n )\n ) : null;\n\nexport default Image;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport Body from './Body';\nimport styles from './DetailMessage.module.scss';\nimport Image from './Image';\n\ninterface Props {\n title?: string;\n text?: string;\n subtitle: string;\n imageUrl?: string;\n itemUrl?: string;\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n}\n\nconst DetailMessage = ({ title, text, subtitle, imageUrl, itemUrl, buttons, onButtonClick, onLinkClick }: Props) => {\n const hasBody = !!title?.length || !!text?.length || !!subtitle?.length || !!buttons?.length;\n return (\n <div className={classNames(styles.detailMessage)}>\n <Image hasBody={hasBody} imageUrl={imageUrl} itemUrl={itemUrl} alt={title || subtitle} />\n {hasBody && (\n <Body\n title={title}\n text={text}\n subtitle={subtitle}\n buttons={buttons}\n onLinkClick={onLinkClick}\n onButtonClick={onButtonClick}\n />\n )}\n </div>\n );\n};\n\nexport default DetailMessage;\n","import classNames from 'classnames';\nimport React, { ReactNode } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from '../Message.module.scss';\n\ninterface Props {\n children: ReactNode;\n translate: TranslateFunction;\n}\n\nconst UserMessage = ({ translate, children }: Props) => (\n <li className={styles.messageUser}>\n <div\n className={classNames(styles.bubble, styles.bubbleRight, 'chat__bubble', 'chat__guestBubble')}\n tabIndex={0}\n aria-label={translate('guest-bubble.label') as string}\n >\n <div className={classNames(styles.rightText)}>{children}</div>\n </div>\n </li>\n);\n\nexport default UserMessage;\n","import classNames from 'classnames';\nimport React from 'react';\nimport MarkdownText from '../MarkdownText';\nimport messageStyle from '../Message.module.scss';\n\ninterface Props {\n markdown: string;\n className: string;\n onLinkClick: (href: string) => void;\n}\n\nconst MarkdownMessage = ({ markdown, className, onLinkClick }: Props) => (\n <div className={classNames(messageStyle.bubbleContent, className)}>\n <MarkdownText markdown={markdown} onLinkClick={onLinkClick} />\n </div>\n);\n\nexport default MarkdownMessage;\n","import React from 'react';\nimport messageStyle from '../Message.module.scss';\nimport Text from '../Text';\n\ninterface Props {\n text: string;\n onLinkClick: (href: string) => void;\n}\nconst TextMessage = ({ text, onLinkClick }: Props) => (\n <div className={messageStyle.bubbleContent}>\n <Text text={text} onLinkClick={onLinkClick} />\n </div>\n);\n\nexport default TextMessage;\n","import {\n Button,\n DetailMessage as DetailMessageType,\n MarkdownMessage as MarkdownMessageType,\n Message as MessageType,\n MessageTypeEnum,\n TextMessage as TextMessageType,\n UserType,\n} from '@botfabrik/engine-domain';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ChatMessage } from '../../../types';\nimport BotMessage from './bot-message';\nimport DetailMessage from './detail-message';\nimport GuestMessage from './guest-message';\nimport MarkdownMessage from './markdown-message';\nimport TextMessage from './text-message';\n\ninterface Props {\n message: ChatMessage;\n problemReportingEnabled: boolean;\n translate: TranslateFunction;\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n onProblemReport: (actionId: string, problem: string | null) => void;\n}\n\nconst Message = ({\n message,\n problemReportingEnabled,\n onProblemReport,\n translate,\n onButtonClick,\n onLinkClick,\n}: Props) => {\n const msgCmp = getMessageCmp(message, onButtonClick, onLinkClick);\n switch (message.sender.type) {\n case UserType.GUEST:\n return <GuestMessage translate={translate}>{msgCmp}</GuestMessage>;\n default:\n const handleOnProblemReport = (problem: string | null) => onProblemReport(message._id, problem);\n return (\n <BotMessage\n message={message}\n translate={translate}\n problemReportingEnabled={problemReportingEnabled}\n onProblemReport={handleOnProblemReport}\n >\n {msgCmp}\n </BotMessage>\n );\n }\n};\n\nconst getMessageCmp = (\n message: MessageType,\n onButtonClick: (button: Button) => void,\n onLinkClick: (href: string) => void\n) => {\n switch (message.type) {\n case MessageTypeEnum.TEXT:\n const textMessage = message as TextMessageType;\n return <TextMessage text={textMessage.text} onLinkClick={onLinkClick} />;\n case MessageTypeEnum.DETAIL:\n const detailMessage = message as DetailMessageType;\n return (\n <DetailMessage\n title={detailMessage.title}\n text={detailMessage.text}\n subtitle={detailMessage.subtitle}\n imageUrl={detailMessage.imageUrl}\n itemUrl={detailMessage.itemUrl}\n buttons={detailMessage.buttons}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n />\n );\n case MessageTypeEnum.MARKDOWN:\n const markdownMessage = message as MarkdownMessageType;\n return (\n <MarkdownMessage\n markdown={markdownMessage.markdown}\n className={markdownMessage.className}\n onLinkClick={onLinkClick}\n />\n );\n }\n};\n\nconst areEqual = (prevProps: Props, nextProps: Props) =>\n prevProps.message._id === nextProps.message._id &&\n prevProps.message.problemReport === nextProps.message.problemReport &&\n prevProps.problemReportingEnabled === nextProps.problemReportingEnabled;\n\nexport default React.memo(Message, areEqual);\n","import classNames from 'classnames';\nimport React from 'react';\nimport styles from './TypingIndicator.module.scss';\n\ninterface Props {\n isTyping?: boolean;\n}\n\nconst TypingIndicator = ({ isTyping = false }: Props) =>\n isTyping ? (\n <div className={styles.ticontainer}>\n <div className={styles.tiblock}>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n </div>\n </div>\n ) : null;\n\nexport default TypingIndicator;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport Scroll from 'react-scroll';\nimport { ChatMessage } from '../../types';\nimport GeneralConditions from './general-conditions';\nimport Message from './message';\nimport styles from './MessageContainer.module.scss';\nimport TypingIndicator from './typing-indicator';\n\nconst Element = Scroll.Element;\n\ninterface Props {\n messages: ChatMessage[];\n isBotTyping: boolean;\n showGeneralConditions: boolean;\n problemReportingEnabled: boolean;\n onProblemReport: (actionId: string, problem: string | null) => void;\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n translate: TranslateFunction;\n}\n\nclass Conversation extends React.Component<Props> {\n scrollToBottom(duration: number, delay: number) {\n const scroller = Scroll.scroller;\n scroller.scrollTo('ScrollToElement', {\n duration: duration,\n delay: delay,\n smooth: true,\n containerId: 'MessageContainer',\n });\n }\n\n componentDidMount() {\n this.scrollToBottom(0, 0);\n }\n\n componentDidUpdate(prevProps: Props) {\n const isRestored = prevProps.messages.length === 0;\n if (isRestored && this.props.messages.length > 0) {\n this.scrollToBottom(0, 0);\n } else {\n const isBotTyping = this.props.isBotTyping;\n const hasNewMessages =\n prevProps.messages.length !== this.props.messages.length && prevProps.messages.length > 1;\n if (isBotTyping || hasNewMessages) {\n // call scrollToBottom asynchronously to prevent flickering\n setTimeout(() => this.scrollToBottom(700, 20), 10);\n }\n }\n }\n\n render() {\n const {\n messages,\n isBotTyping,\n showGeneralConditions,\n problemReportingEnabled,\n onProblemReport,\n onButtonClick,\n onLinkClick,\n translate,\n } = this.props;\n return (\n <div\n className={classNames(styles.messageContainer, 'chat__messageContainer')}\n id=\"MessageContainer\"\n role=\"log\"\n aria-live=\"polite\"\n >\n {showGeneralConditions && <GeneralConditions translate={translate} />}\n <ul className={styles.messages}>\n {messages.map((msg) => (\n <Message\n key={msg._id}\n translate={translate}\n message={msg}\n problemReportingEnabled={problemReportingEnabled}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n onProblemReport={onProblemReport}\n />\n ))}\n </ul>\n <TypingIndicator isTyping={isBotTyping} />\n <Element name=\"ScrollToElement\" />\n </div>\n );\n }\n}\n\nexport default Conversation;\n","import classNames from 'classnames';\nimport Markdown from 'markdown-to-jsx';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './PoweredBy.module.scss';\n\ninterface Props {\n translate: TranslateFunction;\n}\n\nconst Link: React.FC<{ title: string; href: string; children: React.ReactChildren }> = ({ title, href, children }) => {\n return (\n <a href={href} title={title} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n};\n\nconst PoweredBy = ({ translate }: Props) => {\n const powerdBy = translate('powered-by') as string;\n return powerdBy && powerdBy.length ? (\n <div className={classNames(styles.container, 'chat__poweredBy')}>\n <Markdown\n options={{\n overrides: {\n a: Link,\n },\n }}\n >\n {powerdBy}\n </Markdown>\n </div>\n ) : null;\n};\n\nexport default PoweredBy;\n","import classNames from 'classnames';\nimport Markdown from 'markdown-to-jsx';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport globalStyles from '../../Global.module.scss';\nimport styles from './TranscriptMail.module.scss';\n\ninterface Props {\n visible: boolean;\n translate: TranslateFunction;\n methods: {\n pdf: boolean;\n email: boolean;\n };\n onEmailExport: (email: string) => void;\n onPdfExport: () => void;\n onClose: () => void;\n}\n\nconst TranscriptMail = ({ visible, translate, methods, onEmailExport, onPdfExport, onClose }: Props) => {\n const [internalVisible, setInternalVisible] = useState<boolean | undefined>(undefined);\n const [submitted, setSubmitted] = useState(false);\n const [generatingPdf, setGeneratingPdf] = useState(false);\n const [email, setEmail] = useState<string | undefined>(undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (visible) {\n inputRef.current?.focus();\n setSubmitted(false);\n setGeneratingPdf(false);\n setInternalVisible(visible);\n } else if (internalVisible === true) {\n setInternalVisible(false);\n }\n }, [visible, internalVisible]);\n\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (email && email.length > 0) {\n onEmailExport(email);\n\n setSubmitted(true);\n setTimeout(onClose, 3 * 1000);\n }\n };\n\n const handleOnEmailChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const email = event.target.value.trim();\n const emailIsValide = /^\\w+([.-]?\\w+)*@\\w+([.-]?\\w+)*(\\.\\w{2,3})+$/.test(email);\n setEmail(emailIsValide ? email : '');\n };\n\n const handleGeneratePdf = () => {\n setGeneratingPdf(true);\n onPdfExport();\n setTimeout(onClose, 3 * 1000);\n };\n\n return (\n <div\n className={classNames(styles.container, {\n [styles.containerOpen]: internalVisible === true,\n [styles.containerClose]: internalVisible === false,\n })}\n >\n {methods.pdf && (\n <>\n <h2>{translate('export-transcript.pdf.title')}</h2>\n <Markdown className={styles.description}>\n {translate('export-transcript.pdf.description') as string}\n </Markdown>\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonDefault)}\n onClick={onClose}\n >\n {translate('export-transcript.pdf.cancel') as string}\n </button>\n <button\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n onClick={handleGeneratePdf}\n disabled={generatingPdf}\n >\n {translate('export-transcript.pdf.download') as string}\n </button>\n </div>\n </>\n )}\n {methods.email && (\n <>\n <h2>{translate('export-transcript.email.title')}</h2>\n <Markdown className={styles.description}>\n {translate('export-transcript.email.description') as string}\n </Markdown>\n\n <form onSubmit={handleOnSubmit} className={styles.formContainer}>\n <div>\n <input\n disabled={submitted}\n ref={inputRef}\n type=\"email\"\n placeholder={translate('export-transcript.email.placeholder') as string}\n className={styles.emailInput}\n onChange={handleOnEmailChange}\n />\n {email?.length === 0 ? (\n <div className={styles.validationError}>\n {translate('export-transcript.email.invalid')}\n </div>\n ) : null}\n </div>\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonDefault)}\n onClick={onClose}\n >\n {translate('export-transcript.email.cancel') as string}\n </button>\n <button\n type=\"submit\"\n disabled={submitted || email === undefined || email.length === 0}\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n >\n {translate('export-transcript.email.send') as string}\n </button>\n </div>\n </form>\n\n {submitted && (\n <div className={styles.submitted}>{translate('export-transcript.email.success')}</div>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default TranscriptMail;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\ninterface Props {\n value: number;\n index: number;\n count: number;\n readonly: boolean;\n onHover?: () => void;\n onClick?: () => void;\n}\n\nconst Star = ({ value, index, count, readonly, onHover, onClick }: Props) => {\n const handleOnKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (onClick && event.key === 'Enter') {\n onClick();\n }\n };\n\n return (\n <li className={classNames(styles.star, { [styles.starReadonly]: readonly }, 'chat__conversationRating__star')}>\n <div\n role=\"radio\"\n aria-checked={value > index ? 'true' : 'false'}\n aria-posinset={index + 1}\n aria-setsize={count}\n tabIndex={0}\n onMouseOver={onHover}\n onKeyDown={handleOnKeyDown}\n onClick={onClick}\n >\n <span role=\"img\" aria-label=\"Star\" className={classNames(styles.starIcon)}>\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n data-icon=\"star\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z\"></path>\n </svg>\n </span>\n </div>\n </li>\n );\n};\n\nexport default Star;\n","import classNames from 'classnames';\nimport { useState } from 'react';\nimport styles from './RateInput.module.scss';\nimport Star from './Star';\n\nconst STAR_COUNT = 5;\n\ninterface Props {\n value: number;\n size: 'small' | 'large';\n readonly?: boolean;\n onChange?: (value: number) => void;\n}\n\nconst Stars = ({ value, size, readonly = false, onChange }: Props) => {\n const [hoverValue, setHoverValue] = useState<number | undefined>(undefined);\n\n const handleOnMouseOut = () => {\n setHoverValue(undefined);\n };\n\n const handleOnStarHover = (starIndex: number) => () => {\n if (!readonly) {\n const hoverValue = starIndex + 1;\n setHoverValue(hoverValue);\n }\n };\n\n const handleOnStarClick = (starIndex: number) => () => {\n if (onChange && !readonly) {\n if (starIndex === 0 && value === 1) {\n onChange(0);\n } else {\n onChange(starIndex + 1);\n }\n setHoverValue(undefined);\n }\n };\n\n return (\n <ul\n tabIndex={0}\n role=\"radiogroup\"\n className={classNames(\n styles.stars,\n { [styles.starsSmall]: size === 'small', [styles.starsLarge]: size === 'large' },\n 'chat__conversationRating__stars',\n {\n chat__conversationRating__stars__small: size === 'small',\n chat__conversationRating__stars__large: size === 'large',\n }\n )}\n onMouseOut={handleOnMouseOut}\n >\n {Array(STAR_COUNT)\n .fill(0)\n .map((_, index) => (\n <Star\n key={index}\n value={hoverValue === undefined ? value : hoverValue}\n index={index}\n count={STAR_COUNT}\n readonly={readonly}\n onHover={handleOnStarHover(index)}\n onClick={handleOnStarClick(index)}\n />\n ))}\n </ul>\n );\n};\n\nexport default Stars;\n","import classNames from 'classnames';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './RateInput.module.scss';\nimport Stars from './Stars';\n\ninterface Props {\n visible: boolean;\n translate: TranslateFunction;\n onRate: (rating: number) => void;\n}\n\nconst CallToAction = ({ visible, translate, onRate }: Props) => {\n return visible ? (\n <div className={classNames(styles.callToActionContainer, 'chat__conversationRating__callToAction')}>\n <div className={classNames(styles.callToActionTitle, 'chat__conversationRating__callToAction__title')}>\n {translate('conversation-rating.call-to-action.title') as string}\n </div>\n <Stars value={0} size=\"small\" onChange={onRate} />\n </div>\n ) : null;\n};\n\nexport default CallToAction;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\nconst BotBubble = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={classNames(styles.rateFeedbackBotBubble, className)} {...rest}>\n <img className={classNames(styles.avatar)} src=\"bot.svg\" alt=\"Bot\" />\n <div className={classNames(styles.bubble, styles.botBubble)}>{children}</div>\n </div>\n);\n\nexport default BotBubble;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\nconst GuestBubble = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={classNames(styles.rateFeedbackGuestBubble, className)} {...rest}>\n <div className={classNames(styles.bubble, styles.guestBubble)}>{children}</div>\n </div>\n);\n\nexport default GuestBubble;\n","import classNames from 'classnames';\nimport { useEffect, useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport globalStyles from '../../../Global.module.scss';\nimport BotBubble from './BotBubble';\nimport GuestBubble from './GuestBubble';\nimport styles from './RateInput.module.scss';\nimport Stars from './Stars';\n\ninterface Props {\n visible: boolean;\n rating: number;\n translate: TranslateFunction;\n onClose: () => void;\n onRate: (value: number, feedback: string) => void;\n}\n\nconst RateOverlay = ({ visible, rating, translate, onRate, onClose }: Props) => {\n const [tempRating, setTempRating] = useState(rating);\n const [rateText, setRateText] = useState<string | undefined>(undefined);\n const [internalVisible, setInternalVisible] = useState<boolean | undefined>(undefined);\n const [submitted, setSubmitted] = useState(false);\n\n const guestFeedbackInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (visible) {\n setSubmitted(false);\n setInternalVisible(visible);\n } else if (internalVisible === true) {\n setInternalVisible(false);\n }\n }, [visible, internalVisible]);\n\n useEffect(() => {\n setTempRating(rating);\n }, [rating]);\n\n useEffect(() => {\n const text = translate(`conversation-rating.overlay.bot-message.rate-feedback.value-${tempRating}`) as string;\n setRateText(text?.length > 0 ? text : undefined);\n }, [tempRating, translate]);\n\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n onRate(tempRating, guestFeedbackInputRef.current?.value?.trim() || '');\n setSubmitted(true);\n };\n\n return (\n <div\n className={classNames(styles.rateOverlay, 'chat__conversationRating__overlay', {\n [styles.rateOverlayOpen]: internalVisible === true,\n [styles.rateOverlayClose]: internalVisible === false,\n })}\n >\n <form onSubmit={handleOnSubmit}>\n <div className={classNames(styles.body, 'chat__conversationRating__overlay__body')}>\n <div>\n <h2>{translate('conversation-rating.overlay.title') as string}</h2>\n <div className={classNames(styles.starsDescriptionContainer)}>\n <Stars value={tempRating} size=\"large\" readonly={submitted} onChange={setTempRating} />\n <div className={classNames(styles.starsDescription)}>\n <div>{translate('conversation-rating.overlay.star.very-bad') as string}</div>\n <div>{translate('conversation-rating.overlay.star.very-good') as string}</div>\n </div>\n </div>\n </div>\n <div className={classNames(styles.bubbles)}>\n {visible && rateText && (\n <>\n <BotBubble className=\"chat__conversationRating__overlay__botBubble\">\n <div>{rateText}</div>\n </BotBubble>\n\n {submitted && !!guestFeedbackInputRef.current?.value?.length && (\n <GuestBubble className=\"chat__conversationRating__overlay__guestBubble\">\n {guestFeedbackInputRef.current.value}\n </GuestBubble>\n )}\n\n {submitted && (\n <BotBubble className=\"chat__conversationRating__overlay__botBubble\">\n <div>\n {\n translate(\n 'conversation-rating.overlay.bot-message.submit-feedback'\n ) as string\n }\n </div>\n </BotBubble>\n )}\n </>\n )}\n </div>\n </div>\n\n <div className={classNames(styles.footer, 'chat__conversationRating__overlay__footer')}>\n {!submitted && (\n <input\n ref={guestFeedbackInputRef}\n placeholder={\n translate('conversation-rating.overlay.guest-feedback.input-placeholder') as string\n }\n />\n )}\n <div className={classNames(styles.actions, 'chat__conversationRating__overlay__footer__actions')}>\n {submitted ? (\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n onClick={onClose}\n >\n {translate('conversation-rating.overlay.action.close') as string}\n </button>\n ) : (\n <button\n type=\"submit\"\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n >\n {translate('conversation-rating.overlay.action.submit') as string}\n </button>\n )}\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nexport default RateOverlay;\n","import { useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ConversationRatingState } from '../../../types';\nimport CallToAction from './CallToAction';\nimport RateOverlay from './RateOverlay';\n\ninterface Props {\n conversationRating: ConversationRatingState;\n numberOfMessagesFromGuest: number;\n translate: TranslateFunction;\n onRate: (rating: number, feedback: string) => void;\n}\n\nconst ConversationRating = ({\n conversationRating: { enabled, rating },\n numberOfMessagesFromGuest,\n translate,\n onRate,\n}: Props) => {\n const [tempRating, setTempRating] = useState(0);\n const [showOverlay, setShowOverlay] = useState(false);\n\n const handleOnCallToActionChange = (rating: number) => {\n setTempRating(rating);\n setShowOverlay(true);\n };\n\n const handleOnCloseOverlay = () => setShowOverlay(false);\n\n const showCallToAction = !rating && numberOfMessagesFromGuest > 1;\n return enabled ? (\n <>\n <CallToAction visible={showCallToAction} translate={translate} onRate={handleOnCallToActionChange} />\n <RateOverlay\n visible={showOverlay}\n rating={tempRating}\n translate={translate}\n onRate={onRate}\n onClose={handleOnCloseOverlay}\n />\n </>\n ) : null;\n};\n\nexport default ConversationRating;\n","import classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './AudioRecorder.module.scss';\n\nconst BUFFER_SIZE = 2048;\nconst OUTPUT_SAMPLE_RATE = 16000;\n\n/**\n * The implementation of the AudioRecorder was inspired by the following blogpost:\n * https://typedarray.org/from-microphone-to-wav-with-getusermedia-and-web-audio/\n */\n\ninterface Props {\n translate: TranslateFunction;\n onAudioRecorded: (blob: Blob) => void;\n}\n\ninterface State {\n recordingState: string;\n}\n\nexport default class AudioRecorder extends React.Component<Props, State> {\n private audioInput: MediaStreamAudioSourceNode | null = null;\n private volume: GainNode | null = null;\n private leftchannel: Float32Array[] = [];\n private recorder: ScriptProcessorNode | null = null;\n private recordingLength: number = 0;\n private sampleRate: number | null = null;\n private mediaStream: MediaStream | null = null;\n\n constructor(props: Props) {\n super(props);\n this.state = { recordingState: 'none' };\n\n this.triggerAudioRecording = this.triggerAudioRecording.bind(this);\n this.triggerAudioRecordingSuccess = this.triggerAudioRecordingSuccess.bind(this);\n this.initRecording = this.initRecording.bind(this);\n this.processRecordingInput = this.processRecordingInput.bind(this);\n this.handleClickSubmitAudio = this.handleClickSubmitAudio.bind(this);\n this.handleClickStopAudio = this.handleClickStopAudio.bind(this);\n }\n\n triggerAudioRecording() {\n this.setState({ recordingState: 'connecting' });\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(this.triggerAudioRecordingSuccess);\n }\n\n triggerAudioRecordingSuccess(stream: MediaStream) {\n this.mediaStream = stream;\n this.leftchannel.length = 0;\n this.recordingLength = 0;\n\n this.initRecording(stream);\n }\n\n initRecording(stream: MediaStream) {\n var AudioContext = window.AudioContext || (window as any).webkitAudioContext;\n var context = new AudioContext();\n // we query the context sample rate (varies depending on platforms)\n this.sampleRate = context.sampleRate;\n // creates a gain node which adjusts the volume on audio streams\n this.volume = context.createGain();\n // creates an audio node from the microphone incoming stream\n this.audioInput = context.createMediaStreamSource(stream);\n // connect the stream to the gain node\n this.audioInput.connect(this.volume);\n this.recorder = context.createScriptProcessor(BUFFER_SIZE, 1, 1);\n this.recorder.onaudioprocess = this.processRecordingInput;\n // we connect the recorder\n this.volume.connect(this.recorder);\n this.recorder.connect(context.destination);\n }\n\n processRecordingInput(e: AudioProcessingEvent) {\n if (this.state.recordingState === 'connecting') {\n this.setState({ recordingState: 'recording' });\n }\n if (this.state.recordingState !== 'none') {\n const left = e.inputBuffer.getChannelData(0);\n // we clone the samples\n this.leftchannel.push(new Float32Array(left));\n this.recordingLength += BUFFER_SIZE;\n }\n }\n\n handleClickSubmitAudio() {\n // we flat the left channel down\n const leftBuffer = mergeBuffers(this.leftchannel, this.recordingLength);\n const downsampledBuffer = downsampleBuffer(leftBuffer, this.sampleRate || 0);\n\n // we create our wav file\n const blob = createWav(downsampledBuffer);\n this.props.onAudioRecorded(blob);\n\n // For debugging purpose: Set link to state so you can display a button on the UI to download the audio file:\n // var url = (window.URL || window.webkitURL).createObjectURL(blob);\n // this.setState({url});\n\n this.handleClickStopAudio();\n }\n\n handleClickStopAudio() {\n this.setState({ recordingState: 'none' });\n this.audioInput?.disconnect();\n this.volume?.disconnect();\n this.recorder?.disconnect();\n if (this.mediaStream) {\n this.mediaStream?.getAudioTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n }\n\n render() {\n return (\n <div className={styles.audioRecorder}>\n {this.state.recordingState === 'none' && (\n <button\n className={classNames(styles.recordButton, 'chat__button')}\n type=\"submit\"\n aria-label={this.props.translate('message-input.actions.start-audio-recording.label') as string}\n tabIndex={0}\n onClick={this.triggerAudioRecording}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </button>\n )}\n\n {this.state.recordingState === 'connecting' && (\n <svg\n className={styles.spinning}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n )}\n\n {this.state.recordingState === 'recording' && (\n <div className={styles.audioRecorder}>\n <button\n className={classNames(styles.cancelButton)}\n onClick={this.handleClickStopAudio}\n aria-label={\n this.props.translate('message-input.actions.stop-audio-recording.label') as string\n }\n tabIndex={0}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </button>\n <div className={styles.recorderIcon} />\n <button\n className={classNames(styles.submitButton)}\n type=\"submit\"\n onClick={this.handleClickSubmitAudio}\n aria-label={\n this.props.translate('message-input.actions.submit-audio-recording.label') as string\n }\n tabIndex={0}\n autoFocus\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n );\n }\n}\n\nconst createWav = (downsampledBuffer: Float32Array) => {\n const buffer = new ArrayBuffer(44 + downsampledBuffer.length * 2);\n const view = new DataView(buffer);\n\n // RIFF chunk descriptor\n writeUTFBytes(view, 0, 'RIFF');\n view.setUint32(4, 44 + downsampledBuffer.length * 2, true);\n writeUTFBytes(view, 8, 'WAVE');\n\n // FMT sub-chunk\n writeUTFBytes(view, 12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n\n // mono - 1 channel\n view.setUint16(22, 1, true);\n view.setUint32(24, OUTPUT_SAMPLE_RATE, true);\n view.setUint32(28, OUTPUT_SAMPLE_RATE * 4, true);\n view.setUint16(32, 4, true);\n view.setUint16(34, 16, true);\n\n // data sub-chunk\n writeUTFBytes(view, 36, 'data');\n view.setUint32(40, downsampledBuffer.length * 2, true);\n\n // write the PCM samples\n const lng = downsampledBuffer.length;\n let index = 44;\n const volume = 1;\n for (var i = 0; i < lng; i++) {\n view.setInt16(index, downsampledBuffer[i] * (0x7fff * volume), true);\n index += 2;\n }\n\n // our final binary blob\n return new Blob([view], { type: 'audio/wav' });\n};\n\nconst writeUTFBytes = (view: DataView, offset: number, val: string) => {\n for (var i = 0; i < val.length; i++) {\n view.setUint8(offset + i, val.charCodeAt(i));\n }\n};\n\nconst mergeBuffers = (channelBuffer: Float32Array[], recordingLength: number) => {\n const result = new Float32Array(recordingLength);\n let offset = 0;\n const lng = channelBuffer.length;\n for (var i = 0; i < lng; i++) {\n const buffer = channelBuffer[i];\n result.set(buffer, offset);\n offset += buffer.length;\n }\n return result;\n};\n\nconst downsampleBuffer = (buffer: Float32Array, sampleRate: number) => {\n if (OUTPUT_SAMPLE_RATE === sampleRate) {\n return buffer;\n }\n const sampleRateRatio = sampleRate / OUTPUT_SAMPLE_RATE;\n const newLength = Math.round(buffer.length / sampleRateRatio);\n const result = new Float32Array(newLength);\n let offsetResult = 0;\n let offsetBuffer = 0;\n while (offsetResult < result.length) {\n let nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);\n let accum = 0,\n count = 0;\n for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {\n accum += buffer[i];\n count++;\n }\n result[offsetResult] = accum / count;\n offsetResult++;\n offsetBuffer = nextOffsetBuffer;\n }\n return result;\n};\n","import classNames from 'classnames';\nimport React, { useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport AudioRecorder from './audio-recorder';\nimport styles from './TextInput.module.scss';\n\ninterface Props {\n speechSupport: boolean;\n transcriptExportEnabled: boolean;\n translate: TranslateFunction;\n onTextInput: (input: string) => void;\n onAudioRecorded: (blob: Blob) => void;\n onOpenTranscriptExportModal: () => void;\n}\n\nconst TextInput = ({\n speechSupport,\n transcriptExportEnabled,\n translate,\n onTextInput,\n onAudioRecorded,\n onOpenTranscriptExportModal,\n}: Props) => {\n const [hasText, setHasText] = useState(false);\n const userTextInput = useRef<HTMLInputElement>(null);\n\n const handleClickSubmitButton = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const currentUserInput = userTextInput.current;\n if (currentUserInput && currentUserInput.value.trim().length >= 1) {\n onTextInput(currentUserInput.value.trim());\n currentUserInput.value = '';\n setHasText(false);\n currentUserInput.focus();\n }\n };\n\n const handleOnInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value.trim();\n setHasText(value.length > 0);\n };\n\n return (\n <form className={classNames(styles.inputWrapper, 'chat__textInput')} onSubmit={handleClickSubmitButton}>\n <div className={styles.messageInputWrapper}>\n <input\n className={styles.messageInput}\n placeholder={translate('message-input-label') as string}\n ref={userTextInput}\n onChange={handleOnInputChange}\n tabIndex={0}\n />\n </div>\n <div className={classNames(styles.buttons, 'chat__buttons')}>\n {!hasText && transcriptExportEnabled && (\n <button\n type=\"button\"\n className={classNames(styles.button, 'chat__button')}\n aria-label={translate('message-input.actions.export-transcript.label') as string}\n tabIndex={0}\n onClick={onOpenTranscriptExportModal}\n >\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M456 231a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0z\"></path>\n </svg>\n </button>\n )}\n {hasText || !speechSupport || navigator.mediaDevices === undefined ? (\n <button\n className={classNames(styles.button, 'chat__button')}\n type=\"submit\"\n aria-label={translate('message-input.actions.submit.label') as string}\n tabIndex={0}\n >\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <defs>\n <style></style>\n </defs>\n <path d=\"M931.4 498.9L94.9 79.5c-3.4-1.7-7.3-2.1-11-1.2a15.99 15.99 0 00-11.7 19.3l86.2 352.2c1.3 5.3 5.2 9.6 10.4 11.3l147.7 50.7-147.6 50.7c-5.2 1.8-9.1 6-10.3 11.3L72.2 926.5c-.9 3.7-.5 7.6 1.2 10.9 3.9 7.9 13.5 11.1 21.5 7.2l836.5-417c3.1-1.5 5.6-4.1 7.2-7.1 3.9-8 .7-17.6-7.2-21.6zM170.8 826.3l50.3-205.6 295.2-101.3c2.3-.8 4.2-2.6 5-5 1.4-4.2-.8-8.7-5-10.2L221.1 403 171 198.2l628 314.9-628.2 313.2z\"></path>\n </svg>\n </button>\n ) : (\n speechSupport &&\n navigator.mediaDevices !== undefined && (\n <AudioRecorder translate={translate} onAudioRecorded={onAudioRecorded} />\n )\n )}\n </div>\n </form>\n );\n};\n\nexport default TextInput;\n","import { QuickReply } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport globalStyles from '../../../Global.module.scss';\nimport styles from './QuickReplies.module.scss';\n\ninterface Props {\n quickReplies: QuickReply[];\n onQuickReplyClick: (reply: QuickReply) => void;\n}\n\nconst QuickReplies = ({ quickReplies, onQuickReplyClick }: Props) =>\n quickReplies.length ? (\n <div className={classNames(styles.quickReplies, 'chat__quickReplies')}>\n {quickReplies.map((reply) => (\n <button\n key={reply.label}\n tabIndex={0}\n className={classNames(styles.quickReply, globalStyles.button, 'chat__button', 'chat__quickReply')}\n onClick={() => onQuickReplyClick(reply)}\n >\n {reply.label}\n </button>\n ))}\n </div>\n ) : null;\n\nexport default QuickReplies;\n","import { QuickReply, UploadRequest } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ConversationRatingState } from '../../types';\nimport ConversationRating from './conversation-rating';\nimport Input from './input';\nimport styles from './InputContainer.module.scss';\nimport QuickReplies from './quick-replies';\n\ninterface Props {\n numberOfMessagesFromGuest: number;\n quickReplies: QuickReply[];\n speechSupport: boolean;\n uploadRequest?: UploadRequest;\n transcriptExportEnabled: boolean;\n conversationRating: ConversationRatingState;\n translate: TranslateFunction;\n onTextInput: (text: string) => void;\n onRate: (rating: number, description: string) => void;\n onQuickReplyClick: (reply: QuickReply) => void;\n onUploadFile: (filename: string, blob: Blob, payload: any) => void;\n onAudioRecorded: (blob: Blob) => void;\n onOpenTranscriptExportModal: () => void;\n}\n\nconst UserInput = ({\n quickReplies,\n speechSupport,\n transcriptExportEnabled,\n conversationRating,\n numberOfMessagesFromGuest,\n translate,\n onTextInput,\n onRate,\n onQuickReplyClick,\n onAudioRecorded,\n onOpenTranscriptExportModal,\n}: Props) => (\n <div className={classNames(styles.inputContainer)}>\n <QuickReplies quickReplies={quickReplies} onQuickReplyClick={onQuickReplyClick} />\n <ConversationRating\n conversationRating={conversationRating}\n numberOfMessagesFromGuest={numberOfMessagesFromGuest}\n translate={translate}\n onRate={onRate}\n />\n <Input\n translate={translate}\n onTextInput={onTextInput}\n onAudioRecorded={onAudioRecorded}\n speechSupport={speechSupport}\n onOpenTranscriptExportModal={onOpenTranscriptExportModal}\n transcriptExportEnabled={transcriptExportEnabled}\n />\n </div>\n);\n\nexport default UserInput;\n","import { Button, QuickReply, reportProblemFromGuest, UploadRequest } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport queryString from 'query-string';\nimport React, { useEffect, useState } from 'react';\nimport { getActiveLanguage, getTranslate, TranslateFunction } from 'react-localize-redux';\nimport { connect as reduxConnect } from 'react-redux';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport {\n downloadTranscriptPdf,\n exportTranscript,\n handleButtonClick,\n handleLinkClick,\n handleQuickReplyClick,\n handleRatingFromUser,\n requestNLUEvent,\n sendAudioMessageFromUser,\n sendMessageFromUser,\n sendUploadFileFromUser,\n} from '../actions';\nimport { connect, restartChat } from '../actions/connectionActions';\nimport { ChatMessage, ConversationRatingState, RootState, UserType } from '../types';\nimport styles from './Chat.module.scss';\nimport Conversation from './conversation';\nimport PoweredBy from './powered-by';\nimport TranscriptMail from './transcript-mail';\nimport UserInput from './user-input';\n\n/**\n * Events von der Webseite, die den Webclient einbettet.\n */\nconst INCOMMING_EVENTS = {\n TRIGGER_ACTION: 'TRIGGER_ACTION',\n TRIGGER_STORY: 'TRIGGER_STORY',\n CHAT_MESSAGE_FROM_GUEST: 'CHAT_MESSAGE_FROM_GUEST',\n ON_CHAT_WINDOW_OPEN: 'ON_CHAT_WINDOW_OPEN',\n ON_CHAT_WINDOW_CLOSE: 'ON_CHAT_WINDOW_CLOSE',\n RESTART_CHAT: 'RESTART_CHAT', // Wird von Bubble CMS aufgerufen, wenn der Chat neu gestartet werden soll\n};\n\ninterface OwnProps {\n clientName: string;\n}\n\ninterface StateProps {\n messages: ChatMessage[];\n quickReplies: QuickReply[];\n isBotTyping: boolean;\n speechSupport: boolean;\n problemReportingEnabled: boolean;\n transcriptExportEnabled: {\n pdf: boolean;\n email: boolean;\n };\n conversationRating: ConversationRatingState;\n showGeneralConditions: boolean;\n uploadRequest?: UploadRequest;\n currentLanguage: string;\n translate: TranslateFunction;\n}\n\ninterface DispatchProps {\n onConnect: (clientName: string, querystrings: string) => void;\n onRestartChat: (clientName: string, querystrings: string) => void;\n onMessageFromUser: (text: string) => void;\n onRate: (rating: number, description: string) => void;\n onActionFromUser: (action: Action) => void;\n onQuickReplyClick: (reply: QuickReply) => void;\n onNluEvent: (event: string) => void;\n onButtonClick: (button: Button) => void;\n onLinkClick: (url: string) => void;\n onUploadFile: (filename: string, blob: Blob, payload: any) => void;\n onAudioRecorded: (blob: Blob) => void;\n onTranscriptExport: (email: string) => void;\n onPdfExport: () => void;\n onProblemReport: (actionId: string, problem: string | null) => void;\n}\n\ntype Props = StateProps & DispatchProps & OwnProps;\n\nconst ChatComponent = ({\n clientName,\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n currentLanguage,\n translate,\n onConnect,\n onRestartChat,\n onNluEvent,\n onMessageFromUser,\n onRate,\n onQuickReplyClick,\n onButtonClick,\n onLinkClick,\n onUploadFile,\n onAudioRecorded,\n onActionFromUser,\n onTranscriptExport,\n onPdfExport,\n onProblemReport,\n}: Props) => {\n const [showTranscriptMailOverlay, setShowTranscriptMailOverlay] = useState(false);\n const [cssClassName, setCssClassName] = useState<string | string[] | undefined>(undefined);\n\n useEffect(() => {\n window.document.documentElement.lang = currentLanguage;\n }, [currentLanguage]);\n\n useEffect(() => {\n const querystrings = window.location.search;\n const parsedQuerystrings = queryString.parse(querystrings);\n\n if (parsedQuerystrings.cssClassName) {\n setCssClassName(parsedQuerystrings.cssClassName);\n }\n\n /**\n * Meldung von ausserhalb (z.B. vom Wordpress Content-Bereich)\n */\n const handleOnMessageFromOutside = (event: any) => {\n switch (event.data.type) {\n case INCOMMING_EVENTS.TRIGGER_ACTION:\n onActionFromUser(event.data.action);\n break;\n case INCOMMING_EVENTS.TRIGGER_STORY:\n onNluEvent(event.data.story);\n break;\n case INCOMMING_EVENTS.ON_CHAT_WINDOW_OPEN:\n onActionFromUser({ type: 'webclient.chatwindow.opened' });\n break;\n case INCOMMING_EVENTS.ON_CHAT_WINDOW_CLOSE:\n onActionFromUser({ type: 'webclient.chatwindow.closed' });\n break;\n case INCOMMING_EVENTS.CHAT_MESSAGE_FROM_GUEST:\n onMessageFromUser(event.data.text);\n break;\n case INCOMMING_EVENTS.RESTART_CHAT:\n onRestartChat(clientName, querystrings);\n break;\n }\n };\n\n onConnect(clientName, querystrings);\n window.addEventListener('message', (event) => handleOnMessageFromOutside(event), false);\n return () => window.removeEventListener('message', handleOnMessageFromOutside);\n }, [clientName, onConnect, onRestartChat, onActionFromUser, onMessageFromUser, onNluEvent]);\n\n const anyExportEnabled = transcriptExportEnabled.email || transcriptExportEnabled.pdf;\n const numberOfMessagesFromGuest = messages.filter((m) => m.sender.type === UserType.GUEST).length;\n\n return (\n <div className={classNames(styles.chatwindow, 'chat__chatwindow', cssClassName)}>\n <div className={styles.chatcontent}>\n <Conversation\n messages={messages}\n isBotTyping={isBotTyping}\n showGeneralConditions={showGeneralConditions}\n problemReportingEnabled={problemReportingEnabled}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n onProblemReport={onProblemReport}\n translate={translate}\n />\n <UserInput\n quickReplies={isBotTyping ? [] : quickReplies}\n numberOfMessagesFromGuest={numberOfMessagesFromGuest}\n uploadRequest={uploadRequest}\n speechSupport={speechSupport}\n transcriptExportEnabled={anyExportEnabled}\n conversationRating={conversationRating}\n translate={translate}\n onRate={onRate}\n onQuickReplyClick={onQuickReplyClick}\n onTextInput={onMessageFromUser}\n onUploadFile={onUploadFile}\n onAudioRecorded={onAudioRecorded}\n onOpenTranscriptExportModal={() => setShowTranscriptMailOverlay(!showTranscriptMailOverlay)}\n />\n <PoweredBy translate={translate} />\n </div>\n {anyExportEnabled && (\n <TranscriptMail\n methods={transcriptExportEnabled}\n visible={showTranscriptMailOverlay}\n translate={translate}\n onEmailExport={onTranscriptExport}\n onPdfExport={onPdfExport}\n onClose={() => setShowTranscriptMailOverlay(false)}\n />\n )}\n </div>\n );\n};\n\nconst mapStateToProps = (state: RootState): StateProps => {\n const {\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n } = state.chat;\n return {\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n currentLanguage: getActiveLanguage(state.locale).code,\n translate: getTranslate(state.locale),\n };\n};\n\nconst bindAction = (dispatch: ThunkDispatch<RootState, void, Action>): DispatchProps => {\n return {\n onConnect: (clientName: string, querystrings: string) => dispatch(connect(clientName, querystrings)),\n onRestartChat: (clientName: string, querystrings: string) => dispatch(restartChat(clientName, querystrings)),\n onMessageFromUser: (text: string) => dispatch(sendMessageFromUser(text)),\n onRate: (value: number, feedback: string) => dispatch(handleRatingFromUser(value, feedback)),\n onAudioRecorded: (blob: Blob) => dispatch(sendAudioMessageFromUser(blob)),\n onActionFromUser: (action: Action) => dispatch(action),\n onQuickReplyClick: (reply: QuickReply) => dispatch(handleQuickReplyClick(reply)),\n onNluEvent: (event: string) => dispatch(requestNLUEvent(event)),\n onButtonClick: (button: any) => dispatch(handleButtonClick(button)),\n onLinkClick: (url: any) => dispatch(handleLinkClick(url)),\n onUploadFile: (filename: string, blob: Blob, payload: any) =>\n dispatch(sendUploadFileFromUser(filename, blob, payload)),\n onTranscriptExport: (email: string) => dispatch(exportTranscript(email)),\n onPdfExport: () => dispatch(downloadTranscriptPdf()),\n onProblemReport: (actionId: string, problem: string | null) =>\n dispatch(reportProblemFromGuest(actionId, problem)),\n };\n};\n\nexport default reduxConnect<StateProps, DispatchProps, OwnProps, RootState>(mapStateToProps, bindAction)(ChatComponent);\n","import { addTranslationForLanguage, initialize } from 'react-localize-redux';\nimport { AnyAction, Dispatch } from 'redux';\n\nconst init = (dispatch: Dispatch<AnyAction>) => {\n const languages = ['de', 'en', 'fr', 'it'];\n dispatch(\n initialize({\n languages,\n options: { defaultLanguage: 'de', renderToStaticMarkup: false, onMissingTranslation: () => '' },\n })\n );\n\n languages.forEach((language) => {\n const json = require(`./${language}.json`);\n dispatch(addTranslationForLanguage(json, language));\n });\n};\n\nexport default init;\n","import { AnyAction } from 'redux';\nimport * as ConnectionActions from '../actions/connectionActions';\nimport { ConnectionState, ConnectionStateEnum } from '../types';\n\nconst backendConnectionReducer = (state = initialState, action: AnyAction): ConnectionState => {\n switch (action.type) {\n case ConnectionActions.CONNECT:\n return Object.assign({}, state, {\n sessionId: action.sessionId,\n userId: action.userId,\n });\n\n case ConnectionActions.CONNECTING:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.CONNECTING,\n });\n\n case ConnectionActions.CONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.CONNECTED,\n });\n\n case ConnectionActions.DISCONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n });\n\n case ConnectionActions.RECONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.RECONNECTED,\n });\n\n case ConnectionActions.RESTORE_SESSION_ID:\n return Object.assign({}, state, {\n sessionId: action.sessionId,\n });\n\n case ConnectionActions.RESTART:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n sessionId: undefined,\n });\n\n default:\n return state;\n }\n};\n\nconst initialState: ConnectionState = {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n sessionId: undefined,\n userId: undefined,\n};\n\nexport default backendConnectionReducer;\n","import { ActionTypes, GuestUser, TextMessage } from '@botfabrik/engine-domain';\nimport { AnyAction } from 'redux';\nimport { v4 as uuid } from 'uuid';\nimport * as ClientActions from '../actions';\nimport { ChatMessage, ChatState, ConversationRatingState } from '../types';\n\nconst chatReducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case ActionTypes.TYPING_ON:\n return Object.assign({}, state, {\n isBotTyping: true,\n });\n\n case ActionTypes.TYPING_OFF:\n return Object.assign({}, state, {\n isBotTyping: false,\n });\n\n case ActionTypes.MESSAGE_FROM_GUEST:\n case ActionTypes.MESSAGE_WITHOUT_ANALYSIS_FROM_GUEST:\n return appendMessageFromGuestToState(state, action.message);\n\n case ActionTypes.MESSAGE_TO_GUEST:\n // Informiere das Top Window (z.B. unser Wordpress-Blog) über das eintreffen einer neuen Nachricht\n sendToParentPage(action);\n\n // id hinzufügen, damit wir nicht zweimal die selbe Meldung im State haben\n const message: ChatMessage = Object.assign({}, action.message, { _id: action.meta.actionId });\n const alreadyAdded = state.messages.filter((m: any) => m._id === action.meta.actionId).length > 0;\n\n return Object.assign({}, state, {\n messages: alreadyAdded ? state.messages : state.messages.concat([message]),\n quickReplies: message.quickReplies ? message.quickReplies : [],\n uploadRequest: message.uploadRequest ? message.uploadRequest : {},\n });\n\n case ClientActions.RESTORE_PREVIOUS_CHAT_MESSAGES:\n const messages = action.messages;\n if (messages.length > 0) {\n const lastMessage = messages[messages.length - 1];\n return Object.assign({}, initialState, {\n messages,\n quickReplies: lastMessage.quickReplies ? lastMessage.quickReplies : [],\n uploadRequest: lastMessage.uploadRequest ? lastMessage.uploadRequest : {},\n });\n } else {\n return initialState;\n }\n\n case ActionTypes.FILE_FROM_GUEST:\n const uploadRequest = Object.assign({}, state.uploadRequest, { uploadState: 'uploading' });\n return Object.assign({}, state, { uploadRequest });\n\n case ClientActions.MESSAGE_TO_PARENT_PAGE:\n sendToParentPage(action.message);\n return state;\n\n case ActionTypes.EVENT_TO_GUEST:\n sendToParentPage(action.event);\n return state;\n\n case ClientActions.EXPAND_WINDOW:\n sendToParentPage(action);\n return state;\n\n case ClientActions.ENABLE_SPEECH_SUPPORT:\n return Object.assign({}, state, { speechSupport: true });\n\n case ClientActions.ENABLE_PROBLEM_REPORTING_SUPPORT:\n return Object.assign({}, state, { problemReportingEnabled: true });\n\n case ClientActions.RECEIVE_SPEECH_TRANSCRIPTION:\n const msg = new TextMessage(action.transcription, new GuestUser());\n const chatMsg: ChatMessage = Object.assign({}, msg, { _id: uuid() });\n return appendMessageFromGuestToState(state, chatMsg);\n\n case ClientActions.ENABLE_TRANSCRIPT_EXPORT:\n return Object.assign({}, state, {\n transcriptExportEnabled: action.methods,\n });\n\n case ClientActions.SHOW_GENERAL_CONDITIONS:\n return Object.assign({}, state, { showGeneralConditions: true });\n\n case ActionTypes.PROBLEM_REPORT_FROM_GUEST:\n const msgs = state.messages.map((m) => {\n if (m._id === action.payload.actionId) {\n return Object.assign({}, m, { problemReport: action.payload.problem });\n } else {\n return m;\n }\n });\n return Object.assign({}, state, { messages: msgs });\n\n case ClientActions.ENABLE_CONVERSATION_RATING:\n const conversationRating: ConversationRatingState = {\n enabled: true,\n rating: action.payload.rating,\n };\n return Object.assign({}, state, { conversationRating });\n\n case ActionTypes.CONVERSATION_RATING_FROM_GUEST: {\n const conversationRating: ConversationRatingState = {\n ...state.conversationRating,\n rating: action.payload,\n };\n return Object.assign({}, state, { conversationRating });\n }\n\n default:\n return state;\n }\n};\n\nconst appendMessageFromGuestToState = (state: ChatState, message: ChatMessage) => {\n const lastMessage = state.messages[state.messages.length - 1];\n const sameText = (lastMessage as any)?.text === (message as any).text;\n if (lastMessage && lastMessage.sender.type === message.sender.type && sameText) {\n return state;\n }\n\n return Object.assign({}, state, {\n messages: state.messages.concat([message]),\n quickReplies: [],\n });\n};\n\nconst sendToParentPage = (action: any) => {\n if (isIframe()) {\n window.top?.postMessage(action, '*');\n } else if (action.type === 'webclient.change.url') {\n window.open(action.url);\n }\n};\n\nconst isIframe = () => typeof window !== 'undefined' && window.self !== window.top;\n\nconst initialState: ChatState = {\n messages: [],\n quickReplies: [],\n isBotTyping: false,\n speechSupport: false,\n problemReportingEnabled: false,\n transcriptExportEnabled: {\n pdf: false,\n email: false,\n },\n showGeneralConditions: false,\n conversationRating: {\n enabled: false,\n },\n};\n\nexport default chatReducer;\n","import { localizeReducer } from 'react-localize-redux';\nimport { combineReducers } from 'redux';\nimport backendConnectionReducer from './backendConnectionReducer';\nimport chatReducer from './chatReducer';\n\nconst rootReducer = combineReducers({\n chat: chatReducer,\n connection: backendConnectionReducer,\n locale: localizeReducer,\n});\n\nexport default rootReducer;\n","import { RootState } from '../types';\n\nconst LOCAL_STORAGE_LAST_SAVED_ITEM_NAME = 'bf-webclient-state-last-saved-at';\nconst LOCAL_STORAGE_STATE_ITEM_NAME = 'bf-webclient-state';\n\nexport const loadState = (clientName: string) => {\n try {\n if (!supportsLocalStorage()) {\n return undefined;\n }\n\n // get last save time\n const lastSavedAt = getStoreItem(clientName, LOCAL_STORAGE_LAST_SAVED_ITEM_NAME);\n if (isExpired(lastSavedAt)) {\n return undefined;\n } else {\n // load persisted state\n const serializedState = getStoreItem(clientName, LOCAL_STORAGE_STATE_ITEM_NAME);\n if (serializedState === null) {\n return undefined;\n }\n return JSON.parse(serializedState);\n }\n } catch (err) {\n console.error(err);\n return undefined;\n }\n};\n\nexport const saveState = (clientName: string, state: Partial<RootState>) => {\n try {\n // save state\n const serializedState = JSON.stringify(state);\n setStoreItem(clientName, LOCAL_STORAGE_STATE_ITEM_NAME, serializedState);\n\n // save current date\n let now = new Date().toISOString();\n setStoreItem(clientName, LOCAL_STORAGE_LAST_SAVED_ITEM_NAME, now);\n } catch (err) {\n // ignorieren\n console.error(err);\n }\n};\n\nconst isExpired = (lastSavedAt: string | null): boolean => {\n if (lastSavedAt === null) {\n return false;\n }\n let expiresAt = new Date(lastSavedAt);\n expiresAt.setHours(expiresAt.getHours() + 12);\n\n let now = new Date();\n\n return now > expiresAt;\n};\n\nconst supportsLocalStorage = () => typeof localStorage !== 'undefined';\nconst getStoreItem = (clientName: string, storeItemName: string) => localStorage.getItem(`${clientName}_${storeItemName}`);\nconst setStoreItem = (clientName: string, storeItemName: string, value: string) =>\n localStorage.setItem(`${clientName}_${storeItemName}`, value);\n","import { ActionTypes } from '@botfabrik/engine-domain';\nimport { addTranslationForLanguage, setActiveLanguage, SingleLanguageTranslation } from 'react-localize-redux';\nimport { AnyAction, Dispatch, Middleware, MiddlewareAPI } from 'redux';\nimport io from 'socket.io-client';\nimport { Devices } from '../../../src';\nimport * as ChatActions from '../actions';\nimport * as ClientActions from '../actions';\nimport * as ConnectionActions from '../actions/connectionActions';\nimport { EnableConversationRatingType, RootState } from '../types';\n\n// Blacklisted actions are not forwarded to the server\nconst blacklist = [\n ActionTypes.MESSAGE_TO_GUEST,\n ActionTypes.EVENT_TO_GUEST,\n ActionTypes.TYPING_ON,\n ActionTypes.TYPING_OFF,\n ...ConnectionActions.INTERNAL_ACTIONS,\n ...ChatActions.INTERNAL_ACTIONS,\n '@@localize/SET_ACTIVE_LANGUAGE',\n '@@localize/ADD_TRANSLATION_FOR_LANGUAGE',\n];\n\nconst socketMiddleware: Middleware =\n ({ dispatch, getState }: MiddlewareAPI<Dispatch, RootState>) =>\n (next: Dispatch<AnyAction>) => {\n let socket: SocketIOClient.Socket | null = null;\n\n return (action: AnyAction) => {\n let result = next(action);\n\n if (action.type === ConnectionActions.CONNECT) {\n if (socket != null) {\n socket.disconnect();\n }\n dispatch(ConnectionActions.connecting());\n\n socket = io(`/${action.clientName}/chat?${action.querystrings}`);\n\n socket.on('action', dispatch);\n socket.on('connect', () => dispatch(ConnectionActions.connected()));\n socket.on('disconnect', () => dispatch(ConnectionActions.disconnected()));\n socket.on('reconnect', () => dispatch(ConnectionActions.reconnected()));\n socket.on('set-translations', (language: string, translation: SingleLanguageTranslation) => {\n dispatch(setActiveLanguage(language));\n dispatch(addTranslationForLanguage(translation, language));\n });\n socket.on('enable-speech-support', () => dispatch(ChatActions.enableSpeechSupport()));\n socket.on('enable-problem-reporting', () => dispatch(ChatActions.enableProblemReportingSupport()));\n socket.on('enable-transcript-export', (props: { pdf: boolean; email: boolean }) =>\n dispatch(ChatActions.enableTranscriptExport(props))\n );\n socket.on('enable-conversation-rating', (rating: EnableConversationRatingType) =>\n dispatch(ChatActions.enableConversationRating(rating))\n );\n socket.on('speech-transcription', (transcription: string) =>\n dispatch(ChatActions.receiveSpeechTranscription(transcription))\n );\n socket.on('restore-client-state', (state: any) => {\n socket!.io.uri = socket!.io.uri.replace(action.sessionId, state.sessionId);\n dispatch(ConnectionActions.restoreSessionId(state.sessionId));\n dispatch(ChatActions.restorePreviousChatMessages(state.messages));\n });\n socket.on('file-uploaded', () => console.log('webclient socket middleware: file-uploaded'));\n socket.on('expand-window', ({ devices }: { devices: Devices }) =>\n dispatch({ type: ClientActions.EXPAND_WINDOW, devices })\n );\n socket.on('show-general-conditions', () => dispatch(ChatActions.showGeneralConditions()));\n } else if (action.type === ChatActions.GET_STARTED) {\n socket?.emit('get-started', JSON.stringify(action));\n } else if (action.type === ActionTypes.FILE_FROM_GUEST) {\n socket?.emit('file-from-guest', JSON.stringify(action));\n } else if (action.type === ChatActions.AUDIO_MESSAGE_FROM_USER) {\n socket?.emit('audio-message', action.buffer);\n } else if (action.type === ActionTypes.CONVERSATION_RATING_FROM_GUEST) {\n socket?.emit('conversation-rating', action.payload);\n } else if (action.type === ChatActions.DOWNLOAD_TRANSCRIPT_PDF) {\n const {\n connection: { sessionId },\n } = getState();\n window.location.href = `/transcript-pdf/${sessionId}`;\n } else if (blacklist.indexOf(action.type) === -1 && action.meta === undefined) {\n // Foreward all other actions to the server\n if (socket) {\n socket.emit('action', JSON.stringify(action));\n } else {\n // TODO: wenn socket undefined ist, diese sammeln und später abarbeiten\n }\n }\n\n return result;\n };\n };\n\nexport default socketMiddleware;\n","import throttle from 'lodash/throttle';\nimport { applyMiddleware, compose, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport reducer from '../reducers';\nimport { loadState, saveState } from './localStorage';\nimport socketMiddleware from './socketMiddleware';\n\nconst configureStore = (clientName: string) => {\n const persistedState = loadState(clientName);\n const store = compose(applyMiddleware(thunk, socketMiddleware))(createStore)(reducer, persistedState);\n\n store.subscribe(\n throttle(() => {\n let state = store.getState();\n saveState(clientName, {\n connection: state.connection,\n });\n }, 1000)\n );\n\n return store;\n};\n\nexport default configureStore;\n","import React from 'react';\nimport 'react-app-polyfill/ie11';\nimport { Provider } from 'react-redux';\nimport styles from './Client.module.scss';\nimport Chat from './components/Chat';\nimport initTranslations from './locales/initialize';\nimport configureStore from './store/configureStore';\n\nconst App = () => {\n const clientName = extractClientNameFromPathname(window.location.pathname);\n const store = configureStore(clientName);\n initTranslations(store.dispatch);\n\n return (\n <Provider store={store}>\n <div className={styles.chatPage}>\n <Chat clientName={clientName} />\n </div>\n </Provider>\n );\n};\n\nconst extractClientNameFromPathname = (pathname: string) => {\n const pathElements = pathname.split('/');\n const endsWithSlash = pathname.endsWith('/');\n return pathElements[pathElements.length - (endsWithSlash ? 2 : 1)];\n};\n\nexport default App;\n","// TODO: move the content of this file to index.tsx if IE11 is no longer supportd\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(<App />, document.getElementById('root'));\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"audioRecorder\":\"AudioRecorder_audioRecorder__37BQJ\",\"recordButton\":\"AudioRecorder_recordButton__3-QeV\",\"submitButton\":\"AudioRecorder_submitButton__10pVF\",\"cancelButton\":\"AudioRecorder_cancelButton__64CTn\",\"recorderIcon\":\"AudioRecorder_recorderIcon__2o4Ov\",\"pulse\":\"AudioRecorder_pulse__3Xsbm\",\"spinning\":\"AudioRecorder_spinning__1hO3P\",\"spin\":\"AudioRecorder_spin__3bMw-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"callToActionContainer\":\"RateInput_callToActionContainer__2L-qj\",\"append-animate\":\"RateInput_append-animate__3DMLo\",\"callToActionTitle\":\"RateInput_callToActionTitle__1iGzl\",\"rateOverlay\":\"RateInput_rateOverlay__J7JDV\",\"body\":\"RateInput_body__2uJD2\",\"rateOverlayOpen\":\"RateInput_rateOverlayOpen__1Gcs8\",\"slide-in\":\"RateInput_slide-in__1n3Pc\",\"rateOverlayClose\":\"RateInput_rateOverlayClose__3UAYN\",\"slide-out\":\"RateInput_slide-out__1ER5Q\",\"footer\":\"RateInput_footer__2KF23\",\"actions\":\"RateInput_actions__322Xb\",\"bubbles\":\"RateInput_bubbles__5dsER\",\"rateFeedbackBotBubble\":\"RateInput_rateFeedbackBotBubble__2OU7a\",\"rateFeedbackGuestBubble\":\"RateInput_rateFeedbackGuestBubble__D1C8m\",\"avatar\":\"RateInput_avatar__kJM55\",\"fadeInLeft\":\"RateInput_fadeInLeft__1m8Su\",\"bubble\":\"RateInput_bubble__2Zvzl\",\"appear\":\"RateInput_appear__2hqru\",\"botBubble\":\"RateInput_botBubble__1RalY\",\"guestBubble\":\"RateInput_guestBubble__2n9oO\",\"rateText\":\"RateInput_rateText__TevGU\",\"stars\":\"RateInput_stars__3NNAj\",\"starsSmall\":\"RateInput_starsSmall__2rDnY\",\"starsLarge\":\"RateInput_starsLarge__2DHxK\",\"star\":\"RateInput_star__3VZmc\",\"starReadonly\":\"RateInput_starReadonly__tlZX_\",\"starIcon\":\"RateInput_starIcon__1bPxv\",\"starsDescriptionContainer\":\"RateInput_starsDescriptionContainer__37Bi1\",\"starsDescription\":\"RateInput_starsDescription__28mx4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputWrapper\":\"TextInput_inputWrapper__1fIyq\",\"messageInputWrapper\":\"TextInput_messageInputWrapper__6KJHK\",\"messageInput\":\"TextInput_messageInput__2fCF7\",\"buttons\":\"TextInput_buttons__qLokb\",\"button\":\"TextInput_button__5my0Y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"generalConditionsContainer\":\"GeneralConditions_generalConditionsContainer__2AZfv\",\"generalConditions\":\"GeneralConditions_generalConditions__2o9K6\",\"generalConditionsHeader\":\"GeneralConditions_generalConditionsHeader__3AdUS\",\"generalConditionsBody\":\"GeneralConditions_generalConditionsBody__k8BFW\",\"generalConditionsAccept\":\"GeneralConditions_generalConditionsAccept__3390Q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"problemReport\":\"ProblemReport_problemReport__2rF6I\",\"problemReportIcon\":\"ProblemReport_problemReportIcon__1iPpu\",\"problemReportIconActive\":\"ProblemReport_problemReportIconActive__HbMKR\",\"problemReportIconInactive\":\"ProblemReport_problemReportIconInactive__3btGw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ticontainer\":\"TypingIndicator_ticontainer__29oO1\",\"tiblock\":\"TypingIndicator_tiblock__1QBS0\",\"tidot\":\"TypingIndicator_tidot__3aLQm\",\"mercuryTypingAnimation\":\"TypingIndicator_mercuryTypingAnimation__3fDgV\"};"],"sourceRoot":""}
1
+ {"version":3,"sources":["components/conversation/message/detail-message/DetailMessage.module.scss","Global.module.scss","components/Chat.module.scss","components/conversation/MessageContainer.module.scss","components/user-input/quick-replies/QuickReplies.module.scss","components/conversation/message/Message.module.scss","Client.module.scss","components/conversation/message/Text.module.scss","components/powered-by/PoweredBy.module.scss","components/user-input/InputContainer.module.scss","components/transcript-mail/TranscriptMail.module.scss","locales sync /^/.//.*/.json$","index-a-polyfill.tsx","types.ts","actions/handleQuickReplyClick.ts","actions/sendMessageFromUser.ts","actions/index.ts","actions/connectionActions.ts","components/conversation/general-conditions/index.tsx","components/conversation/message/bot-message/ProblemReport.tsx","components/conversation/message/bot-message/index.tsx","components/conversation/message/detail-message/Buttons.tsx","components/conversation/message/Text.tsx","components/conversation/message/detail-message/Subtitle.tsx","components/conversation/message/MarkdownText.tsx","components/conversation/message/detail-message/Text.tsx","components/conversation/message/detail-message/Title.tsx","components/conversation/message/detail-message/Body.tsx","components/conversation/message/detail-message/Image.tsx","components/conversation/message/detail-message/index.tsx","components/conversation/message/guest-message/index.tsx","components/conversation/message/markdown-message/index.tsx","components/conversation/message/text-message/index.tsx","components/conversation/message/index.tsx","components/conversation/typing-indicator/index.tsx","components/conversation/index.tsx","components/powered-by/index.tsx","components/transcript-mail/index.tsx","components/user-input/conversation-rating/Star.tsx","components/user-input/conversation-rating/Stars.tsx","components/user-input/conversation-rating/CallToAction.tsx","components/user-input/conversation-rating/BotBubble.tsx","components/user-input/conversation-rating/GuestBubble.tsx","components/user-input/conversation-rating/RateOverlay.tsx","components/user-input/conversation-rating/index.tsx","components/user-input/input/audio-recorder.tsx","components/user-input/input/index.tsx","components/user-input/quick-replies/index.tsx","components/user-input/index.tsx","components/Chat.tsx","locales/initialize.ts","reducers/backendConnectionReducer.ts","reducers/chatReducer.ts","reducers/index.ts","store/localStorage.ts","store/socketMiddleware.ts","store/configureStore.ts","App.tsx","index-b-app.tsx","components/user-input/input/AudioRecorder.module.scss","components/user-input/conversation-rating/RateInput.module.scss","components/user-input/input/TextInput.module.scss","components/conversation/general-conditions/GeneralConditions.module.scss","components/conversation/message/bot-message/ProblemReport.module.scss","components/conversation/typing-indicator/TypingIndicator.module.scss"],"names":["module","exports","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","String","prototype","endsWith","searchString","position","subjectString","this","toString","isFinite","Math","floor","length","lastIndex","indexOf","includes","search","start","Array","defineProperty","value","searchElement","fromIndex","TypeError","len","x","y","n","k","max","abs","isNaN","find","predicate","thisArg","arguments","kValue","call","configurable","writable","ConnectionStateEnum","UserType","handleQuickReplyClick","reply","dispatch","payload","type","ActionTypes","MESSAGE_FROM_GUEST","receiveTextMessageWithoutAnalysisFromGuest","label","sendMessageFromUser","text","getState","matchedQuickReply","chat","quickReplies","qr","toLocaleLowerCase","receiveTextMessageFromGuest","MESSAGE_TO_PARENT_PAGE","RESTORE_PREVIOUS_CHAT_MESSAGES","AUDIO_MESSAGE_FROM_USER","ENABLE_SPEECH_SUPPORT","ENABLE_PROBLEM_REPORTING_SUPPORT","ENABLE_TRANSCRIPT_EXPORT","RECEIVE_SPEECH_TRANSCRIPTION","SHOW_GENERAL_CONDITIONS","ENABLE_CONVERSATION_RATING","GET_STARTED","EXPAND_WINDOW","DOWNLOAD_TRANSCRIPT_PDF","INTERNAL_ACTIONS","notifyParentToChangePath","url","message","CONNECT","CONNECTING","CONNECTED","DISCONNECTED","RECONNECTED","RESTORE_SESSION_ID","RESTART","connect","clientName","querystrings","parsedQuerystrings","queryString","parse","connectionState","connection","sessionId","undefined","uuid","userId","userIdCookie","Cookies","get","set","doConnect","stringify","doRestartChat","ACCEPT_KEY","GeneralConditions","translate","useState","showDetails","setShowDetails","toggleShowDetails","headerText","acceptText","className","styles","generalConditionsContainer","generalConditions","role","onClick","onKeyDown","event","key","tabIndex","generalConditionsHeader","generalConditionsBody","generalConditionsAccept","ProblemReport","reported","onReport","handleOnReport","problem","handleOnReportKeyDown","problemReport","classNames","problemReportIcon","problemReportIconActive","src","title","alt","problemReportIconInactive","BotMessage","problemReportingEnabled","onProblemReport","children","messageBot","avatar","sender","BOT","bubble","bubbleLeft","leftText","Buttons","buttons","onButtonClick","button","index","globalStyles","Text","onLinkClick","componentDecorator","decoratedHref","decoratedText","href","preventDefault","split","item","Emoji","emojify","Subtitle","subtitle","OPEN_LINK_IN_NEW_TAB_INDICATOR","MarkdownText","markdown","handleOnLinkClick","options","overrides","a","slice","target","rel","Title","Body","messageStyle","bubbleContent","Image","imageUrl","itemUrl","hasBody","video_container","video","only","width","frameBorder","allowFullScreen","imageContainer","image","DetailMessage","detailMessage","UserMessage","messageUser","bubbleRight","rightText","MarkdownMessage","TextMessage","Message","msgCmp","getMessageCmp","GUEST","_id","MessageTypeEnum","TEXT","textMessage","DETAIL","MARKDOWN","markdownMessage","areEqual","prevProps","nextProps","React","memo","TypingIndicator","isTyping","ticontainer","tiblock","tidot","Element","Scroll","Conversation","duration","delay","scroller","scrollTo","smooth","containerId","scrollToBottom","messages","props","isBotTyping","hasNewMessages","setTimeout","showGeneralConditions","messageContainer","msg","name","Component","Link","PoweredBy","powerdBy","container","TranscriptMail","visible","methods","onEmailExport","onPdfExport","onClose","internalVisible","setInternalVisible","submitted","setSubmitted","generatingPdf","setGeneratingPdf","email","setEmail","inputRef","useRef","useEffect","current","focus","containerOpen","containerClose","pdf","description","actions","buttonDefault","buttonPrimary","disabled","onSubmit","formContainer","ref","placeholder","emailInput","onChange","trim","emailIsValide","test","validationError","Star","count","readonly","onHover","star","starReadonly","onMouseOver","starIcon","viewBox","focusable","height","fill","d","Stars","size","hoverValue","setHoverValue","handleOnStarClick","starIndex","stars","starsSmall","starsLarge","chat__conversationRating__stars__small","chat__conversationRating__stars__large","onMouseOut","_","CallToAction","onRate","callToActionContainer","callToActionTitle","BotBubble","rest","rateFeedbackBotBubble","botBubble","GuestBubble","rateFeedbackGuestBubble","guestBubble","RateOverlay","rating","tempRating","setTempRating","rateText","setRateText","guestFeedbackInputRef","rateOverlay","rateOverlayOpen","rateOverlayClose","body","starsDescriptionContainer","starsDescription","bubbles","footer","ConversationRating","conversationRating","enabled","numberOfMessagesFromGuest","showOverlay","setShowOverlay","showCallToAction","OUTPUT_SAMPLE_RATE","AudioRecorder","audioInput","volume","leftchannel","recorder","recordingLength","sampleRate","mediaStream","state","recordingState","triggerAudioRecording","bind","triggerAudioRecordingSuccess","initRecording","processRecordingInput","handleClickSubmitAudio","handleClickStopAudio","setState","navigator","mediaDevices","getUserMedia","audio","then","stream","context","window","AudioContext","webkitAudioContext","createGain","createMediaStreamSource","createScriptProcessor","onaudioprocess","destination","left","inputBuffer","getChannelData","push","Float32Array","leftBuffer","mergeBuffers","downsampledBuffer","downsampleBuffer","blob","createWav","onAudioRecorded","disconnect","getAudioTracks","forEach","track","stop","audioRecorder","recordButton","xmlns","spinning","cancelButton","recorderIcon","submitButton","autoFocus","buffer","ArrayBuffer","view","DataView","writeUTFBytes","setUint32","setUint16","lng","i","setInt16","Blob","offset","val","setUint8","charCodeAt","channelBuffer","result","sampleRateRatio","newLength","round","offsetResult","offsetBuffer","nextOffsetBuffer","accum","TextInput","speechSupport","transcriptExportEnabled","onTextInput","onOpenTranscriptExportModal","hasText","setHasText","userTextInput","inputWrapper","currentUserInput","messageInputWrapper","messageInput","QuickReplies","onQuickReplyClick","quickReply","UserInput","inputContainer","INCOMMING_EVENTS","reduxConnect","uploadRequest","currentLanguage","getActiveLanguage","locale","getTranslate","onConnect","onRestartChat","restartChat","onMessageFromUser","feedback","CONVERSATION_RATING_FROM_GUEST","handleRatingFromUser","sendAudioMessageFromUser","onActionFromUser","action","onNluEvent","coreRequestNLUEvent","requestNLUEvent","ButtonTypeEnum","WEB_URL","POSTBACK","handleButtonClick","handleLinkClick","onUploadFile","filename","receiveFileFromGuest","sendUploadFileFromUser","onTranscriptExport","TRANSCRIPT_MAIL_REQUEST","parameters","mailTo","exportTranscript","actionId","reportProblemFromGuest","showTranscriptMailOverlay","setShowTranscriptMailOverlay","cssClassName","setCssClassName","document","documentElement","lang","location","handleOnMessageFromOutside","data","story","addEventListener","removeEventListener","anyExportEnabled","filter","m","chatwindow","chatcontent","init","languages","initialize","defaultLanguage","renderToStaticMarkup","onMissingTranslation","language","json","require","addTranslationForLanguage","initialState","backendConnectionReducer","ConnectionActions","assign","appendMessageFromGuestToState","lastMessage","sameText","concat","sendToParentPage","isIframe","top","postMessage","open","self","chatReducer","TYPING_ON","TYPING_OFF","MESSAGE_WITHOUT_ANALYSIS_FROM_GUEST","MESSAGE_TO_GUEST","meta","alreadyAdded","ClientActions","FILE_FROM_GUEST","uploadState","EVENT_TO_GUEST","transcription","GuestUser","chatMsg","PROBLEM_REPORT_FROM_GUEST","msgs","rootReducer","combineReducers","localizeReducer","LOCAL_STORAGE_LAST_SAVED_ITEM_NAME","LOCAL_STORAGE_STATE_ITEM_NAME","isExpired","lastSavedAt","expiresAt","Date","setHours","getHours","supportsLocalStorage","localStorage","getStoreItem","storeItemName","getItem","setStoreItem","setItem","blacklist","ChatActions","socketMiddleware","next","socket","io","on","translation","setActiveLanguage","uri","replace","console","log","devices","emit","JSON","configureStore","persistedState","serializedState","err","error","loadState","store","compose","applyMiddleware","thunk","createStore","reducer","subscribe","throttle","now","toISOString","saveState","extractClientNameFromPathname","pathname","pathElements","endsWithSlash","App","initTranslations","chatPage","Chat","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.cad44cf0.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"imageContainer\":\"DetailMessage_imageContainer__2ihF8\",\"title\":\"DetailMessage_title__1RlQT\",\"subtitle\":\"DetailMessage_subtitle__18WDj\",\"buttons\":\"DetailMessage_buttons__2xB0e\",\"button\":\"DetailMessage_button__2eSMw\",\"image\":\"DetailMessage_image__2Gyth\",\"video_container\":\"DetailMessage_video_container__7lOBq\",\"video\":\"DetailMessage_video__3VEwq\",\"only\":\"DetailMessage_only__3Pr5W\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"Global_button__33oEy\",\"buttonDefault\":\"Global_buttonDefault__3nUVN\",\"buttonPrimary\":\"Global_buttonPrimary__3ebHA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"chatwindow\":\"Chat_chatwindow__2gTsn\",\"chatcontent\":\"Chat_chatcontent__-wQ0P\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"messageContainer\":\"MessageContainer_messageContainer__1AKXT\",\"messages\":\"MessageContainer_messages__2GeSj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"quickReplies\":\"QuickReplies_quickReplies__26tJr\",\"quickReply\":\"QuickReplies_quickReply__PrklG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"messageBot\":\"Message_messageBot__3cmFc\",\"messageUser\":\"Message_messageUser__1PbuM\",\"avatar\":\"Message_avatar__1GG1t\",\"bubble\":\"Message_bubble__yOubG\",\"bubbleContent\":\"Message_bubbleContent__iwyjo\",\"bubbleLeft\":\"Message_bubbleLeft__11Sts\",\"leftText\":\"Message_leftText__1KoBc\",\"bubbleRight\":\"Message_bubbleRight__2Qu4n\",\"rightText\":\"Message_rightText__3RrIO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"chatPage\":\"Client_chatPage__126Ne\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"text\":\"Text_text__1zaFO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"PoweredBy_container__3PZQc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputContainer\":\"InputContainer_inputContainer__3uWNo\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"TranscriptMail_container__xZvk4\",\"containerOpen\":\"TranscriptMail_containerOpen__1hqU0\",\"slide-in\":\"TranscriptMail_slide-in__XH6FI\",\"containerClose\":\"TranscriptMail_containerClose__3O-kH\",\"slide-out\":\"TranscriptMail_slide-out__1UFOz\",\"formContainer\":\"TranscriptMail_formContainer__bJ8SH\",\"emailInput\":\"TranscriptMail_emailInput__3FwaM\",\"description\":\"TranscriptMail_description__1IsWl\",\"actions\":\"TranscriptMail_actions__2qBTc\",\"validationError\":\"TranscriptMail_validationError__3pqpz\",\"submitted\":\"TranscriptMail_submitted__q60CQ\"};","var map = {\n\t\"./de.json\": 342,\n\t\"./en.json\": 343,\n\t\"./fr.json\": 344,\n\t\"./it.json\": 345\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 341;","// TODO: remove this file, if IE11 is no longer supported\n\nimport 'react-app-polyfill/ie11';\n\n// Polyfill for IE11 support\nif (!String.prototype.endsWith) {\n String.prototype.endsWith = function (searchString, position) {\n var subjectString = this.toString();\n if (\n typeof position !== 'number' ||\n !isFinite(position) ||\n Math.floor(position) !== position ||\n position > subjectString.length\n ) {\n position = subjectString.length;\n }\n position -= searchString.length;\n var lastIndex = subjectString.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n };\n}\n\nif (!String.prototype.includes) {\n String.prototype.includes = function (search, start) {\n 'use strict';\n if (typeof start !== 'number') {\n start = 0;\n }\n\n if (start + search.length > this.length) {\n return false;\n } else {\n return this.indexOf(search, start) !== -1;\n }\n };\n}\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, 'includes', {\n value: function (searchElement: any, fromIndex: number) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x: any, y: any) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(searchElement, elementK) is true, return true.\n if (sameValueZero(o[k], searchElement)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n },\n });\n}\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate: any) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n var thisArg = arguments[1];\n\n // 5. Let k be 0.\n var k = 0;\n\n // 6. Repeat, while k < len\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n // e. Increase k by 1.\n k++;\n }\n\n // 7. Return undefined.\n return undefined;\n },\n configurable: true,\n writable: true,\n });\n}\n","import { Message, QuickReply, UploadRequest } from '@botfabrik/engine-domain';\nimport { LocalizeState } from 'react-localize-redux';\n\nexport interface RootState {\n chat: ChatState;\n connection: ConnectionState;\n locale: LocalizeState;\n}\n\nexport interface ChatMessage extends Message {\n _id: string;\n problemReport?: string;\n}\n\nexport interface ChatState {\n isBotTyping: boolean;\n messages: ChatMessage[];\n quickReplies: QuickReply[];\n uploadRequest?: UploadRequest;\n speechSupport: boolean;\n problemReportingEnabled: boolean;\n transcriptExportEnabled: {\n email: boolean;\n pdf: boolean;\n };\n showGeneralConditions: boolean;\n conversationRating: ConversationRatingState;\n}\n\nexport interface EnableConversationRatingType {\n rating?: ConversationRating;\n}\n\nexport interface ConversationRatingState {\n enabled: boolean;\n rating?: ConversationRating;\n}\n\nexport interface ConversationRating {\n value: number;\n feedback: string;\n}\n\nexport enum ConnectionStateEnum {\n CONNECTING,\n CONNECTED,\n RECONNECTED,\n DISCONNECTED,\n}\n\nexport interface ConnectionState {\n connectionState: ConnectionStateEnum;\n sessionId: string | undefined;\n userId: string | undefined;\n}\n\nexport interface Sender {\n avatar: string;\n type: UserType;\n}\n\nexport enum UserType {\n GUEST = 'GUEST',\n BOT = 'BOT',\n PERSON = 'PERSON',\n}\n","import { Action, ActionTypes, QuickReply, receiveTextMessageWithoutAnalysisFromGuest } from '@botfabrik/engine-domain';\nimport { AnyAction } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { RootState } from '../types';\n\nconst handleQuickReplyClick = (reply: QuickReply) => {\n return (dispatch: ThunkDispatch<RootState, void, Action>) => {\n if (reply.payload.type !== ActionTypes.MESSAGE_FROM_GUEST) {\n dispatch(receiveTextMessageWithoutAnalysisFromGuest(reply.label, reply.payload));\n }\n return dispatch(reply.payload as AnyAction);\n };\n};\n\nexport default handleQuickReplyClick;\n","import { Action, receiveTextMessageFromGuest } from '@botfabrik/engine-domain';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { RootState } from '../types';\nimport handleQuickReplyClick from './handleQuickReplyClick';\n\n/**\n * Informiere den Store, dass der Benutzer eine neue Nachricht gesendet hat.\n */\nconst sendMessageFromUser = (text: string) => {\n return (dispatch: ThunkDispatch<RootState, void, Action>, getState: () => RootState) => {\n const { quickReplies } = getState().chat;\n const matchedQuickReply = quickReplies.find(\n (qr) => text.toLocaleLowerCase().indexOf(qr.label.toLocaleLowerCase()) > -1\n );\n if (matchedQuickReply) {\n return dispatch(handleQuickReplyClick({ ...matchedQuickReply, label: text }));\n } else {\n return dispatch(receiveTextMessageFromGuest(text));\n }\n };\n};\n\nexport default sendMessageFromUser;\n","import {\n ActionTypes,\n Button,\n ButtonTypeEnum,\n Message,\n PostbackButton,\n receiveFileFromGuest,\n requestNLUEvent as coreRequestNLUEvent,\n UrlButton,\n} from '@botfabrik/engine-domain';\nimport { EnableConversationRatingType } from '../types';\nimport handleQuickReplyClick from './handleQuickReplyClick';\nimport sendMessageFromUser from './sendMessageFromUser';\n\nexport const MESSAGE_TO_PARENT_PAGE = 'MESSAGE_TO_PARENT_PAGE';\nexport const RESTORE_PREVIOUS_CHAT_MESSAGES = 'RESTORE_PREVIOUS_CHAT_MESSAGES';\nexport const AUDIO_MESSAGE_FROM_USER = 'AUDIO_MESSAGE_FROM_USER';\nexport const ENABLE_SPEECH_SUPPORT = 'ENABLE_SPEECH_SUPPORT';\nexport const ENABLE_PROBLEM_REPORTING_SUPPORT = 'ENABLE_BOT_REPLIES_VOTING_SUPPORT';\nexport const ENABLE_TRANSCRIPT_EXPORT = 'ENABLE_TRANSCRIPT_EXPORT';\nexport const EXPORT_TRANSCRIPT = 'EXPORT_TRANSCRIPT';\nexport const RECEIVE_SPEECH_TRANSCRIPTION = 'RECEIVE_SPEECH_TRANSCRIPTION';\nexport const SHOW_GENERAL_CONDITIONS = 'SHOW_GENERAL_CONDITIONS';\nexport const ENABLE_CONVERSATION_RATING = 'ENABLE_CONVERSATION_RATING';\n\nexport const GET_STARTED = 'webclient.get.started';\nexport const EXPAND_WINDOW = 'webclient.expand.window';\nexport const DOWNLOAD_TRANSCRIPT_PDF = 'webclient.transcript.pdf.download';\n\n/**\n * Diese Actions sollen nicht ans Backend übermittelt werden (siehe socketMiddleware.ts)\n */\nexport const INTERNAL_ACTIONS = [\n MESSAGE_TO_PARENT_PAGE,\n RESTORE_PREVIOUS_CHAT_MESSAGES,\n AUDIO_MESSAGE_FROM_USER,\n ENABLE_SPEECH_SUPPORT,\n ENABLE_PROBLEM_REPORTING_SUPPORT,\n ENABLE_TRANSCRIPT_EXPORT,\n EXPORT_TRANSCRIPT,\n RECEIVE_SPEECH_TRANSCRIPTION,\n SHOW_GENERAL_CONDITIONS,\n ENABLE_CONVERSATION_RATING,\n];\n\nexport { sendMessageFromUser, handleQuickReplyClick };\n\nexport const sendAudioMessageFromUser = (blob: Blob) => ({\n type: AUDIO_MESSAGE_FROM_USER,\n buffer: blob,\n});\n\nexport const enableSpeechSupport = () => ({\n type: ENABLE_SPEECH_SUPPORT,\n});\n\nexport const enableProblemReportingSupport = () => ({\n type: ENABLE_PROBLEM_REPORTING_SUPPORT,\n});\n\nexport const receiveSpeechTranscription = (transcription: string) => ({\n type: RECEIVE_SPEECH_TRANSCRIPTION,\n transcription,\n});\n\nexport const enableTranscriptExport = (methods: { email: boolean; pdf: boolean }) => ({\n type: ENABLE_TRANSCRIPT_EXPORT,\n methods,\n});\n\nexport const exportTranscript = (email: string) => ({\n type: ActionTypes.TRANSCRIPT_MAIL_REQUEST,\n payload: { parameters: { mailTo: email } },\n});\n\nexport const showGeneralConditions = () => ({\n type: SHOW_GENERAL_CONDITIONS,\n});\n\nexport const downloadTranscriptPdf = () => ({\n type: DOWNLOAD_TRANSCRIPT_PDF,\n});\n\nexport const enableConversationRating = ({ rating }: EnableConversationRatingType) => ({\n type: ENABLE_CONVERSATION_RATING,\n payload: { rating },\n});\n\nexport const handleRatingFromUser = (value: number, feedback: string) => ({\n type: ActionTypes.CONVERSATION_RATING_FROM_GUEST,\n payload: { value, feedback },\n});\n\nexport const requestNLUEvent = (event: string) => coreRequestNLUEvent(event);\n\nexport const restorePreviousChatMessages = (messages: Message[]) => ({\n type: RESTORE_PREVIOUS_CHAT_MESSAGES,\n messages,\n});\n\nexport const handleButtonClick = (button: Button) => {\n switch (button.type) {\n case ButtonTypeEnum.WEB_URL:\n const urlButton = button as UrlButton;\n return notifyParentToChangePath(urlButton.url);\n case ButtonTypeEnum.POSTBACK:\n const postbackButton = button as PostbackButton;\n return postbackButton.payload;\n default:\n throw new Error(`unknown button type ${button.type}`);\n }\n};\n\nexport const handleLinkClick = (url: string) => notifyParentToChangePath(url);\n\nexport const getStarted = () => ({\n type: GET_STARTED,\n});\n\nconst notifyParentToChangePath = (url: string) => ({\n type: MESSAGE_TO_PARENT_PAGE,\n message: {\n type: 'webclient.change.url',\n url,\n },\n});\n\nexport const sendUploadFileFromUser = (filename: string, blob: Blob, payload: object) =>\n receiveFileFromGuest(filename, blob, payload);\n","import Cookies from 'js-cookie';\nimport queryString from 'query-string';\nimport { AnyAction } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { v4 as uuid } from 'uuid';\nimport { RootState } from '../types';\n\nexport const CONNECT = 'CONNECT';\nexport const CONNECTING = 'CONNECTING';\nexport const CONNECTED = 'CONNECTED';\nexport const DISCONNECTED = 'DISCONNECTED';\nexport const RECONNECTED = 'RECONNECTED';\nexport const RESTORE_SESSION_ID = 'RESTORE_SESSION_ID';\nexport const RESTART = 'RESTART';\n\n/**\n * Diese Actions sollen nicht ans Backend übermittelt werden (siehe socketMiddleware.ts)\n */\nexport const INTERNAL_ACTIONS = [CONNECT, CONNECTING, CONNECTED, DISCONNECTED, RECONNECTED, RESTORE_SESSION_ID];\n\n/**\n * Erstelle eine Verbindung mit dem Backend Server\n */\nexport const connect = (clientName: string, querystrings: string) => {\n return (dispatch: ThunkDispatch<RootState, unknown, AnyAction>, getState: () => RootState) => {\n const parsedQuerystrings = queryString.parse(querystrings);\n const connectionState = getState().connection;\n\n // get session id\n let sessionId = connectionState.sessionId;\n if (sessionId === undefined) {\n sessionId = uuid();\n }\n\n // get user id\n let userId = connectionState.userId;\n if (userId === undefined) {\n const userIdCookie = Cookies.get('bf-webclient-userId');\n userId = userIdCookie ? userIdCookie : uuid();\n Cookies.set('bf-webclient-userId', userId!);\n }\n\n parsedQuerystrings.sessionId = sessionId;\n parsedQuerystrings.userId = userId;\n\n return dispatch(doConnect(sessionId!, userId!, clientName, queryString.stringify(parsedQuerystrings)));\n };\n};\n\nconst doConnect = (sessionId: string, userId: string, clientName: string, querystrings: string) => ({\n type: CONNECT,\n sessionId,\n userId,\n clientName,\n querystrings,\n});\n\nexport const restoreSessionId = (sessionId: string) => ({\n type: RESTORE_SESSION_ID,\n sessionId,\n});\n\n/**\n * Informiere den Store, dass wir eine Verbindung mit dem Server aufbauen.\n */\nexport const connecting = () => ({\n type: CONNECTING,\n});\n\n/**\n * Informiere den Store, dass wir mit dem Server verbunden sind.\n */\nexport const connected = () => ({\n type: CONNECTED,\n});\n\n/**\n * Informiere den Store, dass die Verbindung mit dem Server getrennt wurde.\n */\nexport const disconnected = () => ({\n type: DISCONNECTED,\n});\n\n/**\n * Informiere den Store, dass die Verbindung mit dem Server wiederhergestellt wurde.\n */\nexport const reconnected = () => ({\n type: RECONNECTED,\n});\n\nexport const restartChat = (clientName: string, querystrings: string) => {\n return (dispatch: ThunkDispatch<RootState, unknown, AnyAction>) => {\n dispatch(doRestartChat());\n return dispatch(connect(clientName, querystrings));\n };\n};\n\nconst doRestartChat = () => ({\n type: RESTART,\n});\n","import Markdown from 'markdown-to-jsx';\nimport React, { useState } from 'react';\nimport { FaAngleDown, FaAngleUp } from 'react-icons/fa';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './GeneralConditions.module.scss';\n\ninterface Props {\n translate: TranslateFunction;\n}\n\nconst HEADER_KEY = 'general-conditions.header';\nconst BODY_KEY = 'general-conditions.body';\nconst ACCEPT_KEY = 'general-conditions.accept-conditions-note';\n\nconst GeneralConditions = ({ translate }: Props) => {\n const [showDetails, setShowDetails] = useState(false);\n\n const toggleShowDetails = () => setShowDetails(!showDetails);\n\n const handleOnKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n setShowDetails(true);\n } else if (event.key === 'ArrowUp' || event.key === 'ArrowLeft' || event.key === 'Escape') {\n setShowDetails(false);\n } else if (event.key === 'Enter' || event.key === 'Space' || event.key === ' ') {\n toggleShowDetails();\n }\n };\n\n const headerText = translate(HEADER_KEY) as string;\n const acceptText = translate(ACCEPT_KEY) as string;\n\n return (\n <div className={styles.generalConditionsContainer}>\n {!!headerText?.length && (\n <div className={styles.generalConditions}>\n <div\n role=\"button\"\n onClick={toggleShowDetails}\n onKeyDown={handleOnKeyDown}\n tabIndex={0}\n className={styles.generalConditionsHeader}\n aria-controls=\"general-conditions-body\"\n aria-expanded={showDetails ? 'true' : 'false'}\n aria-pressed={showDetails ? 'true' : 'false'}\n >\n <Markdown>{headerText}</Markdown>\n {showDetails ? <FaAngleUp /> : <FaAngleDown />}\n </div>\n <div\n className={styles.generalConditionsBody}\n id=\"general-conditions-body\"\n role=\"region\"\n tabIndex={-1}\n >\n {showDetails && <Markdown>{translate(BODY_KEY) as string}</Markdown>}\n </div>\n </div>\n )}\n {!!acceptText?.length && (\n <div className={styles.generalConditionsAccept} tabIndex={0}>\n <Markdown>{translate(ACCEPT_KEY) as string}</Markdown>\n </div>\n )}\n </div>\n );\n};\n\nexport default GeneralConditions;\n","import classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './ProblemReport.module.scss';\n\ninterface Props {\n reported: boolean | undefined;\n onReport: (problem: string | null) => void;\n translate: TranslateFunction;\n}\n\nconst ProblemReport = ({ reported, onReport, translate }: Props) => {\n const handleOnReport = (problem: string | null) => () => onReport(problem);\n const handleOnReportKeyDown = (problem: string | null) => (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n onReport(problem);\n }\n };\n\n return (\n <div className={styles.problemReport}>\n {reported ? (\n <div\n role=\"button\"\n onClick={handleOnReport(null)}\n onKeyDown={handleOnReportKeyDown(null)}\n tabIndex={0}\n className={classNames(\n styles.problemReportIcon,\n 'chat__problemReportIcon',\n 'chat_problemReportIcon',\n styles.problemReportIconActive,\n 'chat__problemReportIcon-active',\n 'chat_problemReportIcon-active'\n )}\n >\n <img\n src=\"problem-report-active.svg\"\n title={translate('problem-report.action.unmark') as string}\n alt=\"Report\"\n />\n </div>\n ) : (\n <div\n role=\"button\"\n onClick={handleOnReport('unspecified')}\n onKeyDown={handleOnReportKeyDown('unspecified')}\n tabIndex={0}\n className={classNames(\n styles.problemReportIcon,\n 'chat_problemReportIcon',\n styles.problemReportIconInactive,\n 'chat_problemReportIcon-inactive'\n )}\n >\n <img\n src=\"problem-report-inactive.svg\"\n title={translate('problem-report.action.mark') as string}\n alt=\"Report\"\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default ProblemReport;\n","import { UserType } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React, { ReactNode } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ChatMessage } from '../../../../types';\nimport styles from '../Message.module.scss';\nimport ProblemReport from './ProblemReport';\n\ninterface Props {\n message: ChatMessage;\n problemReportingEnabled: boolean;\n children: ReactNode;\n onProblemReport: (problem: string | null) => void;\n translate: TranslateFunction;\n}\n\nconst BotMessage = ({ message, problemReportingEnabled, onProblemReport, translate, children }: Props) => (\n <li className={styles.messageBot}>\n <img\n className={classNames(styles.avatar, 'chat__avatar', 'chat__botAvatar', 'chat_avatar', 'chat_botAvatar')}\n src={`${message.sender.avatar}`}\n alt={message.sender.type === UserType.BOT ? 'Bot' : 'Agent'}\n />\n\n <div\n className={classNames(styles.bubble, styles.bubbleLeft, 'chat__bubble', 'chat__botBubble')}\n tabIndex={0}\n aria-label={\n translate(message.sender.type === UserType.BOT ? 'bot-bubble.label' : 'agent-bubble.label') as string\n }\n >\n <div className={classNames(styles.leftText)}>{children}</div>\n </div>\n\n {problemReportingEnabled && (\n <ProblemReport\n reported={!!message.problemReport?.length}\n onReport={onProblemReport}\n translate={translate}\n />\n )}\n </li>\n);\n\nexport default BotMessage;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport globalStyles from '../../../../Global.module.scss';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n}\n\nconst Buttons = ({ buttons, onButtonClick }: Props) => (\n <div className={classNames(styles.buttons, 'chat__bubbleButtons')}>\n {buttons.map((button, index) => (\n <button\n key={index}\n className={classNames(styles.button, globalStyles.button, 'chat__bubbleButton')}\n onClick={() => onButtonClick(button)}\n >\n {button.title}\n </button>\n ))}\n </div>\n);\n\nexport default Buttons;\n","import Emoji from 'node-emoji';\nimport React from 'react';\nimport Linkify from 'react-linkify';\nimport styles from './Text.module.scss';\n\ninterface Props {\n text: string;\n onLinkClick: (href: string) => void;\n}\n\nconst Text = ({ text, onLinkClick }: Props) => {\n const handleOnLinkClick = (href: string) => (event: any) => {\n event.preventDefault();\n if (href) {\n onLinkClick(href);\n }\n return false;\n };\n\n // TODO: Linus\n // - Button anstelle von a verwenden\n const componentDecorator = (decoratedHref: string, decoratedText: string, key: number) => (\n // eslint-disable-next-line\n <a key={key} onClick={handleOnLinkClick(decoratedHref)} role=\"button\">\n {decoratedText}\n </a>\n );\n\n return (\n <div>\n {text.split('\\n').map((item, key) => (\n <span key={key} className={styles.text}>\n <Linkify componentDecorator={componentDecorator}>{Emoji.emojify(item)}</Linkify>\n <br />\n </span>\n ))}\n </div>\n );\n};\n\nexport default Text;\n","import React from 'react';\nimport Text from '../Text';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n subtitle: string | undefined;\n onLinkClick: (href: string) => void;\n}\n\nconst Subtitle = ({ subtitle, onLinkClick }: Props) =>\n subtitle ? (\n <div className={styles.subtitle}>\n <Text text={subtitle} onLinkClick={onLinkClick} />\n </div>\n ) : null;\n\nexport default Subtitle;\n","import Markdown from 'markdown-to-jsx';\nimport React from 'react';\n\nconst OPEN_LINK_IN_NEW_TAB_INDICATOR = 'newtab#';\n\ninterface Props {\n markdown: string;\n onLinkClick: (href: string) => void;\n}\n\nconst MarkdownText = ({ markdown, onLinkClick }: Props) => {\n const handleOnLinkClick = (href: string) => (event: any) => {\n event.preventDefault();\n if (href) {\n onLinkClick(href);\n }\n return false;\n };\n\n const Link: React.FC<{ title: string; href: string; children: React.ReactChildren }> = ({\n title,\n href,\n children,\n }) => {\n const openInNewTab = href.indexOf(OPEN_LINK_IN_NEW_TAB_INDICATOR) === 0;\n return openInNewTab ? (\n <a\n href={href.slice(OPEN_LINK_IN_NEW_TAB_INDICATOR.length)}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ) : (\n // TODO: Linus\n // - Button anstelle von a verwenden\n // eslint-disable-next-line\n <a onClick={handleOnLinkClick(href)} title={title}>\n {children}\n </a>\n );\n };\n\n return (\n <Markdown\n options={{\n overrides: {\n a: Link,\n },\n }}\n >\n {markdown}\n </Markdown>\n );\n};\n\nexport default MarkdownText;\n","import React from 'react';\nimport MarkdownText from '../MarkdownText';\n\ninterface Props {\n text: string | undefined;\n onLinkClick: (href: string) => void;\n}\n\nconst Text = ({ text, onLinkClick }: Props) =>\n text ? (\n <div>\n <MarkdownText markdown={text} onLinkClick={onLinkClick} />\n </div>\n ) : null;\n\nexport default Text;\n","import React from 'react';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n title: string | undefined;\n}\n\nconst Title = ({ title }: Props) => (title ? <h1 className={styles.title}>{title}</h1> : null);\n\nexport default Title;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport messageStyle from '../Message.module.scss';\nimport Buttons from './Buttons';\nimport Subtitle from './Subtitle';\nimport Text from './Text';\nimport Title from './Title';\n\ninterface Props {\n title?: string;\n text?: string;\n subtitle: string;\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n}\n\nconst Body = ({ title, text, subtitle, buttons, onButtonClick, onLinkClick }: Props) => {\n const hasContent = title?.length || text?.length || subtitle?.length || buttons?.length;\n return hasContent ? (\n <div className={classNames(messageStyle.bubbleContent)}>\n <Title title={title} />\n <Text text={text} onLinkClick={onLinkClick} />\n <Subtitle subtitle={subtitle} onLinkClick={onLinkClick} />\n <Buttons buttons={buttons} onButtonClick={onButtonClick} />\n </div>\n ) : null;\n};\n\nexport default Body;\n","import classNames from 'classnames';\nimport React from 'react';\nimport styles from './DetailMessage.module.scss';\n\ninterface Props {\n alt: string;\n imageUrl?: string;\n itemUrl?: string;\n hasBody: boolean;\n}\n\nconst Image = ({ alt, imageUrl, itemUrl, hasBody }: Props) =>\n imageUrl ? (\n itemUrl ? (\n itemUrl.indexOf('youtube.com') > -1 ? (\n <div className={styles.video_container}>\n <iframe\n className={classNames(styles.video, { [styles.only]: !hasBody })}\n title=\"Youtube\"\n width=\"100%\"\n src={itemUrl + '?rel=0'}\n frameBorder=\"0\"\n allowFullScreen\n />\n </div>\n ) : (\n <a href={itemUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <div className={styles.imageContainer}>\n <img\n className={classNames(styles.image, { [styles.only]: !hasBody })}\n src={imageUrl}\n alt={alt}\n />\n </div>\n </a>\n )\n ) : (\n <div className={styles.imageContainer}>\n <img className={classNames(styles.image, { [styles.only]: !hasBody })} src={imageUrl} alt={alt} />\n </div>\n )\n ) : null;\n\nexport default Image;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport Body from './Body';\nimport styles from './DetailMessage.module.scss';\nimport Image from './Image';\n\ninterface Props {\n title?: string;\n text?: string;\n subtitle: string;\n imageUrl?: string;\n itemUrl?: string;\n buttons: Button[];\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n}\n\nconst DetailMessage = ({ title, text, subtitle, imageUrl, itemUrl, buttons, onButtonClick, onLinkClick }: Props) => {\n const hasBody = !!title?.length || !!text?.length || !!subtitle?.length || !!buttons?.length;\n return (\n <div className={classNames(styles.detailMessage)}>\n <Image hasBody={hasBody} imageUrl={imageUrl} itemUrl={itemUrl} alt={title || subtitle} />\n {hasBody && (\n <Body\n title={title}\n text={text}\n subtitle={subtitle}\n buttons={buttons}\n onLinkClick={onLinkClick}\n onButtonClick={onButtonClick}\n />\n )}\n </div>\n );\n};\n\nexport default DetailMessage;\n","import classNames from 'classnames';\nimport React, { ReactNode } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from '../Message.module.scss';\n\ninterface Props {\n children: ReactNode;\n translate: TranslateFunction;\n}\n\nconst UserMessage = ({ translate, children }: Props) => (\n <li className={styles.messageUser}>\n <div\n className={classNames(styles.bubble, styles.bubbleRight, 'chat__bubble', 'chat__guestBubble')}\n tabIndex={0}\n aria-label={translate('guest-bubble.label') as string}\n >\n <div className={classNames(styles.rightText)}>{children}</div>\n </div>\n </li>\n);\n\nexport default UserMessage;\n","import classNames from 'classnames';\nimport React from 'react';\nimport MarkdownText from '../MarkdownText';\nimport messageStyle from '../Message.module.scss';\n\ninterface Props {\n markdown: string;\n className: string;\n onLinkClick: (href: string) => void;\n}\n\nconst MarkdownMessage = ({ markdown, className, onLinkClick }: Props) => (\n <div className={classNames(messageStyle.bubbleContent, className)}>\n <MarkdownText markdown={markdown} onLinkClick={onLinkClick} />\n </div>\n);\n\nexport default MarkdownMessage;\n","import React from 'react';\nimport messageStyle from '../Message.module.scss';\nimport Text from '../Text';\n\ninterface Props {\n text: string;\n onLinkClick: (href: string) => void;\n}\nconst TextMessage = ({ text, onLinkClick }: Props) => (\n <div className={messageStyle.bubbleContent}>\n <Text text={text} onLinkClick={onLinkClick} />\n </div>\n);\n\nexport default TextMessage;\n","import {\n Button,\n DetailMessage as DetailMessageType,\n MarkdownMessage as MarkdownMessageType,\n Message as MessageType,\n MessageTypeEnum,\n TextMessage as TextMessageType,\n UserType,\n} from '@botfabrik/engine-domain';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ChatMessage } from '../../../types';\nimport BotMessage from './bot-message';\nimport DetailMessage from './detail-message';\nimport GuestMessage from './guest-message';\nimport MarkdownMessage from './markdown-message';\nimport TextMessage from './text-message';\n\ninterface Props {\n message: ChatMessage;\n problemReportingEnabled: boolean;\n translate: TranslateFunction;\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n onProblemReport: (actionId: string, problem: string | null) => void;\n}\n\nconst Message = ({\n message,\n problemReportingEnabled,\n onProblemReport,\n translate,\n onButtonClick,\n onLinkClick,\n}: Props) => {\n const msgCmp = getMessageCmp(message, onButtonClick, onLinkClick);\n switch (message.sender.type) {\n case UserType.GUEST:\n return <GuestMessage translate={translate}>{msgCmp}</GuestMessage>;\n default:\n const handleOnProblemReport = (problem: string | null) => onProblemReport(message._id, problem);\n return (\n <BotMessage\n message={message}\n translate={translate}\n problemReportingEnabled={problemReportingEnabled}\n onProblemReport={handleOnProblemReport}\n >\n {msgCmp}\n </BotMessage>\n );\n }\n};\n\nconst getMessageCmp = (\n message: MessageType,\n onButtonClick: (button: Button) => void,\n onLinkClick: (href: string) => void\n) => {\n switch (message.type) {\n case MessageTypeEnum.TEXT:\n const textMessage = message as TextMessageType;\n return <TextMessage text={textMessage.text} onLinkClick={onLinkClick} />;\n case MessageTypeEnum.DETAIL:\n const detailMessage = message as DetailMessageType;\n return (\n <DetailMessage\n title={detailMessage.title}\n text={detailMessage.text}\n subtitle={detailMessage.subtitle}\n imageUrl={detailMessage.imageUrl}\n itemUrl={detailMessage.itemUrl}\n buttons={detailMessage.buttons}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n />\n );\n case MessageTypeEnum.MARKDOWN:\n const markdownMessage = message as MarkdownMessageType;\n return (\n <MarkdownMessage\n markdown={markdownMessage.markdown}\n className={markdownMessage.className}\n onLinkClick={onLinkClick}\n />\n );\n }\n};\n\nconst areEqual = (prevProps: Props, nextProps: Props) =>\n prevProps.message._id === nextProps.message._id &&\n prevProps.message.problemReport === nextProps.message.problemReport &&\n prevProps.problemReportingEnabled === nextProps.problemReportingEnabled;\n\nexport default React.memo(Message, areEqual);\n","import classNames from 'classnames';\nimport React from 'react';\nimport styles from './TypingIndicator.module.scss';\n\ninterface Props {\n isTyping?: boolean;\n}\n\nconst TypingIndicator = ({ isTyping = false }: Props) =>\n isTyping ? (\n <div className={styles.ticontainer}>\n <div className={styles.tiblock}>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n <div className={classNames(styles.tidot, 'chat__typingIndicator')}></div>\n </div>\n </div>\n ) : null;\n\nexport default TypingIndicator;\n","import { Button } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport Scroll from 'react-scroll';\nimport { ChatMessage } from '../../types';\nimport GeneralConditions from './general-conditions';\nimport Message from './message';\nimport styles from './MessageContainer.module.scss';\nimport TypingIndicator from './typing-indicator';\n\nconst Element = Scroll.Element;\n\ninterface Props {\n messages: ChatMessage[];\n isBotTyping: boolean;\n showGeneralConditions: boolean;\n problemReportingEnabled: boolean;\n onProblemReport: (actionId: string, problem: string | null) => void;\n onButtonClick: (button: Button) => void;\n onLinkClick: (href: string) => void;\n translate: TranslateFunction;\n}\n\nclass Conversation extends React.Component<Props> {\n scrollToBottom(duration: number, delay: number) {\n const scroller = Scroll.scroller;\n scroller.scrollTo('ScrollToElement', {\n duration: duration,\n delay: delay,\n smooth: true,\n containerId: 'MessageContainer',\n });\n }\n\n componentDidMount() {\n this.scrollToBottom(0, 0);\n }\n\n componentDidUpdate(prevProps: Props) {\n const isRestored = prevProps.messages.length === 0;\n if (isRestored && this.props.messages.length > 0) {\n this.scrollToBottom(0, 0);\n } else {\n const isBotTyping = this.props.isBotTyping;\n const hasNewMessages =\n prevProps.messages.length !== this.props.messages.length && prevProps.messages.length > 1;\n if (isBotTyping || hasNewMessages) {\n // call scrollToBottom asynchronously to prevent flickering\n setTimeout(() => this.scrollToBottom(700, 20), 10);\n }\n }\n }\n\n render() {\n const {\n messages,\n isBotTyping,\n showGeneralConditions,\n problemReportingEnabled,\n onProblemReport,\n onButtonClick,\n onLinkClick,\n translate,\n } = this.props;\n return (\n <div\n className={classNames(styles.messageContainer, 'chat__messageContainer')}\n id=\"MessageContainer\"\n role=\"log\"\n aria-live=\"polite\"\n >\n {showGeneralConditions && <GeneralConditions translate={translate} />}\n <ul className={styles.messages}>\n {messages.map((msg) => (\n <Message\n key={msg._id}\n translate={translate}\n message={msg}\n problemReportingEnabled={problemReportingEnabled}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n onProblemReport={onProblemReport}\n />\n ))}\n </ul>\n <TypingIndicator isTyping={isBotTyping} />\n <Element name=\"ScrollToElement\" />\n </div>\n );\n }\n}\n\nexport default Conversation;\n","import classNames from 'classnames';\nimport Markdown from 'markdown-to-jsx';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './PoweredBy.module.scss';\n\ninterface Props {\n translate: TranslateFunction;\n}\n\nconst Link: React.FC<{ title: string; href: string; children: React.ReactChildren }> = ({ title, href, children }) => {\n return (\n <a href={href} title={title} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n};\n\nconst PoweredBy = ({ translate }: Props) => {\n const powerdBy = translate('powered-by') as string;\n return powerdBy && powerdBy.length ? (\n <div className={classNames(styles.container, 'chat__poweredBy')}>\n <Markdown\n options={{\n overrides: {\n a: Link,\n },\n }}\n >\n {powerdBy}\n </Markdown>\n </div>\n ) : null;\n};\n\nexport default PoweredBy;\n","import classNames from 'classnames';\nimport Markdown from 'markdown-to-jsx';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport globalStyles from '../../Global.module.scss';\nimport styles from './TranscriptMail.module.scss';\n\ninterface Props {\n visible: boolean;\n translate: TranslateFunction;\n methods: {\n pdf: boolean;\n email: boolean;\n };\n onEmailExport: (email: string) => void;\n onPdfExport: () => void;\n onClose: () => void;\n}\n\nconst TranscriptMail = ({ visible, translate, methods, onEmailExport, onPdfExport, onClose }: Props) => {\n const [internalVisible, setInternalVisible] = useState<boolean | undefined>(undefined);\n const [submitted, setSubmitted] = useState(false);\n const [generatingPdf, setGeneratingPdf] = useState(false);\n const [email, setEmail] = useState<string | undefined>(undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (visible) {\n inputRef.current?.focus();\n setSubmitted(false);\n setGeneratingPdf(false);\n setInternalVisible(visible);\n } else if (internalVisible === true) {\n setInternalVisible(false);\n }\n }, [visible, internalVisible]);\n\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (email && email.length > 0) {\n onEmailExport(email);\n\n setSubmitted(true);\n setTimeout(onClose, 3 * 1000);\n }\n };\n\n const handleOnEmailChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const email = event.target.value.trim();\n const emailIsValide = /^\\w+([.-]?\\w+)*@\\w+([.-]?\\w+)*(\\.\\w{2,3})+$/.test(email);\n setEmail(emailIsValide ? email : '');\n };\n\n const handleGeneratePdf = () => {\n setGeneratingPdf(true);\n onPdfExport();\n setTimeout(onClose, 3 * 1000);\n };\n\n return (\n <div\n className={classNames(styles.container, {\n [styles.containerOpen]: internalVisible === true,\n [styles.containerClose]: internalVisible === false,\n })}\n >\n {methods.pdf && (\n <>\n <h2>{translate('export-transcript.pdf.title')}</h2>\n <Markdown className={styles.description}>\n {translate('export-transcript.pdf.description') as string}\n </Markdown>\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonDefault)}\n onClick={onClose}\n >\n {translate('export-transcript.pdf.cancel') as string}\n </button>\n <button\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n onClick={handleGeneratePdf}\n disabled={generatingPdf}\n >\n {translate('export-transcript.pdf.download') as string}\n </button>\n </div>\n </>\n )}\n {methods.email && (\n <>\n <h2>{translate('export-transcript.email.title')}</h2>\n <Markdown className={styles.description}>\n {translate('export-transcript.email.description') as string}\n </Markdown>\n\n <form onSubmit={handleOnSubmit} className={styles.formContainer}>\n <div>\n <input\n disabled={submitted}\n ref={inputRef}\n type=\"email\"\n placeholder={translate('export-transcript.email.placeholder') as string}\n className={styles.emailInput}\n onChange={handleOnEmailChange}\n />\n {email?.length === 0 ? (\n <div className={styles.validationError}>\n {translate('export-transcript.email.invalid')}\n </div>\n ) : null}\n </div>\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonDefault)}\n onClick={onClose}\n >\n {translate('export-transcript.email.cancel') as string}\n </button>\n <button\n type=\"submit\"\n disabled={submitted || email === undefined || email.length === 0}\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n >\n {translate('export-transcript.email.send') as string}\n </button>\n </div>\n </form>\n\n {submitted && (\n <div className={styles.submitted}>{translate('export-transcript.email.success')}</div>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default TranscriptMail;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\ninterface Props {\n value: number;\n index: number;\n count: number;\n readonly: boolean;\n onHover?: () => void;\n onClick?: () => void;\n}\n\nconst Star = ({ value, index, count, readonly, onHover, onClick }: Props) => {\n const handleOnKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (onClick && event.key === 'Enter') {\n onClick();\n }\n };\n\n return (\n <li className={classNames(styles.star, { [styles.starReadonly]: readonly }, 'chat__conversationRating__star')}>\n <div\n role=\"radio\"\n aria-checked={value > index ? 'true' : 'false'}\n aria-posinset={index + 1}\n aria-setsize={count}\n tabIndex={0}\n onMouseOver={onHover}\n onKeyDown={handleOnKeyDown}\n onClick={onClick}\n >\n <span role=\"img\" aria-label=\"Star\" className={classNames(styles.starIcon)}>\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n data-icon=\"star\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z\"></path>\n </svg>\n </span>\n </div>\n </li>\n );\n};\n\nexport default Star;\n","import classNames from 'classnames';\nimport { useState } from 'react';\nimport styles from './RateInput.module.scss';\nimport Star from './Star';\n\nconst STAR_COUNT = 5;\n\ninterface Props {\n value: number;\n size: 'small' | 'large';\n readonly?: boolean;\n onChange?: (value: number) => void;\n}\n\nconst Stars = ({ value, size, readonly = false, onChange }: Props) => {\n const [hoverValue, setHoverValue] = useState<number | undefined>(undefined);\n\n const handleOnMouseOut = () => {\n setHoverValue(undefined);\n };\n\n const handleOnStarHover = (starIndex: number) => () => {\n if (!readonly) {\n const hoverValue = starIndex + 1;\n setHoverValue(hoverValue);\n }\n };\n\n const handleOnStarClick = (starIndex: number) => () => {\n if (onChange && !readonly) {\n if (starIndex === 0 && value === 1) {\n onChange(0);\n } else {\n onChange(starIndex + 1);\n }\n setHoverValue(undefined);\n }\n };\n\n return (\n <ul\n tabIndex={0}\n role=\"radiogroup\"\n className={classNames(\n styles.stars,\n { [styles.starsSmall]: size === 'small', [styles.starsLarge]: size === 'large' },\n 'chat__conversationRating__stars',\n {\n chat__conversationRating__stars__small: size === 'small',\n chat__conversationRating__stars__large: size === 'large',\n }\n )}\n onMouseOut={handleOnMouseOut}\n >\n {Array(STAR_COUNT)\n .fill(0)\n .map((_, index) => (\n <Star\n key={index}\n value={hoverValue === undefined ? value : hoverValue}\n index={index}\n count={STAR_COUNT}\n readonly={readonly}\n onHover={handleOnStarHover(index)}\n onClick={handleOnStarClick(index)}\n />\n ))}\n </ul>\n );\n};\n\nexport default Stars;\n","import classNames from 'classnames';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './RateInput.module.scss';\nimport Stars from './Stars';\n\ninterface Props {\n visible: boolean;\n translate: TranslateFunction;\n onRate: (rating: number) => void;\n}\n\nconst CallToAction = ({ visible, translate, onRate }: Props) => {\n return visible ? (\n <div className={classNames(styles.callToActionContainer, 'chat__conversationRating__callToAction')}>\n <div className={classNames(styles.callToActionTitle, 'chat__conversationRating__callToAction__title')}>\n {translate('conversation-rating.call-to-action.title') as string}\n </div>\n <Stars value={0} size=\"small\" onChange={onRate} />\n </div>\n ) : null;\n};\n\nexport default CallToAction;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\nconst BotBubble = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={classNames(styles.rateFeedbackBotBubble, className)} {...rest}>\n <img className={classNames(styles.avatar)} src=\"bot.svg\" alt=\"Bot\" />\n <div className={classNames(styles.bubble, styles.botBubble)}>{children}</div>\n </div>\n);\n\nexport default BotBubble;\n","import classNames from 'classnames';\nimport styles from './RateInput.module.scss';\n\nconst GuestBubble = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={classNames(styles.rateFeedbackGuestBubble, className)} {...rest}>\n <div className={classNames(styles.bubble, styles.guestBubble)}>{children}</div>\n </div>\n);\n\nexport default GuestBubble;\n","import classNames from 'classnames';\nimport { useEffect, useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport globalStyles from '../../../Global.module.scss';\nimport BotBubble from './BotBubble';\nimport GuestBubble from './GuestBubble';\nimport styles from './RateInput.module.scss';\nimport Stars from './Stars';\n\ninterface Props {\n visible: boolean;\n rating: number;\n translate: TranslateFunction;\n onClose: () => void;\n onRate: (value: number, feedback: string) => void;\n}\n\nconst RateOverlay = ({ visible, rating, translate, onRate, onClose }: Props) => {\n const [tempRating, setTempRating] = useState(rating);\n const [rateText, setRateText] = useState<string | undefined>(undefined);\n const [internalVisible, setInternalVisible] = useState<boolean | undefined>(undefined);\n const [submitted, setSubmitted] = useState(false);\n\n const guestFeedbackInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (visible) {\n setSubmitted(false);\n setInternalVisible(visible);\n } else if (internalVisible === true) {\n setInternalVisible(false);\n }\n }, [visible, internalVisible]);\n\n useEffect(() => {\n setTempRating(rating);\n }, [rating]);\n\n useEffect(() => {\n const text = translate(`conversation-rating.overlay.bot-message.rate-feedback.value-${tempRating}`) as string;\n setRateText(text?.length > 0 ? text : undefined);\n }, [tempRating, translate]);\n\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n onRate(tempRating, guestFeedbackInputRef.current?.value?.trim() || '');\n setSubmitted(true);\n };\n\n return (\n <div\n className={classNames(styles.rateOverlay, 'chat__conversationRating__overlay', {\n [styles.rateOverlayOpen]: internalVisible === true,\n [styles.rateOverlayClose]: internalVisible === false,\n })}\n >\n <form onSubmit={handleOnSubmit}>\n <div className={classNames(styles.body, 'chat__conversationRating__overlay__body')}>\n <div>\n <h2>{translate('conversation-rating.overlay.title') as string}</h2>\n <div className={classNames(styles.starsDescriptionContainer)}>\n <Stars value={tempRating} size=\"large\" readonly={submitted} onChange={setTempRating} />\n <div className={classNames(styles.starsDescription)}>\n <div>{translate('conversation-rating.overlay.star.very-bad') as string}</div>\n <div>{translate('conversation-rating.overlay.star.very-good') as string}</div>\n </div>\n </div>\n </div>\n <div className={classNames(styles.bubbles)}>\n {visible && rateText && (\n <>\n <BotBubble className=\"chat__conversationRating__overlay__botBubble\">\n <div>{rateText}</div>\n </BotBubble>\n\n {submitted && !!guestFeedbackInputRef.current?.value?.length && (\n <GuestBubble className=\"chat__conversationRating__overlay__guestBubble\">\n {guestFeedbackInputRef.current.value}\n </GuestBubble>\n )}\n\n {submitted && (\n <BotBubble className=\"chat__conversationRating__overlay__botBubble\">\n <div>\n {\n translate(\n 'conversation-rating.overlay.bot-message.submit-feedback'\n ) as string\n }\n </div>\n </BotBubble>\n )}\n </>\n )}\n </div>\n </div>\n\n <div className={classNames(styles.footer, 'chat__conversationRating__overlay__footer')}>\n {!submitted && (\n <input\n ref={guestFeedbackInputRef}\n placeholder={\n translate('conversation-rating.overlay.guest-feedback.input-placeholder') as string\n }\n />\n )}\n <div className={classNames(styles.actions, 'chat__conversationRating__overlay__footer__actions')}>\n {submitted ? (\n <button\n type=\"button\"\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n onClick={onClose}\n >\n {translate('conversation-rating.overlay.action.close') as string}\n </button>\n ) : (\n <button\n type=\"submit\"\n className={classNames(globalStyles.button, globalStyles.buttonPrimary)}\n >\n {translate('conversation-rating.overlay.action.submit') as string}\n </button>\n )}\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nexport default RateOverlay;\n","import { useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ConversationRatingState } from '../../../types';\nimport CallToAction from './CallToAction';\nimport RateOverlay from './RateOverlay';\n\ninterface Props {\n conversationRating: ConversationRatingState;\n numberOfMessagesFromGuest: number;\n translate: TranslateFunction;\n onRate: (rating: number, feedback: string) => void;\n}\n\nconst ConversationRating = ({\n conversationRating: { enabled, rating },\n numberOfMessagesFromGuest,\n translate,\n onRate,\n}: Props) => {\n const [tempRating, setTempRating] = useState(0);\n const [showOverlay, setShowOverlay] = useState(false);\n\n const handleOnCallToActionChange = (rating: number) => {\n setTempRating(rating);\n setShowOverlay(true);\n };\n\n const handleOnCloseOverlay = () => setShowOverlay(false);\n\n const showCallToAction = !rating && numberOfMessagesFromGuest > 1;\n return enabled ? (\n <>\n <CallToAction visible={showCallToAction} translate={translate} onRate={handleOnCallToActionChange} />\n <RateOverlay\n visible={showOverlay}\n rating={tempRating}\n translate={translate}\n onRate={onRate}\n onClose={handleOnCloseOverlay}\n />\n </>\n ) : null;\n};\n\nexport default ConversationRating;\n","import classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport styles from './AudioRecorder.module.scss';\n\nconst BUFFER_SIZE = 2048;\nconst OUTPUT_SAMPLE_RATE = 16000;\n\n/**\n * The implementation of the AudioRecorder was inspired by the following blogpost:\n * https://typedarray.org/from-microphone-to-wav-with-getusermedia-and-web-audio/\n */\n\ninterface Props {\n translate: TranslateFunction;\n onAudioRecorded: (blob: Blob) => void;\n}\n\ninterface State {\n recordingState: string;\n}\n\nexport default class AudioRecorder extends React.Component<Props, State> {\n private audioInput: MediaStreamAudioSourceNode | null = null;\n private volume: GainNode | null = null;\n private leftchannel: Float32Array[] = [];\n private recorder: ScriptProcessorNode | null = null;\n private recordingLength: number = 0;\n private sampleRate: number | null = null;\n private mediaStream: MediaStream | null = null;\n\n constructor(props: Props) {\n super(props);\n this.state = { recordingState: 'none' };\n\n this.triggerAudioRecording = this.triggerAudioRecording.bind(this);\n this.triggerAudioRecordingSuccess = this.triggerAudioRecordingSuccess.bind(this);\n this.initRecording = this.initRecording.bind(this);\n this.processRecordingInput = this.processRecordingInput.bind(this);\n this.handleClickSubmitAudio = this.handleClickSubmitAudio.bind(this);\n this.handleClickStopAudio = this.handleClickStopAudio.bind(this);\n }\n\n triggerAudioRecording() {\n this.setState({ recordingState: 'connecting' });\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(this.triggerAudioRecordingSuccess);\n }\n\n triggerAudioRecordingSuccess(stream: MediaStream) {\n this.mediaStream = stream;\n this.leftchannel.length = 0;\n this.recordingLength = 0;\n\n this.initRecording(stream);\n }\n\n initRecording(stream: MediaStream) {\n var AudioContext = window.AudioContext || (window as any).webkitAudioContext;\n var context = new AudioContext();\n // we query the context sample rate (varies depending on platforms)\n this.sampleRate = context.sampleRate;\n // creates a gain node which adjusts the volume on audio streams\n this.volume = context.createGain();\n // creates an audio node from the microphone incoming stream\n this.audioInput = context.createMediaStreamSource(stream);\n // connect the stream to the gain node\n this.audioInput.connect(this.volume);\n this.recorder = context.createScriptProcessor(BUFFER_SIZE, 1, 1);\n this.recorder.onaudioprocess = this.processRecordingInput;\n // we connect the recorder\n this.volume.connect(this.recorder);\n this.recorder.connect(context.destination);\n }\n\n processRecordingInput(e: AudioProcessingEvent) {\n if (this.state.recordingState === 'connecting') {\n this.setState({ recordingState: 'recording' });\n }\n if (this.state.recordingState !== 'none') {\n const left = e.inputBuffer.getChannelData(0);\n // we clone the samples\n this.leftchannel.push(new Float32Array(left));\n this.recordingLength += BUFFER_SIZE;\n }\n }\n\n handleClickSubmitAudio() {\n // we flat the left channel down\n const leftBuffer = mergeBuffers(this.leftchannel, this.recordingLength);\n const downsampledBuffer = downsampleBuffer(leftBuffer, this.sampleRate || 0);\n\n // we create our wav file\n const blob = createWav(downsampledBuffer);\n this.props.onAudioRecorded(blob);\n\n // For debugging purpose: Set link to state so you can display a button on the UI to download the audio file:\n // var url = (window.URL || window.webkitURL).createObjectURL(blob);\n // this.setState({url});\n\n this.handleClickStopAudio();\n }\n\n handleClickStopAudio() {\n this.setState({ recordingState: 'none' });\n this.audioInput?.disconnect();\n this.volume?.disconnect();\n this.recorder?.disconnect();\n if (this.mediaStream) {\n this.mediaStream?.getAudioTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n }\n\n render() {\n return (\n <div className={styles.audioRecorder}>\n {this.state.recordingState === 'none' && (\n <button\n className={classNames(styles.recordButton, 'chat__button')}\n type=\"submit\"\n aria-label={this.props.translate('message-input.actions.start-audio-recording.label') as string}\n tabIndex={0}\n onClick={this.triggerAudioRecording}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </button>\n )}\n\n {this.state.recordingState === 'connecting' && (\n <svg\n className={styles.spinning}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n )}\n\n {this.state.recordingState === 'recording' && (\n <div className={styles.audioRecorder}>\n <button\n className={classNames(styles.cancelButton)}\n onClick={this.handleClickStopAudio}\n aria-label={\n this.props.translate('message-input.actions.stop-audio-recording.label') as string\n }\n tabIndex={0}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </button>\n <div className={styles.recorderIcon} />\n <button\n className={classNames(styles.submitButton)}\n type=\"submit\"\n onClick={this.handleClickSubmitAudio}\n aria-label={\n this.props.translate('message-input.actions.submit-audio-recording.label') as string\n }\n tabIndex={0}\n autoFocus\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n );\n }\n}\n\nconst createWav = (downsampledBuffer: Float32Array) => {\n const buffer = new ArrayBuffer(44 + downsampledBuffer.length * 2);\n const view = new DataView(buffer);\n\n // RIFF chunk descriptor\n writeUTFBytes(view, 0, 'RIFF');\n view.setUint32(4, 44 + downsampledBuffer.length * 2, true);\n writeUTFBytes(view, 8, 'WAVE');\n\n // FMT sub-chunk\n writeUTFBytes(view, 12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n\n // mono - 1 channel\n view.setUint16(22, 1, true);\n view.setUint32(24, OUTPUT_SAMPLE_RATE, true);\n view.setUint32(28, OUTPUT_SAMPLE_RATE * 4, true);\n view.setUint16(32, 4, true);\n view.setUint16(34, 16, true);\n\n // data sub-chunk\n writeUTFBytes(view, 36, 'data');\n view.setUint32(40, downsampledBuffer.length * 2, true);\n\n // write the PCM samples\n const lng = downsampledBuffer.length;\n let index = 44;\n const volume = 1;\n for (var i = 0; i < lng; i++) {\n view.setInt16(index, downsampledBuffer[i] * (0x7fff * volume), true);\n index += 2;\n }\n\n // our final binary blob\n return new Blob([view], { type: 'audio/wav' });\n};\n\nconst writeUTFBytes = (view: DataView, offset: number, val: string) => {\n for (var i = 0; i < val.length; i++) {\n view.setUint8(offset + i, val.charCodeAt(i));\n }\n};\n\nconst mergeBuffers = (channelBuffer: Float32Array[], recordingLength: number) => {\n const result = new Float32Array(recordingLength);\n let offset = 0;\n const lng = channelBuffer.length;\n for (var i = 0; i < lng; i++) {\n const buffer = channelBuffer[i];\n result.set(buffer, offset);\n offset += buffer.length;\n }\n return result;\n};\n\nconst downsampleBuffer = (buffer: Float32Array, sampleRate: number) => {\n if (OUTPUT_SAMPLE_RATE === sampleRate) {\n return buffer;\n }\n const sampleRateRatio = sampleRate / OUTPUT_SAMPLE_RATE;\n const newLength = Math.round(buffer.length / sampleRateRatio);\n const result = new Float32Array(newLength);\n let offsetResult = 0;\n let offsetBuffer = 0;\n while (offsetResult < result.length) {\n let nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);\n let accum = 0,\n count = 0;\n for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {\n accum += buffer[i];\n count++;\n }\n result[offsetResult] = accum / count;\n offsetResult++;\n offsetBuffer = nextOffsetBuffer;\n }\n return result;\n};\n","import classNames from 'classnames';\nimport React, { useRef, useState } from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport AudioRecorder from './audio-recorder';\nimport styles from './TextInput.module.scss';\n\ninterface Props {\n speechSupport: boolean;\n transcriptExportEnabled: boolean;\n translate: TranslateFunction;\n onTextInput: (input: string) => void;\n onAudioRecorded: (blob: Blob) => void;\n onOpenTranscriptExportModal: () => void;\n}\n\nconst TextInput = ({\n speechSupport,\n transcriptExportEnabled,\n translate,\n onTextInput,\n onAudioRecorded,\n onOpenTranscriptExportModal,\n}: Props) => {\n const [hasText, setHasText] = useState(false);\n const userTextInput = useRef<HTMLInputElement>(null);\n\n const handleClickSubmitButton = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const currentUserInput = userTextInput.current;\n if (currentUserInput && currentUserInput.value.trim().length >= 1) {\n onTextInput(currentUserInput.value.trim());\n currentUserInput.value = '';\n setHasText(false);\n currentUserInput.focus();\n }\n };\n\n const handleOnInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value.trim();\n setHasText(value.length > 0);\n };\n\n return (\n <form className={classNames(styles.inputWrapper, 'chat__textInput')} onSubmit={handleClickSubmitButton}>\n <div className={styles.messageInputWrapper}>\n <input\n className={styles.messageInput}\n placeholder={translate('message-input-label') as string}\n ref={userTextInput}\n onChange={handleOnInputChange}\n tabIndex={0}\n />\n </div>\n <div className={classNames(styles.buttons, 'chat__buttons')}>\n {!hasText && transcriptExportEnabled && (\n <button\n type=\"button\"\n className={classNames(styles.button, 'chat__button')}\n aria-label={translate('message-input.actions.export-transcript.label') as string}\n tabIndex={0}\n onClick={onOpenTranscriptExportModal}\n >\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M456 231a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0zm0 280a56 56 0 10112 0 56 56 0 10-112 0z\"></path>\n </svg>\n </button>\n )}\n {hasText || !speechSupport || navigator.mediaDevices === undefined ? (\n <button\n className={classNames(styles.button, 'chat__button')}\n type=\"submit\"\n aria-label={translate('message-input.actions.submit.label') as string}\n tabIndex={0}\n >\n <svg\n viewBox=\"64 64 896 896\"\n focusable=\"false\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <defs>\n <style></style>\n </defs>\n <path d=\"M931.4 498.9L94.9 79.5c-3.4-1.7-7.3-2.1-11-1.2a15.99 15.99 0 00-11.7 19.3l86.2 352.2c1.3 5.3 5.2 9.6 10.4 11.3l147.7 50.7-147.6 50.7c-5.2 1.8-9.1 6-10.3 11.3L72.2 926.5c-.9 3.7-.5 7.6 1.2 10.9 3.9 7.9 13.5 11.1 21.5 7.2l836.5-417c3.1-1.5 5.6-4.1 7.2-7.1 3.9-8 .7-17.6-7.2-21.6zM170.8 826.3l50.3-205.6 295.2-101.3c2.3-.8 4.2-2.6 5-5 1.4-4.2-.8-8.7-5-10.2L221.1 403 171 198.2l628 314.9-628.2 313.2z\"></path>\n </svg>\n </button>\n ) : (\n speechSupport &&\n navigator.mediaDevices !== undefined && (\n <AudioRecorder translate={translate} onAudioRecorded={onAudioRecorded} />\n )\n )}\n </div>\n </form>\n );\n};\n\nexport default TextInput;\n","import { QuickReply } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport globalStyles from '../../../Global.module.scss';\nimport styles from './QuickReplies.module.scss';\n\ninterface Props {\n quickReplies: QuickReply[];\n onQuickReplyClick: (reply: QuickReply) => void;\n}\n\nconst QuickReplies = ({ quickReplies, onQuickReplyClick }: Props) =>\n quickReplies.length ? (\n <div className={classNames(styles.quickReplies, 'chat__quickReplies')}>\n {quickReplies.map((reply) => (\n <button\n key={reply.label}\n tabIndex={0}\n className={classNames(styles.quickReply, globalStyles.button, 'chat__button', 'chat__quickReply')}\n onClick={() => onQuickReplyClick(reply)}\n >\n {reply.label}\n </button>\n ))}\n </div>\n ) : null;\n\nexport default QuickReplies;\n","import { QuickReply, UploadRequest } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport React from 'react';\nimport { TranslateFunction } from 'react-localize-redux';\nimport { ConversationRatingState } from '../../types';\nimport ConversationRating from './conversation-rating';\nimport Input from './input';\nimport styles from './InputContainer.module.scss';\nimport QuickReplies from './quick-replies';\n\ninterface Props {\n numberOfMessagesFromGuest: number;\n quickReplies: QuickReply[];\n speechSupport: boolean;\n uploadRequest?: UploadRequest;\n transcriptExportEnabled: boolean;\n conversationRating: ConversationRatingState;\n translate: TranslateFunction;\n onTextInput: (text: string) => void;\n onRate: (rating: number, description: string) => void;\n onQuickReplyClick: (reply: QuickReply) => void;\n onUploadFile: (filename: string, blob: Blob, payload: any) => void;\n onAudioRecorded: (blob: Blob) => void;\n onOpenTranscriptExportModal: () => void;\n}\n\nconst UserInput = ({\n quickReplies,\n speechSupport,\n transcriptExportEnabled,\n conversationRating,\n numberOfMessagesFromGuest,\n translate,\n onTextInput,\n onRate,\n onQuickReplyClick,\n onAudioRecorded,\n onOpenTranscriptExportModal,\n}: Props) => (\n <div className={classNames(styles.inputContainer)}>\n <QuickReplies quickReplies={quickReplies} onQuickReplyClick={onQuickReplyClick} />\n <ConversationRating\n conversationRating={conversationRating}\n numberOfMessagesFromGuest={numberOfMessagesFromGuest}\n translate={translate}\n onRate={onRate}\n />\n <Input\n translate={translate}\n onTextInput={onTextInput}\n onAudioRecorded={onAudioRecorded}\n speechSupport={speechSupport}\n onOpenTranscriptExportModal={onOpenTranscriptExportModal}\n transcriptExportEnabled={transcriptExportEnabled}\n />\n </div>\n);\n\nexport default UserInput;\n","import { Button, QuickReply, reportProblemFromGuest, UploadRequest } from '@botfabrik/engine-domain';\nimport classNames from 'classnames';\nimport queryString from 'query-string';\nimport React, { useEffect, useState } from 'react';\nimport { getActiveLanguage, getTranslate, TranslateFunction } from 'react-localize-redux';\nimport { connect as reduxConnect } from 'react-redux';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport {\n downloadTranscriptPdf,\n exportTranscript,\n handleButtonClick,\n handleLinkClick,\n handleQuickReplyClick,\n handleRatingFromUser,\n requestNLUEvent,\n sendAudioMessageFromUser,\n sendMessageFromUser,\n sendUploadFileFromUser,\n} from '../actions';\nimport { connect, restartChat } from '../actions/connectionActions';\nimport { ChatMessage, ConversationRatingState, RootState, UserType } from '../types';\nimport styles from './Chat.module.scss';\nimport Conversation from './conversation';\nimport PoweredBy from './powered-by';\nimport TranscriptMail from './transcript-mail';\nimport UserInput from './user-input';\n\n/**\n * Events von der Webseite, die den Webclient einbettet.\n */\nconst INCOMMING_EVENTS = {\n TRIGGER_ACTION: 'TRIGGER_ACTION',\n TRIGGER_STORY: 'TRIGGER_STORY',\n CHAT_MESSAGE_FROM_GUEST: 'CHAT_MESSAGE_FROM_GUEST',\n ON_CHAT_WINDOW_OPEN: 'ON_CHAT_WINDOW_OPEN',\n ON_CHAT_WINDOW_CLOSE: 'ON_CHAT_WINDOW_CLOSE',\n RESTART_CHAT: 'RESTART_CHAT', // Wird von Bubble CMS aufgerufen, wenn der Chat neu gestartet werden soll\n};\n\ninterface OwnProps {\n clientName: string;\n}\n\ninterface StateProps {\n messages: ChatMessage[];\n quickReplies: QuickReply[];\n isBotTyping: boolean;\n speechSupport: boolean;\n problemReportingEnabled: boolean;\n transcriptExportEnabled: {\n pdf: boolean;\n email: boolean;\n };\n conversationRating: ConversationRatingState;\n showGeneralConditions: boolean;\n uploadRequest?: UploadRequest;\n currentLanguage: string;\n translate: TranslateFunction;\n}\n\ninterface DispatchProps {\n onConnect: (clientName: string, querystrings: string) => void;\n onRestartChat: (clientName: string, querystrings: string) => void;\n onMessageFromUser: (text: string) => void;\n onRate: (rating: number, description: string) => void;\n onActionFromUser: (action: Action) => void;\n onQuickReplyClick: (reply: QuickReply) => void;\n onNluEvent: (event: string) => void;\n onButtonClick: (button: Button) => void;\n onLinkClick: (url: string) => void;\n onUploadFile: (filename: string, blob: Blob, payload: any) => void;\n onAudioRecorded: (blob: Blob) => void;\n onTranscriptExport: (email: string) => void;\n onPdfExport: () => void;\n onProblemReport: (actionId: string, problem: string | null) => void;\n}\n\ntype Props = StateProps & DispatchProps & OwnProps;\n\nconst ChatComponent = ({\n clientName,\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n currentLanguage,\n translate,\n onConnect,\n onRestartChat,\n onNluEvent,\n onMessageFromUser,\n onRate,\n onQuickReplyClick,\n onButtonClick,\n onLinkClick,\n onUploadFile,\n onAudioRecorded,\n onActionFromUser,\n onTranscriptExport,\n onPdfExport,\n onProblemReport,\n}: Props) => {\n const [showTranscriptMailOverlay, setShowTranscriptMailOverlay] = useState(false);\n const [cssClassName, setCssClassName] = useState<string | string[] | undefined>(undefined);\n\n useEffect(() => {\n window.document.documentElement.lang = currentLanguage;\n }, [currentLanguage]);\n\n useEffect(() => {\n const querystrings = window.location.search;\n const parsedQuerystrings = queryString.parse(querystrings);\n\n if (parsedQuerystrings.cssClassName) {\n setCssClassName(parsedQuerystrings.cssClassName);\n }\n\n /**\n * Meldung von ausserhalb (z.B. vom Wordpress Content-Bereich)\n */\n const handleOnMessageFromOutside = (event: any) => {\n switch (event.data.type) {\n case INCOMMING_EVENTS.TRIGGER_ACTION:\n onActionFromUser(event.data.action);\n break;\n case INCOMMING_EVENTS.TRIGGER_STORY:\n onNluEvent(event.data.story);\n break;\n case INCOMMING_EVENTS.ON_CHAT_WINDOW_OPEN:\n onActionFromUser({ type: 'webclient.chatwindow.opened' });\n break;\n case INCOMMING_EVENTS.ON_CHAT_WINDOW_CLOSE:\n onActionFromUser({ type: 'webclient.chatwindow.closed' });\n break;\n case INCOMMING_EVENTS.CHAT_MESSAGE_FROM_GUEST:\n onMessageFromUser(event.data.text);\n break;\n case INCOMMING_EVENTS.RESTART_CHAT:\n onRestartChat(clientName, querystrings);\n break;\n }\n };\n\n onConnect(clientName, querystrings);\n window.addEventListener('message', (event) => handleOnMessageFromOutside(event), false);\n return () => window.removeEventListener('message', handleOnMessageFromOutside);\n }, [clientName, onConnect, onRestartChat, onActionFromUser, onMessageFromUser, onNluEvent]);\n\n const anyExportEnabled = transcriptExportEnabled.email || transcriptExportEnabled.pdf;\n const numberOfMessagesFromGuest = messages.filter((m) => m.sender.type === UserType.GUEST).length;\n\n return (\n <div className={classNames(styles.chatwindow, 'chat__chatwindow', cssClassName)}>\n <div className={styles.chatcontent}>\n <Conversation\n messages={messages}\n isBotTyping={isBotTyping}\n showGeneralConditions={showGeneralConditions}\n problemReportingEnabled={problemReportingEnabled}\n onButtonClick={onButtonClick}\n onLinkClick={onLinkClick}\n onProblemReport={onProblemReport}\n translate={translate}\n />\n <UserInput\n quickReplies={isBotTyping ? [] : quickReplies}\n numberOfMessagesFromGuest={numberOfMessagesFromGuest}\n uploadRequest={uploadRequest}\n speechSupport={speechSupport}\n transcriptExportEnabled={anyExportEnabled}\n conversationRating={conversationRating}\n translate={translate}\n onRate={onRate}\n onQuickReplyClick={onQuickReplyClick}\n onTextInput={onMessageFromUser}\n onUploadFile={onUploadFile}\n onAudioRecorded={onAudioRecorded}\n onOpenTranscriptExportModal={() => setShowTranscriptMailOverlay(!showTranscriptMailOverlay)}\n />\n <PoweredBy translate={translate} />\n </div>\n {anyExportEnabled && (\n <TranscriptMail\n methods={transcriptExportEnabled}\n visible={showTranscriptMailOverlay}\n translate={translate}\n onEmailExport={onTranscriptExport}\n onPdfExport={onPdfExport}\n onClose={() => setShowTranscriptMailOverlay(false)}\n />\n )}\n </div>\n );\n};\n\nconst mapStateToProps = (state: RootState): StateProps => {\n const {\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n } = state.chat;\n return {\n messages,\n quickReplies,\n uploadRequest,\n isBotTyping,\n speechSupport,\n problemReportingEnabled,\n transcriptExportEnabled,\n conversationRating,\n showGeneralConditions,\n currentLanguage: getActiveLanguage(state.locale).code,\n translate: getTranslate(state.locale),\n };\n};\n\nconst bindAction = (dispatch: ThunkDispatch<RootState, void, Action>): DispatchProps => {\n return {\n onConnect: (clientName: string, querystrings: string) => dispatch(connect(clientName, querystrings)),\n onRestartChat: (clientName: string, querystrings: string) => dispatch(restartChat(clientName, querystrings)),\n onMessageFromUser: (text: string) => dispatch(sendMessageFromUser(text)),\n onRate: (value: number, feedback: string) => dispatch(handleRatingFromUser(value, feedback)),\n onAudioRecorded: (blob: Blob) => dispatch(sendAudioMessageFromUser(blob)),\n onActionFromUser: (action: Action) => dispatch(action),\n onQuickReplyClick: (reply: QuickReply) => dispatch(handleQuickReplyClick(reply)),\n onNluEvent: (event: string) => dispatch(requestNLUEvent(event)),\n onButtonClick: (button: any) => dispatch(handleButtonClick(button)),\n onLinkClick: (url: any) => dispatch(handleLinkClick(url)),\n onUploadFile: (filename: string, blob: Blob, payload: any) =>\n dispatch(sendUploadFileFromUser(filename, blob, payload)),\n onTranscriptExport: (email: string) => dispatch(exportTranscript(email)),\n onPdfExport: () => dispatch(downloadTranscriptPdf()),\n onProblemReport: (actionId: string, problem: string | null) =>\n dispatch(reportProblemFromGuest(actionId, problem)),\n };\n};\n\nexport default reduxConnect<StateProps, DispatchProps, OwnProps, RootState>(mapStateToProps, bindAction)(ChatComponent);\n","import { addTranslationForLanguage, initialize } from 'react-localize-redux';\nimport { AnyAction, Dispatch } from 'redux';\n\nconst init = (dispatch: Dispatch<AnyAction>) => {\n const languages = ['de', 'en', 'fr', 'it'];\n dispatch(\n initialize({\n languages,\n options: { defaultLanguage: 'de', renderToStaticMarkup: false, onMissingTranslation: () => '' },\n })\n );\n\n languages.forEach((language) => {\n const json = require(`./${language}.json`);\n dispatch(addTranslationForLanguage(json, language));\n });\n};\n\nexport default init;\n","import { AnyAction } from 'redux';\nimport * as ConnectionActions from '../actions/connectionActions';\nimport { ConnectionState, ConnectionStateEnum } from '../types';\n\nconst backendConnectionReducer = (state = initialState, action: AnyAction): ConnectionState => {\n switch (action.type) {\n case ConnectionActions.CONNECT:\n return Object.assign({}, state, {\n sessionId: action.sessionId,\n userId: action.userId,\n });\n\n case ConnectionActions.CONNECTING:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.CONNECTING,\n });\n\n case ConnectionActions.CONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.CONNECTED,\n });\n\n case ConnectionActions.DISCONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n });\n\n case ConnectionActions.RECONNECTED:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.RECONNECTED,\n });\n\n case ConnectionActions.RESTORE_SESSION_ID:\n return Object.assign({}, state, {\n sessionId: action.sessionId,\n });\n\n case ConnectionActions.RESTART:\n return Object.assign({}, state, {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n sessionId: undefined,\n });\n\n default:\n return state;\n }\n};\n\nconst initialState: ConnectionState = {\n connectionState: ConnectionStateEnum.DISCONNECTED,\n sessionId: undefined,\n userId: undefined,\n};\n\nexport default backendConnectionReducer;\n","import { ActionTypes, GuestUser, TextMessage } from '@botfabrik/engine-domain';\nimport { AnyAction } from 'redux';\nimport { v4 as uuid } from 'uuid';\nimport * as ClientActions from '../actions';\nimport { ChatMessage, ChatState, ConversationRatingState } from '../types';\n\nconst chatReducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case ActionTypes.TYPING_ON:\n return Object.assign({}, state, {\n isBotTyping: true,\n });\n\n case ActionTypes.TYPING_OFF:\n return Object.assign({}, state, {\n isBotTyping: false,\n });\n\n case ActionTypes.MESSAGE_FROM_GUEST:\n case ActionTypes.MESSAGE_WITHOUT_ANALYSIS_FROM_GUEST:\n return appendMessageFromGuestToState(state, action.message);\n\n case ActionTypes.MESSAGE_TO_GUEST:\n // Informiere das Top Window (z.B. unser Wordpress-Blog) über das eintreffen einer neuen Nachricht\n sendToParentPage(action);\n\n // id hinzufügen, damit wir nicht zweimal die selbe Meldung im State haben\n const message: ChatMessage = Object.assign({}, action.message, { _id: action.meta.actionId });\n const alreadyAdded = state.messages.filter((m: any) => m._id === action.meta.actionId).length > 0;\n\n return Object.assign({}, state, {\n messages: alreadyAdded ? state.messages : state.messages.concat([message]),\n quickReplies: message.quickReplies ? message.quickReplies : [],\n uploadRequest: message.uploadRequest ? message.uploadRequest : {},\n });\n\n case ClientActions.RESTORE_PREVIOUS_CHAT_MESSAGES:\n const messages = action.messages;\n if (messages.length > 0) {\n const lastMessage = messages[messages.length - 1];\n return Object.assign({}, initialState, {\n messages,\n quickReplies: lastMessage.quickReplies ? lastMessage.quickReplies : [],\n uploadRequest: lastMessage.uploadRequest ? lastMessage.uploadRequest : {},\n });\n } else {\n return initialState;\n }\n\n case ActionTypes.FILE_FROM_GUEST:\n const uploadRequest = Object.assign({}, state.uploadRequest, { uploadState: 'uploading' });\n return Object.assign({}, state, { uploadRequest });\n\n case ClientActions.MESSAGE_TO_PARENT_PAGE:\n sendToParentPage(action.message);\n return state;\n\n case ActionTypes.EVENT_TO_GUEST:\n sendToParentPage(action.event);\n return state;\n\n case ClientActions.EXPAND_WINDOW:\n sendToParentPage(action);\n return state;\n\n case ClientActions.ENABLE_SPEECH_SUPPORT:\n return Object.assign({}, state, { speechSupport: true });\n\n case ClientActions.ENABLE_PROBLEM_REPORTING_SUPPORT:\n return Object.assign({}, state, { problemReportingEnabled: true });\n\n case ClientActions.RECEIVE_SPEECH_TRANSCRIPTION:\n const msg = new TextMessage(action.transcription, new GuestUser());\n const chatMsg: ChatMessage = Object.assign({}, msg, { _id: uuid() });\n return appendMessageFromGuestToState(state, chatMsg);\n\n case ClientActions.ENABLE_TRANSCRIPT_EXPORT:\n return Object.assign({}, state, {\n transcriptExportEnabled: action.methods,\n });\n\n case ClientActions.SHOW_GENERAL_CONDITIONS:\n return Object.assign({}, state, { showGeneralConditions: true });\n\n case ActionTypes.PROBLEM_REPORT_FROM_GUEST:\n const msgs = state.messages.map((m) => {\n if (m._id === action.payload.actionId) {\n return Object.assign({}, m, { problemReport: action.payload.problem });\n } else {\n return m;\n }\n });\n return Object.assign({}, state, { messages: msgs });\n\n case ClientActions.ENABLE_CONVERSATION_RATING:\n const conversationRating: ConversationRatingState = {\n enabled: true,\n rating: action.payload.rating,\n };\n return Object.assign({}, state, { conversationRating });\n\n case ActionTypes.CONVERSATION_RATING_FROM_GUEST: {\n const conversationRating: ConversationRatingState = {\n ...state.conversationRating,\n rating: action.payload,\n };\n return Object.assign({}, state, { conversationRating });\n }\n\n default:\n return state;\n }\n};\n\nconst appendMessageFromGuestToState = (state: ChatState, message: ChatMessage) => {\n const lastMessage = state.messages[state.messages.length - 1];\n const sameText = (lastMessage as any)?.text === (message as any).text;\n if (lastMessage && lastMessage.sender.type === message.sender.type && sameText) {\n return state;\n }\n\n return Object.assign({}, state, {\n messages: state.messages.concat([message]),\n quickReplies: [],\n });\n};\n\nconst sendToParentPage = (action: any) => {\n if (isIframe()) {\n window.top?.postMessage(action, '*');\n } else if (action.type === 'webclient.change.url') {\n window.open(action.url);\n }\n};\n\nconst isIframe = () => typeof window !== 'undefined' && window.self !== window.top;\n\nconst initialState: ChatState = {\n messages: [],\n quickReplies: [],\n isBotTyping: false,\n speechSupport: false,\n problemReportingEnabled: false,\n transcriptExportEnabled: {\n pdf: false,\n email: false,\n },\n showGeneralConditions: false,\n conversationRating: {\n enabled: false,\n },\n};\n\nexport default chatReducer;\n","import { localizeReducer } from 'react-localize-redux';\nimport { combineReducers } from 'redux';\nimport backendConnectionReducer from './backendConnectionReducer';\nimport chatReducer from './chatReducer';\n\nconst rootReducer = combineReducers({\n chat: chatReducer,\n connection: backendConnectionReducer,\n locale: localizeReducer,\n});\n\nexport default rootReducer;\n","import { RootState } from '../types';\n\nconst LOCAL_STORAGE_LAST_SAVED_ITEM_NAME = 'bf-webclient-state-last-saved-at';\nconst LOCAL_STORAGE_STATE_ITEM_NAME = 'bf-webclient-state';\n\nexport const loadState = (clientName: string) => {\n try {\n if (!supportsLocalStorage()) {\n return undefined;\n }\n\n // get last save time\n const lastSavedAt = getStoreItem(clientName, LOCAL_STORAGE_LAST_SAVED_ITEM_NAME);\n if (isExpired(lastSavedAt)) {\n return undefined;\n } else {\n // load persisted state\n const serializedState = getStoreItem(clientName, LOCAL_STORAGE_STATE_ITEM_NAME);\n if (serializedState === null) {\n return undefined;\n }\n return JSON.parse(serializedState);\n }\n } catch (err) {\n console.error(err);\n return undefined;\n }\n};\n\nexport const saveState = (clientName: string, state: Partial<RootState>) => {\n try {\n // save state\n const serializedState = JSON.stringify(state);\n setStoreItem(clientName, LOCAL_STORAGE_STATE_ITEM_NAME, serializedState);\n\n // save current date\n let now = new Date().toISOString();\n setStoreItem(clientName, LOCAL_STORAGE_LAST_SAVED_ITEM_NAME, now);\n } catch (err) {\n // ignorieren\n console.error(err);\n }\n};\n\nconst isExpired = (lastSavedAt: string | null): boolean => {\n if (lastSavedAt === null) {\n return false;\n }\n let expiresAt = new Date(lastSavedAt);\n expiresAt.setHours(expiresAt.getHours() + 12);\n\n let now = new Date();\n\n return now > expiresAt;\n};\n\nconst supportsLocalStorage = () => typeof localStorage !== 'undefined';\nconst getStoreItem = (clientName: string, storeItemName: string) => localStorage.getItem(`${clientName}_${storeItemName}`);\nconst setStoreItem = (clientName: string, storeItemName: string, value: string) =>\n localStorage.setItem(`${clientName}_${storeItemName}`, value);\n","import { ActionTypes } from '@botfabrik/engine-domain';\nimport { addTranslationForLanguage, setActiveLanguage, SingleLanguageTranslation } from 'react-localize-redux';\nimport { AnyAction, Dispatch, Middleware, MiddlewareAPI } from 'redux';\nimport io from 'socket.io-client';\nimport { Devices } from '../../../src';\nimport * as ChatActions from '../actions';\nimport * as ClientActions from '../actions';\nimport * as ConnectionActions from '../actions/connectionActions';\nimport { EnableConversationRatingType, RootState } from '../types';\n\n// Blacklisted actions are not forwarded to the server\nconst blacklist = [\n ActionTypes.MESSAGE_TO_GUEST,\n ActionTypes.EVENT_TO_GUEST,\n ActionTypes.TYPING_ON,\n ActionTypes.TYPING_OFF,\n ...ConnectionActions.INTERNAL_ACTIONS,\n ...ChatActions.INTERNAL_ACTIONS,\n '@@localize/SET_ACTIVE_LANGUAGE',\n '@@localize/ADD_TRANSLATION_FOR_LANGUAGE',\n];\n\nconst socketMiddleware: Middleware =\n ({ dispatch, getState }: MiddlewareAPI<Dispatch, RootState>) =>\n (next: Dispatch<AnyAction>) => {\n let socket: SocketIOClient.Socket | null = null;\n\n return (action: AnyAction) => {\n let result = next(action);\n\n if (action.type === ConnectionActions.CONNECT) {\n if (socket != null) {\n socket.disconnect();\n }\n dispatch(ConnectionActions.connecting());\n\n socket = io(`/${action.clientName}/chat?${action.querystrings}`);\n\n socket.on('action', dispatch);\n socket.on('connect', () => dispatch(ConnectionActions.connected()));\n socket.on('disconnect', () => dispatch(ConnectionActions.disconnected()));\n socket.on('reconnect', () => dispatch(ConnectionActions.reconnected()));\n socket.on('set-translations', (language: string, translation: SingleLanguageTranslation) => {\n dispatch(setActiveLanguage(language));\n dispatch(addTranslationForLanguage(translation, language));\n });\n socket.on('enable-speech-support', () => dispatch(ChatActions.enableSpeechSupport()));\n socket.on('enable-problem-reporting', () => dispatch(ChatActions.enableProblemReportingSupport()));\n socket.on('enable-transcript-export', (props: { pdf: boolean; email: boolean }) =>\n dispatch(ChatActions.enableTranscriptExport(props))\n );\n socket.on('enable-conversation-rating', (rating: EnableConversationRatingType) =>\n dispatch(ChatActions.enableConversationRating(rating))\n );\n socket.on('speech-transcription', (transcription: string) =>\n dispatch(ChatActions.receiveSpeechTranscription(transcription))\n );\n socket.on('restore-client-state', (state: any) => {\n socket!.io.uri = socket!.io.uri.replace(action.sessionId, state.sessionId);\n dispatch(ConnectionActions.restoreSessionId(state.sessionId));\n dispatch(ChatActions.restorePreviousChatMessages(state.messages));\n });\n socket.on('file-uploaded', () => console.log('webclient socket middleware: file-uploaded'));\n socket.on('expand-window', ({ devices }: { devices: Devices }) =>\n dispatch({ type: ClientActions.EXPAND_WINDOW, devices })\n );\n socket.on('show-general-conditions', () => dispatch(ChatActions.showGeneralConditions()));\n } else if (action.type === ChatActions.GET_STARTED) {\n socket?.emit('get-started', JSON.stringify(action));\n } else if (action.type === ActionTypes.FILE_FROM_GUEST) {\n socket?.emit('file-from-guest', JSON.stringify(action));\n } else if (action.type === ChatActions.AUDIO_MESSAGE_FROM_USER) {\n socket?.emit('audio-message', action.buffer);\n } else if (action.type === ActionTypes.CONVERSATION_RATING_FROM_GUEST) {\n socket?.emit('conversation-rating', action.payload);\n } else if (action.type === ChatActions.DOWNLOAD_TRANSCRIPT_PDF) {\n const {\n connection: { sessionId },\n } = getState();\n window.location.href = `/transcript-pdf/${sessionId}`;\n } else if (blacklist.indexOf(action.type) === -1 && action.meta === undefined) {\n // Foreward all other actions to the server\n if (socket) {\n socket.emit('action', JSON.stringify(action));\n } else {\n // TODO: wenn socket undefined ist, diese sammeln und später abarbeiten\n }\n }\n\n return result;\n };\n };\n\nexport default socketMiddleware;\n","import throttle from 'lodash/throttle';\nimport { applyMiddleware, compose, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport reducer from '../reducers';\nimport { loadState, saveState } from './localStorage';\nimport socketMiddleware from './socketMiddleware';\n\nconst configureStore = (clientName: string) => {\n const persistedState = loadState(clientName);\n const store = compose(applyMiddleware(thunk, socketMiddleware))(createStore)(reducer, persistedState);\n\n store.subscribe(\n throttle(() => {\n let state = store.getState();\n saveState(clientName, {\n connection: state.connection,\n });\n }, 1000)\n );\n\n return store;\n};\n\nexport default configureStore;\n","import React from 'react';\nimport 'react-app-polyfill/ie11';\nimport { Provider } from 'react-redux';\nimport styles from './Client.module.scss';\nimport Chat from './components/Chat';\nimport initTranslations from './locales/initialize';\nimport configureStore from './store/configureStore';\n\nconst App = () => {\n const clientName = extractClientNameFromPathname(window.location.pathname);\n const store = configureStore(clientName);\n initTranslations(store.dispatch);\n\n return (\n <Provider store={store}>\n <div className={styles.chatPage}>\n <Chat clientName={clientName} />\n </div>\n </Provider>\n );\n};\n\nconst extractClientNameFromPathname = (pathname: string) => {\n const pathElements = pathname.split('/');\n const endsWithSlash = pathname.endsWith('/');\n return pathElements[pathElements.length - (endsWithSlash ? 2 : 1)];\n};\n\nexport default App;\n","// TODO: move the content of this file to index.tsx if IE11 is no longer supportd\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(<App />, document.getElementById('root'));\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"audioRecorder\":\"AudioRecorder_audioRecorder__37BQJ\",\"recordButton\":\"AudioRecorder_recordButton__3-QeV\",\"submitButton\":\"AudioRecorder_submitButton__10pVF\",\"cancelButton\":\"AudioRecorder_cancelButton__64CTn\",\"recorderIcon\":\"AudioRecorder_recorderIcon__2o4Ov\",\"pulse\":\"AudioRecorder_pulse__3Xsbm\",\"spinning\":\"AudioRecorder_spinning__1hO3P\",\"spin\":\"AudioRecorder_spin__3bMw-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"callToActionContainer\":\"RateInput_callToActionContainer__2L-qj\",\"append-animate\":\"RateInput_append-animate__3DMLo\",\"callToActionTitle\":\"RateInput_callToActionTitle__1iGzl\",\"rateOverlay\":\"RateInput_rateOverlay__J7JDV\",\"body\":\"RateInput_body__2uJD2\",\"rateOverlayOpen\":\"RateInput_rateOverlayOpen__1Gcs8\",\"slide-in\":\"RateInput_slide-in__1n3Pc\",\"rateOverlayClose\":\"RateInput_rateOverlayClose__3UAYN\",\"slide-out\":\"RateInput_slide-out__1ER5Q\",\"footer\":\"RateInput_footer__2KF23\",\"actions\":\"RateInput_actions__322Xb\",\"bubbles\":\"RateInput_bubbles__5dsER\",\"rateFeedbackBotBubble\":\"RateInput_rateFeedbackBotBubble__2OU7a\",\"rateFeedbackGuestBubble\":\"RateInput_rateFeedbackGuestBubble__D1C8m\",\"avatar\":\"RateInput_avatar__kJM55\",\"fadeInLeft\":\"RateInput_fadeInLeft__1m8Su\",\"bubble\":\"RateInput_bubble__2Zvzl\",\"appear\":\"RateInput_appear__2hqru\",\"botBubble\":\"RateInput_botBubble__1RalY\",\"guestBubble\":\"RateInput_guestBubble__2n9oO\",\"rateText\":\"RateInput_rateText__TevGU\",\"stars\":\"RateInput_stars__3NNAj\",\"starsSmall\":\"RateInput_starsSmall__2rDnY\",\"starsLarge\":\"RateInput_starsLarge__2DHxK\",\"star\":\"RateInput_star__3VZmc\",\"starReadonly\":\"RateInput_starReadonly__tlZX_\",\"starIcon\":\"RateInput_starIcon__1bPxv\",\"starsDescriptionContainer\":\"RateInput_starsDescriptionContainer__37Bi1\",\"starsDescription\":\"RateInput_starsDescription__28mx4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputWrapper\":\"TextInput_inputWrapper__1fIyq\",\"messageInputWrapper\":\"TextInput_messageInputWrapper__6KJHK\",\"messageInput\":\"TextInput_messageInput__2fCF7\",\"buttons\":\"TextInput_buttons__qLokb\",\"button\":\"TextInput_button__5my0Y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"generalConditionsContainer\":\"GeneralConditions_generalConditionsContainer__2AZfv\",\"generalConditions\":\"GeneralConditions_generalConditions__2o9K6\",\"generalConditionsHeader\":\"GeneralConditions_generalConditionsHeader__3AdUS\",\"generalConditionsBody\":\"GeneralConditions_generalConditionsBody__k8BFW\",\"generalConditionsAccept\":\"GeneralConditions_generalConditionsAccept__3390Q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"problemReport\":\"ProblemReport_problemReport__2rF6I\",\"problemReportIcon\":\"ProblemReport_problemReportIcon__1iPpu\",\"problemReportIconActive\":\"ProblemReport_problemReportIconActive__HbMKR\",\"problemReportIconInactive\":\"ProblemReport_problemReportIconInactive__3btGw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ticontainer\":\"TypingIndicator_ticontainer__29oO1\",\"tiblock\":\"TypingIndicator_tiblock__1QBS0\",\"tidot\":\"TypingIndicator_tidot__3aLQm\",\"mercuryTypingAnimation\":\"TypingIndicator_mercuryTypingAnimation__3fDgV\"};"],"sourceRoot":""}