{"version":3,"sources":["webpack:///./app/javascript/dashboard/mixins/time.js","webpack:///./app/javascript/shared/helpers/markdownIt/link.js","webpack:///./app/javascript/shared/helpers/MessageFormatter.js","webpack:///./app/javascript/shared/mixins/messageFormatterMixin.js","webpack:///./app/javascript/dashboard/components/widgets/Avatar.vue?f06b","webpack:///./app/javascript/dashboard/components/widgets/Thumbnail.vue?f7f7","webpack:///./app/javascript/dashboard/assets/images/chatwoot_bot.png","webpack:///./app/javascript/widget/components/ChatInputWrap.vue?ef32","webpack:///./app/javascript/widget/components/ChatFooter.vue?7736","webpack:///./app/javascript/widget/components/UserMessageBubble.vue?2576","webpack:///./app/javascript/widget/components/ImageBubble.vue?bb91","webpack:///./app/javascript/widget/components/FileBubble.vue?5656","webpack:///./app/javascript/shared/components/CardButton.vue?f88c","webpack:///./app/javascript/shared/components/ChatCard.vue?a947","webpack:///./app/javascript/shared/components/ChatForm.vue?6a87","webpack:///./app/javascript/shared/components/ChatOption.vue?76c0","webpack:///./app/javascript/shared/components/ChatOptions.vue?41f0","webpack:///./app/javascript/shared/components/ChatOptions.vue?cbbb","webpack:///./app/javascript/widget/components/template/Article.vue?8582","webpack:///./app/javascript/widget/components/template/EmailInput.vue?9c50","webpack:///./app/javascript/shared/components/CustomerSatisfaction.vue?0eb4","webpack:///./app/javascript/widget/components/template/IntegrationCard.vue?e882","webpack:///./app/javascript/widget/components/ChatMessage.vue?6318","webpack:///./app/javascript/widget/components/ChatMessage.vue?528a","webpack:///./app/javascript/widget/assets/images/typing.gif","webpack:///./app/javascript/widget/components/AgentTypingBubble.vue?658a","webpack:///./app/javascript/shared/components/DateSeparator.vue?8417","webpack:///./app/javascript/widget/components/ConversationWrap.vue?4ab2","webpack:///./app/javascript/widget/views/Messages.vue?4fbe","webpack:///app/javascript/widget/components/ChatAttachment.vue","webpack:///./app/javascript/widget/components/ChatAttachment.vue?d672","webpack:///./app/javascript/widget/components/ChatAttachment.vue","webpack:///./app/javascript/widget/components/ChatAttachment.vue?1578","webpack:///./app/javascript/widget/components/ChatSendButton.vue?711c","webpack:///app/javascript/widget/components/ChatSendButton.vue","webpack:///./app/javascript/widget/components/ChatSendButton.vue","webpack:///./app/javascript/widget/components/ChatSendButton.vue?39ab","webpack:///app/javascript/widget/components/ChatInputWrap.vue","webpack:///./app/javascript/widget/components/ChatInputWrap.vue?4cd4","webpack:///./app/javascript/widget/components/ChatInputWrap.vue","webpack:///./app/javascript/widget/components/ChatInputWrap.vue?30f3","webpack:///app/javascript/widget/components/ChatFooter.vue","webpack:///./app/javascript/widget/components/ChatFooter.vue?8c6f","webpack:///./app/javascript/widget/components/ChatFooter.vue","webpack:///./app/javascript/widget/components/ChatFooter.vue?ab97","webpack:///./app/javascript/widget/components/UserMessageBubble.vue?0840","webpack:///app/javascript/widget/components/UserMessageBubble.vue","webpack:///./app/javascript/widget/components/UserMessageBubble.vue","webpack:///./app/javascript/widget/components/UserMessageBubble.vue?a528","webpack:///./app/javascript/widget/components/ImageBubble.vue?273c","webpack:///app/javascript/widget/components/ImageBubble.vue","webpack:///./app/javascript/widget/components/ImageBubble.vue","webpack:///./app/javascript/widget/components/ImageBubble.vue?b2bb","webpack:///./app/javascript/widget/components/FileBubble.vue?c1ef","webpack:///app/javascript/widget/components/FileBubble.vue","webpack:///./app/javascript/widget/components/FileBubble.vue","webpack:///./app/javascript/widget/components/FileBubble.vue?bc15","webpack:///./app/javascript/widget/mixins/messageMixin.js","webpack:///app/javascript/widget/components/UserMessage.vue","webpack:///./app/javascript/widget/components/UserMessage.vue?4cf0","webpack:///./app/javascript/widget/components/UserMessage.vue","webpack:///./app/javascript/widget/components/UserMessage.vue?3848","webpack:///app/javascript/shared/components/CardButton.vue","webpack:///./app/javascript/shared/components/CardButton.vue?2f9c","webpack:///./app/javascript/shared/components/ChatCard.vue?95f7","webpack:///app/javascript/shared/components/ChatCard.vue","webpack:///./app/javascript/shared/components/CardButton.vue","webpack:///./app/javascript/shared/components/CardButton.vue?79a4","webpack:///./app/javascript/shared/components/ChatCard.vue","webpack:///./app/javascript/shared/components/ChatCard.vue?fa82","webpack:///app/javascript/shared/components/ChatForm.vue","webpack:///./app/javascript/shared/components/ChatForm.vue?4553","webpack:///./app/javascript/shared/components/ChatForm.vue","webpack:///./app/javascript/shared/components/ChatForm.vue?2e1c","webpack:///app/javascript/shared/components/ChatOption.vue","webpack:///./app/javascript/shared/components/ChatOption.vue?240d","webpack:///./app/javascript/shared/components/ChatOptions.vue?22d1","webpack:///app/javascript/shared/components/ChatOptions.vue","webpack:///./app/javascript/shared/components/ChatOption.vue","webpack:///./app/javascript/shared/components/ChatOption.vue?ee1a","webpack:///./app/javascript/shared/components/ChatOptions.vue","webpack:///./app/javascript/shared/components/ChatOptions.vue?aa1d","webpack:///./app/javascript/widget/components/template/Article.vue?6f75","webpack:///app/javascript/widget/components/template/Article.vue","webpack:///./app/javascript/widget/components/template/Article.vue","webpack:///./app/javascript/widget/components/template/Article.vue?bfdd","webpack:///app/javascript/widget/components/template/EmailInput.vue","webpack:///./app/javascript/widget/components/template/EmailInput.vue?431d","webpack:///./app/javascript/widget/components/template/EmailInput.vue","webpack:///./app/javascript/widget/components/template/EmailInput.vue?382d","webpack:///app/javascript/shared/components/CustomerSatisfaction.vue","webpack:///./app/javascript/shared/components/CustomerSatisfaction.vue?6856","webpack:///./app/javascript/shared/components/CustomerSatisfaction.vue","webpack:///./app/javascript/shared/components/CustomerSatisfaction.vue?bea2","webpack:///./app/javascript/widget/api/integration.js","webpack:///app/javascript/widget/components/template/IntegrationCard.vue","webpack:///./app/javascript/widget/components/template/IntegrationCard.vue?bf68","webpack:///./app/javascript/widget/components/AgentMessageBubble.vue?c722","webpack:///app/javascript/widget/components/AgentMessageBubble.vue","webpack:///./app/javascript/widget/components/template/IntegrationCard.vue","webpack:///./app/javascript/widget/components/template/IntegrationCard.vue?e5b3","webpack:///./app/javascript/widget/components/AgentMessageBubble.vue","webpack:///./app/javascript/widget/components/AgentMessageBubble.vue?1814","webpack:///app/javascript/widget/components/AgentMessage.vue","webpack:///./app/javascript/widget/components/AgentMessage.vue?2dd5","webpack:///./app/javascript/widget/components/ChatMessage.vue?f3cf","webpack:///app/javascript/widget/components/ChatMessage.vue","webpack:///./app/javascript/widget/components/AgentMessage.vue","webpack:///./app/javascript/widget/components/AgentMessage.vue?5e53","webpack:///./app/javascript/widget/components/ChatMessage.vue","webpack:///./app/javascript/widget/components/ChatMessage.vue?78d4","webpack:///./app/javascript/widget/components/AgentTypingBubble.vue?0c33","webpack:///app/javascript/widget/components/AgentTypingBubble.vue","webpack:///./app/javascript/widget/components/AgentTypingBubble.vue","webpack:///./app/javascript/widget/components/AgentTypingBubble.vue?532f","webpack:///./app/javascript/shared/components/DateSeparator.vue?6fd3","webpack:///app/javascript/shared/components/DateSeparator.vue","webpack:///app/javascript/widget/components/ConversationWrap.vue","webpack:///./app/javascript/widget/components/ConversationWrap.vue?3b40","webpack:///./app/javascript/shared/components/DateSeparator.vue","webpack:///./app/javascript/shared/components/DateSeparator.vue?466c","webpack:///app/javascript/widget/views/Messages.vue","webpack:///./app/javascript/widget/components/ConversationWrap.vue","webpack:///./app/javascript/widget/components/ConversationWrap.vue?2d2f","webpack:///./app/javascript/widget/views/Messages.vue?f6df","webpack:///./app/javascript/widget/views/Messages.vue","webpack:///./app/javascript/shared/components/ResizableTextArea.vue?de34","webpack:///./app/javascript/shared/components/ResizableTextArea.vue?38b8","webpack:///app/javascript/shared/components/ResizableTextArea.vue","webpack:///./app/javascript/shared/components/ResizableTextArea.vue","webpack:///./app/javascript/shared/helpers/FileHelper.js","webpack:///./app/javascript/shared/helpers/emoji.js","webpack:///./app/javascript/dashboard/components/widgets/Thumbnail.vue?9bc8","webpack:///./app/javascript/dashboard/components/widgets/Avatar.vue?1562","webpack:///app/javascript/dashboard/components/widgets/Avatar.vue","webpack:///./app/javascript/dashboard/components/widgets/Avatar.vue","webpack:///./app/javascript/dashboard/components/widgets/Avatar.vue?c3bc","webpack:///./app/javascript/dashboard/components/widgets/Thumbnail.vue?8701","webpack:///app/javascript/dashboard/components/widgets/Thumbnail.vue","webpack:///./app/javascript/dashboard/components/widgets/Thumbnail.vue","webpack:///./app/javascript/shared/components/Button.vue?23f7","webpack:///./app/javascript/shared/components/Button.vue?26c2","webpack:///app/javascript/shared/components/Button.vue","webpack:///./app/javascript/shared/components/Button.vue","webpack:///./app/javascript/shared/helpers/IntegrationHelper.js"],"names":["methods","messageStamp","time","dateFormat","unixTime","fromUnixTime","format","dynamicTime","formatDistanceToNow","addSuffix","shortTimestamp","replace","USER_MENTIONS_REGEX","md","require","html","xhtmlOut","breaks","langPrefix","linkify","typographer","quotes","maxNesting","use","renderer","rules","mention","tokens","idx","content","inline","ruler","before","state","silent","label","labelEnd","labelStart","pos","res","token","href","max","posMax","src","charCodeAt","helpers","parseLinkLabel","slice","parseLinkDestination","ok","normalizeLink","str","validateLink","match","RegExp","push","mila","attrs","class","rel","target","TWITTER_USERNAME_REGEX","TWITTER_HASH_REGEX","MessageFormatter","message","isATweet","isAPrivateNote","this","updatedMessage","render","formatMessage","DOMParser","parseFromString","formattedMessage","body","textContent","isAgentView","getPlainText","plainText","truncateMessage","description","length","module","exports","_vm","_h","$createElement","_c","_self","ref","allowedFileTypes","direct_upload_url","direct_upload","on","onFileUpload","staticClass","isUploading","image","_e","_v","disabled","onClick","loading","style","color","$dm","$event","type","indexOf","_k","keyCode","key","hideEmojiPicker","inputColor","$t","onTypingOff","onTypingOn","onFocus","onBlur","model","value","callback","$$v","userInput","expression","onSendAttachment","toggleEmojiPicker","emojiIconColor","directives","name","rawName","emojiOnClick","handleButtonClick","widgetColor","hideReplyBox","textColor","startNewConversation","_s","sendTranscript","isWidgetStyleFlat","handleSendMessage","handleSendAttachment","background","url","thumb","onImgError","readableTime","titleColor","title","computed","messageContentAttributes","content_attributes","hasAttachments","attachments","isInProgress","isFailed","status","backgroundColor","_l","attachment","id","file_type","hasImageError","data_url","onImageLoadError","retrySendMessage","action","uri","borderColor","text","payload","mediaUrl","preventDefault","onSubmit","item","hasSubmitted","formValues","regex","required","placeholder","submittedValues","domProps","Array","isArray","_i","$$a","$$el","$$c","checked","$$i","$set","concat","_q","composing","pattern","$$selectedVal","prototype","filter","call","options","o","selected","map","_value","multiple","option","pattern_error","onSubmitClick","buttonLabel","isSelected","hideFields","items","link","modifiers","inputHasError","email","trim","$v","$touch","$forceUpdate","$invalid","isUpdating","rating","buttonClass","selectRating","emoji","isFeedbackSubmitted","feedback","isButtonDisabled","messageId","search","buildSearchParamsWithLocale","window","location","urlData","API","post","message_id","isLoading","joinTheCall","meetingLink","leaveTheRoom","isCards","isOptions","isForm","isArticle","isCSAT","data","submitted_values","onOptionSelect","button_label","onFormSubmit","media_url","actions","hasRecordedResponse","isASubmittedForm","showAvatar","avatarUrl","agentName","contentType","messageType","wrapClass","responseMessage","submittedValue","formattedDate","colorSchemeClass","isAgentTyping","groupedMessage","date","groupedMessages","component","onInput","onKeyup","formatBytes","bytes","decimals","k","dm","sizes","i","Math","floor","log","parseFloat","pow","toFixed","checkFileSizeLimit","file","maximumUploadLimit","fileSize","size","hasEmojiSupport","offset","devicePixelRatio","node","document","createElement","getContext","fillText","ctx","fillStyle","textBaseline","font","getImageData","removeEmoji","userInitial","thumbnailBoxClass","height","width","thumbnailClass","onImgLoad","shouldShowImage","userNameWithoutEmoji","avatarSize","badgeSrc","buttonClassName","_t","buildDyteURL","roomName","dyteAuthToken"],"mappings":"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","file":"js/18-e45b66c09853e2d06eb7.chunk.js","sourcesContent":["import fromUnixTime from 'date-fns/fromUnixTime';\nimport format from 'date-fns/format';\nimport formatDistanceToNow from 'date-fns/formatDistanceToNow';\n\nexport default {\n methods: {\n messageStamp(time, dateFormat = 'h:mm a') {\n const unixTime = fromUnixTime(time);\n return format(unixTime, dateFormat);\n },\n dynamicTime(time) {\n const unixTime = fromUnixTime(time);\n return formatDistanceToNow(unixTime, { addSuffix: true });\n },\n dateFormat(time, dateFormat = 'MMM d, yyyy') {\n const unixTime = fromUnixTime(time);\n return format(unixTime, dateFormat);\n },\n shortTimestamp(time) {\n const convertToShortTime = time\n .replace(/about|over|almost|/g, '')\n .replace('less than a minute ago', 'now')\n .replace(' minute ago', 'm')\n .replace(' minutes ago', 'm')\n .replace('a minute ago', 'm')\n .replace('an hour ago', 'h')\n .replace(' hour ago', 'h')\n .replace(' hours ago', 'h')\n .replace(' day ago', 'd')\n .replace('a day ago', 'd')\n .replace(' days ago', 'd')\n .replace('a month ago', 'mo')\n .replace(' months ago', 'mo')\n .replace(' month ago', 'mo')\n .replace('a year ago', 'y')\n .replace(' year ago', 'y')\n .replace(' years ago', 'y');\n return convertToShortTime;\n },\n },\n};\n","// Process [@mention](mention://user/1/Pranav)\nconst USER_MENTIONS_REGEX = /mention:\\/\\/(user|team)\\/(\\d+)\\/(.+)/gm;\n\nconst buildMentionTokens = () => (state, silent) => {\n var label;\n var labelEnd;\n var labelStart;\n var pos;\n var res;\n var token;\n var href = '';\n var max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x5b /* [ */) {\n return false;\n }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) {\n return false;\n }\n\n label = state.src.slice(labelStart, labelEnd);\n pos = labelEnd + 1;\n\n if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) {\n pos += 1;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n pos += 1;\n }\n\n if (!href.match(new RegExp(USER_MENTIONS_REGEX))) {\n return false;\n }\n\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('mention', '');\n token.href = href;\n token.content = label;\n }\n\n state.pos = pos;\n state.posMax = max;\n\n return true;\n};\n\nconst renderMentions = () => (tokens, idx) => {\n return `<span class=\"prosemirror-mention-node\">${tokens[idx].content}</span>`;\n};\n\nexport default function mentionPlugin(md) {\n md.renderer.rules.mention = renderMentions(md);\n md.inline.ruler.before('link', 'mention', buildMentionTokens(md));\n}\n","import mila from 'markdown-it-link-attributes';\nimport mentionPlugin from './markdownIt/link';\nconst md = require('markdown-it')({\n html: false,\n xhtmlOut: true,\n breaks: true,\n langPrefix: 'language-',\n linkify: true,\n typographer: true,\n quotes: '\\u201c\\u201d\\u2018\\u2019',\n maxNesting: 20,\n})\n .use(mentionPlugin)\n .use(mila, {\n attrs: {\n class: 'link',\n rel: 'noreferrer noopener nofollow',\n target: '_blank',\n },\n });\n\nconst TWITTER_USERNAME_REGEX = /(^|[^@\\w])@(\\w{1,15})\\b/g;\nconst TWITTER_USERNAME_REPLACEMENT = '$1[@$2](http://twitter.com/$2)';\nconst TWITTER_HASH_REGEX = /(^|\\s)#(\\w+)/g;\nconst TWITTER_HASH_REPLACEMENT = '$1[#$2](https://twitter.com/hashtag/$2)';\n\nclass MessageFormatter {\n constructor(message, isATweet = false, isAPrivateNote = false) {\n this.message = message || '';\n this.isAPrivateNote = isAPrivateNote;\n this.isATweet = isATweet;\n }\n\n formatMessage() {\n let updatedMessage = this.message;\n if (this.isATweet && !this.isAPrivateNote) {\n updatedMessage = updatedMessage.replace(\n TWITTER_USERNAME_REGEX,\n TWITTER_USERNAME_REPLACEMENT\n );\n updatedMessage = updatedMessage.replace(\n TWITTER_HASH_REGEX,\n TWITTER_HASH_REPLACEMENT\n );\n }\n return md.render(updatedMessage);\n }\n\n get formattedMessage() {\n return this.formatMessage();\n }\n\n get plainText() {\n const strippedOutHtml = new DOMParser().parseFromString(\n this.formattedMessage,\n 'text/html'\n );\n return strippedOutHtml.body.textContent || '';\n }\n}\n\nexport default MessageFormatter;\n","import MessageFormatter from '../helpers/MessageFormatter';\n\nexport default {\n methods: {\n formatMessage(message, isATweet, isAPrivateNote, isAgentView) {\n const messageFormatter = new MessageFormatter(\n message,\n isATweet,\n isAPrivateNote,\n isAgentView\n );\n return messageFormatter.formattedMessage;\n },\n getPlainText(message, isATweet) {\n const messageFormatter = new MessageFormatter(message, isATweet);\n return messageFormatter.plainText;\n },\n truncateMessage(description = '') {\n if (description.length < 100) {\n return description;\n }\n\n return `${description.slice(0, 97)}...`;\n },\n },\n};\n","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Avatar.vue?vue&type=style&index=0&id=fce88f76&lang=scss&scoped=true&\"","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Thumbnail.vue?vue&type=style&index=0&id=4240ad79&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"media/dashboard/assets/images/chatwoot_bot-905112376e6493b37e2cecea8f9dc50c.png\";","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatInputWrap.vue?vue&type=style&index=0&id=e0de16d4&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatFooter.vue?vue&type=style&index=0&id=39ce78de&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserMessageBubble.vue?vue&type=style&index=0&id=a9cb5958&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageBubble.vue?vue&type=style&index=0&id=674f83bd&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileBubble.vue?vue&type=style&index=0&id=3fc1205c&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CardButton.vue?vue&type=style&index=0&id=4071c27e&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatCard.vue?vue&type=style&index=0&id=89f66a76&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatForm.vue?vue&type=style&index=0&id=28b9fbb6&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOption.vue?vue&type=style&index=0&id=dddfa04c&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOptions.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOptions.vue?vue&type=style&index=1&id=d07851ae&scoped=true&lang=scss&\"","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Article.vue?vue&type=style&index=0&id=feefd62e&lang=scss&scoped=true&\"","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EmailInput.vue?vue&type=style&index=0&id=7b523820&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomerSatisfaction.vue?vue&type=style&index=0&id=1f91202a&lang=scss&scoped=true&\"","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IntegrationCard.vue?vue&type=style&index=0&id=45604e1d&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatMessage.vue?vue&type=style&index=0&id=b5e457ba&scoped=true&lang=scss&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatMessage.vue?vue&type=style&index=1&lang=scss&\"","module.exports = __webpack_public_path__ + \"media/widget/assets/images/typing-6027d21b24f45e3377a729a55158f948.gif\";","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentTypingBubble.vue?vue&type=style&index=0&id=1877ef14&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DateSeparator.vue?vue&type=style&index=0&id=0619d2c7&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/dist/cjs.js??ref--3-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--3-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--3-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConversationWrap.vue?vue&type=style&index=0&id=6158bb20&scoped=true&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"flex flex-col flex-1 overflow-hidden\"},[_c('div',{staticClass:\"flex flex-1 overflow-auto\"},[_c('conversation-wrap',{attrs:{\"grouped-messages\":_vm.groupedMessages}})],1),_vm._v(\" \"),_c('div',{staticClass:\"px-5\"},[_c('chat-footer')],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <file-upload\n ref=\"upload\"\n :size=\"4096 * 2048\"\n :accept=\"allowedFileTypes\"\n :data=\"{\n direct_upload_url: '/api/v1/widget/direct_uploads',\n direct_upload: true,\n }\"\n @input-file=\"onFileUpload\"\n >\n <button class=\"icon-button flex items-center justify-center\">\n <fluent-icon v-if=\"!isUploading.image\" icon=\"attach\" />\n <spinner v-if=\"isUploading\" size=\"small\" />\n </button>\n </file-upload>\n</template>\n\n<script>\nimport FileUpload from 'vue-upload-component';\nimport Spinner from 'shared/components/Spinner.vue';\nimport { checkFileSizeLimit } from 'shared/helpers/FileHelper';\nimport {\n MAXIMUM_FILE_UPLOAD_SIZE,\n ALLOWED_FILE_TYPES,\n} from 'shared/constants/messages';\nimport { BUS_EVENTS } from 'shared/constants/busEvents';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport { DirectUpload } from 'activestorage';\nimport { mapGetters } from 'vuex';\n\nexport default {\n components: { FluentIcon, FileUpload, Spinner },\n props: {\n onAttach: {\n type: Function,\n default: () => {},\n },\n },\n data() {\n return { isUploading: false };\n },\n computed: {\n ...mapGetters({ globalConfig: 'globalConfig/get' }),\n fileUploadSizeLimit() {\n return MAXIMUM_FILE_UPLOAD_SIZE;\n },\n allowedFileTypes() {\n return ALLOWED_FILE_TYPES;\n },\n },\n mounted() {\n document.addEventListener('paste', this.handleClipboardPaste);\n },\n destroyed() {\n document.removeEventListener('paste', this.handleClipboardPaste);\n },\n methods: {\n handleClipboardPaste(e) {\n const items = (e.clipboardData || e.originalEvent.clipboardData).items;\n items.forEach(item => {\n if (item.kind === 'file') {\n e.preventDefault();\n const file = item.getAsFile();\n this.$refs.upload.add(file);\n }\n });\n },\n getFileType(fileType) {\n return fileType.includes('image') ? 'image' : 'file';\n },\n async onFileUpload(file) {\n if (this.globalConfig.directUploadsEnabled) {\n await this.onDirectFileUpload(file);\n } else {\n await this.onIndirectFileUpload(file);\n }\n },\n async onDirectFileUpload(file) {\n if (!file) {\n return;\n }\n this.isUploading = true;\n try {\n if (checkFileSizeLimit(file, MAXIMUM_FILE_UPLOAD_SIZE)) {\n const { websiteToken } = window.chatwootWebChannel;\n const upload = new DirectUpload(\n file.file,\n `/api/v1/widget/direct_uploads?website_token=${websiteToken}`,\n {\n directUploadWillCreateBlobWithXHR: xhr => {\n xhr.setRequestHeader('X-Auth-Token', window.authToken);\n },\n }\n );\n\n upload.create((error, blob) => {\n if (error) {\n window.bus.$emit(BUS_EVENTS.SHOW_ALERT, {\n message: error,\n });\n } else {\n this.onAttach({\n file: blob.signed_id,\n ...this.getLocalFileAttributes(file),\n });\n }\n });\n } else {\n window.bus.$emit(BUS_EVENTS.SHOW_ALERT, {\n message: this.$t('FILE_SIZE_LIMIT', {\n MAXIMUM_FILE_UPLOAD_SIZE: this.fileUploadSizeLimit,\n }),\n });\n }\n } catch (error) {\n // Error\n }\n this.isUploading = false;\n },\n async onIndirectFileUpload(file) {\n if (!file) {\n return;\n }\n this.isUploading = true;\n try {\n if (checkFileSizeLimit(file, MAXIMUM_FILE_UPLOAD_SIZE)) {\n await this.onAttach({\n file: file.file,\n ...this.getLocalFileAttributes(file),\n });\n } else {\n window.bus.$emit(BUS_EVENTS.SHOW_ALERT, {\n message: this.$t('FILE_SIZE_LIMIT', {\n MAXIMUM_FILE_UPLOAD_SIZE: this.fileUploadSizeLimit,\n }),\n });\n }\n } catch (error) {\n // Error\n }\n this.isUploading = false;\n },\n getLocalFileAttributes(file) {\n return {\n thumbUrl: window.URL.createObjectURL(file.file),\n fileType: this.getFileType(file.type),\n };\n },\n },\n};\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatAttachment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatAttachment.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatAttachment.vue?vue&type=template&id=7f84e220&\"\nimport script from \"./ChatAttachment.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatAttachment.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('file-upload',{ref:\"upload\",attrs:{\"size\":4096 * 2048,\"accept\":_vm.allowedFileTypes,\"data\":{\n direct_upload_url: '/api/v1/widget/direct_uploads',\n direct_upload: true,\n }},on:{\"input-file\":_vm.onFileUpload}},[_c('button',{staticClass:\"icon-button flex items-center justify-center\"},[(!_vm.isUploading.image)?_c('fluent-icon',{attrs:{\"icon\":\"attach\"}}):_vm._e(),_vm._v(\" \"),(_vm.isUploading)?_c('spinner',{attrs:{\"size\":\"small\"}}):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatSendButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatSendButton.vue?vue&type=script&lang=js&\"","<template>\n <button\n type=\"submit\"\n :disabled=\"disabled\"\n class=\"icon-button flex items-center justify-center ml-1\"\n @click=\"onClick\"\n >\n <fluent-icon v-if=\"!loading\" icon=\"send\" :style=\"`color: ${color}`\" />\n <spinner v-else size=\"small\" />\n </button>\n</template>\n\n<script>\nimport Spinner from 'shared/components/Spinner.vue';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\n\nexport default {\n components: {\n FluentIcon,\n Spinner,\n },\n props: {\n loading: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n onClick: {\n type: Function,\n default: () => {},\n },\n color: {\n type: String,\n default: '#6e6f73',\n },\n },\n};\n</script>\n","import { render, staticRenderFns } from \"./ChatSendButton.vue?vue&type=template&id=34835494&\"\nimport script from \"./ChatSendButton.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatSendButton.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"icon-button flex items-center justify-center ml-1\",attrs:{\"type\":\"submit\",\"disabled\":_vm.disabled},on:{\"click\":_vm.onClick}},[(!_vm.loading)?_c('fluent-icon',{style:((\"color: \" + _vm.color)),attrs:{\"icon\":\"send\"}}):_c('spinner',{attrs:{\"size\":\"small\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n class=\"chat-message--input is-focused\"\n :class=\"$dm('bg-white ', 'dark:bg-slate-600')\"\n @keydown.esc=\"hideEmojiPicker\"\n >\n <resizable-text-area\n id=\"chat-input\"\n ref=\"chatInput\"\n v-model=\"userInput\"\n dir=\"auto\"\n :aria-label=\"$t('CHAT_PLACEHOLDER')\"\n :placeholder=\"$t('CHAT_PLACEHOLDER')\"\n class=\"form-input user-message-input is-focused\"\n :class=\"inputColor\"\n @typing-off=\"onTypingOff\"\n @typing-on=\"onTypingOn\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n <div class=\"button-wrap\">\n <chat-attachment-button\n v-if=\"showAttachment\"\n :class=\"$dm('text-black-900', 'dark:text-slate-100')\"\n :on-attach=\"onSendAttachment\"\n />\n <button\n v-if=\"hasEmojiPickerEnabled\"\n class=\"icon-button flex justify-center items-center\"\n aria-label=\"Emoji picker\"\n @click=\"toggleEmojiPicker\"\n >\n <fluent-icon icon=\"emoji\" :class=\"emojiIconColor\" />\n </button>\n <emoji-input\n v-if=\"showEmojiPicker\"\n v-on-clickaway=\"hideEmojiPicker\"\n :on-click=\"emojiOnClick\"\n @keydown.esc=\"hideEmojiPicker\"\n />\n <chat-send-button\n v-if=\"showSendButton\"\n :on-click=\"handleButtonClick\"\n :color=\"widgetColor\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex';\nimport { mixin as clickaway } from 'vue-clickaway';\n\nimport ChatAttachmentButton from 'widget/components/ChatAttachment.vue';\nimport ChatSendButton from 'widget/components/ChatSendButton.vue';\nimport configMixin from '../mixins/configMixin';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport ResizableTextArea from 'shared/components/ResizableTextArea';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nconst EmojiInput = () => import('shared/components/emoji/EmojiInput');\n\nexport default {\n name: 'ChatInputWrap',\n components: {\n ChatAttachmentButton,\n ChatSendButton,\n EmojiInput,\n FluentIcon,\n ResizableTextArea,\n },\n mixins: [clickaway, configMixin, darkModeMixin],\n props: {\n onSendMessage: {\n type: Function,\n default: () => {},\n },\n onSendAttachment: {\n type: Function,\n default: () => {},\n },\n },\n\n data() {\n return {\n userInput: '',\n showEmojiPicker: false,\n isFocused: false,\n };\n },\n\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n isWidgetOpen: 'appConfig/getIsWidgetOpen',\n }),\n showAttachment() {\n return this.hasAttachmentsEnabled && this.userInput.length === 0;\n },\n showSendButton() {\n return this.userInput.length > 0;\n },\n inputColor() {\n return `${this.$dm('bg-white', 'dark:bg-slate-600')}\n ${this.$dm('text-black-900', 'dark:text-slate-50')}`;\n },\n emojiIconColor() {\n return this.showEmojiPicker\n ? `text-woot-500 ${this.$dm('text-black-900', 'dark:text-slate-100')}`\n : `${this.$dm('text-black-900', 'dark:text-slate-100')}`;\n },\n },\n watch: {\n isWidgetOpen(isWidgetOpen) {\n if (isWidgetOpen) {\n this.focusInput();\n }\n },\n },\n destroyed() {\n document.removeEventListener('keypress', this.handleEnterKeyPress);\n },\n mounted() {\n document.addEventListener('keypress', this.handleEnterKeyPress);\n if (this.isWidgetOpen) {\n this.focusInput();\n }\n },\n\n methods: {\n onBlur() {\n this.isFocused = false;\n },\n onFocus() {\n this.isFocused = true;\n },\n handleButtonClick() {\n if (this.userInput && this.userInput.trim()) {\n this.onSendMessage(this.userInput);\n }\n this.userInput = '';\n this.focusInput();\n },\n handleEnterKeyPress(e) {\n if (e.keyCode === 13 && !e.shiftKey) {\n e.preventDefault();\n this.handleButtonClick();\n }\n },\n toggleEmojiPicker() {\n this.showEmojiPicker = !this.showEmojiPicker;\n },\n hideEmojiPicker(e) {\n if (this.showEmojiPicker) {\n e.stopPropagation();\n this.toggleEmojiPicker();\n }\n },\n emojiOnClick(emoji) {\n this.userInput = `${this.userInput}${emoji} `;\n },\n onTypingOff() {\n this.toggleTyping('off');\n },\n onTypingOn() {\n this.toggleTyping('on');\n },\n toggleTyping(typingStatus) {\n this.$store.dispatch('conversation/toggleUserTyping', { typingStatus });\n },\n focusInput() {\n this.$refs.chatInput.focus();\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n@import '~widget/assets/scss/mixins.scss';\n\n.chat-message--input {\n align-items: center;\n display: flex;\n padding: 0 $space-small 0 $space-slab;\n border-radius: 7px;\n\n &.is-focused {\n box-shadow: 0 0 0 1px $color-woot, 0 0 2px 3px $color-primary-light;\n }\n}\n\n.emoji-dialog {\n right: 0;\n top: -302px;\n max-width: 100%;\n\n &::before {\n right: $space-one;\n }\n}\n\n.button-wrap {\n display: flex;\n align-items: center;\n padding-left: $space-small;\n}\n\n.user-message-input {\n border: 0;\n height: $space-large;\n min-height: $space-large;\n max-height: 2.4 * $space-mega;\n resize: none;\n padding: $space-smaller 0;\n margin-top: $space-small;\n margin-bottom: $space-small;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatInputWrap.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatInputWrap.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatInputWrap.vue?vue&type=template&id=e0de16d4&scoped=true&\"\nimport script from \"./ChatInputWrap.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatInputWrap.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatInputWrap.vue?vue&type=style&index=0&id=e0de16d4&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e0de16d4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"chat-message--input is-focused\",class:_vm.$dm('bg-white ', 'dark:bg-slate-600'),on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.hideEmojiPicker($event)}}},[_c('resizable-text-area',{ref:\"chatInput\",staticClass:\"form-input user-message-input is-focused\",class:_vm.inputColor,attrs:{\"id\":\"chat-input\",\"dir\":\"auto\",\"aria-label\":_vm.$t('CHAT_PLACEHOLDER'),\"placeholder\":_vm.$t('CHAT_PLACEHOLDER')},on:{\"typing-off\":_vm.onTypingOff,\"typing-on\":_vm.onTypingOn,\"focus\":_vm.onFocus,\"blur\":_vm.onBlur},model:{value:(_vm.userInput),callback:function ($$v) {_vm.userInput=$$v},expression:\"userInput\"}}),_vm._v(\" \"),_c('div',{staticClass:\"button-wrap\"},[(_vm.showAttachment)?_c('chat-attachment-button',{class:_vm.$dm('text-black-900', 'dark:text-slate-100'),attrs:{\"on-attach\":_vm.onSendAttachment}}):_vm._e(),_vm._v(\" \"),(_vm.hasEmojiPickerEnabled)?_c('button',{staticClass:\"icon-button flex justify-center items-center\",attrs:{\"aria-label\":\"Emoji picker\"},on:{\"click\":_vm.toggleEmojiPicker}},[_c('fluent-icon',{class:_vm.emojiIconColor,attrs:{\"icon\":\"emoji\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.showEmojiPicker)?_c('emoji-input',{directives:[{name:\"on-clickaway\",rawName:\"v-on-clickaway\",value:(_vm.hideEmojiPicker),expression:\"hideEmojiPicker\"}],attrs:{\"on-click\":_vm.emojiOnClick},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.hideEmojiPicker($event)}}}):_vm._e(),_vm._v(\" \"),(_vm.showSendButton)?_c('chat-send-button',{attrs:{\"on-click\":_vm.handleButtonClick,\"color\":_vm.widgetColor}}):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <footer\n v-if=\"!hideReplyBox\"\n class=\"shadow-sm bg-white mb-1 z-50 relative\"\n :class=\"{ 'rounded-lg': !isWidgetStyleFlat }\"\n >\n <chat-input-wrap\n :on-send-message=\"handleSendMessage\"\n :on-send-attachment=\"handleSendAttachment\"\n />\n </footer>\n <div v-else>\n <custom-button\n class=\"font-medium\"\n block\n :bg-color=\"widgetColor\"\n :text-color=\"textColor\"\n @click=\"startNewConversation\"\n >\n {{ $t('START_NEW_CONVERSATION') }}\n </custom-button>\n <custom-button\n v-if=\"showEmailTranscriptButton\"\n type=\"clear\"\n class=\"font-normal\"\n @click=\"sendTranscript\"\n >\n {{ $t('EMAIL_TRANSCRIPT.BUTTON_TEXT') }}\n </custom-button>\n </div>\n</template>\n\n<script>\nimport { mapActions, mapGetters } from 'vuex';\nimport { getContrastingTextColor } from '@chatwoot/utils';\nimport CustomButton from 'shared/components/Button';\nimport ChatInputWrap from 'widget/components/ChatInputWrap.vue';\nimport { BUS_EVENTS } from 'shared/constants/busEvents';\nimport { sendEmailTranscript } from 'widget/api/conversation';\nimport routerMixin from 'widget/mixins/routerMixin';\nexport default {\n components: {\n ChatInputWrap,\n CustomButton,\n },\n mixins: [routerMixin],\n props: {\n msg: {\n type: String,\n default: '',\n },\n },\n computed: {\n ...mapGetters({\n conversationAttributes: 'conversationAttributes/getConversationParams',\n widgetColor: 'appConfig/getWidgetColor',\n conversationSize: 'conversation/getConversationSize',\n currentUser: 'contacts/getCurrentUser',\n isWidgetStyleFlat: 'appConfig/isWidgetStyleFlat',\n }),\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n hideReplyBox() {\n const { allowMessagesAfterResolved } = window.chatwootWebChannel;\n const { status } = this.conversationAttributes;\n return !allowMessagesAfterResolved && status === 'resolved';\n },\n showEmailTranscriptButton() {\n return this.currentUser && this.currentUser.email;\n },\n },\n methods: {\n ...mapActions('conversation', [\n 'sendMessage',\n 'sendAttachment',\n 'clearConversations',\n ]),\n ...mapActions('conversationAttributes', [\n 'getAttributes',\n 'clearConversationAttributes',\n ]),\n async handleSendMessage(content) {\n await this.sendMessage({\n content,\n });\n // Update conversation attributes on new conversation\n if (this.conversationSize === 0) {\n this.getAttributes();\n }\n },\n handleSendAttachment(attachment) {\n this.sendAttachment({ attachment });\n },\n startNewConversation() {\n this.clearConversations();\n this.clearConversationAttributes();\n\n // To create a new conversation, we are redirecting\n // the user to pre-chat with contact fields disabled\n // Pass disableContactFields params to the route\n // This would disable the contact fields in the pre-chat form\n this.replaceRoute('prechat-form', { disableContactFields: true });\n },\n async sendTranscript() {\n const { email } = this.currentUser;\n if (email) {\n try {\n await sendEmailTranscript({\n email,\n });\n window.bus.$emit(BUS_EVENTS.SHOW_ALERT, {\n message: this.$t('EMAIL_TRANSCRIPT.SEND_EMAIL_SUCCESS'),\n type: 'success',\n });\n } catch (error) {\n window.bus.$emit(BUS_EVENTS.SHOW_ALERT, {\n message: this.$t('EMAIL_TRANSCRIPT.SEND_EMAIL_ERROR'),\n });\n }\n }\n },\n },\n};\n</script>\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n\n.branding {\n align-items: center;\n color: $color-body;\n display: flex;\n font-size: $font-size-default;\n justify-content: center;\n padding: $space-one;\n text-align: center;\n text-decoration: none;\n\n img {\n margin-right: $space-small;\n max-width: $space-two;\n }\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatFooter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatFooter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatFooter.vue?vue&type=template&id=39ce78de&scoped=true&\"\nimport script from \"./ChatFooter.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatFooter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatFooter.vue?vue&type=style&index=0&id=39ce78de&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"39ce78de\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.hideReplyBox)?_c('footer',{staticClass:\"shadow-sm bg-white mb-1 z-50 relative\",class:{ 'rounded-lg': !_vm.isWidgetStyleFlat }},[_c('chat-input-wrap',{attrs:{\"on-send-message\":_vm.handleSendMessage,\"on-send-attachment\":_vm.handleSendAttachment}})],1):_c('div',[_c('custom-button',{staticClass:\"font-medium\",attrs:{\"block\":\"\",\"bg-color\":_vm.widgetColor,\"text-color\":_vm.textColor},on:{\"click\":_vm.startNewConversation}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('START_NEW_CONVERSATION'))+\"\\n \")]),_vm._v(\" \"),(_vm.showEmailTranscriptButton)?_c('custom-button',{staticClass:\"font-normal\",attrs:{\"type\":\"clear\"},on:{\"click\":_vm.sendTranscript}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('EMAIL_TRANSCRIPT.BUTTON_TEXT'))+\"\\n \")]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserMessageBubble.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserMessageBubble.vue?vue&type=script&lang=js&\"","<template>\n <bdi\n v-dompurify-html=\"formatMessage(message, false)\"\n class=\"chat-bubble user\"\n :style=\"{ background: widgetColor, color: textColor }\"\n dir=\"auto\"\n />\n</template>\n\n<script>\nimport messageFormatterMixin from 'shared/mixins/messageFormatterMixin';\nimport { getContrastingTextColor } from '@chatwoot/utils';\n\nexport default {\n name: 'UserMessageBubble',\n mixins: [messageFormatterMixin],\n props: {\n message: {\n type: String,\n default: '',\n },\n status: {\n type: String,\n default: '',\n },\n widgetColor: {\n type: String,\n default: '',\n },\n },\n computed: {\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.chat-bubble.user::v-deep {\n p code {\n background-color: var(--w-600);\n color: var(--white);\n }\n\n pre {\n background-color: var(--w-800);\n border-color: var(--w-700);\n color: var(--white);\n\n code {\n background-color: transparent;\n color: var(--white);\n }\n }\n\n blockquote {\n border-left: $space-micro solid var(--w-400);\n background: var(--s-25);\n border-color: var(--s-200);\n\n p {\n color: var(--s-800);\n }\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./UserMessageBubble.vue?vue&type=template&id=a9cb5958&scoped=true&\"\nimport script from \"./UserMessageBubble.vue?vue&type=script&lang=js&\"\nexport * from \"./UserMessageBubble.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserMessageBubble.vue?vue&type=style&index=0&id=a9cb5958&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a9cb5958\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('bdi',{directives:[{name:\"dompurify-html\",rawName:\"v-dompurify-html\",value:(_vm.formatMessage(_vm.message, false)),expression:\"formatMessage(message, false)\"}],staticClass:\"chat-bubble user\",style:({ background: _vm.widgetColor, color: _vm.textColor }),attrs:{\"dir\":\"auto\"}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageBubble.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageBubble.vue?vue&type=script&lang=js&\"","<template>\n <a\n :href=\"url\"\n target=\"_blank\"\n rel=\"noreferrer noopener nofollow\"\n class=\"image\"\n >\n <div class=\"wrap\">\n <img\n :src=\"thumb\"\n alt=\"Picture message\"\n @click=\"onClick\"\n @error=\"onImgError\"\n />\n <span class=\"time\">{{ readableTime }}</span>\n </div>\n </a>\n</template>\n\n<script>\nexport default {\n props: {\n url: { type: String, default: '' },\n thumb: { type: String, default: '' },\n readableTime: { type: String, default: '' },\n },\n methods: {\n onImgError() {\n this.$emit('error');\n },\n onClick() {\n this.$emit('click');\n },\n },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.image {\n display: block;\n\n .wrap {\n position: relative;\n display: flex;\n max-width: 100%;\n\n &::before {\n background-image: linear-gradient(\n -180deg,\n transparent 3%,\n $color-heading 130%\n );\n bottom: 0;\n content: '';\n height: 20%;\n left: 0;\n opacity: 0.8;\n position: absolute;\n width: 100%;\n }\n }\n\n img {\n width: 100%;\n max-width: 250px;\n }\n\n .time {\n font-size: $font-size-small;\n bottom: $space-smaller;\n color: $color-white;\n position: absolute;\n right: $space-slab;\n white-space: nowrap;\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./ImageBubble.vue?vue&type=template&id=674f83bd&scoped=true&\"\nimport script from \"./ImageBubble.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageBubble.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ImageBubble.vue?vue&type=style&index=0&id=674f83bd&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"674f83bd\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"image\",attrs:{\"href\":_vm.url,\"target\":\"_blank\",\"rel\":\"noreferrer noopener nofollow\"}},[_c('div',{staticClass:\"wrap\"},[_c('img',{attrs:{\"src\":_vm.thumb,\"alt\":\"Picture message\"},on:{\"click\":_vm.onClick,\"error\":_vm.onImgError}}),_vm._v(\" \"),_c('span',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.readableTime))])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileBubble.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FileBubble.vue?vue&type=script&lang=js&\"","<template>\n <div class=\"file flex flex-row items-center p-3 cursor-pointer\">\n <div class=\"icon-wrap\" :style=\"{ color: textColor }\">\n <fluent-icon icon=\"document\" size=\"28\" />\n </div>\n <div class=\"meta\">\n <div class=\"title\" :class=\"titleColor\" :style=\"{ color: textColor }\">\n {{ title }}\n </div>\n <div class=\"link-wrap mb-1\">\n <a\n class=\"download\"\n rel=\"noreferrer noopener nofollow\"\n target=\"_blank\"\n :style=\"{ color: textColor }\"\n :href=\"url\"\n >\n {{ $t('COMPONENTS.FILE_BUBBLE.DOWNLOAD') }}\n </a>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\nimport { getContrastingTextColor } from '@chatwoot/utils';\n\nexport default {\n components: {\n FluentIcon,\n },\n mixins: [darkModeMixin],\n props: {\n url: {\n type: String,\n default: '',\n },\n isInProgress: {\n type: Boolean,\n default: false,\n },\n widgetColor: {\n type: String,\n default: '',\n },\n isUserBubble: {\n type: Boolean,\n default: false,\n },\n },\n computed: {\n title() {\n return this.isInProgress\n ? this.$t('COMPONENTS.FILE_BUBBLE.UPLOADING')\n : decodeURI(this.fileName);\n },\n fileName() {\n return this.url.substring(this.url.lastIndexOf('/') + 1);\n },\n contrastingTextColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n textColor() {\n return this.isUserBubble && this.widgetColor\n ? this.contrastingTextColor\n : '';\n },\n titleColor() {\n return !this.isUserBubble\n ? this.$dm('text-black-900', 'dark:text-slate-50')\n : '';\n },\n },\n methods: {\n openLink() {\n const win = window.open(this.url, '_blank');\n win.focus();\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.file {\n .icon-wrap {\n font-size: $font-size-mega;\n color: $color-woot;\n line-height: 1;\n margin-left: $space-smaller;\n margin-right: $space-small;\n }\n\n .title {\n font-weight: $font-weight-medium;\n font-size: $font-size-default;\n margin: 0;\n }\n\n .download {\n color: $color-woot;\n font-weight: $font-weight-medium;\n padding: 0;\n margin: 0;\n font-size: $font-size-small;\n text-decoration: none;\n }\n\n .link-wrap {\n line-height: 1;\n }\n .meta {\n padding-right: $space-smaller;\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./FileBubble.vue?vue&type=template&id=3fc1205c&scoped=true&\"\nimport script from \"./FileBubble.vue?vue&type=script&lang=js&\"\nexport * from \"./FileBubble.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FileBubble.vue?vue&type=style&index=0&id=3fc1205c&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3fc1205c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"file flex flex-row items-center p-3 cursor-pointer\"},[_c('div',{staticClass:\"icon-wrap\",style:({ color: _vm.textColor })},[_c('fluent-icon',{attrs:{\"icon\":\"document\",\"size\":\"28\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"meta\"},[_c('div',{staticClass:\"title\",class:_vm.titleColor,style:({ color: _vm.textColor })},[_vm._v(\"\\n \"+_vm._s(_vm.title)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"link-wrap mb-1\"},[_c('a',{staticClass:\"download\",style:({ color: _vm.textColor }),attrs:{\"rel\":\"noreferrer noopener nofollow\",\"target\":\"_blank\",\"href\":_vm.url}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('COMPONENTS.FILE_BUBBLE.DOWNLOAD'))+\"\\n \")])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export default {\n computed: {\n messageContentAttributes() {\n const { content_attributes: attribute = {} } = this.message;\n return attribute;\n },\n hasAttachments() {\n return !!(\n this.message.attachments && this.message.attachments.length > 0\n );\n },\n },\n};\n","<template>\n <div class=\"user-message-wrap\">\n <div class=\"user-message\">\n <div\n class=\"message-wrap\"\n :class=\"{ 'in-progress': isInProgress, 'is-failed': isFailed }\"\n >\n <user-message-bubble\n v-if=\"showTextBubble\"\n :message=\"message.content\"\n :status=\"message.status\"\n :widget-color=\"widgetColor\"\n />\n <div\n v-if=\"hasAttachments\"\n class=\"chat-bubble has-attachment user\"\n :style=\"{ backgroundColor: widgetColor }\"\n >\n <div v-for=\"attachment in message.attachments\" :key=\"attachment.id\">\n <image-bubble\n v-if=\"attachment.file_type === 'image' && !hasImageError\"\n :url=\"attachment.data_url\"\n :thumb=\"attachment.data_url\"\n :readable-time=\"readableTime\"\n @error=\"onImageLoadError\"\n />\n <file-bubble\n v-else\n :url=\"attachment.data_url\"\n :is-in-progress=\"isInProgress\"\n :widget-color=\"widgetColor\"\n is-user-bubble\n />\n </div>\n </div>\n <div\n v-if=\"isFailed\"\n class=\"flex justify-end align-middle px-4 py-2 text-red-700\"\n >\n <button\n v-if=\"!hasAttachments\"\n :title=\"$t('COMPONENTS.MESSAGE_BUBBLE.RETRY')\"\n class=\"inline-flex justify-center items-center ml-2\"\n @click=\"retrySendMessage\"\n >\n <fluent-icon icon=\"arrow-clockwise\" size=\"14\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport UserMessageBubble from 'widget/components/UserMessageBubble';\nimport ImageBubble from 'widget/components/ImageBubble';\nimport FluentIcon from 'shared/components/FluentIcon/Index';\nimport FileBubble from 'widget/components/FileBubble';\nimport timeMixin from 'dashboard/mixins/time';\nimport messageMixin from '../mixins/messageMixin';\nimport { mapGetters } from 'vuex';\n\nexport default {\n name: 'UserMessage',\n components: {\n UserMessageBubble,\n ImageBubble,\n FileBubble,\n FluentIcon,\n },\n mixins: [timeMixin, messageMixin],\n props: {\n message: {\n type: Object,\n default: () => {},\n },\n },\n data() {\n return {\n hasImageError: false,\n };\n },\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n }),\n\n isInProgress() {\n const { status = '' } = this.message;\n return status === 'in_progress';\n },\n showTextBubble() {\n const { message } = this;\n return !!message.content;\n },\n readableTime() {\n const { created_at: createdAt = '' } = this.message;\n return this.messageStamp(createdAt);\n },\n isFailed() {\n const { status = '' } = this.message;\n return status === 'failed';\n },\n errorMessage() {\n const { meta } = this.message;\n return meta\n ? meta.error\n : this.$t('COMPONENTS.MESSAGE_BUBBLE.ERROR_MESSAGE');\n },\n },\n watch: {\n message() {\n this.hasImageError = false;\n },\n },\n mounted() {\n this.hasImageError = false;\n },\n methods: {\n async retrySendMessage() {\n await this.$store.dispatch(\n 'conversation/sendMessageWithData',\n this.message\n );\n },\n onImageLoadError() {\n this.hasImageError = true;\n },\n },\n};\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UserMessage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UserMessage.vue?vue&type=template&id=df13bb00&\"\nimport script from \"./UserMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./UserMessage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-message-wrap\"},[_c('div',{staticClass:\"user-message\"},[_c('div',{staticClass:\"message-wrap\",class:{ 'in-progress': _vm.isInProgress, 'is-failed': _vm.isFailed }},[(_vm.showTextBubble)?_c('user-message-bubble',{attrs:{\"message\":_vm.message.content,\"status\":_vm.message.status,\"widget-color\":_vm.widgetColor}}):_vm._e(),_vm._v(\" \"),(_vm.hasAttachments)?_c('div',{staticClass:\"chat-bubble has-attachment user\",style:({ backgroundColor: _vm.widgetColor })},_vm._l((_vm.message.attachments),function(attachment){return _c('div',{key:attachment.id},[(attachment.file_type === 'image' && !_vm.hasImageError)?_c('image-bubble',{attrs:{\"url\":attachment.data_url,\"thumb\":attachment.data_url,\"readable-time\":_vm.readableTime},on:{\"error\":_vm.onImageLoadError}}):_c('file-bubble',{attrs:{\"url\":attachment.data_url,\"is-in-progress\":_vm.isInProgress,\"widget-color\":_vm.widgetColor,\"is-user-bubble\":\"\"}})],1)}),0):_vm._e(),_vm._v(\" \"),(_vm.isFailed)?_c('div',{staticClass:\"flex justify-end align-middle px-4 py-2 text-red-700\"},[(!_vm.hasAttachments)?_c('button',{staticClass:\"inline-flex justify-center items-center ml-2\",attrs:{\"title\":_vm.$t('COMPONENTS.MESSAGE_BUBBLE.RETRY')},on:{\"click\":_vm.retrySendMessage}},[_c('fluent-icon',{attrs:{\"icon\":\"arrow-clockwise\",\"size\":\"14\"}})],1):_vm._e()]):_vm._e()],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <a\n v-if=\"isLink\"\n :key=\"action.uri\"\n class=\"action-button button\"\n :href=\"action.uri\"\n :style=\"{\n background: widgetColor,\n borderColor: widgetColor,\n color: textColor,\n }\"\n target=\"_blank\"\n rel=\"noopener nofollow noreferrer\"\n >\n {{ action.text }}\n </a>\n <button\n v-else\n :key=\"action.payload\"\n class=\"action-button button\"\n :style=\"{ borderColor: widgetColor, color: widgetColor }\"\n @click=\"onClick\"\n >\n {{ action.text }}\n </button>\n</template>\n<script>\nimport { mapGetters } from 'vuex';\nimport { getContrastingTextColor } from '@chatwoot/utils';\nexport default {\n components: {},\n props: {\n action: {\n type: Object,\n default: () => {},\n },\n },\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n }),\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n isLink() {\n return this.action.type === 'link';\n },\n },\n methods: {\n onClick() {\n // Do postback here\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n@import '~dashboard/assets/scss/mixins.scss';\n\n.action-button {\n align-items: center;\n border-radius: $space-micro;\n display: flex;\n font-weight: $font-weight-medium;\n justify-content: center;\n margin-top: $space-smaller;\n max-height: 34px;\n padding: 0;\n width: 100%;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CardButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CardButton.vue?vue&type=script&lang=js&\"","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatCard.vue?vue&type=script&lang=js&\"","<template>\n <div\n class=\"card-message chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700')\"\n >\n <img class=\"media\" :src=\"mediaUrl\" />\n <div class=\"card-body\">\n <h4 class=\"title\" :class=\"$dm('text-black-900', 'dark:text-slate-50')\">\n {{ title }}\n </h4>\n <p class=\"body\" :class=\"$dm('text-black-700', 'dark:text-slate-100')\">\n {{ description }}\n </p>\n <card-button\n v-for=\"action in actions\"\n :key=\"action.id\"\n :action=\"action\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport CardButton from 'shared/components/CardButton';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n components: {\n CardButton,\n },\n mixins: [darkModeMixin],\n props: {\n title: {\n type: String,\n default: '',\n },\n description: {\n type: String,\n default: '',\n },\n mediaUrl: {\n type: String,\n default: '',\n },\n actions: {\n type: Array,\n default: () => [],\n },\n showAvatar: Boolean,\n },\n computed: {},\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n@import '~dashboard/assets/scss/mixins.scss';\n\n.card-message {\n max-width: 220px;\n padding: $space-small;\n border-radius: $space-small;\n overflow: hidden;\n\n .title {\n font-size: $font-size-default;\n font-weight: $font-weight-medium;\n margin-top: $space-smaller;\n margin-bottom: $space-smaller;\n line-height: 1.5;\n }\n\n .body {\n margin-bottom: $space-smaller;\n }\n\n .media {\n @include border-light;\n width: 100%;\n object-fit: contain;\n max-height: 150px;\n border-radius: 5px;\n }\n\n .action-button + .action-button {\n background: $color-white;\n @include thin-border($color-woot);\n color: $color-woot;\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./CardButton.vue?vue&type=template&id=4071c27e&scoped=true&\"\nimport script from \"./CardButton.vue?vue&type=script&lang=js&\"\nexport * from \"./CardButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CardButton.vue?vue&type=style&index=0&id=4071c27e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4071c27e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isLink)?_c('a',{key:_vm.action.uri,staticClass:\"action-button button\",style:({\n background: _vm.widgetColor,\n borderColor: _vm.widgetColor,\n color: _vm.textColor,\n }),attrs:{\"href\":_vm.action.uri,\"target\":\"_blank\",\"rel\":\"noopener nofollow noreferrer\"}},[_vm._v(\"\\n \"+_vm._s(_vm.action.text)+\"\\n\")]):_c('button',{key:_vm.action.payload,staticClass:\"action-button button\",style:({ borderColor: _vm.widgetColor, color: _vm.widgetColor }),on:{\"click\":_vm.onClick}},[_vm._v(\"\\n \"+_vm._s(_vm.action.text)+\"\\n\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ChatCard.vue?vue&type=template&id=89f66a76&scoped=true&\"\nimport script from \"./ChatCard.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatCard.vue?vue&type=style&index=0&id=89f66a76&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"89f66a76\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"card-message chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-700')},[_c('img',{staticClass:\"media\",attrs:{\"src\":_vm.mediaUrl}}),_vm._v(\" \"),_c('div',{staticClass:\"card-body\"},[_c('h4',{staticClass:\"title\",class:_vm.$dm('text-black-900', 'dark:text-slate-50')},[_vm._v(\"\\n \"+_vm._s(_vm.title)+\"\\n \")]),_vm._v(\" \"),_c('p',{staticClass:\"body\",class:_vm.$dm('text-black-700', 'dark:text-slate-100')},[_vm._v(\"\\n \"+_vm._s(_vm.description)+\"\\n \")]),_vm._v(\" \"),_vm._l((_vm.actions),function(action){return _c('card-button',{key:action.id,attrs:{\"action\":action}})})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n class=\"form chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700')\"\n >\n <form @submit.prevent=\"onSubmit\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"form-block\"\n :class=\"{\n 'has-submitted': hasSubmitted,\n }\"\n >\n <label :class=\"$dm('text-black-900', 'dark:text-slate-50')\">{{\n item.label\n }}</label>\n <input\n v-if=\"item.type === 'email'\"\n v-model=\"formValues[item.name]\"\n :class=\"inputColor\"\n :type=\"item.type\"\n :pattern=\"item.regex\"\n :title=\"item.title\"\n :required=\"item.required && 'required'\"\n :name=\"item.name\"\n :placeholder=\"item.placeholder\"\n :disabled=\"!!submittedValues.length\"\n />\n <input\n v-else-if=\"item.type === 'text'\"\n v-model=\"formValues[item.name]\"\n :class=\"inputColor\"\n :required=\"item.required && 'required'\"\n :pattern=\"item.pattern\"\n :title=\"item.title\"\n :type=\"item.type\"\n :name=\"item.name\"\n :placeholder=\"item.placeholder\"\n :disabled=\"!!submittedValues.length\"\n />\n <textarea\n v-else-if=\"item.type === 'text_area'\"\n v-model=\"formValues[item.name]\"\n :class=\"inputColor\"\n :required=\"item.required && 'required'\"\n :title=\"item.title\"\n :name=\"item.name\"\n :placeholder=\"item.placeholder\"\n :disabled=\"!!submittedValues.length\"\n />\n <select\n v-else-if=\"item.type === 'select'\"\n v-model=\"formValues[item.name]\"\n :class=\"inputColor\"\n :required=\"item.required && 'required'\"\n >\n <option\n v-for=\"option in item.options\"\n :key=\"option.key\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </option>\n </select>\n <span class=\"error-message\">\n {{ item.pattern_error || $t('CHAT_FORM.INVALID.FIELD') }}\n </span>\n </div>\n <button\n v-if=\"!submittedValues.length\"\n class=\"button block\"\n type=\"submit\"\n :style=\"{\n background: widgetColor,\n borderColor: widgetColor,\n color: textColor,\n }\"\n @click=\"onSubmitClick\"\n >\n {{ buttonLabel || $t('COMPONENTS.FORM_BUBBLE.SUBMIT') }}\n </button>\n </form>\n </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex';\nimport { getContrastingTextColor } from '@chatwoot/utils';\nimport darkModeMixin from 'widget/mixins/darkModeMixin';\n\nexport default {\n mixins: [darkModeMixin],\n props: {\n buttonLabel: {\n type: String,\n default: '',\n },\n items: {\n type: Array,\n default: () => [],\n },\n submittedValues: {\n type: Array,\n default: () => [],\n },\n },\n data() {\n return {\n formValues: {},\n hasSubmitted: false,\n };\n },\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n }),\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n inputColor() {\n return `${this.$dm('bg-white', 'dark:bg-slate-600')}\n ${this.$dm('text-black-900', 'dark:text-slate-50')}`;\n },\n isFormValid() {\n return this.items.reduce((acc, { name }) => {\n return !!this.formValues[name] && acc;\n }, true);\n },\n },\n mounted() {\n if (this.submittedValues.length) {\n this.updateFormValues();\n } else {\n this.setFormDefaults();\n }\n },\n methods: {\n onSubmitClick() {\n this.hasSubmitted = true;\n },\n onSubmit() {\n if (!this.isFormValid) {\n return;\n }\n this.$emit('submit', this.formValues);\n },\n buildFormObject(formObjectArray) {\n return formObjectArray.reduce((acc, obj) => {\n return {\n ...acc,\n [obj.name]: obj.value || obj.default,\n };\n }, {});\n },\n updateFormValues() {\n this.formValues = this.buildFormObject(this.submittedValues);\n },\n setFormDefaults() {\n this.formValues = this.buildFormObject(this.items);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n\n.form {\n padding: $space-normal;\n width: 80%;\n\n .form-block {\n width: 90%;\n padding-bottom: $space-small;\n }\n\n label {\n display: block;\n font-weight: $font-weight-medium;\n padding: $space-smaller 0;\n text-transform: capitalize;\n }\n\n input,\n textarea {\n border-radius: $space-smaller;\n border: 1px solid $color-border;\n display: block;\n font-family: inherit;\n font-size: $font-size-default;\n line-height: 1.5;\n padding: $space-one;\n width: 100%;\n\n &:disabled {\n background: $color-background-light;\n }\n }\n\n textarea {\n resize: none;\n }\n\n select {\n width: 110%;\n padding: $space-smaller;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border: 1px solid $color-border;\n border-radius: $space-smaller;\n font-family: inherit;\n font-size: $space-normal;\n font-weight: normal;\n line-height: 1.5;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28110, 111, 115%29'></polygon></svg>\");\n background-origin: content-box;\n background-position: right -1.6rem center;\n background-repeat: no-repeat;\n background-size: 9px 6px;\n padding-right: 2.4rem;\n }\n\n .button {\n font-size: $font-size-default;\n }\n\n .error-message {\n display: none;\n margin-top: $space-smaller;\n color: $color-error;\n }\n\n .has-submitted {\n input:invalid {\n border: 1px solid $color-error;\n }\n\n input:invalid + .error-message {\n display: block;\n }\n\n textarea:invalid {\n border: 1px solid $color-error;\n }\n\n textarea:invalid + .error-message {\n display: block;\n }\n }\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatForm.vue?vue&type=template&id=28b9fbb6&scoped=true&\"\nimport script from \"./ChatForm.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatForm.vue?vue&type=style&index=0&id=28b9fbb6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"28b9fbb6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"form chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-700')},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_vm._l((_vm.items),function(item){return _c('div',{key:item.key,staticClass:\"form-block\",class:{\n 'has-submitted': _vm.hasSubmitted,\n }},[_c('label',{class:_vm.$dm('text-black-900', 'dark:text-slate-50')},[_vm._v(_vm._s(item.label))]),_vm._v(\" \"),((item.type)==='checkbox'&&(item.type === 'email'))?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"pattern\":item.regex,\"title\":item.title,\"required\":item.required && 'required',\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.formValues[item.name])?_vm._i(_vm.formValues[item.name],null)>-1:(_vm.formValues[item.name])},on:{\"change\":function($event){var $$a=_vm.formValues[item.name],$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.formValues, item.name, $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.formValues, item.name, $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.formValues, item.name, $$c)}}}}):((item.type)==='radio'&&(item.type === 'email'))?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"pattern\":item.regex,\"title\":item.title,\"required\":item.required && 'required',\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.formValues[item.name],null)},on:{\"change\":function($event){return _vm.$set(_vm.formValues, item.name, null)}}}):(item.type === 'email')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"pattern\":item.regex,\"title\":item.title,\"required\":item.required && 'required',\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":item.type},domProps:{\"value\":(_vm.formValues[item.name])},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.formValues, item.name, $event.target.value)}}}):(item.type === 'text')?((item.type)==='checkbox')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"required\":item.required && 'required',\"pattern\":item.pattern,\"title\":item.title,\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.formValues[item.name])?_vm._i(_vm.formValues[item.name],null)>-1:(_vm.formValues[item.name])},on:{\"change\":function($event){var $$a=_vm.formValues[item.name],$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.formValues, item.name, $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.formValues, item.name, $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.formValues, item.name, $$c)}}}}):((item.type)==='radio')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"required\":item.required && 'required',\"pattern\":item.pattern,\"title\":item.title,\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.formValues[item.name],null)},on:{\"change\":function($event){return _vm.$set(_vm.formValues, item.name, null)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"required\":item.required && 'required',\"pattern\":item.pattern,\"title\":item.title,\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length,\"type\":item.type},domProps:{\"value\":(_vm.formValues[item.name])},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.formValues, item.name, $event.target.value)}}}):(item.type === 'text_area')?_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"required\":item.required && 'required',\"title\":item.title,\"name\":item.name,\"placeholder\":item.placeholder,\"disabled\":!!_vm.submittedValues.length},domProps:{\"value\":(_vm.formValues[item.name])},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.formValues, item.name, $event.target.value)}}}):(item.type === 'select')?_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.formValues[item.name]),expression:\"formValues[item.name]\"}],class:_vm.inputColor,attrs:{\"required\":item.required && 'required'},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.formValues, item.name, $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((item.options),function(option){return _c('option',{key:option.key,domProps:{\"value\":option.value}},[_vm._v(\"\\n \"+_vm._s(option.label)+\"\\n \")])}),0):_vm._e(),_vm._v(\" \"),_c('span',{staticClass:\"error-message\"},[_vm._v(\"\\n \"+_vm._s(item.pattern_error || _vm.$t('CHAT_FORM.INVALID.FIELD'))+\"\\n \")])])}),_vm._v(\" \"),(!_vm.submittedValues.length)?_c('button',{staticClass:\"button block\",style:({\n background: _vm.widgetColor,\n borderColor: _vm.widgetColor,\n color: _vm.textColor,\n }),attrs:{\"type\":\"submit\"},on:{\"click\":_vm.onSubmitClick}},[_vm._v(\"\\n \"+_vm._s(_vm.buttonLabel || _vm.$t('COMPONENTS.FORM_BUBBLE.SUBMIT'))+\"\\n \")]):_vm._e()],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <li\n class=\"option\"\n :class=\"{ 'is-selected': isSelected }\"\n :style=\"{ borderColor: widgetColor }\"\n >\n <button class=\"option-button button\" @click=\"onClick\">\n <span :style=\"{ color: widgetColor }\">{{ action.title }}</span>\n </button>\n </li>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex';\n\nexport default {\n components: {},\n props: {\n action: {\n type: Object,\n default: () => {},\n },\n isSelected: {\n type: Boolean,\n default: false,\n },\n },\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n }),\n },\n methods: {\n onClick() {\n this.$emit('click', this.action);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n\n.option {\n border-radius: $space-jumbo;\n border: 1px solid $color-woot;\n float: left;\n margin: $space-smaller;\n max-width: 100%;\n\n .option-button {\n background: transparent;\n border-radius: $space-large;\n border: 0;\n cursor: pointer;\n height: auto;\n line-height: 1.5;\n min-height: $space-two * 2;\n text-align: left;\n white-space: normal;\n\n span {\n display: inline-block;\n vertical-align: middle;\n }\n\n > .icon {\n margin-right: $space-smaller;\n font-size: $font-size-medium;\n }\n }\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOption.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOption.vue?vue&type=script&lang=js&\"","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOptions.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatOptions.vue?vue&type=script&lang=js&\"","<template>\n <div\n class=\"options-message chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700')\"\n >\n <div class=\"card-body\">\n <h4 class=\"title\" :class=\"$dm('text-black-900', 'dark:text-slate-50')\">\n {{ title }}\n </h4>\n <ul\n v-if=\"!hideFields\"\n class=\"options\"\n :class=\"{ 'has-selected': !!selected }\"\n >\n <chat-option\n v-for=\"option in options\"\n :key=\"option.id\"\n :action=\"option\"\n :is-selected=\"isSelected(option)\"\n @click=\"onClick\"\n />\n </ul>\n </div>\n </div>\n</template>\n\n<script>\nimport ChatOption from 'shared/components/ChatOption';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n components: {\n ChatOption,\n },\n mixins: [darkModeMixin],\n props: {\n title: {\n type: String,\n default: '',\n },\n options: {\n type: Array,\n default: () => [],\n },\n selected: {\n type: String,\n default: '',\n },\n hideFields: {\n type: Boolean,\n default: false,\n },\n },\n methods: {\n isSelected(option) {\n return this.selected === option.id;\n },\n onClick(selectedOption) {\n this.$emit('click', selectedOption);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '~dashboard/assets/scss/variables.scss';\n.has-selected {\n .option-button:not(.is-selected) {\n color: $color-light-gray;\n cursor: initial;\n }\n}\n</style>\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n\n.options-message {\n max-width: 17rem;\n padding: $space-small $space-normal;\n border-radius: $space-small;\n overflow: hidden;\n\n .title {\n font-size: $font-size-default;\n font-weight: $font-weight-normal;\n margin-top: $space-smaller;\n margin-bottom: $space-smaller;\n line-height: 1.5;\n }\n\n .options {\n width: 100%;\n\n > li {\n list-style: none;\n padding: 0;\n }\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./ChatOption.vue?vue&type=template&id=dddfa04c&scoped=true&\"\nimport script from \"./ChatOption.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatOption.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatOption.vue?vue&type=style&index=0&id=dddfa04c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"dddfa04c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{staticClass:\"option\",class:{ 'is-selected': _vm.isSelected },style:({ borderColor: _vm.widgetColor })},[_c('button',{staticClass:\"option-button button\",on:{\"click\":_vm.onClick}},[_c('span',{style:({ color: _vm.widgetColor })},[_vm._v(_vm._s(_vm.action.title))])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ChatOptions.vue?vue&type=template&id=d07851ae&scoped=true&\"\nimport script from \"./ChatOptions.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatOptions.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatOptions.vue?vue&type=style&index=0&lang=scss&\"\nimport style1 from \"./ChatOptions.vue?vue&type=style&index=1&id=d07851ae&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d07851ae\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"options-message chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-700')},[_c('div',{staticClass:\"card-body\"},[_c('h4',{staticClass:\"title\",class:_vm.$dm('text-black-900', 'dark:text-slate-50')},[_vm._v(\"\\n \"+_vm._s(_vm.title)+\"\\n \")]),_vm._v(\" \"),(!_vm.hideFields)?_c('ul',{staticClass:\"options\",class:{ 'has-selected': !!_vm.selected }},_vm._l((_vm.options),function(option){return _c('chat-option',{key:option.id,attrs:{\"action\":option,\"is-selected\":_vm.isSelected(option)},on:{\"click\":_vm.onClick}})}),1):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Article.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Article.vue?vue&type=script&lang=js&\"","<template>\n <div\n v-if=\"!!items.length\"\n class=\"chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700')\"\n >\n <div v-for=\"item in items\" :key=\"item.link\" class=\"article-item\">\n <a :href=\"item.link\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">\n <span class=\"title flex items-center text-black-900 font-medium\">\n <fluent-icon\n icon=\"link\"\n class=\"mr-1\"\n :class=\"$dm('text-black-900', 'dark:text-slate-50')\"\n />\n <span :class=\"$dm('text-slate-900', 'dark:text-slate-50')\">{{\n item.title\n }}</span>\n </span>\n <span\n class=\"description\"\n :class=\"$dm('text-slate-700', 'dark:text-slate-200')\"\n >\n {{ truncateMessage(item.description) }}\n </span>\n </a>\n </div>\n </div>\n</template>\n\n<script>\nimport messageFormatterMixin from 'shared/mixins/messageFormatterMixin';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n components: {\n FluentIcon,\n },\n mixins: [messageFormatterMixin, darkModeMixin],\n props: {\n items: {\n type: Array,\n default: () => [],\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.article-item {\n border-bottom: 1px solid $color-border;\n font-size: $font-size-default;\n padding: $space-small 0;\n\n a {\n color: $color-body;\n text-decoration: none;\n }\n\n .description {\n display: block;\n margin-top: $space-smaller;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./Article.vue?vue&type=template&id=feefd62e&scoped=true&\"\nimport script from \"./Article.vue?vue&type=script&lang=js&\"\nexport * from \"./Article.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Article.vue?vue&type=style&index=0&id=feefd62e&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"feefd62e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!!_vm.items.length)?_c('div',{staticClass:\"chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-700')},_vm._l((_vm.items),function(item){return _c('div',{key:item.link,staticClass:\"article-item\"},[_c('a',{attrs:{\"href\":item.link,\"target\":\"_blank\",\"rel\":\"noopener noreferrer nofollow\"}},[_c('span',{staticClass:\"title flex items-center text-black-900 font-medium\"},[_c('fluent-icon',{staticClass:\"mr-1\",class:_vm.$dm('text-black-900', 'dark:text-slate-50'),attrs:{\"icon\":\"link\"}}),_vm._v(\" \"),_c('span',{class:_vm.$dm('text-slate-900', 'dark:text-slate-50')},[_vm._v(_vm._s(item.title))])],1),_vm._v(\" \"),_c('span',{staticClass:\"description\",class:_vm.$dm('text-slate-700', 'dark:text-slate-200')},[_vm._v(\"\\n \"+_vm._s(_vm.truncateMessage(item.description))+\"\\n \")])])])}),0):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <form\n v-if=\"!hasSubmitted\"\n class=\"email-input-group\"\n @submit.prevent=\"onSubmit\"\n >\n <input\n v-model.trim=\"email\"\n class=\"form-input\"\n :placeholder=\"$t('EMAIL_PLACEHOLDER')\"\n :class=\"inputHasError\"\n @input=\"$v.email.$touch\"\n @keydown.enter=\"onSubmit\"\n />\n <button\n class=\"button small\"\n :disabled=\"$v.email.$invalid\"\n :style=\"{\n background: widgetColor,\n borderColor: widgetColor,\n color: textColor,\n }\"\n >\n <fluent-icon v-if=\"!isUpdating\" icon=\"chevron-right\" />\n <spinner v-else class=\"mx-2\" />\n </button>\n </form>\n </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex';\nimport { required, email } from 'vuelidate/lib/validators';\nimport { getContrastingTextColor } from '@chatwoot/utils';\n\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport Spinner from 'shared/components/Spinner';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n components: {\n FluentIcon,\n Spinner,\n },\n mixins: [darkModeMixin],\n props: {\n messageId: {\n type: Number,\n required: true,\n },\n messageContentAttributes: {\n type: Object,\n default: () => {},\n },\n },\n data() {\n return {\n email: '',\n isUpdating: false,\n };\n },\n computed: {\n ...mapGetters({\n widgetColor: 'appConfig/getWidgetColor',\n }),\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n hasSubmitted() {\n return (\n this.messageContentAttributes &&\n this.messageContentAttributes.submitted_email\n );\n },\n inputColor() {\n return `${this.$dm('bg-white', 'dark:bg-slate-600')}\n ${this.$dm('text-black-900', 'dark:text-slate-50')}`;\n },\n inputHasError() {\n return this.$v.email.$error\n ? `${this.inputColor} error`\n : `${this.inputColor}`;\n },\n },\n validations: {\n email: {\n required,\n email,\n },\n },\n methods: {\n async onSubmit() {\n if (this.$v.$invalid) {\n return;\n }\n this.isUpdating = true;\n try {\n await this.$store.dispatch('message/update', {\n email: this.email,\n messageId: this.messageId,\n });\n } catch (error) {\n // Ignore error\n } finally {\n this.isUpdating = false;\n }\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.email-input-group {\n display: flex;\n margin: $space-small 0;\n min-width: 200px;\n\n input {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n padding: $space-one;\n width: 100%;\n\n &::placeholder {\n color: $color-light-gray;\n }\n\n &.error {\n border-color: $color-error;\n }\n }\n\n .button {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n font-size: $font-size-large;\n height: auto;\n margin-left: -1px;\n\n .spinner {\n display: block;\n padding: 0;\n height: auto;\n width: auto;\n }\n }\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EmailInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EmailInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EmailInput.vue?vue&type=template&id=7b523820&scoped=true&\"\nimport script from \"./EmailInput.vue?vue&type=script&lang=js&\"\nexport * from \"./EmailInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EmailInput.vue?vue&type=style&index=0&id=7b523820&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7b523820\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.hasSubmitted)?_c('form',{staticClass:\"email-input-group\",on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.email),expression:\"email\",modifiers:{\"trim\":true}}],staticClass:\"form-input\",class:_vm.inputHasError,attrs:{\"placeholder\":_vm.$t('EMAIL_PLACEHOLDER')},domProps:{\"value\":(_vm.email)},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.email=$event.target.value.trim()},_vm.$v.email.$touch],\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.onSubmit($event)},\"blur\":function($event){return _vm.$forceUpdate()}}}),_vm._v(\" \"),_c('button',{staticClass:\"button small\",style:({\n background: _vm.widgetColor,\n borderColor: _vm.widgetColor,\n color: _vm.textColor,\n }),attrs:{\"disabled\":_vm.$v.email.$invalid}},[(!_vm.isUpdating)?_c('fluent-icon',{attrs:{\"icon\":\"chevron-right\"}}):_c('spinner',{staticClass:\"mx-2\"})],1)]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n class=\"customer-satisfaction\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700')\"\n :style=\"{ borderColor: widgetColor }\"\n >\n <h6 class=\"title\" :class=\"$dm('text-slate-900', 'dark:text-slate-50')\">\n {{ title }}\n </h6>\n <div class=\"ratings\">\n <button\n v-for=\"rating in ratings\"\n :key=\"rating.key\"\n :class=\"buttonClass(rating)\"\n @click=\"selectRating(rating)\"\n >\n {{ rating.emoji }}\n </button>\n </div>\n <form\n v-if=\"!isFeedbackSubmitted\"\n class=\"feedback-form\"\n @submit.prevent=\"onSubmit()\"\n >\n <input\n v-model=\"feedback\"\n class=\"form-input\"\n :class=\"inputColor\"\n :placeholder=\"$t('CSAT.PLACEHOLDER')\"\n @keydown.enter=\"onSubmit\"\n />\n <button\n class=\"button small\"\n :disabled=\"isButtonDisabled\"\n :style=\"{\n background: widgetColor,\n borderColor: widgetColor,\n color: textColor,\n }\"\n >\n <spinner v-if=\"isUpdating && feedback\" />\n <fluent-icon v-else icon=\"chevron-right\" />\n </button>\n </form>\n </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex';\nimport Spinner from 'shared/components/Spinner';\nimport { CSAT_RATINGS } from 'shared/constants/messages';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport darkModeMixin from 'widget/mixins/darkModeMixin';\nimport { getContrastingTextColor } from '@chatwoot/utils';\n\nexport default {\n components: {\n Spinner,\n FluentIcon,\n },\n mixins: [darkModeMixin],\n props: {\n messageContentAttributes: {\n type: Object,\n default: () => {},\n },\n messageId: {\n type: Number,\n required: true,\n },\n },\n data() {\n return {\n email: '',\n ratings: CSAT_RATINGS,\n selectedRating: null,\n isUpdating: false,\n feedback: '',\n };\n },\n computed: {\n ...mapGetters({ widgetColor: 'appConfig/getWidgetColor' }),\n isRatingSubmitted() {\n return this.messageContentAttributes?.csat_survey_response?.rating;\n },\n isFeedbackSubmitted() {\n return this.messageContentAttributes?.csat_survey_response\n ?.feedback_message;\n },\n isButtonDisabled() {\n return !(this.selectedRating && this.feedback);\n },\n inputColor() {\n return `${this.$dm('bg-white', 'dark:bg-slate-600')}\n ${this.$dm('text-black-900', 'dark:text-slate-50')}`;\n },\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n title() {\n return this.isRatingSubmitted\n ? this.$t('CSAT.SUBMITTED_TITLE')\n : this.$t('CSAT.TITLE');\n },\n },\n\n mounted() {\n if (this.isRatingSubmitted) {\n const {\n csat_survey_response: { rating, feedback_message },\n } = this.messageContentAttributes;\n this.selectedRating = rating;\n this.feedback = feedback_message;\n }\n },\n\n methods: {\n buttonClass(rating) {\n return [\n { selected: rating.value === this.selectedRating },\n { disabled: this.isRatingSubmitted },\n { hover: this.isRatingSubmitted },\n 'emoji-button',\n ];\n },\n async onSubmit() {\n this.isUpdating = true;\n try {\n await this.$store.dispatch('message/update', {\n submittedValues: {\n csat_survey_response: {\n rating: this.selectedRating,\n feedback_message: this.feedback,\n },\n },\n messageId: this.messageId,\n });\n } catch (error) {\n // Ignore error\n } finally {\n this.isUpdating = false;\n }\n },\n selectRating(rating) {\n this.selectedRating = rating.value;\n this.onSubmit();\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n@import '~widget/assets/scss/mixins.scss';\n\n.customer-satisfaction {\n @include light-shadow;\n\n border-bottom-left-radius: $space-smaller;\n border-radius: $space-small;\n border-top: $space-micro solid $color-woot;\n color: $color-body;\n display: inline-block;\n line-height: 1.5;\n margin-top: $space-smaller;\n width: 80%;\n\n .title {\n font-size: $font-size-default;\n font-weight: $font-weight-medium;\n padding: $space-two $space-one 0;\n text-align: center;\n }\n\n .ratings {\n display: flex;\n justify-content: space-around;\n padding: $space-two $space-normal;\n\n .emoji-button {\n box-shadow: none;\n filter: grayscale(100%);\n font-size: $font-size-big;\n outline: none;\n\n &.selected,\n &:hover,\n &:focus,\n &:active {\n filter: grayscale(0%);\n transform: scale(1.32);\n }\n\n &.disabled {\n cursor: default;\n opacity: 0.5;\n pointer-events: none;\n }\n }\n }\n .feedback-form {\n display: flex;\n\n input {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: $space-small;\n border: 0;\n border-top: 1px solid $color-border;\n padding: $space-one;\n width: 100%;\n\n &::placeholder {\n color: $color-light-gray;\n }\n }\n\n .button {\n appearance: none;\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: $space-small;\n font-size: $font-size-large;\n height: auto;\n margin-left: -1px;\n\n .spinner {\n display: block;\n padding: 0;\n height: auto;\n width: auto;\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomerSatisfaction.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomerSatisfaction.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CustomerSatisfaction.vue?vue&type=template&id=1f91202a&scoped=true&\"\nimport script from \"./CustomerSatisfaction.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomerSatisfaction.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomerSatisfaction.vue?vue&type=style&index=0&id=1f91202a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1f91202a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"customer-satisfaction\",class:_vm.$dm('bg-white', 'dark:bg-slate-700'),style:({ borderColor: _vm.widgetColor })},[_c('h6',{staticClass:\"title\",class:_vm.$dm('text-slate-900', 'dark:text-slate-50')},[_vm._v(\"\\n \"+_vm._s(_vm.title)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"ratings\"},_vm._l((_vm.ratings),function(rating){return _c('button',{key:rating.key,class:_vm.buttonClass(rating),on:{\"click\":function($event){return _vm.selectRating(rating)}}},[_vm._v(\"\\n \"+_vm._s(rating.emoji)+\"\\n \")])}),0),_vm._v(\" \"),(!_vm.isFeedbackSubmitted)?_c('form',{staticClass:\"feedback-form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit()}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.feedback),expression:\"feedback\"}],staticClass:\"form-input\",class:_vm.inputColor,attrs:{\"placeholder\":_vm.$t('CSAT.PLACEHOLDER')},domProps:{\"value\":(_vm.feedback)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.onSubmit($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.feedback=$event.target.value}}}),_vm._v(\" \"),_c('button',{staticClass:\"button small\",style:({\n background: _vm.widgetColor,\n borderColor: _vm.widgetColor,\n color: _vm.textColor,\n }),attrs:{\"disabled\":_vm.isButtonDisabled}},[(_vm.isUpdating && _vm.feedback)?_c('spinner'):_c('fluent-icon',{attrs:{\"icon\":\"chevron-right\"}})],1)]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { API } from 'widget/helpers/axios';\nimport { buildSearchParamsWithLocale } from '../helpers/urlParamsHelper';\n\nexport default {\n addParticipantToDyteMeeting: messageId => {\n const search = buildSearchParamsWithLocale(window.location.search);\n const urlData = {\n url: `/api/v1/widget/integrations/dyte/add_participant_to_meeting${search}`,\n };\n return API.post(urlData.url, { message_id: messageId });\n },\n};\n","<template>\n <div>\n <button\n class=\"button join-call-button\"\n color-scheme=\"secondary\"\n :is-loading=\"isLoading\"\n :style=\"{\n background: widgetColor,\n borderColor: widgetColor,\n color: textColor,\n }\"\n @click=\"joinTheCall\"\n >\n <fluent-icon icon=\"video-add\" class=\"mr-2\" />\n {{ $t('INTEGRATIONS.DYTE.CLICK_HERE_TO_JOIN') }}\n </button>\n <div v-if=\"dyteAuthToken\" class=\"video-call--container\">\n <iframe\n :src=\"meetingLink\"\n allow=\"camera;microphone;fullscreen;display-capture;picture-in-picture;clipboard-write;\"\n />\n <button\n class=\"button small join-call-button leave-room-button\"\n @click=\"leaveTheRoom\"\n >\n {{ $t('INTEGRATIONS.DYTE.LEAVE_THE_ROOM') }}\n </button>\n </div>\n </div>\n</template>\n<script>\nimport IntegrationAPIClient from 'widget/api/integration';\nimport FluentIcon from 'shared/components/FluentIcon/Index.vue';\nimport { buildDyteURL } from 'shared/helpers/IntegrationHelper';\nimport { getContrastingTextColor } from '@chatwoot/utils';\nimport { mapGetters } from 'vuex';\n\nexport default {\n components: {\n FluentIcon,\n },\n props: {\n messageId: {\n type: Number,\n required: true,\n },\n meetingData: {\n type: Object,\n default: () => ({}),\n },\n },\n data() {\n return { isLoading: false, dyteAuthToken: '', isSDKMounted: false };\n },\n computed: {\n ...mapGetters({ widgetColor: 'appConfig/getWidgetColor' }),\n textColor() {\n return getContrastingTextColor(this.widgetColor);\n },\n meetingLink() {\n return buildDyteURL(this.meetingData.room_name, this.dyteAuthToken);\n },\n },\n methods: {\n async joinTheCall() {\n this.isLoading = true;\n try {\n const {\n data: { authResponse: { authToken = '' } = {} } = {},\n } = await IntegrationAPIClient.addParticipantToDyteMeeting(\n this.messageId\n );\n this.dyteAuthToken = authToken;\n } catch (error) {\n // Ignore Error for now\n } finally {\n this.isLoading = false;\n }\n },\n leaveTheRoom() {\n this.dyteAuthToken = '';\n },\n },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n\n.video-call--container {\n position: fixed;\n top: 72px;\n left: 0;\n width: 100%;\n height: 100%;\n\n z-index: 100;\n\n iframe {\n width: 100%;\n height: calc(100% - 72px);\n\n border: 0;\n }\n}\n\n.join-call-button {\n margin: $space-small 0;\n border-radius: 4px;\n display: flex;\n align-items: center;\n}\n\n.leave-room-button {\n position: absolute;\n top: 0;\n right: $space-small;\n}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IntegrationCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IntegrationCard.vue?vue&type=script&lang=js&\"","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentMessageBubble.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentMessageBubble.vue?vue&type=script&lang=js&\"","<template>\n <div class=\"chat-bubble-wrap\">\n <div\n v-if=\"\n !isCards && !isOptions && !isForm && !isArticle && !isCards && !isCSAT\n \"\n class=\"chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-700 has-dark-mode')\"\n >\n <div\n v-dompurify-html=\"formatMessage(message, false)\"\n class=\"message-content\"\n :class=\"$dm('text-black-900', 'dark:text-slate-50')\"\n dir=\"auto\"\n />\n <email-input\n v-if=\"isTemplateEmail\"\n :message-id=\"messageId\"\n :message-content-attributes=\"messageContentAttributes\"\n />\n\n <integration-card\n v-if=\"isIntegrations\"\n :message-id=\"messageId\"\n :meeting-data=\"messageContentAttributes.data\"\n />\n </div>\n <div v-if=\"isOptions\">\n <chat-options\n :title=\"message\"\n :options=\"messageContentAttributes.items\"\n :hide-fields=\"!!messageContentAttributes.submitted_values\"\n @click=\"onOptionSelect\"\n />\n </div>\n <chat-form\n v-if=\"isForm && !messageContentAttributes.submitted_values\"\n :items=\"messageContentAttributes.items\"\n :button-label=\"messageContentAttributes.button_label\"\n :submitted-values=\"messageContentAttributes.submitted_values\"\n @submit=\"onFormSubmit\"\n />\n <div v-if=\"isCards\">\n <chat-card\n v-for=\"item in messageContentAttributes.items\"\n :key=\"item.title\"\n :media-url=\"item.media_url\"\n :title=\"item.title\"\n :description=\"item.description\"\n :actions=\"item.actions\"\n />\n </div>\n <div v-if=\"isArticle\">\n <chat-article :items=\"messageContentAttributes.items\" />\n </div>\n <customer-satisfaction\n v-if=\"isCSAT\"\n :message-content-attributes=\"messageContentAttributes.submitted_values\"\n :message-id=\"messageId\"\n />\n </div>\n</template>\n\n<script>\nimport messageFormatterMixin from 'shared/mixins/messageFormatterMixin';\nimport ChatCard from 'shared/components/ChatCard';\nimport ChatForm from 'shared/components/ChatForm';\nimport ChatOptions from 'shared/components/ChatOptions';\nimport ChatArticle from './template/Article';\nimport EmailInput from './template/EmailInput';\nimport CustomerSatisfaction from 'shared/components/CustomerSatisfaction';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\nimport IntegrationCard from './template/IntegrationCard';\n\nexport default {\n name: 'AgentMessageBubble',\n components: {\n ChatArticle,\n ChatCard,\n ChatForm,\n ChatOptions,\n EmailInput,\n CustomerSatisfaction,\n IntegrationCard,\n },\n mixins: [messageFormatterMixin, darkModeMixin],\n props: {\n message: { type: String, default: null },\n contentType: { type: String, default: null },\n messageType: { type: Number, default: null },\n messageId: { type: Number, default: null },\n messageContentAttributes: {\n type: Object,\n default: () => {},\n },\n },\n computed: {\n isTemplate() {\n return this.messageType === 3;\n },\n isTemplateEmail() {\n return this.contentType === 'input_email';\n },\n isCards() {\n return this.contentType === 'cards';\n },\n isOptions() {\n return this.contentType === 'input_select';\n },\n isForm() {\n return this.contentType === 'form';\n },\n isArticle() {\n return this.contentType === 'article';\n },\n isCSAT() {\n return this.contentType === 'input_csat';\n },\n isIntegrations() {\n return this.contentType === 'integrations';\n },\n },\n methods: {\n onResponse(messageResponse) {\n this.$store.dispatch('message/update', messageResponse);\n },\n onOptionSelect(selectedOption) {\n this.onResponse({\n submittedValues: [selectedOption],\n messageId: this.messageId,\n });\n },\n onFormSubmit(formValues) {\n const formValuesAsArray = Object.keys(formValues).map(key => ({\n name: key,\n value: formValues[key],\n }));\n this.onResponse({\n submittedValues: formValuesAsArray,\n messageId: this.messageId,\n });\n },\n },\n};\n</script>\n","import { render, staticRenderFns } from \"./IntegrationCard.vue?vue&type=template&id=45604e1d&scoped=true&\"\nimport script from \"./IntegrationCard.vue?vue&type=script&lang=js&\"\nexport * from \"./IntegrationCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./IntegrationCard.vue?vue&type=style&index=0&id=45604e1d&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"45604e1d\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('button',{staticClass:\"button join-call-button\",style:({\n background: _vm.widgetColor,\n borderColor: _vm.widgetColor,\n color: _vm.textColor,\n }),attrs:{\"color-scheme\":\"secondary\",\"is-loading\":_vm.isLoading},on:{\"click\":_vm.joinTheCall}},[_c('fluent-icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"video-add\"}}),_vm._v(\"\\n \"+_vm._s(_vm.$t('INTEGRATIONS.DYTE.CLICK_HERE_TO_JOIN'))+\"\\n \")],1),_vm._v(\" \"),(_vm.dyteAuthToken)?_c('div',{staticClass:\"video-call--container\"},[_c('iframe',{attrs:{\"src\":_vm.meetingLink,\"allow\":\"camera;microphone;fullscreen;display-capture;picture-in-picture;clipboard-write;\"}}),_vm._v(\" \"),_c('button',{staticClass:\"button small join-call-button leave-room-button\",on:{\"click\":_vm.leaveTheRoom}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('INTEGRATIONS.DYTE.LEAVE_THE_ROOM'))+\"\\n \")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./AgentMessageBubble.vue?vue&type=template&id=380beb66&\"\nimport script from \"./AgentMessageBubble.vue?vue&type=script&lang=js&\"\nexport * from \"./AgentMessageBubble.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"chat-bubble-wrap\"},[(\n !_vm.isCards && !_vm.isOptions && !_vm.isForm && !_vm.isArticle && !_vm.isCards && !_vm.isCSAT\n )?_c('div',{staticClass:\"chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-700 has-dark-mode')},[_c('div',{directives:[{name:\"dompurify-html\",rawName:\"v-dompurify-html\",value:(_vm.formatMessage(_vm.message, false)),expression:\"formatMessage(message, false)\"}],staticClass:\"message-content\",class:_vm.$dm('text-black-900', 'dark:text-slate-50'),attrs:{\"dir\":\"auto\"}}),_vm._v(\" \"),(_vm.isTemplateEmail)?_c('email-input',{attrs:{\"message-id\":_vm.messageId,\"message-content-attributes\":_vm.messageContentAttributes}}):_vm._e(),_vm._v(\" \"),(_vm.isIntegrations)?_c('integration-card',{attrs:{\"message-id\":_vm.messageId,\"meeting-data\":_vm.messageContentAttributes.data}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.isOptions)?_c('div',[_c('chat-options',{attrs:{\"title\":_vm.message,\"options\":_vm.messageContentAttributes.items,\"hide-fields\":!!_vm.messageContentAttributes.submitted_values},on:{\"click\":_vm.onOptionSelect}})],1):_vm._e(),_vm._v(\" \"),(_vm.isForm && !_vm.messageContentAttributes.submitted_values)?_c('chat-form',{attrs:{\"items\":_vm.messageContentAttributes.items,\"button-label\":_vm.messageContentAttributes.button_label,\"submitted-values\":_vm.messageContentAttributes.submitted_values},on:{\"submit\":_vm.onFormSubmit}}):_vm._e(),_vm._v(\" \"),(_vm.isCards)?_c('div',_vm._l((_vm.messageContentAttributes.items),function(item){return _c('chat-card',{key:item.title,attrs:{\"media-url\":item.media_url,\"title\":item.title,\"description\":item.description,\"actions\":item.actions}})}),1):_vm._e(),_vm._v(\" \"),(_vm.isArticle)?_c('div',[_c('chat-article',{attrs:{\"items\":_vm.messageContentAttributes.items}})],1):_vm._e(),_vm._v(\" \"),(_vm.isCSAT)?_c('customer-satisfaction',{attrs:{\"message-content-attributes\":_vm.messageContentAttributes.submitted_values,\"message-id\":_vm.messageId}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n class=\"agent-message-wrap\"\n :class=\"{ 'has-response': hasRecordedResponse || isASubmittedForm }\"\n >\n <div v-if=\"!isASubmittedForm\" class=\"agent-message\">\n <div class=\"avatar-wrap\">\n <thumbnail\n v-if=\"message.showAvatar || hasRecordedResponse\"\n :src=\"avatarUrl\"\n size=\"24px\"\n :username=\"agentName\"\n />\n </div>\n <div class=\"message-wrap\">\n <AgentMessageBubble\n v-if=\"shouldDisplayAgentMessage\"\n :content-type=\"contentType\"\n :message-content-attributes=\"messageContentAttributes\"\n :message-id=\"message.id\"\n :message-type=\"messageType\"\n :message=\"message.content\"\n />\n <div\n v-if=\"hasAttachments\"\n class=\"chat-bubble has-attachment agent\"\n :class=\"(wrapClass, $dm('bg-white', 'dark:bg-slate-700'))\"\n >\n <div v-for=\"attachment in message.attachments\" :key=\"attachment.id\">\n <image-bubble\n v-if=\"attachment.file_type === 'image' && !hasImageError\"\n :url=\"attachment.data_url\"\n :thumb=\"attachment.data_url\"\n :readable-time=\"readableTime\"\n @error=\"onImageLoadError\"\n />\n <audio v-else-if=\"attachment.file_type === 'audio'\" controls>\n <source :src=\"attachment.data_url\" />\n </audio>\n <file-bubble v-else :url=\"attachment.data_url\" />\n </div>\n </div>\n <p\n v-if=\"message.showAvatar || hasRecordedResponse\"\n class=\"agent-name\"\n :class=\"$dm('text-slate-700', 'dark:text-slate-200')\"\n >\n {{ agentName }}\n </p>\n </div>\n </div>\n\n <UserMessage v-if=\"hasRecordedResponse\" :message=\"responseMessage\" />\n <div v-if=\"isASubmittedForm\">\n <UserMessage\n v-for=\"submittedValue in submittedFormValues\"\n :key=\"submittedValue.id\"\n :message=\"submittedValue\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport UserMessage from 'widget/components/UserMessage';\nimport AgentMessageBubble from 'widget/components/AgentMessageBubble';\nimport timeMixin from 'dashboard/mixins/time';\nimport ImageBubble from 'widget/components/ImageBubble';\nimport FileBubble from 'widget/components/FileBubble';\nimport Thumbnail from 'dashboard/components/widgets/Thumbnail';\nimport { MESSAGE_TYPE } from 'widget/helpers/constants';\nimport configMixin from '../mixins/configMixin';\nimport messageMixin from '../mixins/messageMixin';\nimport { isASubmittedFormMessage } from 'shared/helpers/MessageTypeHelper';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n name: 'AgentMessage',\n components: {\n AgentMessageBubble,\n ImageBubble,\n Thumbnail,\n UserMessage,\n FileBubble,\n },\n mixins: [timeMixin, configMixin, messageMixin, darkModeMixin],\n props: {\n message: {\n type: Object,\n default: () => {},\n },\n },\n data() {\n return {\n hasImageError: false,\n };\n },\n computed: {\n shouldDisplayAgentMessage() {\n if (\n this.contentType === 'input_select' &&\n this.messageContentAttributes.submitted_values &&\n !this.message.content\n ) {\n return false;\n }\n return this.message.content;\n },\n readableTime() {\n const { created_at: createdAt = '' } = this.message;\n return this.messageStamp(createdAt, 'LLL d yyyy, h:mm a');\n },\n messageType() {\n const { message_type: type = 1 } = this.message;\n return type;\n },\n contentType() {\n const { content_type: type = '' } = this.message;\n return type;\n },\n agentName() {\n if (this.message.message_type === MESSAGE_TYPE.TEMPLATE) {\n return this.botName || 'Bot';\n }\n if (this.message.sender) {\n return this.message.sender.available_name || this.message.sender.name;\n }\n return this.botName || 'Bot';\n },\n avatarUrl() {\n // eslint-disable-next-line\n const BotImage = require('dashboard/assets/images/chatwoot_bot.png');\n const displayImage = this.useInboxAvatarForBot\n ? this.inboxAvatarUrl\n : BotImage;\n\n if (this.message.message_type === MESSAGE_TYPE.TEMPLATE) {\n return displayImage;\n }\n\n return this.message.sender\n ? this.message.sender.avatar_url\n : displayImage;\n },\n hasRecordedResponse() {\n return (\n this.messageContentAttributes.submitted_email ||\n (this.messageContentAttributes.submitted_values &&\n !['form', 'input_csat'].includes(this.contentType))\n );\n },\n responseMessage() {\n if (this.messageContentAttributes.submitted_email) {\n return { content: this.messageContentAttributes.submitted_email };\n }\n\n if (this.messageContentAttributes.submitted_values) {\n if (this.contentType === 'input_select') {\n const [\n selectionOption = {},\n ] = this.messageContentAttributes.submitted_values;\n return { content: selectionOption.title || selectionOption.value };\n }\n }\n return '';\n },\n isASubmittedForm() {\n return isASubmittedFormMessage(this.message);\n },\n submittedFormValues() {\n return this.messageContentAttributes.submitted_values.map(\n submittedValue => ({\n id: submittedValue.name,\n content: submittedValue.value,\n })\n );\n },\n wrapClass() {\n return {\n 'has-text': this.shouldDisplayAgentMessage,\n };\n },\n },\n watch: {\n message() {\n this.hasImageError = false;\n },\n },\n mounted() {\n this.hasImageError = false;\n },\n methods: {\n onImageLoadError() {\n this.hasImageError = true;\n },\n },\n};\n</script>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentMessage.vue?vue&type=script&lang=js&\"","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatMessage.vue?vue&type=script&lang=js&\"","<template>\n <UserMessage v-if=\"isUserMessage\" :message=\"message\" />\n <AgentMessage v-else :message=\"message\" />\n</template>\n\n<script>\nimport AgentMessage from 'widget/components/AgentMessage.vue';\nimport UserMessage from 'widget/components/UserMessage.vue';\nimport { MESSAGE_TYPE } from 'widget/helpers/constants';\n\nexport default {\n components: {\n AgentMessage,\n UserMessage,\n },\n props: {\n message: {\n type: Object,\n default: () => {},\n },\n },\n computed: {\n isUserMessage() {\n return this.message.message_type === MESSAGE_TYPE.INCOMING;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.message-wrap {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n max-width: 90%;\n}\n</style>\n\n<style lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n\n.chat-bubble .message-content,\n.chat-bubble.user {\n p code {\n background-color: var(--s-75);\n display: inline-block;\n line-height: 1;\n\n border-radius: $border-radius-small;\n padding: $space-smaller;\n }\n\n pre {\n overflow-y: auto;\n background-color: var(--s-75);\n border-color: var(--s-75);\n color: var(--s-800);\n border-radius: $border-radius-normal;\n padding: $space-small;\n margin-top: $space-smaller;\n margin-bottom: $space-small;\n display: block;\n line-height: 1.7;\n white-space: pre-wrap;\n\n code {\n background-color: transparent;\n color: var(--s-800);\n padding: 0;\n }\n }\n\n blockquote {\n border-left: $space-micro solid var(--s-75);\n color: var(--s-800);\n padding: $space-smaller $space-small;\n margin: $space-smaller 0;\n padding: $space-small $space-small 0 $space-normal;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n .chat-bubble.agent.has-dark-mode {\n blockquote {\n border-color: var(--s-200);\n color: var(--s-50);\n }\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./AgentMessage.vue?vue&type=template&id=10ef78b4&\"\nimport script from \"./AgentMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./AgentMessage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"agent-message-wrap\",class:{ 'has-response': _vm.hasRecordedResponse || _vm.isASubmittedForm }},[(!_vm.isASubmittedForm)?_c('div',{staticClass:\"agent-message\"},[_c('div',{staticClass:\"avatar-wrap\"},[(_vm.message.showAvatar || _vm.hasRecordedResponse)?_c('thumbnail',{attrs:{\"src\":_vm.avatarUrl,\"size\":\"24px\",\"username\":_vm.agentName}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"message-wrap\"},[(_vm.shouldDisplayAgentMessage)?_c('AgentMessageBubble',{attrs:{\"content-type\":_vm.contentType,\"message-content-attributes\":_vm.messageContentAttributes,\"message-id\":_vm.message.id,\"message-type\":_vm.messageType,\"message\":_vm.message.content}}):_vm._e(),_vm._v(\" \"),(_vm.hasAttachments)?_c('div',{staticClass:\"chat-bubble has-attachment agent\",class:(_vm.wrapClass, _vm.$dm('bg-white', 'dark:bg-slate-700'))},_vm._l((_vm.message.attachments),function(attachment){return _c('div',{key:attachment.id},[(attachment.file_type === 'image' && !_vm.hasImageError)?_c('image-bubble',{attrs:{\"url\":attachment.data_url,\"thumb\":attachment.data_url,\"readable-time\":_vm.readableTime},on:{\"error\":_vm.onImageLoadError}}):(attachment.file_type === 'audio')?_c('audio',{attrs:{\"controls\":\"\"}},[_c('source',{attrs:{\"src\":attachment.data_url}})]):_c('file-bubble',{attrs:{\"url\":attachment.data_url}})],1)}),0):_vm._e(),_vm._v(\" \"),(_vm.message.showAvatar || _vm.hasRecordedResponse)?_c('p',{staticClass:\"agent-name\",class:_vm.$dm('text-slate-700', 'dark:text-slate-200')},[_vm._v(\"\\n \"+_vm._s(_vm.agentName)+\"\\n \")]):_vm._e()],1)]):_vm._e(),_vm._v(\" \"),(_vm.hasRecordedResponse)?_c('UserMessage',{attrs:{\"message\":_vm.responseMessage}}):_vm._e(),_vm._v(\" \"),(_vm.isASubmittedForm)?_c('div',_vm._l((_vm.submittedFormValues),function(submittedValue){return _c('UserMessage',{key:submittedValue.id,attrs:{\"message\":submittedValue}})}),1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ChatMessage.vue?vue&type=template&id=b5e457ba&scoped=true&\"\nimport script from \"./ChatMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatMessage.vue?vue&type=style&index=0&id=b5e457ba&scoped=true&lang=scss&\"\nimport style1 from \"./ChatMessage.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b5e457ba\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isUserMessage)?_c('UserMessage',{attrs:{\"message\":_vm.message}}):_c('AgentMessage',{attrs:{\"message\":_vm.message}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentTypingBubble.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AgentTypingBubble.vue?vue&type=script&lang=js&\"","<template>\n <div class=\"agent-message-wrap\">\n <div class=\"agent-message\">\n <div class=\"avatar-wrap\" />\n <div class=\"message-wrap\">\n <div\n class=\"typing-bubble chat-bubble agent\"\n :class=\"$dm('bg-white', 'dark:bg-slate-50')\"\n >\n <img\n src=\"~widget/assets/images/typing.gif\"\n alt=\"Agent is typing a message\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport darkModeMixing from 'widget/mixins/darkModeMixin.js';\nexport default {\n name: 'AgentTypingBubble',\n mixins: [darkModeMixing],\n};\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables.scss';\n.agent-message-wrap {\n position: sticky;\n bottom: $space-smaller;\n}\n\n.typing-bubble {\n max-width: $space-normal * 2.4;\n padding: $space-small;\n border-bottom-left-radius: $space-two;\n border-top-left-radius: $space-small;\n\n img {\n width: 100%;\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./AgentTypingBubble.vue?vue&type=template&id=1877ef14&scoped=true&\"\nimport script from \"./AgentTypingBubble.vue?vue&type=script&lang=js&\"\nexport * from \"./AgentTypingBubble.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AgentTypingBubble.vue?vue&type=style&index=0&id=1877ef14&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1877ef14\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"agent-message-wrap\"},[_c('div',{staticClass:\"agent-message\"},[_c('div',{staticClass:\"avatar-wrap\"}),_vm._v(\" \"),_c('div',{staticClass:\"message-wrap\"},[_c('div',{staticClass:\"typing-bubble chat-bubble agent\",class:_vm.$dm('bg-white', 'dark:bg-slate-50')},[_c('img',{attrs:{\"src\":require(\"widget/assets/images/typing.gif\"),\"alt\":\"Agent is typing a message\"}})])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DateSeparator.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DateSeparator.vue?vue&type=script&lang=js&\"","<template>\n <div\n class=\"date--separator\"\n :class=\"$dm('text-slate-700', 'dark:text-slate-200')\"\n >\n {{ formattedDate }}\n </div>\n</template>\n\n<script>\nimport { formatDate } from 'shared/helpers/DateHelper';\nimport darkModeMixin from 'widget/mixins/darkModeMixin.js';\n\nexport default {\n mixins: [darkModeMixin],\n props: {\n date: {\n type: String,\n required: true,\n },\n },\n computed: {\n formattedDate() {\n return formatDate({\n date: this.date,\n todayText: this.$t('TODAY'),\n yesterdayText: this.$t('YESTERDAY'),\n });\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '~widget/assets/scss/variables';\n\n.date--separator {\n font-size: $font-size-default;\n height: 50px;\n line-height: 50px;\n position: relative;\n text-align: center;\n width: 100%;\n}\n\n.date--separator::before,\n.date--separator::after {\n background-color: $color-border;\n content: '';\n height: 1px;\n position: absolute;\n top: 24px;\n width: calc((100% - 120px) / 2);\n}\n\n.date--separator::before {\n left: 0;\n}\n\n.date--separator::after {\n right: 0;\n}\n</style>\n","<template>\n <div class=\"conversation--container\" :class=\"colorSchemeClass\">\n <div class=\"conversation-wrap\" :class=\"{ 'is-typing': isAgentTyping }\">\n <div v-if=\"isFetchingList\" class=\"message--loader\">\n <spinner />\n </div>\n <div\n v-for=\"groupedMessage in groupedMessages\"\n :key=\"groupedMessage.date\"\n class=\"messages-wrap\"\n >\n <date-separator :date=\"groupedMessage.date\" />\n <chat-message\n v-for=\"message in groupedMessage.messages\"\n :key=\"message.id\"\n :message=\"message\"\n />\n </div>\n <agent-typing-bubble v-if=\"isAgentTyping\" />\n </div>\n </div>\n</template>\n\n<script>\nimport ChatMessage from 'widget/components/ChatMessage.vue';\nimport AgentTypingBubble from 'widget/components/AgentTypingBubble.vue';\nimport DateSeparator from 'shared/components/DateSeparator.vue';\nimport Spinner from 'shared/components/Spinner.vue';\nimport darkModeMixin from 'widget/mixins/darkModeMixin';\n\nimport { mapActions, mapGetters } from 'vuex';\n\nexport default {\n name: 'ConversationWrap',\n components: {\n ChatMessage,\n AgentTypingBubble,\n DateSeparator,\n Spinner,\n },\n mixins: [darkModeMixin],\n props: {\n groupedMessages: {\n type: Array,\n default: () => [],\n },\n },\n data() {\n return {\n previousScrollHeight: 0,\n previousConversationSize: 0,\n };\n },\n computed: {\n ...mapGetters({\n earliestMessage: 'conversation/getEarliestMessage',\n allMessagesLoaded: 'conversation/getAllMessagesLoaded',\n isFetchingList: 'conversation/getIsFetchingList',\n conversationSize: 'conversation/getConversationSize',\n isAgentTyping: 'conversation/getIsAgentTyping',\n }),\n colorSchemeClass() {\n return `${this.darkMode === 'light' ? 'light' : 'dark'}`;\n },\n },\n\n watch: {\n allMessagesLoaded() {\n this.previousScrollHeight = 0;\n },\n },\n mounted() {\n this.$el.addEventListener('scroll', this.handleScroll);\n this.scrollToBottom();\n },\n updated() {\n if (this.previousConversationSize !== this.conversationSize) {\n this.previousConversationSize = this.conversationSize;\n this.scrollToBottom();\n }\n },\n unmounted() {\n this.$el.removeEventListener('scroll', this.handleScroll);\n },\n methods: {\n ...mapActions('conversation', ['fetchOldConversations']),\n scrollToBottom() {\n const container = this.$el;\n container.scrollTop = container.scrollHeight - this.previousScrollHeight;\n this.previousScrollHeight = 0;\n },\n handleScroll() {\n if (\n this.isFetchingList ||\n this.allMessagesLoaded ||\n !this.conversationSize\n ) {\n return;\n }\n\n if (this.$el.scrollTop < 100) {\n this.fetchOldConversations({ before: this.earliestMessage.id });\n this.previousScrollHeight = this.$el.scrollHeight;\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '~widget/assets/scss/variables.scss';\n@import '~widget/assets/scss/mixins.scss';\n\n.conversation--container {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n color-scheme: light dark;\n\n &.light {\n color-scheme: light;\n }\n &.dark {\n color-scheme: dark;\n }\n}\n\n.conversation-wrap {\n flex: 1;\n padding: $space-large $space-small $space-small $space-small;\n}\n\n.message--loader {\n text-align: center;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConversationWrap.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConversationWrap.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DateSeparator.vue?vue&type=template&id=0619d2c7&scoped=true&\"\nimport script from \"./DateSeparator.vue?vue&type=script&lang=js&\"\nexport * from \"./DateSeparator.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DateSeparator.vue?vue&type=style&index=0&id=0619d2c7&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0619d2c7\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"date--separator\",class:_vm.$dm('text-slate-700', 'dark:text-slate-200')},[_vm._v(\"\\n \"+_vm._s(_vm.formattedDate)+\"\\n\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"flex flex-col flex-1 overflow-hidden\">\n <div class=\"flex flex-1 overflow-auto\">\n <conversation-wrap :grouped-messages=\"groupedMessages\" />\n </div>\n <div class=\"px-5\">\n <chat-footer />\n </div>\n </div>\n</template>\n<script>\nimport { mapGetters } from 'vuex';\nimport ChatFooter from '../components/ChatFooter.vue';\nimport ConversationWrap from '../components/ConversationWrap.vue';\n\nexport default {\n components: { ChatFooter, ConversationWrap },\n computed: {\n ...mapGetters({\n groupedMessages: 'conversation/getGroupedConversation',\n }),\n },\n mounted() {\n this.$store.dispatch('conversation/setUserLastSeen');\n },\n};\n</script>\n","import { render, staticRenderFns } from \"./ConversationWrap.vue?vue&type=template&id=6158bb20&scoped=true&\"\nimport script from \"./ConversationWrap.vue?vue&type=script&lang=js&\"\nexport * from \"./ConversationWrap.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConversationWrap.vue?vue&type=style&index=0&id=6158bb20&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6158bb20\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"conversation--container\",class:_vm.colorSchemeClass},[_c('div',{staticClass:\"conversation-wrap\",class:{ 'is-typing': _vm.isAgentTyping }},[(_vm.isFetchingList)?_c('div',{staticClass:\"message--loader\"},[_c('spinner')],1):_vm._e(),_vm._v(\" \"),_vm._l((_vm.groupedMessages),function(groupedMessage){return _c('div',{key:groupedMessage.date,staticClass:\"messages-wrap\"},[_c('date-separator',{attrs:{\"date\":groupedMessage.date}}),_vm._v(\" \"),_vm._l((groupedMessage.messages),function(message){return _c('chat-message',{key:message.id,attrs:{\"message\":message}})})],2)}),_vm._v(\" \"),(_vm.isAgentTyping)?_c('agent-typing-bubble'):_vm._e()],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Messages.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Messages.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Messages.vue?vue&type=template&id=0caf55ae&\"\nimport script from \"./Messages.vue?vue&type=script&lang=js&\"\nexport * from \"./Messages.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('textarea',{ref:\"textarea\",attrs:{\"placeholder\":_vm.placeholder},domProps:{\"value\":_vm.value},on:{\"input\":_vm.onInput,\"focus\":_vm.onFocus,\"keyup\":_vm.onKeyup,\"blur\":_vm.onBlur}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResizableTextArea.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResizableTextArea.vue?vue&type=script&lang=js&\"","<template>\n <textarea\n ref=\"textarea\"\n :placeholder=\"placeholder\"\n :value=\"value\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @keyup=\"onKeyup\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script>\nconst TYPING_INDICATOR_IDLE_TIME = 4000;\nexport default {\n props: {\n placeholder: {\n type: String,\n default: '',\n },\n value: {\n type: String,\n default: '',\n },\n minHeight: {\n type: Number,\n default: 2,\n },\n },\n data() {\n return {\n idleTimer: null,\n };\n },\n watch: {\n value() {\n this.resizeTextarea();\n },\n },\n mounted() {\n this.$nextTick(() => {\n if (this.value) {\n this.resizeTextarea();\n }\n });\n },\n methods: {\n resizeTextarea() {\n if (!this.value) {\n this.$el.style.height = `${this.minHeight}rem`;\n } else {\n this.$el.style.height = `${this.$el.scrollHeight}px`;\n }\n },\n onInput(event) {\n this.$emit('input', event.target.value);\n this.resizeTextarea();\n },\n resetTyping() {\n this.$emit('typing-off');\n this.idleTimer = null;\n },\n turnOffIdleTimer() {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer);\n }\n },\n onKeyup() {\n if (!this.idleTimer) {\n this.$emit('typing-on');\n }\n this.turnOffIdleTimer();\n this.idleTimer = setTimeout(\n () => this.resetTyping(),\n TYPING_INDICATOR_IDLE_TIME\n );\n },\n onBlur() {\n this.turnOffIdleTimer();\n this.resetTyping();\n this.$emit('blur');\n },\n onFocus() {\n this.$emit('focus');\n },\n focus() {\n this.$refs.textarea.focus();\n },\n },\n};\n</script>\n","import { render, staticRenderFns } from \"./ResizableTextArea.vue?vue&type=template&id=167e8581&\"\nimport script from \"./ResizableTextArea.vue?vue&type=script&lang=js&\"\nexport * from \"./ResizableTextArea.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export const formatBytes = (bytes, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nexport const fileSizeInMegaBytes = bytes => {\n return bytes / (1024 * 1024);\n};\n\nexport const checkFileSizeLimit = (file, maximumUploadLimit) => {\n const fileSize = file?.file?.size || file?.size;\n const fileSizeInMB = fileSizeInMegaBytes(fileSize);\n return fileSizeInMB <= maximumUploadLimit;\n};\n","/**\n * Detects support for emoji character sets.\n *\n * Based on the Modernizr emoji detection.\n * https://github.com/Modernizr/Modernizr/blob/347ddb078116cee91b25b6e897e211b023f9dcb4/feature-detects/emoji.js\n *\n * @return {Boolean} true or false\n * @example\n *\n * hasEmojiSupport()\n * // => true|false\n */\nexport const hasEmojiSupport = () => {\n const pixelRatio = window.devicePixelRatio || 1;\n const offset = 12 * pixelRatio;\n const node = document.createElement('canvas');\n\n // canvastext support\n if (\n !node.getContext ||\n !node.getContext('2d') ||\n typeof node.getContext('2d').fillText !== 'function'\n ) {\n return false;\n }\n\n const ctx = node.getContext('2d');\n\n ctx.fillStyle = '#f00';\n ctx.textBaseline = 'top';\n ctx.font = '32px Arial';\n ctx.fillText('\\ud83d\\udc28', 0, 0); // U+1F428 KOALA\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\n\nexport const removeEmoji = text => {\n if (text) {\n return text\n .replace(\n /([\\u2700-\\u27BF]|[\\uE000-\\uF8FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDFFF]|[\\u2011-\\u26FF]|\\uD83E[\\uDD10-\\uDDFF])/g,\n ''\n )\n .replace(/\\s+/g, ' ')\n .trim();\n }\n return '';\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm.thumbnailBoxClass,style:({ height: _vm.size, width: _vm.size }),attrs:{\"title\":_vm.title}},[_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.shouldShowImage),expression:\"shouldShowImage\"}],class:_vm.thumbnailClass,attrs:{\"src\":_vm.src},on:{\"load\":_vm.onImgLoad,\"error\":_vm.onImgError}}),_vm._v(\" \"),_c('Avatar',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.shouldShowImage),expression:\"!shouldShowImage\"}],class:_vm.thumbnailClass,attrs:{\"username\":_vm.userNameWithoutEmoji,\"size\":_vm.avatarSize}}),_vm._v(\" \"),(_vm.badgeSrc)?_c('img',{staticClass:\"source-badge\",style:(_vm.badgeStyle),attrs:{\"src\":(\"/integrations/channels/badges/\" + _vm.badgeSrc + \".png\"),\"alt\":\"Badge\"}}):_vm._e(),_vm._v(\" \"),(_vm.showStatusIndicator)?_c('div',{class:(\"source-badge user-online-status user-online-status--\" + _vm.status),style:(_vm.statusStyle)}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Avatar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Avatar.vue?vue&type=script&lang=js&\"","<template>\n <div class=\"avatar-container\" :style=\"style\" aria-hidden=\"true\">\n {{ userInitial }}\n </div>\n</template>\n\n<script>\nexport default {\n name: 'Avatar',\n props: {\n username: {\n type: String,\n default: '',\n },\n size: {\n type: Number,\n default: 40,\n },\n },\n computed: {\n style() {\n return {\n fontSize: `${Math.floor(this.size / 2.5)}px`,\n };\n },\n userInitial() {\n const parts = this.username.split(/[ -]/);\n let initials = parts.reduce((acc, curr) => acc + curr.charAt(0), '');\n\n if (initials.length > 2 && initials.search(/[A-Z]/) !== -1) {\n initials = initials.replace(/[a-z]+/g, '');\n }\n initials = initials.substring(0, 2).toUpperCase();\n\n return initials;\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.avatar-container {\n display: flex;\n line-height: 100%;\n font-weight: 500;\n align-items: center;\n justify-content: center;\n text-align: center;\n background-image: linear-gradient(to top, var(--w-100) 0%, var(--w-75) 100%);\n color: var(--w-600);\n cursor: default;\n}\n</style>\n","import { render, staticRenderFns } from \"./Avatar.vue?vue&type=template&id=fce88f76&scoped=true&\"\nimport script from \"./Avatar.vue?vue&type=script&lang=js&\"\nexport * from \"./Avatar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Avatar.vue?vue&type=style&index=0&id=fce88f76&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"fce88f76\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"avatar-container\",style:(_vm.style),attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"\\n \"+_vm._s(_vm.userInitial)+\"\\n\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Thumbnail.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Thumbnail.vue?vue&type=script&lang=js&\"","<template>\n <div\n :class=\"thumbnailBoxClass\"\n :style=\"{ height: size, width: size }\"\n :title=\"title\"\n >\n <!-- Using v-show instead of v-if to avoid flickering as v-if removes dom elements. -->\n <img\n v-show=\"shouldShowImage\"\n :src=\"src\"\n :class=\"thumbnailClass\"\n @load=\"onImgLoad\"\n @error=\"onImgError\"\n />\n <Avatar\n v-show=\"!shouldShowImage\"\n :username=\"userNameWithoutEmoji\"\n :class=\"thumbnailClass\"\n :size=\"avatarSize\"\n />\n <img\n v-if=\"badgeSrc\"\n class=\"source-badge\"\n :style=\"badgeStyle\"\n :src=\"`/integrations/channels/badges/${badgeSrc}.png`\"\n alt=\"Badge\"\n />\n <div\n v-if=\"showStatusIndicator\"\n :class=\"`source-badge user-online-status user-online-status--${status}`\"\n :style=\"statusStyle\"\n />\n </div>\n</template>\n<script>\n/**\n * Thumbnail Component\n * Src - source for round image\n * Size - Size of the thumbnail\n * Badge - Chat source indication { fb / telegram }\n * Username - Username for avatar\n */\nimport Avatar from './Avatar';\nimport { removeEmoji } from 'shared/helpers/emoji';\n\nexport default {\n components: {\n Avatar,\n },\n props: {\n src: {\n type: String,\n default: '',\n },\n size: {\n type: String,\n default: '40px',\n },\n badge: {\n type: String,\n default: '',\n },\n username: {\n type: String,\n default: '',\n },\n status: {\n type: String,\n default: '',\n },\n hasBorder: {\n type: Boolean,\n default: false,\n },\n shouldShowStatusAlways: {\n type: Boolean,\n default: false,\n },\n title: {\n type: String,\n default: '',\n },\n variant: {\n type: String,\n default: 'circle',\n },\n },\n data() {\n return {\n hasImageLoaded: false,\n imgError: false,\n };\n },\n computed: {\n userNameWithoutEmoji() {\n return removeEmoji(this.username);\n },\n showStatusIndicator() {\n if (this.shouldShowStatusAlways) return true;\n return this.status === 'online' || this.status === 'busy';\n },\n avatarSize() {\n return Number(this.size.replace(/\\D+/g, ''));\n },\n badgeSrc() {\n return {\n instagram_direct_message: 'instagram-dm',\n facebook: 'messenger',\n 'twitter-tweet': 'twitter-tweet',\n 'twitter-dm': 'twitter-dm',\n whatsapp: 'whatsapp',\n sms: 'sms',\n 'Channel::Line': 'line',\n 'Channel::Telegram': 'telegram',\n 'Channel::WebWidget': '',\n }[this.badge];\n },\n badgeStyle() {\n const size = Math.floor(this.avatarSize / 3);\n const badgeSize = `${size + 2}px`;\n const borderRadius = `${size / 2}px`;\n return { width: badgeSize, height: badgeSize, borderRadius };\n },\n statusStyle() {\n const statusSize = `${this.avatarSize / 4}px`;\n return { width: statusSize, height: statusSize };\n },\n thumbnailClass() {\n const classname = this.hasBorder ? 'border' : '';\n const variant =\n this.variant === 'circle' ? 'thumbnail-rounded' : 'thumbnail-square';\n return `user-thumbnail ${classname} ${variant}`;\n },\n thumbnailBoxClass() {\n const boxClass = this.variant === 'circle' ? 'is-rounded' : '';\n return `user-thumbnail-box ${boxClass}`;\n },\n shouldShowImage() {\n if (!this.src) {\n return false;\n }\n if (this.hasImageLoaded) {\n return !this.imgError;\n }\n return false;\n },\n },\n watch: {\n src(value, oldValue) {\n if (value !== oldValue && this.imgError) {\n this.imgError = false;\n }\n },\n },\n methods: {\n onImgError() {\n this.imgError = true;\n },\n onImgLoad() {\n this.hasImageLoaded = true;\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.user-thumbnail-box {\n flex: 0 0 auto;\n max-width: 100%;\n position: relative;\n\n &.is-rounded {\n border-radius: 50%;\n }\n\n .user-thumbnail {\n border-radius: 50%;\n &.thumbnail-square {\n border-radius: var(--border-radius-large);\n }\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n object-fit: cover;\n vertical-align: initial;\n\n &.border {\n border: 1px solid white;\n }\n }\n\n .source-badge {\n background: white;\n border-radius: var(--border-radius-small);\n bottom: var(--space-minus-micro);\n box-shadow: var(--shadow-small);\n height: var(--space-slab);\n padding: var(--space-micro);\n position: absolute;\n right: 0;\n width: var(--space-slab);\n }\n\n .user-online-status {\n border-radius: 50%;\n bottom: var(--space-micro);\n\n &:after {\n content: ' ';\n }\n }\n\n .user-online-status--online {\n background: var(--g-400);\n }\n\n .user-online-status--busy {\n background: var(--y-500);\n }\n\n .user-online-status--offline {\n background: var(--s-500);\n }\n}\n</style>\n","import { render, staticRenderFns } from \"./Thumbnail.vue?vue&type=template&id=4240ad79&scoped=true&\"\nimport script from \"./Thumbnail.vue?vue&type=script&lang=js&\"\nexport * from \"./Thumbnail.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Thumbnail.vue?vue&type=style&index=0&id=4240ad79&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4240ad79\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{class:_vm.buttonClassName,style:(_vm.buttonStyles),attrs:{\"disabled\":_vm.disabled},on:{\"click\":_vm.onClick}},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js??ref--7-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"","<template>\n <button\n :class=\"buttonClassName\"\n :style=\"buttonStyles\"\n :disabled=\"disabled\"\n @click=\"onClick\"\n >\n <slot />\n </button>\n</template>\n<script>\nexport default {\n props: {\n block: {\n type: Boolean,\n default: false,\n },\n type: {\n type: String,\n default: 'blue',\n },\n bgColor: {\n type: String,\n default: '',\n },\n textColor: {\n type: String,\n default: '',\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n computed: {\n buttonClassName() {\n let className = 'text-white py-3 px-4 rounded shadow-sm';\n if (this.type === 'clear') {\n className = 'flex mx-auto mt-4 text-xs w-auto text-black-600';\n }\n\n if (this.type === 'blue' && !Object.keys(this.buttonStyles).length) {\n className = `${className} bg-woot-500 hover:bg-woot-700`;\n }\n if (this.block) {\n className = `${className} w-full`;\n }\n return className;\n },\n buttonStyles() {\n const styles = {};\n if (this.bgColor) {\n styles.backgroundColor = this.bgColor;\n }\n if (this.textColor) {\n styles.color = this.textColor;\n }\n return styles;\n },\n },\n methods: {\n onClick(e) {\n this.$emit('click', e);\n },\n },\n};\n</script>\n","import { render, staticRenderFns } from \"./Button.vue?vue&type=template&id=4f2eb420&\"\nimport script from \"./Button.vue?vue&type=script&lang=js&\"\nexport * from \"./Button.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","const DYTE_MEETING_LINK = 'https://app.dyte.in/meeting/stage/';\n\nexport const buildDyteURL = (roomName, dyteAuthToken) => {\n return `${DYTE_MEETING_LINK}${roomName}?authToken=${dyteAuthToken}&showSetupScreen=true&disableVideoBackground=true`;\n};\n"],"sourceRoot":""}