quikchat 1.0.4 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/quikchat.cjs.js +139 -20
- package/dist/quikchat.cjs.js.map +1 -1
- package/dist/quikchat.cjs.min.js +1 -1
- package/dist/quikchat.cjs.min.js.map +1 -1
- package/dist/quikchat.css +44 -18
- package/dist/quikchat.esm.js +139 -20
- package/dist/quikchat.esm.js.map +1 -1
- package/dist/quikchat.esm.min.js +1 -1
- package/dist/quikchat.esm.min.js.map +1 -1
- package/dist/quikchat.react.js +63 -0
- package/dist/quikchat.umd.js +139 -20
- package/dist/quikchat.umd.js.map +1 -1
- package/dist/quikchat.umd.min.js +1 -1
- package/dist/quikchat.umd.min.js.map +1 -1
- package/package.json +24 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quikchat.esm.min.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n * \n * @param string or DOM element parentElement \n * @param {*} meta \n */\n constructor(parentElement, \n meta = { \n theme: 'quikchat-theme-light', \n onSend: () => { }, \n trackHistory: true,\n titleArea: {title: \"Title Area\", show: false, align: \"center\"}\n }) \n {\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = meta.onSend ? meta.onSend : () => { };\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show == true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory || true;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\">\n <span style=\"font-size: 1.5em; font-weight: 600;\">Title Area</span>\n </div>\n <div class=\"quikchat-messages-area\"></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => this._onSend(this, this._textEntry.value.trim()));\n window.addEventListener('resize', () => this._handleContainerResize());\n this._chatWidget.addEventListener('resize', () => this._handleContainerResize());\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n // Prevent default behavior (adding new line)\n event.preventDefault();\n this._onSend(this, this._textEntry.value.trim())\n }\n });\n }\n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n this._titleArea.style.display === 'none' ? this.titleAreaShow() : this.titleAreaHide();\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n this._inputArea.classList.toggle('hidden');\n this._inputArea.style.display === 'none' ? this.inputAreaShow() : this.inputAreaHide();\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n _adjustMessagesAreaHeight() {\n const hiddenElements = [...this._chatWidget.children].filter(child => child.classList.contains('hidden'));\n const totalHiddenHeight = hiddenElements.reduce((sum, child) => sum + child.offsetHeight, 0);\n const containerHeight = this._chatWidget.offsetHeight;\n this._messagesArea.style.height = `calc(100% - ${containerHeight - totalHiddenHeight}px)`;\n }\n\n _handleContainerResize() {\n this._adjustMessagesAreaHeight();\n this._adjustSendButtonWidth();\n //console.log('Container resized');\n }\n\n _adjustSendButtonWidth() {\n const sendButtonText = this._sendButton.textContent.trim();\n const fontSize = parseFloat(getComputedStyle(this._sendButton).fontSize);\n const minWidth = fontSize * sendButtonText.length + 16;\n this._sendButton.style.minWidth = `${minWidth}px`;\n }\n \n messageAddFull(input = {content: \"\", userString: \"user\", align : \"right\", role : \"user\", userID : -1}) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n const userIdClass = 'quikchat-userid-' + String(input.userString).padStart(10, '0'); // hash this..\n messageDiv.classList.add('quikchat-message', msgidClass);\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n \n const userDiv = document.createElement('div');\n userDiv.innerHTML = input.userString;\n userDiv.style = `width: 100%; text-align: ${input.align}; font-size: 1em; font-weight:700;`;\n\n const contentDiv = document.createElement('div');\n contentDiv.style = `width: 100%; text-align: ${input.align};`;\n contentDiv.innerHTML = input.content;\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n this._messagesArea.appendChild(messageDiv);\n //this._messagesArea.lastChild.scrollIntoView();\n this._messagesArea.lastElementChild.scrollIntoView()\n\n this._textEntry.value = '';\n this._adjustMessagesAreaHeight();\n const timestamp = new Date().toISOString();\n const updatedtime = timestamp;\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, timestamp, updatedtime, messageDiv});\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n };\n return msgid;\n }\n messageAddNew(content=\"\", userString=\"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull( \n {content: content, userString: userString, align: align, role: role}\n );\n }\n messageRemove(n) {\n // use css selector to remove the message\n let sucess = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n sucess = true;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n if (sucess) {\n // slow way to remove from history\n //this._history = this._history.filter((item) => item.msgid !== n); // todo make this more efficient\n\n // better way to delete this from history\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n }\n return sucess;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n // now use css selector to get the message \n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return msg; \n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\"\n // now use css selector to get the message \n try {\n // get from history..\n content = this._history.filter((item) => item.msgid === n)[0].content;\n //content = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.textContent;\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return content; \n }\n\n /* append message to the message content\n */\n messageAppendContent(n, content) {\n let sucess = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML += content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n sucess = true;\n //this._messagesArea.lastChild.scrollIntoView();\n this._messagesArea.lastElementChild.scrollIntoView()\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n } \n }\n /* replace message content\n */\n messageReplaceContent(n, content) {\n let sucess = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML = content;\n // update history\n this._history.filter((item) => item.msgid === n)[0].content = content;\n sucess = true;\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return sucess;\n }\n // history functions\n /**\n * \n * @param {*} n \n * @param {*} m \n * @returns array of history messages\n */\n historyGet(n,m) {\n\n if (n == undefined) {\n n = 0;\n m= this._history.length;\n }\n if (m === undefined) {\n m = n < 0 ? m: n + 1;\n }\n // remember that entries could be deleted. TODO: So we need to return the actual history entries\n // so now we need to find the array index that correspondes to messageIds n (start) and m (end)\n \n return this._history.slice(n,m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n } \n\n historyGetLength() {\n return this._history.length;\n } \n\n historyGetMessage(n) {\n if ( n>=0 && n < this._history.length) {\n this._history[n];\n }\n return {};\n\n } \n\n historyGetMessageContent(n) {\n return this._history[n].message;\n }\n\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return {\"version\" : \"1.0.4\", \"license\" : \"BSD-2\", \"url\" :\"https://github/deftio/quikchat\"};\n }\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","meta","arguments","length","undefined","theme","onSend","trackHistory","titleArea","title","show","align","_classCallCheck","document","querySelector","this","_parentElement","_theme","_onSend","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","_attachEventListeners","_historyLimit","_history","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesArea","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","trim","window","_handleContainerResize","event","shiftKey","keyCode","preventDefault","callback","_onMessageAdded","style","display","_adjustMessagesAreaHeight","textAlign","classList","toggle","inputAreaShow","inputAreaHide","totalHiddenHeight","_toConsumableArray","children","filter","child","contains","reduce","sum","offsetHeight","containerHeight","height","_adjustSendButtonWidth","sendButtonText","textContent","minWidth","parseFloat","getComputedStyle","fontSize","input","content","userString","role","userID","messageDiv","createElement","msgidClass","String","padStart","add","userDiv","contentDiv","appendChild","lastElementChild","scrollIntoView","timestamp","Date","toISOString","updatedtime","push","_objectSpread","shift","messageAddFull","n","sucess","removeChild","error","console","log","splice","findIndex","item","msg","lastChild","m","slice","message","newTheme","remove","get","version","license","url"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quikchat.esm.min.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n * \n * @param string or DOM element parentElement \n * @param {*} meta \n */\n constructor(parentElement, onSend = () => { }, options = {}) {\n const defaultOpts = {\n theme: 'quikchat-theme-light',\n trackHistory: true,\n titleArea: { title: \"Chat\", show: false, align: \"center\" },\n messagesArea: { alternating: true },\n };\n const meta = { ...defaultOpts, ...options }; // merge options with defaults\n\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n //console.log(parentElement, meta);\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = onSend ? onSend : () => { }; // call back function for onSend\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show === true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n // messages area\n if (meta.messagesArea) {\n this.messagesAreaAlternateColors(meta.messagesArea.alternating);\n }\n // plumbing\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory || true;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\">\n <span style=\"font-size: 1.5em; font-weight: 600;\">Title Area</span>\n </div>\n <div class=\"quikchat-messages-area\"></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n /**\n * Attach event listeners to the widget\n */\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => this._onSend(this, this._textEntry.value.trim()));\n window.addEventListener('resize', () => this._handleContainerResize());\n this._chatWidget.addEventListener('resize', () => this._handleContainerResize());\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n // Prevent default behavior (adding new line)\n event.preventDefault();\n this._onSend(this, this._textEntry.value.trim());\n }\n });\n\n this._messagesArea.addEventListener('scroll', () => {\n const { scrollTop, scrollHeight, clientHeight } = this._messagesArea;\n this.userScrolledUp = scrollTop + clientHeight < scrollHeight;\n });\n }\n \n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n this._titleArea.style.display === 'none' ? this.titleAreaShow() : this.titleAreaHide();\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n this._inputArea.classList.toggle('hidden');\n this._inputArea.style.display === 'none' ? this.inputAreaShow() : this.inputAreaHide();\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n _adjustMessagesAreaHeight() {\n const hiddenElements = [...this._chatWidget.children].filter(child => child.classList.contains('hidden'));\n const totalHiddenHeight = hiddenElements.reduce((sum, child) => sum + child.offsetHeight, 0);\n const containerHeight = this._chatWidget.offsetHeight;\n this._messagesArea.style.height = `calc(100% - ${containerHeight - totalHiddenHeight}px)`;\n }\n\n _handleContainerResize() {\n this._adjustMessagesAreaHeight();\n this._adjustSendButtonWidth();\n //console.log('Container resized');\n }\n\n _adjustSendButtonWidth() {\n const sendButtonText = this._sendButton.textContent.trim();\n const fontSize = parseFloat(getComputedStyle(this._sendButton).fontSize);\n const minWidth = fontSize * sendButtonText.length + 16;\n this._sendButton.style.minWidth = `${minWidth}px`;\n }\n\n //messagesArea functions\n messagesAreaAlternateColors(alt = true) {\n if (alt) {\n this._messagesArea.classList.add('quikchat-messages-area-alt');\n }\n else {\n this._messagesArea.classList.remove('quikchat-messages-area-alt');\n }\n return alt === true;\n }\n messagesAreaAlternateColorsToggle() {\n this._messagesArea.classList.toggle('quikchat-messages-area-alt');\n }\n messagesAreaAlternateColorsGet() {\n return this._messagesArea.classList.contains('quikchat-messages-area-alt');\n }\n // message functions\n messageAddFull(input = { content: \"\", userString: \"user\", align: \"right\", role: \"user\", userID: -1 }) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n const userIdClass = 'quikchat-userid-' + String(input.userString).padStart(10, '0'); // hash this..\n messageDiv.classList.add('quikchat-message', msgidClass);\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n\n const userDiv = document.createElement('div');\n userDiv.innerHTML = input.userString;\n userDiv.style = `width: 100%; text-align: ${input.align}; font-size: 1em; font-weight:700;`;\n\n const contentDiv = document.createElement('div');\n contentDiv.style = `width: 100%; text-align: ${input.align};`;\n contentDiv.innerHTML = input.content;\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n this._messagesArea.appendChild(messageDiv);\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n\n this._textEntry.value = '';\n this._adjustMessagesAreaHeight();\n const timestamp = new Date().toISOString();\n const updatedtime = timestamp;\n\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, timestamp, updatedtime, messageDiv });\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n }\n\n return msgid;\n }\n\n \n messageAddNew(content = \"\", userString = \"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull(\n { content: content, userString: userString, align: align, role: role }\n );\n }\n messageRemove(n) {\n // use css selector to remove the message\n let sucess = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n sucess = true;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n if (sucess) {\n // slow way to remove from history\n //this._history = this._history.filter((item) => item.msgid !== n); // todo make this more efficient\n\n // better way to delete this from history\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n }\n return sucess;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n // now use css selector to get the message \n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n return msg;\n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\"\n // now use css selector to get the message \n try {\n // get from history..\n content = this._history.filter((item) => item.msgid === n)[0].content;\n //content = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.textContent;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n return content;\n }\n\n /* append message to the message content\n */\n\n messageAppendContent(n, content) {\n let success = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML += content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n success = true;\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n } catch (error) {\n console.log(`${String(n)} : Message ID not found`);\n }\n return success;\n }\n \n /* replace message content\n */\n messageReplaceContent(n, content) {\n let success = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML = content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content = content;\n item.updatedtime = new Date().toISOString();\n success = true;\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n } catch (error) {\n console.log(`${String(n)} : Message ID not found`);\n }\n return success;\n }\n \n // history functions\n /**\n * \n * @param {*} n \n * @param {*} m \n * @returns array of history messages\n */\n historyGet(n, m) {\n\n if (n == undefined) {\n n = 0;\n m = this._history.length;\n }\n if (m === undefined) {\n m = n < 0 ? m : n + 1;\n }\n // remember that entries could be deleted. TODO: So we need to return the actual history entries\n // so now we need to find the array index that correspondes to messageIds n (start) and m (end)\n\n return this._history.slice(n, m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n }\n\n historyGetLength() {\n return this._history.length;\n }\n\n historyGetMessage(n) {\n if (n >= 0 && n < this._history.length) {\n this._history[n];\n }\n return {};\n\n }\n\n historyGetMessageContent(n) {\n return this._history[n].message;\n }\n\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return { \"version\": \"1.1.2\", \"license\": \"BSD-2\", \"url\": \"https://github/deftio/quikchat\" };\n }\n\n /**\n * quikchat.loremIpsum() - Generate a simple string of Lorem Ipsum text (sample typographer's text) of numChars in length.\n * borrowed from github.com/deftio/bitwrench.js\n * @param {number} numChars - The number of characters to generate (random btw 25 and 150 if undefined). \n * @param {number} [startSpot=0] - The starting index in the Lorem Ipsum text. If undefined, a random startSpot will be generated.\n * @param {boolean} [startWithCapitalLetter=true] - If true, capitalize the first character or inject a capital letter if the first character isn't a capital letter.\n * \n * @returns {string} A string of Lorem Ipsum text.\n * \n * @example \n * // Returns 200 characters of Lorem Ipsum starting from index 50\n * loremIpsum(200, 50);\n * \n * @example \n * //Returns a 200 Lorem Ipsum characters starting from a random index\n * loremIpsum(200);\n */\n\n static loremIpsum(numChars, startSpot = undefined, startWithCapitalLetter = true) {\n const loremText = \"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. \";\n\n if (typeof numChars !== \"number\") {\n numChars = Math.floor(Math.random() * (150)) + 25;\n }\n\n if (startSpot === undefined) {\n startSpot = Math.floor(Math.random() * loremText.length);\n }\n\n startSpot = startSpot % loremText.length;\n\n // Move startSpot to the next non-whitespace and non-punctuation character\n while (loremText[startSpot] === ' ' || /[.,:;!?]/.test(loremText[startSpot])) {\n startSpot = (startSpot + 1) % loremText.length;\n }\n\n let l = loremText.substring(startSpot) + loremText.substring(0, startSpot);\n\n if (typeof numChars !== \"number\") {\n numChars = l.length;\n }\n\n let s = \"\";\n while (numChars > 0) {\n s += numChars < l.length ? l.substring(0, numChars) : l;\n numChars -= l.length;\n }\n\n if (s[s.length - 1] === \" \") {\n s = s.substring(0, s.length - 1) + \".\"; // always end on non-whitespace. \".\" was chosen arbitrarily.\n }\n\n if (startWithCapitalLetter) {\n let c = s[0].toUpperCase();\n c = /[A-Z]/.test(c) ? c : \"M\";\n s = c + s.substring(1);\n }\n\n return s;\n };\n\n\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","onSend","arguments","length","undefined","options","_classCallCheck","meta","_objectSpread","defaultOpts","theme","trackHistory","titleArea","title","show","align","messagesArea","alternating","document","querySelector","this","_parentElement","_theme","_onSend","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","messagesAreaAlternateColors","_attachEventListeners","_historyLimit","_history","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesArea","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","trim","window","_handleContainerResize","event","shiftKey","keyCode","preventDefault","_this$_messagesArea","scrollTop","scrollHeight","clientHeight","userScrolledUp","callback","_onMessageAdded","style","display","_adjustMessagesAreaHeight","textAlign","classList","toggle","inputAreaShow","inputAreaHide","totalHiddenHeight","_toConsumableArray","children","filter","child","contains","reduce","sum","offsetHeight","containerHeight","height","_adjustSendButtonWidth","sendButtonText","textContent","minWidth","parseFloat","getComputedStyle","fontSize","alt","add","remove","input","content","userString","role","userID","messageDiv","createElement","msgidClass","String","padStart","userDiv","contentDiv","appendChild","lastElementChild","scrollIntoView","timestamp","Date","toISOString","updatedtime","push","shift","messageAddFull","n","sucess","removeChild","error","console","log","splice","findIndex","item","msg","success","lastChild","m","slice","message","newTheme","get","version","license","url","numChars","startSpot","startWithCapitalLetter","loremText","Math","floor","random","test","l","substring","s","c","toUpperCase"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
(function (React, quikchat) {
|
|
2
|
+
const { useEffect, useRef, forwardRef, useImperativeHandle } = React;
|
|
3
|
+
|
|
4
|
+
const QuikChat = forwardRef(function QuikChat({ onSend, options }, ref) {
|
|
5
|
+
const chatContainerRef = useRef(null);
|
|
6
|
+
const quikChatInstanceRef = useRef(null);
|
|
7
|
+
|
|
8
|
+
useEffect(function() {
|
|
9
|
+
if (chatContainerRef.current && !quikChatInstanceRef.current) {
|
|
10
|
+
quikChatInstanceRef.current = new quikchat(
|
|
11
|
+
chatContainerRef.current,
|
|
12
|
+
function(chat, msg) {
|
|
13
|
+
if (onSend) {
|
|
14
|
+
onSend(chat, msg);
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
options
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return function() {
|
|
22
|
+
// Clean up if necessary
|
|
23
|
+
};
|
|
24
|
+
}, [onSend, options]);
|
|
25
|
+
|
|
26
|
+
useImperativeHandle(ref, function() {
|
|
27
|
+
return {
|
|
28
|
+
titleAreaToggle: function() { return quikChatInstanceRef.current.titleAreaToggle(); },
|
|
29
|
+
titleAreaShow: function() { return quikChatInstanceRef.current.titleAreaShow(); },
|
|
30
|
+
titleAreaHide: function() { return quikChatInstanceRef.current.titleAreaHide(); },
|
|
31
|
+
titleAreaSetContents: function() { return quikChatInstanceRef.current.titleAreaSetContents.apply(quikChatInstanceRef.current, arguments); },
|
|
32
|
+
titleAreaGetContents: function() { return quikChatInstanceRef.current.titleAreaGetContents(); },
|
|
33
|
+
inputAreaToggle: function() { return quikChatInstanceRef.current.inputAreaToggle(); },
|
|
34
|
+
inputAreaShow: function() { return quikChatInstanceRef.current.inputAreaShow(); },
|
|
35
|
+
inputAreaHide: function() { return quikChatInstanceRef.current.inputAreaHide(); },
|
|
36
|
+
messagesAreaAlternateColors: function() { return quikChatInstanceRef.current.messagesAreaAlternateColors.apply(quikChatInstanceRef.current, arguments); },
|
|
37
|
+
messagesAreaAlternateColorsToggle: function() { return quikChatInstanceRef.current.messagesAreaAlternateColorsToggle(); },
|
|
38
|
+
messagesAreaAlternateColorsGet: function() { return quikChatInstanceRef.current.messagesAreaAlternateColorsGet(); },
|
|
39
|
+
messageAddFull: function() { return quikChatInstanceRef.current.messageAddFull.apply(quikChatInstanceRef.current, arguments); },
|
|
40
|
+
messageAddNew: function() { return quikChatInstanceRef.current.messageAddNew.apply(quikChatInstanceRef.current, arguments); },
|
|
41
|
+
messageRemove: function() { return quikChatInstanceRef.current.messageRemove.apply(quikChatInstanceRef.current, arguments); },
|
|
42
|
+
messageGetDOMObject: function() { return quikChatInstanceRef.current.messageGetDOMObject.apply(quikChatInstanceRef.current, arguments); },
|
|
43
|
+
messageGetContent: function() { return quikChatInstanceRef.current.messageGetContent.apply(quikChatInstanceRef.current, arguments); },
|
|
44
|
+
messageAppendContent: function() { return quikChatInstanceRef.current.messageAppendContent.apply(quikChatInstanceRef.current, arguments); },
|
|
45
|
+
messageReplaceContent: function() { return quikChatInstanceRef.current.messageReplaceContent.apply(quikChatInstanceRef.current, arguments); },
|
|
46
|
+
historyGet: function() { return quikChatInstanceRef.current.historyGet.apply(quikChatInstanceRef.current, arguments); },
|
|
47
|
+
historyClear: function() { return quikChatInstanceRef.current.historyClear(); },
|
|
48
|
+
historyGetLength: function() { return quikChatInstanceRef.current.historyGetLength(); },
|
|
49
|
+
historyGetMessage: function() { return quikChatInstanceRef.current.historyGetMessage.apply(quikChatInstanceRef.current, arguments); },
|
|
50
|
+
historyGetMessageContent: function() { return quikChatInstanceRef.current.historyGetMessageContent.apply(quikChatInstanceRef.current, arguments); },
|
|
51
|
+
changeTheme: function() { return quikChatInstanceRef.current.changeTheme.apply(quikChatInstanceRef.current, arguments); }
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return React.createElement('div', {
|
|
56
|
+
ref: chatContainerRef,
|
|
57
|
+
style: { height: '100%', width: '100%' }
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Export for use in browser
|
|
62
|
+
window.QuikChatReact = { QuikChat: QuikChat };
|
|
63
|
+
})(React, quikchat);
|
package/dist/quikchat.umd.js
CHANGED
|
@@ -93,33 +93,45 @@
|
|
|
93
93
|
* @param {*} meta
|
|
94
94
|
*/
|
|
95
95
|
function quikchat(parentElement) {
|
|
96
|
-
var
|
|
96
|
+
var onSend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
|
|
97
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
98
|
+
_classCallCheck(this, quikchat);
|
|
99
|
+
var defaultOpts = {
|
|
97
100
|
theme: 'quikchat-theme-light',
|
|
98
|
-
onSend: function onSend() {},
|
|
99
101
|
trackHistory: true,
|
|
100
102
|
titleArea: {
|
|
101
|
-
title: "
|
|
103
|
+
title: "Chat",
|
|
102
104
|
show: false,
|
|
103
105
|
align: "center"
|
|
106
|
+
},
|
|
107
|
+
messagesArea: {
|
|
108
|
+
alternating: true
|
|
104
109
|
}
|
|
105
110
|
};
|
|
106
|
-
|
|
111
|
+
var meta = _objectSpread2(_objectSpread2({}, defaultOpts), options); // merge options with defaults
|
|
112
|
+
|
|
107
113
|
if (typeof parentElement === 'string') {
|
|
108
114
|
parentElement = document.querySelector(parentElement);
|
|
109
115
|
}
|
|
116
|
+
//console.log(parentElement, meta);
|
|
110
117
|
this._parentElement = parentElement;
|
|
111
118
|
this._theme = meta.theme;
|
|
112
|
-
this._onSend =
|
|
119
|
+
this._onSend = onSend ? onSend : function () {}; // call back function for onSend
|
|
113
120
|
this._createWidget();
|
|
114
121
|
// title area
|
|
115
122
|
if (meta.titleArea) {
|
|
116
123
|
this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);
|
|
117
|
-
if (meta.titleArea.show
|
|
124
|
+
if (meta.titleArea.show === true) {
|
|
118
125
|
this.titleAreaShow();
|
|
119
126
|
} else {
|
|
120
127
|
this.titleAreaHide();
|
|
121
128
|
}
|
|
122
129
|
}
|
|
130
|
+
// messages area
|
|
131
|
+
if (meta.messagesArea) {
|
|
132
|
+
this.messagesAreaAlternateColors(meta.messagesArea.alternating);
|
|
133
|
+
}
|
|
134
|
+
// plumbing
|
|
123
135
|
this._attachEventListeners();
|
|
124
136
|
this.trackHistory = meta.trackHistory || true;
|
|
125
137
|
this._historyLimit = 10000000;
|
|
@@ -138,6 +150,10 @@
|
|
|
138
150
|
this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');
|
|
139
151
|
this.msgid = 0;
|
|
140
152
|
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Attach event listeners to the widget
|
|
156
|
+
*/
|
|
141
157
|
}, {
|
|
142
158
|
key: "_attachEventListeners",
|
|
143
159
|
value: function _attachEventListeners() {
|
|
@@ -159,7 +175,15 @@
|
|
|
159
175
|
_this._onSend(_this, _this._textEntry.value.trim());
|
|
160
176
|
}
|
|
161
177
|
});
|
|
178
|
+
this._messagesArea.addEventListener('scroll', function () {
|
|
179
|
+
var _this$_messagesArea = _this._messagesArea,
|
|
180
|
+
scrollTop = _this$_messagesArea.scrollTop,
|
|
181
|
+
scrollHeight = _this$_messagesArea.scrollHeight,
|
|
182
|
+
clientHeight = _this$_messagesArea.clientHeight;
|
|
183
|
+
_this.userScrolledUp = scrollTop + clientHeight < scrollHeight;
|
|
184
|
+
});
|
|
162
185
|
}
|
|
186
|
+
|
|
163
187
|
// set the onSend function callback.
|
|
164
188
|
}, {
|
|
165
189
|
key: "setCallbackOnSend",
|
|
@@ -248,6 +272,30 @@
|
|
|
248
272
|
var minWidth = fontSize * sendButtonText.length + 16;
|
|
249
273
|
this._sendButton.style.minWidth = "".concat(minWidth, "px");
|
|
250
274
|
}
|
|
275
|
+
|
|
276
|
+
//messagesArea functions
|
|
277
|
+
}, {
|
|
278
|
+
key: "messagesAreaAlternateColors",
|
|
279
|
+
value: function messagesAreaAlternateColors() {
|
|
280
|
+
var alt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
281
|
+
if (alt) {
|
|
282
|
+
this._messagesArea.classList.add('quikchat-messages-area-alt');
|
|
283
|
+
} else {
|
|
284
|
+
this._messagesArea.classList.remove('quikchat-messages-area-alt');
|
|
285
|
+
}
|
|
286
|
+
return alt === true;
|
|
287
|
+
}
|
|
288
|
+
}, {
|
|
289
|
+
key: "messagesAreaAlternateColorsToggle",
|
|
290
|
+
value: function messagesAreaAlternateColorsToggle() {
|
|
291
|
+
this._messagesArea.classList.toggle('quikchat-messages-area-alt');
|
|
292
|
+
}
|
|
293
|
+
}, {
|
|
294
|
+
key: "messagesAreaAlternateColorsGet",
|
|
295
|
+
value: function messagesAreaAlternateColorsGet() {
|
|
296
|
+
return this._messagesArea.classList.contains('quikchat-messages-area-alt');
|
|
297
|
+
}
|
|
298
|
+
// message functions
|
|
251
299
|
}, {
|
|
252
300
|
key: "messageAddFull",
|
|
253
301
|
value: function messageAddFull() {
|
|
@@ -274,8 +322,11 @@
|
|
|
274
322
|
messageDiv.appendChild(userDiv);
|
|
275
323
|
messageDiv.appendChild(contentDiv);
|
|
276
324
|
this._messagesArea.appendChild(messageDiv);
|
|
277
|
-
|
|
278
|
-
|
|
325
|
+
|
|
326
|
+
// Scroll to the last message only if the user is not actively scrolling up
|
|
327
|
+
if (!this.userScrolledUp) {
|
|
328
|
+
this._messagesArea.lastElementChild.scrollIntoView();
|
|
329
|
+
}
|
|
279
330
|
this._textEntry.value = '';
|
|
280
331
|
this._adjustMessagesAreaHeight();
|
|
281
332
|
var timestamp = new Date().toISOString();
|
|
@@ -371,7 +422,7 @@
|
|
|
371
422
|
}, {
|
|
372
423
|
key: "messageAppendContent",
|
|
373
424
|
value: function messageAppendContent(n, content) {
|
|
374
|
-
var
|
|
425
|
+
var success = false;
|
|
375
426
|
try {
|
|
376
427
|
this._messagesArea.querySelector(".quikchat-msgid-".concat(String(n).padStart(10, '0'))).lastChild.innerHTML += content;
|
|
377
428
|
// update history
|
|
@@ -380,31 +431,44 @@
|
|
|
380
431
|
})[0];
|
|
381
432
|
item.content += content;
|
|
382
433
|
item.updatedtime = new Date().toISOString();
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
434
|
+
success = true;
|
|
435
|
+
|
|
436
|
+
// Scroll to the last message only if the user is not actively scrolling up
|
|
437
|
+
if (!this.userScrolledUp) {
|
|
438
|
+
this._messagesArea.lastElementChild.scrollIntoView();
|
|
439
|
+
}
|
|
386
440
|
} catch (error) {
|
|
387
|
-
console.log("
|
|
441
|
+
console.log("".concat(String(n), " : Message ID not found"));
|
|
388
442
|
}
|
|
443
|
+
return success;
|
|
389
444
|
}
|
|
445
|
+
|
|
390
446
|
/* replace message content
|
|
391
447
|
*/
|
|
392
448
|
}, {
|
|
393
449
|
key: "messageReplaceContent",
|
|
394
450
|
value: function messageReplaceContent(n, content) {
|
|
395
|
-
var
|
|
451
|
+
var success = false;
|
|
396
452
|
try {
|
|
397
453
|
this._messagesArea.querySelector(".quikchat-msgid-".concat(String(n).padStart(10, '0'))).lastChild.innerHTML = content;
|
|
398
454
|
// update history
|
|
399
|
-
this._history.filter(function (item) {
|
|
455
|
+
var item = this._history.filter(function (item) {
|
|
400
456
|
return item.msgid === n;
|
|
401
|
-
})[0]
|
|
402
|
-
|
|
457
|
+
})[0];
|
|
458
|
+
item.content = content;
|
|
459
|
+
item.updatedtime = new Date().toISOString();
|
|
460
|
+
success = true;
|
|
461
|
+
|
|
462
|
+
// Scroll to the last message only if the user is not actively scrolling up
|
|
463
|
+
if (!this.userScrolledUp) {
|
|
464
|
+
this._messagesArea.lastElementChild.scrollIntoView();
|
|
465
|
+
}
|
|
403
466
|
} catch (error) {
|
|
404
|
-
console.log("
|
|
467
|
+
console.log("".concat(String(n), " : Message ID not found"));
|
|
405
468
|
}
|
|
406
|
-
return
|
|
469
|
+
return success;
|
|
407
470
|
}
|
|
471
|
+
|
|
408
472
|
// history functions
|
|
409
473
|
/**
|
|
410
474
|
*
|
|
@@ -467,11 +531,66 @@
|
|
|
467
531
|
key: "version",
|
|
468
532
|
value: function version() {
|
|
469
533
|
return {
|
|
470
|
-
"version": "1.
|
|
534
|
+
"version": "1.1.2",
|
|
471
535
|
"license": "BSD-2",
|
|
472
536
|
"url": "https://github/deftio/quikchat"
|
|
473
537
|
};
|
|
474
538
|
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* quikchat.loremIpsum() - Generate a simple string of Lorem Ipsum text (sample typographer's text) of numChars in length.
|
|
542
|
+
* borrowed from github.com/deftio/bitwrench.js
|
|
543
|
+
* @param {number} numChars - The number of characters to generate (random btw 25 and 150 if undefined).
|
|
544
|
+
* @param {number} [startSpot=0] - The starting index in the Lorem Ipsum text. If undefined, a random startSpot will be generated.
|
|
545
|
+
* @param {boolean} [startWithCapitalLetter=true] - If true, capitalize the first character or inject a capital letter if the first character isn't a capital letter.
|
|
546
|
+
*
|
|
547
|
+
* @returns {string} A string of Lorem Ipsum text.
|
|
548
|
+
*
|
|
549
|
+
* @example
|
|
550
|
+
* // Returns 200 characters of Lorem Ipsum starting from index 50
|
|
551
|
+
* loremIpsum(200, 50);
|
|
552
|
+
*
|
|
553
|
+
* @example
|
|
554
|
+
* //Returns a 200 Lorem Ipsum characters starting from a random index
|
|
555
|
+
* loremIpsum(200);
|
|
556
|
+
*/
|
|
557
|
+
}, {
|
|
558
|
+
key: "loremIpsum",
|
|
559
|
+
value: function loremIpsum(numChars) {
|
|
560
|
+
var startSpot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
561
|
+
var startWithCapitalLetter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
562
|
+
var loremText = "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. ";
|
|
563
|
+
if (typeof numChars !== "number") {
|
|
564
|
+
numChars = Math.floor(Math.random() * 150) + 25;
|
|
565
|
+
}
|
|
566
|
+
if (startSpot === undefined) {
|
|
567
|
+
startSpot = Math.floor(Math.random() * loremText.length);
|
|
568
|
+
}
|
|
569
|
+
startSpot = startSpot % loremText.length;
|
|
570
|
+
|
|
571
|
+
// Move startSpot to the next non-whitespace and non-punctuation character
|
|
572
|
+
while (loremText[startSpot] === ' ' || /[.,:;!?]/.test(loremText[startSpot])) {
|
|
573
|
+
startSpot = (startSpot + 1) % loremText.length;
|
|
574
|
+
}
|
|
575
|
+
var l = loremText.substring(startSpot) + loremText.substring(0, startSpot);
|
|
576
|
+
if (typeof numChars !== "number") {
|
|
577
|
+
numChars = l.length;
|
|
578
|
+
}
|
|
579
|
+
var s = "";
|
|
580
|
+
while (numChars > 0) {
|
|
581
|
+
s += numChars < l.length ? l.substring(0, numChars) : l;
|
|
582
|
+
numChars -= l.length;
|
|
583
|
+
}
|
|
584
|
+
if (s[s.length - 1] === " ") {
|
|
585
|
+
s = s.substring(0, s.length - 1) + "."; // always end on non-whitespace. "." was chosen arbitrarily.
|
|
586
|
+
}
|
|
587
|
+
if (startWithCapitalLetter) {
|
|
588
|
+
var c = s[0].toUpperCase();
|
|
589
|
+
c = /[A-Z]/.test(c) ? c : "M";
|
|
590
|
+
s = c + s.substring(1);
|
|
591
|
+
}
|
|
592
|
+
return s;
|
|
593
|
+
}
|
|
475
594
|
}]);
|
|
476
595
|
}();
|
|
477
596
|
|
package/dist/quikchat.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quikchat.umd.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n * \n * @param string or DOM element parentElement \n * @param {*} meta \n */\n constructor(parentElement, \n meta = { \n theme: 'quikchat-theme-light', \n onSend: () => { }, \n trackHistory: true,\n titleArea: {title: \"Title Area\", show: false, align: \"center\"}\n }) \n {\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = meta.onSend ? meta.onSend : () => { };\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show == true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory || true;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\">\n <span style=\"font-size: 1.5em; font-weight: 600;\">Title Area</span>\n </div>\n <div class=\"quikchat-messages-area\"></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => this._onSend(this, this._textEntry.value.trim()));\n window.addEventListener('resize', () => this._handleContainerResize());\n this._chatWidget.addEventListener('resize', () => this._handleContainerResize());\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n // Prevent default behavior (adding new line)\n event.preventDefault();\n this._onSend(this, this._textEntry.value.trim())\n }\n });\n }\n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n this._titleArea.style.display === 'none' ? this.titleAreaShow() : this.titleAreaHide();\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n this._inputArea.classList.toggle('hidden');\n this._inputArea.style.display === 'none' ? this.inputAreaShow() : this.inputAreaHide();\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n _adjustMessagesAreaHeight() {\n const hiddenElements = [...this._chatWidget.children].filter(child => child.classList.contains('hidden'));\n const totalHiddenHeight = hiddenElements.reduce((sum, child) => sum + child.offsetHeight, 0);\n const containerHeight = this._chatWidget.offsetHeight;\n this._messagesArea.style.height = `calc(100% - ${containerHeight - totalHiddenHeight}px)`;\n }\n\n _handleContainerResize() {\n this._adjustMessagesAreaHeight();\n this._adjustSendButtonWidth();\n //console.log('Container resized');\n }\n\n _adjustSendButtonWidth() {\n const sendButtonText = this._sendButton.textContent.trim();\n const fontSize = parseFloat(getComputedStyle(this._sendButton).fontSize);\n const minWidth = fontSize * sendButtonText.length + 16;\n this._sendButton.style.minWidth = `${minWidth}px`;\n }\n \n messageAddFull(input = {content: \"\", userString: \"user\", align : \"right\", role : \"user\", userID : -1}) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n const userIdClass = 'quikchat-userid-' + String(input.userString).padStart(10, '0'); // hash this..\n messageDiv.classList.add('quikchat-message', msgidClass);\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n \n const userDiv = document.createElement('div');\n userDiv.innerHTML = input.userString;\n userDiv.style = `width: 100%; text-align: ${input.align}; font-size: 1em; font-weight:700;`;\n\n const contentDiv = document.createElement('div');\n contentDiv.style = `width: 100%; text-align: ${input.align};`;\n contentDiv.innerHTML = input.content;\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n this._messagesArea.appendChild(messageDiv);\n //this._messagesArea.lastChild.scrollIntoView();\n this._messagesArea.lastElementChild.scrollIntoView()\n\n this._textEntry.value = '';\n this._adjustMessagesAreaHeight();\n const timestamp = new Date().toISOString();\n const updatedtime = timestamp;\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, timestamp, updatedtime, messageDiv});\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n };\n return msgid;\n }\n messageAddNew(content=\"\", userString=\"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull( \n {content: content, userString: userString, align: align, role: role}\n );\n }\n messageRemove(n) {\n // use css selector to remove the message\n let sucess = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n sucess = true;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n if (sucess) {\n // slow way to remove from history\n //this._history = this._history.filter((item) => item.msgid !== n); // todo make this more efficient\n\n // better way to delete this from history\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n }\n return sucess;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n // now use css selector to get the message \n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return msg; \n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\"\n // now use css selector to get the message \n try {\n // get from history..\n content = this._history.filter((item) => item.msgid === n)[0].content;\n //content = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.textContent;\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return content; \n }\n\n /* append message to the message content\n */\n messageAppendContent(n, content) {\n let sucess = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML += content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n sucess = true;\n //this._messagesArea.lastChild.scrollIntoView();\n this._messagesArea.lastElementChild.scrollIntoView()\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n } \n }\n /* replace message content\n */\n messageReplaceContent(n, content) {\n let sucess = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML = content;\n // update history\n this._history.filter((item) => item.msgid === n)[0].content = content;\n sucess = true;\n } \n catch (error) \n {\n console.log(`{String(n)} : Message ID not found`);\n }\n return sucess;\n }\n // history functions\n /**\n * \n * @param {*} n \n * @param {*} m \n * @returns array of history messages\n */\n historyGet(n,m) {\n\n if (n == undefined) {\n n = 0;\n m= this._history.length;\n }\n if (m === undefined) {\n m = n < 0 ? m: n + 1;\n }\n // remember that entries could be deleted. TODO: So we need to return the actual history entries\n // so now we need to find the array index that correspondes to messageIds n (start) and m (end)\n \n return this._history.slice(n,m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n } \n\n historyGetLength() {\n return this._history.length;\n } \n\n historyGetMessage(n) {\n if ( n>=0 && n < this._history.length) {\n this._history[n];\n }\n return {};\n\n } \n\n historyGetMessageContent(n) {\n return this._history[n].message;\n }\n\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return {\"version\" : \"1.0.4\", \"license\" : \"BSD-2\", \"url\" :\"https://github/deftio/quikchat\"};\n }\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","meta","arguments","length","undefined","theme","onSend","trackHistory","titleArea","title","show","align","_classCallCheck","document","querySelector","_parentElement","_theme","_onSend","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","_attachEventListeners","_historyLimit","_history","_createClass","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesArea","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","trim","window","_handleContainerResize","event","shiftKey","keyCode","preventDefault","setCallbackOnSend","callback","setCallbackonMessageAdded","_onMessageAdded","titleAreaToggle","style","display","_adjustMessagesAreaHeight","textAlign","titleAreaGetContents","inputAreaToggle","classList","toggle","inputAreaShow","inputAreaHide","hiddenElements","_toConsumableArray","children","filter","child","contains","totalHiddenHeight","reduce","sum","offsetHeight","containerHeight","height","_adjustSendButtonWidth","sendButtonText","textContent","fontSize","parseFloat","getComputedStyle","minWidth","messageAddFull","input","content","userString","role","userID","messageDiv","createElement","msgidClass","String","padStart","add","userDiv","contentDiv","appendChild","lastElementChild","scrollIntoView","timestamp","Date","toISOString","updatedtime","push","_objectSpread","shift","messageAddNew","messageRemove","n","sucess","removeChild","error","console","log","splice","findIndex","item","messageGetDOMObject","msg","messageGetContent","messageAppendContent","lastChild","messageReplaceContent","historyGet","m","slice","historyClear","historyGetLength","historyGetMessage","historyGetMessageContent","message","changeTheme","newTheme","remove","get","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quikchat.umd.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n * \n * @param string or DOM element parentElement \n * @param {*} meta \n */\n constructor(parentElement, onSend = () => { }, options = {}) {\n const defaultOpts = {\n theme: 'quikchat-theme-light',\n trackHistory: true,\n titleArea: { title: \"Chat\", show: false, align: \"center\" },\n messagesArea: { alternating: true },\n };\n const meta = { ...defaultOpts, ...options }; // merge options with defaults\n\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n //console.log(parentElement, meta);\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = onSend ? onSend : () => { }; // call back function for onSend\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show === true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n // messages area\n if (meta.messagesArea) {\n this.messagesAreaAlternateColors(meta.messagesArea.alternating);\n }\n // plumbing\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory || true;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\">\n <span style=\"font-size: 1.5em; font-weight: 600;\">Title Area</span>\n </div>\n <div class=\"quikchat-messages-area\"></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n /**\n * Attach event listeners to the widget\n */\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => this._onSend(this, this._textEntry.value.trim()));\n window.addEventListener('resize', () => this._handleContainerResize());\n this._chatWidget.addEventListener('resize', () => this._handleContainerResize());\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n // Prevent default behavior (adding new line)\n event.preventDefault();\n this._onSend(this, this._textEntry.value.trim());\n }\n });\n\n this._messagesArea.addEventListener('scroll', () => {\n const { scrollTop, scrollHeight, clientHeight } = this._messagesArea;\n this.userScrolledUp = scrollTop + clientHeight < scrollHeight;\n });\n }\n \n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n this._titleArea.style.display === 'none' ? this.titleAreaShow() : this.titleAreaHide();\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n this._inputArea.classList.toggle('hidden');\n this._inputArea.style.display === 'none' ? this.inputAreaShow() : this.inputAreaHide();\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n this._adjustMessagesAreaHeight();\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n this._adjustMessagesAreaHeight();\n }\n\n _adjustMessagesAreaHeight() {\n const hiddenElements = [...this._chatWidget.children].filter(child => child.classList.contains('hidden'));\n const totalHiddenHeight = hiddenElements.reduce((sum, child) => sum + child.offsetHeight, 0);\n const containerHeight = this._chatWidget.offsetHeight;\n this._messagesArea.style.height = `calc(100% - ${containerHeight - totalHiddenHeight}px)`;\n }\n\n _handleContainerResize() {\n this._adjustMessagesAreaHeight();\n this._adjustSendButtonWidth();\n //console.log('Container resized');\n }\n\n _adjustSendButtonWidth() {\n const sendButtonText = this._sendButton.textContent.trim();\n const fontSize = parseFloat(getComputedStyle(this._sendButton).fontSize);\n const minWidth = fontSize * sendButtonText.length + 16;\n this._sendButton.style.minWidth = `${minWidth}px`;\n }\n\n //messagesArea functions\n messagesAreaAlternateColors(alt = true) {\n if (alt) {\n this._messagesArea.classList.add('quikchat-messages-area-alt');\n }\n else {\n this._messagesArea.classList.remove('quikchat-messages-area-alt');\n }\n return alt === true;\n }\n messagesAreaAlternateColorsToggle() {\n this._messagesArea.classList.toggle('quikchat-messages-area-alt');\n }\n messagesAreaAlternateColorsGet() {\n return this._messagesArea.classList.contains('quikchat-messages-area-alt');\n }\n // message functions\n messageAddFull(input = { content: \"\", userString: \"user\", align: \"right\", role: \"user\", userID: -1 }) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n const userIdClass = 'quikchat-userid-' + String(input.userString).padStart(10, '0'); // hash this..\n messageDiv.classList.add('quikchat-message', msgidClass);\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n\n const userDiv = document.createElement('div');\n userDiv.innerHTML = input.userString;\n userDiv.style = `width: 100%; text-align: ${input.align}; font-size: 1em; font-weight:700;`;\n\n const contentDiv = document.createElement('div');\n contentDiv.style = `width: 100%; text-align: ${input.align};`;\n contentDiv.innerHTML = input.content;\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n this._messagesArea.appendChild(messageDiv);\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n\n this._textEntry.value = '';\n this._adjustMessagesAreaHeight();\n const timestamp = new Date().toISOString();\n const updatedtime = timestamp;\n\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, timestamp, updatedtime, messageDiv });\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n }\n\n return msgid;\n }\n\n \n messageAddNew(content = \"\", userString = \"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull(\n { content: content, userString: userString, align: align, role: role }\n );\n }\n messageRemove(n) {\n // use css selector to remove the message\n let sucess = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n sucess = true;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n if (sucess) {\n // slow way to remove from history\n //this._history = this._history.filter((item) => item.msgid !== n); // todo make this more efficient\n\n // better way to delete this from history\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n }\n return sucess;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n // now use css selector to get the message \n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n return msg;\n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\"\n // now use css selector to get the message \n try {\n // get from history..\n content = this._history.filter((item) => item.msgid === n)[0].content;\n //content = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.textContent;\n }\n catch (error) {\n console.log(`{String(n)} : Message ID not found`);\n }\n return content;\n }\n\n /* append message to the message content\n */\n\n messageAppendContent(n, content) {\n let success = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML += content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n success = true;\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n } catch (error) {\n console.log(`${String(n)} : Message ID not found`);\n }\n return success;\n }\n \n /* replace message content\n */\n messageReplaceContent(n, content) {\n let success = false;\n try {\n this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`).lastChild.innerHTML = content;\n // update history\n let item = this._history.filter((item) => item.msgid === n)[0];\n item.content = content;\n item.updatedtime = new Date().toISOString();\n success = true;\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.lastElementChild.scrollIntoView();\n }\n } catch (error) {\n console.log(`${String(n)} : Message ID not found`);\n }\n return success;\n }\n \n // history functions\n /**\n * \n * @param {*} n \n * @param {*} m \n * @returns array of history messages\n */\n historyGet(n, m) {\n\n if (n == undefined) {\n n = 0;\n m = this._history.length;\n }\n if (m === undefined) {\n m = n < 0 ? m : n + 1;\n }\n // remember that entries could be deleted. TODO: So we need to return the actual history entries\n // so now we need to find the array index that correspondes to messageIds n (start) and m (end)\n\n return this._history.slice(n, m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n }\n\n historyGetLength() {\n return this._history.length;\n }\n\n historyGetMessage(n) {\n if (n >= 0 && n < this._history.length) {\n this._history[n];\n }\n return {};\n\n }\n\n historyGetMessageContent(n) {\n return this._history[n].message;\n }\n\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return { \"version\": \"1.1.2\", \"license\": \"BSD-2\", \"url\": \"https://github/deftio/quikchat\" };\n }\n\n /**\n * quikchat.loremIpsum() - Generate a simple string of Lorem Ipsum text (sample typographer's text) of numChars in length.\n * borrowed from github.com/deftio/bitwrench.js\n * @param {number} numChars - The number of characters to generate (random btw 25 and 150 if undefined). \n * @param {number} [startSpot=0] - The starting index in the Lorem Ipsum text. If undefined, a random startSpot will be generated.\n * @param {boolean} [startWithCapitalLetter=true] - If true, capitalize the first character or inject a capital letter if the first character isn't a capital letter.\n * \n * @returns {string} A string of Lorem Ipsum text.\n * \n * @example \n * // Returns 200 characters of Lorem Ipsum starting from index 50\n * loremIpsum(200, 50);\n * \n * @example \n * //Returns a 200 Lorem Ipsum characters starting from a random index\n * loremIpsum(200);\n */\n\n static loremIpsum(numChars, startSpot = undefined, startWithCapitalLetter = true) {\n const loremText = \"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. \";\n\n if (typeof numChars !== \"number\") {\n numChars = Math.floor(Math.random() * (150)) + 25;\n }\n\n if (startSpot === undefined) {\n startSpot = Math.floor(Math.random() * loremText.length);\n }\n\n startSpot = startSpot % loremText.length;\n\n // Move startSpot to the next non-whitespace and non-punctuation character\n while (loremText[startSpot] === ' ' || /[.,:;!?]/.test(loremText[startSpot])) {\n startSpot = (startSpot + 1) % loremText.length;\n }\n\n let l = loremText.substring(startSpot) + loremText.substring(0, startSpot);\n\n if (typeof numChars !== \"number\") {\n numChars = l.length;\n }\n\n let s = \"\";\n while (numChars > 0) {\n s += numChars < l.length ? l.substring(0, numChars) : l;\n numChars -= l.length;\n }\n\n if (s[s.length - 1] === \" \") {\n s = s.substring(0, s.length - 1) + \".\"; // always end on non-whitespace. \".\" was chosen arbitrarily.\n }\n\n if (startWithCapitalLetter) {\n let c = s[0].toUpperCase();\n c = /[A-Z]/.test(c) ? c : \"M\";\n s = c + s.substring(1);\n }\n\n return s;\n };\n\n\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","onSend","arguments","length","undefined","options","_classCallCheck","defaultOpts","theme","trackHistory","titleArea","title","show","align","messagesArea","alternating","meta","_objectSpread","document","querySelector","_parentElement","_theme","_onSend","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","messagesAreaAlternateColors","_attachEventListeners","_historyLimit","_history","_createClass","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesArea","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","trim","window","_handleContainerResize","event","shiftKey","keyCode","preventDefault","_this$_messagesArea","scrollTop","scrollHeight","clientHeight","userScrolledUp","setCallbackOnSend","callback","setCallbackonMessageAdded","_onMessageAdded","titleAreaToggle","style","display","_adjustMessagesAreaHeight","textAlign","titleAreaGetContents","inputAreaToggle","classList","toggle","inputAreaShow","inputAreaHide","hiddenElements","_toConsumableArray","children","filter","child","contains","totalHiddenHeight","reduce","sum","offsetHeight","containerHeight","height","_adjustSendButtonWidth","sendButtonText","textContent","fontSize","parseFloat","getComputedStyle","minWidth","alt","add","remove","messagesAreaAlternateColorsToggle","messagesAreaAlternateColorsGet","messageAddFull","input","content","userString","role","userID","messageDiv","createElement","msgidClass","String","padStart","userDiv","contentDiv","appendChild","lastElementChild","scrollIntoView","timestamp","Date","toISOString","updatedtime","push","shift","messageAddNew","messageRemove","n","sucess","removeChild","error","console","log","splice","findIndex","item","messageGetDOMObject","msg","messageGetContent","messageAppendContent","success","lastChild","messageReplaceContent","historyGet","m","slice","historyClear","historyGetLength","historyGetMessage","historyGetMessageContent","message","changeTheme","newTheme","get","version","loremIpsum","numChars","startSpot","startWithCapitalLetter","loremText","Math","floor","random","test","l","substring","s","c","toUpperCase"],"mappings":"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"}
|