@vamlabs/vam-chatbot 0.1.82-dev.187.1 → 0.1.82-dev.189.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/web-component.js +39 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -62,4 +62,4 @@ These steps will help you integrate the VAM chatbot into your webpage seamlessly
|
|
|
62
62
|
- The widget uses a 2-step chat flow (`POST /chat/session` then streamed `POST /chat/stream`) and requires your site origin to be allowlisted for your tenant.
|
|
63
63
|
- If configured, `authTokenProvider` is called before each message stream starts so expiring tokens can be refreshed on-demand.
|
|
64
64
|
- Missing or invalid `layout` values default to the existing floating layout.
|
|
65
|
-
- Exposed `::part(...)` hooks include `root`, `panel`, `header`, `header-title`, `header-actions`, `reset-button`, `close-button`, `body`, `inline-state`, `loading-state`, `error-state`, `conversation`, `prompts`, `prompt-button`, `message`, `bot-message`, `user-message`, `error-message`, `message-avatar`, `message-bubble`, `carousel`, `sources`, `source-link`, `source-toggle`, `promoted-topics`, `support-actions`, `feedback-panel`, `feedback-form`, `footer`, `footer-branding`, `prompt-drawer-button`, `input`, `submit-button`, `launcher`, `launcher-popup`, and `launcher-button`.
|
|
65
|
+
- Exposed `::part(...)` hooks include `root`, `panel`, `header`, `header-title`, `header-actions`, `reset-button`, `close-button`, `body`, `inline-state`, `loading-state`, `error-state`, `conversation`, `prompts`, `prompt-button`, `message`, `bot-message`, `user-message`, `error-message`, `message-avatar`, `message-bubble`, `carousel`, `sources`, `source-link`, `source-toggle`, `promoted-topics`, `support-actions`, `response-rating`, `response-rating-up`, `response-rating-down`, `feedback-panel`, `feedback-form`, `footer`, `footer-branding`, `prompt-drawer-button`, `input`, `submit-button`, `launcher`, `launcher-popup`, and `launcher-button`.
|
package/dist/web-component.js
CHANGED
|
@@ -26,7 +26,7 @@ return /******/ (() => { // webpackBootstrap
|
|
|
26
26
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
27
27
|
|
|
28
28
|
"use strict";
|
|
29
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ applySupportRedirects: () => (/* binding */ applySupportRedirects),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getWhatsappSupportRedirect: () => (/* binding */ getWhatsappSupportRedirect),\n/* harmony export */ responseMatchesWhatsappTrigger: () => (/* binding */ responseMatchesWhatsappTrigger),\n/* harmony export */ shouldSuppressFeedbackForCurrentAnswer: () => (/* binding */ shouldSuppressFeedbackForCurrentAnswer)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/dom/features-animation.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/components/m/proxy.mjs\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _components_ChatbotHeader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/ChatbotHeader */ \"./components/ChatbotHeader.jsx\");\n/* harmony import */ var _components_ChatbotBody__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/ChatbotBody */ \"./components/ChatbotBody.jsx\");\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _utils_variants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/variants */ \"./utils/variants.js\");\n/* harmony import */ var _utils_useClickHandler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/useClickHandler */ \"./utils/useClickHandler.js\");\n/* harmony import */ var _utils_defaults__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/defaults */ \"./utils/defaults.js\");\n/* harmony import */ var _utils_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/config */ \"./utils/config.js\");\n/* harmony import */ var _utils_sseClient__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/sseClient */ \"./utils/sseClient.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n/* \n- valid chatbot states:\n 0: \"at rest\",\n 1: \"waiting for response from api\"\n 2: \"receiving response from api\"\n*/\n\nconst fixSpecialLLMChars = text => {\n // forward slash is replaced by <|slash|> in the response from the api\n return text.replace(/\\u003c\\|slash\\|\\u003e/g, \"/\");\n};\nconst normalizeResponseText = text => {\n if (typeof text !== \"string\") return \"\";\n return fixSpecialLLMChars(text);\n};\nconst normalizeAuthToken = value => {\n if (typeof value !== \"string\") return \"\";\n return value.trim();\n};\nconst normalizeLayout = layout => layout === \"inline\" ? \"inline\" : \"floating\";\nconst CHATBOT_CONFIG_STATUS = {\n LOADING: \"loading\",\n READY: \"ready\",\n ERROR: \"error\"\n};\nconst frequencySupportRedirectChannels = [\"telegram\"];\nconst defaultWhatsappTriggerKeywords = [\"please try again later\", \"i am only able to answer questions related to brentford\", \"i could not find information about that\", \"feel free to ask me other questions\"];\nconst createSupportRedirect = (channel, channelConfig) => ({\n channel,\n url: channelConfig?.redirect_url,\n messageText: channelConfig?.message_text,\n buttonLabel: channelConfig?.button_label\n});\nconst getFrequencySupportRedirects = (externalRedirectMetadata, botMessageCount) => {\n return frequencySupportRedirectChannels.reduce((redirects, channel) => {\n const channelConfig = externalRedirectMetadata?.[channel];\n const triggerFrequency = Number(channelConfig?.trigger_message_frequency);\n const redirectUrl = channelConfig?.redirect_url;\n if (triggerFrequency > 0 && redirectUrl && botMessageCount % triggerFrequency === 0) {\n redirects.push(createSupportRedirect(channel, channelConfig));\n }\n return redirects;\n }, []);\n};\nconst getWhatsappTriggerKeywords = channelConfig => {\n const configuredKeywords = Array.isArray(channelConfig?.trigger_keywords) ? channelConfig.trigger_keywords : [];\n const keywords = configuredKeywords.length > 0 ? configuredKeywords : defaultWhatsappTriggerKeywords;\n return keywords.filter(keyword => typeof keyword === \"string\").map(keyword => keyword.trim().toLowerCase()).filter(Boolean);\n};\nconst responseMatchesWhatsappTrigger = (responseText, channelConfig) => {\n const normalizedResponseText = typeof responseText === \"string\" ? responseText.toLowerCase() : \"\";\n if (!normalizedResponseText) return false;\n return getWhatsappTriggerKeywords(channelConfig).some(keyword => normalizedResponseText.includes(keyword));\n};\nconst getWhatsappSupportRedirect = (externalRedirectMetadata, responseText, whatsappMatchCountRef) => {\n const channelConfig = externalRedirectMetadata?.whatsapp;\n if (!channelConfig?.redirect_url) return null;\n if (!responseMatchesWhatsappTrigger(responseText, channelConfig)) return null;\n whatsappMatchCountRef.current += 1;\n const configuredTriggerMatchCount = Number(channelConfig?.trigger_match_count);\n const triggerMatchCount = configuredTriggerMatchCount > 0 ? configuredTriggerMatchCount : 2;\n if (whatsappMatchCountRef.current % triggerMatchCount !== 0) return null;\n return createSupportRedirect(\"whatsapp\", channelConfig);\n};\nconst applySupportRedirects = function (messageData, externalRedirectMetadata, botMessageCount) {\n let additionalRedirects = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const supportRedirects = [...getFrequencySupportRedirects(externalRedirectMetadata, botMessageCount), ...additionalRedirects.filter(Boolean)];\n if (supportRedirects.length > 0) {\n messageData.showSupportButton = true;\n messageData.supportUrl = supportRedirects[0].url;\n messageData.supportChannel = supportRedirects[0].channel;\n messageData.supportRedirects = supportRedirects;\n }\n};\nconst shouldSuppressFeedbackForCurrentAnswer = _ref => {\n let {\n dismissed,\n submitted\n } = _ref;\n return Boolean(dismissed || submitted);\n};\nconst resolveAuthToken = async _ref2 => {\n let {\n authToken,\n authTokenProvider\n } = _ref2;\n if (typeof authTokenProvider === \"function\") {\n const providedToken = await authTokenProvider();\n const normalizedToken = normalizeAuthToken(providedToken);\n if (normalizedToken) return normalizedToken;\n }\n return normalizeAuthToken(authToken);\n};\nconst randomId = () => {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n } catch (e) {}\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n};\nfunction Chatbot(_ref3) {\n let {\n clientId,\n onTrackEvent,\n authToken,\n authTokenProvider,\n layout = \"floating\"\n } = _ref3;\n const [messageList, setMessageList] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n const [inputText, setInputText] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const [chatbotState, setChatbotState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n const [chatbotMinimized, setChatbotMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [chatbotPopupMinimized, setChatbotPopupMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [promptsData, setPromptsData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n show: true,\n prompts: []\n });\n const [promptsMinimized, setPromptsMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [chatbotConfig, setChatbotConfig] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n status: CHATBOT_CONFIG_STATUS.LOADING,\n data: {}\n });\n const [chatbotIcon, setChatbotIcon] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [feedbackPrompt, setFeedbackPrompt] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const defaultMessageList = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const conversationIdRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(randomId());\n const streamAbortRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const pendingFeedbackRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const latestFeedbackPayloadRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const feedbackInactivityTimerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const feedbackSubmittedForCurrentAnswerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const feedbackDismissedForCurrentAnswerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const whatsappMatchCountRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const conversationRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const userScrolledUpRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const chatbotRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chatbotStateRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(chatbotState);\n const chatbotMinimizedRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(chatbotMinimized);\n const feedbackPromptVisibleRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const normalizedLayout = normalizeLayout(layout);\n const isInlineLayout = normalizedLayout === \"inline\";\n const isConfigReady = chatbotConfig?.status === CHATBOT_CONFIG_STATUS.READY;\n\n // Use the custom hook to track clicks\n (0,_utils_useClickHandler__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(onTrackEvent, chatbotRef);\n const getFeedbackInactivityMs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const feedbackConfig = chatbotConfig?.data?.external_redirect_metadata?.internal_feedback;\n if (!feedbackConfig) return 0;\n const inactivitySeconds = Number(feedbackConfig?.inactivity_seconds);\n const seconds = inactivitySeconds > 0 ? inactivitySeconds : 60;\n return seconds * 1000;\n }, [chatbotConfig?.data?.external_redirect_metadata]);\n const clearFeedbackInactivityTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (feedbackInactivityTimerRef.current) {\n clearTimeout(feedbackInactivityTimerRef.current);\n feedbackInactivityTimerRef.current = null;\n }\n }, []);\n const resetFeedbackInactivityTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n let {\n hidePrompt = true\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n clearFeedbackInactivityTimer();\n if (hidePrompt) {\n feedbackPromptVisibleRef.current = false;\n setFeedbackPrompt(null);\n }\n const inactivityMs = getFeedbackInactivityMs();\n if (!inactivityMs) return;\n if (shouldSuppressFeedbackForCurrentAnswer({\n dismissed: feedbackDismissedForCurrentAnswerRef.current,\n submitted: feedbackSubmittedForCurrentAnswerRef.current\n })) {\n return;\n }\n feedbackInactivityTimerRef.current = setTimeout(() => {\n if (!latestFeedbackPayloadRef.current) return;\n if (shouldSuppressFeedbackForCurrentAnswer({\n dismissed: feedbackDismissedForCurrentAnswerRef.current,\n submitted: feedbackSubmittedForCurrentAnswerRef.current\n })) {\n return;\n }\n if (chatbotStateRef.current !== 0) {\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n return;\n }\n if (!isInlineLayout && chatbotMinimizedRef.current) return;\n if (feedbackPromptVisibleRef.current) return;\n feedbackPromptVisibleRef.current = true;\n setFeedbackPrompt({\n show: true,\n payload: {\n ...latestFeedbackPayloadRef.current\n }\n });\n }, inactivityMs);\n }, [clearFeedbackInactivityTimer, getFeedbackInactivityMs, isInlineLayout]);\n const handleFeedbackDismiss = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n feedbackPromptVisibleRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = true;\n clearFeedbackInactivityTimer();\n setFeedbackPrompt(null);\n }, [clearFeedbackInactivityTimer]);\n const handleFeedbackSubmitted = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n feedbackPromptVisibleRef.current = true;\n feedbackSubmittedForCurrentAnswerRef.current = true;\n feedbackDismissedForCurrentAnswerRef.current = false;\n clearFeedbackInactivityTimer();\n setFeedbackPrompt(currentPrompt => currentPrompt ? {\n ...currentPrompt,\n submitted: true\n } : currentPrompt);\n }, [clearFeedbackInactivityTimer]);\n const getFreshFeedbackToken = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async _ref4 => {\n let {\n chatbotBaseUrl\n } = _ref4;\n if (!chatbotBaseUrl) return \"\";\n const token = await resolveAuthToken({\n authToken,\n authTokenProvider\n });\n const pagePath = typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\n const session = await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.mintChatbotSessionToken)({\n chatbotBaseUrl,\n authToken: token,\n pagePath\n });\n return session?.token || \"\";\n }, [authToken, authTokenProvider]);\n const setChatbotStateValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(nextState => {\n chatbotStateRef.current = nextState;\n setChatbotState(nextState);\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n chatbotStateRef.current = chatbotState;\n }, [chatbotState]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n chatbotMinimizedRef.current = chatbotMinimized;\n }, [chatbotMinimized]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n feedbackPromptVisibleRef.current = Boolean(feedbackPrompt?.show);\n }, [feedbackPrompt?.show]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n clearFeedbackInactivityTimer();\n };\n }, [clearFeedbackInactivityTimer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isConfigReady && (isInlineLayout || !chatbotMinimized)) {\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n } else {\n clearFeedbackInactivityTimer();\n }\n }, [chatbotMinimized, clearFeedbackInactivityTimer, isConfigReady, isInlineLayout, resetFeedbackInactivityTimer]);\n\n // use effect to upate the css variables once available through the chatbot config API\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n try {\n if (chatbotConfig?.data?.styles?.css_variables) {\n const chatbotParent = chatbotRef.current;\n if (!chatbotParent) return;\n for (let variable in chatbotConfig.data.styles.css_variables) {\n chatbotParent.style.setProperty(`--${variable}`, chatbotConfig.data.styles.css_variables[variable]);\n }\n }\n } catch (error) {\n console.log(error);\n }\n }, [chatbotConfig?.data?.styles?.css_variables]);\n\n // useeffect to store the chatbot icon when its url is fetched from the chatbot config API\n // this is to prevent the api call being made on render of every message\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n try {\n if (chatbotConfig?.data?.icon_url) {\n const fetchChatbotIcon = async () => {\n let url = chatbotConfig?.data?.icon_url;\n let apiResponse = await (0,axios__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n url,\n method: \"GET\",\n responseType: \"blob\"\n });\n let imageBlob = apiResponse.data;\n if (imageBlob) {\n let imageObjectURL = URL.createObjectURL(imageBlob);\n setChatbotIcon(imageObjectURL);\n }\n };\n fetchChatbotIcon();\n }\n } catch (error) {\n console.log(error);\n }\n }, [chatbotConfig?.data?.icon_url]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const fetchConfigData = async () => {\n // Check if configUrl is null and handle appropriately\n if (!_utils_config__WEBPACK_IMPORTED_MODULE_7__.configUrl) {\n console.error(\"Chatbot config URL is not set. Please provide CHATBOT_DEV_URL or CHATBOT_PROD_URL environment variables.\");\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n return;\n }\n const url = `${_utils_config__WEBPACK_IMPORTED_MODULE_7__.configUrl}/api/getBotConfig`;\n const method = \"POST\";\n const requestBody = {\n clientId\n };\n try {\n let apiResponse = await (0,axios__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n url,\n method,\n data: requestBody\n });\n if (apiResponse?.data) {\n let data = apiResponse.data;\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.READY,\n data\n });\n setPromptsData(data?.default_prompts || {\n show: false,\n prompts: []\n });\n setMessageList(data?.default_message_list || []);\n defaultMessageList.current = data?.default_message_list || [];\n } else {\n // handle no data here\n console.log(\"no data found for the provided client id: \", clientId);\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n }\n } catch (e) {\n console.error(e);\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n // handle api failure here\n }\n };\n fetchConfigData();\n }, [clientId]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n streamAbortRef.current?.abort?.();\n };\n }, []);\n const scrollConversationToEnd = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n let {\n force = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!force && userScrolledUpRef.current) return;\n const conversation = conversationRef.current;\n if (!conversation) return;\n conversation.scrollTo({\n top: conversation.scrollHeight,\n behavior: \"smooth\"\n });\n }, []);\n\n // scroll to the latest message whenever the content updates.\n // Message updates respect manual scroll during streaming; feedback prompt\n // visibility force-scrolls because it is inserted after the latest answer.\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n scrollConversationToEnd({\n force: Boolean(feedbackPrompt?.show)\n });\n }, [feedbackPrompt?.show, messageList, scrollConversationToEnd]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!feedbackPrompt?.show) return;\n const scrollFrame = window.requestAnimationFrame(() => {\n scrollConversationToEnd({\n force: true\n });\n });\n return () => window.cancelAnimationFrame(scrollFrame);\n }, [feedbackPrompt?.show, scrollConversationToEnd]);\n\n // detects when the user scrolls up during streaming and disables auto-scroll\n const handleUserScroll = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {\n if (chatbotState !== 2) return;\n const el = e.target;\n const threshold = 30;\n const isAtBottom = el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n if (!isAtBottom) {\n userScrolledUpRef.current = true;\n }\n }, [chatbotState]);\n const handleStreamEnvelope = env => {\n try {\n let {\n status,\n data\n } = env || {};\n let {\n response,\n sources,\n image_links,\n promoted_topics\n } = data || {};\n const activeFeedbackPayload = pendingFeedbackRef.current;\n const normalizedResponse = normalizeResponseText(response);\n const normalizedSources = sources?.map(fixSpecialLLMChars);\n const normalizedImageLinks = image_links?.map(fixSpecialLLMChars);\n const normalizedPromotedTopics = promoted_topics?.filter(item => item?.title);\n const promotedImageLinks = normalizedPromotedTopics?.map(pt => pt?.image_link)?.filter(Boolean)?.map(fixSpecialLLMChars);\n if (status === \"streaming\") {\n // set the chatbot state to \"receiving response\" and initialize the response\n setChatbotStateValue(2);\n if (normalizedResponse) {\n setMessageList(prevList => {\n let responseList = [...prevList];\n try {\n let latestMessage = prevList.slice(-1)[0];\n if (latestMessage?.status === \"streaming\") {\n latestMessage.data.text = normalizedResponse;\n } else {\n let responseMessage = {\n source: \"bot\",\n data: {\n text: normalizedResponse,\n feedbackPayload: activeFeedbackPayload ? {\n ...activeFeedbackPayload\n } : undefined\n },\n origin: \"server\",\n status: \"streaming\"\n };\n responseList = [...responseList, responseMessage];\n }\n } catch (error) {}\n return responseList;\n });\n }\n } else if (status === \"done\") {\n const finalResponseText = normalizedResponse || _utils_defaults__WEBPACK_IMPORTED_MODULE_6__.errorResponse;\n const finalFeedbackPayload = activeFeedbackPayload ? {\n ...activeFeedbackPayload,\n assistantResponse: finalResponseText\n } : undefined;\n const externalRedirectMetadata = chatbotConfig?.data?.external_redirect_metadata;\n const whatsappSupportRedirect = getWhatsappSupportRedirect(externalRedirectMetadata, finalResponseText, whatsappMatchCountRef);\n if (finalFeedbackPayload) {\n latestFeedbackPayloadRef.current = finalFeedbackPayload;\n feedbackSubmittedForCurrentAnswerRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = false;\n }\n setChatbotStateValue(0);\n // re-enable auto-scroll for the next answer\n userScrolledUpRef.current = false;\n\n // update the status as done for the last message\n setMessageList(prevList => {\n let responseList = [...prevList];\n try {\n let latestMessage = responseList.slice(-1)[0];\n if (latestMessage?.source !== \"user\") {\n latestMessage.status = \"done\";\n latestMessage.data.text = finalResponseText;\n latestMessage.data.sources = normalizedSources;\n latestMessage.data.image_links = promotedImageLinks?.length > 0 ? promotedImageLinks : normalizedImageLinks;\n latestMessage.data.promoted_topics = normalizedPromotedTopics;\n latestMessage.data.feedbackPayload = finalFeedbackPayload;\n\n // Logic to show support redirects at their configured frequency\n const botMessageCount = responseList.filter(msg => msg.source === \"bot\" && msg.origin === \"server\").length;\n applySupportRedirects(latestMessage.data, externalRedirectMetadata, botMessageCount, [whatsappSupportRedirect]);\n } else {\n let responseMessage = {\n source: \"bot\",\n data: {\n text: finalResponseText,\n sources: normalizedSources,\n image_links: promotedImageLinks?.length > 0 ? promotedImageLinks : normalizedImageLinks,\n promoted_topics: normalizedPromotedTopics,\n feedbackPayload: finalFeedbackPayload\n },\n origin: \"server\",\n status: \"done\"\n };\n const nextBotMessageCount = responseList.filter(msg => msg.source === \"bot\" && msg.origin === \"server\").length + 1;\n applySupportRedirects(responseMessage.data, externalRedirectMetadata, nextBotMessageCount, [whatsappSupportRedirect]);\n responseList = [...responseList, responseMessage];\n }\n } catch (error) {}\n return responseList;\n });\n pendingFeedbackRef.current = null;\n resetFeedbackInactivityTimer();\n }\n } catch (error) {}\n };\n\n // to keep the input field in focus and scroll to the latest message\n // when the enter button is clicked.\n // const focusInput = () => {\n // inputRef.current.focus();\n // };\n\n // to handle the minimize/maximize animation of the chatbot.\n const handleChatbotAnimation = () => {\n const nextMinimized = !chatbotMinimized;\n chatbotMinimizedRef.current = nextMinimized;\n setChatbotMinimized(nextMinimized);\n if (nextMinimized) {\n clearFeedbackInactivityTimer();\n } else {\n resetFeedbackInactivityTimer();\n }\n };\n\n // to reset the chatbot content.\n const resetChatbot = () => {\n try {\n streamAbortRef.current?.abort?.();\n streamAbortRef.current = null;\n pendingFeedbackRef.current = null;\n latestFeedbackPayloadRef.current = null;\n feedbackSubmittedForCurrentAnswerRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = false;\n whatsappMatchCountRef.current = 0;\n feedbackPromptVisibleRef.current = false;\n conversationIdRef.current = randomId();\n setMessageList(defaultMessageList.current);\n setPromptsData(prevData => {\n return {\n ...prevData,\n show: true\n };\n });\n setPromptsMinimized(true);\n setChatbotStateValue(0);\n setInputText(\"\");\n setFeedbackPrompt(null);\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n } catch (error) {}\n };\n const handleInput = event => {\n try {\n setInputText(event.target.value);\n resetFeedbackInactivityTimer();\n } catch (error) {}\n };\n const getChatHistory = messages => {\n let response = [];\n try {\n let historyItem = {\n user: \"\",\n assistant: \"\"\n };\n for (let message of messages || []) {\n if (message.source === \"user\") {\n historyItem.user = message?.data?.text;\n } else if (message.source === \"bot\" && message.origin === \"server\") {\n if (message?.status === \"done\") {\n historyItem.assistant = message?.data?.text;\n response.push(historyItem);\n historyItem = {\n user: \"\",\n assistant: \"\"\n };\n }\n }\n }\n } catch (error) {\n console.log(error);\n } finally {\n return response;\n }\n };\n const getPromotionsShown = messages => {\n const out = [];\n try {\n let pendingUserSeen = false;\n for (let message of messages || []) {\n if (message.source === \"user\") {\n pendingUserSeen = true;\n continue;\n }\n if (!pendingUserSeen) continue;\n if (message.source === \"bot\" && message.origin === \"server\" && message.status === \"done\") {\n const titles = (message?.data?.promoted_topics || []).map(t => t?.title).filter(t => typeof t === \"string\" && t.trim().length > 0);\n out.push(titles);\n pendingUserSeen = false;\n }\n }\n } catch (error) {}\n return out;\n };\n const startNewStream = async (prompt, prevMessages) => {\n const chatbotBaseUrl = chatbotConfig?.data?.chatbot_url || chatbotConfig?.data?.chatbotUrl;\n if (!chatbotBaseUrl) {\n throw new Error(\"chatbot_url missing from config\");\n }\n streamAbortRef.current?.abort?.();\n const abortController = new AbortController();\n streamAbortRef.current = abortController;\n resetFeedbackInactivityTimer();\n let chatHistory = getChatHistory(prevMessages);\n let promotionsShown = getPromotionsShown(prevMessages);\n if (chatHistory.length > 40) {\n const start = chatHistory.length - 40;\n chatHistory = chatHistory.slice(start);\n promotionsShown = promotionsShown.slice(start);\n }\n const messageId = randomId();\n const token = await resolveAuthToken({\n authToken,\n authTokenProvider\n });\n const pagePath = typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\n const session = await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.mintChatbotSessionToken)({\n chatbotBaseUrl,\n authToken: token,\n pagePath,\n signal: abortController.signal\n });\n if (!session?.token) {\n throw new Error(\"missing session token\");\n }\n const conversationID = conversationIdRef.current;\n const feedbackChatHistory = chatHistory.slice(-5);\n pendingFeedbackRef.current = {\n chatbotBaseUrl,\n token: session.token,\n messageID: messageId,\n conversationID,\n userQuery: prompt,\n chatHistory: feedbackChatHistory\n };\n await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.streamChatbotSse)({\n chatbotBaseUrl,\n token: session.token,\n body: {\n chatHistory,\n conversationId: conversationID,\n message: prompt,\n messageId,\n promotionsShown\n },\n signal: abortController.signal,\n onEnvelope: handleStreamEnvelope\n });\n };\n const handleSubmit = async function () {\n let prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n let typewriterEffect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!prompt) {\n prompt = inputText;\n } else {\n typewriterEffect = true;\n }\n try {\n prompt = prompt.trim();\n if (prompt) {\n const prevMessages = messageList;\n resetFeedbackInactivityTimer();\n setChatbotStateValue(1);\n\n // put the user's prompt in the chat\n let userMessage = {\n source: \"user\",\n data: {\n text: prompt\n },\n status: \"done\",\n typewriterEffect\n };\n setMessageList(prevList => [...prevList, userMessage]);\n\n // hide the default prompts\n setPromptsData({\n ...promptsData,\n show: false\n });\n\n // clear the input field\n setInputText(\"\");\n await startNewStream(prompt, prevMessages);\n }\n } catch (error) {\n if (error?.name === \"AbortError\") {\n return;\n }\n console.error(\"Error sending chat message:\", error);\n setChatbotStateValue(0);\n setMessageList(prevList => [...prevList, {\n source: \"error\",\n data: {\n text: _utils_defaults__WEBPACK_IMPORTED_MODULE_6__.errorResponse\n },\n status: \"done\"\n }]);\n }\n };\n const chatbotParentClassName = `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotParent} ${isInlineLayout ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineChatbotParent : \"\"}`;\n const chatbotContainerClassName = `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotContainer} ${isInlineLayout ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineChatbotContainer : \"\"}`;\n const chatbotContainerAnimationProps = isInlineLayout ? {} : {\n animate: chatbotMinimized ? \"hide\" : \"show\",\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.maximizedChatbotVariants\n };\n const shouldRenderInlineState = isInlineLayout && !isConfigReady;\n const inlineStateIsLoading = chatbotConfig?.status === CHATBOT_CONFIG_STATUS.LOADING;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.Fragment, {\n children: (isConfigReady || shouldRenderInlineState) && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: chatbotParentClassName,\n ref: chatbotRef,\n part: \"root\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_11__.LazyMotion, {\n features: framer_motion__WEBPACK_IMPORTED_MODULE_12__.domAnimation,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_13__.m.div, {\n initial: false,\n className: chatbotContainerClassName,\n part: \"panel\",\n \"aria-hidden\": !isInlineLayout && chatbotMinimized,\n ...chatbotContainerAnimationProps,\n children: isConfigReady ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.Fragment, {\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_components_ChatbotHeader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n headerText: chatbotConfig?.data?.header_text,\n setPromptsMinimized: setPromptsMinimized,\n handleChatbotAnimation: handleChatbotAnimation,\n resetChatbot: resetChatbot,\n showCloseButton: !isInlineLayout\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_components_ChatbotBody__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n messageList: messageList,\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n chatbotState: chatbotState,\n conversationRef: conversationRef,\n promptsMinimized: promptsMinimized,\n setPromptsMinimized: setPromptsMinimized,\n inputRef: inputRef,\n inputText: inputText,\n handleInput: handleInput,\n placeholderInputText: chatbotConfig?.data?.placeholder_input_text,\n footerDisclaimerText: chatbotConfig?.data?.footer_disclaimer_text,\n chatbotIcon: chatbotIcon,\n onConversationScroll: handleUserScroll,\n feedbackPrompt: feedbackPrompt,\n getFeedbackToken: getFreshFeedbackToken,\n onFeedbackDismiss: handleFeedbackDismiss,\n onFeedbackSubmitted: handleFeedbackSubmitted\n })]\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateSurface,\n part: `body inline-state ${inlineStateIsLoading ? \"loading-state\" : \"error-state\"}`,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateContent,\n children: [inlineStateIsLoading ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateSpinner,\n \"aria-hidden\": \"true\"\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"i\", {\n className: `bi bi-exclamation-circle-fill ${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateErrorIcon}`,\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateTitle,\n children: inlineStateIsLoading ? \"Loading assistant\" : \"Assistant unavailable\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateText,\n children: inlineStateIsLoading ? \"Preparing the chat experience.\" : \"We could not load this chatbot right now. Please try again later.\"\n })]\n })\n })\n }), !isInlineLayout && isConfigReady && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_13__.m.div, {\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotVariants,\n animate: chatbotMinimized ? \"show\" : \"hide\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotCircleContainer,\n part: \"launcher\",\n \"aria-hidden\": !chatbotMinimized,\n children: [!chatbotPopupMinimized && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_13__.m.div, {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupShell,\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotContentVariants,\n part: \"launcher-popup\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].closePopup,\n onClick: () => setChatbotPopupMinimized(true),\n \"aria-label\": \"Dismiss popup\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"i\", {\n className: \"bi bi-x-circle-fill\",\n \"aria-hidden\": \"true\"\n })\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupContainer,\n onClick: handleChatbotAnimation,\n \"aria-label\": chatbotConfig?.data?.popup_body_text,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popup,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupContent,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n children: chatbotConfig?.data?.popup_body_text\n })\n })\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_13__.m.div, {\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotContentVariants,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotCircle,\n onClick: handleChatbotAnimation,\n part: \"launcher-button\",\n children: chatbotIcon && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"img\", {\n src: chatbotIcon,\n loading: \"lazy\",\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotIcon\n })\n })\n })]\n })]\n })\n })\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Chatbot);\n\n//# sourceURL=webpack://VamChatbot/./Chatbot.jsx?");
|
|
29
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ applySupportRedirects: () => (/* binding */ applySupportRedirects),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getWhatsappSupportRedirect: () => (/* binding */ getWhatsappSupportRedirect),\n/* harmony export */ responseMatchesWhatsappTrigger: () => (/* binding */ responseMatchesWhatsappTrigger),\n/* harmony export */ shouldSuppressFeedbackForCurrentAnswer: () => (/* binding */ shouldSuppressFeedbackForCurrentAnswer)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/dom/features-animation.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/components/m/proxy.mjs\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _components_ChatbotHeader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/ChatbotHeader */ \"./components/ChatbotHeader.jsx\");\n/* harmony import */ var _components_ChatbotBody__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/ChatbotBody */ \"./components/ChatbotBody.jsx\");\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _utils_variants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/variants */ \"./utils/variants.js\");\n/* harmony import */ var _utils_useClickHandler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/useClickHandler */ \"./utils/useClickHandler.js\");\n/* harmony import */ var _utils_defaults__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/defaults */ \"./utils/defaults.js\");\n/* harmony import */ var _utils_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/config */ \"./utils/config.js\");\n/* harmony import */ var _utils_sseClient__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/sseClient */ \"./utils/sseClient.js\");\n/* harmony import */ var _utils_supportRedirects__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/supportRedirects */ \"./utils/supportRedirects.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* \n- valid chatbot states:\n 0: \"at rest\",\n 1: \"waiting for response from api\"\n 2: \"receiving response from api\"\n*/\n\nconst fixSpecialLLMChars = text => {\n // forward slash is replaced by <|slash|> in the response from the api\n return text.replace(/\\u003c\\|slash\\|\\u003e/g, \"/\");\n};\nconst normalizeResponseText = text => {\n if (typeof text !== \"string\") return \"\";\n return fixSpecialLLMChars(text);\n};\nconst normalizeAuthToken = value => {\n if (typeof value !== \"string\") return \"\";\n return value.trim();\n};\nconst normalizeLayout = layout => layout === \"inline\" ? \"inline\" : \"floating\";\nconst CHATBOT_CONFIG_STATUS = {\n LOADING: \"loading\",\n READY: \"ready\",\n ERROR: \"error\"\n};\nconst frequencySupportRedirectChannels = [\"telegram\"];\nconst defaultWhatsappTriggerKeywords = [\"please try again later\", \"i am only able to answer questions related to brentford\", \"i could not find information about that\", \"feel free to ask me other questions\", \"i only answer Brentford\", \"i couldn't find that in our current sources\"];\nconst getFrequencySupportRedirects = (externalRedirectMetadata, botMessageCount) => {\n return frequencySupportRedirectChannels.reduce((redirects, channel) => {\n const channelConfig = externalRedirectMetadata?.[channel];\n const triggerFrequency = Number(channelConfig?.trigger_message_frequency);\n const redirectUrl = channelConfig?.redirect_url;\n if (triggerFrequency > 0 && redirectUrl && botMessageCount % triggerFrequency === 0) {\n redirects.push((0,_utils_supportRedirects__WEBPACK_IMPORTED_MODULE_9__.createSupportRedirect)(channel, channelConfig));\n }\n return redirects;\n }, []);\n};\nconst getWhatsappTriggerKeywords = channelConfig => {\n const configuredKeywords = Array.isArray(channelConfig?.trigger_keywords) ? channelConfig.trigger_keywords : [];\n const keywords = configuredKeywords.length > 0 ? configuredKeywords : defaultWhatsappTriggerKeywords;\n return keywords.filter(keyword => typeof keyword === \"string\").map(keyword => keyword.trim().toLowerCase()).filter(Boolean);\n};\nconst responseMatchesWhatsappTrigger = (responseText, channelConfig) => {\n const normalizedResponseText = typeof responseText === \"string\" ? responseText.toLowerCase() : \"\";\n if (!normalizedResponseText) return false;\n return getWhatsappTriggerKeywords(channelConfig).some(keyword => normalizedResponseText.includes(keyword));\n};\nconst getWhatsappSupportRedirect = (externalRedirectMetadata, responseText, whatsappMatchCountRef) => {\n const channelConfig = externalRedirectMetadata?.whatsapp;\n if (!channelConfig?.redirect_url) return null;\n if (!responseMatchesWhatsappTrigger(responseText, channelConfig)) return null;\n whatsappMatchCountRef.current += 1;\n const configuredTriggerMatchCount = Number(channelConfig?.trigger_match_count);\n const triggerMatchCount = configuredTriggerMatchCount > 0 ? configuredTriggerMatchCount : 2;\n if (whatsappMatchCountRef.current % triggerMatchCount !== 0) return null;\n return (0,_utils_supportRedirects__WEBPACK_IMPORTED_MODULE_9__.createSupportRedirect)(\"whatsapp\", channelConfig);\n};\nconst applySupportRedirects = function (messageData, externalRedirectMetadata, botMessageCount) {\n let additionalRedirects = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const supportRedirects = [...getFrequencySupportRedirects(externalRedirectMetadata, botMessageCount), ...additionalRedirects.filter(Boolean)];\n if (supportRedirects.length > 0) {\n messageData.showSupportButton = true;\n messageData.supportUrl = supportRedirects[0].url;\n messageData.supportChannel = supportRedirects[0].channel;\n messageData.supportRedirects = supportRedirects;\n }\n};\nconst shouldSuppressFeedbackForCurrentAnswer = _ref => {\n let {\n dismissed,\n submitted\n } = _ref;\n return Boolean(dismissed || submitted);\n};\nconst resolveAuthToken = async _ref2 => {\n let {\n authToken,\n authTokenProvider\n } = _ref2;\n if (typeof authTokenProvider === \"function\") {\n const providedToken = await authTokenProvider();\n const normalizedToken = normalizeAuthToken(providedToken);\n if (normalizedToken) return normalizedToken;\n }\n return normalizeAuthToken(authToken);\n};\nconst randomId = () => {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n } catch (e) {}\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n};\nfunction Chatbot(_ref3) {\n let {\n clientId,\n onTrackEvent,\n authToken,\n authTokenProvider,\n layout = \"floating\"\n } = _ref3;\n const [messageList, setMessageList] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n const [inputText, setInputText] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const [chatbotState, setChatbotState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n const [chatbotMinimized, setChatbotMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [chatbotPopupMinimized, setChatbotPopupMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [promptsData, setPromptsData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n show: true,\n prompts: []\n });\n const [promptsMinimized, setPromptsMinimized] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [chatbotConfig, setChatbotConfig] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n status: CHATBOT_CONFIG_STATUS.LOADING,\n data: {}\n });\n const [chatbotIcon, setChatbotIcon] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [feedbackPrompt, setFeedbackPrompt] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const defaultMessageList = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const conversationIdRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(randomId());\n const streamAbortRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const pendingFeedbackRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const latestFeedbackPayloadRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const feedbackInactivityTimerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const feedbackSubmittedForCurrentAnswerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const feedbackDismissedForCurrentAnswerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const whatsappMatchCountRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const conversationRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const userScrolledUpRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const chatbotRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chatbotStateRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(chatbotState);\n const chatbotMinimizedRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(chatbotMinimized);\n const feedbackPromptVisibleRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const normalizedLayout = normalizeLayout(layout);\n const isInlineLayout = normalizedLayout === \"inline\";\n const isConfigReady = chatbotConfig?.status === CHATBOT_CONFIG_STATUS.READY;\n\n // Use the custom hook to track clicks\n (0,_utils_useClickHandler__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(onTrackEvent, chatbotRef);\n const getFeedbackInactivityMs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const feedbackConfig = chatbotConfig?.data?.external_redirect_metadata?.internal_feedback;\n if (!feedbackConfig) return 0;\n const inactivitySeconds = Number(feedbackConfig?.inactivity_seconds);\n const seconds = inactivitySeconds > 0 ? inactivitySeconds : 60;\n return seconds * 1000;\n }, [chatbotConfig?.data?.external_redirect_metadata]);\n const clearFeedbackInactivityTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (feedbackInactivityTimerRef.current) {\n clearTimeout(feedbackInactivityTimerRef.current);\n feedbackInactivityTimerRef.current = null;\n }\n }, []);\n const resetFeedbackInactivityTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n let {\n hidePrompt = true\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n clearFeedbackInactivityTimer();\n if (hidePrompt) {\n feedbackPromptVisibleRef.current = false;\n setFeedbackPrompt(null);\n }\n const inactivityMs = getFeedbackInactivityMs();\n if (!inactivityMs) return;\n if (shouldSuppressFeedbackForCurrentAnswer({\n dismissed: feedbackDismissedForCurrentAnswerRef.current,\n submitted: feedbackSubmittedForCurrentAnswerRef.current\n })) {\n return;\n }\n feedbackInactivityTimerRef.current = setTimeout(() => {\n if (!latestFeedbackPayloadRef.current) return;\n if (shouldSuppressFeedbackForCurrentAnswer({\n dismissed: feedbackDismissedForCurrentAnswerRef.current,\n submitted: feedbackSubmittedForCurrentAnswerRef.current\n })) {\n return;\n }\n if (chatbotStateRef.current !== 0) {\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n return;\n }\n if (!isInlineLayout && chatbotMinimizedRef.current) return;\n if (feedbackPromptVisibleRef.current) return;\n feedbackPromptVisibleRef.current = true;\n setFeedbackPrompt({\n show: true,\n payload: {\n ...latestFeedbackPayloadRef.current\n }\n });\n }, inactivityMs);\n }, [clearFeedbackInactivityTimer, getFeedbackInactivityMs, isInlineLayout]);\n const handleFeedbackDismiss = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n feedbackPromptVisibleRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = true;\n clearFeedbackInactivityTimer();\n setFeedbackPrompt(null);\n }, [clearFeedbackInactivityTimer]);\n const handleFeedbackSubmitted = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n feedbackPromptVisibleRef.current = true;\n feedbackSubmittedForCurrentAnswerRef.current = true;\n feedbackDismissedForCurrentAnswerRef.current = false;\n clearFeedbackInactivityTimer();\n setFeedbackPrompt(currentPrompt => currentPrompt ? {\n ...currentPrompt,\n submitted: true\n } : currentPrompt);\n }, [clearFeedbackInactivityTimer]);\n const getFreshFeedbackToken = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async _ref4 => {\n let {\n chatbotBaseUrl\n } = _ref4;\n if (!chatbotBaseUrl) return \"\";\n const token = await resolveAuthToken({\n authToken,\n authTokenProvider\n });\n const pagePath = typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\n const session = await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.mintChatbotSessionToken)({\n chatbotBaseUrl,\n authToken: token,\n pagePath\n });\n return session?.token || \"\";\n }, [authToken, authTokenProvider]);\n const setChatbotStateValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(nextState => {\n chatbotStateRef.current = nextState;\n setChatbotState(nextState);\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n chatbotStateRef.current = chatbotState;\n }, [chatbotState]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n chatbotMinimizedRef.current = chatbotMinimized;\n }, [chatbotMinimized]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n feedbackPromptVisibleRef.current = Boolean(feedbackPrompt?.show);\n }, [feedbackPrompt?.show]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n clearFeedbackInactivityTimer();\n };\n }, [clearFeedbackInactivityTimer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isConfigReady && (isInlineLayout || !chatbotMinimized)) {\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n } else {\n clearFeedbackInactivityTimer();\n }\n }, [chatbotMinimized, clearFeedbackInactivityTimer, isConfigReady, isInlineLayout, resetFeedbackInactivityTimer]);\n\n // use effect to upate the css variables once available through the chatbot config API\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n try {\n if (chatbotConfig?.data?.styles?.css_variables) {\n const chatbotParent = chatbotRef.current;\n if (!chatbotParent) return;\n for (let variable in chatbotConfig.data.styles.css_variables) {\n chatbotParent.style.setProperty(`--${variable}`, chatbotConfig.data.styles.css_variables[variable]);\n }\n }\n } catch (error) {\n console.log(error);\n }\n }, [chatbotConfig?.data?.styles?.css_variables]);\n\n // useeffect to store the chatbot icon when its url is fetched from the chatbot config API\n // this is to prevent the api call being made on render of every message\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n try {\n if (chatbotConfig?.data?.icon_url) {\n const fetchChatbotIcon = async () => {\n let url = chatbotConfig?.data?.icon_url;\n let apiResponse = await (0,axios__WEBPACK_IMPORTED_MODULE_11__[\"default\"])({\n url,\n method: \"GET\",\n responseType: \"blob\"\n });\n let imageBlob = apiResponse.data;\n if (imageBlob) {\n let imageObjectURL = URL.createObjectURL(imageBlob);\n setChatbotIcon(imageObjectURL);\n }\n };\n fetchChatbotIcon();\n }\n } catch (error) {\n console.log(error);\n }\n }, [chatbotConfig?.data?.icon_url]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const fetchConfigData = async () => {\n // Check if configUrl is null and handle appropriately\n if (!_utils_config__WEBPACK_IMPORTED_MODULE_7__.configUrl) {\n console.error(\"Chatbot config URL is not set. Please provide CHATBOT_DEV_URL or CHATBOT_PROD_URL environment variables.\");\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n return;\n }\n const url = `${_utils_config__WEBPACK_IMPORTED_MODULE_7__.configUrl}/api/getBotConfig`;\n const method = \"POST\";\n const requestBody = {\n clientId\n };\n try {\n let apiResponse = await (0,axios__WEBPACK_IMPORTED_MODULE_11__[\"default\"])({\n url,\n method,\n data: requestBody\n });\n if (apiResponse?.data) {\n let data = apiResponse.data;\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.READY,\n data\n });\n setPromptsData(data?.default_prompts || {\n show: false,\n prompts: []\n });\n setMessageList(data?.default_message_list || []);\n defaultMessageList.current = data?.default_message_list || [];\n } else {\n // handle no data here\n console.log(\"no data found for the provided client id: \", clientId);\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n }\n } catch (e) {\n console.error(e);\n setChatbotConfig({\n status: CHATBOT_CONFIG_STATUS.ERROR,\n data: {}\n });\n // handle api failure here\n }\n };\n fetchConfigData();\n }, [clientId]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n streamAbortRef.current?.abort?.();\n };\n }, []);\n const scrollConversationToEnd = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n let {\n force = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!force && userScrolledUpRef.current) return;\n const conversation = conversationRef.current;\n if (!conversation) return;\n conversation.scrollTo({\n top: conversation.scrollHeight,\n behavior: \"smooth\"\n });\n }, []);\n\n // scroll to the latest message whenever the content updates.\n // Message updates respect manual scroll during streaming; feedback prompt\n // visibility force-scrolls because it is inserted after the latest answer.\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n scrollConversationToEnd({\n force: Boolean(feedbackPrompt?.show)\n });\n }, [feedbackPrompt?.show, messageList, scrollConversationToEnd]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!feedbackPrompt?.show) return;\n const scrollFrame = window.requestAnimationFrame(() => {\n scrollConversationToEnd({\n force: true\n });\n });\n return () => window.cancelAnimationFrame(scrollFrame);\n }, [feedbackPrompt?.show, scrollConversationToEnd]);\n\n // detects when the user scrolls up during streaming and disables auto-scroll\n const handleUserScroll = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {\n if (chatbotState !== 2) return;\n const el = e.target;\n const threshold = 30;\n const isAtBottom = el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n if (!isAtBottom) {\n userScrolledUpRef.current = true;\n }\n }, [chatbotState]);\n const handleStreamEnvelope = env => {\n try {\n let {\n status,\n data\n } = env || {};\n let {\n response,\n sources,\n image_links,\n promoted_topics\n } = data || {};\n const activeFeedbackPayload = pendingFeedbackRef.current;\n const normalizedResponse = normalizeResponseText(response);\n const normalizedSources = sources?.map(fixSpecialLLMChars);\n const normalizedImageLinks = image_links?.map(fixSpecialLLMChars);\n const normalizedPromotedTopics = promoted_topics?.filter(item => item?.title);\n const promotedImageLinks = normalizedPromotedTopics?.map(pt => pt?.image_link)?.filter(Boolean)?.map(fixSpecialLLMChars);\n if (status === \"streaming\") {\n // set the chatbot state to \"receiving response\" and initialize the response\n setChatbotStateValue(2);\n if (normalizedResponse) {\n setMessageList(prevList => {\n let responseList = [...prevList];\n try {\n let latestMessage = prevList.slice(-1)[0];\n if (latestMessage?.status === \"streaming\") {\n latestMessage.data.text = normalizedResponse;\n } else {\n let responseMessage = {\n source: \"bot\",\n data: {\n text: normalizedResponse,\n feedbackPayload: activeFeedbackPayload ? {\n ...activeFeedbackPayload\n } : undefined\n },\n origin: \"server\",\n status: \"streaming\"\n };\n responseList = [...responseList, responseMessage];\n }\n } catch (error) {}\n return responseList;\n });\n }\n } else if (status === \"done\") {\n const finalResponseText = normalizedResponse || _utils_defaults__WEBPACK_IMPORTED_MODULE_6__.errorResponse;\n const finalFeedbackPayload = activeFeedbackPayload ? {\n ...activeFeedbackPayload,\n assistantResponse: finalResponseText\n } : undefined;\n const externalRedirectMetadata = chatbotConfig?.data?.external_redirect_metadata;\n const whatsappSupportRedirect = getWhatsappSupportRedirect(externalRedirectMetadata, finalResponseText, whatsappMatchCountRef);\n if (finalFeedbackPayload) {\n latestFeedbackPayloadRef.current = finalFeedbackPayload;\n feedbackSubmittedForCurrentAnswerRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = false;\n }\n setChatbotStateValue(0);\n // re-enable auto-scroll for the next answer\n userScrolledUpRef.current = false;\n\n // update the status as done for the last message\n setMessageList(prevList => {\n let responseList = [...prevList];\n try {\n let latestMessage = responseList.slice(-1)[0];\n if (latestMessage?.source !== \"user\") {\n latestMessage.status = \"done\";\n latestMessage.data.text = finalResponseText;\n latestMessage.data.sources = normalizedSources;\n latestMessage.data.image_links = promotedImageLinks?.length > 0 ? promotedImageLinks : normalizedImageLinks;\n latestMessage.data.promoted_topics = normalizedPromotedTopics;\n latestMessage.data.feedbackPayload = finalFeedbackPayload;\n\n // Logic to show support redirects at their configured frequency\n const botMessageCount = responseList.filter(msg => msg.source === \"bot\" && msg.origin === \"server\").length;\n applySupportRedirects(latestMessage.data, externalRedirectMetadata, botMessageCount, [whatsappSupportRedirect]);\n } else {\n let responseMessage = {\n source: \"bot\",\n data: {\n text: finalResponseText,\n sources: normalizedSources,\n image_links: promotedImageLinks?.length > 0 ? promotedImageLinks : normalizedImageLinks,\n promoted_topics: normalizedPromotedTopics,\n feedbackPayload: finalFeedbackPayload\n },\n origin: \"server\",\n status: \"done\"\n };\n const nextBotMessageCount = responseList.filter(msg => msg.source === \"bot\" && msg.origin === \"server\").length + 1;\n applySupportRedirects(responseMessage.data, externalRedirectMetadata, nextBotMessageCount, [whatsappSupportRedirect]);\n responseList = [...responseList, responseMessage];\n }\n } catch (error) {}\n return responseList;\n });\n pendingFeedbackRef.current = null;\n resetFeedbackInactivityTimer();\n }\n } catch (error) {}\n };\n\n // to keep the input field in focus and scroll to the latest message\n // when the enter button is clicked.\n // const focusInput = () => {\n // inputRef.current.focus();\n // };\n\n // to handle the minimize/maximize animation of the chatbot.\n const handleChatbotAnimation = () => {\n const nextMinimized = !chatbotMinimized;\n chatbotMinimizedRef.current = nextMinimized;\n setChatbotMinimized(nextMinimized);\n if (nextMinimized) {\n clearFeedbackInactivityTimer();\n } else {\n resetFeedbackInactivityTimer();\n }\n };\n\n // to reset the chatbot content.\n const resetChatbot = () => {\n try {\n streamAbortRef.current?.abort?.();\n streamAbortRef.current = null;\n pendingFeedbackRef.current = null;\n latestFeedbackPayloadRef.current = null;\n feedbackSubmittedForCurrentAnswerRef.current = false;\n feedbackDismissedForCurrentAnswerRef.current = false;\n whatsappMatchCountRef.current = 0;\n feedbackPromptVisibleRef.current = false;\n conversationIdRef.current = randomId();\n setMessageList(defaultMessageList.current);\n setPromptsData(prevData => {\n return {\n ...prevData,\n show: true\n };\n });\n setPromptsMinimized(true);\n setChatbotStateValue(0);\n setInputText(\"\");\n setFeedbackPrompt(null);\n resetFeedbackInactivityTimer({\n hidePrompt: false\n });\n } catch (error) {}\n };\n const handleInput = event => {\n try {\n setInputText(event.target.value);\n resetFeedbackInactivityTimer();\n } catch (error) {}\n };\n const getChatHistory = messages => {\n let response = [];\n try {\n let historyItem = {\n user: \"\",\n assistant: \"\"\n };\n for (let message of messages || []) {\n if (message.source === \"user\") {\n historyItem.user = message?.data?.text;\n } else if (message.source === \"bot\" && message.origin === \"server\") {\n if (message?.status === \"done\") {\n historyItem.assistant = message?.data?.text;\n response.push(historyItem);\n historyItem = {\n user: \"\",\n assistant: \"\"\n };\n }\n }\n }\n } catch (error) {\n console.log(error);\n } finally {\n return response;\n }\n };\n const getPromotionsShown = messages => {\n const out = [];\n try {\n let pendingUserSeen = false;\n for (let message of messages || []) {\n if (message.source === \"user\") {\n pendingUserSeen = true;\n continue;\n }\n if (!pendingUserSeen) continue;\n if (message.source === \"bot\" && message.origin === \"server\" && message.status === \"done\") {\n const titles = (message?.data?.promoted_topics || []).map(t => t?.title).filter(t => typeof t === \"string\" && t.trim().length > 0);\n out.push(titles);\n pendingUserSeen = false;\n }\n }\n } catch (error) {}\n return out;\n };\n const startNewStream = async (prompt, prevMessages) => {\n const chatbotBaseUrl = chatbotConfig?.data?.chatbot_url || chatbotConfig?.data?.chatbotUrl;\n if (!chatbotBaseUrl) {\n throw new Error(\"chatbot_url missing from config\");\n }\n streamAbortRef.current?.abort?.();\n const abortController = new AbortController();\n streamAbortRef.current = abortController;\n resetFeedbackInactivityTimer();\n let chatHistory = getChatHistory(prevMessages);\n let promotionsShown = getPromotionsShown(prevMessages);\n if (chatHistory.length > 40) {\n const start = chatHistory.length - 40;\n chatHistory = chatHistory.slice(start);\n promotionsShown = promotionsShown.slice(start);\n }\n const messageId = randomId();\n const token = await resolveAuthToken({\n authToken,\n authTokenProvider\n });\n const pagePath = typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\n const session = await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.mintChatbotSessionToken)({\n chatbotBaseUrl,\n authToken: token,\n pagePath,\n signal: abortController.signal\n });\n if (!session?.token) {\n throw new Error(\"missing session token\");\n }\n const conversationID = conversationIdRef.current;\n const feedbackChatHistory = chatHistory.slice(-5);\n pendingFeedbackRef.current = {\n chatbotBaseUrl,\n token: session.token,\n messageID: messageId,\n conversationID,\n userQuery: prompt,\n chatHistory: feedbackChatHistory\n };\n await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_8__.streamChatbotSse)({\n chatbotBaseUrl,\n token: session.token,\n body: {\n chatHistory,\n conversationId: conversationID,\n message: prompt,\n messageId,\n promotionsShown\n },\n signal: abortController.signal,\n onEnvelope: handleStreamEnvelope\n });\n };\n const handleSubmit = async function () {\n let prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n let typewriterEffect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!prompt) {\n prompt = inputText;\n } else {\n typewriterEffect = true;\n }\n try {\n prompt = prompt.trim();\n if (prompt) {\n const prevMessages = messageList;\n resetFeedbackInactivityTimer();\n setChatbotStateValue(1);\n\n // put the user's prompt in the chat\n let userMessage = {\n source: \"user\",\n data: {\n text: prompt\n },\n status: \"done\",\n typewriterEffect\n };\n setMessageList(prevList => [...prevList, userMessage]);\n\n // hide the default prompts\n setPromptsData({\n ...promptsData,\n show: false\n });\n\n // clear the input field\n setInputText(\"\");\n await startNewStream(prompt, prevMessages);\n }\n } catch (error) {\n if (error?.name === \"AbortError\") {\n return;\n }\n console.error(\"Error sending chat message:\", error);\n setChatbotStateValue(0);\n setMessageList(prevList => [...prevList, {\n source: \"error\",\n data: {\n text: _utils_defaults__WEBPACK_IMPORTED_MODULE_6__.errorResponse\n },\n status: \"done\"\n }]);\n }\n };\n const chatbotParentClassName = `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotParent} ${isInlineLayout ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineChatbotParent : \"\"}`;\n const chatbotContainerClassName = `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotContainer} ${isInlineLayout ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineChatbotContainer : \"\"}`;\n const chatbotContainerAnimationProps = isInlineLayout ? {} : {\n animate: chatbotMinimized ? \"hide\" : \"show\",\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.maximizedChatbotVariants\n };\n const shouldRenderInlineState = isInlineLayout && !isConfigReady;\n const inlineStateIsLoading = chatbotConfig?.status === CHATBOT_CONFIG_STATUS.LOADING;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.Fragment, {\n children: (isConfigReady || shouldRenderInlineState) && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: chatbotParentClassName,\n ref: chatbotRef,\n part: \"root\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_12__.LazyMotion, {\n features: framer_motion__WEBPACK_IMPORTED_MODULE_13__.domAnimation,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_14__.m.div, {\n initial: false,\n className: chatbotContainerClassName,\n part: \"panel\",\n \"aria-hidden\": !isInlineLayout && chatbotMinimized,\n ...chatbotContainerAnimationProps,\n children: isConfigReady ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.Fragment, {\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_ChatbotHeader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n headerText: chatbotConfig?.data?.header_text,\n setPromptsMinimized: setPromptsMinimized,\n handleChatbotAnimation: handleChatbotAnimation,\n resetChatbot: resetChatbot,\n showCloseButton: !isInlineLayout\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_ChatbotBody__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n messageList: messageList,\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n chatbotState: chatbotState,\n conversationRef: conversationRef,\n promptsMinimized: promptsMinimized,\n setPromptsMinimized: setPromptsMinimized,\n inputRef: inputRef,\n inputText: inputText,\n handleInput: handleInput,\n placeholderInputText: chatbotConfig?.data?.placeholder_input_text,\n footerDisclaimerText: chatbotConfig?.data?.footer_disclaimer_text,\n chatbotIcon: chatbotIcon,\n onConversationScroll: handleUserScroll,\n feedbackPrompt: feedbackPrompt,\n getFeedbackToken: getFreshFeedbackToken,\n onFeedbackDismiss: handleFeedbackDismiss,\n onFeedbackSubmitted: handleFeedbackSubmitted,\n whatsappHandoffConfig: chatbotConfig?.data?.external_redirect_metadata?.whatsapp\n })]\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateSurface,\n part: `body inline-state ${inlineStateIsLoading ? \"loading-state\" : \"error-state\"}`,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateContent,\n children: [inlineStateIsLoading ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateSpinner,\n \"aria-hidden\": \"true\"\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"i\", {\n className: `bi bi-exclamation-circle-fill ${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateErrorIcon}`,\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateTitle,\n children: inlineStateIsLoading ? \"Loading assistant\" : \"Assistant unavailable\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].inlineStateText,\n children: inlineStateIsLoading ? \"Preparing the chat experience.\" : \"We could not load this chatbot right now. Please try again later.\"\n })]\n })\n })\n }), !isInlineLayout && isConfigReady && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_14__.m.div, {\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotVariants,\n animate: chatbotMinimized ? \"show\" : \"hide\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotCircleContainer,\n part: \"launcher\",\n \"aria-hidden\": !chatbotMinimized,\n children: [!chatbotPopupMinimized && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_14__.m.div, {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupShell,\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotContentVariants,\n part: \"launcher-popup\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"button\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].closePopup,\n onClick: () => setChatbotPopupMinimized(true),\n \"aria-label\": \"Dismiss popup\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"i\", {\n className: \"bi bi-x-circle-fill\",\n \"aria-hidden\": \"true\"\n })\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupContainer,\n onClick: handleChatbotAnimation,\n \"aria-label\": chatbotConfig?.data?.popup_body_text,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popup,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].popupContent,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"span\", {\n children: chatbotConfig?.data?.popup_body_text\n })\n })\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_14__.m.div, {\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_4__.minimizedChatbotContentVariants,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotCircle,\n onClick: handleChatbotAnimation,\n part: \"launcher-button\",\n children: chatbotIcon && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"img\", {\n src: chatbotIcon,\n loading: \"lazy\",\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_3__[\"default\"].chatbotIcon\n })\n })\n })]\n })]\n })\n })\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Chatbot);\n\n//# sourceURL=webpack://VamChatbot/./Chatbot.jsx?");
|
|
30
30
|
|
|
31
31
|
/***/ }),
|
|
32
32
|
|
|
@@ -70,7 +70,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
70
70
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
71
71
|
|
|
72
72
|
"use strict";
|
|
73
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/dom/features-animation.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/components/m/proxy.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs\");\n/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Message */ \"./components/Message.jsx\");\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _AnimatedTextPlaceholder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AnimatedTextPlaceholder */ \"./components/AnimatedTextPlaceholder.jsx\");\n/* harmony import */ var _utils_variants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/variants */ \"./utils/variants.js\");\n/* harmony import */ var _Prompts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Prompts */ \"./components/Prompts.jsx\");\n/* harmony import */ var _ChatbotFooter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ChatbotFooter */ \"./components/ChatbotFooter.jsx\");\n/* harmony import */ var _FeedbackForm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FeedbackForm */ \"./components/FeedbackForm.jsx\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\nfunction ChatbotBody(_ref) {\n let {\n messageList,\n promptsData,\n handleSubmit,\n chatbotState,\n conversationRef,\n promptsMinimized,\n setPromptsMinimized,\n inputRef,\n inputText,\n handleInput,\n placeholderInputText,\n footerDisclaimerText,\n chatbotIcon,\n onConversationScroll,\n feedbackPrompt,\n getFeedbackToken,\n onFeedbackDismiss,\n onFeedbackSubmitted\n } = _ref;\n const hasUserStartedChat = messageList.some(message => message?.source === \"user\");\n const showFooterSuggestedQuestions = hasUserStartedChat && Boolean(promptsData?.prompts?.length);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_8__.LazyMotion, {\n features: framer_motion__WEBPACK_IMPORTED_MODULE_9__.domAnimation,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].body,\n part: \"body\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_10__.m.div, {\n ref: conversationRef,\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_3__.chatbotContentVariants,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].conversation,\n onScroll: onConversationScroll,\n part: \"conversation\",\n children: [messageList.map((message, index) => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_Message__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n chatbotIcon: chatbotIcon,\n messageText: message?.data?.text,\n messageReferenceLinks: message?.data?.sources,\n messageImageLinks: message?.data?.image_links,\n messageSource: message?.source,\n messageStatus: message?.status,\n promotedTopics: message?.data?.promoted_topics,\n typewriterEffect: message?.typewriterEffect,\n showSupportButton: message?.data?.showSupportButton,\n supportUrl: message?.data?.supportUrl,\n supportChannel: message?.data?.supportChannel,\n supportRedirects: message?.data?.supportRedirects,\n showFeedbackForm: message?.data?.showFeedbackForm,\n feedbackPayload: message?.data?.feedbackPayload\n }, `message-${index}`)), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].bodyPromptsContainer,\n style: {\n display: promptsData?.show ? \"block\" : \"none\"\n },\n part: \"prompts\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_Prompts__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n setPromptsMinimized: setPromptsMinimized\n })\n }), chatbotState === 1 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].message,\n part: \"message bot-message\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n src: chatbotIcon,\n loading: \"lazy\",\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].chatbotIcon,\n part: \"message-avatar\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: \"w-100\",\n part: \"message-bubble\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_AnimatedTextPlaceholder__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n theme: \"dark\"\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_11__.AnimatePresence, {\n initial: false,\n children: feedbackPrompt?.show && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_10__.m.div, {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelContainer,\n part: \"feedback-panel\",\n initial: {\n opacity: 0,\n y: 8\n },\n animate: {\n opacity: 1,\n y: 0\n },\n exit: {\n opacity: 0,\n y: 8\n },\n transition: {\n duration: 0.18,\n ease: \"easeOut\"\n },\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanel,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelActions,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelClose,\n onClick: onFeedbackDismiss,\n \"aria-label\": \"Dismiss feedback\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"i\", {\n className: \"bi bi-x-lg\",\n \"aria-hidden\": \"true\"\n })\n })\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_FeedbackForm__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n feedbackPayload: feedbackPrompt.payload,\n showDivider: false,\n getFeedbackToken: getFeedbackToken,\n onCancel: onFeedbackDismiss,\n onSubmitted: onFeedbackSubmitted\n })]\n })\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ChatbotFooter__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n setPromptsMinimized: setPromptsMinimized,\n promptsMinimized: promptsMinimized,\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n chatbotState: chatbotState,\n inputRef: inputRef,\n inputText: inputText,\n handleInput: handleInput,\n placeholderInputText: placeholderInputText,\n footerDisclaimerText: footerDisclaimerText,\n showFooterSuggestedQuestions: showFooterSuggestedQuestions\n })]\n })\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatbotBody);\n\n//# sourceURL=webpack://VamChatbot/./components/ChatbotBody.jsx?");
|
|
73
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/dom/features-animation.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/render/components/m/proxy.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! framer-motion */ \"./node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs\");\n/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Message */ \"./components/Message.jsx\");\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _AnimatedTextPlaceholder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AnimatedTextPlaceholder */ \"./components/AnimatedTextPlaceholder.jsx\");\n/* harmony import */ var _utils_variants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/variants */ \"./utils/variants.js\");\n/* harmony import */ var _Prompts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Prompts */ \"./components/Prompts.jsx\");\n/* harmony import */ var _ChatbotFooter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ChatbotFooter */ \"./components/ChatbotFooter.jsx\");\n/* harmony import */ var _FeedbackForm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FeedbackForm */ \"./components/FeedbackForm.jsx\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\nfunction ChatbotBody(_ref) {\n let {\n messageList,\n promptsData,\n handleSubmit,\n chatbotState,\n conversationRef,\n promptsMinimized,\n setPromptsMinimized,\n inputRef,\n inputText,\n handleInput,\n placeholderInputText,\n footerDisclaimerText,\n chatbotIcon,\n onConversationScroll,\n feedbackPrompt,\n getFeedbackToken,\n onFeedbackDismiss,\n onFeedbackSubmitted,\n whatsappHandoffConfig\n } = _ref;\n const hasUserStartedChat = messageList.some(message => message?.source === \"user\");\n const showFooterSuggestedQuestions = hasUserStartedChat && Boolean(promptsData?.prompts?.length);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_8__.LazyMotion, {\n features: framer_motion__WEBPACK_IMPORTED_MODULE_9__.domAnimation,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].body,\n part: \"body\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(framer_motion__WEBPACK_IMPORTED_MODULE_10__.m.div, {\n ref: conversationRef,\n variants: _utils_variants__WEBPACK_IMPORTED_MODULE_3__.chatbotContentVariants,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].conversation,\n onScroll: onConversationScroll,\n part: \"conversation\",\n children: [messageList.map((message, index) => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_Message__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n chatbotIcon: chatbotIcon,\n messageText: message?.data?.text,\n messageReferenceLinks: message?.data?.sources,\n messageImageLinks: message?.data?.image_links,\n messageSource: message?.source,\n messageStatus: message?.status,\n promotedTopics: message?.data?.promoted_topics,\n typewriterEffect: message?.typewriterEffect,\n showSupportButton: message?.data?.showSupportButton,\n supportUrl: message?.data?.supportUrl,\n supportChannel: message?.data?.supportChannel,\n supportRedirects: message?.data?.supportRedirects,\n showFeedbackForm: message?.data?.showFeedbackForm,\n feedbackPayload: message?.data?.feedbackPayload,\n showResponseRating: message?.source === \"bot\" && message?.origin === \"server\" && message?.status === \"done\" && Boolean(message?.data?.feedbackPayload),\n getFeedbackToken: getFeedbackToken,\n whatsappHandoffConfig: whatsappHandoffConfig\n }, `message-${index}`)), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].bodyPromptsContainer,\n style: {\n display: promptsData?.show ? \"block\" : \"none\"\n },\n part: \"prompts\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_Prompts__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n setPromptsMinimized: setPromptsMinimized\n })\n }), chatbotState === 1 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].message,\n part: \"message bot-message\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n src: chatbotIcon,\n loading: \"lazy\",\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].chatbotIcon,\n part: \"message-avatar\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: \"w-100\",\n part: \"message-bubble\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_AnimatedTextPlaceholder__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n theme: \"dark\"\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_11__.AnimatePresence, {\n initial: false,\n children: feedbackPrompt?.show && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(framer_motion__WEBPACK_IMPORTED_MODULE_10__.m.div, {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelContainer,\n part: \"feedback-panel\",\n initial: {\n opacity: 0,\n y: 8\n },\n animate: {\n opacity: 1,\n y: 0\n },\n exit: {\n opacity: 0,\n y: 8\n },\n transition: {\n duration: 0.18,\n ease: \"easeOut\"\n },\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanel,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelActions,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackPanelClose,\n onClick: onFeedbackDismiss,\n \"aria-label\": \"Dismiss feedback\",\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"i\", {\n className: \"bi bi-x-lg\",\n \"aria-hidden\": \"true\"\n })\n })\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_FeedbackForm__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n feedbackPayload: feedbackPrompt.payload,\n showDivider: false,\n getFeedbackToken: getFeedbackToken,\n onCancel: onFeedbackDismiss,\n onSubmitted: onFeedbackSubmitted,\n whatsappHandoffConfig: whatsappHandoffConfig\n })]\n })\n })\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ChatbotFooter__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n setPromptsMinimized: setPromptsMinimized,\n promptsMinimized: promptsMinimized,\n promptsData: promptsData,\n handleSubmit: handleSubmit,\n chatbotState: chatbotState,\n inputRef: inputRef,\n inputText: inputText,\n handleInput: handleInput,\n placeholderInputText: placeholderInputText,\n footerDisclaimerText: footerDisclaimerText,\n showFooterSuggestedQuestions: showFooterSuggestedQuestions\n })]\n })\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatbotBody);\n\n//# sourceURL=webpack://VamChatbot/./components/ChatbotBody.jsx?");
|
|
74
74
|
|
|
75
75
|
/***/ }),
|
|
76
76
|
|
|
@@ -103,7 +103,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
103
103
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
104
104
|
|
|
105
105
|
"use strict";
|
|
106
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _utils_sseClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/sseClient */ \"./utils/sseClient.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\nconst ratingOptions = [1, 2, 3, 4, 5];\nfunction FeedbackForm(_ref) {\n let {\n feedbackPayload,\n showDivider = true,\n getFeedbackToken,\n onCancel,\n onSubmitted\n } = _ref;\n const commentInputId = (0,react__WEBPACK_IMPORTED_MODULE_0__.useId)();\n const [selectedRating, setSelectedRating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [previewRating, setPreviewRating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [comments, setComments] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [success, setSuccess] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const handleRatingClick = rating => {\n setSelectedRating(rating);\n setPreviewRating(null);\n setError(null);\n };\n const handleSubmit = async () => {\n if (!selectedRating) return;\n setIsLoading(true);\n setError(null);\n try {\n if (!feedbackPayload?.chatbotBaseUrl || !feedbackPayload?.messageID || !feedbackPayload?.conversationID) {\n throw new Error(\"Missing feedback metadata\");\n }\n const feedbackToken = typeof getFeedbackToken === \"function\" ? await getFeedbackToken({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl\n }) : feedbackPayload.token;\n if (!feedbackToken) {\n throw new Error(\"Missing feedback token\");\n }\n await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_2__.submitChatbotFeedback)({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl,\n token: feedbackToken,\n body: {\n messageID: feedbackPayload.messageID,\n conversationID: feedbackPayload.conversationID,\n userQuery: feedbackPayload.userQuery || \"\",\n assistantResponse: feedbackPayload.assistantResponse || \"\",\n chatHistory: feedbackPayload.chatHistory || [],\n rating: selectedRating,\n comment: comments.trim()\n }\n });\n setSuccess(true);\n onSubmitted?.();\n } catch (err) {\n setError(\"Failed to submit feedback. Please try again.\");\n console.error(\"Error submitting feedback:\", err);\n } finally {\n setIsLoading(false);\n }\n };\n const handleCancel = () => {\n setSelectedRating(null);\n setPreviewRating(null);\n setComments(\"\");\n setError(null);\n onCancel?.();\n };\n const activeRating = previewRating || selectedRating;\n if (success) {\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackForm,\n part: \"feedback-form\",\n children: [showDivider && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackSuccess,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"i\", {\n className: \"bi bi-check-circle-fill\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n children: \"Thank you for your feedback!\"\n })]\n })]\n });\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackForm,\n part: \"feedback-form\",\n children: [showDivider && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTitle,\n children: \"How would you rate the conversation so far?\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackRatingContainer,\n role: \"radiogroup\",\n children: ratingOptions.map(rating => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"button\", {\n type: \"button\",\n className: `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackStarButton} ${activeRating >= rating ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackStarSelected : \"\"}`,\n onMouseEnter: () => setPreviewRating(rating),\n onMouseLeave: () => setPreviewRating(null),\n onFocus: () => setPreviewRating(rating),\n onBlur: () => setPreviewRating(null),\n onClick: () => handleRatingClick(rating),\n disabled: isLoading,\n role: \"radio\",\n \"aria-checked\": selectedRating === rating,\n \"aria-label\": `${rating} star${rating === 1 ? \"\" : \"s\"}`,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"i\", {\n className: `bi ${activeRating >= rating ? \"bi-star-fill\" : \"bi-star\"}`,\n \"aria-hidden\": \"true\"\n })\n }, rating))\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackExpanded,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"label\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTextareaLabel,\n htmlFor: commentInputId,\n children: \"Comments\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"textarea\", {\n id: commentInputId,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTextarea,\n value: comments,\n onChange: e => setComments(e.target.value),\n placeholder: \"Tell us more (optional)\",\n disabled: isLoading,\n rows: 3\n }), error && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackError,\n role: \"alert\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"i\", {\n className: \"bi bi-exclamation-circle\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n children: error\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackActions,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackCancelButton,\n onClick: handleCancel,\n disabled: isLoading,\n children: \"Dismiss\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackSubmitButton,\n onClick: handleSubmit,\n disabled: !selectedRating || isLoading,\n children: isLoading ? \"Submitting...\" : \"Submit\"\n })]\n })]\n })]\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FeedbackForm);\n\n//# sourceURL=webpack://VamChatbot/./components/FeedbackForm.jsx?");
|
|
106
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _utils_sseClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/sseClient */ \"./utils/sseClient.js\");\n/* harmony import */ var _utils_supportRedirects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/supportRedirects */ \"./utils/supportRedirects.js\");\n/* harmony import */ var _SupportActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SupportActions */ \"./components/SupportActions.jsx\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\nconst ratingOptions = [1, 2, 3, 4, 5];\nfunction FeedbackForm(_ref) {\n let {\n feedbackPayload,\n showDivider = true,\n getFeedbackToken,\n onCancel,\n onSubmitted,\n whatsappHandoffConfig\n } = _ref;\n const commentInputId = (0,react__WEBPACK_IMPORTED_MODULE_0__.useId)();\n const [selectedRating, setSelectedRating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [previewRating, setPreviewRating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [comments, setComments] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [success, setSuccess] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [supportRedirects, setSupportRedirects] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n const handleRatingClick = rating => {\n setSelectedRating(rating);\n setPreviewRating(null);\n setError(null);\n };\n const handleSubmit = async () => {\n if (!selectedRating) return;\n setIsLoading(true);\n setError(null);\n try {\n if (!feedbackPayload?.chatbotBaseUrl || !feedbackPayload?.messageID || !feedbackPayload?.conversationID) {\n throw new Error(\"Missing feedback metadata\");\n }\n const feedbackToken = typeof getFeedbackToken === \"function\" ? await getFeedbackToken({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl\n }) : feedbackPayload.token;\n if (!feedbackToken) {\n throw new Error(\"Missing feedback token\");\n }\n const response = await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_2__.submitChatbotFeedback)({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl,\n token: feedbackToken,\n body: {\n messageID: feedbackPayload.messageID,\n conversationID: feedbackPayload.conversationID,\n userQuery: feedbackPayload.userQuery || \"\",\n assistantResponse: feedbackPayload.assistantResponse || \"\",\n chatHistory: feedbackPayload.chatHistory || [],\n rating: selectedRating,\n comment: comments.trim()\n }\n });\n const shouldShowRedactionHandoff = response?.redaction_required === true && Boolean(whatsappHandoffConfig?.redirect_url);\n setSupportRedirects(shouldShowRedactionHandoff ? [(0,_utils_supportRedirects__WEBPACK_IMPORTED_MODULE_3__.createSupportRedirect)(\"whatsapp\", whatsappHandoffConfig)] : []);\n setSuccess(true);\n onSubmitted?.();\n } catch (err) {\n setError(\"Failed to submit feedback. Please try again.\");\n console.error(\"Error submitting feedback:\", err);\n } finally {\n setIsLoading(false);\n }\n };\n const handleCancel = () => {\n setSelectedRating(null);\n setPreviewRating(null);\n setComments(\"\");\n setError(null);\n setSupportRedirects([]);\n onCancel?.();\n };\n const activeRating = previewRating || selectedRating;\n if (success) {\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackForm,\n part: \"feedback-form\",\n children: [showDivider && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackSuccess,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"i\", {\n className: \"bi bi-check-circle-fill\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"span\", {\n children: \"Thank you for your feedback!\"\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_SupportActions__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n supportRedirects: supportRedirects\n })]\n });\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackForm,\n part: \"feedback-form\",\n children: [showDivider && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTitle,\n children: \"How would you rate the conversation?\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackRatingContainer,\n role: \"radiogroup\",\n children: ratingOptions.map(rating => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n type: \"button\",\n className: `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackStarButton} ${activeRating >= rating ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackStarSelected : \"\"}`,\n onMouseEnter: () => setPreviewRating(rating),\n onMouseLeave: () => setPreviewRating(null),\n onFocus: () => setPreviewRating(rating),\n onBlur: () => setPreviewRating(null),\n onClick: () => handleRatingClick(rating),\n disabled: isLoading,\n role: \"radio\",\n \"aria-checked\": selectedRating === rating,\n \"aria-label\": `${rating} star${rating === 1 ? \"\" : \"s\"}`,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"i\", {\n className: `bi ${activeRating >= rating ? \"bi-star-fill\" : \"bi-star\"}`,\n \"aria-hidden\": \"true\"\n })\n }, rating))\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackExpanded,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"label\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTextareaLabel,\n htmlFor: commentInputId,\n children: \"Comments\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"textarea\", {\n id: commentInputId,\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackTextarea,\n value: comments,\n onChange: e => setComments(e.target.value),\n placeholder: \"Tell us more (optional)\",\n disabled: isLoading,\n rows: 3\n }), error && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackError,\n role: \"alert\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"i\", {\n className: \"bi bi-exclamation-circle\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"span\", {\n children: error\n })]\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackActions,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackCancelButton,\n onClick: handleCancel,\n disabled: isLoading,\n children: \"Dismiss\"\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n type: \"button\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].feedbackSubmitButton,\n onClick: handleSubmit,\n disabled: !selectedRating || isLoading,\n children: isLoading ? \"Submitting...\" : \"Submit\"\n })]\n })]\n })]\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FeedbackForm);\n\n//# sourceURL=webpack://VamChatbot/./components/FeedbackForm.jsx?");
|
|
107
107
|
|
|
108
108
|
/***/ }),
|
|
109
109
|
|
|
@@ -114,7 +114,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
114
114
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
115
115
|
|
|
116
116
|
"use strict";
|
|
117
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var marked__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dompurify */ \"./node_modules/dompurify/dist/purify.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dompurify__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _Carousal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Carousal */ \"./components/Carousal.jsx\");\n/* harmony import */ var _SourceList__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SourceList */ \"./components/SourceList.jsx\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Typewriter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Typewriter */ \"./components/Typewriter.jsx\");\n/* harmony import */ var _PromotedTopics__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PromotedTopics */ \"./components/PromotedTopics.jsx\");\n/* harmony import */ var _FeedbackForm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./FeedbackForm */ \"./components/FeedbackForm.jsx\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\n\nconst defaultSupportMessageText = \"Need more help? Contact us directly.\";\nconst defaultSupportButtonLabel = \"Contact Us\";\nconst supportChannelMetadata = {\n whatsapp: {\n channelName: \"WhatsApp\",\n iconClassName: \"bi bi-whatsapp\",\n buttonClassName: \"whatsappSupportButton\"\n },\n telegram: {\n channelName: \"Telegram\",\n iconClassName: \"bi bi-telegram\",\n buttonClassName: \"telegramSupportButton\"\n }\n};\nconst getSupportRedirects = _ref => {\n let {\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects\n } = _ref;\n if (Array.isArray(supportRedirects) && supportRedirects.length > 0) {\n return supportRedirects.filter(redirect => redirect?.url);\n }\n if (showSupportButton && supportUrl) {\n return [{\n channel: supportChannel || \"whatsapp\",\n url: supportUrl\n }];\n }\n return [];\n};\nconst markdownToHtml = markdown => {\n let htmlResponse = \"\";\n dompurify__WEBPACK_IMPORTED_MODULE_1___default().addHook(\"afterSanitizeAttributes\", function (node) {\n // set all elements owning target to target=_blank\n if (\"target\" in node) {\n node.setAttribute(\"target\", \"_blank\");\n node.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n });\n try {\n htmlResponse = dompurify__WEBPACK_IMPORTED_MODULE_1___default().sanitize(marked__WEBPACK_IMPORTED_MODULE_0__.marked.parse(markdown));\n } catch (error) {\n console.log(error);\n }\n return htmlResponse;\n};\nfunction MessageCore(_ref2) {\n let {\n chatbotIcon,\n messageText,\n messageReferenceLinks,\n messageImageLinks,\n messageSource,\n messageStatus,\n promotedTopics,\n typewriterEffect,\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects,\n showFeedbackForm,\n feedbackPayload\n } = _ref2;\n let messageProps = {};\n const normalizedSupportRedirects = getSupportRedirects({\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects\n });\n if (messageSource === \"user\") {\n messageProps.backgroundColor = \"var(--chatbot-user-bubble-color)\";\n } else if (messageSource === \"bot\") {\n messageProps.backgroundColor = \"var(--chatbot-bot-bubble-color)\";\n } else if (messageSource === \"error\") {\n messageProps.justifyDirection = \"center\";\n }\n const messagePart = [\"message\"];\n if (messageSource === \"user\") {\n messagePart.push(\"user-message\");\n } else if (messageSource === \"bot\") {\n messagePart.push(\"bot-message\");\n } else if (messageSource === \"error\") {\n messagePart.push(\"error-message\");\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].message,\n part: messagePart.join(\" \"),\n style: {\n color: messageSource === \"error\" ? \"red\" : \"\",\n justifyContent: messageProps?.justifyDirection,\n flexDirection: messageSource === \"user\" ? \"row-reverse\" : \"\"\n },\n children: [messageSource === \"user\" ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"i\", {\n className: \"bi bi-person-circle\",\n style: {\n color: \"var(--chatbot-user-icon-color)\"\n },\n part: \"message-avatar\"\n }) : messageSource === \"bot\" ? chatbotIcon && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"img\", {\n src: chatbotIcon,\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].chatbotIcon,\n part: \"message-avatar\"\n }) : \"\", /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messageBody,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messageText,\n part: \"message-bubble\",\n style: {\n backgroundColor: messageProps.backgroundColor,\n color: messageSource === \"error\" ? \"red\" : messageSource === \"user\" ? \"var(--chatbot-user-text-color)\" : \"var(--chatbot-bot-text-color)\"\n },\n children: [typewriterEffect ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_Typewriter__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n text: markdownToHtml(messageText)\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].markdownToHtmlContainer,\n dangerouslySetInnerHTML: {\n __html: markdownToHtml(messageText)\n }\n }), messageStatus === \"done\" && promotedTopics?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_PromotedTopics__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n data: promotedTopics\n }), normalizedSupportRedirects.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.Fragment, {\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].supportActions,\n part: \"support-actions\",\n children: normalizedSupportRedirects.map(redirect => {\n const channelMetadata = supportChannelMetadata[redirect.channel] || {};\n const buttonClassName = channelMetadata.buttonClassName ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"][channelMetadata.buttonClassName] : \"\";\n const supportMessageText = redirect.messageText || defaultSupportMessageText;\n const buttonLabel = redirect.buttonLabel || defaultSupportButtonLabel;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].supportAction,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].supportText,\n children: supportMessageText\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"a\", {\n href: redirect.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n className: `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].supportButton} ${buttonClassName}`,\n children: [channelMetadata.iconClassName && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"i\", {\n className: channelMetadata.iconClassName\n }), buttonLabel]\n })]\n }, `${redirect.channel}-${redirect.url}`);\n })\n })]\n }), showFeedbackForm && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_FeedbackForm__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n feedbackPayload: feedbackPayload\n }), messageImageLinks?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_Carousal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n images: messageImageLinks\n }), messageStatus === \"done\" && messageReferenceLinks?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_SourceList__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sources: messageReferenceLinks\n })]\n })\n })]\n });\n}\n\n// wrap the component in useMemo() to re-render\n// only the latest Message when streaming response\nconst Message = _ref3 => {\n let {\n chatbotIcon,\n messageText,\n messageReferenceLinks,\n messageImageLinks,\n messageSource,\n messageStatus,\n promotedTopics,\n typewriterEffect,\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects,\n showFeedbackForm,\n feedbackPayload\n } = _ref3;\n return (0,react__WEBPACK_IMPORTED_MODULE_5__.useMemo)(() => {\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(MessageCore, {\n chatbotIcon: chatbotIcon,\n messageText: messageText,\n messageReferenceLinks: messageReferenceLinks,\n messageImageLinks: messageImageLinks,\n messageSource: messageSource,\n messageStatus: messageStatus,\n promotedTopics: promotedTopics,\n typewriterEffect: typewriterEffect,\n showSupportButton: showSupportButton,\n supportUrl: supportUrl,\n supportChannel: supportChannel,\n supportRedirects: supportRedirects,\n showFeedbackForm: showFeedbackForm,\n feedbackPayload: feedbackPayload\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messageText, messageStatus, chatbotIcon, showSupportButton, supportUrl, supportChannel, supportRedirects, showFeedbackForm, feedbackPayload]);\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Message);\n\n//# sourceURL=webpack://VamChatbot/./components/Message.jsx?");
|
|
117
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var marked__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dompurify */ \"./node_modules/dompurify/dist/purify.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dompurify__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _Carousal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Carousal */ \"./components/Carousal.jsx\");\n/* harmony import */ var _SourceList__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SourceList */ \"./components/SourceList.jsx\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Typewriter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Typewriter */ \"./components/Typewriter.jsx\");\n/* harmony import */ var _PromotedTopics__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PromotedTopics */ \"./components/PromotedTopics.jsx\");\n/* harmony import */ var _FeedbackForm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./FeedbackForm */ \"./components/FeedbackForm.jsx\");\n/* harmony import */ var _ResponseRating__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ResponseRating */ \"./components/ResponseRating.jsx\");\n/* harmony import */ var _SupportActions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SupportActions */ \"./components/SupportActions.jsx\");\n/* harmony import */ var _utils_supportRedirects__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/supportRedirects */ \"./utils/supportRedirects.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst markdownToHtml = markdown => {\n let htmlResponse = \"\";\n dompurify__WEBPACK_IMPORTED_MODULE_1___default().addHook(\"afterSanitizeAttributes\", function (node) {\n // set all elements owning target to target=_blank\n if (\"target\" in node) {\n node.setAttribute(\"target\", \"_blank\");\n node.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n });\n try {\n htmlResponse = dompurify__WEBPACK_IMPORTED_MODULE_1___default().sanitize(marked__WEBPACK_IMPORTED_MODULE_0__.marked.parse(markdown));\n } catch (error) {\n console.log(error);\n }\n return htmlResponse;\n};\nfunction MessageCore(_ref) {\n let {\n chatbotIcon,\n messageText,\n messageReferenceLinks,\n messageImageLinks,\n messageSource,\n messageStatus,\n promotedTopics,\n typewriterEffect,\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects,\n showFeedbackForm,\n feedbackPayload,\n showResponseRating,\n getFeedbackToken,\n whatsappHandoffConfig\n } = _ref;\n let messageProps = {};\n const normalizedSupportRedirects = (0,_utils_supportRedirects__WEBPACK_IMPORTED_MODULE_11__.getSupportRedirects)({\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects\n });\n if (messageSource === \"user\") {\n messageProps.backgroundColor = \"var(--chatbot-user-bubble-color)\";\n } else if (messageSource === \"bot\") {\n messageProps.backgroundColor = \"var(--chatbot-bot-bubble-color)\";\n } else if (messageSource === \"error\") {\n messageProps.justifyDirection = \"center\";\n }\n const messagePart = [\"message\"];\n if (messageSource === \"user\") {\n messagePart.push(\"user-message\");\n } else if (messageSource === \"bot\") {\n messagePart.push(\"bot-message\");\n } else if (messageSource === \"error\") {\n messagePart.push(\"error-message\");\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].message,\n part: messagePart.join(\" \"),\n style: {\n color: messageSource === \"error\" ? \"red\" : \"\",\n justifyContent: messageProps?.justifyDirection,\n flexDirection: messageSource === \"user\" ? \"row-reverse\" : \"\"\n },\n children: [messageSource === \"user\" ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"i\", {\n className: \"bi bi-person-circle\",\n style: {\n color: \"var(--chatbot-user-icon-color)\"\n },\n part: \"message-avatar\"\n }) : messageSource === \"bot\" ? chatbotIcon && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"img\", {\n src: chatbotIcon,\n alt: \"chatbot icon\",\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].chatbotIcon,\n part: \"message-avatar\"\n }) : \"\", /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messageBody,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messageText,\n part: \"message-bubble\",\n style: {\n backgroundColor: messageProps.backgroundColor,\n color: messageSource === \"error\" ? \"red\" : messageSource === \"user\" ? \"var(--chatbot-user-text-color)\" : \"var(--chatbot-bot-text-color)\"\n },\n children: [typewriterEffect ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_Typewriter__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n text: markdownToHtml(messageText)\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(\"span\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"].markdownToHtmlContainer,\n dangerouslySetInnerHTML: {\n __html: markdownToHtml(messageText)\n }\n }), messageStatus === \"done\" && promotedTopics?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_PromotedTopics__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n data: promotedTopics\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_SupportActions__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n supportRedirects: normalizedSupportRedirects\n }), showFeedbackForm && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_FeedbackForm__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n feedbackPayload: feedbackPayload,\n getFeedbackToken: getFeedbackToken,\n whatsappHandoffConfig: whatsappHandoffConfig\n }), messageImageLinks?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_Carousal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n images: messageImageLinks\n }), messageStatus === \"done\" && messageReferenceLinks?.length > 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_SourceList__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sources: messageReferenceLinks\n })]\n }), showResponseRating && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_ResponseRating__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n feedbackPayload: feedbackPayload,\n getFeedbackToken: getFeedbackToken\n })]\n })]\n });\n}\n\n// wrap the component in useMemo() to re-render\n// only the latest Message when streaming response\nconst Message = _ref2 => {\n let {\n chatbotIcon,\n messageText,\n messageReferenceLinks,\n messageImageLinks,\n messageSource,\n messageStatus,\n promotedTopics,\n typewriterEffect,\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects,\n showFeedbackForm,\n feedbackPayload,\n showResponseRating,\n getFeedbackToken,\n whatsappHandoffConfig\n } = _ref2;\n return (0,react__WEBPACK_IMPORTED_MODULE_5__.useMemo)(() => {\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(MessageCore, {\n chatbotIcon: chatbotIcon,\n messageText: messageText,\n messageReferenceLinks: messageReferenceLinks,\n messageImageLinks: messageImageLinks,\n messageSource: messageSource,\n messageStatus: messageStatus,\n promotedTopics: promotedTopics,\n typewriterEffect: typewriterEffect,\n showSupportButton: showSupportButton,\n supportUrl: supportUrl,\n supportChannel: supportChannel,\n supportRedirects: supportRedirects,\n showFeedbackForm: showFeedbackForm,\n feedbackPayload: feedbackPayload,\n showResponseRating: showResponseRating,\n getFeedbackToken: getFeedbackToken,\n whatsappHandoffConfig: whatsappHandoffConfig\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messageText, messageStatus, chatbotIcon, showSupportButton, supportUrl, supportChannel, supportRedirects, showFeedbackForm, feedbackPayload, showResponseRating, getFeedbackToken, whatsappHandoffConfig]);\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Message);\n\n//# sourceURL=webpack://VamChatbot/./components/Message.jsx?");
|
|
118
118
|
|
|
119
119
|
/***/ }),
|
|
120
120
|
|
|
@@ -151,6 +151,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
151
151
|
|
|
152
152
|
/***/ }),
|
|
153
153
|
|
|
154
|
+
/***/ "./components/ResponseRating.jsx":
|
|
155
|
+
/*!***************************************!*\
|
|
156
|
+
!*** ./components/ResponseRating.jsx ***!
|
|
157
|
+
\***************************************/
|
|
158
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
159
|
+
|
|
160
|
+
"use strict";
|
|
161
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var _utils_sseClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/sseClient */ \"./utils/sseClient.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\nconst ratingOptions = [{\n value: \"up\",\n label: \"Good response\",\n icon: \"bi-hand-thumbs-up\",\n selectedIcon: \"bi-hand-thumbs-up-fill\",\n part: \"response-rating-up\"\n}, {\n value: \"down\",\n label: \"Bad response\",\n icon: \"bi-hand-thumbs-down\",\n selectedIcon: \"bi-hand-thumbs-down-fill\",\n part: \"response-rating-down\"\n}];\nfunction ResponseRating(_ref) {\n let {\n feedbackPayload,\n getFeedbackToken\n } = _ref;\n const [selectedRating, setSelectedRating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [isSubmitting, setIsSubmitting] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [activeLabel, setActiveLabel] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n const submitRating = async rating => {\n if (!rating) return;\n const previousRating = selectedRating;\n setSelectedRating(rating);\n setIsSubmitting(true);\n setError(null);\n try {\n if (!feedbackPayload?.chatbotBaseUrl || !feedbackPayload?.messageID || !feedbackPayload?.conversationID) {\n throw new Error(\"Missing response rating metadata\");\n }\n const ratingToken = typeof getFeedbackToken === \"function\" ? await getFeedbackToken({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl\n }) : feedbackPayload.token;\n if (!ratingToken) {\n throw new Error(\"Missing response rating token\");\n }\n await (0,_utils_sseClient__WEBPACK_IMPORTED_MODULE_2__.submitChatbotResponseRating)({\n chatbotBaseUrl: feedbackPayload.chatbotBaseUrl,\n token: ratingToken,\n body: {\n messageID: feedbackPayload.messageID,\n conversationID: feedbackPayload.conversationID,\n userQuery: feedbackPayload.userQuery || \"\",\n assistantResponse: feedbackPayload.assistantResponse || \"\",\n chatHistory: feedbackPayload.chatHistory || [],\n rating\n }\n });\n } catch (err) {\n setSelectedRating(previousRating);\n setError(\"Rating failed\");\n console.error(\"Error submitting response rating:\", err);\n } finally {\n setIsSubmitting(false);\n }\n };\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRating,\n part: \"response-rating\",\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRatingActions,\n children: ratingOptions.map(option => {\n const isSelected = selectedRating === option.value;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"button\", {\n type: \"button\",\n className: `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRatingButton} ${isSelected ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRatingButtonSelected : \"\"}`,\n onClick: () => submitRating(option.value),\n onMouseEnter: () => setActiveLabel(option.label),\n onMouseLeave: () => setActiveLabel(null),\n onFocus: () => setActiveLabel(option.label),\n onBlur: () => setActiveLabel(null),\n disabled: isSubmitting,\n \"aria-label\": option.label,\n \"aria-pressed\": isSelected,\n title: option.label,\n \"data-tooltip\": option.label,\n part: option.part,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"i\", {\n className: `bi ${isSelected ? option.selectedIcon : option.icon}`,\n \"aria-hidden\": \"true\"\n })\n }, option.value);\n })\n }), activeLabel ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRatingHint,\n children: activeLabel\n }) : error ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].responseRatingError,\n role: \"alert\",\n children: error\n }) : null]\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResponseRating);\n\n//# sourceURL=webpack://VamChatbot/./components/ResponseRating.jsx?");
|
|
162
|
+
|
|
163
|
+
/***/ }),
|
|
164
|
+
|
|
154
165
|
/***/ "./components/SourceList.jsx":
|
|
155
166
|
/*!***********************************!*\
|
|
156
167
|
!*** ./components/SourceList.jsx ***!
|
|
@@ -162,6 +173,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
162
173
|
|
|
163
174
|
/***/ }),
|
|
164
175
|
|
|
176
|
+
/***/ "./components/SupportActions.jsx":
|
|
177
|
+
/*!***************************************!*\
|
|
178
|
+
!*** ./components/SupportActions.jsx ***!
|
|
179
|
+
\***************************************/
|
|
180
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
181
|
+
|
|
182
|
+
"use strict";
|
|
183
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Chatbot.module.css */ \"./Chatbot.module.css\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\nconst defaultSupportMessageText = \"Need more help? Contact us directly.\";\nconst defaultSupportButtonLabel = \"Contact Us\";\nconst supportChannelMetadata = {\n whatsapp: {\n channelName: \"WhatsApp\",\n iconClassName: \"bi bi-whatsapp\",\n buttonClassName: \"whatsappSupportButton\"\n },\n telegram: {\n channelName: \"Telegram\",\n iconClassName: \"bi bi-telegram\",\n buttonClassName: \"telegramSupportButton\"\n }\n};\nfunction SupportActions(_ref) {\n let {\n supportRedirects,\n showDivider = true\n } = _ref;\n const redirects = Array.isArray(supportRedirects) ? supportRedirects.filter(redirect => redirect?.url) : [];\n if (redirects.length === 0) return null;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n children: [showDivider && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].messageDivider\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].supportActions,\n part: \"support-actions\",\n children: redirects.map(redirect => {\n const channelMetadata = supportChannelMetadata[redirect.channel] || {};\n const buttonClassName = channelMetadata.buttonClassName ? _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"][channelMetadata.buttonClassName] : \"\";\n const supportMessageText = redirect.messageText || defaultSupportMessageText;\n const buttonLabel = redirect.buttonLabel || defaultSupportButtonLabel;\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsxs)(\"div\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].supportAction,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"p\", {\n className: _Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].supportText,\n children: supportMessageText\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsxs)(\"a\", {\n href: redirect.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n className: `${_Chatbot_module_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].supportButton} ${buttonClassName}`,\n children: [channelMetadata.iconClassName && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"i\", {\n className: channelMetadata.iconClassName\n }), buttonLabel]\n })]\n }, `${redirect.channel}-${redirect.url}`);\n })\n })]\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SupportActions);\n\n//# sourceURL=webpack://VamChatbot/./components/SupportActions.jsx?");
|
|
184
|
+
|
|
185
|
+
/***/ }),
|
|
186
|
+
|
|
165
187
|
/***/ "./components/Typewriter.jsx":
|
|
166
188
|
/*!***********************************!*\
|
|
167
189
|
!*** ./components/Typewriter.jsx ***!
|
|
@@ -202,7 +224,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
202
224
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
203
225
|
|
|
204
226
|
"use strict";
|
|
205
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ mintChatbotSessionToken: () => (/* binding */ mintChatbotSessionToken),\n/* harmony export */ streamChatbotSse: () => (/* binding */ streamChatbotSse),\n/* harmony export */ submitChatbotFeedback: () => (/* binding */ submitChatbotFeedback)\n/* harmony export */ });\nconst normalizeBaseUrl = baseUrl => String(baseUrl || \"\").replace(/\\/+$/, \"\");\nasync function mintChatbotSessionToken(_ref) {\n let {\n chatbotBaseUrl,\n authToken,\n pagePath = \"/\",\n signal\n } = _ref;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}/chat/session`;\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (typeof authToken === \"string\" && authToken.trim()) {\n headers.Authorization = `Bearer ${authToken.trim()}`;\n }\n const resp = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n page_path: pagePath || \"/\"\n }),\n signal\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`mint session failed (${resp.status}): ${text || resp.statusText}`);\n }\n return resp.json();\n}\nasync function streamChatbotSse(_ref2) {\n let {\n chatbotBaseUrl,\n token,\n body,\n signal,\n onEnvelope\n } = _ref2;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}/chat/stream`;\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify(body),\n signal\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`stream failed (${resp.status}): ${text || resp.statusText}`);\n }\n if (!resp.body) {\n throw new Error(\"stream failed: missing response body\");\n }\n const reader = resp.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let eventDataLines = [];\n const flushEvent = () => {\n if (eventDataLines.length === 0) return;\n const payload = eventDataLines.join(\"\\n\").trim();\n eventDataLines = [];\n if (!payload) return;\n try {\n onEnvelope(JSON.parse(payload));\n } catch {\n // ignore\n }\n };\n while (true) {\n const {\n value,\n done\n } = await reader.read();\n if (done) {\n flushEvent();\n break;\n }\n buffer += decoder.decode(value, {\n stream: true\n });\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) break;\n const rawLine = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n if (line === \"\") {\n flushEvent();\n continue;\n }\n if (line.startsWith(\":\")) continue;\n if (line.startsWith(\"data:\")) {\n eventDataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n }\n}\nasync function submitChatbotFeedback(_ref3) {\n let {\n chatbotBaseUrl,\n token,\n body,\n signal\n } = _ref3;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}
|
|
227
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ mintChatbotSessionToken: () => (/* binding */ mintChatbotSessionToken),\n/* harmony export */ streamChatbotSse: () => (/* binding */ streamChatbotSse),\n/* harmony export */ submitChatbotFeedback: () => (/* binding */ submitChatbotFeedback),\n/* harmony export */ submitChatbotResponseRating: () => (/* binding */ submitChatbotResponseRating)\n/* harmony export */ });\nconst normalizeBaseUrl = baseUrl => String(baseUrl || \"\").replace(/\\/+$/, \"\");\nasync function mintChatbotSessionToken(_ref) {\n let {\n chatbotBaseUrl,\n authToken,\n pagePath = \"/\",\n signal\n } = _ref;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}/chat/session`;\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (typeof authToken === \"string\" && authToken.trim()) {\n headers.Authorization = `Bearer ${authToken.trim()}`;\n }\n const resp = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n page_path: pagePath || \"/\"\n }),\n signal\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`mint session failed (${resp.status}): ${text || resp.statusText}`);\n }\n return resp.json();\n}\nasync function streamChatbotSse(_ref2) {\n let {\n chatbotBaseUrl,\n token,\n body,\n signal,\n onEnvelope\n } = _ref2;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}/chat/stream`;\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify(body),\n signal\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`stream failed (${resp.status}): ${text || resp.statusText}`);\n }\n if (!resp.body) {\n throw new Error(\"stream failed: missing response body\");\n }\n const reader = resp.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let eventDataLines = [];\n const flushEvent = () => {\n if (eventDataLines.length === 0) return;\n const payload = eventDataLines.join(\"\\n\").trim();\n eventDataLines = [];\n if (!payload) return;\n try {\n onEnvelope(JSON.parse(payload));\n } catch {\n // ignore\n }\n };\n while (true) {\n const {\n value,\n done\n } = await reader.read();\n if (done) {\n flushEvent();\n break;\n }\n buffer += decoder.decode(value, {\n stream: true\n });\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) break;\n const rawLine = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n if (line === \"\") {\n flushEvent();\n continue;\n }\n if (line.startsWith(\":\")) continue;\n if (line.startsWith(\"data:\")) {\n eventDataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n }\n}\nasync function submitChatbotFeedback(_ref3) {\n let {\n chatbotBaseUrl,\n token,\n body,\n signal\n } = _ref3;\n return submitChatbotJson({\n chatbotBaseUrl,\n path: \"/chat/feedback\",\n token,\n body,\n signal,\n errorLabel: \"feedback\"\n });\n}\nasync function submitChatbotResponseRating(_ref4) {\n let {\n chatbotBaseUrl,\n token,\n body,\n signal\n } = _ref4;\n return submitChatbotJson({\n chatbotBaseUrl,\n path: \"/chat/response-rating\",\n token,\n body,\n signal,\n errorLabel: \"response rating\"\n });\n}\nasync function submitChatbotJson(_ref5) {\n let {\n chatbotBaseUrl,\n path,\n token,\n body,\n signal,\n errorLabel\n } = _ref5;\n const url = `${normalizeBaseUrl(chatbotBaseUrl)}${path}`;\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify(body),\n signal\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`${errorLabel} failed (${resp.status}): ${text || resp.statusText}`);\n }\n const contentType = resp.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return resp.json();\n }\n return resp.text().catch(() => \"\");\n}\n\n//# sourceURL=webpack://VamChatbot/./utils/sseClient.js?");
|
|
228
|
+
|
|
229
|
+
/***/ }),
|
|
230
|
+
|
|
231
|
+
/***/ "./utils/supportRedirects.js":
|
|
232
|
+
/*!***********************************!*\
|
|
233
|
+
!*** ./utils/supportRedirects.js ***!
|
|
234
|
+
\***********************************/
|
|
235
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
236
|
+
|
|
237
|
+
"use strict";
|
|
238
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createSupportRedirect: () => (/* binding */ createSupportRedirect),\n/* harmony export */ getSupportRedirects: () => (/* binding */ getSupportRedirects)\n/* harmony export */ });\nconst createSupportRedirect = (channel, channelConfig) => ({\n channel,\n url: channelConfig?.redirect_url,\n messageText: channelConfig?.message_text,\n buttonLabel: channelConfig?.button_label\n});\nconst getSupportRedirects = _ref => {\n let {\n showSupportButton,\n supportUrl,\n supportChannel,\n supportRedirects\n } = _ref;\n if (Array.isArray(supportRedirects) && supportRedirects.length > 0) {\n return supportRedirects.filter(redirect => redirect?.url);\n }\n if (showSupportButton && supportUrl) {\n return [{\n channel: supportChannel || \"whatsapp\",\n url: supportUrl\n }];\n }\n return [];\n};\n\n//# sourceURL=webpack://VamChatbot/./utils/supportRedirects.js?");
|
|
206
239
|
|
|
207
240
|
/***/ }),
|
|
208
241
|
|
|
@@ -246,7 +279,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
246
279
|
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
247
280
|
|
|
248
281
|
"use strict";
|
|
249
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n___CSS_LOADER_EXPORT___.push([module.id, \"@import url(https://fonts.googleapis.com/css2?family=Open+Sans:ital,wdth,wght@0,75..100,300..800;1,75..100,300..800&display=swap);\"]);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.bOJfQLIDdUlPEJzIVy0q {\n --chatbot-height: 70%;\n --chatbot-width: 30%;\n --chatbot-header-height: 50px;\n --chatbot-footer-height: 80px;\n --chatbot-footer-input-height: 40px;\n --chatbot-circle-radius: 70px;\n --chatbot-spacing-x: 10px;\n --chatbot-spacing-y: 10px;\n --chatbot-border-radius: 10px;\n}\n\n@media only screen and (max-width: 1280px) {\n .bOJfQLIDdUlPEJzIVy0q {\n --chatbot-width: 50%;\n --chatbot-height: 80%;\n }\n}\n\n@media only screen and (max-width: 768px) {\n .bOJfQLIDdUlPEJzIVy0q {\n --chatbot-width: 100%;\n --chatbot-height: 100%;\n --chatbot-header-height: 70px;\n --chatbot-spacing-x: 0px;\n --chatbot-spacing-y: 0px;\n --chatbot-border-radius: 0px;\n }\n}\n\n.mrPuzpzfdEmQSyTxnvxI {\n font-family: \"Open Sans\", sans-serif;\n font-optical-sizing: auto;\n font-weight: 600;\n font-style: normal;\n font-variation-settings: \"wdth\" 90;\n position: fixed;\n overflow: hidden;\n border-radius: var(--chatbot-border-radius);\n bottom: var(--chatbot-spacing-y);\n right: var(--chatbot-spacing-x);\n height: var(--chatbot-height);\n width: var(--chatbot-width);\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n z-index: 99999;\n}\n\n.EwBhaKWtrMkmlquKWEEo {\n width: var(--chatbot-inline-width, 100%);\n height: var(--chatbot-inline-height, 640px);\n min-height: var(--chatbot-inline-min-height, 480px);\n box-sizing: border-box;\n}\n\n.dyE5pTsFKvJw8NgUVBbk {\n position: relative;\n bottom: auto;\n right: auto;\n width: 100%;\n max-width: 100%;\n height: 100%;\n min-height: 100%;\n box-sizing: border-box;\n z-index: 0;\n isolation: isolate;\n}\n\n:host([layout=\"inline\"]) .EwBhaKWtrMkmlquKWEEo {\n width: 100%;\n height: 100%;\n min-height: 100%;\n}\n\n.HrdPV1T8C8AOFmGVDVQX {\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--chatbot-background-color, #fff);\n border-radius: var(--chatbot-border-radius);\n color: var(--chatbot-bot-text-color, #1f2937);\n padding: 24px;\n box-sizing: border-box;\n}\n\n.K4Ka7lBIi3uwlJDIQEt0 {\n max-width: 420px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n text-align: center;\n}\n\n.NX1ohgiEEs0vaDOeQ2_w {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid rgba(31, 41, 55, 0.16);\n border-top-color: var(--chatbot-header-color, #4f46e5);\n animation: gipOtf8Cs1L3UhoKYCY6 0.8s linear infinite;\n}\n\n.yXQQue2MsoLEzd9T2aoc {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n}\n\n.aH0mc9GAi1rPzFMrRzfF {\n margin: 0;\n font-size: 0.9rem;\n font-weight: 500;\n line-height: 1.45;\n}\n\n.EHAnq_Q6pKh_POfqBrL4 {\n font-size: 1.6rem;\n color: #e74c3c;\n}\n\n@keyframes gipOtf8Cs1L3UhoKYCY6 {\n to {\n transform: rotate(360deg);\n }\n}\n\n.QJ6c9UPW4NdCwINA2KKw {\n position: absolute;\n width: 100%;\n background-color: var(--chatbot-header-color);\n padding: 0 10px;\n border-bottom: 0.5px solid var(--chatbot-border-color);\n z-index: 99998;\n height: var(--chatbot-header-height);\n}\n\n.BAciNorgEk8q0Hjvg_Nd {\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: white;\n font-size: 1.4rem;\n\n button,\n button:hover {\n background-color: var(--chatbot-header-color);\n color: var(--chatbot-header-text-color);\n border: none;\n }\n}\n\n.rDNjthKTeHigjuhTaXFw {\n display: flex;\n height: 100%;\n flex-direction: column;\n align-items: flex-start;\n /* Align items to the start (left) */\n justify-content: center;\n /* Center vertically within the container */\n /* padding-left: 10px; */\n /* Add padding to push it away from the edge */\n}\n\n.qhIJF8jtTVHpl14phrvO {\n font-weight: 700;\n text-align: start;\n color: var(--chatbot-header-text-color);\n}\n\n.bJ4qOXuizp8yq01SFRbe {\n font-weight: 700;\n font-size: 0.4rem;\n text-align: start;\n}\n\n.M84EXuBJb0ITHqmcP033 {\n margin-top: var(--chatbot-header-height);\n font-size: 1rem;\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n background-color: var(--chatbot-background-color);\n height: calc(100% - var(--chatbot-header-height));\n}\n\n.KJH5XQVgMgo5xa6hVmpQ {\n .uodJA65d3QSnFHHi6wEE {\n row-gap: 10px;\n column-gap: 10px;\n padding: 0 20px;\n }\n .yMV8jdykQ0p_dG9sc2yK {\n gap: 10px;\n border-radius: 10px;\n padding: 5px 12px;\n cursor: pointer;\n color: var(--chatbot-prompt-text-color);\n\n .OFNqcCdonr5dxzTTZ3zK {\n font-size: 0.85rem;\n }\n }\n}\n\n.F4te4w0Rg9nYSlvqoOuU {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n.y3GymRJmY0MX41NX3xWJ {\n /* width: 45px; */\n height: 70px;\n}\n\n.soVXB5uMOlUUVHtMVzBV,\n.BAciNorgEk8q0Hjvg_Nd {\n .y3GymRJmY0MX41NX3xWJ {\n /* width: 40px; */\n height: 40px;\n }\n}\n\n.soVXB5uMOlUUVHtMVzBV {\n display: flex;\n gap: 10px;\n height: fit-content;\n padding: 10px 20px;\n\n .On7UzyczZB0EFpZn8hAO {\n border-radius: 10px;\n padding: 5px 10px;\n display: flex;\n align-items: center;\n flex-direction: column;\n align-items: flex-start;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.25);\n }\n\n i {\n font-size: 24px;\n }\n}\n\n.ys2v0_nbj9UZ2GtmsGFl {\n display: flex;\n flex-direction: column;\n}\n\n.uodJA65d3QSnFHHi6wEE {\n display: flex;\n flex-wrap: wrap;\n row-gap: 20px;\n column-gap: 15px;\n justify-content: center;\n padding: 20px 10px 20px 10px;\n}\n\n.yMV8jdykQ0p_dG9sc2yK {\n display: flex;\n gap: 10px;\n align-items: center;\n height: fit-content;\n background-color: var(--chatbot-prompt-background-color);\n border-radius: 10px;\n padding: 10px 30px;\n border: none;\n font-variation-settings: \"wdth\" 90;\n font-weight: 600;\n color: var(--chatbot-prompt-text-color);\n\n .OFNqcCdonr5dxzTTZ3zK {\n font-size: 0.85rem;\n }\n}\n\n.yMV8jdykQ0p_dG9sc2yK:disabled {\n cursor: not-allowed;\n}\n\n.ePwR5gBjQ2sQwKScmcAF {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 30px;\n max-width: 30px;\n height: 30px;\n border-radius: 30px;\n background-color: grey;\n}\n\n.n5EFd7Gb3khLARy7SBEE {\n display: block;\n text-align: center;\n font-size: 0.7rem;\n font-weight: 700;\n margin: 5px 0 0;\n background: linear-gradient(to bottom, #39cff6, #ad84ff);\n background-clip: text;\n color: transparent;\n}\n\n.UlJ8l2Ig0xMVd2kSSwFc {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n max-width: calc(100% - 32px);\n width: fit-content;\n box-sizing: border-box;\n margin: 0 auto 7px;\n padding: 3px 9px;\n border: 1px solid\n var(--chatbot-footer-disclaimer-border-color, rgba(0, 0, 0, 0.08));\n border-radius: 999px;\n background-color: var(\n --chatbot-footer-disclaimer-background-color,\n rgba(0, 0, 0, 0.035)\n );\n color: var(--chatbot-footer-disclaimer-color, rgba(73, 74, 75, 0.82));\n font-size: 0.64rem;\n font-weight: 600;\n line-height: 1.2;\n text-align: center;\n white-space: normal;\n}\n\n.GPH5IAUB9eqnV9y0rpGd {\n flex: 0 0 auto;\n color: var(\n --chatbot-footer-disclaimer-icon-color,\n var(--chatbot-header-color)\n );\n font-size: 0.68rem;\n opacity: 0.72;\n}\n\n.P_GItjDPU4XleZm6P8xv {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.Cswbzq1GQuTnMGpPi4Zt {\n width: 95%;\n margin: 7px auto 10px;\n}\n\n.o26SHWfHQz6ZsTl_ZHHY {\n overflow: hidden;\n border-radius: 10px;\n background-color: var(--chatbot-background-color);\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.25);\n}\n\n.aZhpX5bTq5glnTwRfexE {\n background-color: var(--chatbot-background-color);\n}\n\n._yHxsSehNpv6oVLoKuCt {\n overflow: hidden;\n}\n\n.khl8aPnNVKa_2k4FtxCE {\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n width: 100%;\n min-height: 34px;\n margin: 0;\n padding: 6px 14px;\n border: none;\n border-bottom: 1px solid\n var(--chatbot-footer-disclaimer-border-color, rgba(0, 0, 0, 0.08));\n background-color: var(--chatbot-background-color);\n color: var(--chatbot-header-color);\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: 0.72rem;\n font-weight: 700;\n line-height: 1.3;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.khl8aPnNVKa_2k4FtxCE:hover {\n color: var(--chatbot-footericons-hover-color);\n}\n\n.khl8aPnNVKa_2k4FtxCE:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: -2px;\n}\n\n.OSorpbHQM_04uxRDzesw {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n min-width: 0;\n line-height: 1.3;\n}\n\n.QQ1ZPgR9ghIXrFXB0CCh,\n.EwCXv8ZSCm3o5rYuMlss {\n flex: 0 0 auto;\n color: currentColor;\n font-size: 0.82rem;\n line-height: 1;\n}\n\n.OSorpbHQM_04uxRDzesw span {\n display: block;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ibnXsq4b88cDDvfQQgYn {\n display: flex;\n align-items: center;\n min-height: var(--chatbot-footer-input-height);\n height: var(--chatbot-footer-input-height);\n border-radius: 0;\n overflow: hidden;\n background-color: var(--chatbot-background-color);\n\n i {\n font-size: 1.75rem;\n }\n /* Ensures the button and input are nicely clipped within the border radius */\n}\n\n.Cswbzq1GQuTnMGpPi4Zt input {\n font-family: \"Open Sans\", sans-serif;\n font-optical-sizing: auto;\n font-weight: 600;\n font-style: normal;\n font-variation-settings: \"wdth\" 95;\n color: var(--chatbot-input-text-color);\n background-color: var(--chatbot-background-color);\n border: none;\n padding: 0 10px;\n flex: 1 1 auto;\n min-width: 0;\n width: auto;\n height: 100%;\n outline: none;\n transition:\n box-shadow 0.3s ease,\n border-color 0.3s ease;\n}\n\n.Cswbzq1GQuTnMGpPi4Zt input:focus {\n border-color: var(--chatbot-user-bubble-color);\n box-shadow: 0 10 10px var(--chatbot-user-bubble-color);\n /* Adds a glow effect on focus */\n}\n\n.ibnXsq4b88cDDvfQQgYn button {\n background-color: var(--chatbot-background-color);\n border: none;\n padding: 0 15px;\n /* Extra padding for the button */\n color: var(--chatbot-footer-icon-color);\n cursor: pointer;\n transition: color 0.3s ease;\n}\n\n.ibnXsq4b88cDDvfQQgYn button:hover {\n color: var(--chatbot-footericons-hover-color);\n /* filter: brightness(2); */\n /* Optional: hover effect for the button */\n}\n\n.ibnXsq4b88cDDvfQQgYn button:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: -2px;\n}\n\n.ibnXsq4b88cDDvfQQgYn button:disabled {\n opacity: 0.6;\n /* Makes the button appear disabled */\n cursor: not-allowed;\n /* Changes cursor to indicate it's disabled */\n}\n\n.nW2NG3krvonnMg3Rivul {\n position: fixed;\n bottom: var(--chatbot-spacing-y);\n right: var(--chatbot-spacing-x);\n width: 0px;\n height: 0px;\n opacity: 0;\n z-index: 99999;\n\n .jeksO7YZi3_R8GNIzv4D {\n bottom: calc(var(--chatbot-circle-radius) + 20px);\n position: absolute;\n right: 10px;\n width: 200px;\n }\n\n .O6vpXieYIso2cRwekQqD {\n width: 100%;\n background-color: var(--chatbot-popup-background-color);\n color: var(--chatbot-popup-text-color);\n border-radius: 10px 10px 0 10px;\n padding: 15px;\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n border: none;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .O6vpXieYIso2cRwekQqD:hover {\n background-color: var(--chatbot-popup-background-color);\n }\n\n .O6vpXieYIso2cRwekQqD:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 4px;\n }\n\n /* Triangle effect on the bottom right of the popup */\n .gx3uioPf7XBH183XzIsX:after {\n content: \"\";\n position: absolute;\n top: 100%;\n right: 0;\n border-width: 10px;\n border-style: solid;\n border-color: var(--chatbot-popup-background-color) transparent transparent\n transparent;\n }\n\n .SnDh_4tosUOepmnQ6qtw {\n position: absolute;\n top: -25px;\n right: 0px;\n color: rgb(98, 97, 97);\n background-color: transparent;\n border: none;\n cursor: pointer;\n }\n\n}\n\n.JU97fmgoNdy3Tfye2Dws {\n border-radius: 50px;\n background-color: var(--chatbot-circle-background-color);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n cursor: pointer;\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n height: var(--chatbot-circle-radius);\n width: var(--chatbot-circle-radius);\n border-radius: 50%;\n}\n\n/* Add these styles to your Chatbot.module.css file */\n\n.pkiR_TxdafoynTpvRdcQ {\n margin-top: 10px;\n font-size: 0.95rem;\n width: 100%;\n}\n\n.pkiR_TxdafoynTpvRdcQ > p {\n overflow-wrap: anywhere;\n}\n\n.e3H6efowOKFf_KRpdCmA {\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n.OwwGVqJowxUZVJuA2czv {\n text-decoration: none;\n color: var(--chatbot-bot-text-color);\n}\n\n.sCGr7vUZhXadHUv6e8Ir,\n.sCGr7vUZhXadHUv6e8Ir:hover {\n color: var(--chatbot-inline-link-color) !important;\n text-decoration: underline;\n font-size: 0.95rem;\n}\n\n.Bo90PPN_Vahh0nlC0xX9 {\n a {\n text-decoration: none;\n color: var(--chatbot-inline-link-color) !important;\n font-weight: 900;\n word-break: break-word;\n }\n}\n\n.Bo90PPN_Vahh0nlC0xX9 > p {\n margin-bottom: 0;\n}\n\n.elb0dKqBt_8ZGAEp_EkF {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 16px 16px;\n box-sizing: border-box;\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: 12px;\n background:\n linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.075),\n rgba(255, 255, 255, 0.025)\n ),\n rgba(255, 255, 255, 0.025);\n}\n\n.H1ZoUyR1lvfzrhY32Iks {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n width: 100%;\n padding: 0;\n box-sizing: border-box;\n}\n\n.FS7iocV3c2mOOsu9YyGQ {\n background-color: #25d366;\n color: white;\n border: none;\n border-radius: 999px;\n padding: 11px 20px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 0.9rem;\n line-height: 1.2;\n min-height: 42px;\n transition:\n box-shadow 0.2s ease,\n filter 0.2s ease;\n width: fit-content;\n text-decoration: none;\n align-self: center;\n box-shadow:\n 0 8px 20px rgba(37, 211, 102, 0.24),\n inset 0 1px 0 rgba(255, 255, 255, 0.24);\n}\n\n.FS7iocV3c2mOOsu9YyGQ:hover {\n color: white;\n filter: brightness(0.98);\n box-shadow:\n 0 10px 24px rgba(37, 211, 102, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.24);\n}\n\n.FS7iocV3c2mOOsu9YyGQ:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 3px;\n}\n\n.IeFCigUDcQq5wGoBLy3M {\n background-color: #25d366;\n}\n\n.lRpTsWPUSwGCqjp0t62h {\n background-color: #229ed9;\n}\n\n.FS7iocV3c2mOOsu9YyGQ i {\n font-size: 1.1rem;\n line-height: 1;\n}\n\n.bGwt6w5szvfURLrK73Qg {\n width: 100%;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.2),\n transparent\n );\n margin: 14px 0;\n opacity: 1;\n}\n\n.x0MAnMNVi2NF7R3qljbA {\n text-align: center;\n font-size: 0.88rem;\n line-height: 1.4;\n margin: 0 auto;\n max-width: min(100%, 390px);\n color: var(--chatbot-bot-text-color);\n font-weight: 700;\n}\n\n/* Feedback Form */\n.SNXty4ZDXCQFbweyRKm9 {\n box-sizing: border-box;\n width: 100%;\n padding: 8px 20px 16px;\n}\n\n.SesPiXjcgGk5ykyu52XT {\n position: static;\n box-sizing: border-box;\n width: 100%;\n padding: 14px 16px 16px;\n border: 1px solid rgba(255, 255, 255, 0.14);\n border-radius: 12px;\n background:\n linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.07),\n rgba(255, 255, 255, 0.02)\n ),\n var(--chatbot-bot-bubble-color, #fff);\n color: var(--chatbot-bot-text-color);\n box-shadow:\n 0 12px 28px rgba(0, 24, 56, 0.16),\n inset 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n.VwrkHICyuQCJMAvBAqPs {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n margin-bottom: 4px;\n}\n\n.msdQigSFf_EQBnMnqqpo {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n border-radius: 50%;\n background-color: transparent;\n color: var(--chatbot-bot-text-color);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.msdQigSFf_EQBnMnqqpo:hover {\n border-color: rgba(255, 255, 255, 0.16);\n background-color: rgba(255, 255, 255, 0.08);\n}\n\n.msdQigSFf_EQBnMnqqpo:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 2px;\n}\n\n.msdQigSFf_EQBnMnqqpo i {\n font-size: 1rem;\n}\n\n.cfhdg867vN0ZobXuP4Qd {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.JL4EdjCJ1Xh_P2vjT5GI {\n font-size: 0.88rem;\n font-weight: 700;\n line-height: 1.35;\n color: var(--chatbot-bot-text-color);\n margin: 0 0 10px;\n align-self: center;\n text-align: center;\n}\n\n.VyG3z3ZQo3QNVjSDGTtg {\n display: flex;\n gap: 6px;\n align-self: center;\n}\n\n.behDXE5Hc6T3OgGDWkPQ {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n border: 1px solid rgba(255, 255, 255, 0.12);\n background-color: rgba(255, 255, 255, 0.04);\n color: var(--chatbot-bot-text-color);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n color 0.2s ease;\n}\n\n.behDXE5Hc6T3OgGDWkPQ:hover,\n.behDXE5Hc6T3OgGDWkPQ:focus-visible {\n border-color: rgba(255, 255, 255, 0.28);\n background-color: rgba(255, 255, 255, 0.1);\n}\n\n.behDXE5Hc6T3OgGDWkPQ:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 2px;\n}\n\n.behDXE5Hc6T3OgGDWkPQ:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.behDXE5Hc6T3OgGDWkPQ i {\n font-size: 1.15rem;\n transition:\n color 0.2s ease,\n filter 0.2s ease;\n}\n\n.ZztE2YQdKxPPbHm1H3xa {\n color: #f59e0b;\n border-color: rgba(245, 158, 11, 0.34);\n background-color: rgba(245, 158, 11, 0.08);\n box-shadow:\n 0 0 0 1px rgba(245, 158, 11, 0.08),\n 0 4px 10px rgba(245, 158, 11, 0.08);\n}\n\n.ZztE2YQdKxPPbHm1H3xa i {\n filter: drop-shadow(0 1px 3px rgba(245, 158, 11, 0.16));\n}\n\n.HtjtoaceTCDfUbVxSep2 {\n width: 100%;\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 9px;\n}\n\n.BZGla_ZV_c6i3ebMcHm7 {\n color: var(--chatbot-bot-text-color);\n font-size: 0.76rem;\n font-weight: 700;\n line-height: 1.2;\n}\n\n.BhKEzzkVk9nZwPPBPFWe {\n width: 100%;\n min-height: 74px;\n padding: 10px 12px;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 0.82rem;\n font-weight: 500;\n color: var(--chatbot-bot-text-color);\n background-color: rgba(255, 255, 255, 0.045);\n resize: vertical;\n outline: none;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.BhKEzzkVk9nZwPPBPFWe:focus {\n border-color: var(--chatbot-header-color);\n background-color: rgba(255, 255, 255, 0.065);\n box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.08);\n}\n\n.BhKEzzkVk9nZwPPBPFWe::placeholder {\n color: var(--chatbot-bot-text-color);\n opacity: 0.5;\n}\n\n.YJ5JKd2sEnSsWK_WOXAB {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n margin-top: 2px;\n}\n\n.L9AzIA9tziUWoMhPNJBP {\n min-height: 36px;\n padding: 7px 16px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.28);\n background-color: transparent;\n color: var(--chatbot-bot-text-color);\n font-size: 0.8rem;\n font-weight: 700;\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease;\n}\n\n.L9AzIA9tziUWoMhPNJBP:hover {\n border-color: rgba(255, 255, 255, 0.42);\n background-color: rgba(255, 255, 255, 0.08);\n}\n\n.pvp0eslPPZfUSMnoWIgp {\n min-height: 36px;\n padding: 7px 18px;\n border-radius: 999px;\n border: none;\n background-color: var(--chatbot-header-color);\n color: var(--chatbot-header-text-color, white);\n font-size: 0.8rem;\n font-weight: 700;\n cursor: pointer;\n transition:\n box-shadow 0.2s ease,\n opacity 0.2s ease,\n filter 0.2s ease;\n box-shadow: 0 8px 18px rgba(0, 24, 56, 0.14);\n}\n\n.pvp0eslPPZfUSMnoWIgp:hover {\n filter: brightness(0.98);\n box-shadow: 0 10px 22px rgba(0, 24, 56, 0.18);\n}\n\n.pvp0eslPPZfUSMnoWIgp:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n box-shadow: none;\n}\n\n._CzJiZ0hvBlHkkpiR9hP {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #25d366;\n font-size: 0.85rem;\n font-weight: 700;\n padding: 8px 0;\n width: 100%;\n}\n\n._CzJiZ0hvBlHkkpiR9hP i {\n font-size: 1rem;\n}\n\n.Suczrphb9uYE7BI5Hc9A {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #fecaca;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.Suczrphb9uYE7BI5Hc9A i {\n font-size: 0.85rem;\n}\n`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"chatbotParent\": `bOJfQLIDdUlPEJzIVy0q`,\n\t\"chatbotContainer\": `mrPuzpzfdEmQSyTxnvxI`,\n\t\"inlineChatbotParent\": `EwBhaKWtrMkmlquKWEEo`,\n\t\"inlineChatbotContainer\": `dyE5pTsFKvJw8NgUVBbk`,\n\t\"inlineStateSurface\": `HrdPV1T8C8AOFmGVDVQX`,\n\t\"inlineStateContent\": `K4Ka7lBIi3uwlJDIQEt0`,\n\t\"inlineStateSpinner\": `NX1ohgiEEs0vaDOeQ2_w`,\n\t\"inlineChatbotSpin\": `gipOtf8Cs1L3UhoKYCY6`,\n\t\"inlineStateTitle\": `yXQQue2MsoLEzd9T2aoc`,\n\t\"inlineStateText\": `aH0mc9GAi1rPzFMrRzfF`,\n\t\"inlineStateErrorIcon\": `EHAnq_Q6pKh_POfqBrL4`,\n\t\"headerContainer\": `QJ6c9UPW4NdCwINA2KKw`,\n\t\"header\": `BAciNorgEk8q0Hjvg_Nd`,\n\t\"headerTitleContainer\": `rDNjthKTeHigjuhTaXFw`,\n\t\"headerTitle\": `qhIJF8jtTVHpl14phrvO`,\n\t\"headerSubtitle\": `bJ4qOXuizp8yq01SFRbe`,\n\t\"body\": `M84EXuBJb0ITHqmcP033`,\n\t\"bodyPromptsContainer\": `KJH5XQVgMgo5xa6hVmpQ`,\n\t\"promptsData\": `uodJA65d3QSnFHHi6wEE`,\n\t\"option\": `yMV8jdykQ0p_dG9sc2yK`,\n\t\"optionText\": `OFNqcCdonr5dxzTTZ3zK`,\n\t\"conversation\": `F4te4w0Rg9nYSlvqoOuU`,\n\t\"chatbotIcon\": `y3GymRJmY0MX41NX3xWJ`,\n\t\"message\": `soVXB5uMOlUUVHtMVzBV`,\n\t\"messageText\": `On7UzyczZB0EFpZn8hAO`,\n\t\"messageBody\": `ys2v0_nbj9UZ2GtmsGFl`,\n\t\"icon\": `ePwR5gBjQ2sQwKScmcAF`,\n\t\"footerBranding\": `n5EFd7Gb3khLARy7SBEE`,\n\t\"footerDisclaimer\": `UlJ8l2Ig0xMVd2kSSwFc`,\n\t\"footerDisclaimerIcon\": `GPH5IAUB9eqnV9y0rpGd`,\n\t\"footerDisclaimerText\": `P_GItjDPU4XleZm6P8xv`,\n\t\"footer\": `Cswbzq1GQuTnMGpPi4Zt`,\n\t\"footerInputSurface\": `o26SHWfHQz6ZsTl_ZHHY`,\n\t\"defaultPrompts\": `aZhpX5bTq5glnTwRfexE`,\n\t\"promptSuggestionsToggleMotion\": `_yHxsSehNpv6oVLoKuCt`,\n\t\"promptSuggestionsToggle\": `khl8aPnNVKa_2k4FtxCE`,\n\t\"promptSuggestionsToggleContent\": `OSorpbHQM_04uxRDzesw`,\n\t\"promptSuggestionsIcon\": `QQ1ZPgR9ghIXrFXB0CCh`,\n\t\"promptSuggestionsChevron\": `EwCXv8ZSCm3o5rYuMlss`,\n\t\"footerForm\": `ibnXsq4b88cDDvfQQgYn`,\n\t\"chatbotCircleContainer\": `nW2NG3krvonnMg3Rivul`,\n\t\"popupShell\": `jeksO7YZi3_R8GNIzv4D`,\n\t\"popupContainer\": `O6vpXieYIso2cRwekQqD`,\n\t\"popup\": `gx3uioPf7XBH183XzIsX`,\n\t\"closePopup\": `SnDh_4tosUOepmnQ6qtw`,\n\t\"chatbotCircle\": `JU97fmgoNdy3Tfye2Dws`,\n\t\"sourceList\": `pkiR_TxdafoynTpvRdcQ`,\n\t\"sourceTitle\": `e3H6efowOKFf_KRpdCmA`,\n\t\"sourceLink\": `OwwGVqJowxUZVJuA2czv`,\n\t\"sourceSwitch\": `sCGr7vUZhXadHUv6e8Ir`,\n\t\"markdownToHtmlContainer\": `Bo90PPN_Vahh0nlC0xX9`,\n\t\"supportActions\": `elb0dKqBt_8ZGAEp_EkF`,\n\t\"supportAction\": `H1ZoUyR1lvfzrhY32Iks`,\n\t\"supportButton\": `FS7iocV3c2mOOsu9YyGQ`,\n\t\"whatsappSupportButton\": `IeFCigUDcQq5wGoBLy3M`,\n\t\"telegramSupportButton\": `lRpTsWPUSwGCqjp0t62h`,\n\t\"messageDivider\": `bGwt6w5szvfURLrK73Qg`,\n\t\"supportText\": `x0MAnMNVi2NF7R3qljbA`,\n\t\"feedbackPanelContainer\": `SNXty4ZDXCQFbweyRKm9`,\n\t\"feedbackPanel\": `SesPiXjcgGk5ykyu52XT`,\n\t\"feedbackPanelActions\": `VwrkHICyuQCJMAvBAqPs`,\n\t\"feedbackPanelClose\": `msdQigSFf_EQBnMnqqpo`,\n\t\"feedbackForm\": `cfhdg867vN0ZobXuP4Qd`,\n\t\"feedbackTitle\": `JL4EdjCJ1Xh_P2vjT5GI`,\n\t\"feedbackRatingContainer\": `VyG3z3ZQo3QNVjSDGTtg`,\n\t\"feedbackStarButton\": `behDXE5Hc6T3OgGDWkPQ`,\n\t\"feedbackStarSelected\": `ZztE2YQdKxPPbHm1H3xa`,\n\t\"feedbackExpanded\": `HtjtoaceTCDfUbVxSep2`,\n\t\"feedbackTextareaLabel\": `BZGla_ZV_c6i3ebMcHm7`,\n\t\"feedbackTextarea\": `BhKEzzkVk9nZwPPBPFWe`,\n\t\"feedbackActions\": `YJ5JKd2sEnSsWK_WOXAB`,\n\t\"feedbackCancelButton\": `L9AzIA9tziUWoMhPNJBP`,\n\t\"feedbackSubmitButton\": `pvp0eslPPZfUSMnoWIgp`,\n\t\"feedbackSuccess\": `_CzJiZ0hvBlHkkpiR9hP`,\n\t\"feedbackError\": `Suczrphb9uYE7BI5Hc9A`\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://VamChatbot/./Chatbot.module.css?./node_modules/css-loader/dist/cjs.js??ruleSet%5B1%5D.rules%5B1%5D.use%5B1%5D");
|
|
282
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n___CSS_LOADER_EXPORT___.push([module.id, \"@import url(https://fonts.googleapis.com/css2?family=Open+Sans:ital,wdth,wght@0,75..100,300..800;1,75..100,300..800&display=swap);\"]);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.bOJfQLIDdUlPEJzIVy0q {\n --chatbot-height: 70%;\n --chatbot-width: 30%;\n --chatbot-header-height: 50px;\n --chatbot-footer-height: 80px;\n --chatbot-footer-input-height: 40px;\n --chatbot-circle-radius: 70px;\n --chatbot-spacing-x: 10px;\n --chatbot-spacing-y: 10px;\n --chatbot-border-radius: 10px;\n}\n\n@media only screen and (max-width: 1280px) {\n .bOJfQLIDdUlPEJzIVy0q {\n --chatbot-width: 50%;\n --chatbot-height: 80%;\n }\n}\n\n@media only screen and (max-width: 768px) {\n .bOJfQLIDdUlPEJzIVy0q {\n --chatbot-width: 100%;\n --chatbot-height: 100%;\n --chatbot-header-height: 70px;\n --chatbot-spacing-x: 0px;\n --chatbot-spacing-y: 0px;\n --chatbot-border-radius: 0px;\n }\n}\n\n.mrPuzpzfdEmQSyTxnvxI {\n font-family: \"Open Sans\", sans-serif;\n font-optical-sizing: auto;\n font-weight: 600;\n font-style: normal;\n font-variation-settings: \"wdth\" 90;\n position: fixed;\n overflow: hidden;\n border-radius: var(--chatbot-border-radius);\n bottom: var(--chatbot-spacing-y);\n right: var(--chatbot-spacing-x);\n height: var(--chatbot-height);\n width: var(--chatbot-width);\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n z-index: 99999;\n}\n\n.EwBhaKWtrMkmlquKWEEo {\n width: var(--chatbot-inline-width, 100%);\n height: var(--chatbot-inline-height, 640px);\n min-height: var(--chatbot-inline-min-height, 480px);\n box-sizing: border-box;\n}\n\n.dyE5pTsFKvJw8NgUVBbk {\n position: relative;\n bottom: auto;\n right: auto;\n width: 100%;\n max-width: 100%;\n height: 100%;\n min-height: 100%;\n box-sizing: border-box;\n z-index: 0;\n isolation: isolate;\n}\n\n:host([layout=\"inline\"]) .EwBhaKWtrMkmlquKWEEo {\n width: 100%;\n height: 100%;\n min-height: 100%;\n}\n\n.HrdPV1T8C8AOFmGVDVQX {\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--chatbot-background-color, #fff);\n border-radius: var(--chatbot-border-radius);\n color: var(--chatbot-bot-text-color, #1f2937);\n padding: 24px;\n box-sizing: border-box;\n}\n\n.K4Ka7lBIi3uwlJDIQEt0 {\n max-width: 420px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n text-align: center;\n}\n\n.NX1ohgiEEs0vaDOeQ2_w {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 3px solid rgba(31, 41, 55, 0.16);\n border-top-color: var(--chatbot-header-color, #4f46e5);\n animation: gipOtf8Cs1L3UhoKYCY6 0.8s linear infinite;\n}\n\n.yXQQue2MsoLEzd9T2aoc {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n}\n\n.aH0mc9GAi1rPzFMrRzfF {\n margin: 0;\n font-size: 0.9rem;\n font-weight: 500;\n line-height: 1.45;\n}\n\n.EHAnq_Q6pKh_POfqBrL4 {\n font-size: 1.6rem;\n color: #e74c3c;\n}\n\n@keyframes gipOtf8Cs1L3UhoKYCY6 {\n to {\n transform: rotate(360deg);\n }\n}\n\n.QJ6c9UPW4NdCwINA2KKw {\n position: absolute;\n width: 100%;\n background-color: var(--chatbot-header-color);\n padding: 0 10px;\n border-bottom: 0.5px solid var(--chatbot-border-color);\n z-index: 99998;\n height: var(--chatbot-header-height);\n}\n\n.BAciNorgEk8q0Hjvg_Nd {\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: white;\n font-size: 1.4rem;\n\n button,\n button:hover {\n background-color: var(--chatbot-header-color);\n color: var(--chatbot-header-text-color);\n border: none;\n }\n}\n\n.rDNjthKTeHigjuhTaXFw {\n display: flex;\n height: 100%;\n flex-direction: column;\n align-items: flex-start;\n /* Align items to the start (left) */\n justify-content: center;\n /* Center vertically within the container */\n /* padding-left: 10px; */\n /* Add padding to push it away from the edge */\n}\n\n.qhIJF8jtTVHpl14phrvO {\n font-weight: 700;\n text-align: start;\n color: var(--chatbot-header-text-color);\n}\n\n.bJ4qOXuizp8yq01SFRbe {\n font-weight: 700;\n font-size: 0.4rem;\n text-align: start;\n}\n\n.M84EXuBJb0ITHqmcP033 {\n margin-top: var(--chatbot-header-height);\n font-size: 1rem;\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n background-color: var(--chatbot-background-color);\n height: calc(100% - var(--chatbot-header-height));\n}\n\n.KJH5XQVgMgo5xa6hVmpQ {\n .uodJA65d3QSnFHHi6wEE {\n row-gap: 10px;\n column-gap: 10px;\n padding: 0 20px;\n }\n .yMV8jdykQ0p_dG9sc2yK {\n gap: 10px;\n border-radius: 10px;\n padding: 5px 12px;\n cursor: pointer;\n color: var(--chatbot-prompt-text-color);\n\n .OFNqcCdonr5dxzTTZ3zK {\n font-size: 0.85rem;\n }\n }\n}\n\n.F4te4w0Rg9nYSlvqoOuU {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n.y3GymRJmY0MX41NX3xWJ {\n /* width: 45px; */\n height: 70px;\n}\n\n.soVXB5uMOlUUVHtMVzBV,\n.BAciNorgEk8q0Hjvg_Nd {\n .y3GymRJmY0MX41NX3xWJ {\n /* width: 40px; */\n height: 40px;\n }\n}\n\n.soVXB5uMOlUUVHtMVzBV {\n display: flex;\n gap: 10px;\n height: fit-content;\n padding: 10px 20px;\n\n .On7UzyczZB0EFpZn8hAO {\n border-radius: 10px;\n padding: 5px 10px;\n display: flex;\n align-items: center;\n flex-direction: column;\n align-items: flex-start;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.25);\n }\n\n i {\n font-size: 24px;\n }\n}\n\n.ys2v0_nbj9UZ2GtmsGFl {\n display: flex;\n flex-direction: column;\n}\n\n.uodJA65d3QSnFHHi6wEE {\n display: flex;\n flex-wrap: wrap;\n row-gap: 20px;\n column-gap: 15px;\n justify-content: center;\n padding: 20px 10px 20px 10px;\n}\n\n.yMV8jdykQ0p_dG9sc2yK {\n display: flex;\n gap: 10px;\n align-items: center;\n height: fit-content;\n background-color: var(--chatbot-prompt-background-color);\n border-radius: 10px;\n padding: 10px 30px;\n border: none;\n font-variation-settings: \"wdth\" 90;\n font-weight: 600;\n color: var(--chatbot-prompt-text-color);\n\n .OFNqcCdonr5dxzTTZ3zK {\n font-size: 0.85rem;\n }\n}\n\n.yMV8jdykQ0p_dG9sc2yK:disabled {\n cursor: not-allowed;\n}\n\n.ePwR5gBjQ2sQwKScmcAF {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 30px;\n max-width: 30px;\n height: 30px;\n border-radius: 30px;\n background-color: grey;\n}\n\n.n5EFd7Gb3khLARy7SBEE {\n display: block;\n text-align: center;\n font-size: 0.7rem;\n font-weight: 700;\n margin: 5px 0 0;\n background: linear-gradient(to bottom, #39cff6, #ad84ff);\n background-clip: text;\n color: transparent;\n}\n\n.UlJ8l2Ig0xMVd2kSSwFc {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n max-width: calc(100% - 32px);\n width: fit-content;\n box-sizing: border-box;\n margin: 0 auto 7px;\n padding: 3px 9px;\n border: 1px solid\n var(--chatbot-footer-disclaimer-border-color, rgba(0, 0, 0, 0.08));\n border-radius: 999px;\n background-color: var(\n --chatbot-footer-disclaimer-background-color,\n rgba(0, 0, 0, 0.035)\n );\n color: var(--chatbot-footer-disclaimer-color, rgba(73, 74, 75, 0.82));\n font-size: 0.64rem;\n font-weight: 600;\n line-height: 1.2;\n text-align: center;\n white-space: normal;\n}\n\n.GPH5IAUB9eqnV9y0rpGd {\n flex: 0 0 auto;\n color: var(\n --chatbot-footer-disclaimer-icon-color,\n var(--chatbot-header-color)\n );\n font-size: 0.68rem;\n opacity: 0.72;\n}\n\n.P_GItjDPU4XleZm6P8xv {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.Cswbzq1GQuTnMGpPi4Zt {\n width: 95%;\n margin: 7px auto 10px;\n}\n\n.o26SHWfHQz6ZsTl_ZHHY {\n overflow: hidden;\n border-radius: 10px;\n background-color: var(--chatbot-background-color);\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.25);\n}\n\n.aZhpX5bTq5glnTwRfexE {\n background-color: var(--chatbot-background-color);\n}\n\n._yHxsSehNpv6oVLoKuCt {\n overflow: hidden;\n}\n\n.khl8aPnNVKa_2k4FtxCE {\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n width: 100%;\n min-height: 34px;\n margin: 0;\n padding: 6px 14px;\n border: none;\n border-bottom: 1px solid\n var(--chatbot-footer-disclaimer-border-color, rgba(0, 0, 0, 0.08));\n background-color: var(--chatbot-background-color);\n color: var(--chatbot-header-color);\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: 0.72rem;\n font-weight: 700;\n line-height: 1.3;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.khl8aPnNVKa_2k4FtxCE:hover {\n color: var(--chatbot-footericons-hover-color);\n}\n\n.khl8aPnNVKa_2k4FtxCE:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: -2px;\n}\n\n.OSorpbHQM_04uxRDzesw {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n min-width: 0;\n line-height: 1.3;\n}\n\n.QQ1ZPgR9ghIXrFXB0CCh,\n.EwCXv8ZSCm3o5rYuMlss {\n flex: 0 0 auto;\n color: currentColor;\n font-size: 0.82rem;\n line-height: 1;\n}\n\n.OSorpbHQM_04uxRDzesw span {\n display: block;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ibnXsq4b88cDDvfQQgYn {\n display: flex;\n align-items: center;\n min-height: var(--chatbot-footer-input-height);\n height: var(--chatbot-footer-input-height);\n border-radius: 0;\n overflow: hidden;\n background-color: var(--chatbot-background-color);\n\n i {\n font-size: 1.75rem;\n }\n /* Ensures the button and input are nicely clipped within the border radius */\n}\n\n.Cswbzq1GQuTnMGpPi4Zt input {\n font-family: \"Open Sans\", sans-serif;\n font-optical-sizing: auto;\n font-weight: 600;\n font-style: normal;\n font-variation-settings: \"wdth\" 95;\n color: var(--chatbot-input-text-color);\n background-color: var(--chatbot-background-color);\n border: none;\n padding: 0 10px;\n flex: 1 1 auto;\n min-width: 0;\n width: auto;\n height: 100%;\n outline: none;\n transition:\n box-shadow 0.3s ease,\n border-color 0.3s ease;\n}\n\n.Cswbzq1GQuTnMGpPi4Zt input:focus {\n border-color: var(--chatbot-user-bubble-color);\n box-shadow: 0 10 10px var(--chatbot-user-bubble-color);\n /* Adds a glow effect on focus */\n}\n\n.ibnXsq4b88cDDvfQQgYn button {\n background-color: var(--chatbot-background-color);\n border: none;\n padding: 0 15px;\n /* Extra padding for the button */\n color: var(--chatbot-footer-icon-color);\n cursor: pointer;\n transition: color 0.3s ease;\n}\n\n.ibnXsq4b88cDDvfQQgYn button:hover {\n color: var(--chatbot-footericons-hover-color);\n /* filter: brightness(2); */\n /* Optional: hover effect for the button */\n}\n\n.ibnXsq4b88cDDvfQQgYn button:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: -2px;\n}\n\n.ibnXsq4b88cDDvfQQgYn button:disabled {\n opacity: 0.6;\n /* Makes the button appear disabled */\n cursor: not-allowed;\n /* Changes cursor to indicate it's disabled */\n}\n\n.nW2NG3krvonnMg3Rivul {\n position: fixed;\n bottom: var(--chatbot-spacing-y);\n right: var(--chatbot-spacing-x);\n width: 0px;\n height: 0px;\n opacity: 0;\n z-index: 99999;\n\n .jeksO7YZi3_R8GNIzv4D {\n bottom: calc(var(--chatbot-circle-radius) + 20px);\n position: absolute;\n right: 10px;\n width: 200px;\n }\n\n .O6vpXieYIso2cRwekQqD {\n width: 100%;\n background-color: var(--chatbot-popup-background-color);\n color: var(--chatbot-popup-text-color);\n border-radius: 10px 10px 0 10px;\n padding: 15px;\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n border: none;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .O6vpXieYIso2cRwekQqD:hover {\n background-color: var(--chatbot-popup-background-color);\n }\n\n .O6vpXieYIso2cRwekQqD:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 4px;\n }\n\n /* Triangle effect on the bottom right of the popup */\n .gx3uioPf7XBH183XzIsX:after {\n content: \"\";\n position: absolute;\n top: 100%;\n right: 0;\n border-width: 10px;\n border-style: solid;\n border-color: var(--chatbot-popup-background-color) transparent transparent\n transparent;\n }\n\n .SnDh_4tosUOepmnQ6qtw {\n position: absolute;\n top: -25px;\n right: 0px;\n color: rgb(98, 97, 97);\n background-color: transparent;\n border: none;\n cursor: pointer;\n }\n\n}\n\n.JU97fmgoNdy3Tfye2Dws {\n border-radius: 50px;\n background-color: var(--chatbot-circle-background-color);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n cursor: pointer;\n box-shadow: 0 8px 16px 6px rgba(0, 24, 56, 0.2);\n height: var(--chatbot-circle-radius);\n width: var(--chatbot-circle-radius);\n border-radius: 50%;\n}\n\n/* Add these styles to your Chatbot.module.css file */\n\n.pkiR_TxdafoynTpvRdcQ {\n margin-top: 10px;\n font-size: 0.95rem;\n width: 100%;\n}\n\n.pkiR_TxdafoynTpvRdcQ > p {\n overflow-wrap: anywhere;\n}\n\n.e3H6efowOKFf_KRpdCmA {\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n.OwwGVqJowxUZVJuA2czv {\n text-decoration: none;\n color: var(--chatbot-bot-text-color);\n}\n\n.sCGr7vUZhXadHUv6e8Ir,\n.sCGr7vUZhXadHUv6e8Ir:hover {\n color: var(--chatbot-inline-link-color) !important;\n text-decoration: underline;\n font-size: 0.95rem;\n}\n\n.Bo90PPN_Vahh0nlC0xX9 {\n a {\n text-decoration: none;\n color: var(--chatbot-inline-link-color) !important;\n font-weight: 900;\n word-break: break-word;\n }\n}\n\n.Bo90PPN_Vahh0nlC0xX9 > p {\n margin-bottom: 0;\n}\n\n.elb0dKqBt_8ZGAEp_EkF {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 16px 16px;\n box-sizing: border-box;\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: 12px;\n background:\n linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.075),\n rgba(255, 255, 255, 0.025)\n ),\n rgba(255, 255, 255, 0.025);\n}\n\n.H1ZoUyR1lvfzrhY32Iks {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n width: 100%;\n padding: 0;\n box-sizing: border-box;\n}\n\n.FS7iocV3c2mOOsu9YyGQ {\n background-color: #25d366;\n color: white;\n border: none;\n border-radius: 999px;\n padding: 11px 20px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 0.9rem;\n line-height: 1.2;\n min-height: 42px;\n transition:\n box-shadow 0.2s ease,\n filter 0.2s ease;\n width: fit-content;\n text-decoration: none;\n align-self: center;\n box-shadow:\n 0 8px 20px rgba(37, 211, 102, 0.24),\n inset 0 1px 0 rgba(255, 255, 255, 0.24);\n}\n\n.FS7iocV3c2mOOsu9YyGQ:hover {\n color: white;\n filter: brightness(0.98);\n box-shadow:\n 0 10px 24px rgba(37, 211, 102, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.24);\n}\n\n.FS7iocV3c2mOOsu9YyGQ:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 3px;\n}\n\n.IeFCigUDcQq5wGoBLy3M {\n background-color: #25d366;\n}\n\n.lRpTsWPUSwGCqjp0t62h {\n background-color: #229ed9;\n}\n\n.FS7iocV3c2mOOsu9YyGQ i {\n font-size: 1.1rem;\n line-height: 1;\n}\n\n.bGwt6w5szvfURLrK73Qg {\n width: 100%;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.2),\n transparent\n );\n margin: 14px 0;\n opacity: 1;\n}\n\n.x0MAnMNVi2NF7R3qljbA {\n text-align: center;\n font-size: 0.88rem;\n line-height: 1.4;\n margin: 0 auto;\n max-width: min(100%, 390px);\n color: var(--chatbot-bot-text-color);\n font-weight: 700;\n}\n\n/* Feedback Form */\n.SNXty4ZDXCQFbweyRKm9 {\n box-sizing: border-box;\n width: 100%;\n padding: 8px 18px 16px;\n}\n\n.SesPiXjcgGk5ykyu52XT {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n padding: 20px 58px;\n border: 1px solid rgba(255, 255, 255, 0.14);\n border-radius: 14px;\n background:\n linear-gradient(\n 180deg,\n rgba(112, 38, 62, 0.98),\n rgba(72, 28, 47, 0.98)\n ),\n #4d1f32;\n color: #fff7fa;\n box-shadow:\n 0 18px 44px rgba(45, 18, 31, 0.28),\n 0 1px 0 rgba(255, 255, 255, 0.14) inset;\n}\n\n.VwrkHICyuQCJMAvBAqPs {\n position: absolute;\n top: 18px;\n right: 18px;\n z-index: 1;\n display: flex;\n justify-content: flex-end;\n}\n\n.msdQigSFf_EQBnMnqqpo {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n border-radius: 50%;\n background-color: transparent;\n color: rgba(255, 247, 250, 0.74);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n color 0.2s ease;\n}\n\n.msdQigSFf_EQBnMnqqpo:hover {\n border-color: rgba(255, 255, 255, 0.14);\n background-color: rgba(255, 255, 255, 0.08);\n color: #fff;\n}\n\n.msdQigSFf_EQBnMnqqpo:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 2px;\n}\n\n.msdQigSFf_EQBnMnqqpo i {\n font-size: 1rem;\n}\n\n.cfhdg867vN0ZobXuP4Qd {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 14px;\n}\n\n.JL4EdjCJ1Xh_P2vjT5GI {\n font-size: 0.88rem;\n font-weight: 700;\n line-height: 1.35;\n color: #fff7fa;\n margin: 0 0 10px;\n align-self: center;\n text-align: center;\n}\n\n.VyG3z3ZQo3QNVjSDGTtg {\n display: flex;\n gap: 6px;\n align-self: center;\n}\n\n.behDXE5Hc6T3OgGDWkPQ {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n border: 1px solid rgba(255, 255, 255, 0.16);\n background-color: rgba(255, 255, 255, 0.08);\n color: rgba(255, 247, 250, 0.8);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n color 0.2s ease;\n}\n\n.behDXE5Hc6T3OgGDWkPQ:hover,\n.behDXE5Hc6T3OgGDWkPQ:focus-visible {\n border-color: rgba(255, 255, 255, 0.3);\n background-color: rgba(255, 255, 255, 0.13);\n}\n\n.behDXE5Hc6T3OgGDWkPQ:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 2px;\n}\n\n.behDXE5Hc6T3OgGDWkPQ:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.behDXE5Hc6T3OgGDWkPQ i {\n font-size: 1.15rem;\n transition:\n color 0.2s ease,\n filter 0.2s ease;\n}\n\n.ZztE2YQdKxPPbHm1H3xa {\n color: #f59e0b;\n border-color: rgba(245, 158, 11, 0.34);\n background-color: rgba(245, 158, 11, 0.08);\n box-shadow:\n 0 0 0 1px rgba(245, 158, 11, 0.08),\n 0 4px 10px rgba(245, 158, 11, 0.08);\n}\n\n.ZztE2YQdKxPPbHm1H3xa i {\n filter: drop-shadow(0 1px 3px rgba(245, 158, 11, 0.16));\n}\n\n.HtjtoaceTCDfUbVxSep2 {\n width: 100%;\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 9px;\n}\n\n.BZGla_ZV_c6i3ebMcHm7 {\n color: #fff7fa;\n font-size: 0.76rem;\n font-weight: 700;\n line-height: 1.2;\n}\n\n.BhKEzzkVk9nZwPPBPFWe {\n width: 100%;\n min-height: 74px;\n padding: 10px 12px;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 0.82rem;\n font-weight: 500;\n color: #fff7fa;\n background-color: rgba(255, 255, 255, 0.08);\n resize: vertical;\n outline: none;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.BhKEzzkVk9nZwPPBPFWe:focus {\n border-color: rgba(255, 255, 255, 0.36);\n background-color: rgba(255, 255, 255, 0.11);\n box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.08);\n}\n\n.BhKEzzkVk9nZwPPBPFWe::placeholder {\n color: rgba(255, 247, 250, 0.68);\n opacity: 1;\n}\n\n.YJ5JKd2sEnSsWK_WOXAB {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n margin-top: 2px;\n}\n\n.L9AzIA9tziUWoMhPNJBP {\n min-height: 36px;\n padding: 7px 16px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.22);\n background-color: transparent;\n color: #fff7fa;\n font-size: 0.8rem;\n font-weight: 700;\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease;\n}\n\n.L9AzIA9tziUWoMhPNJBP:hover {\n border-color: rgba(255, 255, 255, 0.34);\n background-color: rgba(255, 255, 255, 0.08);\n}\n\n.pvp0eslPPZfUSMnoWIgp {\n min-height: 36px;\n padding: 7px 18px;\n border-radius: 999px;\n border: none;\n background-color: var(--chatbot-header-color);\n color: var(--chatbot-header-text-color, white);\n font-size: 0.8rem;\n font-weight: 700;\n cursor: pointer;\n transition:\n box-shadow 0.2s ease,\n opacity 0.2s ease,\n filter 0.2s ease;\n box-shadow: 0 8px 18px rgba(0, 24, 56, 0.14);\n}\n\n.pvp0eslPPZfUSMnoWIgp:hover {\n filter: brightness(0.98);\n box-shadow: 0 10px 22px rgba(0, 24, 56, 0.18);\n}\n\n.pvp0eslPPZfUSMnoWIgp:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n box-shadow: none;\n}\n\n._CzJiZ0hvBlHkkpiR9hP {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #dcfce7;\n font-size: 0.86rem;\n font-weight: 700;\n line-height: 1.25;\n width: fit-content;\n max-width: 100%;\n padding: 7px 11px;\n border: 1px solid rgba(134, 239, 172, 0.22);\n border-radius: 999px;\n background: rgba(20, 83, 45, 0.34);\n box-shadow:\n 0 1px 2px rgba(20, 83, 45, 0.12),\n inset 0 1px 0 rgba(255, 255, 255, 0.12);\n}\n\n._CzJiZ0hvBlHkkpiR9hP i {\n font-size: 1rem;\n line-height: 1;\n}\n\n.SesPiXjcgGk5ykyu52XT .bGwt6w5szvfURLrK73Qg {\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.13),\n transparent\n );\n margin: 0;\n}\n\n.SesPiXjcgGk5ykyu52XT .elb0dKqBt_8ZGAEp_EkF {\n gap: 12px;\n padding: 16px 18px 18px;\n border-color: rgba(255, 255, 255, 0.13);\n border-radius: 14px;\n background:\n linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.115),\n rgba(255, 255, 255, 0.055)\n ),\n rgba(255, 255, 255, 0.07);\n box-shadow:\n 0 1px 0 rgba(255, 255, 255, 0.12) inset,\n 0 10px 26px rgba(35, 12, 25, 0.14);\n}\n\n.SesPiXjcgGk5ykyu52XT .x0MAnMNVi2NF7R3qljbA {\n color: #fff7fa;\n font-size: 0.88rem;\n line-height: 1.35;\n}\n\n.SesPiXjcgGk5ykyu52XT .FS7iocV3c2mOOsu9YyGQ {\n min-height: 40px;\n padding: 10px 18px;\n font-size: 0.86rem;\n box-shadow:\n 0 8px 18px rgba(37, 211, 102, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.24);\n}\n\n.Suczrphb9uYE7BI5Hc9A {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #fecaca;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.Suczrphb9uYE7BI5Hc9A i {\n font-size: 0.85rem;\n}\n\n.sSOlBZ8IP_sOz8jMF3Du {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n width: fit-content;\n max-width: 100%;\n margin-top: 7px;\n margin-left: 4px;\n padding: 4px;\n border: 1px solid rgba(15, 23, 42, 0.08);\n border-radius: 999px;\n background:\n linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.92),\n rgba(255, 255, 255, 0.76)\n ),\n rgba(255, 255, 255, 0.82);\n box-shadow:\n 0 8px 18px rgba(0, 24, 56, 0.07),\n inset 0 1px 0 rgba(255, 255, 255, 0.68);\n}\n\n.ur7mlvTGc_saxw76udeb {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n}\n\n.S8VMrNVgaDd6qilhUPYA {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 999px;\n background-color: transparent;\n color: rgba(15, 23, 42, 0.52);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease,\n color 0.2s ease,\n box-shadow 0.2s ease,\n opacity 0.2s ease;\n}\n\n.S8VMrNVgaDd6qilhUPYA:hover,\n.S8VMrNVgaDd6qilhUPYA:focus-visible {\n border-color: rgba(6, 182, 212, 0.16);\n background-color: rgba(6, 182, 212, 0.065);\n color: rgba(15, 23, 42, 0.78);\n}\n\n.S8VMrNVgaDd6qilhUPYA:focus-visible {\n outline: 2px solid var(--chatbot-footericons-hover-color);\n outline-offset: 2px;\n}\n\n.S8VMrNVgaDd6qilhUPYA:disabled {\n cursor: not-allowed;\n color: rgba(15, 23, 42, 0.3);\n}\n\n.S8VMrNVgaDd6qilhUPYA i {\n font-size: 0.9rem;\n line-height: 1;\n}\n\n.vdOxXF3kbEw3tKVUC75p {\n border-color: rgba(6, 182, 212, 0.22);\n background:\n linear-gradient(\n 180deg,\n rgba(6, 182, 212, 0.13),\n rgba(6, 182, 212, 0.07)\n ),\n rgba(255, 255, 255, 0.7);\n color: #0891b2;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.7),\n 0 3px 8px rgba(6, 182, 212, 0.08);\n}\n\n.Iq7itgAUJuh_1lsiejaC {\n color: rgba(15, 23, 42, 0.64);\n font-size: 0.7rem;\n font-weight: 700;\n line-height: 1.2;\n padding: 0 5px 0 1px;\n white-space: nowrap;\n}\n\n.sOAeMNcCXDLoN0gv5BYF {\n color: #ef4444;\n font-size: 0.72rem;\n font-weight: 700;\n line-height: 1.2;\n}\n`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"chatbotParent\": `bOJfQLIDdUlPEJzIVy0q`,\n\t\"chatbotContainer\": `mrPuzpzfdEmQSyTxnvxI`,\n\t\"inlineChatbotParent\": `EwBhaKWtrMkmlquKWEEo`,\n\t\"inlineChatbotContainer\": `dyE5pTsFKvJw8NgUVBbk`,\n\t\"inlineStateSurface\": `HrdPV1T8C8AOFmGVDVQX`,\n\t\"inlineStateContent\": `K4Ka7lBIi3uwlJDIQEt0`,\n\t\"inlineStateSpinner\": `NX1ohgiEEs0vaDOeQ2_w`,\n\t\"inlineChatbotSpin\": `gipOtf8Cs1L3UhoKYCY6`,\n\t\"inlineStateTitle\": `yXQQue2MsoLEzd9T2aoc`,\n\t\"inlineStateText\": `aH0mc9GAi1rPzFMrRzfF`,\n\t\"inlineStateErrorIcon\": `EHAnq_Q6pKh_POfqBrL4`,\n\t\"headerContainer\": `QJ6c9UPW4NdCwINA2KKw`,\n\t\"header\": `BAciNorgEk8q0Hjvg_Nd`,\n\t\"headerTitleContainer\": `rDNjthKTeHigjuhTaXFw`,\n\t\"headerTitle\": `qhIJF8jtTVHpl14phrvO`,\n\t\"headerSubtitle\": `bJ4qOXuizp8yq01SFRbe`,\n\t\"body\": `M84EXuBJb0ITHqmcP033`,\n\t\"bodyPromptsContainer\": `KJH5XQVgMgo5xa6hVmpQ`,\n\t\"promptsData\": `uodJA65d3QSnFHHi6wEE`,\n\t\"option\": `yMV8jdykQ0p_dG9sc2yK`,\n\t\"optionText\": `OFNqcCdonr5dxzTTZ3zK`,\n\t\"conversation\": `F4te4w0Rg9nYSlvqoOuU`,\n\t\"chatbotIcon\": `y3GymRJmY0MX41NX3xWJ`,\n\t\"message\": `soVXB5uMOlUUVHtMVzBV`,\n\t\"messageText\": `On7UzyczZB0EFpZn8hAO`,\n\t\"messageBody\": `ys2v0_nbj9UZ2GtmsGFl`,\n\t\"icon\": `ePwR5gBjQ2sQwKScmcAF`,\n\t\"footerBranding\": `n5EFd7Gb3khLARy7SBEE`,\n\t\"footerDisclaimer\": `UlJ8l2Ig0xMVd2kSSwFc`,\n\t\"footerDisclaimerIcon\": `GPH5IAUB9eqnV9y0rpGd`,\n\t\"footerDisclaimerText\": `P_GItjDPU4XleZm6P8xv`,\n\t\"footer\": `Cswbzq1GQuTnMGpPi4Zt`,\n\t\"footerInputSurface\": `o26SHWfHQz6ZsTl_ZHHY`,\n\t\"defaultPrompts\": `aZhpX5bTq5glnTwRfexE`,\n\t\"promptSuggestionsToggleMotion\": `_yHxsSehNpv6oVLoKuCt`,\n\t\"promptSuggestionsToggle\": `khl8aPnNVKa_2k4FtxCE`,\n\t\"promptSuggestionsToggleContent\": `OSorpbHQM_04uxRDzesw`,\n\t\"promptSuggestionsIcon\": `QQ1ZPgR9ghIXrFXB0CCh`,\n\t\"promptSuggestionsChevron\": `EwCXv8ZSCm3o5rYuMlss`,\n\t\"footerForm\": `ibnXsq4b88cDDvfQQgYn`,\n\t\"chatbotCircleContainer\": `nW2NG3krvonnMg3Rivul`,\n\t\"popupShell\": `jeksO7YZi3_R8GNIzv4D`,\n\t\"popupContainer\": `O6vpXieYIso2cRwekQqD`,\n\t\"popup\": `gx3uioPf7XBH183XzIsX`,\n\t\"closePopup\": `SnDh_4tosUOepmnQ6qtw`,\n\t\"chatbotCircle\": `JU97fmgoNdy3Tfye2Dws`,\n\t\"sourceList\": `pkiR_TxdafoynTpvRdcQ`,\n\t\"sourceTitle\": `e3H6efowOKFf_KRpdCmA`,\n\t\"sourceLink\": `OwwGVqJowxUZVJuA2czv`,\n\t\"sourceSwitch\": `sCGr7vUZhXadHUv6e8Ir`,\n\t\"markdownToHtmlContainer\": `Bo90PPN_Vahh0nlC0xX9`,\n\t\"supportActions\": `elb0dKqBt_8ZGAEp_EkF`,\n\t\"supportAction\": `H1ZoUyR1lvfzrhY32Iks`,\n\t\"supportButton\": `FS7iocV3c2mOOsu9YyGQ`,\n\t\"whatsappSupportButton\": `IeFCigUDcQq5wGoBLy3M`,\n\t\"telegramSupportButton\": `lRpTsWPUSwGCqjp0t62h`,\n\t\"messageDivider\": `bGwt6w5szvfURLrK73Qg`,\n\t\"supportText\": `x0MAnMNVi2NF7R3qljbA`,\n\t\"feedbackPanelContainer\": `SNXty4ZDXCQFbweyRKm9`,\n\t\"feedbackPanel\": `SesPiXjcgGk5ykyu52XT`,\n\t\"feedbackPanelActions\": `VwrkHICyuQCJMAvBAqPs`,\n\t\"feedbackPanelClose\": `msdQigSFf_EQBnMnqqpo`,\n\t\"feedbackForm\": `cfhdg867vN0ZobXuP4Qd`,\n\t\"feedbackTitle\": `JL4EdjCJ1Xh_P2vjT5GI`,\n\t\"feedbackRatingContainer\": `VyG3z3ZQo3QNVjSDGTtg`,\n\t\"feedbackStarButton\": `behDXE5Hc6T3OgGDWkPQ`,\n\t\"feedbackStarSelected\": `ZztE2YQdKxPPbHm1H3xa`,\n\t\"feedbackExpanded\": `HtjtoaceTCDfUbVxSep2`,\n\t\"feedbackTextareaLabel\": `BZGla_ZV_c6i3ebMcHm7`,\n\t\"feedbackTextarea\": `BhKEzzkVk9nZwPPBPFWe`,\n\t\"feedbackActions\": `YJ5JKd2sEnSsWK_WOXAB`,\n\t\"feedbackCancelButton\": `L9AzIA9tziUWoMhPNJBP`,\n\t\"feedbackSubmitButton\": `pvp0eslPPZfUSMnoWIgp`,\n\t\"feedbackSuccess\": `_CzJiZ0hvBlHkkpiR9hP`,\n\t\"feedbackError\": `Suczrphb9uYE7BI5Hc9A`,\n\t\"responseRating\": `sSOlBZ8IP_sOz8jMF3Du`,\n\t\"responseRatingActions\": `ur7mlvTGc_saxw76udeb`,\n\t\"responseRatingButton\": `S8VMrNVgaDd6qilhUPYA`,\n\t\"responseRatingButtonSelected\": `vdOxXF3kbEw3tKVUC75p`,\n\t\"responseRatingHint\": `Iq7itgAUJuh_1lsiejaC`,\n\t\"responseRatingError\": `sOAeMNcCXDLoN0gv5BYF`\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://VamChatbot/./Chatbot.module.css?./node_modules/css-loader/dist/cjs.js??ruleSet%5B1%5D.rules%5B1%5D.use%5B1%5D");
|
|
250
283
|
|
|
251
284
|
/***/ }),
|
|
252
285
|
|