@d19n/webchat 1.0.4 → 1.0.5

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.
Files changed (31) hide show
  1. package/README.md +22 -2
  2. package/dist/TwilioChat/index.d.ts +2 -0
  3. package/dist/assets/styles/app.scss +248 -0
  4. package/dist/assets/styles/fonts.css +107 -0
  5. package/dist/assets/styles/variables.d.ts +58 -0
  6. package/dist/assets/styles/variables.tsx +74 -0
  7. package/dist/index.js +9 -9
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +9 -9
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/node_modules/mdast-util-gfm-autolink-literal/to-markdown.js +1 -1
  12. package/dist/node_modules/mdast-util-gfm-autolink-literal/to-markdown.js.map +1 -1
  13. package/dist/node_modules/mdast-util-gfm-strikethrough/to-markdown.js +1 -1
  14. package/dist/node_modules/mdast-util-gfm-strikethrough/to-markdown.js.map +1 -1
  15. package/dist/node_modules/micromark-extension-gfm-autolink-literal/syntax.js +1 -1
  16. package/dist/node_modules/micromark-extension-gfm-autolink-literal/syntax.js.map +1 -1
  17. package/dist/node_modules/micromark-extension-gfm-table/syntax.js +1 -1
  18. package/dist/node_modules/micromark-extension-gfm-table/syntax.js.map +1 -1
  19. package/dist/node_modules/micromark-extension-gfm-task-list-item/syntax.js +1 -1
  20. package/dist/node_modules/style-inject/dist/style-inject.es.js +2 -0
  21. package/dist/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  22. package/dist/package.json/package.json +2 -1
  23. package/dist/src/TwilioChat/Chat.js +1 -1
  24. package/dist/src/TwilioChat/Chat.js.map +1 -1
  25. package/dist/src/TwilioChat/index.js +1 -1
  26. package/dist/src/TwilioChat/index.js.map +1 -1
  27. package/dist/src/assets/styles/app.scss.js +2 -0
  28. package/dist/src/assets/styles/app.scss.js.map +1 -0
  29. package/dist/src/assets/styles/fonts.css.js +2 -0
  30. package/dist/src/assets/styles/fonts.css.js.map +1 -0
  31. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/TwilioChat/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, FormEvent, useContext } from 'react';\nimport { io, Socket } from 'socket.io-client';\nimport FormData from 'form-data';\nimport styled from 'styled-components';\nimport GlobalContext from '../context/GlobalContext';\nimport linkifyHtml from 'linkify-html';\nimport Chat from './Chat';\nimport { Col, Row } from 'react-bootstrap';\nimport moment from 'moment';\nimport { toastrMsg } from '../utils/alert';\nimport { v4 as uuidv4 } from 'uuid';\nimport NoticationBar from '../NotificationBar';\nimport { isStagingOrDevelopment } from '../utils/helperFn';\nimport { useTime } from 'react-timer-hook';\nimport API, { setConfig } from '../api/api';\nimport axios from 'axios';\nimport { useDropzone } from 'react-dropzone';\n\nconst icoYouFibre = new URL(\"./assets/images/svg/favicon.svg\", import.meta.url);\nconst icoChat = new URL(\"./assets/images/svg/chat.svg\", import.meta.url);\nconst icoCloseChat = new URL(\"./assets/images/png/ico-close.png\", import.meta.url);\nconst loadingIcon = new URL(\"./assets/images/gif/loader-transparent.gif\", import.meta.url);\nconst icoUpload = new URL(\"./assets/images/svg/youfibre-upload.svg\", import.meta.url);\nconst icoClose = new URL(\"./assets/images/svg/close.svg\", import.meta.url);\nconst notificationSound = new URL(\"./assets/audio/notification.wav\", import.meta.url);\n\ninterface Message {\n createdAt: string;\n from?: string | null;\n files?: string | null;\n message: string | null;\n form: FormType | null;\n messageId: string;\n fromId: string;\n senderType: string;\n}\ninterface FormType {\n type: string;\n value: Array<{ title: string; action: string; placeholder?: string | null; type?: string; required?: boolean; options?:object }>;\n}\n\ntype UserType = 'NEW_CUSTOMER' | 'ACCOUNT_HOLDER' | 'NOT_ACCOUNT_HOLDER';\n\nconst Container = styled.div`\n width: 100%;\n max-width: 700px;\n height: 100%;\n position: relative;\n margin: 0px auto;\n display: flex;\n flex-direction: row;\n align-items: center;\n \n &.direction-column-reverse { flex-direction: column-reverse; }\n &.content-end { justify-content: end; }\n\n`;\n\nconst OverflowContainer = styled(Container)`\n overflow-y: auto;\n`\n\nconst Widget = styled.div`\n position: fixed;\n bottom: 40px;\n right: 40px;\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: end;\n gap: 15px;\n`;\n\nconst Icon = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: #08DE9E;\n width: 50px;\n height: 50px;\n border-radius: 100px;\n cursor: pointer;\n -webkit-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -moz-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -webkit-user-select: none;\n user-select: none; \n img {\n position: absolute;\n -moz-transition: all 0.3s ease;\n transition: all 0.3s ease;\n\t\t&.icon-hover {\n width: 15px;\n height: 15px;\n\t\t\ttransform: rotate(180deg) scale(.5);\n\t\t\topacity: 0;\n\t\t}\n\t\t&.icon-default {\n width: 20px;\n height: 20px;\n\t\t\ttransform: rotate(0deg) scale(1);\n\t\t\topacity: 1;\n\t\t}\n }\n &:hover {\n -webkit-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n -moz-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n }\n &.open {\n\t\t.icon-hover {\n\t\t\ttransform: rotate(0deg) scale(1);\n\t\t\topacity: 1;\n\t\t}\n\t\t.icon-default {\n\t\t\ttransform: rotate(180deg) scale(.5);\n\t\t\topacity: 0;\n\t\t}\n }\n &.fullscreen {\n display: none;\n }\n\n .unread {\n background-color: red;\n padding: 3px;\n display: flex;\n width: 20px;\n height: 20px;\n aspect-ratio: 1 / 1;\n border-radius: 200px;\n color: #ffffff;\n position: absolute;\n top: -4px;\n right: -2px;\n font-size: 0.7rem !important;\n line-height: 0.5rem !important;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n -webkit-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -moz-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n animation: pulseAnimation 1.5s infinite;\n @keyframes pulseAnimation {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n }\n }\n`;\n\nconst ChatWrapper = styled.div`\n display: flex;\n flex-direction: column;\n background-color: #ffffff;\n width: 350px;\n height: 550px;\n border-radius: 5px;\n -webkit-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n -moz-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n max-width: 0px;\n max-height: 0px;\n overflow: hidden;\n transition: max-height 0.5s ease-in-out;\n &.show {\n max-width: 350px;\n max-height: 540px;\n }\n .cover {\n background: rgba(255, 255, 255, 0.2);\n position: absolute;\n z-index: 92;\n padding: 1rem;\n width: 100%;\n height: calc(100% - 65px);\n border-radius: 5px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n user-select: none;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n &.closed {\n background: rgba(255, 255, 255, 0.9);\n button { margin-top: 2rem; }\n }\n &.upload {\n background: rgba(9, 222, 158, 0.9);\n button { margin-top: 2rem; }\n }\n animation: showCover .4s cubic-bezier(0.41, 0.39, 0.53, 1.38) forwards;\n \n @keyframes showCover {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n }\n .files {\n margin: 0.5rem;\n border-radius: 5px;\n background-color: #c1f7e7;\n padding: 0rem;\n overlay: none;\n display: flex; \n flex-direction: column;\n justify-content: center;\n gap: 0rem;\n .file {\n display: flex;\n flex-direction: row;\n border-radius: 3px;\n justify-content: space-between;\n align-items: center;\n margin: 0.2rem;\n padding: 0.2rem 0.5rem;\n gap: 1rem;\n &:hover {\n background-color: #ffffff;\n }\n .fileName {\n font-size: 0.7rem !important;\n line-height: 0.8rem;\n word-break: keep-all;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .action {\n width: 0.8rem;\n height: 0.8rem;\n opacity: 0.7;\n cursor: pointer;\n &:hover {\n opacity: 1;\n }\n }\n\n }\n }\n &.fullscreen {\n max-width: 100% !important;\n max-height: 100% !important;\n position: fixed;\n left: 0px;\n top: 0px;\n width: 100%;\n height: 100%;\n border-radius: 0px;\n // @media (max-width: 768px) {\n // #listOfMessages {\n // max-height: calc(100vh - 210px);\n // }\n // .chat-content-container {\n // padding-bottom: 4rem;\n // }\n // }\n .cover {\n &.closed {\n height: 100%;\n }\n }\n }\n @media (max-width: 576px) {\n position: fixed;\n z-index: 100;\n bottom: 0px;\n right: 0px;\n width: 100%;\n height: 100%;\n border-radius: 0px;\n &.show {\n max-width: 100%;\n max-height: 100%;\n }\n .cover {\n &.closed, &.upload {\n height: 100%;\n }\n }\n }\n`;\n\nconst ChatHeader = styled.div`\n background-color: #08DE9E;\n width: 100%;\n padding: 15px;\n color: #ffffff;\n flex: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 15px;\n -webkit-box-shadow: -2px 2px 5px 1px rgba(0,0,0,0.2);\n box-shadow: -2px 2px 5px 1px rgba(0,0,0,0.2);\n z-index: 91;\n img {\n width: 40px;\n height: 40px;\n -object-fit: fill;\n object-fit: fill;\n padding: 7px;\n border-radius: 200px;\n cursor: pointer;\n background-color: #FFFFFF;\n &.close {\n display: none;\n background-color: transparent;\n }\n }\n a {\n &:hover {\n text-decoration: none !important;\n cursor: pointer;\n }\n }\n span {\n padding: 0px;\n }\n @media (max-width: 576px) {\n img {\n &.close {\n display: block;\n }\n }\n }\n`;\n\nconst ChatContent = styled.div`\n width: 100%;\n padding: 0;\n color: #000000;\n flex: 1;\n display: flex;\n flex-direction: column-reverse;\n overflow-x: hidden;\n .chat-content-container {\n padding-bottom: 1.8rem;\n }\n button {\n display: block;\n background-color: #c1f7e7;\n flex: 0;\n padding: 5px;\n border-radius: 5px;\n color: #263238;\n font-weight: 100;\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 100;\n min-width: 40%;\n border: 2px solid #08DE9E;\n cursor: pointer;\n &:hover {\n background-color: #08DE9E;\n }\n }\n @media (max-width: 768px) {\n overflow-y: hidden;\n .chat-content-container {\n overflow-y: auto;\n // padding-bottom: 0;\n }\n }\n`;\n\nconst ChatInput = styled.form`\n background-color: #f4f7f9;\n width: 100%;\n flex: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n padding: 5px;\n .action {\n width: 1.3rem;\n height: 1.3rem;\n cursor: pointer;\n opacity: 0.7;\n -webkit-user-select: none;\n user-select: none;\n &:hover {\n opacity: 0.7;\n }\n }\n input {\n background-color: rgba(0,0,0,0);\n border: none;\n border-bottom: 1px solid rgba(0,0,0,0);\n outline: 0px;\n padding: 0px;\n margin-left: 15px;\n font-size: 0.9rem;\n font-weight: 100;\n flex: 1;\n &.invalid {\n border-bottom: 1px solid red;\n }\n }\n button {\n min-width: 90px;\n background-color: #09de9e;\n flex: 0;\n font-size: 1rem;\n &:hover {\n background-color: #08c98f;\n }\n &:disabled, &:disabled:hover {\n background-color: rgba(0,0,0,0.05);\n color: #aabbcc !important;\n }\n }\n @media (max-width: 576px) {\n padding: 15px;\n }\n // @media (max-width: 768px) {\n // &.form-fullscreen {\n // position: fixed;\n // bottom: 0;\n // }\n // } \n`;\n\nconst Agent = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n small {\n position: absolute;\n margin-top: -1.6rem;\n margin-right: 1rem;\n font-size: 0.7rem !important;\n font-weight: 100;\n line-height: 0.8rem;\n color: #015e9c;\n background-color: #ddf0fc;\n border: 1px solid #ffffff;\n border-radius: 100px;\n padding: 5px 15px;\n z-index: 50;\n }\n`;\n\ninterface Props {\n host: string;\n websocketUrl: string;\n postcodeSchemaId?: string;\n source?: string;\n fullscreen?: boolean;\n clientId:string;\n clientSecret:string;\n customToken?:string|undefined;\n}\n\nconst TwilioChat = ({ host, clientId, clientSecret, customToken, websocketUrl, postcodeSchemaId = \"6162c7da-a37d-4543-af2c-bdea7d49d6ca\", source = \"youfibre\", fullscreen = false}: Props) => {\n const gContext: any = useContext(GlobalContext);\n const outageFormMessage = useRef<string | null>(null);\n const [outage, setOutage] = useState<boolean>(false);\n const [outageMessage, setOutageMessage] = useState<string | null>(null);\n const [logged, setLogged] = useState<boolean>(false);\n const [token, setToken] = useState<string | null>(null);\n const [chatConversationId, setChatConversationId] = useState<string | null>(null);\n const [chatCaseId, setChatCaseId] = useState<string | null>(null);\n const [chatLoading, setChatLoading] = useState<boolean>(false);\n const [chatSending, setChatSending] = useState<boolean>(false);\n const [chatClosing, setChatClosing] = useState<boolean>(false);\n const [openChat, setOpenChat] = useState<boolean>(fullscreen);\n const [chatForm, setChatForm] = useState<{ [key: string]: any }>({});\n const [message, setMessage] = useState<string>('');\n const [chatUserId, setChatUserId] = useState<string | null>(null);\n const [chatUserType, setChatUserType] = useState<UserType | null>(null);\n const [chatUsername, setChatUsername] = useState<string | null>(null);\n const [uploadedFiles, setUploadedFiles] = useState<any>([]);\n const [uploadArea, setUploadArea] = useState<boolean>(false);\n const [resetFormValues, setResetFormValues] = useState<boolean>(false);\n const [chatSessionId, setChatSessionId] = useState<string | null>(null);\n const [confirmClosing, setConfirmClosing] = useState<boolean>(false);\n\n const [twilioChatUrlParams, setTwilioChatUrlParams] = useState<any>(null);\n\n const [chatUnreaded, setChatUnreaded] = useState<boolean>(false);\n\n const [chatActive, setChatActive] = useState<boolean>(true);\n const [appMessages, setAppMessages] = useState<any>(null);\n\n const [animateTabTitle, setAnimateTabTitle] = useState<boolean>(false);\n const [titleIndex, setTitleIndex] = useState(-1);\n \n const titleRef = useRef<string>(\"\");\n let timer = useRef<number>(0);\n const intervalRef = useRef<number | null>(null);\n\n let openChatRef = useRef<boolean>(openChat);\n let visibilityChange = useRef<boolean>(true);\n\n const fileCount = 5;\n const fileSize = 10; // MB\n const fileExtensions = ['jpg', 'jpeg', 'png', 'pdf', 'gif', 'txt', 'mp4', 'mp3'];\n\n const { seconds: londonSec } = useTime({ interval: 1 });\n \n let [agentTyping, setAgentTyping] = useState<boolean>(false);\n let agentIdRef = useRef<string|null>(null);\n\n const defaultMessages:Message[] = [\n {\n createdAt: moment(new Date()).format(),\n message: null,\n fromId: \"Client\",\n senderType: \"CUSTOMER\",\n form: {\n type: \"buttons\",\n value: [\n {\n title: \"I am the account holder\",\n action: \"old_customer\"\n },\n {\n title: \"I am not the account holder\",\n action: \"not_customer\"\n },\n {\n title: \"I am new here\",\n action: \"new_customer\"\n },\n ]\n },\n messageId: \"1\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"Welcome to YouFibre!<br />We're going to ask you some questions to ensure we get you through to the right team, so please bear with us!<br />Are you the account holder?\",\n form: null,\n messageId: \"0\"\n }\n ];\n\n const categories = {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n INSTALLS_AND_SERVICE_VISITS: \"Installs & Service Visits\",\n MANAGE_MY_ACCOUNT: \"Manage My Account\",\n BILLING: \"Billing\",\n CANCELLATION: \"Cancellation\",\n COMPLAINT: \"Complaint\",\n };\n\n const userTypeLabels = {\n NEW_CUSTOMER: \"New customer\",\n ACCOUNT_HOLDER: \"Account holder\",\n NOT_ACCOUNT_HOLDER: \"Not the account holder\"\n };\n\n const [messages, setMessages] = useState<Message[]>(defaultMessages);\n const [newMessages, setNewMessages] = useState<Message[]|null>(null);\n const messagesRef = useRef<Message[]>(messages);\n const chatBoxRef = useRef<HTMLDivElement | null>(null);\n const sc = useRef<Socket | null>(null);\n\n const scrollToBottom = () => {\n try {\n if (chatBoxRef.current) {\n chatBoxRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n } catch(e){ }\n };\n\n useEffect(() => {\n if (typeof document !== \"undefined\" && typeof window !== 'undefined'){\n if(animateTabTitle && titleIndex !== -1) {\n if(!localStorage.getItem(\"title\")) localStorage.setItem(\"title\", (typeof document !== \"undefined\" && document.getElementsByTagName('title')[0].textContent) || \"\");\n const updateTitle = () => {\n const title = titleRef.current;\n if (title) {\n const nextIndex = (titleIndex + 1) % title.length;\n document.title = title.slice(nextIndex) + \" \" + title.slice(0, nextIndex);\n setTitleIndex(nextIndex);\n }\n };\n intervalRef.current = window.setInterval(updateTitle, 200); // Change the title every 200ms\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current); // Cleanup on unmount\n }\n };\n } else {\n intervalRef.current = null;\n titleRef.current = \"\";\n }\n }\n }, [titleIndex]);\n\n useEffect(() => {\n setConfig(host, clientId, clientSecret, customToken);\n axios.get(`https://strapi.youfibre.com/api/information`)\n .then((response:any) =>{\n gContext.setAppMessages(response.data); \n })\n .catch((error:any) => {\n gContext.setAppMessages(null);\n });\n\n getUrlParams();\n \n let lastUrl = typeof window !== 'undefined' ? window.location.href : '';\n\n const observer = new MutationObserver(() => {\n if (typeof window !== 'undefined' && lastUrl !== window.location.href) {\n lastUrl = window.location.href;\n getUrlParams();\n }\n });\n\n typeof document !== 'undefined' && observer.observe(document.body, { childList: true, subtree: true });\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n // Get Settings from Strapi\n setAppMessages(gContext.appMessages);\n // Chech if current time isn't in time range\n setChatActive(!isTimeInRange());\n }, [gContext.appMessages]);\n\n useEffect(() => {\n // Live check if chat should be active\n setChatActive(!isTimeInRange());\n }, [londonSec]);\n\n useEffect(() => {\n // If we are on the second step - Login form\n !chatActive && !chatCaseId && resetChat();\n }, [chatActive]);\n\n const nowInLondon = new Date().toLocaleString(\"en-GB\", {\n timeZone: \"Europe/London\",\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n });\n\n const timeToSeconds = (timeStr) => {\n if(timeStr) {\n const [hours, minutes, seconds] = timeStr.split(':').map(Number);\n return hours * 3600 + minutes * 60 + seconds;\n }\n }\n\n const isTimeInRange = () => {\n if(gContext.appMessages?.chat_off_mode_toggle && nowInLondon && gContext.appMessages?.chat_off_mode_start && gContext.appMessages?.chat_off_mode_end) {\n const current = timeToSeconds(nowInLondon);\n const start = timeToSeconds(gContext.appMessages?.chat_off_mode_start);\n const end = timeToSeconds(gContext.appMessages?.chat_off_mode_end);\n if (start < end) {\n // Normal range (e.g., 08:00 to 20:00)\n return current >= start && current < end;\n } else {\n // Overnight range (e.g., 20:00 to 08:00)\n return current >= start || current < end;\n }\n } else {\n return false;\n }\n }\n\n const getUrlParams = () => {\n if (typeof window !== 'undefined') {\n setTwilioChatUrlParams(new URLSearchParams(window.location.search));\n }\n }; \n\n useEffect(() => {\n if(twilioChatUrlParams?.get(\"youFibreChat\") === ''){\n // Use params from URL, and init chat with messages from back-end (not from localstorage)\n const fetchData = async () => {\n await new Promise<void>((resolve) => {\n localStorage.setItem('chatUsername', twilioChatUrlParams.get(\"chatUsername\"));\n localStorage.setItem('chatUserId', twilioChatUrlParams.get(\"chatUserId\"));\n localStorage.setItem('chatSessionId', twilioChatUrlParams.get(\"chatSessionId\"));\n localStorage.setItem('conversationId', twilioChatUrlParams.get(\"conversationId\"));\n localStorage.setItem('caseId', twilioChatUrlParams.get(\"caseId\"));\n localStorage.setItem('participantId', twilioChatUrlParams.get(\"participantId\"));\n setChatUserId(twilioChatUrlParams.get(\"participantId\"));\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat || null,\n chatUsername: twilioChatUrlParams.get(\"chatUsername\") || null,\n chatSessionId: twilioChatUrlParams.get(\"chatSessionId\") || null,\n chatUserId: twilioChatUrlParams.get(\"chatUserId\") || null,\n conversationId: twilioChatUrlParams.get(\"conversationId\") || null,\n caseId: twilioChatUrlParams.get(\"caseId\") || null,\n participantId: twilioChatUrlParams.get(\"participantId\") || null,\n }\n });\n resolve();\n });\n init();\n };\n fetchData();\n } else if (twilioChatUrlParams && Object.keys(twilioChatUrlParams).length === 0){\n // Call existing chat\n init();\n } else {\n }\n },[twilioChatUrlParams]);\n \n const init = () => { \n const getData = async () => {\n if(localStorage.getItem('conversationId')){ \n try {\n const response = await API.get(`ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}`);\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't check conversation!\");\n return null;\n }\n if(response?.data?.properties?.Status === \"CLOSED\") resetChat();\n else {\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat || null,\n chatUsername: localStorage.getItem('chatUsername') || null,\n chatSessionId: localStorage.getItem('chatSessionId') || null,\n chatUserId: localStorage.getItem('participantId') || null,\n conversationId: localStorage.getItem('conversationId') || null,\n caseId: localStorage.getItem('caseId') || null,\n participantId: localStorage.getItem('participantId') || null,\n }\n });\n }\n setChatLoading(false);\n } catch (error) { console.log('Error fetching conversation status: ', error); }\n }\n };\n getData();\n\n localStorage.removeItem(\"title\");\n setChatConversationId(localStorage.getItem('conversationId') || null);\n setChatCaseId(localStorage.getItem('caseId') || null);\n setChatUserId(localStorage.getItem('participantId') || null);\n agentIdRef.current = localStorage.getItem('agentId') || null;\n setChatSessionId(localStorage.getItem('chatSessionId') || null);\n\n localStorage.getItem('conversationId') && localStorage.getItem('participantId') && setLogged(true);\n localStorage.getItem('chatUsername') && setChatUsername(localStorage.getItem('chatUsername'));\n localStorage.getItem('chatUserType') && setChatUserType(localStorage.getItem('chatUserType') as UserType || 'NEW_CUSTOMER');\n\n setChatForm({\n full_name: localStorage.getItem('chatUsername'),\n email: localStorage.getItem('chatEmail'),\n category: localStorage.getItem('chatCategory'),\n address: localStorage.getItem('chatAddress'),\n last_bill: localStorage.getItem('chatLastBill'),\n });\n localStorage.getItem('chatMessages') ? \n setMessages(JSON.parse(localStorage.getItem('chatMessages') || '')) : \n localStorage.setItem('chatMessages', JSON.stringify(messages));\n\n localStorage.getItem('conversationId') && getAllMessages(localStorage.getItem('conversationId'), \"onLoad\");\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n // console.log('Tab is active');\n visibilityChange.current = true;\n if(typeof document !== \"undefined\" && openChatRef.current && localStorage.getItem(\"title\")){\n setAnimateTabTitle(false);\n setTitleIndex(-1);\n setChatUnreaded(false);\n document.title = localStorage.getItem(\"title\") || \"\";\n document.getElementById('inputMessage')?.focus();\n setTimeout(() => localStorage.removeItem(\"title\"), 1000);\n }\n localStorage.getItem('conversationId') && getAllMessages(localStorage.getItem('conversationId'), \"visibilitychange\");\n } else {\n // console.log('Tab is in the background');\n visibilityChange.current = false;\n }\n });\n };\n \n const getAllMessages = async (convID:string|null, location:string) => {\n try{\n if(convID){\n const response:any = await API.get(`NotificationModule/v2.0/records/Conversation/${convID}/links?targetEntities=[\"Message\"]`);\n if(response){ \n console.log(`getAllMessages: ${location}`, response);\n \n let tmpMessages:Message[] = await Promise.all(\n response?.Message?.dbRecords.map(async item => ({\n createdAt: item?.createdAt,\n from: item?.properties?.From,\n files: await getFiles(item?.properties?.Files), \n message: item?.properties?.Body,\n form: null,\n messageId: item?.id,\n fromId: item?.createdBy?.id,\n senderType: item.type === \"EVENT\" ? \"EVENT\" : item.properties.SenderType\n }))\n ); \n if(!openChatRef.current && Object.keys(tmpMessages).length > 0){\n setChatUnreaded(true); \n }\n // Sort messages by createdAt (string)\n tmpMessages = tmpMessages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n setMessages(tmpMessages); \n localStorage.setItem('allMessages', JSON.stringify(tmpMessages)); \n }\n } else \n setMessages(defaultMessages); \n } catch (error) {\n console.log('Error fetching messages:', error);\n }\n };\n\n useEffect(() => {\n if (typeof document !== \"undefined\") {\n if (fullscreen) {\n document.body.style.overflow = 'hidden';\n document.documentElement.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n document.documentElement.style.overflow = '';\n }\n }\n }, [fullscreen])\n\n const connectToWebsocket = (sessionId:string|null = null) => {\n return io(`${websocketUrl}/ChatWebsocketModule/TwilioChatWebsocket/v1.0`, \n { \n path: '/ws',\n query: {\n clientId: sessionId \n },\n reconnection: true,\n reconnectionAttempts: Infinity, // Retry indefinitely\n reconnectionDelay: 1000, // Start with a 1-second delay\n reconnectionDelayMax: 5000, // Cap the delay at 5 seconds\n timeout: 10000, // Timeout after 10 seconds\n }); \n };\n\n useEffect(() => { \n if(chatUserId){\n const tmpUUID = chatSessionId || uuidv4();\n setChatSessionId(tmpUUID);\n localStorage.setItem('chatSessionId', tmpUUID);\n \n if(!sc.current) sc.current = connectToWebsocket(tmpUUID);\n\n sc.current?.on('connect', () => {\n console.log('Connected to WebSocket server');\n });\n\n sc.current?.on(\"connect_error\", (err) => {\n console.log(`Connect error due to ${err.message}`);\n sc.current = null;\n }); \n\n sc.current?.on(\"disconnect\", (reason) => {\n console.log(`Disconnected: ${reason}`);\n sc.current = null;\n });\n\n }\n }, [chatUserId]);\n\n useEffect(() => { \n const fetchData = async () => {\n // // Don't delete this code\n // sc.current && sc.current?.onAny((eventName, ...args) => {\n // console.log(\"All events:\", eventName, args);\n // });\n\n if(sc.current && chatCaseId){\n\n sc.current.emit(\"joinRoom\", chatCaseId);\n\n !sc.current.listeners(`case-event-${chatCaseId}`).length && sc.current?.on(`case-event-${chatCaseId}`, (data) => { \n // console.log(`case-event-${chatCaseId}`, data);\n if(data.caseId === localStorage.getItem('caseId')){ \n switch(data.type){\n case \"CASE_UPDATED\": \n agentIdRef.current = data.data.properties.OwnerId; \n localStorage.setItem('agentId', agentIdRef.current || \"\"); break;\n case \"CONVERSATION_CLOSED\": setChatClosing(true); break;\n case \"MESSAGE_CREATED\": receiveMessage(data.data); break;\n default: break;\n }\n }\n });\n \n !sc.current.listeners(`web-chat-input-${chatCaseId}`).length && sc.current?.on(`web-chat-input-${chatCaseId}`, async (data) => {\n // console.log(`web-chat-input-${chatCaseId}`, data);\n if(data.caseId === chatCaseId && data.sender === \"AGENT\"){\n setAgentTyping(true);\n }\n });\n }\n }; \n fetchData();\n }, [chatCaseId]);\n\n\n let typingTimeout:any;\n\n useEffect(() => { \n const fetchData = async () => {\n try {\n typingTimeout = agentTyping ? setTimeout(() => {\n setAgentTyping(false);\n clearTimeout(typingTimeout);\n }, 1500) : false; \n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [agentTyping]);\n\n useEffect(() => {\n messagesRef.current = messages; \n }, [messages]);\n\n useEffect(() => { \n const fetchData = async () => {\n try {\n if(messages.length && chatCaseId){\n sc.current && sc.current?.emit(`web-chat-input`, {\n caseId: chatCaseId,\n conversationId: chatConversationId,\n message: message,\n sender: 'CUSTOMER'\n });\n } \n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [message]);\n\n const getFiles = async (files: String[] | null = null) => {\n try{\n let tmpFiles:any = [];\n if(files){\n const response:any = await API.get(`SchemaModule/v1.0/db/File/many?ids=${files}`);\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't close conversation!\");\n } else {\n console.log('tmpFiles response:', response);\n \n if(Object.keys(response).length){\n response.map((item) => {\n tmpFiles = [...tmpFiles, {\n id: item?.id || \"\",\n type: item?.properties?.Mimetype || \"\",\n url: item?.properties?.Url || \"\"\n }];\n });\n }\n return (Object.keys(tmpFiles).length !== 0) ? tmpFiles : [];\n }\n } else {\n return [];\n }\n } catch (error) {\n console.log('Error fetching files:', error);\n return [];\n }\n };\n \n const receiveMessage = async (data:any) => { \n if(data && !messagesRef.current.some(obj => obj.messageId === data.id)){\n try{\n data?.Conversation?.dbRecords[0]?.properties?.Status === \"CLOSED\" && setChatClosing(true);\n let tmpFiles:any = [];\n if(data.properties.Files){\n tmpFiles = await getFiles(data.properties.Files);\n if(Object.keys(tmpFiles).length === 0) tmpFiles = null;\n updateMessages(data, tmpFiles);\n } else {\n updateMessages(data, tmpFiles);\n }\n } catch (error) {\n console.log('Error fetching message:', error);\n }\n }\n };\n\n const updateMessages = (data: any, files:any) => {\n let tmpMessage:Message = {\n senderType: data.type !== 'EVENT' ? data.properties.SenderType : data.type,\n createdAt: moment(new Date()).format(),\n from: data.type !== 'EVENT' ? data.properties.From : data.type,\n message: data.type !== 'EVENT' ? data.properties.Body : data.title,\n form: null,\n files: files,\n messageId: data.id,\n fromId: data.type !== 'EVENT' ? data.createdBy.id : \"YouFibre\"\n };\n if(!openChatRef.current || !visibilityChange.current){\n setChatUnreaded(true); \n }\n setNewMessages([...(newMessages || []), tmpMessage]);\n \n setTimeout(() => {\n setNewMessages(null);\n setMessages([tmpMessage, ...messagesRef.current]);\n localStorage.setItem('chatMessages', JSON.stringify([tmpMessage, ...messagesRef.current]));\n setChatLoading(false);\n scrollToBottom();\n }, 400);\n };\n\n useEffect(() => {\n if(typeof document !== 'undefined'){\n if(!localStorage.getItem(\"title\")) localStorage.setItem(\"title\", (typeof document !== \"undefined\" && document.getElementsByTagName('title')[0].textContent) || \"\");\n if(chatUnreaded) {\n let sound = new Audio(notificationSound.toString());\n sound.setAttribute('crossorigin', 'anonymous'); \n sound.play().catch((error) => {\n console.log(\"User interaction required before playing sound\");\n });\n document.title = \"New message | YouFibre\";\n }\n else {\n document.title = localStorage.getItem(\"title\") || '';\n scrollToBottom();\n }\n } \n }, [chatUnreaded]);\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n if(typeof window !== 'undefined' && typeof document !== \"undefined\"){\n if(openChat){\n if(window.innerWidth < 577) document.body.style.overflow = \"hidden\";\n intervalRef.current && clearInterval(intervalRef.current);\n if(localStorage.getItem(\"title\")) document.title = localStorage.getItem(\"title\") || \"\";\n setAnimateTabTitle(false);\n setTitleIndex(-1);\n setChatUnreaded(false);\n document.getElementById('inputMessage')?.focus();\n setTimeout(() => localStorage.removeItem(\"title\"), 1000);\n } else {\n document.body.style.overflow = \"\";\n setConfirmClosing(false);\n setChatClosing(false);\n }\n }\n scrollToBottom();\n openChatRef.current = openChat;\n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [openChat]);\n\n const validateInput = (data) => {\n // // Don't delete this code\n // if(data.length === 0) return true;\n // const regex = /^[a-zA-Z0-9\\s\\-,.!?()/@#&£€$=+*\"']+$/;\n // return regex.test(data);\n return true;\n };\n\n const resetChat = () => {\n if(sc.current && chatCaseId){\n sc.current.emit(\"leaveRoom\", chatCaseId);\n sc.current.removeAllListeners();\n }\n setChatConversationId(null);\n setChatCaseId(null);\n setUploadedFiles([]);\n setResetFormValues(!resetFormValues);\n setOutage(false);\n setOutageMessage(null);\n outageFormMessage.current = null;\n localStorage.removeItem('chatEmail');\n localStorage.removeItem('conversationId');\n localStorage.removeItem('caseId');\n localStorage.removeItem('participantId');\n localStorage.removeItem('chatUsername');\n localStorage.removeItem('twilio_token');\n localStorage.removeItem('chatMessages');\n localStorage.removeItem('chatUserType');\n localStorage.removeItem('chatCategory'); \n localStorage.removeItem('chatAddress'); \n localStorage.removeItem('chatLastBill');\n localStorage.removeItem('agentId');\n localStorage.removeItem('chatSessionId');\n setChatUsername(null);\n setChatUserType(null);\n setChatUserId(null);\n setChatForm({});\n setChatLoading(false);\n setLogged(true);\n setToken(null);\n agentIdRef.current = null;\n setMessage('');\n localStorage.setItem('chatMessages', JSON.stringify(defaultMessages));\n setNewMessages(null);\n setMessages(defaultMessages);\n scrollToBottom();\n fullscreen && setOpenChat(true);\n\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: null\n });\n };\n\n const getToken = async (tmpEmail) => {\n try {\n const data = await API.get(`ChatModule/v1.0/gateway/token?identity=${tmpEmail}&source=twilio`);\n return data || null;\n } catch (error) { console.log('Error fetching token:', error); }\n };\n\n const createConversation = async (\n tmpChatUsername:string|null,\n tmpChatEmail:string|null,\n tmpChatAddress:string|null,\n tmpChatLastBill:string|null,\n tmpChatUserType:string|null,\n tmpChatCategory:string|null\n ) => { \n try {\n const response = await API.post(`ChatModule/v1.0/gateway/conversation/create`, \n {\n source: \"twilio\",\n channel: \"WEB_CHAT\",\n identifier: tmpChatEmail || null,\n DpaCustomerName: tmpChatUsername || null,\n DpaCustomerEmail: tmpChatEmail || null,\n DpaCustomerAddress: tmpChatAddress || null,\n DpaCustomerLastBill: tmpChatLastBill || null,\n DpaCustomerType: tmpChatUserType || null,\n DpaCustomerCategory: tmpChatCategory || null\n });\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't create conversation!\");\n setChatActive(false);\n return null;\n }\n // Check if the statusCode matches\n return response ? response : null;\n } catch (error:any) {\n setChatActive(false);\n toastrMsg(error.message.replaceAll('OdinApiError:',''), \"error\");\n }\n };\n\n const closeConversation = async (closedBy:string = \"CUSTOMER\") => {\n try {\n const response = await API.post(\n `ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}/close`, \n { closedBy: closedBy }\n );\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't close conversation!\");\n return null;\n }\n // Check if the statusCode matches\n resetChat();\n } catch (error) { console.log('Error closing conversation:', error); }\n };\n\n const sendMessage = async (btnMessage:string|null = null) => {\n if(message.length > 0 || btnMessage || Object.keys(uploadedFiles).length > 0) {\n typeof document !== \"undefined\" && document.getElementById('inputMessage')?.focus();\n let formData = new FormData();\n formData.append('conversationSid', localStorage.getItem('conversationId'));\n formData.append('message', message || btnMessage);\n formData.append('from', localStorage.getItem('chatUsername'));\n formData.append('sender', 'CUSTOMER');\n setMessage('');\n setChatSending(true);\n try{\n Object.keys(uploadedFiles).length > 0 && uploadedFiles.map(async (item: File) => {\n formData.append('files', item);\n }); \n } catch (e){\n\n }\n // Send a Message to the Conversation\n try {\n API.post(`ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}/message/send`, formData, {\n headers: {'Content-Type': 'multipart/form-data'}\n })\n .then(data => { \n if(data){\n setUploadedFiles([]);\n setLogged(true);\n setChatSending(false);\n setChatLoading(false);\n } \n else { \n setChatActive(!isTimeInRange());\n // if(data?.data?.statusCode === 500){\n resetChat();\n console.log(\"Conversation is closed\");\n }\n })\n .catch(error => {\n setChatActive(!isTimeInRange());\n console.log('Send a Message:', error);\n });\n } catch (error) {\n console.log(\"Error loading SVG:\", error);\n }\n }\n };\n\n const submitMessage = (e) => {\n e.preventDefault();\n sendMessage();\n };\n\n const submitForm = async () => { \n try {\n setChatLoading(true);\n // Indicating an outage\n const outageStatus = await API.get(`SupportModule/v1.0/Case/outage/verify?contactEmailAddress=${chatForm.email}`)\n .then(data => {\n setChatLoading(false);\n if(data?.data?.statusCode === 200 && data?.data?.data){ \n setOutage(true);\n setOutageMessage(data?.data?.message);\n return true;\n } else {\n startConversation();\n return false;\n }\n })\n .catch(error => {\n console.log('Outage Message:', error);\n });\n } catch (error) { console.log('Error fetching outage: ', error); }\n };\n\n const startConversation = async () => {\n // setMessages(messagesRef.current.slice(1, 0));\n setChatLoading(true);\n localStorage.setItem('chatUsername', chatForm.full_name);\n setChatUsername(chatForm.full_name);\n localStorage.setItem('chatEmail', chatForm.email);\n localStorage.setItem('chatCategory', chatForm.category); \n localStorage.setItem('chatAddress', chatForm.address); \n localStorage.setItem('chatLastBill', chatForm.last_bill);\n // Create Token\n const tmpToken = await getToken(chatForm.email);\n if(tmpToken){\n localStorage.setItem('twilio_token', tmpToken);\n setToken(tmpToken);\n // Create Conversation \n const tmpConversation = await createConversation(\n chatForm.full_name,\n chatForm.email,\n chatForm.address,\n chatForm.last_bill,\n chatUserType,\n chatForm.category \n );\n if(tmpConversation){\n setLogged(true);\n setChatUserId(tmpConversation?.participantId);\n localStorage.setItem('conversationId', tmpConversation?.conversationId);\n localStorage.setItem('caseId', tmpConversation?.caseId);\n localStorage.setItem('participantId', tmpConversation?.participantId);\n setChatCaseId(tmpConversation?.caseId);\n setChatConversationId(tmpConversation?.conversationId);\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat,\n chatUsername: chatForm.full_name,\n chatSessionId: chatSessionId,\n chatUserId: tmpConversation?.participantId,\n conversationId: tmpConversation?.conversationId,\n caseId: tmpConversation?.caseId,\n participantId: tmpConversation?.participantId,\n }\n });\n new Promise<void>((resolve) => {\n setMessages((prev) => {\n resolve();\n return [];\n });\n sendMessage(outageFormMessage.current); \n }).then(() => { \n updateMessages({type: 'EVENT', title: 'Waiting for the agent to join the chat.'}, null);\n });\n } else {\n setChatActive(!isTimeInRange());\n }\n } else {\n setChatLoading(false);\n }\n };\n \n const newAccountHolder = () => {\n setChatUserType('NEW_CUSTOMER');\n localStorage.setItem('chatUserType', 'NEW_CUSTOMER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am new here',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const notAccountHolder = () => {\n setChatUserType('NOT_ACCOUNT_HOLDER');\n localStorage.setItem('chatUserType', 'NOT_ACCOUNT_HOLDER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am not the account holder',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const yesAccountHolder = () => {\n setChatUserType('ACCOUNT_HOLDER');\n localStorage.setItem('chatUserType', 'ACCOUNT_HOLDER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What was the total value of your last bill?\",\n action: \"last_bill\",\n placeholder: 'Total amount of your last bill',\n type: 'number',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n INSTALLS_AND_SERVICE_VISITS: \"Installs & Service Visits\",\n MANAGE_MY_ACCOUNT: \"Manage My Account\",\n BILLING: \"Billing\",\n CANCELLATION: \"Cancellation\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am the account holder',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const chatToggle = () => {\n if(chatClosing){\n resetChat();\n setChatClosing(false);\n }\n setOutage(!outage);\n setOpenChat(!openChat);\n };\n \n const buttonAction = (action) => {\n if(chatActive || chatCaseId || isStagingOrDevelopment()){\n switch(action){\n case 'new_customer': newAccountHolder(); break;\n case 'not_customer': notAccountHolder(); break;\n case 'old_customer': yesAccountHolder(); break;\n case 'submit_form': \n if(chatForm.full_name && \n chatForm.address && chatForm.address !== '/' && chatForm.email && \n (((localStorage.getItem(\"chatUserType\") === \"ACCOUNT_HOLDER\") && \n typeof chatForm.last_bill !== \"undefined\") || (localStorage.getItem(\"chatUserType\") !== \"ACCOUNT_HOLDER\")) && chatForm.category && chatUserType){\n outageFormMessage.current = `<b>${userTypeLabels[chatUserType]}</b><br /><b>Full name</b>: ${chatForm.full_name}<br /><b>Email</b>: ${chatForm.email}<br /><b>Address</b>: ${chatForm.address}<br />${(typeof chatForm.last_bill !== 'undefined')?'<b>What was the total value of your last bill</b>: '+chatForm.last_bill+'<br />':''}<b>What do you need help with today</b>: ${categories[chatForm.category]}`;\n submitForm();\n }\n break;\n default: break;\n }\n } else {\n resetChat();\n }\n\n };\n\n const {getRootProps, getInputProps, open} = useDropzone({\n noClick: true,\n noKeyboard: true,\n onDrop: (acceptedFiles:any) => {\n if(chatCaseId){\n acceptedFiles = acceptedFiles.filter(item => item.size < (fileSize*1048576) ? item : toastrMsg(`Maximum file size is ${fileSize}MB`, \"error\"));\n acceptedFiles = acceptedFiles.filter(item => fileExtensions.some(ext => item.name.endsWith(ext)) ? item : toastrMsg(`Unsupported File extension`, \"error\"));\n acceptedFiles = acceptedFiles.filter(item => Object.keys(uploadedFiles.filter(ext => ext.name === item.name)).length === 0); \n Object.keys(uploadedFiles).length + Object.keys(acceptedFiles).length < fileCount+1 ? \n setUploadedFiles([...uploadedFiles, ...acceptedFiles]) : \n toastrMsg(`Maximum ${fileCount} files`, \"warning\");\n setUploadArea(false);\n }\n },\n });\n\n const deleteFile = (name:string) => {\n const tmpFiles = uploadedFiles.filter((itm:any) => itm.name !== name);\n setUploadedFiles(tmpFiles);\n };\n\n return (\n <>\n { (typeof process.env.GATSBY_TWILIO_CHAT_VERSION === 'undefined' || process.env.GATSBY_TWILIO_CHAT_VERSION === '1') && \n <Widget>\n <ChatWrapper\n className={`${openChat ? 'show' : ''} ${fullscreen?'fullscreen':''}`}\n {...getRootProps()}\n onDragOver={() => chatCaseId && setUploadArea(true)}\n onMouseLeave={() => setUploadArea(false)}\n >\n <ChatHeader>\n <Container className='justify-between'>\n <Row className='p-0 m-0 align-items-center'>\n <div>\n <img src={icoYouFibre.toString()}/>\n <span>&nbsp;YouFibre</span>\n </div>\n </Row> \n <Row className='p-0 m-0 align-items-center'>\n {!chatConversationId && Object.keys(messages).length > 2 && <button onClick={() => resetChat()} className='small'>Back</button>}\n {chatConversationId && <button onClick={() => setConfirmClosing(true)} className='small'>End conversation</button>}\n {!fullscreen && <img src={icoCloseChat.toString()} className='close' onClick={() => setOpenChat(!openChat)} />}\n </Row> \n </Container>\n </ChatHeader>\n <NoticationBar type=\"chat\" />\n <ChatContent>\n <Container className={`direction-column-reverse content-end chat-content-container`}>\n <div ref={chatBoxRef} />\n <Chat\n messages={messages}\n chatUsername={chatUsername}\n chatUserId={chatUserId}\n chatConversationId={chatConversationId}\n resetFormValues={resetFormValues}\n setChatForm={setChatForm}\n buttonAction={buttonAction}\n newMessages={newMessages}\n chatActive={chatActive}\n API={API}\n />\n </Container>\n </ChatContent> \n { agentTyping && openChat && <Agent><small>Agent is typing...</small></Agent> }\n { logged && !chatClosing && !messages[0]?.form && <ChatInput className={`${fullscreen?'form-fullscreen':''}`}><OverflowContainer>\n <input id=\"inputMessage\" className={!validateInput(message) ? 'invalid' : ''} autoComplete='off' maxLength={500} onChange={(e) => setMessage(e.target.value)} value={message} type=\"text\" placeholder=\"Write a reply...\" />\n <input {...getInputProps()} />\n <img className='action' alt='Add attachment' src={icoUpload.toString()} onClick={() => open()} />\n <button type='submit' onClick={(e) => submitMessage(e)} disabled={chatSending || !validateInput(message)}>{ chatSending ? <img src={loadingIcon.toString()} width={16} height={16} /> : 'Send'}</button>\n </OverflowContainer></ChatInput> }\n {Object.keys(uploadedFiles).length > 0 && <div className='files'>\n {uploadedFiles.map((file:any) => (\n <div className='file' key={file.name}>\n <div className='fileName'>{file.name}</div>\n <img className='action' src={icoClose.toString()} onClick={() => deleteFile(file.name)} />\n </div>\n ))}\n </div>}\n { uploadArea && chatCaseId && openChat && <div className='cover upload'>\n <h4>Drag and drop your files here</h4>\n <p>Maximum {fileCount} files. Limit {fileSize}MB per file.</p>\n <p>Supported files: {fileExtensions && fileExtensions.map((item:string, index) => !['mp4','mp3'].some(ext => ext === item) && (index === 0 ? item : `, ${item}`))}</p>\n </div> }\n { chatLoading && openChat && <div className='cover'><img className=\"make-it-white\" src={loadingIcon.toString()} width={14} height={14} /></div> }\n { chatClosing && openChat && <div className='cover closed'>\n <h4>Conversation is closed</h4>\n <span>This chat has now closed. If you need any help, feel free to start a new chat.<br />We're always happy to assist you!</span> \n <button onClick={() => { setChatClosing(false); resetChat();}}>Create new</button>\n </div> }\n { outage && outageMessage && <div className='cover closed'>\n <h4>Outage in your area</h4>\n <span>{outageMessage}</span> \n <button onClick={() => { resetChat(); }} className='blue-bg' >Got It - Close Chat</button>\n <button onClick={() => { setOutage(false); setOutageMessage(null); startConversation();}}>Still Need Help - Start Chat</button>\n </div> }\n { confirmClosing && openChat && <div className='cover closed'>\n <h4>Close conversation</h4>\n <span>Are you sure you want to end this conversation?</span> \n <button onClick={() => { setConfirmClosing(false);}}>Cancel</button>\n <button onClick={() => { setConfirmClosing(false); closeConversation(\"CUSTOMER\"); resetChat();}} className='blue-bg'>Confirm</button>\n </div> }\n { !chatActive && openChat && !chatCaseId && appMessages && !isStagingOrDevelopment() && <div className='cover closed'>\n <h4>Out of service</h4>\n <span dangerouslySetInnerHTML={{ __html: linkifyHtml(appMessages.chat_off_mode_text, { target: \"_blank\" }).replaceAll(/\\r\\n|\\n/g, \"<br />\") }} />\n {!fullscreen && <button onClick={() => setOpenChat(false)}>Close chat</button>}\n </div> }\n </ChatWrapper>\n <Icon onClick={() => chatToggle()} className={`YFChat ${openChat ? 'open' : ''} ${fullscreen?'fullscreen':''}`}>\n <img src={icoChat.toString()} className='icon-default' />\n <img src={icoCloseChat.toString()} className='icon-hover' />\n {chatUnreaded && <small className='unread'>1</small>}\n </Icon>\n </Widget>}\n </>\n );\n};\n\nexport default TwilioChat;\n"],"names":["icoYouFibre","URL","url","icoChat","icoCloseChat","loadingIcon","icoUpload","icoClose","notificationSound","Container","styled","div","templateObject_1","__makeTemplateObject","OverflowContainer","templateObject_2","Widget","templateObject_3","Icon","templateObject_4","ChatWrapper","templateObject_5","ChatHeader","templateObject_6","ChatContent","templateObject_7","ChatInput","form","templateObject_8","Agent","templateObject_9","TwilioChat","_a","host","clientId","clientSecret","customToken","websocketUrl","postcodeSchemaId","source","_e","fullscreen","gContext","useContext","GlobalContext","outageFormMessage","useRef","_f","useState","outage","setOutage","_g","outageMessage","setOutageMessage","_h","logged","setLogged","_j","setToken","_k","chatConversationId","setChatConversationId","_l","chatCaseId","setChatCaseId","_m","chatLoading","setChatLoading","_o","chatSending","setChatSending","_p","chatClosing","setChatClosing","_q","openChat","setOpenChat","_r","chatForm","setChatForm","_s","message","setMessage","_t","chatUserId","setChatUserId","_u","chatUserType","setChatUserType","_v","chatUsername","setChatUsername","_w","uploadedFiles","setUploadedFiles","_x","uploadArea","setUploadArea","_y","resetFormValues","setResetFormValues","_z","chatSessionId","setChatSessionId","_0","confirmClosing","setConfirmClosing","_1","twilioChatUrlParams","setTwilioChatUrlParams","_2","chatUnreaded","setChatUnreaded","_3","chatActive","setChatActive","_4","appMessages","setAppMessages","_5","animateTabTitle","setAnimateTabTitle","_6","titleIndex","setTitleIndex","titleRef","intervalRef","openChatRef","visibilityChange","fileExtensions","londonSec","useTime","interval","seconds","_7","agentTyping","setAgentTyping","agentIdRef","defaultMessages","createdAt","moment","Date","format","fromId","senderType","type","value","title","action","messageId","from","categories","SALES","TECH_SUPPORT","INSTALLS_AND_SERVICE_VISITS","MANAGE_MY_ACCOUNT","BILLING","CANCELLATION","COMPLAINT","userTypeLabels","NEW_CUSTOMER","ACCOUNT_HOLDER","NOT_ACCOUNT_HOLDER","_8","messages","setMessages","_9","newMessages","setNewMessages","messagesRef","chatBoxRef","sc","scrollToBottom","current","scrollIntoView","behavior","e","useEffect","document","window","localStorage","getItem","setItem","getElementsByTagName","textContent","setInterval","nextIndex","length","slice","clearInterval","setConfig","axios","get","then","response","data","catch","error","getUrlParams","lastUrl","location","href","observer","MutationObserver","observe","body","childList","subtree","disconnect","isTimeInRange","resetChat","nowInLondon","toLocaleString","timeZone","hour","minute","second","hour12","timeToSeconds","timeStr","split","map","Number","chat_off_mode_toggle","_b","chat_off_mode_start","_c","chat_off_mode_end","start","_d","end","URLSearchParams","search","__awaiter","Promise","resolve","goSetRegistrationData","__assign","goGetRegistrationData","twilioChat","conversationId","caseId","participantId","sent","init","Object","keys","API","concat","properties","Status","console","log","error_1","removeItem","full_name","email","category","address","last_bill","JSON","parse","stringify","getAllMessages","addEventListener","visibilityState","getElementById","focus","setTimeout","convID","all","Message","dbRecords","item","From","getFiles","Files","files","Body","id","createdBy","SenderType","tmpMessages","sort","a","b","getTime","error_2","style","overflow","documentElement","typingTimeout","sessionId","tmpUUID","uuidv4","io","path","query","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","timeout","on","err","reason","emit","listeners","OwnerId","receiveMessage","sender","clearTimeout","tmpFiles_1","__spreadArray","Mimetype","Url","error_3","some","obj","Conversation","tmpFiles","updateMessages","error_4","tmpMessage","sound","Audio","toString","setAttribute","play","innerWidth","removeAllListeners","sendMessage","btnMessage","formData_1","FormData","append","post","headers","startConversation","tmpEmail","error_5","tmpToken","tmpChatUsername","tmpChatEmail","tmpChatAddress","tmpChatLastBill","tmpChatUserType","tmpChatCategory","channel","identifier","DpaCustomerName","DpaCustomerEmail","DpaCustomerAddress","DpaCustomerLastBill","DpaCustomerType","DpaCustomerCategory","toastrMsg","error_6","replaceAll","tmpConversation","prev","_10","useDropzone","noClick","noKeyboard","onDrop","acceptedFiles","filter","size","ext","name","endsWith","fileCount","getRootProps","getInputProps","open","React","createElement","Fragment","process","env","GATSBY_TWILIO_CHAT_VERSION","className","onDragOver","onMouseLeave","Row","src","onClick","NoticationBar","ref","Chat","buttonAction","isStagingOrDevelopment","placeholder","required","options","newAccountHolder","notAccountHolder","yesAccountHolder","statusCode","error_8","autoComplete","maxLength","onChange","target","alt","preventDefault","submitMessage","disabled","width","height","file","key","itm","index","closedBy","error_7","closeConversation","dangerouslySetInnerHTML","__html","linkifyHtml","chat_off_mode_text"],"mappings":"6iCAkBA,sBAAMA,EAAc,IAAIC,IAAI,8CAA+CC,KACrEC,EAAU,IAAIF,IAAI,2CAA4CC,KAC9DE,EAAe,IAAIH,IAAI,gDAAiDC,KACxEG,EAAc,IAAIJ,IAAI,yDAA0DC,KAChFI,EAAY,IAAIL,IAAI,sDAAuDC,KAC3EK,EAAW,IAAIN,IAAI,4CAA6CC,KAChEM,EAAoB,IAAIP,IAAI,8CAA+CC,KAmB3EO,EAAYC,EAAOC,IAAGC,IAAAA,EAAAC,EAAA,CAAA,6RAAA,CAAA,gSAetBC,EAAoBJ,EAAOD,EAAPC,CAAiBK,IAAAA,EAAAF,EAAA,CAAA,2BAAA,CAAA,8BAIrCG,EAASN,EAAOC,IAAGM,IAAAA,EAAAJ,EAAA,CAAA,4JAAA,CAAA,+JAWnBK,EAAOR,EAAOC,IAAGQ,IAAAA,EAAAN,EAAA,CAAA,0iEAAA,CAAA,6iEAuFjBO,EAAcV,EAAOC,IAAGU,IAAAA,EAAAR,EAAA,CAAA,+hGAAA,CAAA,kiGA4IxBS,EAAaZ,EAAOC,IAAGY,IAAAA,EAAAV,EAAA,CAAA,qzBAAA,CAAA,wzBA6CvBW,EAAcd,EAAOC,IAAGc,IAAAA,EAAAZ,EAAA,CAAA,8tBAAA,CAAA,iuBAsCxBa,EAAYhB,EAAOiB,KAAIC,IAAAA,EAAAf,EAAA,CAAA,2mCAAA,CAAA,8mCA0DvBgB,EAAQnB,EAAOC,IAAGmB,IAAAA,EAAAjB,EAAA,CAAA,kZAAA,CAAA,qZA+BlBkB,EAAa,SAACC,SAAEC,EAAID,EAAAC,KAAEC,EAAQF,EAAAE,SAAEC,EAAYH,EAAAG,aAAEC,EAAWJ,EAAAI,YAAEC,EAAYL,EAAAK,aAAEL,EAAAM,iBAA2DN,EAAAO,WAAqBC,EAAAR,EAAAS,WAAAA,OAAU,IAAAD,GAAQA,EACzKE,EAAgBC,EAAWC,GAC3BC,EAAoBC,EAAsB,MAC1CC,EAAsBC,GAAkB,GAAvCC,EAAMF,EAAA,GAAEG,GAASH,EAAA,GAClBI,GAAoCH,EAAwB,MAA3DI,GAAaD,GAAA,GAAEE,GAAgBF,GAAA,GAChCG,GAAsBN,GAAkB,GAAvCO,GAAMD,GAAA,GAAEE,GAASF,GAAA,GAClBG,GAAoBT,EAAwB,MAAtCS,GAAA,GAAA,IAAEC,GAAQD,GAAA,GAChBE,GAA8CX,EAAwB,MAArEY,GAAkBD,GAAA,GAAEE,GAAqBF,GAAA,GAC1CG,GAA8Bd,EAAwB,MAArDe,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAC1BG,GAAgCjB,GAAkB,GAAjDkB,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAAgCpB,GAAkB,GAAjDqB,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAAgCvB,GAAkB,GAAjDwB,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAA0B1B,EAAkBP,GAA3CkC,GAAQD,GAAA,GAAEE,GAAWF,GAAA,GACtBG,GAA0B7B,EAAiC,CAAA,GAA1D8B,GAAQD,GAAA,GAAEE,GAAWF,GAAA,GACtBG,GAAwBhC,EAAiB,IAAxCiC,GAAOD,GAAA,GAAEE,GAAUF,GAAA,GACpBG,GAA8BnC,EAAwB,MAArDoC,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAC1BG,GAAkCtC,EAA0B,MAA3DuC,GAAYD,GAAA,GAAEE,GAAeF,GAAA,GAC9BG,GAAkCzC,EAAwB,MAAzD0C,GAAYD,GAAA,GAAEE,GAAeF,GAAA,GAC9BG,GAAoC5C,EAAc,IAAjD6C,GAAaD,GAAA,GAAEE,GAAgBF,GAAA,GAChCG,GAA8B/C,GAAkB,GAA/CgD,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAC1BG,GAAwClD,GAAkB,GAAzDmD,GAAeD,GAAA,GAAEE,GAAkBF,GAAA,GACpCG,GAAoCrD,EAAwB,MAA3DsD,GAAaD,GAAA,GAAEE,GAAgBF,GAAA,GAChCG,GAAsCxD,GAAkB,GAAvDyD,GAAcD,GAAA,GAAEE,GAAiBF,GAAA,GAElCG,GAAgD3D,EAAc,MAA7D4D,GAAmBD,GAAA,GAAEE,GAAsBF,GAAA,GAE5CG,GAAkC9D,GAAkB,GAAnD+D,GAAYD,GAAA,GAAEE,GAAeF,GAAA,GAE9BG,GAA8BjE,GAAkB,GAA/CkE,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAC1BG,GAAgCpE,EAAc,MAA7CqE,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAE5BG,GAAwCvE,GAAkB,GAAzDwE,GAAeD,GAAA,GAAEE,GAAkBF,GAAA,GACpCG,GAA8B1E,GAAS,GAAtC2E,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAE1BG,GAAW/E,EAAe,IACpBA,EAAe,GAC3B,IAAMgF,GAAchF,EAAsB,MAEtCiF,GAAcjF,EAAgB6B,IAC9BqD,GAAmBlF,GAAgB,GAIjCmF,GAAiB,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,MAAO,MAAO,OAEzDC,GAAcC,EAAAA,QAAQ,CAAEC,SAAU,IAAIC,QAEnDC,GAAgCtF,GAAkB,GAAjDuF,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAAa3F,EAAoB,MAE/B4F,GAA4B,CAChC,CACEC,UAAWC,EAAO,IAAIC,MAAQC,SAC9B7D,QAAS,KACT8D,OAAQ,SACRC,WAAY,WACZrH,KAAM,CACJsH,KAAM,UACNC,MAAO,CACL,CACEC,MAAO,0BACPC,OAAQ,gBAEV,CACED,MAAO,8BACPC,OAAQ,gBAEV,CACED,MAAO,gBACPC,OAAQ,kBAIdC,UAAW,KAEb,CACEL,WAAY,QACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,2KACTtD,KAAM,KACN0H,UAAW,MAITE,GAAa,CACjBC,MAAO,QACPC,aAAc,eACdC,4BAA6B,4BAC7BC,kBAAmB,oBACnBC,QAAS,UACTC,aAAc,eACdC,UAAW,aAGPC,GAAiB,CACrBC,aAAc,eACdC,eAAgB,iBAChBC,mBAAoB,0BAGhBC,GAA0BnH,EAAoB0F,IAA7C0B,GAAQD,GAAA,GAAEE,GAAWF,GAAA,GACtBG,GAAgCtH,EAAyB,MAAxDuH,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAAc3H,EAAkBsH,IAChCM,GAAa5H,EAA8B,MAC3C6H,GAAK7H,EAAsB,MAE3B8H,GAAiB,WACrB,IACMF,GAAWG,SACbH,GAAWG,QAAQC,eAAe,CAAEC,SAAU,UAElD,CAAE,MAAMC,GAAI,CACd,EAEAC,EAAU,WACR,GAAwB,oBAAbC,UAA8C,oBAAXC,OAAuB,CACnE,GAAG3D,SAAmBG,GAAmB,CACnCyD,aAAaC,QAAQ,UAAUD,aAAaE,QAAQ,QAA8B,oBAAbJ,UAA4BA,SAASK,qBAAqB,SAAS,GAAGC,aAAgB,IAU/J,OADA1D,GAAY+C,QAAUM,OAAOM,YART,WAClB,IAAMtC,EAAQtB,GAASgD,QACvB,GAAI1B,EAAO,CACT,IAAMuC,GAAa/D,GAAa,GAAKwB,EAAMwC,OAC3CT,SAAS/B,MAAQA,EAAMyC,MAAMF,GAAa,IAAMvC,EAAMyC,MAAM,EAAGF,GAC/D9D,GAAc8D,EAChB,CACF,EACsD,KAC/C,WACD5D,GAAY+C,SACdgB,cAAc/D,GAAY+C,QAE9B,CACF,CACE/C,GAAY+C,QAAU,KACtBhD,GAASgD,QAAU,EAEvB,CACF,EAAG,CAAClD,KAEJsD,EAAU,WACRa,EAAU7J,EAAMC,EAAUC,EAAcC,GACxC2J,EAAMC,IAAI,+CACTC,KAAK,SAACC,GACHxJ,EAAS4E,eAAe4E,EAASC,KACrC,GACCC,MAAM,SAACC,GACJ3J,EAAS4E,eAAe,KAC5B,GAEAgF,KAEA,IAAIC,EAA4B,oBAAXpB,OAAyBA,OAAOqB,SAASC,KAAO,GAE/DC,EAAW,IAAIC,iBAAiB,WACd,oBAAXxB,QAA0BoB,IAAYpB,OAAOqB,SAASC,OAC/DF,EAAUpB,OAAOqB,SAASC,KAC1BH,KAEJ,GAIA,MAFoB,oBAAbpB,UAA4BwB,EAASE,QAAQ1B,SAAS2B,KAAM,CAAEC,WAAW,EAAMC,SAAS,IAExF,WAAM,OAAAL,EAASM,YAAT,CACf,EAAG,IAEH/B,EAAU,WAER3D,GAAe5E,EAAS2E,aAExBF,IAAe8F,KACjB,EAAG,CAACvK,EAAS2E,cAEb4D,EAAU,WAER9D,IAAe8F,KACjB,EAAG,CAAC/E,KAEJ+C,EAAU,YAEP/D,KAAenD,IAAcmJ,IAChC,EAAG,CAAChG,KAEJ,IAAMiG,IAAc,IAAItE,MAAOuE,eAAe,QAAS,CACrDC,SAAU,gBACVC,KAAM,UACNC,OAAQ,UACRC,OAAQ,UACRC,QAAQ,IAGJC,GAAgB,SAACC,GACrB,GAAGA,EAAS,CACJ,IAAA3L,EAA4B2L,EAAQC,MAAM,KAAKC,IAAIC,QACzD,OAAe,KADH9L,EAAA,GACoB,GADXA,EAAA,GAASA,EAAA,EAEhC,CACF,EAEMiL,GAAgB,yBACpB,IAAuB,QAApBjL,EAAAU,EAAS2E,mBAAW,IAAArF,OAAA,EAAAA,EAAE+L,uBAAwBZ,KAAmC,QAApBa,EAAAtL,EAAS2E,mBAAW,IAAA2G,OAAA,EAAAA,EAAEC,uBAA2C,QAApBC,EAAAxL,EAAS2E,mBAAW,IAAA6G,OAAA,EAAAA,EAAEC,mBAAmB,CACpJ,IAAMtD,EAAU6C,GAAcP,IACxBiB,EAAQV,GAAkC,QAApBW,EAAA3L,EAAS2E,mBAAW,IAAAgH,OAAA,EAAAA,EAAEJ,qBAC5CK,EAAMZ,GAAkC,QAApBlL,EAAAE,EAAS2E,mBAAW,IAAA7E,OAAA,EAAAA,EAAE2L,mBAChD,OAAIC,EAAQE,EAEHzD,GAAWuD,GAASvD,EAAUyD,EAG9BzD,GAAWuD,GAASvD,EAAUyD,CAEzC,CACE,OAAO,CAEX,EAEMhC,GAAe,WACG,oBAAXnB,QACTtE,GAAuB,IAAI0H,gBAAgBpD,OAAOqB,SAASgC,QAE/D,EAEAvD,EAAU,WACR,GAAgD,MAA7CrE,gBAAAA,GAAqBoF,IAAI,iBAAuB,CAE/ByC,OAAA,OAAA,OAAA,EAAA,qDAChB,KAAA,EAAA,MAAA,CAAA,EAAM,IAAIC,QAAc,SAACC,SACvBvD,aAAaE,QAAQ,eAAgB1E,GAAoBoF,IAAI,iBAC7DZ,aAAaE,QAAQ,aAAc1E,GAAoBoF,IAAI,eAC3DZ,aAAaE,QAAQ,gBAAiB1E,GAAoBoF,IAAI,kBAC9DZ,aAAaE,QAAQ,iBAAkB1E,GAAoBoF,IAAI,mBAC/DZ,aAAaE,QAAQ,SAAU1E,GAAoBoF,IAAI,WACvDZ,aAAaE,QAAQ,gBAAiB1E,GAAoBoF,IAAI,kBAC9D3G,GAAcuB,GAAoBoF,IAAI,kBACtCtJ,EAASkM,sBAAqBC,EAAAA,EAAA,CAAA,EACzBnM,EAASoM,yBAAuB,CACnCC,WAAUF,EAAAA,EAAA,CAAA,GAC2B,UAAhCnM,EAASoM,+BAAuB,IAAA9M,OAAA,EAAAA,EAAE+M,aAAc,MAAI,CACvDrJ,aAAckB,GAAoBoF,IAAI,iBAAmB,KACzD1F,cAAeM,GAAoBoF,IAAI,kBAAoB,KAC3D5G,WAAYwB,GAAoBoF,IAAI,eAAiB,KACrDgD,eAAgBpI,GAAoBoF,IAAI,mBAAqB,KAC7DiD,OAAQrI,GAAoBoF,IAAI,WAAa,KAC7CkD,cAAetI,GAAoBoF,IAAI,kBAAoB,UAG/D2C,GACF,kBArBA3M,EAAAmN,OAsBAC,aAGJ,MAAWxI,IAAmE,IAA5CyI,OAAOC,KAAK1I,IAAqB+E,QAEjEyD,IAGJ,EAAE,CAACxI,KAEH,IAAMwI,GAAO,WACKX,OAAA,OAAA,OAAA,EAAA,0EACX,IAAArD,aAAaC,QAAQ,kBAArB,MAAA,CAAA,EAAA,oBAEkB,6BAAA,CAAA,EAAMkE,EAAIvD,IAAI,wCAAAwD,OAAwCpE,aAAaC,QAAQ,4BAE5F,OAFMa,EAAWmC,EAAAc,SAMyB,YAAb,QAA1BnB,EAAc,QAAdhM,EAAAkK,aAAQ,EAARA,EAAUC,YAAI,IAAAnK,OAAA,EAAAA,EAAEyN,kBAAU,IAAAzB,OAAA,EAAAA,EAAE0B,QAAqBxC,KAElDxK,EAASkM,sBAAqBC,EAAAA,EAAA,CAAA,EACzBnM,EAASoM,yBAAuB,CACnCC,WAAUF,EAAAA,EAAA,CAAA,GAC2B,UAAhCnM,EAASoM,+BAAuB,IAAAZ,OAAA,EAAAA,EAAEa,aAAc,MAAI,CACvDrJ,aAAc0F,aAAaC,QAAQ,iBAAmB,KACtD/E,cAAe8E,aAAaC,QAAQ,kBAAoB,KACxDjG,WAAYgG,aAAaC,QAAQ,kBAAoB,KACrD2D,eAAgB5D,aAAaC,QAAQ,mBAAqB,KAC1D4D,OAAQ7D,aAAaC,QAAQ,WAAa,KAC1C6D,cAAe9D,aAAaC,QAAQ,kBAAoB,UAI9DlH,IAAe,WAlBbwL,QAAQC,IAAI,6BACZ,CAAA,EAAO,gCAkBOD,QAAQC,IAAI,uCAAwCC,+BAK1EzE,aAAa0E,WAAW,SACxBjM,GAAsBuH,aAAaC,QAAQ,mBAAqB,MAChErH,GAAcoH,aAAaC,QAAQ,WAAa,MAChDhG,GAAc+F,aAAaC,QAAQ,kBAAoB,MACvD5C,GAAWoC,QAAUO,aAAaC,QAAQ,YAAc,KACxD9E,GAAiB6E,aAAaC,QAAQ,kBAAoB,MAE1DD,aAAaC,QAAQ,mBAAqBD,aAAaC,QAAQ,kBAAoB7H,IAAU,GAC7F4H,aAAaC,QAAQ,iBAAmB1F,GAAgByF,aAAaC,QAAQ,iBAC7ED,aAAaC,QAAQ,iBAAmB7F,GAAgB4F,aAAaC,QAAQ,iBAA+B,gBAE5GtG,GAAY,CACVgL,UAAW3E,aAAaC,QAAQ,gBAChC2E,MAAO5E,aAAaC,QAAQ,aAC5B4E,SAAU7E,aAAaC,QAAQ,gBAC/B6E,QAAS9E,aAAaC,QAAQ,eAC9B8E,UAAW/E,aAAaC,QAAQ,kBAElCD,aAAaC,QAAQ,gBACnBhB,GAAY+F,KAAKC,MAAMjF,aAAaC,QAAQ,iBAAmB,KAC/DD,aAAaE,QAAQ,eAAgB8E,KAAKE,UAAUlG,KAEtDgB,aAAaC,QAAQ,mBAAqBkF,GAAenF,aAAaC,QAAQ,kBAAmB,UAEjGH,SAASsF,iBAAiB,mBAAoB,iBACX,YAA7BtF,SAASuF,iBAEXzI,GAAiB6C,SAAU,EACJ,oBAAbK,UAA4BnD,GAAY8C,SAAWO,aAAaC,QAAQ,WAChF5D,IAAmB,GACnBG,IAAc,GACdZ,IAAgB,GAChBkE,SAAS/B,MAAQiC,aAAaC,QAAQ,UAAY,GACX,QAAvCrJ,EAAAkJ,SAASwF,eAAe,uBAAe,IAAA1O,GAAAA,EAAE2O,QACzCC,WAAW,WAAM,OAAAxF,aAAa0E,WAAW,QAAxB,EAAkC,MAErD1E,aAAaC,QAAQ,mBAAqBkF,GAAenF,aAAaC,QAAQ,kBAAmB,qBAGjGrD,GAAiB6C,SAAU,CAE/B,EACF,EAEM0F,GAAiB,SAAOM,EAAoBrE,GAAe,OAAAiC,OAAA,OAAA,OAAA,EAAA,wEAE1D,6BAAAoC,EACoB,CAAA,EAAMtB,EAAIvD,IAAI,uDAAgD6E,EAAM,uCADxF,CAAA,EAAA,UAEE,OADG3E,EAAe8B,EAAAmB,SAEnBQ,QAAQC,IAAI,mBAAAJ,OAAmBhD,GAAYN,GAEf,CAAA,EAAMwC,QAAQoC,IACvB,QAAjB9O,EAAAkK,aAAQ,EAARA,EAAU6E,eAAO,IAAA/O,OAAA,EAAAA,EAAEgP,UAAUnD,IAAI,SAAMoD,GAAI,OAAAxC,OAAA,OAAA,OAAA,EAAA,0EAGlC,UAFP9F,UAAWsI,aAAI,EAAJA,EAAMtI,UACjBW,KAAsB,QAAhB0E,EAAAiD,eAAAA,EAAMxB,kBAAU,IAAAzB,OAAA,EAAAA,EAAEkD,MACjB,CAAA,EAAMC,GAAyB,QAAhBjD,EAAA+C,aAAI,EAAJA,EAAMxB,kBAAU,IAAAvB,OAAA,EAAAA,EAAEkD,eAHK,MAAA,CAAA,GAG7CpP,EAAAqP,MAAOtO,EAAAoM,OACPnN,EAAAiD,QAAyB,QAAhBoJ,EAAA4C,eAAAA,EAAMxB,kBAAU,IAAApB,OAAA,EAAAA,EAAEiD,KAC3BtP,EAAAL,KAAM,KACNK,EAAAqH,UAAW4H,aAAI,EAAJA,EAAMM,GACjBvP,EAAA+G,OAAuB,QAAfvG,EAAAyO,eAAAA,EAAMO,iBAAS,IAAAhP,OAAA,EAAAA,EAAE+O,GACzBvP,EAAAgH,WAA0B,UAAdiI,EAAKhI,KAAmB,QAAUgI,EAAKxB,WAAWgC,iBAC9D,EAAA,MAbH,CAAA,EAAA,UAGGC,EAAwB1D,EAAAmB,QAYxBpH,GAAY8C,SAAWwE,OAAOC,KAAKoC,GAAa/F,OAAS,GAC3D3E,IAAgB,GAGlB0K,EAAcA,EAAYC,KAAK,SAACC,EAAGC,GAAM,OAAA,IAAIhJ,KAAKgJ,EAAElJ,WAAWmJ,UAAY,IAAIjJ,KAAK+I,EAAEjJ,WAAWmJ,SAAxD,GACzCzH,GAAYqH,GACZtG,aAAaE,QAAQ,cAAe8E,KAAKE,UAAUoB,wCAGrDrH,GAAY3B,0DAEdiH,QAAQC,IAAI,2BAA4BmC,gCAI5C9G,EAAU,WACgB,oBAAbC,WACLzI,GACFyI,SAAS2B,KAAKmF,MAAMC,SAAW,SAC/B/G,SAASgH,gBAAgBF,MAAMC,SAAW,WAE1C/G,SAAS2B,KAAKmF,MAAMC,SAAW,GAC/B/G,SAASgH,gBAAgBF,MAAMC,SAAW,IAGhD,EAAG,CAACxP,IAEJ,IA6EI0P,GA9DJlH,EAAU,qBAfkBmH,EAgB1B,GAAGhN,GAAW,CACZ,IAAMiN,EAAU/L,IAAiBgM,IACjC/L,GAAiB8L,GACjBjH,aAAaE,QAAQ,gBAAiB+G,GAElC1H,GAAGE,UAASF,GAAGE,cArBK,KAAAuH,EAqBwBC,KArBxBD,EAAA,MACnBG,EAAG,GAAA/C,OAAGnN,mDACX,CACEmQ,KAAM,MACNC,MAAO,CACLvQ,SAAUkQ,GAEZM,cAAc,EACdC,qBAAsBC,IACtBC,kBAAmB,IACnBC,qBAAsB,IACtBC,QAAS,gBAYX/Q,EAAA2I,GAAGE,wBAASmI,GAAG,UAAW,WACxBrD,QAAQC,IAAI,gCACd,GAEU,QAAV5B,EAAArD,GAAGE,eAAO,IAAAmD,GAAAA,EAAEgF,GAAG,gBAAiB,SAACC,GAC/BtD,QAAQC,IAAI,wBAAAJ,OAAwByD,EAAIhO,UACxC0F,GAAGE,QAAU,IACf,GAEU,QAAVqD,EAAAvD,GAAGE,eAAO,IAAAqD,GAAAA,EAAE8E,GAAG,aAAc,SAACE,GAC5BvD,QAAQC,IAAI,wBAAiBsD,IAC7BvI,GAAGE,QAAU,IACf,EAEF,CACF,EAAG,CAACzF,KAEJ6F,EAAU,WACUwD,OAAA,OAAA,OAAA,EAAA,oDAMb9D,GAAGE,SAAW9G,KAEf4G,GAAGE,QAAQsI,KAAK,WAAYpP,KAE3B4G,GAAGE,QAAQuI,UAAU,cAAA5D,OAAczL,KAAc4H,SAAoB,QAAV3J,EAAA2I,GAAGE,eAAO,IAAA7I,GAAAA,EAAEgR,GAAG,cAAAxD,OAAczL,IAAc,SAACoI,GAEtG,GAAGA,EAAK8C,SAAW7D,aAAaC,QAAQ,UACtC,OAAOc,EAAKlD,MACV,IAAK,eACHR,GAAWoC,QAAUsB,EAAKA,KAAKsD,WAAW4D,QAC1CjI,aAAaE,QAAQ,UAAW7C,GAAWoC,SAAW,IAAK,MAC7D,IAAK,sBAAuBpG,IAAe,GAAO,MAClD,IAAK,kBAAmB6O,GAAenH,EAAKA,MAIlD,KAECxB,GAAGE,QAAQuI,UAAU,kBAAA5D,OAAkBzL,KAAc4H,SAAoB,QAAVqC,EAAArD,GAAGE,eAAO,IAAAmD,GAAAA,EAAEgF,GAAG,kBAAAxD,OAAkBzL,IAAc,SAAOoI,GAAI,OAAAsC,OAAA,OAAA,OAAA,EAAA,4CAErHtC,EAAK8C,SAAWlL,IAA8B,UAAhBoI,EAAKoH,QACpC/K,IAAe,QAElB,EAAA,YAIP,EAAG,CAACzE,KAKJkH,EAAU,WACUwD,OAAA,OAAA,OAAA,EAAA,qCAChB,IACE0D,KAAgB5J,IAAcqI,WAAW,WACvCpI,IAAe,GACfgL,aAAarB,GACf,EAAG,KACL,CAAE,MAAO9F,GACPsD,QAAQC,IAAI,uBAAwBvD,EACtC,cAGJ,EAAG,CAAC9D,KAEJ0C,EAAU,WACRR,GAAYI,QAAUT,EACxB,EAAG,CAACA,KAEJa,EAAU,WACUwD,OAAA,OAAA,OAAA,EAAA,2CAChB,IACKrE,GAASuB,QAAU5H,IACpB4G,GAAGE,UAAqB,QAAV7I,EAAA2I,GAAGE,eAAO,IAAA7I,GAAAA,EAAEmR,KAAK,iBAAkB,CAC/ClE,OAAQlL,GACRiL,eAAgBpL,GAChBqB,QAASA,GACTsO,OAAQ,aAGd,CAAE,MAAOlH,GACPsD,QAAQC,IAAI,uBAAwBvD,EACtC,cAGJ,EAAG,CAACpH,KAEJ,IAAMkM,GAAW,gHAAOE,yBAAA,IAAAA,IAAAA,EAAA,gDAGjB,6BADCoC,EAAe,GAChBpC,EACoB,CAAA,EAAM9B,EAAIvD,IAAI,6CAAsCqF,KADxE,CAAA,EAAA,UAGD,OAFMnF,EAAelK,EAAAmN,SAKnBQ,QAAQC,IAAI,qBAAsB1D,GAE/BmD,OAAOC,KAAKpD,GAAUP,QACvBO,EAAS2B,IAAI,SAACoD,WACZwC,EAAQC,EAAAA,EAAA,GAAOD,GAAQ,GAAA,CAAE,CACvBlC,IAAIN,eAAAA,EAAMM,KAAM,GAChBtI,MAAsB,QAAhBjH,EAAAiP,aAAI,EAAJA,EAAMxB,kBAAU,IAAAzN,OAAA,EAAAA,EAAE2R,WAAY,GACpCzT,KAAqB,QAAhB8N,EAAAiD,aAAI,EAAJA,EAAMxB,kBAAU,IAAAzB,OAAA,EAAAA,EAAE4F,MAAO,MAC/B,EACH,GAEF,CAAA,EAAyC,IAAjCvE,OAAOC,KAAKmE,GAAU9H,OAAgB8H,EAAW,MAbzD9D,QAAQC,IAAI,oCAgBd,KAAA,EAAA,MAAA,CAAA,EAAO,8BAIT,kBADAD,QAAQC,IAAI,wBAAyBiE,GACrC,CAAA,EAAO,2BAILP,GAAiB,SAAOnH,GAAQ,OAAAsC,OAAA,OAAA,OAAA,EAAA,8EACjCtC,GAAS1B,GAAYI,QAAQiJ,KAAK,SAAAC,GAAO,OAAAA,EAAI1K,YAAc8C,EAAKoF,EAAvB,GAAzC,MAAA,CAAA,EAAA,oBAII,6BAFsD,YAAb,QAA5CrD,EAAgC,QAAhCF,EAAkB,QAAlBhM,EAAAmK,aAAI,EAAJA,EAAM6H,oBAAY,IAAAhS,OAAA,EAAAA,EAAEgP,UAAU,UAAE,IAAAhD,OAAA,EAAAA,EAAEyB,kBAAU,IAAAvB,OAAA,EAAAA,EAAEwB,SAAuBjL,IAAe,GAChFwP,EAAe,GAChB9H,EAAKsD,WAAW2B,MACN,CAAA,EAAMD,GAAShF,EAAKsD,WAAW2B,QADzC,CAAA,EAAA,iBACD6C,EAAW5F,SACyB,IAAjCgB,OAAOC,KAAK2E,GAAUtI,SAAcsI,EAAW,MAClDC,GAAe/H,EAAM8H,gBAErBC,GAAe/H,EAAM8H,yDAGvBtE,QAAQC,IAAI,0BAA2BuE,gCAKvCD,GAAiB,SAAC/H,EAAWkF,GACjC,IAAI+C,EAAqB,CACvBpL,WAA0B,UAAdmD,EAAKlD,KAAmBkD,EAAKsD,WAAWgC,WAAatF,EAAKlD,KACtEN,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAoB,UAAd6C,EAAKlD,KAAmBkD,EAAKsD,WAAWyB,KAAO/E,EAAKlD,KAC1DhE,QAAuB,UAAdkH,EAAKlD,KAAmBkD,EAAKsD,WAAW6B,KAAOnF,EAAKhD,MAC7DxH,KAAM,KACN0P,MAAOA,EACPhI,UAAW8C,EAAKoF,GAChBxI,OAAsB,UAAdoD,EAAKlD,KAAmBkD,EAAKqF,UAAUD,GAAK,YAElDxJ,GAAY8C,SAAY7C,GAAiB6C,SAC3C7D,IAAgB,GAElBwD,GAAckJ,EAAAA,EAAA,GAAMnJ,IAAe,IAAG,GAAA,CAAE6J,IAAU,IAElDxD,WAAW,WACTpG,GAAe,MACfH,MAAa+J,GAAe3J,GAAYI,aACxCO,aAAaE,QAAQ,eAAgB8E,KAAKE,UAASoD,EAAA,CAAEU,GAAe3J,GAAYI,SAAO,KACvF1G,IAAe,GACfyG,IACF,EAAG,IACL,EAEAK,EAAU,WACR,GAAuB,oBAAbC,SAER,GADIE,aAAaC,QAAQ,UAAUD,aAAaE,QAAQ,QAA8B,oBAAbJ,UAA4BA,SAASK,qBAAqB,SAAS,GAAGC,aAAgB,IAC5JzE,GAAc,CACf,IAAIsN,EAAQ,IAAIC,MAAM9T,EAAkB+T,YACxCF,EAAMG,aAAa,cAAe,aAClCH,EAAMI,OAAOrI,MAAM,SAACC,GAClBsD,QAAQC,IAAI,iDACd,GACA1E,SAAS/B,MAAQ,wBACnB,MAEE+B,SAAS/B,MAAQiC,aAAaC,QAAQ,UAAY,GAClDT,IAGN,EAAG,CAAC7D,KAEJkE,EAAU,WACUwD,OAAA,OAAA,OAAA,EAAA,2CAChB,IACuB,oBAAXtD,QAA8C,oBAAbD,WACtCvG,IACEwG,OAAOuJ,WAAa,MAAKxJ,SAAS2B,KAAKmF,MAAMC,SAAW,UAC3DnK,GAAY+C,SAAWgB,cAAc/D,GAAY+C,SAC9CO,aAAaC,QAAQ,WAAUH,SAAS/B,MAAQiC,aAAaC,QAAQ,UAAY,IACpF5D,IAAmB,GACnBG,IAAe,GACfZ,IAAgB,GACuB,QAAvChF,EAAAkJ,SAASwF,eAAe,uBAAe,IAAA1O,GAAAA,EAAE2O,QACzCC,WAAW,WAAM,OAAAxF,aAAa0E,WAAW,QAAxB,EAAkC,OAEnD5E,SAAS2B,KAAKmF,MAAMC,SAAW,GAC/BvL,IAAkB,GAClBjC,IAAe,KAGnBmG,KACA7C,GAAY8C,QAAUlG,EACxB,CAAE,MAAO0H,GACPsD,QAAQC,IAAI,uBAAwBvD,EACtC,cAGJ,EAAG,CAAC1H,KAUJ,IAAMuI,GAAY,WACbvC,GAAGE,SAAW9G,KACf4G,GAAGE,QAAQsI,KAAK,YAAapP,IAC7B4G,GAAGE,QAAQ8J,sBAEb9Q,GAAsB,MACtBG,GAAc,MACd8B,GAAiB,IACjBM,IAAoBD,IACpBjD,IAAU,GACVG,GAAiB,MACjBR,EAAkBgI,QAAU,KAC5BO,aAAa0E,WAAW,aACxB1E,aAAa0E,WAAW,kBACxB1E,aAAa0E,WAAW,UACxB1E,aAAa0E,WAAW,iBACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,eACxB1E,aAAa0E,WAAW,gBACxB1E,aAAa0E,WAAW,WACxB1E,aAAa0E,WAAW,iBACxBnK,GAAgB,MAChBH,GAAgB,MAChBH,GAAc,MACdN,GAAY,CAAA,GACZZ,IAAe,GACfX,IAAU,GACVE,GAAS,MACT+E,GAAWoC,QAAU,KACrB3F,GAAW,IACXkG,aAAaE,QAAQ,eAAgB8E,KAAKE,UAAU5H,KACpD8B,GAAe,MACfH,GAAY3B,IACZkC,KACAnI,GAAcmC,IAAY,GAE1BlC,EAASkM,sBAAqBC,EAAAA,EAAA,CAAA,EACzBnM,EAASoM,yBAAuB,CACnCC,WAAY,OAEhB,EA4DM6F,GAAc,gHAAOC,uBAAA,IAAAA,IAAAA,EAAA,yBACzB,GAAG5P,GAAQ0G,OAAS,GAAKkJ,GAAcxF,OAAOC,KAAKzJ,IAAe8F,OAAS,EAAG,CACxD,oBAAbT,WAAmE,UAAvCA,SAASwF,eAAe,uBAAe,IAAA1O,GAAAA,EAAE2O,UACxEmE,EAAW,IAAIC,GACVC,OAAO,kBAAmB5J,aAAaC,QAAQ,mBACxDyJ,EAASE,OAAO,UAAW/P,IAAW4P,GACtCC,EAASE,OAAO,OAAQ5J,aAAaC,QAAQ,iBAC7CyJ,EAASE,OAAO,SAAU,YAC1B9P,GAAW,IACXZ,IAAe,GACf,IACE+K,OAAOC,KAAKzJ,IAAe8F,OAAS,GAAK9F,GAAcgI,IAAI,SAAOoD,GAAU,OAAAxC,OAAA,OAAA,OAAA,EAAA,4CAC1EqG,EAASE,OAAO,QAAS/D,QAC1B,EAAA,EACH,CAAE,MAAOjG,GAET,CAEA,IACEuE,EAAI0F,KAAK,wCAAAzF,OAAwCpE,aAAaC,QAAQ,kBAAiB,iBAAiByJ,EAAU,CAChHI,QAAS,CAAC,eAAgB,yBAE3BjJ,KAAK,SAAAE,GACDA,GACDrG,GAAiB,IACjBtC,IAAU,GACVc,IAAe,GACfH,IAAe,KAGfgD,IAAe8F,MAEfC,KACAyC,QAAQC,IAAI,0BAEhB,GACCxD,MAAM,SAAAC,GACLlF,IAAe8F,MACf0C,QAAQC,IAAI,kBAAmBvD,EACjC,EACF,CAAE,MAAOA,GACPsD,QAAQC,IAAI,qBAAsBvD,EACpC,CACF,gBA8BI8I,GAAoB,WAAA,OAAA1G,OAAA,OAAA,OAAA,EAAA,sEAUP,OARjBtK,IAAe,GACfiH,aAAaE,QAAQ,eAAgBxG,GAASiL,WAC9CpK,GAAgBb,GAASiL,WACzB3E,aAAaE,QAAQ,YAAaxG,GAASkL,OAC3C5E,aAAaE,QAAQ,eAAgBxG,GAASmL,UAC9C7E,aAAaE,QAAQ,cAAexG,GAASoL,SAC7C9E,aAAaE,QAAQ,eAAgBxG,GAASqL,WAE7B,CAAA,GA7IKiF,EA6IUtQ,GAASkL,MA7IXvB,OAAA,OAAA,OAAA,EAAA,kEAEf,6BAAA,CAAA,EAAMc,EAAIvD,IAAI,iDAA0CoJ,EAAQ,2BAC7E,MAAA,CAAA,EADapT,EAAAmN,QACE,+BACCQ,QAAQC,IAAI,wBAAyByF,wCA0IpD,OADGC,EAAWtH,EAAAmB,SAEf/D,aAAaE,QAAQ,eAAgBgK,GACrC5R,GAAS4R,GAEe,CAAA,GA1I1BC,EA2IIzQ,GAASiL,UA1IbyF,EA2II1Q,GAASkL,MA1IbyF,EA2II3Q,GAASoL,QA1IbwF,EA2II5Q,GAASqL,UA1IbwF,EA2IIpQ,GA1IJqQ,EA2II9Q,GAASmL,SA3IcxB,OAAA,OAAA,OAAA,EAAA,oEAGR,6BAAA,CAAA,EAAMc,EAAI0F,KAAK,8CAC9B,CACE1S,OAAQ,SACRsT,QAAS,WACTC,WAAYN,GAAgB,KAC5BO,gBAAiBR,GAAmB,KACpCS,iBAAkBR,GAAgB,KAClCS,mBAAoBR,GAAkB,KACtCS,oBAAqBR,GAAmB,KACxCS,gBAAiBR,GAAmB,KACpCS,oBAAqBR,GAAmB,eAG5C,OAbM1J,EAAWlK,EAAAmN,QAmBjB,CAAA,EAAOjD,GAAsB,OAL3ByD,QAAQC,IAAI,8BACZzI,IAAc,GACd,CAAA,EAAO,gCAKTA,IAAc,GACdkP,EAAUC,EAAMrR,QAAQsR,WAAW,gBAAgB,IAAK,wCAwGvD,CAAA,EAAA,iBAIKC,EAAkBxI,EAAAmB,SAStB3L,IAAU,GACV6B,GAAcmR,eAAAA,EAAiBtH,eAC/B9D,aAAaE,QAAQ,iBAAkBkL,aAAe,EAAfA,EAAiBxH,gBACxD5D,aAAaE,QAAQ,SAAUkL,aAAe,EAAfA,EAAiBvH,QAChD7D,aAAaE,QAAQ,gBAAiBkL,aAAe,EAAfA,EAAiBtH,eACvDlL,GAAcwS,eAAAA,EAAiBvH,QAC/BpL,GAAsB2S,eAAAA,EAAiBxH,gBACvCtM,EAASkM,sBAAqBC,EAAAA,EAAA,CAAA,EACzBnM,EAASoM,yBAAuB,CACnCC,WAAUF,EAAAA,EAAA,CAAA,EAC2B,QAAhC7M,EAAAU,EAASoM,+BAAuB,IAAA9M,OAAA,EAAAA,EAAE+M,YAAU,CAC/CrJ,aAAcZ,GAASiL,UACvBzJ,cAAeA,GACflB,WAAYoR,aAAe,EAAfA,EAAiBtH,cAC7BF,eAAgBwH,aAAe,EAAfA,EAAiBxH,eACjCC,OAAQuH,aAAe,EAAfA,EAAiBvH,OACzBC,cAAesH,aAAe,EAAfA,EAAiBtH,mBAGpC,IAAIR,QAAc,SAACC,GACjBtE,GAAY,SAACoM,GAEX,OADA9H,IACO,EACT,GACAiG,GAAY/R,EAAkBgI,QAChC,GAAGoB,KAAK,WACNiI,GAAe,CAACjL,KAAM,QAASE,MAAO,2CAA4C,KACpF,IAEAhC,IAAe8F,mBAGjB9I,IAAe,8BApLQ,IACzBoR,EACAC,EACAC,EACAC,EACAC,EACAC,EAbsBR,OAudlBsB,GAAsCC,EAAY,CACtDC,SAAS,EACTC,YAAY,EACZC,OAAQ,SAACC,GACJhT,KAGDgT,GADAA,GADAA,EAAgBA,EAAcC,OAAO,SAAA/F,GAAQ,OAAAA,EAAKgG,KAAI,SAAwBhG,EAAOoF,EAAU,wBAAA7G,OA9kCpF,GA8kCoH,MAAM,QAAxF,IACfwH,OAAO,SAAA/F,GAAQ,OAAAhJ,GAAe6L,KAAK,SAAAoD,GAAO,OAAAjG,EAAKkG,KAAKC,SAASF,EAAnB,GAA2BjG,EAAOoF,EAAU,6BAA8B,QAArG,IACfW,OAAO,SAAA/F,GAAQ,OAA4E,IAA5E5B,OAAOC,KAAKzJ,GAAcmR,OAAO,SAAAE,GAAO,OAAAA,EAAIC,OAASlG,EAAKkG,IAAlB,IAAyBxL,MAAjE,GAC7C0D,OAAOC,KAAKzJ,IAAe8F,OAAS0D,OAAOC,KAAKyH,GAAepL,OAAS0L,EACtEvR,UAAqBD,IAAa,GAAKkR,GAAa,IACpDV,EAAU,WAAA7G,OAplCA,YAolC8B,WAC1CvJ,IAAc,GAElB,IAbKqR,GAAYZ,GAAAY,aAAEC,GAAab,GAAAa,cAAEC,GAAId,GAAAc,KAqBxC,OACEC,EAAAC,cAAAD,EAAAE,SAAA,WACqD,IAA3CC,QAAQC,IAAIC,4BAAyF,MAA3CF,QAAQC,IAAIC,6BAChFL,EAAAC,cAAC1W,EAAM,KACLyW,EAAAC,cAACtW,KACC2W,UAAW,UAAGpT,GAAW,OAAS,GAAE,KAAA6K,OAAI/M,EAAW,aAAa,KAC5D6U,KAAc,CAClBU,WAAY,WAAM,OAAAjU,IAAckC,IAAc,EAA5B,EAClBgS,aAAc,WAAM,OAAAhS,IAAc,EAAd,IAEpBwR,EAAAC,cAACpW,EAAU,KACTmW,EAAAC,cAACjX,EAAS,CAACsX,UAAU,mBACnBN,EAAAC,cAACQ,EAAG,CAACH,UAAU,8BACbN,EAAAC,cAAA,MAAA,KACED,EAAAC,cAAA,MAAA,CAAKS,IAAKnY,EAAYuU,aACtBkD,EAAAC,cAAA,OAAA,KAAA,eAGJD,EAAAC,cAACQ,EAAG,CAACH,UAAU,+BACXnU,IAAsByL,OAAOC,KAAKlF,IAAUuB,OAAS,GAAK8L,0BAAQW,QAAS,WAAM,OAAAlL,IAAA,EAAa6K,UAAU,SAAO,QAChHnU,IAAsB6T,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAM,OAAA1R,IAAkB,EAAlB,EAAyBqR,UAAU,SAAO,qBACtFtV,GAAcgV,EAAAC,cAAA,MAAA,CAAKS,IAAK/X,EAAamU,WAAYwD,UAAU,QAAQK,QAAS,WAAM,OAAAxT,IAAaD,GAAb,OAI1F8S,EAAAC,cAACW,EAAa,CAACpP,KAAK,SACpBwO,EAAAC,cAAClW,EAAW,KACViW,EAAAC,cAACjX,EAAS,CAACsX,UAAW,+DACpBN,EAAAC,cAAA,MAAA,CAAKY,IAAK5N,KACV+M,EAAAC,cAACa,EAAI,CACHnO,SAAUA,GACV1E,aAAcA,GACdN,WAAYA,GACZxB,mBAAoBA,GACpBuC,gBAAiBA,GACjBpB,YAAaA,GACbyT,aAhFS,SAACpP,GACpB,GAAGlC,IAAcnD,IAAc0U,IAC7B,OAAOrP,GACL,IAAK,gBApQc,WACvB5D,GAAgB,gBAChB4F,aAAaE,QAAQ,eAAgB,gBACrC,IAAIoG,EAAWgC,EAAA,CACb,CACE1K,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,KACTtD,KAAM,CACJsH,KAAM,OACNC,MAAO,CACL,CACEC,MAAO,OACPC,OAAQ,YACRsP,YAAa,KACbzP,KAAM,OACN0P,UAAU,GAEZ,CACExP,MAAO,QACPC,OAAQ,QACRsP,YAAa,KACbzP,KAAM,QACN0P,UAAU,GAEZ,CACExP,MAAO,sBACPC,OAAQ,UACRsP,YAAa,mBACbzP,KAAM,MACN0P,UAAU,GAEZ,CACExP,MAAO,oCACPC,OAAQ,WACRsP,YAAa,KACbzP,KAAM,SACN0P,UAAU,EACVC,QAAS,CACPpP,MAAO,QACPC,aAAc,eACdK,UAAW,cAGf,CACEX,MAAO,SACPC,OAAQ,cACRH,KAAM,YAIZI,UAAW,KAEb,CACEL,WAAY,QACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,uIACTtD,KAAM,KACN0H,UAAW,KAEb,CACEL,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,SACNP,OAAQ,SACR9D,QAAS,gBACTtD,KAAM,KACN0H,UAAW,MACPe,GAASwB,MAAM,OACvBpB,GAAckJ,EAAAA,EAAA,GAAMnJ,IAAe,IAAG,GAAA,CAAEmH,EAAY,KAAE,IACtDd,WAAW,WAAQpG,GAAe,MAAOH,GAAYqH,EAAa,EAAG,KAErEtG,aAAaE,QAAQ,eAAgB8E,KAAKE,UAAUoB,GACtD,CAuL2BmH,GAAoB,MACzC,IAAK,gBAtLc,WACvBrT,GAAgB,sBAChB4F,aAAaE,QAAQ,eAAgB,sBACrC,IAAIoG,EAAWgC,EAAA,CACb,CACE1K,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,KACTtD,KAAM,CACJsH,KAAM,OACNC,MAAO,CACL,CACEC,MAAO,OACPC,OAAQ,YACRsP,YAAa,KACbzP,KAAM,OACN0P,UAAU,GAEZ,CACExP,MAAO,QACPC,OAAQ,QACRsP,YAAa,KACbzP,KAAM,QACN0P,UAAU,GAEZ,CACExP,MAAO,sBACPC,OAAQ,UACRsP,YAAa,mBACbzP,KAAM,MACN0P,UAAU,GAEZ,CACExP,MAAO,oCACPC,OAAQ,WACRsP,YAAa,KACbzP,KAAM,SACN0P,UAAU,EACVC,QAAS,CACPpP,MAAO,QACPC,aAAc,eACdK,UAAW,cAGf,CACEX,MAAO,SACPC,OAAQ,cACRH,KAAM,YAIZI,UAAW,KAEb,CACEL,WAAY,QACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,uIACTtD,KAAM,KACN0H,UAAW,KAEb,CACEL,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,SACNP,OAAQ,SACR9D,QAAS,8BACTtD,KAAM,KACN0H,UAAW,MACPe,GAASwB,MAAM,OACvBpB,GAAckJ,EAAAA,EAAA,GAAMnJ,IAAe,IAAG,GAAA,CAAEmH,EAAY,KAAE,IACtDd,WAAW,WAAQpG,GAAe,MAAOH,GAAYqH,EAAa,EAAG,KAErEtG,aAAaE,QAAQ,eAAgB8E,KAAKE,UAAUoB,GACtD,CAyG2BoH,GAAoB,MACzC,IAAK,gBAxGc,WACvBtT,GAAgB,kBAChB4F,aAAaE,QAAQ,eAAgB,kBACrC,IAAIoG,EAAWgC,EAAA,CACb,CACE1K,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,KACTtD,KAAM,CACJsH,KAAM,OACNC,MAAO,CACL,CACEC,MAAO,OACPC,OAAQ,YACRsP,YAAa,KACbzP,KAAM,OACN0P,UAAU,GAEZ,CACExP,MAAO,QACPC,OAAQ,QACRsP,YAAa,KACbzP,KAAM,QACN0P,UAAU,GAEZ,CACExP,MAAO,sBACPC,OAAQ,UACRsP,YAAa,mBACbzP,KAAM,MACN0P,UAAU,GAEZ,CACExP,MAAO,8CACPC,OAAQ,YACRsP,YAAa,iCACbzP,KAAM,SACN0P,UAAU,GAEZ,CACExP,MAAO,oCACPC,OAAQ,WACRsP,YAAa,KACbzP,KAAM,SACN0P,UAAU,EACVC,QAAS,CACPpP,MAAO,QACPC,aAAc,eACdC,4BAA6B,4BAC7BC,kBAAmB,oBACnBC,QAAS,UACTC,aAAc,eACdC,UAAW,cAGf,CACEX,MAAO,SACPC,OAAQ,cACRH,KAAM,YAIZI,UAAW,KAEb,CACEL,WAAY,QACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,WACNP,OAAQ,WACR9D,QAAS,uIACTtD,KAAM,KACN0H,UAAW,KAEb,CACEL,WAAY,WACZL,UAAWC,EAAO,IAAIC,MAAQC,SAC9BQ,KAAM,SACNP,OAAQ,SACR9D,QAAS,0BACTtD,KAAM,KACN0H,UAAW,MACPe,GAASwB,MAAM,OACvBpB,GAAckJ,EAAAA,EAAA,GAAMnJ,IAAe,IAAG,GAAA,CAAEmH,EAAY,KAAE,IACtDd,WAAW,WAAQpG,GAAe,MAAOH,GAAYqH,EAAa,EAAG,KAErEtG,aAAaE,QAAQ,eAAgB8E,KAAKE,UAAUoB,GACtD,CAgB2BqH,GAAoB,MACzC,IAAK,cACEjU,GAASiL,WACZjL,GAASoL,SAAgC,MAArBpL,GAASoL,SAAmBpL,GAASkL,QACb,mBAAzC5E,aAAaC,QAAQ,sBACM,IAAvBvG,GAASqL,WAAwE,mBAAzC/E,aAAaC,QAAQ,kBAA0CvG,GAASmL,UAAY1K,KACjI1C,EAAkBgI,QAAU,MAAA2E,OAAMzF,GAAexE,IAAa,gCAAAiK,OAA+B1K,GAASiL,UAAS,wBAAAP,OAAuB1K,GAASkL,MAAK,0BAAAR,OAAyB1K,GAASoL,QAAO,UAAAV,YAAwC,IAAvB1K,GAASqL,UAA2B,sDAAsDrL,GAASqL,UAAU,SAAS,GAAE,6CAAAX,OAA4CjG,GAAWzE,GAASmL,WA9V/XxB,OAAA,OAAA,OAAA,EAAA,kEAIM,6BAFrBtK,IAAe,GAEM,CAAA,EAAMoL,EAAIvD,IAAI,oEAA6DlH,GAASkL,QACxG/D,KAAK,SAAAE,aAEJ,OADAhI,IAAe,GACe,OAAjB,QAAVnC,EAAAmK,aAAI,EAAJA,EAAMA,YAAI,IAAAnK,OAAA,EAAAA,EAAEgX,cAAgC,QAAVhL,EAAA7B,aAAI,EAAJA,EAAMA,YAAI,IAAA6B,OAAA,EAAAA,EAAE7B,OAC/CjJ,IAAU,GACVG,GAA2B,QAAV6K,EAAA/B,aAAI,EAAJA,EAAMA,YAAI,IAAA+B,OAAA,EAAAA,EAAEjJ,UACtB,IAEPkQ,MACO,EAEX,GACC/I,MAAM,SAAAC,GACLsD,QAAQC,IAAI,kBAAmBvD,EACjC,kBAdqBrK,EAAAmN,sCAeLQ,QAAQC,IAAI,0BAA2BqJ,qCAkVvD/L,IAGJ,EA4DY3C,YAAaA,GACbrD,WAAYA,GACZqI,IAAKA,MAIThH,IAAe5D,IAAY8S,EAAAC,cAAC7V,EAAK,KAAC4V,EAAAC,cAAA,QAAA,KAAA,uBAClCnU,KAAWiB,MAA2B,QAAXwJ,EAAA5D,GAAS,UAAE,IAAA4D,OAAA,EAAAA,EAAErM,OAAQ8V,EAAAC,cAAChW,EAAS,CAACqW,UAAW,GAAAvI,OAAG/M,EAAW,kBAAkB,KAAMgV,EAAAC,cAAC5W,EAAiB,KAC9H2W,EAAAC,cAAA,QAAA,CAAOnG,GAAG,eAAewG,UAAiD,GAAImB,aAAa,MAAMC,UAAW,IAAKC,SAAU,SAACpO,GAAM,OAAA9F,GAAW8F,EAAEqO,OAAOnQ,MAApB,EAA4BA,MAAOjE,GAASgE,KAAK,OAAOyP,YAAY,qBACtMjB,EAAAC,cAAA,QAAA7I,EAAA,CAAA,EAAW0I,OACXE,EAAAC,cAAA,MAAA,CAAKK,UAAU,SAASuB,IAAI,iBAAiBnB,IAAK7X,EAAUiU,WAAY6D,QAAS,WAAM,OAAAZ,IAAA,IACvFC,EAAAC,cAAA,SAAA,CAAQzO,KAAK,SAASmP,QAAS,SAACpN,GAAM,OApbxB,SAACA,GACrBA,EAAEuO,iBACF3E,IACF,CAib8C4E,CAAcxO,EAAd,EAAkByO,SAAUpV,KAAe,GAA2BA,GAAcoT,EAAAC,cAAA,MAAA,CAAKS,IAAK9X,EAAYkU,WAAYmF,MAAO,GAAIC,OAAQ,KAAS,UAEzLtK,OAAOC,KAAKzJ,IAAe8F,OAAS,GAAK8L,EAAAC,cAAA,MAAA,CAAKK,UAAU,SACtDlS,GAAcgI,IAAI,SAAC+L,GAAa,OAC/BnC,EAAAC,cAAA,MAAA,CAAKK,UAAU,OAAO8B,IAAKD,EAAKzC,MAC9BM,EAAAC,cAAA,MAAA,CAAKK,UAAU,YAAY6B,EAAKzC,MAChCM,EAAAC,cAAA,MAAA,CAAKK,UAAU,SAASI,IAAK5X,EAASgU,WAAY6D,QAAS,WAAM,OA3DzDjB,EA2DoEyC,EAAKzC,KA1DrFlD,EAAWpO,GAAcmR,OAAO,SAAC8C,GAAY,OAAAA,EAAI3C,OAASA,CAAb,QACnDrR,GAAiBmO,GAFA,IAACkD,EACZlD,CA0DqE,IAHpC,IAOjCjO,IAAcjC,IAAcY,IAAY8S,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBACvDN,EAAAC,cAAA,KAAA,KAAA,iCACAD,EAAAC,cAAA,IAAA,gBA3pCU,mBACD,GA0pCqD,gBAC9DD,EAAAC,cAAA,IAAA,yBAAqBzP,IAAkBA,GAAe4F,IAAI,SAACoD,EAAa8I,GAAU,OAAC,CAAC,MAAM,OAAOjG,KAAK,SAAAoD,GAAO,OAAAA,IAAQjG,CAAR,KAA4B,IAAV8I,EAAc9I,EAAO,KAAAzB,OAAKyB,GAAvE,KAElF/M,IAAeS,IAAY8S,EAAAC,cAAA,MAAA,CAAKK,UAAU,SAAQN,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBAAgBI,IAAK9X,EAAYkU,WAAYmF,MAAO,GAAIC,OAAQ,MACjInV,IAAeG,IAAY8S,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBAC1CN,EAAAC,cAAA,KAAA,KAAA,0BACAD,EAAAC,cAAA,OAAA,sFAAoFD,EAAAC,cAAA,KAAA,MAA8C,qCAClID,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAQ3T,IAAe,GAAQyI,IAAY,kBAE5DjK,GAAUG,IAAiBqU,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBAC1CN,EAAAC,cAAA,KAAA,KAAA,uBACAD,EAAAC,cAAA,OAAA,KAAOtU,IACPqU,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAQlL,IAAa,EAAG6K,UAAU,WAAS,uBAC5DN,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAQlV,IAAU,GAAQG,GAAiB,MAAO8R,IAAoB,GAAC,iCAExF1O,IAAkB9B,IAAY8S,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBAC7CN,EAAAC,cAAA,KAAA,KAAA,sBACAD,EAAAC,cAAA,OAAA,KAAA,mDACAD,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAQ1R,IAAkB,EAAO,GAAC,UACnD+Q,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAQ1R,IAAkB,GAjhBzB,yGAAOsT,qBAAA,IAAAA,IAAAA,EAAA,sDAEZ,6BAAA,CAAA,EAAMzK,EAAI0F,KACzB,wCAAAzF,OAAwCpE,aAAaC,QAAQ,kBAAiB,UAC9E,CAAE2O,SAAUA,YAGd,OALiBhY,EAAAmN,QAUjBjC,aAJEyC,QAAQC,IAAI,6BACZ,CAAA,EAAO,gCAIOD,QAAQC,IAAI,8BAA+BqK,+BAogBJC,CAAkB,YAAahN,IAAY,EAAG6K,UAAU,WAAS,aAEnH7Q,IAAcvC,KAAaZ,IAAcsD,KAAgBoR,KAA4BhB,EAAAC,cAAA,MAAA,CAAKK,UAAU,gBACrGN,EAAAC,cAAA,KAAA,KAAA,kBACAD,EAAAC,cAAA,OAAA,CAAMyC,wBAAyB,CAAEC,OAAQC,EAAYhT,GAAYiT,mBAAoB,CAAEjB,OAAQ,WAAY9C,WAAW,WAAY,cAChI9T,GAAcgV,EAAAC,cAAA,SAAA,CAAQU,QAAS,WAAM,OAAAxT,IAAY,EAAZ,GAAkB,gBAG7D6S,EAAAC,cAACxW,EAAI,CAACkX,QAAS,WAAM,OA3IpB5T,KACD0I,KACAzI,IAAe,IAEjBvB,IAAWD,QACX2B,IAAaD,GAsIU,EAAcoT,UAAW,iBAAUpT,GAAW,OAAS,GAAE,KAAA6K,OAAI/M,EAAW,aAAa,KACxGgV,EAAAC,cAAA,MAAA,CAAKS,IAAKhY,EAAQoU,WAAYwD,UAAU,iBACxCN,EAAAC,cAAA,MAAA,CAAKS,IAAK/X,EAAamU,WAAYwD,UAAU,eAC5ChR,IAAgB0Q,EAAAC,cAAA,QAAA,CAAOK,UAAU,iBAK1C"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/TwilioChat/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, FormEvent, useContext } from 'react';\nimport { io, Socket } from 'socket.io-client';\nimport FormData from 'form-data';\nimport styled from 'styled-components';\nimport GlobalContext from '../context/GlobalContext';\nimport linkifyHtml from 'linkify-html';\nimport Chat from './Chat';\nimport { Col, Row } from 'react-bootstrap';\nimport moment from 'moment';\nimport { toastrMsg } from '../utils/alert';\nimport { v4 as uuidv4 } from 'uuid';\nimport NoticationBar from '../NotificationBar';\nimport { isStagingOrDevelopment } from '../utils/helperFn';\nimport { useTime } from 'react-timer-hook';\nimport API, { setConfig } from '../api/api';\nimport axios from 'axios';\nimport { useDropzone } from 'react-dropzone';\nimport '../assets/styles/fonts.css';\nimport '../assets/styles/app.scss'\n\nconst icoYouFibre = new URL(\"./assets/images/svg/favicon.svg\", import.meta.url);\nconst icoChat = new URL(\"./assets/images/svg/chat.svg\", import.meta.url);\nconst icoCloseChat = new URL(\"./assets/images/png/ico-close.png\", import.meta.url);\nconst loadingIcon = new URL(\"./assets/images/gif/loader-transparent.gif\", import.meta.url);\nconst icoUpload = new URL(\"./assets/images/svg/youfibre-upload.svg\", import.meta.url);\nconst icoClose = new URL(\"./assets/images/svg/close.svg\", import.meta.url);\nconst notificationSound = new URL(\"./assets/audio/notification.wav\", import.meta.url);\n\ninterface Message {\n createdAt: string;\n from?: string | null;\n files?: string | null;\n message: string | null;\n form: FormType | null;\n messageId: string;\n fromId: string;\n senderType: string;\n}\ninterface FormType {\n type: string;\n value: Array<{ title: string; action: string; placeholder?: string | null; type?: string; required?: boolean; options?:object }>;\n}\n\ntype UserType = 'NEW_CUSTOMER' | 'ACCOUNT_HOLDER' | 'NOT_ACCOUNT_HOLDER';\n\nconst Container = styled.div`\n width: 100%;\n max-width: 700px;\n height: 100%;\n position: relative;\n margin: 0px auto;\n display: flex;\n flex-direction: row;\n align-items: center;\n \n &.direction-column-reverse { flex-direction: column-reverse; }\n &.content-end { justify-content: end; }\n\n`;\n\nconst OverflowContainer = styled(Container)`\n overflow-y: auto;\n`\n\nconst Widget = styled.div`\n position: fixed;\n bottom: 40px;\n right: 40px;\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: end;\n gap: 15px;\n`;\n\nconst Icon = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: #08DE9E;\n width: 50px;\n height: 50px;\n border-radius: 100px;\n cursor: pointer;\n -webkit-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -moz-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -webkit-user-select: none;\n user-select: none; \n img {\n position: absolute;\n -moz-transition: all 0.3s ease;\n transition: all 0.3s ease;\n\t\t&.icon-hover {\n width: 15px;\n height: 15px;\n\t\t\ttransform: rotate(180deg) scale(.5);\n\t\t\topacity: 0;\n\t\t}\n\t\t&.icon-default {\n width: 20px;\n height: 20px;\n\t\t\ttransform: rotate(0deg) scale(1);\n\t\t\topacity: 1;\n\t\t}\n }\n &:hover {\n -webkit-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n -moz-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n }\n &.open {\n\t\t.icon-hover {\n\t\t\ttransform: rotate(0deg) scale(1);\n\t\t\topacity: 1;\n\t\t}\n\t\t.icon-default {\n\t\t\ttransform: rotate(180deg) scale(.5);\n\t\t\topacity: 0;\n\t\t}\n }\n &.fullscreen {\n display: none;\n }\n\n .unread {\n background-color: red;\n padding: 3px;\n display: flex;\n width: 20px;\n height: 20px;\n aspect-ratio: 1 / 1;\n border-radius: 200px;\n color: #ffffff;\n position: absolute;\n top: -4px;\n right: -2px;\n font-size: 11px !important;\n line-height: 0.5rem !important;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n -webkit-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n -moz-box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n box-shadow: 2px 1px 8px 0px rgba(0, 0, 0, 0.27);\n animation: pulseAnimation 1.5s infinite;\n @keyframes pulseAnimation {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n }\n }\n`;\n\nconst ChatWrapper = styled.div`\n display: flex;\n flex-direction: column;\n background-color: #ffffff;\n width: 350px;\n height: 550px;\n border-radius: 5px;\n -webkit-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n -moz-box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n box-shadow: 2px 1px 12px 0px rgba(0, 0, 0, 0.35);\n max-width: 0px;\n max-height: 0px;\n overflow: hidden;\n transition: max-height 0.5s ease-in-out;\n &.show {\n max-width: 350px;\n max-height: 540px;\n }\n .cover {\n background: rgba(255, 255, 255, 0.2);\n position: absolute;\n z-index: 92;\n padding: 14px;\n width: calc(100% - 28px);\n height: calc(100% - 93px);\n border-radius: 5px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n user-select: none;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n &.closed {\n background: rgba(255, 255, 255, 0.9);\n button { margin-top: 2rem; }\n }\n &.upload {\n background: rgba(9, 222, 158, 0.9);\n button { margin-top: 2rem; }\n }\n animation: showCover .4s cubic-bezier(0.41, 0.39, 0.53, 1.38) forwards;\n \n @keyframes showCover {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n }\n .files {\n margin: 0.5rem;\n border-radius: 5px;\n background-color: #c1f7e7;\n padding: 0rem;\n overlay: none;\n display: flex; \n flex-direction: column;\n justify-content: center;\n gap: 0rem;\n .file {\n display: flex;\n flex-direction: row;\n border-radius: 3px;\n justify-content: space-between;\n align-items: center;\n margin: 0.2rem;\n padding: 0.2rem 0.5rem;\n gap: 14px;\n &:hover {\n background-color: #ffffff;\n }\n .fileName {\n font-size: 11px !important;\n line-height: 12px;\n word-break: keep-all;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .action {\n width: 12px;\n height: 12px;\n opacity: 0.7;\n cursor: pointer;\n &:hover {\n opacity: 1;\n }\n }\n\n }\n }\n &.fullscreen {\n max-width: 100% !important;\n max-height: 100% !important;\n position: fixed;\n left: 0px;\n top: 0px;\n width: 100%;\n height: 100%;\n border-radius: 0px;\n // @media (max-width: 768px) {\n // #listOfMessages {\n // max-height: calc(100vh - 210px);\n // }\n // .chat-content-container {\n // padding-bottom: 4rem;\n // }\n // }\n .cover {\n &.closed {\n height: 100%;\n }\n }\n }\n @media (max-width: 576px) {\n position: fixed;\n z-index: 100;\n bottom: 0px;\n right: 0px;\n width: 100%;\n height: 100%;\n border-radius: 0px;\n &.show {\n max-width: 100%;\n max-height: 100%;\n }\n .cover {\n &.closed, &.upload {\n height: 100%;\n }\n }\n }\n`;\n\nconst ChatHeader = styled.div`\n background-color: #08DE9E;\n width: calc(100% - 30px);\n padding: 15px;\n color: #ffffff;\n flex: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 15px;\n -webkit-box-shadow: -2px 2px 5px 1px rgba(0,0,0,0.2);\n box-shadow: -2px 2px 5px 1px rgba(0,0,0,0.2);\n z-index: 91;\n img {\n width: 30px;\n height: 30px;\n -object-fit: fill;\n object-fit: fill;\n padding: 7px;\n border-radius: 200px;\n cursor: pointer;\n background-color: #FFFFFF;\n &.close {\n display: none;\n background-color: transparent;\n }\n }\n button {\n font-size: 0.9rem;\n }\n a {\n &:hover {\n text-decoration: none !important;\n cursor: pointer;\n }\n }\n span {\n padding: 0px;\n }\n @media (max-width: 576px) {\n img {\n &.close {\n display: block;\n }\n }\n }\n`;\n\nconst ChatContent = styled.div`\n width: 100%;\n padding: 0;\n color: #000000;\n flex: 1;\n display: flex;\n flex-direction: column-reverse;\n overflow-x: hidden;\n .chat-content-container {\n padding-bottom: 1.8rem;\n }\n button {\n display: block;\n background-color: #c1f7e7;\n flex: 0;\n padding: 5px;\n border-radius: 5px;\n color: #263238;\n font-weight: 100;\n font-size: 1rem;\n line-height: 18px;\n font-weight: 100;\n min-width: 40%;\n border: 2px solid #08DE9E;\n cursor: pointer;\n &:hover {\n background-color: #08DE9E;\n }\n }\n @media (max-width: 768px) {\n overflow-y: hidden;\n .chat-content-container {\n overflow-y: auto;\n // padding-bottom: 0;\n }\n }\n`;\n\nconst ChatInput = styled.form`\n background-color: #f4f7f9;\n width: calc(100% - 10px);\n flex: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n padding: 5px;\n .action {\n width: 1.3rem;\n height: 1.3rem;\n cursor: pointer;\n opacity: 0.7;\n -webkit-user-select: none;\n user-select: none;\n &:hover {\n opacity: 0.7;\n }\n }\n input {\n background-color: rgba(0,0,0,0);\n border: none;\n border-bottom: 1px solid rgba(0,0,0,0);\n outline: 0px;\n padding: 0px;\n margin-left: 15px;\n font-size: 0.9rem;\n font-weight: 100;\n flex: 1;\n &.invalid {\n border-bottom: 1px solid red;\n }\n }\n button {\n min-width: 90px;\n background-color: #09de9e;\n flex: 0;\n font-size: 0.9rem;\n &:hover {\n background-color: #08c98f;\n }\n &:disabled, &:disabled:hover {\n background-color: rgba(0,0,0,0.05);\n color: #aabbcc !important;\n }\n }\n`;\n\nconst Agent = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n small {\n position: absolute;\n margin-top: -1.6rem;\n margin-right: 14px;\n font-size: 11px !important;\n font-weight: 100;\n line-height: 12px;\n color: #015e9c;\n background-color: #ddf0fc;\n border: 1px solid #ffffff;\n border-radius: 100px;\n padding: 5px 15px;\n z-index: 50;\n }\n`;\n\ninterface Props {\n host: string;\n websocketUrl: string;\n postcodeSchemaId?: string;\n source?: string;\n fullscreen?: boolean;\n clientId:string;\n clientSecret:string;\n customToken?:string|undefined;\n}\n\nconst TwilioChat = ({ host, clientId, clientSecret, customToken, websocketUrl, postcodeSchemaId = \"6162c7da-a37d-4543-af2c-bdea7d49d6ca\", source = \"youfibre\", fullscreen = false}: Props) => {\n const gContext: any = useContext(GlobalContext);\n const outageFormMessage = useRef<string | null>(null);\n const [outage, setOutage] = useState<boolean>(false);\n const [outageMessage, setOutageMessage] = useState<string | null>(null);\n const [logged, setLogged] = useState<boolean>(false);\n const [token, setToken] = useState<string | null>(null);\n const [chatConversationId, setChatConversationId] = useState<string | null>(null);\n const [chatCaseId, setChatCaseId] = useState<string | null>(null);\n const [chatLoading, setChatLoading] = useState<boolean>(false);\n const [chatSending, setChatSending] = useState<boolean>(false);\n const [chatClosing, setChatClosing] = useState<boolean>(false);\n const [openChat, setOpenChat] = useState<boolean>(fullscreen);\n const [chatForm, setChatForm] = useState<{ [key: string]: any }>({});\n const [message, setMessage] = useState<string>('');\n const [chatUserId, setChatUserId] = useState<string | null>(null);\n const [chatUserType, setChatUserType] = useState<UserType | null>(null);\n const [chatUsername, setChatUsername] = useState<string | null>(null);\n const [uploadedFiles, setUploadedFiles] = useState<any>([]);\n const [uploadArea, setUploadArea] = useState<boolean>(false);\n const [resetFormValues, setResetFormValues] = useState<boolean>(false);\n const [chatSessionId, setChatSessionId] = useState<string | null>(null);\n const [confirmClosing, setConfirmClosing] = useState<boolean>(false);\n\n const [twilioChatUrlParams, setTwilioChatUrlParams] = useState<any>(null);\n\n const [chatUnreaded, setChatUnreaded] = useState<boolean>(false);\n\n const [chatActive, setChatActive] = useState<boolean>(true);\n const [appMessages, setAppMessages] = useState<any>(null);\n\n const [animateTabTitle, setAnimateTabTitle] = useState<boolean>(false);\n const [titleIndex, setTitleIndex] = useState(-1);\n \n const titleRef = useRef<string>(\"\");\n let timer = useRef<number>(0);\n const intervalRef = useRef<number | null>(null);\n\n let openChatRef = useRef<boolean>(openChat);\n let visibilityChange = useRef<boolean>(true);\n\n const fileCount = 5;\n const fileSize = 10; // MB\n const fileExtensions = ['jpg', 'jpeg', 'png', 'pdf', 'gif', 'txt', 'mp4', 'mp3'];\n\n const { seconds: londonSec } = useTime({ interval: 1 });\n \n let [agentTyping, setAgentTyping] = useState<boolean>(false);\n let agentIdRef = useRef<string|null>(null);\n\n const defaultMessages:Message[] = [\n {\n createdAt: moment(new Date()).format(),\n message: null,\n fromId: \"Client\",\n senderType: \"CUSTOMER\",\n form: {\n type: \"buttons\",\n value: [\n {\n title: \"I am the account holder\",\n action: \"old_customer\"\n },\n {\n title: \"I am not the account holder\",\n action: \"not_customer\"\n },\n {\n title: \"I am new here\",\n action: \"new_customer\"\n },\n ]\n },\n messageId: \"1\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"Welcome to YouFibre!<br />We're going to ask you some questions to ensure we get you through to the right team, so please bear with us!<br />Are you the account holder?\",\n form: null,\n messageId: \"0\"\n }\n ];\n\n const categories = {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n INSTALLS_AND_SERVICE_VISITS: \"Installs & Service Visits\",\n MANAGE_MY_ACCOUNT: \"Manage My Account\",\n BILLING: \"Billing\",\n CANCELLATION: \"Cancellation\",\n COMPLAINT: \"Complaint\",\n };\n\n const userTypeLabels = {\n NEW_CUSTOMER: \"New customer\",\n ACCOUNT_HOLDER: \"Account holder\",\n NOT_ACCOUNT_HOLDER: \"Not the account holder\"\n };\n\n const [messages, setMessages] = useState<Message[]>(defaultMessages);\n const [newMessages, setNewMessages] = useState<Message[]|null>(null);\n const messagesRef = useRef<Message[]>(messages);\n const chatBoxRef = useRef<HTMLDivElement | null>(null);\n const sc = useRef<Socket | null>(null);\n\n const scrollToBottom = () => {\n try {\n if (chatBoxRef.current) {\n chatBoxRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n } catch(e){ }\n };\n\n useEffect(() => {\n if (typeof document !== \"undefined\" && typeof window !== 'undefined'){\n if(animateTabTitle && titleIndex !== -1) {\n if(!localStorage.getItem(\"title\")) localStorage.setItem(\"title\", (typeof document !== \"undefined\" && document.getElementsByTagName('title')[0].textContent) || \"\");\n const updateTitle = () => {\n const title = titleRef.current;\n if (title) {\n const nextIndex = (titleIndex + 1) % title.length;\n document.title = title.slice(nextIndex) + \" \" + title.slice(0, nextIndex);\n setTitleIndex(nextIndex);\n }\n };\n intervalRef.current = window.setInterval(updateTitle, 200); // Change the title every 200ms\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current); // Cleanup on unmount\n }\n };\n } else {\n intervalRef.current = null;\n titleRef.current = \"\";\n }\n }\n }, [titleIndex]);\n\n useEffect(() => {\n setConfig(host, clientId, clientSecret, customToken);\n axios.get(`https://strapi.youfibre.com/api/information`)\n .then((response:any) =>{\n gContext.setAppMessages(response.data); \n })\n .catch((error:any) => {\n gContext.setAppMessages(null);\n });\n\n getUrlParams();\n \n let lastUrl = typeof window !== 'undefined' ? window.location.href : '';\n\n const observer = new MutationObserver(() => {\n if (typeof window !== 'undefined' && lastUrl !== window.location.href) {\n lastUrl = window.location.href;\n getUrlParams();\n }\n });\n\n typeof document !== 'undefined' && observer.observe(document.body, { childList: true, subtree: true });\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n // Get Settings from Strapi\n setAppMessages(gContext.appMessages);\n // Chech if current time isn't in time range\n setChatActive(!isTimeInRange());\n }, [gContext.appMessages]);\n\n useEffect(() => {\n // Live check if chat should be active\n setChatActive(!isTimeInRange());\n }, [londonSec]);\n\n useEffect(() => {\n // If we are on the second step - Login form\n !chatActive && !chatCaseId && resetChat();\n }, [chatActive]);\n\n const nowInLondon = new Date().toLocaleString(\"en-GB\", {\n timeZone: \"Europe/London\",\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n });\n\n const timeToSeconds = (timeStr) => {\n if(timeStr) {\n const [hours, minutes, seconds] = timeStr.split(':').map(Number);\n return hours * 3600 + minutes * 60 + seconds;\n }\n }\n\n const isTimeInRange = () => {\n if(gContext.appMessages?.chat_off_mode_toggle && nowInLondon && gContext.appMessages?.chat_off_mode_start && gContext.appMessages?.chat_off_mode_end) {\n const current = timeToSeconds(nowInLondon);\n const start = timeToSeconds(gContext.appMessages?.chat_off_mode_start);\n const end = timeToSeconds(gContext.appMessages?.chat_off_mode_end);\n if (start < end) {\n // Normal range (e.g., 08:00 to 20:00)\n return current >= start && current < end;\n } else {\n // Overnight range (e.g., 20:00 to 08:00)\n return current >= start || current < end;\n }\n } else {\n return false;\n }\n }\n\n const getUrlParams = () => {\n if (typeof window !== 'undefined') {\n setTwilioChatUrlParams(new URLSearchParams(window.location.search));\n }\n }; \n\n useEffect(() => {\n if(twilioChatUrlParams?.get(\"youFibreChat\") === ''){\n // Use params from URL, and init chat with messages from back-end (not from localstorage)\n const fetchData = async () => {\n await new Promise<void>((resolve) => {\n localStorage.setItem('chatUsername', twilioChatUrlParams.get(\"chatUsername\"));\n localStorage.setItem('chatUserId', twilioChatUrlParams.get(\"chatUserId\"));\n localStorage.setItem('chatSessionId', twilioChatUrlParams.get(\"chatSessionId\"));\n localStorage.setItem('conversationId', twilioChatUrlParams.get(\"conversationId\"));\n localStorage.setItem('caseId', twilioChatUrlParams.get(\"caseId\"));\n localStorage.setItem('participantId', twilioChatUrlParams.get(\"participantId\"));\n setChatUserId(twilioChatUrlParams.get(\"participantId\"));\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat || null,\n chatUsername: twilioChatUrlParams.get(\"chatUsername\") || null,\n chatSessionId: twilioChatUrlParams.get(\"chatSessionId\") || null,\n chatUserId: twilioChatUrlParams.get(\"chatUserId\") || null,\n conversationId: twilioChatUrlParams.get(\"conversationId\") || null,\n caseId: twilioChatUrlParams.get(\"caseId\") || null,\n participantId: twilioChatUrlParams.get(\"participantId\") || null,\n }\n });\n resolve();\n });\n init();\n };\n fetchData();\n } else if (twilioChatUrlParams && Object.keys(twilioChatUrlParams).length === 0){\n // Call existing chat\n init();\n } else {\n }\n },[twilioChatUrlParams]);\n \n const init = () => { \n const getData = async () => {\n if(localStorage.getItem('conversationId')){ \n try {\n const response = await API.get(`ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}`);\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't check conversation!\");\n return null;\n }\n if(response?.data?.properties?.Status === \"CLOSED\") resetChat();\n else {\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat || null,\n chatUsername: localStorage.getItem('chatUsername') || null,\n chatSessionId: localStorage.getItem('chatSessionId') || null,\n chatUserId: localStorage.getItem('participantId') || null,\n conversationId: localStorage.getItem('conversationId') || null,\n caseId: localStorage.getItem('caseId') || null,\n participantId: localStorage.getItem('participantId') || null,\n }\n });\n }\n setChatLoading(false);\n } catch (error) { console.log('Error fetching conversation status: ', error); }\n }\n };\n getData();\n\n localStorage.removeItem(\"title\");\n setChatConversationId(localStorage.getItem('conversationId') || null);\n setChatCaseId(localStorage.getItem('caseId') || null);\n setChatUserId(localStorage.getItem('participantId') || null);\n agentIdRef.current = localStorage.getItem('agentId') || null;\n setChatSessionId(localStorage.getItem('chatSessionId') || null);\n\n localStorage.getItem('conversationId') && localStorage.getItem('participantId') && setLogged(true);\n localStorage.getItem('chatUsername') && setChatUsername(localStorage.getItem('chatUsername'));\n localStorage.getItem('chatUserType') && setChatUserType(localStorage.getItem('chatUserType') as UserType || 'NEW_CUSTOMER');\n\n setChatForm({\n full_name: localStorage.getItem('chatUsername'),\n email: localStorage.getItem('chatEmail'),\n category: localStorage.getItem('chatCategory'),\n address: localStorage.getItem('chatAddress'),\n last_bill: localStorage.getItem('chatLastBill'),\n });\n localStorage.getItem('chatMessages') ? \n setMessages(JSON.parse(localStorage.getItem('chatMessages') || '')) : \n localStorage.setItem('chatMessages', JSON.stringify(messages));\n\n localStorage.getItem('conversationId') && getAllMessages(localStorage.getItem('conversationId'), \"onLoad\");\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n // console.log('Tab is active');\n visibilityChange.current = true;\n if(typeof document !== \"undefined\" && openChatRef.current && localStorage.getItem(\"title\")){\n setAnimateTabTitle(false);\n setTitleIndex(-1);\n setChatUnreaded(false);\n document.title = localStorage.getItem(\"title\") || \"\";\n document.getElementById('inputMessage')?.focus();\n setTimeout(() => localStorage.removeItem(\"title\"), 1000);\n }\n localStorage.getItem('conversationId') && getAllMessages(localStorage.getItem('conversationId'), \"visibilitychange\");\n } else {\n // console.log('Tab is in the background');\n visibilityChange.current = false;\n }\n });\n };\n \n const getAllMessages = async (convID:string|null, location:string) => {\n try{\n if(convID){\n const response:any = await API.get(`NotificationModule/v2.0/records/Conversation/${convID}/links?targetEntities=[\"Message\"]`);\n if(response){\n let tmpMessages:Message[] = await Promise.all(\n response?.Message?.dbRecords.map(async item => ({\n createdAt: item?.createdAt,\n from: item?.properties?.From,\n files: await getFiles(item?.properties?.Files), \n message: item?.properties?.Body,\n form: null,\n messageId: item?.id,\n fromId: item?.createdBy?.id,\n senderType: item.type === \"EVENT\" ? \"EVENT\" : item.properties.SenderType\n }))\n ); \n if(!openChatRef.current && Object.keys(tmpMessages).length > 0){\n setChatUnreaded(true); \n }\n // Sort messages by createdAt (string)\n tmpMessages = tmpMessages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n setMessages(tmpMessages); \n localStorage.setItem('allMessages', JSON.stringify(tmpMessages)); \n }\n } else \n setMessages(defaultMessages); \n } catch (error) {\n console.log('Error fetching messages:', error);\n }\n };\n\n useEffect(() => {\n if (typeof document !== \"undefined\") {\n if (fullscreen) {\n document.body.style.overflow = 'hidden';\n document.documentElement.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n document.documentElement.style.overflow = '';\n }\n }\n }, [fullscreen])\n\n const connectToWebsocket = (sessionId:string|null = null) => {\n return io(`${websocketUrl}/ChatWebsocketModule/TwilioChatWebsocket/v1.0`, \n { \n path: '/ws',\n query: {\n clientId: sessionId \n },\n reconnection: true,\n reconnectionAttempts: Infinity, // Retry indefinitely\n reconnectionDelay: 1000, // Start with a 1-second delay\n reconnectionDelayMax: 5000, // Cap the delay at 5 seconds\n timeout: 10000, // Timeout after 10 seconds\n }); \n };\n\n useEffect(() => { \n if(chatUserId){\n const tmpUUID = chatSessionId || uuidv4();\n setChatSessionId(tmpUUID);\n localStorage.setItem('chatSessionId', tmpUUID);\n \n if(!sc.current) sc.current = connectToWebsocket(tmpUUID);\n\n sc.current?.on('connect', () => {\n console.log('Connected to WebSocket server');\n });\n\n sc.current?.on(\"connect_error\", (err) => {\n console.log(`Connect error due to ${err.message}`);\n sc.current = null;\n }); \n\n sc.current?.on(\"disconnect\", (reason) => {\n console.log(`Disconnected: ${reason}`);\n sc.current = null;\n });\n\n }\n }, [chatUserId]);\n\n useEffect(() => { \n const fetchData = async () => {\n // // Don't delete this code\n // sc.current && sc.current?.onAny((eventName, ...args) => {\n // console.log(\"All events:\", eventName, args);\n // });\n\n if(sc.current && chatCaseId){\n\n sc.current.emit(\"joinRoom\", chatCaseId);\n\n !sc.current.listeners(`case-event-${chatCaseId}`).length && sc.current?.on(`case-event-${chatCaseId}`, (data) => { \n // console.log(`case-event-${chatCaseId}`, data);\n if(data.caseId === localStorage.getItem('caseId')){ \n switch(data.type){\n case \"CASE_UPDATED\": \n agentIdRef.current = data.data.properties.OwnerId; \n localStorage.setItem('agentId', agentIdRef.current || \"\"); break;\n case \"CONVERSATION_CLOSED\": setChatClosing(true); break;\n case \"MESSAGE_CREATED\": receiveMessage(data.data); break;\n default: break;\n }\n }\n });\n \n !sc.current.listeners(`web-chat-input-${chatCaseId}`).length && sc.current?.on(`web-chat-input-${chatCaseId}`, async (data) => {\n // console.log(`web-chat-input-${chatCaseId}`, data);\n if(data.caseId === chatCaseId && data.sender === \"AGENT\"){\n setAgentTyping(true);\n }\n });\n }\n }; \n fetchData();\n }, [chatCaseId]);\n\n\n let typingTimeout:any;\n\n useEffect(() => { \n const fetchData = async () => {\n try {\n typingTimeout = agentTyping ? setTimeout(() => {\n setAgentTyping(false);\n clearTimeout(typingTimeout);\n }, 1500) : false; \n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [agentTyping]);\n\n useEffect(() => {\n messagesRef.current = messages; \n }, [messages]);\n\n useEffect(() => { \n const fetchData = async () => {\n try {\n if(messages.length && chatCaseId){\n sc.current && sc.current?.emit(`web-chat-input`, {\n caseId: chatCaseId,\n conversationId: chatConversationId,\n message: message,\n sender: 'CUSTOMER'\n });\n } \n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [message]);\n\n const getFiles = async (files: String[] | null = null) => {\n try{\n let tmpFiles:any = [];\n if(files){\n const response:any = await API.get(`SchemaModule/v1.0/db/File/many?ids=${files}`);\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't close conversation!\");\n } else {\n if(Object.keys(response).length){\n response.map((item) => {\n tmpFiles = [...tmpFiles, {\n id: item?.id || \"\",\n type: item?.properties?.Mimetype || \"\",\n url: item?.properties?.Url || \"\"\n }];\n });\n }\n return (Object.keys(tmpFiles).length !== 0) ? tmpFiles : [];\n }\n } else {\n return [];\n }\n } catch (error) {\n console.log('Error fetching files:', error);\n return [];\n }\n };\n \n const receiveMessage = async (data:any) => { \n if(data && !messagesRef.current.some(obj => obj.messageId === data.id)){\n try{\n data?.Conversation?.dbRecords[0]?.properties?.Status === \"CLOSED\" && setChatClosing(true);\n let tmpFiles:any = [];\n if(data.properties.Files){\n tmpFiles = await getFiles(data.properties.Files);\n if(Object.keys(tmpFiles).length === 0) tmpFiles = null;\n updateMessages(data, tmpFiles);\n } else {\n updateMessages(data, tmpFiles);\n }\n } catch (error) {\n console.log('Error fetching message:', error);\n }\n }\n };\n\n const updateMessages = (data: any, files:any) => {\n let tmpMessage:Message = {\n senderType: data.type !== 'EVENT' ? data.properties.SenderType : data.type,\n createdAt: moment(new Date()).format(),\n from: data.type !== 'EVENT' ? data.properties.From : data.type,\n message: data.type !== 'EVENT' ? data.properties.Body : data.title,\n form: null,\n files: files,\n messageId: data.id,\n fromId: data.type !== 'EVENT' ? data.createdBy.id : \"YouFibre\"\n };\n if(!openChatRef.current || !visibilityChange.current){\n setChatUnreaded(true); \n }\n setNewMessages([...(newMessages || []), tmpMessage]);\n \n setTimeout(() => {\n setNewMessages(null);\n setMessages([tmpMessage, ...messagesRef.current]);\n localStorage.setItem('chatMessages', JSON.stringify([tmpMessage, ...messagesRef.current]));\n setChatLoading(false);\n scrollToBottom();\n }, 400);\n };\n\n useEffect(() => {\n if(typeof document !== 'undefined'){\n if(!localStorage.getItem(\"title\")) localStorage.setItem(\"title\", (typeof document !== \"undefined\" && document.getElementsByTagName('title')[0].textContent) || \"\");\n if(chatUnreaded) {\n let sound = new Audio(notificationSound.toString());\n sound.setAttribute('crossorigin', 'anonymous'); \n sound.play().catch((error) => {\n console.log(\"User interaction required before playing sound\");\n });\n document.title = \"New message | YouFibre\";\n }\n else {\n document.title = localStorage.getItem(\"title\") || '';\n scrollToBottom();\n }\n } \n }, [chatUnreaded]);\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n if(typeof window !== 'undefined' && typeof document !== \"undefined\"){\n if(openChat){\n if(window.innerWidth < 577) document.body.style.overflow = \"hidden\";\n intervalRef.current && clearInterval(intervalRef.current);\n if(localStorage.getItem(\"title\")) document.title = localStorage.getItem(\"title\") || \"\";\n setAnimateTabTitle(false);\n setTitleIndex(-1);\n setChatUnreaded(false);\n document.getElementById('inputMessage')?.focus();\n setTimeout(() => localStorage.removeItem(\"title\"), 1000);\n } else {\n document.body.style.overflow = \"\";\n setConfirmClosing(false);\n setChatClosing(false);\n }\n }\n scrollToBottom();\n openChatRef.current = openChat;\n } catch (error) {\n console.log(\"Error fetching data:\", error);\n }\n }; \n fetchData();\n }, [openChat]);\n\n const validateInput = (data) => {\n // // Don't delete this code\n // if(data.length === 0) return true;\n // const regex = /^[a-zA-Z0-9\\s\\-,.!?()/@#&£€$=+*\"']+$/;\n // return regex.test(data);\n return true;\n };\n\n const resetChat = () => {\n if(sc.current && chatCaseId){\n sc.current.emit(\"leaveRoom\", chatCaseId);\n sc.current.removeAllListeners();\n }\n setChatConversationId(null);\n setChatCaseId(null);\n setUploadedFiles([]);\n setResetFormValues(!resetFormValues);\n setOutage(false);\n setOutageMessage(null);\n outageFormMessage.current = null;\n localStorage.removeItem('chatEmail');\n localStorage.removeItem('conversationId');\n localStorage.removeItem('caseId');\n localStorage.removeItem('participantId');\n localStorage.removeItem('chatUsername');\n localStorage.removeItem('twilio_token');\n localStorage.removeItem('chatMessages');\n localStorage.removeItem('chatUserType');\n localStorage.removeItem('chatCategory'); \n localStorage.removeItem('chatAddress'); \n localStorage.removeItem('chatLastBill');\n localStorage.removeItem('agentId');\n localStorage.removeItem('chatSessionId');\n setChatUsername(null);\n setChatUserType(null);\n setChatUserId(null);\n setChatForm({});\n setChatLoading(false);\n setLogged(true);\n setToken(null);\n agentIdRef.current = null;\n setMessage('');\n localStorage.setItem('chatMessages', JSON.stringify(defaultMessages));\n setNewMessages(null);\n setMessages(defaultMessages);\n scrollToBottom();\n fullscreen && setOpenChat(true);\n\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: null\n });\n };\n\n const getToken = async (tmpEmail) => {\n try {\n const data = await API.get(`ChatModule/v1.0/gateway/token?identity=${tmpEmail}&source=twilio`);\n return data || null;\n } catch (error) { console.log('Error fetching token:', error); }\n };\n\n const createConversation = async (\n tmpChatUsername:string|null,\n tmpChatEmail:string|null,\n tmpChatAddress:string|null,\n tmpChatLastBill:string|null,\n tmpChatUserType:string|null,\n tmpChatCategory:string|null\n ) => { \n try {\n const response = await API.post(`ChatModule/v1.0/gateway/conversation/create`, \n {\n source: \"twilio\",\n channel: \"WEB_CHAT\",\n identifier: tmpChatEmail || null,\n DpaCustomerName: tmpChatUsername || null,\n DpaCustomerEmail: tmpChatEmail || null,\n DpaCustomerAddress: tmpChatAddress || null,\n DpaCustomerLastBill: tmpChatLastBill || null,\n DpaCustomerType: tmpChatUserType || null,\n DpaCustomerCategory: tmpChatCategory || null\n });\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't create conversation!\");\n setChatActive(false);\n return null;\n }\n // Check if the statusCode matches\n return response ? response : null;\n } catch (error:any) {\n setChatActive(false);\n toastrMsg(error.message.replaceAll('OdinApiError:',''), \"error\");\n }\n };\n\n const closeConversation = async (closedBy:string = \"CUSTOMER\") => {\n try {\n const response = await API.post(\n `ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}/close`, \n { closedBy: closedBy }\n );\n // Check if the response is okay\n if (!response) {\n console.log(\"Can't close conversation!\");\n return null;\n }\n // Check if the statusCode matches\n resetChat();\n } catch (error) { console.log('Error closing conversation:', error); }\n };\n\n const sendMessage = async (btnMessage:string|null = null) => {\n if(message.length > 0 || btnMessage || Object.keys(uploadedFiles).length > 0) {\n typeof document !== \"undefined\" && document.getElementById('inputMessage')?.focus();\n let formData = new FormData();\n formData.append('conversationSid', localStorage.getItem('conversationId'));\n formData.append('message', message || btnMessage);\n formData.append('from', localStorage.getItem('chatUsername'));\n formData.append('sender', 'CUSTOMER');\n setMessage('');\n setChatSending(true);\n try{\n Object.keys(uploadedFiles).length > 0 && uploadedFiles.map(async (item: File) => {\n formData.append('files', item);\n }); \n } catch (e){\n\n }\n // Send a Message to the Conversation\n try {\n API.post(`ChatModule/v1.0/gateway/conversation/${localStorage.getItem('conversationId')}/message/send`, formData, {\n headers: {'Content-Type': 'multipart/form-data'}\n })\n .then(data => { \n if(data){\n setUploadedFiles([]);\n setLogged(true);\n setChatSending(false);\n setChatLoading(false);\n } \n else { \n setChatActive(!isTimeInRange());\n // if(data?.data?.statusCode === 500){\n resetChat();\n console.log(\"Conversation is closed\");\n }\n })\n .catch(error => {\n setChatActive(!isTimeInRange());\n console.log('Send a Message:', error);\n });\n } catch (error) {\n console.log(\"Error loading SVG:\", error);\n }\n }\n };\n\n const submitMessage = (e) => {\n e.preventDefault();\n sendMessage();\n };\n\n const submitForm = async () => { \n try {\n setChatLoading(true);\n // Indicating an outage\n const outageStatus = await API.get(`SupportModule/v1.0/Case/outage/verify?contactEmailAddress=${chatForm.email}`)\n .then(data => {\n setChatLoading(false);\n if(data?.data?.statusCode === 200 && data?.data?.data){ \n setOutage(true);\n setOutageMessage(data?.data?.message);\n return true;\n } else {\n startConversation();\n return false;\n }\n })\n .catch(error => {\n console.log('Outage Message:', error);\n });\n } catch (error) { console.log('Error fetching outage: ', error); }\n };\n\n const startConversation = async () => {\n // setMessages(messagesRef.current.slice(1, 0));\n setChatLoading(true);\n localStorage.setItem('chatUsername', chatForm.full_name);\n setChatUsername(chatForm.full_name);\n localStorage.setItem('chatEmail', chatForm.email);\n localStorage.setItem('chatCategory', chatForm.category); \n localStorage.setItem('chatAddress', chatForm.address); \n localStorage.setItem('chatLastBill', chatForm.last_bill);\n // Create Token\n const tmpToken = await getToken(chatForm.email);\n if(tmpToken){\n localStorage.setItem('twilio_token', tmpToken);\n setToken(tmpToken);\n // Create Conversation \n const tmpConversation = await createConversation(\n chatForm.full_name,\n chatForm.email,\n chatForm.address,\n chatForm.last_bill,\n chatUserType,\n chatForm.category \n );\n if(tmpConversation){\n setLogged(true);\n setChatUserId(tmpConversation?.participantId);\n localStorage.setItem('conversationId', tmpConversation?.conversationId);\n localStorage.setItem('caseId', tmpConversation?.caseId);\n localStorage.setItem('participantId', tmpConversation?.participantId);\n setChatCaseId(tmpConversation?.caseId);\n setChatConversationId(tmpConversation?.conversationId);\n gContext.goSetRegistrationData({\n ...gContext.goGetRegistrationData(),\n twilioChat: {\n ...gContext.goGetRegistrationData()?.twilioChat,\n chatUsername: chatForm.full_name,\n chatSessionId: chatSessionId,\n chatUserId: tmpConversation?.participantId,\n conversationId: tmpConversation?.conversationId,\n caseId: tmpConversation?.caseId,\n participantId: tmpConversation?.participantId,\n }\n });\n new Promise<void>((resolve) => {\n setMessages((prev) => {\n resolve();\n return [];\n });\n sendMessage(outageFormMessage.current); \n }).then(() => { \n updateMessages({type: 'EVENT', title: 'Waiting for the agent to join the chat.'}, null);\n });\n } else {\n setChatActive(!isTimeInRange());\n }\n } else {\n setChatLoading(false);\n }\n };\n \n const newAccountHolder = () => {\n setChatUserType('NEW_CUSTOMER');\n localStorage.setItem('chatUserType', 'NEW_CUSTOMER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am new here',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const notAccountHolder = () => {\n setChatUserType('NOT_ACCOUNT_HOLDER');\n localStorage.setItem('chatUserType', 'NOT_ACCOUNT_HOLDER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am not the account holder',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const yesAccountHolder = () => {\n setChatUserType('ACCOUNT_HOLDER');\n localStorage.setItem('chatUserType', 'ACCOUNT_HOLDER');\n let tmpMessages:Message[] = [\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: null,\n form: {\n type: \"form\",\n value: [\n {\n title: \"Name\",\n action: \"full_name\",\n placeholder: null,\n type: 'text',\n required: true\n },\n {\n title: \"Email\",\n action: \"email\",\n placeholder: null,\n type: 'email',\n required: true\n },\n {\n title: \"Enter your Postcode\",\n action: \"address\",\n placeholder: \"Example: SW1 4EN\",\n type: 'zip',\n required: true\n },\n {\n title: \"What was the total value of your last bill?\",\n action: \"last_bill\",\n placeholder: 'Total amount of your last bill',\n type: 'number',\n required: true\n },\n {\n title: \"What do you need help with today?\",\n action: \"category\",\n placeholder: null,\n type: 'select',\n required: true,\n options: {\n SALES: \"Sales\",\n TECH_SUPPORT: \"Tech Support\",\n INSTALLS_AND_SERVICE_VISITS: \"Installs & Service Visits\",\n MANAGE_MY_ACCOUNT: \"Manage My Account\",\n BILLING: \"Billing\",\n CANCELLATION: \"Cancellation\",\n COMPLAINT: \"Complaint\",\n },\n },\n {\n title: \"Submit\",\n action: \"submit_form\",\n type: 'button'\n }\n ]\n },\n messageId: \"3\"\n },\n {\n senderType: \"AGENT\",\n createdAt: moment(new Date()).format(),\n from: \"YouFibre\",\n fromId: \"YouFibre\",\n message: \"We're so happy to hear from you! So that we can provide the best possible support, please provide us with the following information.\",\n form: null,\n messageId: \"2\"\n },\n {\n senderType: \"CUSTOMER\",\n createdAt: moment(new Date()).format(),\n from: \"Client\",\n fromId: \"Client\",\n message: 'I am the account holder',\n form: null,\n messageId: \"1\"\n }, ...messages.slice(1)];\n setNewMessages([...(newMessages || []), tmpMessages[0]]);\n setTimeout(() => { setNewMessages(null); setMessages(tmpMessages);}, 400);\n // setMessages(tmpMessages);\n localStorage.setItem('chatMessages', JSON.stringify(tmpMessages)); \n };\n\n const chatToggle = () => {\n if(chatClosing){\n resetChat();\n setChatClosing(false);\n }\n setOutage(!outage);\n setOpenChat(!openChat);\n };\n \n const buttonAction = (action) => {\n if(chatActive || chatCaseId || isStagingOrDevelopment()){\n switch(action){\n case 'new_customer': newAccountHolder(); break;\n case 'not_customer': notAccountHolder(); break;\n case 'old_customer': yesAccountHolder(); break;\n case 'submit_form': \n if(chatForm.full_name && \n chatForm.address && chatForm.address !== '/' && chatForm.email && \n (((localStorage.getItem(\"chatUserType\") === \"ACCOUNT_HOLDER\") && \n typeof chatForm.last_bill !== \"undefined\") || (localStorage.getItem(\"chatUserType\") !== \"ACCOUNT_HOLDER\")) && chatForm.category && chatUserType){\n outageFormMessage.current = `<b>${userTypeLabels[chatUserType]}</b><br /><b>Full name</b>: ${chatForm.full_name}<br /><b>Email</b>: ${chatForm.email}<br /><b>Address</b>: ${chatForm.address}<br />${(typeof chatForm.last_bill !== 'undefined')?'<b>What was the total value of your last bill</b>: '+chatForm.last_bill+'<br />':''}<b>What do you need help with today</b>: ${categories[chatForm.category]}`;\n submitForm();\n }\n break;\n default: break;\n }\n } else {\n resetChat();\n }\n\n };\n\n const {getRootProps, getInputProps, open} = useDropzone({\n noClick: true,\n noKeyboard: true,\n onDrop: (acceptedFiles:any) => {\n if(chatCaseId){\n acceptedFiles = acceptedFiles.filter(item => item.size < (fileSize*1048576) ? item : toastrMsg(`Maximum file size is ${fileSize}MB`, \"error\"));\n acceptedFiles = acceptedFiles.filter(item => fileExtensions.some(ext => item.name.endsWith(ext)) ? item : toastrMsg(`Unsupported File extension`, \"error\"));\n acceptedFiles = acceptedFiles.filter(item => Object.keys(uploadedFiles.filter(ext => ext.name === item.name)).length === 0); \n Object.keys(uploadedFiles).length + Object.keys(acceptedFiles).length < fileCount+1 ? \n setUploadedFiles([...uploadedFiles, ...acceptedFiles]) : \n toastrMsg(`Maximum ${fileCount} files`, \"warning\");\n setUploadArea(false);\n }\n },\n });\n\n const deleteFile = (name:string) => {\n const tmpFiles = uploadedFiles.filter((itm:any) => itm.name !== name);\n setUploadedFiles(tmpFiles);\n };\n\n return (\n <>\n { (typeof process.env.GATSBY_TWILIO_CHAT_VERSION === 'undefined' || process.env.GATSBY_TWILIO_CHAT_VERSION === '1') && \n <Widget>\n <ChatWrapper\n className={`${openChat ? 'show' : ''} ${fullscreen?'fullscreen':''}`}\n {...getRootProps()}\n onDragOver={() => chatCaseId && setUploadArea(true)}\n onMouseLeave={() => setUploadArea(false)}\n >\n <ChatHeader>\n <Container className='flex-center-justified'>\n <Row className='p-0 m-0 flex-align-center'>\n <div className='flex-center-justified gap-5'>\n <img src={icoYouFibre.toString()} alt=''/>\n <span className='dark-color'>&nbsp;YouFibre</span>\n </div>\n </Row> \n <Row className='p-0 m-0 flex flex-align-center'>\n {!chatConversationId && Object.keys(messages).length > 2 && <button onClick={() => resetChat()} className='small'>Back</button>}\n {chatConversationId && <button onClick={() => setConfirmClosing(true)} className='small'>End conversation</button>}\n {!fullscreen && <img src={icoCloseChat.toString()} className='close' onClick={() => setOpenChat(!openChat)} alt='' />}\n </Row> \n </Container>\n </ChatHeader>\n <NoticationBar type=\"chat\" />\n <ChatContent>\n <Container className={`direction-column-reverse content-end chat-content-container`}>\n <div ref={chatBoxRef} />\n <Chat\n messages={messages}\n chatUsername={chatUsername}\n chatUserId={chatUserId}\n chatConversationId={chatConversationId}\n resetFormValues={resetFormValues}\n setChatForm={setChatForm}\n buttonAction={buttonAction}\n newMessages={newMessages}\n chatActive={chatActive}\n API={API}\n />\n </Container>\n </ChatContent> \n { agentTyping && openChat && <Agent><small>Agent is typing...</small></Agent> }\n { logged && !chatClosing && !messages[0]?.form && <ChatInput className={`${fullscreen?'form-fullscreen':''}`}><OverflowContainer>\n <input id=\"inputMessage\" className={!validateInput(message) ? 'invalid' : ''} autoComplete='off' maxLength={500} onChange={(e) => setMessage(e.target.value)} value={message} type=\"text\" placeholder=\"Write a reply...\" />\n <input {...getInputProps()} />\n <img className='action' alt='Add attachment' src={icoUpload.toString()} onClick={() => open()} />\n <button type='submit' onClick={(e) => submitMessage(e)} disabled={chatSending || !validateInput(message)}>{ chatSending ? <img src={loadingIcon.toString()} width={16} height={16} /> : 'Send'}</button>\n </OverflowContainer></ChatInput> }\n {Object.keys(uploadedFiles).length > 0 && <div className='files'>\n {uploadedFiles.map((file:any) => (\n <div className='file' key={file.name}>\n <div className='fileName'>{file.name}</div>\n <img className='action' src={icoClose.toString()} onClick={() => deleteFile(file.name)} alt='' />\n </div>\n ))}\n </div>}\n { uploadArea && chatCaseId && openChat && <div className='cover dark-color upload'>\n <h4 className='mb-10'>Drag and drop your files here</h4>\n <p className='mb-10'>Maximum {fileCount} files. Limit {fileSize}MB per file.</p>\n <p>Supported files: {fileExtensions && fileExtensions.map((item:string, index) => !['mp4','mp3'].some(ext => ext === item) && (index === 0 ? item : `, ${item}`))}</p>\n </div> }\n { chatLoading && openChat && <div className='cover'><img className=\"make-it-white\" src={loadingIcon.toString()} width={14} height={14} alt='' /></div> }\n { chatClosing && openChat && <div className='cover dark-color closed'>\n <h4 className='mb-10'>Conversation is closed</h4>\n <span className='mb-10'>This chat has now closed. If you need any help, feel free to start a new chat.<br />We're always happy to assist you!</span> \n <button onClick={() => { setChatClosing(false); resetChat();}}>Create new</button>\n </div> }\n { outage && outageMessage && <div className='cover dark-color closed'>\n <h4 className='mb-10'>Outage in your area</h4>\n <span className='mb-10'>{outageMessage}</span> \n <button onClick={() => { resetChat(); }} className='blue-bg' >Got It - Close Chat</button>\n <button onClick={() => { setOutage(false); setOutageMessage(null); startConversation();}}>Still Need Help - Start Chat</button>\n </div> }\n { confirmClosing && openChat && <div className='cover dark-color closed'>\n <h4 className='mb-10'>Close conversation</h4>\n <span className='mb-10'>Are you sure you want to end this conversation?</span> \n <button onClick={() => { setConfirmClosing(false);}}>Cancel</button>\n <button onClick={() => { setConfirmClosing(false); closeConversation(\"CUSTOMER\"); resetChat();}} className='blue-bg'>Confirm</button>\n </div> }\n { !chatActive && openChat && !chatCaseId && appMessages && !isStagingOrDevelopment() && <div className='cover dark-color closed'>\n <h4 className='mb-10'>Out of service</h4>\n <span className='mb-10' dangerouslySetInnerHTML={{ __html: linkifyHtml(appMessages.chat_off_mode_text, { target: \"_blank\" }).replaceAll(/\\r\\n|\\n/g, \"<br />\") }} />\n {!fullscreen && <button onClick={() => setOpenChat(false)}>Close chat</button>}\n </div> }\n </ChatWrapper>\n <Icon onClick={() => chatToggle()} className={`YFChat ${openChat ? 'open' : ''} ${fullscreen?'fullscreen':''}`}>\n <img src={icoChat.toString()} className='icon-default' alt='' />\n <img src={icoCloseChat.toString()} className='icon-hover' alt='' />\n {chatUnreaded && <small className='unread'>1</small>}\n </Icon>\n </Widget>}\n </>\n );\n};\n\nexport default TwilioChat;\n"],"names":["icoYouFibre","URL","url","icoChat","icoCloseChat","loadingIcon","icoUpload","icoClose","notificationSound","Container","styled","div","templateObject_1","__makeTemplateObject","OverflowContainer","templateObject_2","Widget","templateObject_3","Icon","templateObject_4","ChatWrapper","templateObject_5","ChatHeader","templateObject_6","ChatContent","templateObject_7","ChatInput","form","templateObject_8","Agent","templateObject_9","TwilioChat","_a","host","clientId","clientSecret","customToken","websocketUrl","postcodeSchemaId","source","_e","fullscreen","gContext","useContext","GlobalContext","outageFormMessage","useRef","_f","useState","outage","setOutage","_g","outageMessage","setOutageMessage","_h","logged","setLogged","_j","setToken","_k","chatConversationId","setChatConversationId","_l","chatCaseId","setChatCaseId","_m","chatLoading","setChatLoading","_o","chatSending","setChatSending","_p","chatClosing","setChatClosing","_q","openChat","setOpenChat","_r","chatForm","setChatForm","_s","message","setMessage","_t","chatUserId","setChatUserId","_u","chatUserType","setChatUserType","_v","chatUsername","setChatUsername","_w","uploadedFiles","setUploadedFiles","_x","uploadArea","setUploadArea","_y","resetFormValues","setResetFormValues","_z","chatSessionId","setChatSessionId","_0","confirmClosing","setConfirmClosing","_1","twilioChatUrlParams","setTwilioChatUrlParams","_2","chatUnreaded","setChatUnreaded","_3","chatActive","setChatActive","_4","appMessages","setAppMessages","_5","animateTabTitle","setAnimateTabTitle","_6","titleIndex","setTitleIndex","titleRef","intervalRef","openChatRef","visibilityChange","fileExtensions","londonSec","useTime","interval","seconds","_7","agentTyping","setAgentTyping","agentIdRef","defaultMessages","createdAt","moment","Date","format","fromId","senderType","type","value","title","action","messageId","from","categories","SALES","TECH_SUPPORT","INSTALLS_AND_SERVICE_VISITS","MANAGE_MY_ACCOUNT","BILLING","CANCELLATION","COMPLAINT","userTypeLabels","NEW_CUSTOMER","ACCOUNT_HOLDER","NOT_ACCOUNT_HOLDER","_8","messages","setMessages","_9","newMessages","setNewMessages","messagesRef","chatBoxRef","sc","scrollToBottom","current","scrollIntoView","behavior","e","useEffect","document","window","localStorage","getItem","setItem","getElementsByTagName","textContent","setInterval","nextIndex","length","slice","clearInterval","setConfig","axios","get","then","response","data","catch","error","getUrlParams","lastUrl","location","href","observer","MutationObserver","observe","body","childList","subtree","disconnect","isTimeInRange","resetChat","nowInLondon","toLocaleString","timeZone","hour","minute","second","hour12","timeToSeconds","timeStr","split","map","Number","chat_off_mode_toggle","_b","chat_off_mode_start","_c","chat_off_mode_end","start","_d","end","URLSearchParams","search","__awaiter","Promise","resolve","goSetRegistrationData","__assign","goGetRegistrationData","twilioChat","conversationId","caseId","participantId","sent","init","Object","keys","API","concat","properties","Status","console","log","error_1","removeItem","full_name","email","category","address","last_bill","JSON","parse","stringify","getAllMessages","addEventListener","visibilityState","getElementById","focus","setTimeout","convID","all","Message","dbRecords","item","From","getFiles","Files","files","Body","id","createdBy","SenderType","tmpMessages","sort","a","b","getTime","error_2","style","overflow","documentElement","typingTimeout","sessionId","tmpUUID","uuidv4","io","path","query","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","timeout","on","err","reason","emit","listeners","OwnerId","receiveMessage","sender","clearTimeout","tmpFiles_1","__spreadArray","Mimetype","Url","error_3","some","obj","Conversation","tmpFiles","updateMessages","error_4","tmpMessage","sound","Audio","toString","setAttribute","play","innerWidth","removeAllListeners","sendMessage","btnMessage","formData_1","FormData","append","post","headers","startConversation","tmpEmail","error_5","tmpToken","tmpChatUsername","tmpChatEmail","tmpChatAddress","tmpChatLastBill","tmpChatUserType","tmpChatCategory","channel","identifier","DpaCustomerName","DpaCustomerEmail","DpaCustomerAddress","DpaCustomerLastBill","DpaCustomerType","DpaCustomerCategory","toastrMsg","error_6","replaceAll","tmpConversation","prev","_10","useDropzone","noClick","noKeyboard","onDrop","acceptedFiles","filter","size","ext","name","endsWith","fileCount","getRootProps","getInputProps","open","React","createElement","Fragment","process","env","GATSBY_TWILIO_CHAT_VERSION","className","onDragOver","onMouseLeave","Row","src","alt","onClick","NoticationBar","ref","Chat","buttonAction","isStagingOrDevelopment","placeholder","required","options","newAccountHolder","notAccountHolder","yesAccountHolder","statusCode","error_8","autoComplete","maxLength","onChange","target","preventDefault","submitMessage","disabled","width","height","file","key","itm","index","closedBy","error_7","closeConversation","dangerouslySetInnerHTML","__html","linkifyHtml","chat_off_mode_text"],"mappings":"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"}