quikchat
Version:
quikchat is a simple vanilla (no dependancies) JavaScript chat control for browsers
3 lines (2 loc) • 31.6 kB
JavaScript
function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=Array(e);i<e;i++)n[i]=t[i];return n}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,o(n.key),n)}}function n(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}function s(t,e,i){return(e=o(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function a(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function r(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?a(Object(i),!0).forEach((function(e){s(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):a(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function l(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?t(e,i):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}var h={version:"1.1.17",license:"BSD-2",url:"https://github/deftio/quikchat",fun:!0},u=function(){return n((function t(i){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this.container=i,this.items=[],this.itemHeight=n.itemHeight||80,this.buffer=n.buffer||5,this.visibleRange={start:0,end:0},this.renderedElements=new Map,this.itemHeights=new Map,this.itemPositions=new Map,this.totalHeight=0,this.onRenderItem=n.onRenderItem||function(){},this.sanitizer=n.sanitizer||null,this._initStructure(),this._attachScrollListener()}),[{key:"_initStructure",value:function(){var t=this,e=this.container.className;if(this.container.innerHTML="",this.container.className=e,this.container.style.position="relative",this.container.style.overflow="auto",0===this.container.offsetHeight){var i=window.getComputedStyle(this.container).height;"0px"!==i&&"auto"!==i||(this.container.style.height="400px",console.warn("QuikChat Virtual Scrolling: Container has no height, setting to 400px"))}this.spacer=document.createElement("div"),this.spacer.style.cssText="position: absolute; top: 0; left: 0; width: 1px; pointer-events: none; z-index: -1;",this.content=document.createElement("div"),this.content.style.cssText="position: relative; width: 100%;",this.container.appendChild(this.spacer),this.container.appendChild(this.content),setTimeout((function(){t._updateVisibleRange(),t._renderVisibleItems()}),0)}},{key:"_attachScrollListener",value:function(){var t=this,e=!1;this.container.addEventListener("scroll",(function(){e||(requestAnimationFrame((function(){t._updateVisibleRange(),t._renderVisibleItems(),e=!1})),e=!0)}))}},{key:"_getItemHeight",value:function(t){return this.itemHeights.get(t)||this.itemHeight}},{key:"_getItemPosition",value:function(t){if(this.itemPositions.has(t))return this.itemPositions.get(t);for(var e=0,i=0;i<t;i++)e+=this._getItemHeight(i);return this.itemPositions.set(t,e),e}},{key:"_recalculatePositions",value:function(t){for(var e=t>0?this._getItemPosition(t):0,i=t;i<this.items.length;i++){this.itemPositions.set(i,e),e+=this._getItemHeight(i);var n=this.renderedElements.get(i);n&&(n.style.top="".concat(this.itemPositions.get(i),"px"))}this.totalHeight=e,this.spacer.style.height="".concat(this.totalHeight,"px")}},{key:"_updateVisibleRange",value:function(){var t=this.container.scrollTop,e=this.container.clientHeight;if(0!==e){var i=0,n=this.items.length;if(this.itemPositions.size>0){for(var s=0;s<this.items.length;s++){if(this._getItemPosition(s)+this._getItemHeight(s)>t){i=Math.max(0,s-this.buffer);break}}for(var a=i;a<this.items.length;a++){if(this._getItemPosition(a)>t+e){n=Math.min(this.items.length,a+this.buffer);break}}}else i=Math.max(0,Math.floor(t/this.itemHeight)-this.buffer),n=Math.min(this.items.length,Math.ceil((t+e)/this.itemHeight)+this.buffer);this.visibleRange={start:i,end:n}}else this.visibleRange={start:0,end:0}}},{key:"_renderVisibleItems",value:function(){var t=this,e=this.visibleRange,i=e.start,n=e.end;this.renderedElements.forEach((function(e,s){(s<i||s>=n)&&(e.remove(),t.renderedElements.delete(s))}));for(var s=function(e){var i=t.items[e];if(!i||t.renderedElements.has(e))return 1;var n=t._createItemElement(i,e);n.style.position="absolute",n.style.top="".concat(t._getItemPosition(e),"px"),n.style.left="0",n.style.right="0",t.renderedElements.set(e,n),t.content.appendChild(n),requestAnimationFrame((function(){if(t.renderedElements.has(e)){var i=n.offsetHeight;i&&i!==t._getItemHeight(e)&&(t.itemHeights.set(e,i),t._recalculatePositions(e))}}))},a=i;a<n;a++)s(a);this.onRenderItem(this.content)}},{key:"_createItemElement",value:function(t,e){var i=document.createElement("div");i.className="quikchat-message quikchat-message-".concat(t.align||"left"," quikchat-msgid-").concat(String(t.msgid).padStart(10,"0")),i.setAttribute("data-index",e),i.setAttribute("data-msgid",t.msgid),i.setAttribute("role","article"),i.setAttribute("aria-label","Message from ".concat(t.userString||"user")),t.tags&&t.tags.length>0&&t.tags.forEach((function(t){return i.classList.add("quikchat-tag-".concat(t))}));var n=document.createElement("div");n.className="quikchat-message-user",n.innerHTML=this.sanitizer?this.sanitizer(t.userString||""):t.userString||"",n.setAttribute("aria-label","User");var s=document.createElement("div");return s.className="quikchat-message-content",s.innerHTML=this.sanitizer?this.sanitizer(t.content||""):t.content||"",s.setAttribute("aria-label","Message content"),i.appendChild(n),i.appendChild(s),t.visible||(i.style.display="none"),i}},{key:"addItem",value:function(t){this.items.push(t);var e=this.items.length-1,i=e>0?this._getItemPosition(e-1)+this._getItemHeight(e-1):0;return this.itemPositions.set(e,i),this.totalHeight=i+this.itemHeight,this.spacer.style.height="".concat(this.totalHeight,"px"),e>=this.visibleRange.start&&e<this.visibleRange.end&&this._renderVisibleItems(),t.scrollIntoView&&(this.container.scrollTop=this.container.scrollHeight),e}},{key:"addItems",value:function(t){var e,i=this.items.length;(e=this.items).push.apply(e,l(t));for(var n=i>0?this._getItemPosition(i-1)+this._getItemHeight(i-1):0,s=i;s<this.items.length;s++)this.itemPositions.set(s,n),n+=this.itemHeight;this.totalHeight=n,this.spacer.style.height="".concat(this.totalHeight,"px"),this._updateVisibleRange(),this._renderVisibleItems(),t.length>0&&t[t.length-1].scrollIntoView&&(this.container.scrollTop=this.container.scrollHeight)}},{key:"clear",value:function(){this.items=[],this.renderedElements.clear(),this.itemHeights.clear(),this.itemPositions.clear(),this.totalHeight=0,this.content.innerHTML="",this.spacer.style.height="0px",this.visibleRange={start:0,end:0},this._updateVisibleRange(),this._renderVisibleItems()}},{key:"updateItem",value:function(t,e){t>=0&&t<this.items.length&&(this.items[t]=r(r({},this.items[t]),e),this.renderedElements.has(t)&&this._renderVisibleItems())}},{key:"destroy",value:function(){this.container.innerHTML="",this.items=[],this.renderedElements.clear()}}])}(),c=function(){return n((function t(i){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){},s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e(this,t);var a={theme:"quikchat-theme-light",trackHistory:!0,titleArea:{title:"Chat",show:!1,align:"center"},messagesArea:{alternating:!0},inputArea:{show:!0},sendOnEnter:!0,sendOnShiftEnter:!1,instanceClass:"",virtualScrolling:!0,virtualScrollingThreshold:500,lang:"en",dir:"ltr",translations:{en:{sendButton:"Send",inputPlaceholder:"Type a message...",titleDefault:"Chat"}},sanitizer:null},l=r(r({},a),s);s.translations&&(l.translations=r(r({},a.translations),s.translations)),"string"==typeof i&&(i=document.querySelector(i)),this._parentElement=i,this._theme=l.theme,this._onSend=n||function(){},this.lang=l.lang,this.dir=l.dir,this.translations=l.translations,this.currentTranslations=this.translations[this.lang]||this.translations.en,this._createWidget(),l.instanceClass&&this._chatWidget.classList.add(l.instanceClass),l.titleArea&&(this.titleAreaSetContents(l.titleArea.title,l.titleArea.align),!0===l.titleArea.show?this.titleAreaShow():this.titleAreaHide()),l.messagesArea&&this.messagesAreaAlternateColors(l.messagesArea.alternating),l.inputArea&&(!0===l.inputArea.show?this.inputAreaShow():this.inputAreaHide()),this._attachEventListeners(),this.trackHistory=l.trackHistory||!0,this._historyLimit=1e7,this._history=[],this._activeTags=new Set,this.sendOnEnter=l.sendOnEnter,this.sendOnShiftEnter=l.sendOnShiftEnter,this.virtualScrollingEnabled=l.virtualScrolling,this.virtualScrollingThreshold=l.virtualScrollingThreshold,this.virtualScroller=null,this._sanitizer=l.sanitizer||null}),[{key:"_initVirtualScrolling",value:function(){var t=this;this.virtualScrollingEnabled&&this._messagesArea&&!this.virtualScroller&&this._history.length>=this.virtualScrollingThreshold-1&&(this.virtualScroller=new u(this._messagesArea,{itemHeight:80,buffer:5,sanitizer:this._sanitizer,onRenderItem:function(e){t._messagesArea.classList.contains("quikchat-messages-area-alt")&&t._updateMessageStyles()}}),this._migrateToVirtualScrolling())}},{key:"_migrateToVirtualScrolling",value:function(){var t=this;if(this.virtualScroller){var e=this._history.map((function(t){return{msgid:t.msgid,content:t.content,userString:t.userString,align:t.align,role:t.role,visible:t.visible,tags:t.tags||[],scrollIntoView:!1}}));this.virtualScroller.addItems(e),setTimeout((function(){t.virtualScroller&&(t.virtualScroller._updateVisibleRange(),t.virtualScroller._renderVisibleItems())}),10)}}},{key:"_createWidget",value:function(){var t=this.currentTranslations.sendButton||"Send",e=this.currentTranslations.inputPlaceholder||"Type a message...",i='\n <div class="quikchat-base '.concat(this._theme,'" dir="').concat(this.dir,'" lang="').concat(this.lang,'" role="region" aria-label="Chat widget">\n <div class="quikchat-title-area" role="heading" aria-level="2">\n <span style="font-size: 1.5em; font-weight: 600;">Title Area</span>\n </div>\n <div class="quikchat-messages-area" role="log" aria-live="polite" aria-label="Chat messages"></div>\n <div class="quikchat-input-area" role="form" aria-label="Message input">\n <textarea class="quikchat-input-textbox" \n placeholder="').concat(e,'"\n aria-label="Type your message"\n autocomplete="off"\n autocapitalize="sentences"></textarea>\n <button class="quikchat-input-send-btn" \n aria-label="Send message"\n type="button">').concat(t,"</button>\n </div>\n </div>\n ");this._parentElement.innerHTML=i,this._chatWidget=this._parentElement.querySelector(".quikchat-base"),this._titleArea=this._chatWidget.querySelector(".quikchat-title-area"),this._messagesArea=this._chatWidget.querySelector(".quikchat-messages-area"),this._inputArea=this._chatWidget.querySelector(".quikchat-input-area"),this._textEntry=this._inputArea.querySelector(".quikchat-input-textbox"),this._sendButton=this._inputArea.querySelector(".quikchat-input-send-btn"),this.msgid=0,this._setupMobileSupport()}},{key:"_setupMobileSupport",value:function(){var t=this,e=document.querySelector('meta[name="viewport"]');e||((e=document.createElement("meta")).name="viewport",document.head.appendChild(e)),this._originalViewport=e.content,this._textEntry.addEventListener("focus",(function(){window.innerWidth<=768&&(e.content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0")})),this._textEntry.addEventListener("blur",(function(){t._originalViewport?e.content=t._originalViewport:e.content="width=device-width, initial-scale=1.0"})),"visualViewport"in window&&window.visualViewport.addEventListener("resize",(function(){t._handleVirtualKeyboard()}))}},{key:"_handleVirtualKeyboard",value:function(){var t=window.innerHeight-window.visualViewport.height;this._chatWidget.style.paddingBottom=t>0?"".concat(t,"px"):""}},{key:"_attachEventListeners",value:function(){var t=this;this._sendButton.addEventListener("click",(function(e){e.preventDefault(),t._onSend(t,t._textEntry.value.trim())})),window.addEventListener("resize",(function(){return t._handleContainerResize()})),this._chatWidget.addEventListener("resize",(function(){return t._handleContainerResize()})),this._textEntry.addEventListener("keydown",(function(e){e.shiftKey&&13===e.keyCode?t.sendOnShiftEnter&&(e.preventDefault(),t._onSend(t,t._textEntry.value.trim())):13===e.keyCode&&t.sendOnEnter&&(e.preventDefault(),t._onSend(t,t._textEntry.value.trim()))})),this._messagesArea.addEventListener("scroll",(function(){var e=t._messagesArea,i=e.scrollTop,n=e.scrollHeight,s=e.clientHeight;t.userScrolledUp=i+s<n}))}},{key:"setCallbackOnSend",value:function(t){this._onSend=t}},{key:"setCallbackonMessageAdded",value:function(t){this._onMessageAdded=t}},{key:"setCallbackonMessageAppend",value:function(t){this._onMessageAppend=t}},{key:"setCallbackonMessageReplace",value:function(t){this._onMessageReplace=t}},{key:"setCallbackonMessageDelete",value:function(t){this._onMessageDelete=t}},{key:"titleAreaToggle",value:function(){"none"===this._titleArea.style.display?this.titleAreaShow():this.titleAreaHide()}},{key:"titleAreaShow",value:function(){this._titleArea.style.display="",this._adjustMessagesAreaHeight()}},{key:"titleAreaHide",value:function(){this._titleArea.style.display="none",this._adjustMessagesAreaHeight()}},{key:"titleAreaSetContents",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"center";this._titleArea.innerHTML=this._sanitizeContent(t),this._titleArea.style.textAlign=e}},{key:"titleAreaGetContents",value:function(){return this._titleArea.innerHTML}},{key:"inputAreaToggle",value:function(){this._inputArea.classList.toggle("hidden"),"none"===this._inputArea.style.display?this.inputAreaShow():this.inputAreaHide()}},{key:"inputAreaShow",value:function(){this._inputArea.style.display="",this._adjustMessagesAreaHeight()}},{key:"inputAreaHide",value:function(){this._inputArea.style.display="none",this._adjustMessagesAreaHeight()}},{key:"_adjustMessagesAreaHeight",value:function(){var t=l(this._chatWidget.children).filter((function(t){return t.classList.contains("hidden")})).reduce((function(t,e){return t+e.offsetHeight}),0),e=this._chatWidget.offsetHeight;this._messagesArea.style.height="calc(100% - ".concat(e-t,"px)")}},{key:"_handleContainerResize",value:function(){return this._adjustMessagesAreaHeight(),this._adjustSendButtonWidth(),!0}},{key:"_adjustSendButtonWidth",value:function(){var t=this._sendButton.textContent.trim(),e=parseFloat(getComputedStyle(this._sendButton).fontSize)*t.length+16;return this._sendButton.style.minWidth="".concat(e,"px"),!0}},{key:"messagesAreaAlternateColors",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return t?this._messagesArea.classList.add("quikchat-messages-area-alt"):this._messagesArea.classList.remove("quikchat-messages-area-alt"),!0===t}},{key:"messagesAreaAlternateColorsToggle",value:function(){this._messagesArea.classList.toggle("quikchat-messages-area-alt")}},{key:"messagesAreaAlternateColorsGet",value:function(){return this._messagesArea.classList.contains("quikchat-messages-area-alt")}},{key:"messageAddFull",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{content:"",userString:"user",align:"right",role:"user",userID:-1,timestamp:!1,updatedtime:!1,scrollIntoView:!0,visible:!0,tags:[]},i=this.msgid;this.msgid++;var n=null;if(this.virtualScrollingEnabled&&!this.virtualScroller&&this._history.length>=this.virtualScrollingThreshold-1&&this._initVirtualScrolling(),this.virtualScroller){var s={msgid:i,content:e.content,userString:e.userString,align:e.align,role:e.role,visible:void 0===e.visible||e.visible,tags:e.tags||[],scrollIntoView:e.scrollIntoView};Array.isArray(e.tags)&&e.tags.forEach((function(e){"string"==typeof e&&/^[a-zA-Z0-9-]+$/.test(e)&&t._activeTags.add(e)})),this.virtualScroller.addItem(s),this._textEntry.value="",this._adjustMessagesAreaHeight()}else{n=document.createElement("div");var a="quikchat-msgid-"+String(i).padStart(10,"0");String(e.userString).padStart(10,"0"),n.classList.add("quikchat-message",a,"quikchat-structure"),n.setAttribute("role","article"),n.setAttribute("aria-label","Message from ".concat(e.userString||"user")),Array.isArray(e.tags)&&e.tags.forEach((function(e){"string"==typeof e&&/^[a-zA-Z0-9-]+$/.test(e)&&(n.classList.add("quikchat-tag-".concat(e)),t._activeTags.add(e))}));var l=document.createElement("div");l.innerHTML=this._sanitizeContent(e.userString),l.classList.add("quikchat-user-label"),l.style.textAlign=e.align;var o=document.createElement("div");if(o.classList.add("quikchat-message-content"),"right"===e.align){var h=e.content.includes("\n"),u=e.content.length>50;h||u?o.classList.add("quikchat-right-multiline"):o.classList.add("quikchat-right-singleline")}o.innerHTML=this._sanitizeContent(e.content),n.appendChild(l),n.appendChild(o),this._messagesArea.appendChild(n),!1===e.visible&&(n.style.display="none"),!0===e.scrollIntoView?this.messageScrollToBottom():"smart"!==e.scrollIntoView||this.userScrolledUp||this.messageScrollToBottom(),this._textEntry.value="",this._adjustMessagesAreaHeight(),this._handleShortLongMessageCSS(n,e.align),this._updateMessageStyles()}var c=e.timestamp?e.timestamp:(new Date).toISOString(),g=e.updatedtime?e.updatedtime:c,d=void 0===e.visible||e.visible;return this.trackHistory&&(this._history.push(r(r({msgid:i},e),{},{visible:d,timestamp:c,updatedtime:g,messageDiv:n||null})),this._history.length>this._historyLimit&&this._history.shift()),this._onMessageAdded&&this._onMessageAdded(this,i),i}},{key:"messageAddNew",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"user",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"right",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"user",s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:[];return this.messageAddFull({content:t,userString:e,align:i,role:n,scrollIntoView:s,visible:a,tags:r})}},{key:"messageRemove",value:function(t){var e=!1;try{this._messagesArea.removeChild(this._messagesArea.querySelector(".quikchat-msgid-".concat(String(t).padStart(10,"0")))),e=!0}catch(t){console.log("{String(n)} : Message ID not found")}return e&&(this._history.splice(this._history.findIndex((function(e){return e.msgid===t})),1),this._onMessageDelete&&this._onMessageDelete(this,t)),e}},{key:"messageGetDOMObject",value:function(t){var e=null;try{e=this._messagesArea.querySelector(".quikchat-msgid-".concat(String(t).padStart(10,"0")))}catch(t){console.log("{String(n)} : Message ID not found")}return e}},{key:"messageGetContent",value:function(t){var e="";try{e=this._history.filter((function(e){return e.msgid===t}))[0].content}catch(t){console.log("{String(n)} : Message ID not found")}return e}},{key:"messageGetContentDOMElement",value:function(t){var e=null;try{e=this._history.filter((function(e){return e.msgid===t}))[0].messageDiv.lastChild}catch(t){console.log("{String(n)} : Message ID not found")}return e}},{key:"messageAppendContent",value:function(t,e){var i=!1;try{var n=this._history.filter((function(e){return e.msgid===t}))[0];if(n.content+=e,n.updatedtime=(new Date).toISOString(),this.virtualScroller){var s=this.virtualScroller.items.findIndex((function(e){return e.msgid===t}));s>=0&&(this.virtualScroller.items[s].content+=e,this.virtualScroller.updateItem(s,{content:this.virtualScroller.items[s].content}))}else this._messagesArea.querySelector(".quikchat-msgid-".concat(String(t).padStart(10,"0"))).lastChild.innerHTML+=this._sanitizeContent(e);i=!0,this._onMessageAppend&&this._onMessageAppend(this,t,e)}catch(e){console.log("".concat(String(t)," : Message ID not found"))}return i}},{key:"messageReplaceContent",value:function(t,e){var i=!1;try{var n=this._history.filter((function(e){return e.msgid===t}))[0];if(n.content=e,n.updatedtime=(new Date).toISOString(),this.virtualScroller){var s=this.virtualScroller.items.findIndex((function(e){return e.msgid===t}));s>=0&&(this.virtualScroller.items[s].content=e,this.virtualScroller.updateItem(s,{content:e}))}else this._messagesArea.querySelector(".quikchat-msgid-".concat(String(t).padStart(10,"0"))).lastChild.innerHTML=this._sanitizeContent(e);i=!0,this._onMessageReplace&&this._onMessageReplace(this,t,e)}catch(e){console.log("".concat(String(t)," : Message ID not found"))}return i}},{key:"messageScrollToBottom",value:function(){this._messagesArea.scrollTop=this._messagesArea.scrollHeight}},{key:"messageRemoveLast",value:function(){if(this._history.length>=0){var t=this._history[this._history.length-1].msgid;return this.messageRemove(t)}return!1}},{key:"messageSetVisibility",value:function(t,e){var i=this._history.find((function(e){return e.msgid===t}));return!(!i||!i.messageDiv)&&(i.messageDiv.style.display=e?"":"none",i.visible=e,this._updateMessageStyles(),!0)}},{key:"messageGetVisibility",value:function(t){var e=this._history.find((function(e){return e.msgid===t}));return!(!e||!e.messageDiv)&&"none"!==e.messageDiv.style.display}},{key:"_updateMessageStyles",value:function(){l(this._messagesArea.children).filter((function(t){return"none"!==t.style.display})).forEach((function(t,e){t.classList.remove("quikchat-message-1","quikchat-message-2"),t.classList.add(e%2==0?"quikchat-message-1":"quikchat-message-2")}))}},{key:"_handleShortLongMessageCSS",value:function(t,e){t.classList.remove("left-singleline","left-multiline","center-singleline","center-multiline","right-singleline","right-multiline");var i=t.lastChild;window.lastDiv=i;var n,s=window.getComputedStyle(i),a=i.offsetHeight;"normal"===s.lineHeight?n=1.2*parseFloat(s.fontSize):n=parseFloat(s.lineHeight);var r=a>n;switch(e){case"center":r?t.classList.add("center-multiline"):t.classList.add("center-singleline");break;case"right":r?t.classList.add("right-multiline"):t.classList.add("right-singleline");break;default:r?t.classList.add("left-multiline"):t.classList.add("left-singleline")}}},{key:"historyGet",value:function(t,e){return null==t&&(t=0,e=this._history.length),void 0===e&&(e=t<0?e:t+1),this._history.slice(t,e)}},{key:"historyGetAllCopy",value:function(){return this._history.slice()}},{key:"historyGetPage",value:function(){var t,e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"asc",a=this._history.length,r=Math.ceil(a/n),l=Math.max(1,Math.min(i,r||1));"desc"===s?(t=Math.max(0,a-l*n),e=a-(l-1)*n):(t=(l-1)*n,e=Math.min(t+n,a));var o=this._history.slice(t,e);return"desc"===s&&o.reverse(),{messages:o,pagination:{currentPage:l,pageSize:n,totalPages:r,totalMessages:a,hasNext:l<r,hasPrevious:l>1,order:s}}}},{key:"historySearch",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this._history;if(t.text){var i=t.text.toLowerCase();e=e.filter((function(t){return t.content.toLowerCase().includes(i)}))}t.userString&&(e=e.filter((function(e){return e.userString===t.userString}))),t.role&&(e=e.filter((function(e){return e.role===t.role}))),t.tags&&t.tags.length>0&&(e=e.filter((function(e){return e.tags&&e.tags.some((function(e){return t.tags.includes(e)}))})));var n=t.limit||100;return e.length>n&&(e=e.slice(0,n)),e}},{key:"historyGetInfo",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50,e=this._history.length;return{totalMessages:e,totalPages:Math.ceil(e/t),oldestMessage:e>0?{msgid:this._history[0].msgid,timestamp:this._history[0].timestamp,userString:this._history[0].userString}:null,newestMessage:e>0?{msgid:this._history[e-1].msgid,timestamp:this._history[e-1].timestamp,userString:this._history[e-1].userString}:null,memoryUsage:{estimatedSize:JSON.stringify(this._history).length,averageMessageSize:e>0?Math.round(JSON.stringify(this._history).length/e):0}}}},{key:"historyClear",value:function(){this.msgid=0,this.virtualScroller?this.virtualScroller.clear():this._messagesArea.innerHTML="",this._history=[],this._activeTags.clear()}},{key:"historyGetLength",value:function(){return this._history.length}},{key:"historyGetMessage",value:function(t){return t>=0&&t<this._history.length?this._history[t]:{}}},{key:"historyGetMessageContent",value:function(t){return t>=0&&t<this._history.length?this._history[t].content:""}},{key:"historyRestoreAll",value:function(t){var e=this;this.historyClear(),this._messagesArea.innerHTML="",t.forEach((function(t){e.messageAddFull(t)}))}},{key:"changeTheme",value:function(t){this._chatWidget.classList.remove(this._theme),this._chatWidget.classList.add(t),this._theme=t}},{key:"theme",get:function(){return this._theme}},{key:"setTagVisibility",value:function(t,e){if("string"!=typeof t||!/^[a-zA-Z0-9-]+$/.test(t))return!1;var i="quikchat-show-tag-".concat(t);return e?this._chatWidget.classList.add(i):this._chatWidget.classList.remove(i),this._updateMessageStyles(),!0}},{key:"getTagVisibility",value:function(t){return!("string"!=typeof t||!/^[a-zA-Z0-9-]+$/.test(t))&&this._chatWidget.classList.contains("quikchat-show-tag-".concat(t))}},{key:"getActiveTags",value:function(){return Array.from(this._activeTags)}},{key:"isVirtualScrollingEnabled",value:function(){return this.virtualScrollingEnabled&&null!==this.virtualScroller}},{key:"getVirtualScrollingConfig",value:function(){return{enabled:this.virtualScrollingEnabled,active:null!==this.virtualScroller,threshold:this.virtualScrollingThreshold}}},{key:"setLanguage",value:function(t,e){this.lang=t,e&&(this.translations[t]=r(r({},this.translations[t]),e)),this.currentTranslations=this.translations[t]||this.translations.en,this._updateUITranslations()}},{key:"getLanguage",value:function(){return this.lang}},{key:"setDirection",value:function(t){"ltr"!==t&&"rtl"!==t||(this.dir=t,this._chatWidget.setAttribute("dir",t))}},{key:"getDirection",value:function(){return this.dir}},{key:"_updateUITranslations",value:function(){this._sendButton&&(this._sendButton.textContent=this.currentTranslations.sendButton||"Send"),this._textEntry&&(this._textEntry.placeholder=this.currentTranslations.inputPlaceholder||"Type a message..."),this._chatWidget&&this._chatWidget.setAttribute("lang",this.lang)}},{key:"setSanitizer",value:function(t){null===t||"function"==typeof t?this._sanitizer=t:console.warn("Sanitizer must be a function or null")}},{key:"getSanitizer",value:function(){return this._sanitizer}},{key:"_sanitizeContent",value:function(t){return this._sanitizer&&"function"==typeof this._sanitizer?this._sanitizer(t):t}}],[{key:"version",value:function(){return h}},{key:"loremIpsum",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ";for("number"!=typeof t&&(t=Math.floor(150*Math.random())+25),void 0===e&&(e=Math.floor(446*Math.random())),e%=446;" "===n[e]||/[.,:;!?]/.test(n[e]);)e=(e+1)%446;var s=n.substring(e)+n.substring(0,e);"number"!=typeof t&&(t=s.length);for(var a="";t>0;)a+=t<s.length?s.substring(0,t):s,t-=s.length;if(" "===a[a.length-1]&&(a=a.substring(0,a.length-1)+"."),i){var r=a[0].toUpperCase();a=(r=/[A-Z]/.test(r)?r:"M")+a.substring(1)}return a}},{key:"tempMessageGenerator",value:function(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;i=Math.max(i,100);var s=0;n&&"function"!=typeof n&&(n=null),n=n||function(t,e){return t+="."};var a=t;"string"==typeof a&&(a=document.querySelector(a));var r=a;if(r){r.innerHTML=e;var l=e,o=setInterval((function(){r.innerHTML===l?(l=String(n(l,s)),s++,r.innerHTML=l):clearInterval(o)}),i)}}},{key:"createTempMessageDOMStr",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};e=Math.max(e,100),i&&"function"!=typeof i&&(i=null),i=i||function(t,e){return t+"."};var s=n.containerClass?n.containerClass:"",a="tempMsg_"+Date.now()+"_"+Math.floor(1e6*Math.random());return'\n <span id="'.concat(a,'" ').concat(s?'class="'.concat(s,'"'):"",">\n ").concat(t,'\n </span>\n <script>\n (function(){\n // Get our container element by its unique id.\n var container = document.getElementById("').concat(a,'");\n if (!container) return;\n var count = 0;\n var currentMsg = container.innerHTML;\n var interval = ').concat(e,";\n // Convert the callback function into its string representation.\n var cb = ").concat(i.toString(),";\n var intervalId = setInterval(function(){\n // If the content has been replaced, stop updating.\n if(container.innerHTML !== currentMsg){\n clearInterval(intervalId);\n return;\n }\n // Use the callback to generate the new message.\n currentMsg = String(cb(currentMsg, count));\n count++;\n container.innerHTML = currentMsg;\n }, interval);\n })();\n <\/script>\n ")}}])}();s(c,"sanitizers",{escapeHTML:function(t){return"string"!=typeof t?t:t.replace(/[&<>"']/g,(function(t){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[t]}))},stripHTML:function(t){return"string"!=typeof t?t:t.replace(/<[^>]*>/g,"")}});export{c as default};
//# sourceMappingURL=quikchat.esm.min.js.map