@ihoomanai/chat-widget 2.0.1 → 2.1.0
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/cdn/SRI_HASHES.md +8 -8
- package/cdn/health.json +3 -3
- package/cdn/latest/chat.js +103 -17
- package/cdn/latest/chat.js.map +1 -1
- package/cdn/latest/chat.min.js +1 -1
- package/cdn/latest/chat.min.js.map +1 -1
- package/cdn/manifest.json +10 -10
- package/cdn/v2/chat.js +103 -17
- package/cdn/v2/chat.js.map +1 -1
- package/cdn/v2/chat.min.js +1 -1
- package/cdn/v2/chat.min.js.map +1 -1
- package/cdn/{v2.0.0 → v2.0.2}/chat.js +103 -17
- package/cdn/v2.0.2/chat.js.map +1 -0
- package/cdn/{v2.0.0 → v2.0.2}/chat.min.js +1 -1
- package/cdn/v2.0.2/chat.min.js.map +1 -0
- package/dist/index.cjs.js +163 -24
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +163 -24
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.umd.js +163 -24
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/widget.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/types.ts +7 -1
- package/src/widget.ts +171 -25
- package/cdn/CDN_DEPLOYMENT.md +0 -199
- package/cdn/cloudflare-config.json +0 -203
- package/cdn/cloudfront-config.json +0 -153
- package/cdn/nginx.conf +0 -185
- package/cdn/v2.0.0/chat.js.map +0 -1
- package/cdn/v2.0.0/chat.min.js.map +0 -1
package/dist/index.umd.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).IhoomanChat={})}(this,function(e){"use strict";const n={serverUrl:"https://api.ihooman.ai",theme:"light",position:"bottom-right",title:"Chat Support",subtitle:"We typically reply within minutes",welcomeMessage:"Hi there! 👋 How can we help you today?",placeholder:"Type a message...",primaryColor:"#00aeff",gradientFrom:"#00aeff",gradientTo:"#0066ff",showTimestamps:!0,showTypingIndicator:!0,enableSounds:!0,enableFileUpload:!0,startOpen:!1,persistSession:!0,zIndex:9999,width:380,height:560,buttonSize:60,borderRadius:16,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',avatarUrl:"",poweredBy:!0},t='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>',o='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>',i='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>',a='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path></svg>',s='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line></svg>',r='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>',d='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="10" rx="2"></rect><circle cx="12" cy="5" r="2"></circle><path d="M12 7v4"></path></svg>';let l={widgetId:"",...n},c={isOpen:!1,isConnected:!1,messages:[],sessionId:null,visitorId:null,unreadCount:0},p={};const h={};let m=null,g=null,u=0;function f(e=""){return e+Math.random().toString(36).slice(2,14)+Date.now().toString(36)}function b(e){const n=document.createElement("div");return n.textContent=e,n.innerHTML}function V(e,n){const t="ihooman_chat_"+e;try{if(void 0===n){const e=localStorage.getItem(t);return e?JSON.parse(e):null}return null===n?(localStorage.removeItem(t),null):(localStorage.setItem(t,JSON.stringify(n)),n)}catch{return null}}function x(e,n){(h[e]||[]).forEach(t=>{try{t(n)}catch(n){console.error(`Error in ${e} event handler:`,n)}});const t=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`,o=l[t];if("function"==typeof o)try{o(n)}catch(e){console.error(`Error in ${t} callback:`,e)}}function y(){const e=document.createElement("style");e.id="ihooman-widget-styles",e.textContent=function(){const{primaryColor:e,gradientFrom:n,gradientTo:t,fontFamily:o,borderRadius:i,zIndex:a,width:s,height:r,buttonSize:d}=l,c="dark"===l.theme,p=c?"#1a1a2e":"#ffffff",h=c?"#e4e4e7":"#1f2937",m=c?"#71717a":"#6b7280",g=c?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.08)",u=c?"#16162a":"#f9fafb",f=`linear-gradient(135deg, ${n}, ${t})`,b=c?"#252542":"#f1f5f9",V=l.position?.includes("right")??!0,x=l.position?.includes("bottom")??!0;return`\n .ihooman-widget * { box-sizing: border-box; margin: 0; padding: 0; }\n .ihooman-widget { font-family: ${o}; font-size: 14px; line-height: 1.5; color: ${h}; -webkit-font-smoothing: antialiased; }\n .ihooman-toggle { position: fixed; ${V?"right: 20px":"left: 20px"}; ${x?"bottom: 20px":"top: 20px"}; width: ${d}px; height: ${d}px; border-radius: 50%; background: linear-gradient(135deg, ${n}, ${t}); border: none; cursor: pointer; z-index: ${a}; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 20px rgba(0, 174, 255, 0.35); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; }\n .ihooman-toggle:hover { transform: scale(1.08); box-shadow: 0 6px 28px rgba(0, 174, 255, 0.45); }\n .ihooman-toggle:active { transform: scale(0.95); }\n .ihooman-toggle::before { content: ''; position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(255,255,255,0.2), transparent); border-radius: 50%; }\n .ihooman-toggle svg { width: 26px; height: 26px; color: white; transition: transform 0.3s ease, opacity 0.2s ease; position: relative; z-index: 1; }\n .ihooman-toggle.open svg.chat-icon { transform: rotate(90deg) scale(0); opacity: 0; }\n .ihooman-toggle.open svg.close-icon { transform: rotate(0) scale(1); opacity: 1; }\n .ihooman-toggle svg.close-icon { position: absolute; transform: rotate(-90deg) scale(0); opacity: 0; }\n .ihooman-pulse { position: absolute; inset: 0; border-radius: 50%; background: ${e}; animation: ihooman-pulse 2s ease-out infinite; }\n @keyframes ihooman-pulse { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.6); opacity: 0; } }\n .ihooman-toggle.open .ihooman-pulse { display: none; }\n .ihooman-badge { position: absolute; top: -4px; right: -4px; min-width: 20px; height: 20px; padding: 0 6px; background: #ef4444; color: white; font-size: 11px; font-weight: 600; border-radius: 10px; display: flex; align-items: center; justify-content: center; z-index: 2; }\n .ihooman-badge:empty { display: none; }\n .ihooman-window { position: fixed; ${V?"right: 20px":"left: 20px"}; ${x?"bottom: 90px":"top: 90px"}; width: ${s}px; height: ${r}px; max-height: calc(100vh - 120px); z-index: ${(a??9999)-1}; display: flex; flex-direction: column; opacity: 0; visibility: hidden; transform: translateY(20px) scale(0.95); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .ihooman-window.open { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }\n .ihooman-container { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; border-radius: ${i}px; overflow: hidden; }\n .ihooman-container::before { content: ''; position: absolute; inset: 0; background: ${p}; opacity: 0.97; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-radius: ${i}px; border: 1px solid ${g}; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); }\n .ihooman-container > * { position: relative; z-index: 1; }\n .ihooman-header { padding: 16px 20px; background: linear-gradient(135deg, ${n}, ${t}); color: white; display: flex; align-items: center; gap: 12px; flex-shrink: 0; }\n .ihooman-header-avatar { width: 42px; height: 42px; border-radius: 50%; background: rgba(255,255,255,0.2); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n .ihooman-header-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }\n .ihooman-header-avatar svg { width: 22px; height: 22px; }\n .ihooman-header-info { flex: 1; min-width: 0; }\n .ihooman-header-title { font-size: 16px; font-weight: 600; margin-bottom: 2px; }\n .ihooman-header-status { display: flex; align-items: center; gap: 6px; font-size: 12px; opacity: 0.9; }\n .ihooman-status-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; }\n .ihooman-status-dot.offline { background: #f59e0b; }\n .ihooman-header-actions { display: flex; gap: 8px; }\n .ihooman-header-btn { width: 32px; height: 32px; border-radius: 8px; background: rgba(255,255,255,0.15); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; color: white; transition: background 0.2s; }\n .ihooman-header-btn:hover { background: rgba(255,255,255,0.25); }\n .ihooman-header-btn svg { width: 16px; height: 16px; }\n .ihooman-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; background: ${p}; }\n .ihooman-messages::-webkit-scrollbar { width: 6px; }\n .ihooman-messages::-webkit-scrollbar-track { background: transparent; }\n .ihooman-messages::-webkit-scrollbar-thumb { background: ${g}; border-radius: 3px; }\n .ihooman-message { display: flex; flex-direction: column; max-width: 85%; animation: ihooman-fadeIn 0.3s ease; }\n @keyframes ihooman-fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n .ihooman-message.user { align-self: flex-end; align-items: flex-end; }\n .ihooman-message.bot { align-self: flex-start; align-items: flex-start; }\n .ihooman-message-content { padding: 12px 16px; border-radius: 16px; word-wrap: break-word; }\n .ihooman-message.user .ihooman-message-content { background: ${f}; color: white; border-bottom-right-radius: 4px; }\n .ihooman-message.bot .ihooman-message-content { background: ${b}; color: ${h}; border-bottom-left-radius: 4px; }\n .ihooman-message-content code { background: rgba(0,0,0,0.1); padding: 2px 6px; border-radius: 4px; font-family: monospace; font-size: 13px; }\n .ihooman-message-time { font-size: 11px; color: ${m}; margin-top: 4px; padding: 0 4px; }\n .ihooman-typing { display: flex; align-items: center; gap: 8px; padding: 12px 16px; background: ${b}; border-radius: 16px; border-bottom-left-radius: 4px; max-width: 80px; align-self: flex-start; }\n .ihooman-typing-dots { display: flex; gap: 4px; }\n .ihooman-typing-dot { width: 8px; height: 8px; background: ${m}; border-radius: 50%; animation: ihooman-typing 1.4s infinite; }\n .ihooman-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .ihooman-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n @keyframes ihooman-typing { 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } 30% { transform: translateY(-4px); opacity: 1; } }\n .ihooman-input-area { padding: 12px 16px; background: ${p}; border-top: 1px solid ${g}; flex-shrink: 0; }\n .ihooman-input-wrapper { display: flex; align-items: flex-end; gap: 8px; background: ${u}; border: 1px solid ${g}; border-radius: 12px; padding: 8px 12px; transition: border-color 0.2s, box-shadow 0.2s; }\n .ihooman-input-wrapper:focus-within { border-color: ${e}; box-shadow: 0 0 0 3px rgba(0, 174, 255, 0.1); }\n .ihooman-input { flex: 1; border: none; background: transparent; font-family: inherit; font-size: 14px; color: ${h}; resize: none; max-height: 100px; outline: none; line-height: 1.4; }\n .ihooman-input::placeholder { color: ${m}; }\n .ihooman-input-btn { width: 36px; height: 36px; border-radius: 10px; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s; background: transparent; color: ${m}; }\n .ihooman-input-btn:hover { background: ${g}; color: ${h}; }\n .ihooman-input-btn.send { background: linear-gradient(135deg, ${n}, ${t}); color: white; }\n .ihooman-input-btn.send:hover { transform: scale(1.05); box-shadow: 0 4px 12px rgba(0, 174, 255, 0.3); }\n .ihooman-input-btn.send:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n .ihooman-input-btn svg { width: 18px; height: 18px; }\n .ihooman-file-input { display: none; }\n .ihooman-powered { text-align: center; padding: 8px; font-size: 11px; color: ${m}; background: ${p}; }\n .ihooman-powered a { color: ${e}; text-decoration: none; }\n .ihooman-error { padding: 16px; text-align: center; color: #ef4444; background: ${p}; }\n @media (max-width: 480px) { .ihooman-window { width: calc(100vw - 20px); height: calc(100vh - 100px); left: 10px; right: 10px; bottom: 80px; max-height: none; } .ihooman-toggle { ${V?"right: 16px":"left: 16px"}; bottom: 16px; } }\n `}(),document.head.appendChild(e);const n=document.createElement("div");n.className="ihooman-widget",n.innerHTML=`\n <button class="ihooman-toggle" aria-label="Open chat">\n <span class="ihooman-pulse"></span>\n <span class="ihooman-badge"></span>\n <span class="chat-icon">${t}</span>\n <span class="close-icon">${o}</span>\n </button>\n <div class="ihooman-window" role="dialog" aria-label="Chat window">\n <div class="ihooman-container">\n <div class="ihooman-header">\n <div class="ihooman-header-avatar">${l.avatarUrl?`<img src="${b(l.avatarUrl)}" alt="Support">`:d}</div>\n <div class="ihooman-header-info">\n <div class="ihooman-header-title">${b(l.title||"Chat Support")}</div>\n <div class="ihooman-header-status"><span class="ihooman-status-dot"></span><span class="ihooman-status-text">Online</span></div>\n </div>\n <div class="ihooman-header-actions">\n <button class="ihooman-header-btn" data-action="refresh" title="New conversation">${r}</button>\n <button class="ihooman-header-btn" data-action="minimize" title="Minimize">${s}</button>\n </div>\n </div>\n <div class="ihooman-messages" role="log" aria-live="polite"></div>\n <div class="ihooman-input-area">\n <div class="ihooman-input-wrapper">\n ${l.enableFileUpload?`<button class="ihooman-input-btn attach" title="Attach file">${a}</button><input type="file" class="ihooman-file-input">`:""}\n <textarea class="ihooman-input" placeholder="${b(l.placeholder||"Type a message...")}" rows="1" aria-label="Message input"></textarea>\n <button class="ihooman-input-btn send" title="Send message" disabled>${i}</button>\n </div>\n </div>\n ${l.poweredBy?'<div class="ihooman-powered">Powered by <a href="https://ihooman.ai" target="_blank" rel="noopener">Ihooman AI</a></div>':""}\n </div>\n </div>\n `,document.body.appendChild(n),p={widget:n,toggle:n.querySelector(".ihooman-toggle"),badge:n.querySelector(".ihooman-badge"),window:n.querySelector(".ihooman-window"),messages:n.querySelector(".ihooman-messages"),input:n.querySelector(".ihooman-input"),sendBtn:n.querySelector(".ihooman-input-btn.send"),attachBtn:n.querySelector(".ihooman-input-btn.attach"),fileInput:n.querySelector(".ihooman-file-input"),statusDot:n.querySelector(".ihooman-status-dot"),statusText:n.querySelector(".ihooman-status-text")},function(){if(!p.toggle||!p.sendBtn||!p.input)return;p.toggle.addEventListener("click",B),p.sendBtn.addEventListener("click",$),p.input.addEventListener("input",()=>{p.sendBtn&&(p.sendBtn.disabled=!p.input?.value.trim()),p.input&&(p.input.style.height="auto",p.input.style.height=Math.min(p.input.scrollHeight,100)+"px")}),p.input.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),p.sendBtn?.disabled||$())}),p.attachBtn&&p.fileInput&&(p.attachBtn.addEventListener("click",()=>p.fileInput?.click()),p.fileInput.addEventListener("change",k));p.widget?.querySelector('[data-action="refresh"]')?.addEventListener("click",_),p.widget?.querySelector('[data-action="minimize"]')?.addEventListener("click",U)}()}function w(e,n="bot",t={}){const o={id:f("msg_"),content:e,sender:n,timestamp:new Date,metadata:t};if(c.messages.push(o),!p.messages)return o;const i=document.createElement("div");var a,s;i.className=`ihooman-message ${n}`,i.innerHTML=`\n <div class="ihooman-message-content">${s=e,s?b(s).replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\*(.*?)\*/g,"<em>$1</em>").replace(/`(.*?)`/g,"<code>$1</code>").replace(/\n/g,"<br>"):""}</div>\n ${l.showTimestamps?`<div class="ihooman-message-time">${a=o.timestamp,new Date(a).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}</div>`:""}\n `;const r=p.messages.querySelector(".ihooman-typing");return r&&r.remove(),p.messages.appendChild(i),p.messages.scrollTop=p.messages.scrollHeight,"bot"!==n||c.isOpen||(c.unreadCount++,p.badge&&(p.badge.textContent=String(c.unreadCount)),l.enableSounds&&function(){try{const e=new Audio("data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAABhgC7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7//////////////////////////////////////////////////////////////////8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAAAAAAAAAAAAYYNBrP/AAAAAAAAAAAAAAAAAAAAAP/7UMQAA8AAAaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxBKDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=");e.volume=.3,e.play().catch(()=>{})}catch{}}()),x("message",o),o}function A(){if(!l.showTypingIndicator||!p.messages)return;if(p.messages.querySelector(".ihooman-typing"))return;const e=document.createElement("div");e.className="ihooman-typing",e.innerHTML='<div class="ihooman-typing-dots"><span class="ihooman-typing-dot"></span><span class="ihooman-typing-dot"></span><span class="ihooman-typing-dot"></span></div>',p.messages.appendChild(e),p.messages.scrollTop=p.messages.scrollHeight}function v(){const e=p.messages?.querySelector(".ihooman-typing");e&&e.remove()}function $(){const e=p.input?.value.trim();e&&(p.input&&(p.input.value="",p.input.style.height="auto"),p.sendBtn&&(p.sendBtn.disabled=!0),w(e,"user"),A(),async function(e){try{const n=await fetch(`${l.serverUrl}/api/v1/public/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:e,session_id:c.sessionId,visitor_id:c.visitorId,widget_id:l.widgetId})}),t=await n.json();v(),t.session_id&&(c.sessionId=t.session_id,l.persistSession&&V("session_id",c.sessionId)),t.response&&w(t.response,"bot",{sources:t.sources,confidence:t.confidence})}catch(e){v(),w("Sorry, something went wrong. Please try again.","bot"),x("error",e)}}(e))}function k(e){const n=e.target,t=n.files?.[0];if(!t)return;w(`📎 Uploading: ${t.name}...`,"user"),A();const o=new FormData;o.append("file",t),o.append("session_id",c.sessionId||""),o.append("visitor_id",c.visitorId||""),o.append("widget_id",l.widgetId),fetch(`${l.serverUrl}/api/upload`,{method:"POST",body:o}).then(e=>e.json()).then(e=>{v(),e.message&&w(e.message,"bot")}).catch(()=>{v(),w("Failed to upload file.","bot")}),n.value=""}function I(e){if(l.widgetId)return void S();if(!l.serverUrl&&!e)return;const n=e||l.serverUrl?.replace(/^http/,"ws")+"/ws";try{m=new WebSocket(n),m.onopen=()=>{c.isConnected=!0,u=0,C(!0),m&&m.readyState===WebSocket.OPEN&&m.send(JSON.stringify({type:"connect",widget_id:l.widgetId,visitor_id:c.visitorId,session_id:c.sessionId}))},m.onclose=()=>{if(c.isConnected=!1,C(!1),u<5){u++;const n=Math.min(1e3*Math.pow(2,u),3e4);setTimeout(()=>I(e),n)}else S()},m.onerror=()=>{},m.onmessage=e=>{try{const n=JSON.parse(e.data);"message"===n.type?(v(),w(n.content,n.sender_type||"bot",n.metadata)):"typing"===n.type&&(n.is_typing?A():v())}catch{}}}catch{S()}}function S(){g||(g=setInterval(async()=>{if(c.sessionId)try{const e=await fetch(`${l.serverUrl}/api/messages?session_id=${c.sessionId}&since=${Date.now()-5e3}&widget_id=${l.widgetId}`),n=await e.json();n.messages&&n.messages.forEach(e=>{c.messages.find(n=>n.id===e.id)||w(e.content,e.sender_type,e.metadata)})}catch{}},5e3))}function C(e){p.statusDot&&p.statusDot.classList.toggle("offline",!e),p.statusText&&(p.statusText.textContent=e?"Online":"Offline")}function T(){c.isOpen||(c.isOpen=!0,c.unreadCount=0,p.badge&&(p.badge.textContent=""),p.toggle&&p.toggle.classList.add("open"),p.window&&p.window.classList.add("open"),setTimeout(()=>p.input?.focus(),300),x("open"))}function U(){c.isOpen&&(c.isOpen=!1,p.toggle&&p.toggle.classList.remove("open"),p.window&&p.window.classList.remove("open"),x("close"))}function B(){c.isOpen?U():T()}function _(){c.sessionId=null,c.messages=[],V("session_id",null),p.messages&&(p.messages.innerHTML=""),l.welcomeMessage&&w(l.welcomeMessage,"bot")}async function M(e){if(!e.widgetId)return console.error("IhoomanChat: widgetId is required"),null;l={...n,...e},c.visitorId=V("visitor_id")||f("v_"),V("visitor_id",c.visitorId),l.persistSession&&(c.sessionId=V("session_id"));const t=l.serverUrl||"https://api.ihooman.ai",o=await async function(e,n){try{const t=await fetch(`${n}/api/widget/config?widget_id=${encodeURIComponent(e)}`);return t.ok?await t.json():{success:!1,error:(await t.json().catch(()=>({}))).error||`HTTP ${t.status}`}}catch(e){return{success:!1,error:"Unable to connect. Please check your internet connection."}}}(l.widgetId,t);let i;var a;return o.success&&o.config?(a=o.config,l.title=a.title||l.title,l.subtitle=a.subtitle||l.subtitle,l.welcomeMessage=a.welcomeMessage||l.welcomeMessage,l.placeholder=a.placeholder||l.placeholder,l.position=a.position||l.position,a.theme&&(l.primaryColor=a.theme.primaryColor||l.primaryColor,l.gradientFrom=a.theme.gradientFrom||l.gradientFrom,l.gradientTo=a.theme.gradientTo||l.gradientTo,l.fontFamily=a.theme.fontFamily||l.fontFamily,a.theme.borderRadius&&(l.borderRadius=parseInt(a.theme.borderRadius,10)||l.borderRadius)),a.behavior&&(l.startOpen=a.behavior.startOpen??l.startOpen,l.showTypingIndicator=a.behavior.showTypingIndicator??l.showTypingIndicator,l.showTimestamps=a.behavior.showTimestamps??l.showTimestamps,l.enableSounds=a.behavior.enableSounds??l.enableSounds,l.enableFileUpload=a.behavior.enableFileUpload??l.enableFileUpload,l.persistSession=a.behavior.persistSession??l.persistSession),a.branding&&(l.avatarUrl=a.branding.avatarUrl||l.avatarUrl,l.poweredBy=a.branding.poweredBy??l.poweredBy),i=o.chatEndpoint):o.error&&(console.warn("IhoomanChat: Could not fetch server config:",o.error),"Widget not authorized for this domain"===o.error&&console.error("IhoomanChat: Widget configuration error. Please contact support.")),y(),c.messages.forEach(e=>w(e.content,e.sender,e.metadata)),0===c.messages.length&&l.welcomeMessage&&w(l.welcomeMessage,"bot"),I(i),l.startOpen&&setTimeout(T,500),x("ready"),z}const z={init:M,open:T,close:U,toggle:B,destroy:function(){m&&(m.close(),m=null),g&&(clearInterval(g),g=null),p.widget&&p.widget.remove();const e=document.getElementById("ihooman-widget-styles");e&&e.remove(),c={isOpen:!1,isConnected:!1,messages:[],sessionId:null,visitorId:null,unreadCount:0},p={},u=0},sendMessage:function(e){e.trim()&&(p.input&&(p.input.value=e),$())},setUser:function(e){e.name&&V("user_name",e.name),e.email&&V("user_email",e.email),e.metadata&&V("user_metadata",e.metadata)},clearHistory:function(){_()},on:function(e,n){h[e]||(h[e]=[]),h[e].push(n)},off:function(e,n){h[e]&&(h[e]=h[e].filter(e=>e!==n))},getState:function(){return{...c}},version:"2.0.0"},E=z;!function(){if("undefined"==typeof document)return;let e=document.currentScript;if(!e){const n=document.getElementsByTagName("script");for(let t=0;t<n.length;t++)if(n[t].src&&n[t].src.includes("ihooman")){e=n[t];break}}if(!e)return;const n=e.getAttribute("data-widget-id");if(n){const t={widgetId:n},o=e.getAttribute("data-server-url");o&&(t.serverUrl=o);const i=e.getAttribute("data-theme");"light"!==i&&"dark"!==i||(t.theme=i);const a=e.getAttribute("data-position");a&&(t.position=a);"true"===e.getAttribute("data-start-open")&&(t.startOpen=!0),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>M(t)):M(t)}}(),"undefined"!=typeof window&&(window.IhoomanChat=E),e.IhoomanChat=E,e.createWidgetInstance=function(){return{...z}},e.default=E,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
1
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).IhoomanChat={})}(this,function(e){"use strict";const n={serverUrl:"https://api.ihooman.ai",theme:"light",position:"bottom-right",title:"Chat Support",subtitle:"We typically reply within minutes",welcomeMessage:"Hi there! 👋 How can we help you today?",placeholder:"Type a message...",primaryColor:"#00aeff",gradientFrom:"#00aeff",gradientTo:"#0066ff",showTimestamps:!0,showTypingIndicator:!0,enableSounds:!0,enableFileUpload:!0,startOpen:!1,persistSession:!0,zIndex:9999,width:380,height:560,buttonSize:60,borderRadius:16,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',avatarUrl:"",poweredBy:!0},t='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>',o='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>',i='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>',a='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path></svg>',s='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line></svg>',r='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>',d='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="10" rx="2"></rect><circle cx="12" cy="5" r="2"></circle><path d="M12 7v4"></path></svg>',l='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>',c='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><line x1="10" y1="9" x2="8" y2="9"></line></svg>';let p={widgetId:"",...n},h={isOpen:!1,isConnected:!1,messages:[],sessionId:null,visitorId:null,unreadCount:0},g={};const m={};let u=null,f=null,b=0;function x(e=""){return e+Math.random().toString(36).slice(2,14)+Date.now().toString(36)}function V(e){const n=document.createElement("div");return n.textContent=e,n.innerHTML}function y(e,n){const t="ihooman_chat_"+e;try{if(void 0===n){const e=localStorage.getItem(t);return e?JSON.parse(e):null}return null===n?(localStorage.removeItem(t),null):(localStorage.setItem(t,JSON.stringify(n)),n)}catch{return null}}function w(e,n){(m[e]||[]).forEach(t=>{try{t(n)}catch(n){console.error(`Error in ${e} event handler:`,n)}});const t=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`,o=p[t];if("function"==typeof o)try{o(n)}catch(e){console.error(`Error in ${t} callback:`,e)}}function v(){const e=document.createElement("style");e.id="ihooman-widget-styles",e.textContent=function(){const{primaryColor:e,gradientFrom:n,gradientTo:t,fontFamily:o,borderRadius:i,zIndex:a,width:s,height:r,buttonSize:d}=p,l="dark"===p.theme,c=l?"#1a1a2e":"#ffffff",h=l?"#e4e4e7":"#1f2937",g=l?"#71717a":"#6b7280",m=l?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.08)",u=l?"#16162a":"#f9fafb",f=`linear-gradient(135deg, ${n}, ${t})`,b=l?"#252542":"#f1f5f9",x=p.position?.includes("right")??!0,V=p.position?.includes("bottom")??!0;return`\n .ihooman-widget * { box-sizing: border-box; margin: 0; padding: 0; }\n .ihooman-widget { font-family: ${o}; font-size: 14px; line-height: 1.5; color: ${h}; -webkit-font-smoothing: antialiased; }\n .ihooman-toggle { position: fixed; ${x?"right: 20px":"left: 20px"}; ${V?"bottom: 20px":"top: 20px"}; width: ${d}px; height: ${d}px; border-radius: 50%; background: linear-gradient(135deg, ${n}, ${t}); border: none; cursor: pointer; z-index: ${a}; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 20px rgba(0, 174, 255, 0.35); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; }\n .ihooman-toggle:hover { transform: scale(1.08); box-shadow: 0 6px 28px rgba(0, 174, 255, 0.45); }\n .ihooman-toggle:active { transform: scale(0.95); }\n .ihooman-toggle::before { content: ''; position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(255,255,255,0.2), transparent); border-radius: 50%; }\n .ihooman-toggle svg { width: 26px; height: 26px; color: white; transition: transform 0.3s ease, opacity 0.2s ease; position: relative; z-index: 1; }\n .ihooman-toggle.open svg.chat-icon { transform: rotate(90deg) scale(0); opacity: 0; }\n .ihooman-toggle.open svg.close-icon { transform: rotate(0) scale(1); opacity: 1; }\n .ihooman-toggle svg.close-icon { position: absolute; transform: rotate(-90deg) scale(0); opacity: 0; }\n .ihooman-pulse { position: absolute; inset: 0; border-radius: 50%; background: ${e}; animation: ihooman-pulse 2s ease-out infinite; }\n @keyframes ihooman-pulse { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.6); opacity: 0; } }\n .ihooman-toggle.open .ihooman-pulse { display: none; }\n .ihooman-badge { position: absolute; top: -4px; right: -4px; min-width: 20px; height: 20px; padding: 0 6px; background: #ef4444; color: white; font-size: 11px; font-weight: 600; border-radius: 10px; display: flex; align-items: center; justify-content: center; z-index: 2; }\n .ihooman-badge:empty { display: none; }\n .ihooman-window { position: fixed; ${x?"right: 20px":"left: 20px"}; ${V?"bottom: 90px":"top: 90px"}; width: ${s}px; height: ${r}px; max-height: calc(100vh - 120px); z-index: ${(a??9999)-1}; display: flex; flex-direction: column; opacity: 0; visibility: hidden; transform: translateY(20px) scale(0.95); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .ihooman-window.open { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }\n .ihooman-container { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; border-radius: ${i}px; overflow: hidden; }\n .ihooman-container::before { content: ''; position: absolute; inset: 0; background: ${c}; opacity: 0.97; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-radius: ${i}px; border: 1px solid ${m}; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); }\n .ihooman-container > * { position: relative; z-index: 1; }\n .ihooman-header { padding: 16px 20px; background: linear-gradient(135deg, ${n}, ${t}); color: white; display: flex; align-items: center; gap: 12px; flex-shrink: 0; }\n .ihooman-header-avatar { width: 42px; height: 42px; border-radius: 50%; background: rgba(255,255,255,0.2); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n .ihooman-header-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }\n .ihooman-header-avatar svg { width: 22px; height: 22px; }\n .ihooman-header-info { flex: 1; min-width: 0; }\n .ihooman-header-title { font-size: 16px; font-weight: 600; margin-bottom: 2px; }\n .ihooman-header-status { display: flex; align-items: center; gap: 6px; font-size: 12px; opacity: 0.9; }\n .ihooman-status-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; }\n .ihooman-status-dot.offline { background: #f59e0b; }\n .ihooman-header-actions { display: flex; gap: 8px; }\n .ihooman-header-btn { width: 32px; height: 32px; border-radius: 8px; background: rgba(255,255,255,0.15); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; color: white; transition: background 0.2s; }\n .ihooman-header-btn:hover { background: rgba(255,255,255,0.25); }\n .ihooman-header-btn svg { width: 16px; height: 16px; }\n .ihooman-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; background: ${c}; }\n .ihooman-messages::-webkit-scrollbar { width: 6px; }\n .ihooman-messages::-webkit-scrollbar-track { background: transparent; }\n .ihooman-messages::-webkit-scrollbar-thumb { background: ${m}; border-radius: 3px; }\n .ihooman-message { display: flex; flex-direction: column; max-width: 85%; animation: ihooman-fadeIn 0.3s ease; }\n @keyframes ihooman-fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n .ihooman-message.user { align-self: flex-end; align-items: flex-end; }\n .ihooman-message.bot { align-self: flex-start; align-items: flex-start; }\n .ihooman-message-content { padding: 12px 16px; border-radius: 16px; word-wrap: break-word; }\n .ihooman-message.user .ihooman-message-content { background: ${f}; color: white; border-bottom-right-radius: 4px; }\n .ihooman-message.bot .ihooman-message-content { background: ${b}; color: ${h}; border-bottom-left-radius: 4px; }\n .ihooman-message-content code { background: rgba(0,0,0,0.1); padding: 2px 6px; border-radius: 4px; font-family: monospace; font-size: 13px; }\n .ihooman-message-time { font-size: 11px; color: ${g}; margin-top: 4px; padding: 0 4px; }\n .ihooman-typing { display: flex; align-items: center; gap: 8px; padding: 12px 16px; background: ${b}; border-radius: 16px; border-bottom-left-radius: 4px; max-width: 80px; align-self: flex-start; }\n .ihooman-typing-dots { display: flex; gap: 4px; }\n .ihooman-typing-dot { width: 8px; height: 8px; background: ${g}; border-radius: 50%; animation: ihooman-typing 1.4s infinite; }\n .ihooman-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .ihooman-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n @keyframes ihooman-typing { 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } 30% { transform: translateY(-4px); opacity: 1; } }\n .ihooman-input-area { padding: 12px 16px; background: ${c}; border-top: 1px solid ${m}; flex-shrink: 0; }\n .ihooman-input-wrapper { display: flex; align-items: flex-end; gap: 8px; background: ${u}; border: 1px solid ${m}; border-radius: 12px; padding: 8px 12px; transition: border-color 0.2s, box-shadow 0.2s; }\n .ihooman-input-wrapper:focus-within { border-color: ${e}; box-shadow: 0 0 0 3px rgba(0, 174, 255, 0.1); }\n .ihooman-input { flex: 1; border: none; background: transparent; font-family: inherit; font-size: 14px; color: ${h}; resize: none; max-height: 100px; outline: none; line-height: 1.4; }\n .ihooman-input::placeholder { color: ${g}; }\n .ihooman-input-btn { width: 36px; height: 36px; border-radius: 10px; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s; background: transparent; color: ${g}; }\n .ihooman-input-btn:hover { background: ${m}; color: ${h}; }\n .ihooman-input-btn.send { background: linear-gradient(135deg, ${n}, ${t}); color: white; }\n .ihooman-input-btn.send:hover { transform: scale(1.05); box-shadow: 0 4px 12px rgba(0, 174, 255, 0.3); }\n .ihooman-input-btn.send:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n .ihooman-input-btn svg { width: 18px; height: 18px; }\n .ihooman-file-input { display: none; }\n .ihooman-powered { text-align: center; padding: 8px; font-size: 11px; color: ${g}; background: ${c}; }\n .ihooman-powered a { color: ${e}; text-decoration: none; }\n .ihooman-error { padding: 16px; text-align: center; color: #ef4444; background: ${c}; }\n .ihooman-escalation-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }\n .ihooman-escalation-btn { display: inline-flex; align-items: center; gap: 6px; padding: 10px 16px; border-radius: 8px; border: none; cursor: pointer; font-family: inherit; font-size: 13px; font-weight: 500; transition: all 0.2s ease; }\n .ihooman-escalation-btn svg { width: 16px; height: 16px; }\n .ihooman-escalation-btn.primary { background: linear-gradient(135deg, ${n}, ${t}); color: white; }\n .ihooman-escalation-btn.primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 174, 255, 0.3); }\n .ihooman-escalation-btn.secondary { background: ${l?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.05)"}; color: ${h}; border: 1px solid ${m}; }\n .ihooman-escalation-btn.secondary:hover { background: ${l?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.08)"}; }\n .ihooman-escalation-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n @media (max-width: 480px) { .ihooman-window { width: calc(100vw - 20px); height: calc(100vh - 100px); left: 10px; right: 10px; bottom: 80px; max-height: none; } .ihooman-toggle { ${x?"right: 16px":"left: 16px"}; bottom: 16px; } }\n `}(),document.head.appendChild(e);const n=document.createElement("div");n.className="ihooman-widget",n.innerHTML=`\n <button class="ihooman-toggle" aria-label="Open chat">\n <span class="ihooman-pulse"></span>\n <span class="ihooman-badge"></span>\n <span class="chat-icon">${t}</span>\n <span class="close-icon">${o}</span>\n </button>\n <div class="ihooman-window" role="dialog" aria-label="Chat window">\n <div class="ihooman-container">\n <div class="ihooman-header">\n <div class="ihooman-header-avatar">${p.avatarUrl?`<img src="${V(p.avatarUrl)}" alt="Support">`:d}</div>\n <div class="ihooman-header-info">\n <div class="ihooman-header-title">${V(p.title||"Chat Support")}</div>\n <div class="ihooman-header-status"><span class="ihooman-status-dot"></span><span class="ihooman-status-text">Online</span></div>\n </div>\n <div class="ihooman-header-actions">\n <button class="ihooman-header-btn" data-action="refresh" title="New conversation">${r}</button>\n <button class="ihooman-header-btn" data-action="minimize" title="Minimize">${s}</button>\n </div>\n </div>\n <div class="ihooman-messages" role="log" aria-live="polite"></div>\n <div class="ihooman-input-area">\n <div class="ihooman-input-wrapper">\n ${p.enableFileUpload?`<button class="ihooman-input-btn attach" title="Attach file">${a}</button><input type="file" class="ihooman-file-input">`:""}\n <textarea class="ihooman-input" placeholder="${V(p.placeholder||"Type a message...")}" rows="1" aria-label="Message input"></textarea>\n <button class="ihooman-input-btn send" title="Send message" disabled>${i}</button>\n </div>\n </div>\n ${p.poweredBy?'<div class="ihooman-powered">Powered by <a href="https://ihooman.ai" target="_blank" rel="noopener">Ihooman AI</a></div>':""}\n </div>\n </div>\n `,document.body.appendChild(n),g={widget:n,toggle:n.querySelector(".ihooman-toggle"),badge:n.querySelector(".ihooman-badge"),window:n.querySelector(".ihooman-window"),messages:n.querySelector(".ihooman-messages"),input:n.querySelector(".ihooman-input"),sendBtn:n.querySelector(".ihooman-input-btn.send"),attachBtn:n.querySelector(".ihooman-input-btn.attach"),fileInput:n.querySelector(".ihooman-file-input"),statusDot:n.querySelector(".ihooman-status-dot"),statusText:n.querySelector(".ihooman-status-text")},function(){if(!g.toggle||!g.sendBtn||!g.input)return;g.toggle.addEventListener("click",L),g.sendBtn.addEventListener("click",I),g.input.addEventListener("input",()=>{g.sendBtn&&(g.sendBtn.disabled=!g.input?.value.trim()),g.input&&(g.input.style.height="auto",g.input.style.height=Math.min(g.input.scrollHeight,100)+"px")}),g.input.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),g.sendBtn?.disabled||I())}),g.attachBtn&&g.fileInput&&(g.attachBtn.addEventListener("click",()=>g.fileInput?.click()),g.fileInput.addEventListener("change",T));g.widget?.querySelector('[data-action="refresh"]')?.addEventListener("click",O),g.widget?.querySelector('[data-action="minimize"]')?.addEventListener("click",z)}()}function A(e,n="bot",t={}){const o={id:x("msg_"),content:e,sender:n,timestamp:new Date,metadata:t};if(h.messages.push(o),!g.messages)return o;const i=document.createElement("div");i.className=`ihooman-message ${n}`;const a="bot"===n&&!0===t?.escalation_offered;let s="";var r,d;if(a&&(s=`\n <div class="ihooman-escalation-actions">\n <button class="ihooman-escalation-btn primary" data-action="live-agent">\n ${l}\n <span>Talk to Agent</span>\n </button>\n <button class="ihooman-escalation-btn secondary" data-action="create-ticket">\n ${c}\n <span>Create Ticket</span>\n </button>\n </div>\n `),i.innerHTML=`\n <div class="ihooman-message-content">${d=e,d?V(d).replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\*(.*?)\*/g,"<em>$1</em>").replace(/`(.*?)`/g,"<code>$1</code>").replace(/\n/g,"<br>"):""}</div>\n ${s}\n ${p.showTimestamps?`<div class="ihooman-message-time">${r=o.timestamp,new Date(r).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}</div>`:""}\n `,a){const e=i.querySelector('[data-action="live-agent"]'),n=i.querySelector('[data-action="create-ticket"]');e&&e.addEventListener("click",()=>k("live-agent")),n&&n.addEventListener("click",()=>k("create-ticket"))}const m=g.messages.querySelector(".ihooman-typing");return m&&m.remove(),g.messages.appendChild(i),g.messages.scrollTop=g.messages.scrollHeight,"bot"!==n||h.isOpen||(h.unreadCount++,g.badge&&(g.badge.textContent=String(h.unreadCount)),p.enableSounds&&function(){try{const e=new Audio("data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAABhgC7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7//////////////////////////////////////////////////////////////////8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAAAAAAAAAAAAYYNBrP/AAAAAAAAAAAAAAAAAAAAAP/7UMQAA8AAAaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxBKDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=");e.volume=.3,e.play().catch(()=>{})}catch{}}()),w("message",o),o}function k(e){document.querySelectorAll(".ihooman-escalation-btn").forEach(e=>e.disabled=!0),"live-agent"===e?(A("Connect me with a live agent","user"),$(),C("Connect me with a live agent")):"create-ticket"===e&&(A("I would like to create a support ticket","user"),$(),C("I would like to create a support ticket"))}function $(){if(!p.showTypingIndicator||!g.messages)return;if(g.messages.querySelector(".ihooman-typing"))return;const e=document.createElement("div");e.className="ihooman-typing",e.innerHTML='<div class="ihooman-typing-dots"><span class="ihooman-typing-dot"></span><span class="ihooman-typing-dot"></span><span class="ihooman-typing-dot"></span></div>',g.messages.appendChild(e),g.messages.scrollTop=g.messages.scrollHeight}function S(){const e=g.messages?.querySelector(".ihooman-typing");e&&e.remove()}function I(){const e=g.input?.value.trim();e&&(g.input&&(g.input.value="",g.input.style.height="auto"),g.sendBtn&&(g.sendBtn.disabled=!0),A(e,"user"),$(),C(e))}async function C(e){if(u&&u.readyState===WebSocket.OPEN)u.send(JSON.stringify({type:"message",content:e}));else try{const n=await fetch(`${p.serverUrl}/api/v1/public/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:e,session_id:h.sessionId,visitor_id:h.visitorId,widget_id:p.widgetId})}),t=await n.json();S(),t.session_id&&(h.sessionId=t.session_id,p.persistSession&&y("session_id",h.sessionId)),t.response&&A(t.response,"bot",{sources:t.sources,confidence:t.confidence})}catch(e){S(),A("Sorry, something went wrong. Please try again.","bot"),w("error",e)}}function T(e){const n=e.target,t=n.files?.[0];if(!t)return;A(`📎 Uploading: ${t.name}...`,"user"),$();const o=new FormData;o.append("file",t),o.append("session_id",h.sessionId||""),o.append("visitor_id",h.visitorId||""),o.append("widget_id",p.widgetId),fetch(`${p.serverUrl}/api/upload`,{method:"POST",body:o}).then(e=>e.json()).then(e=>{S(),e.message&&A(e.message,"bot")}).catch(()=>{S(),A("Failed to upload file.","bot")}),n.value=""}function _(e){if(!p.serverUrl&&!e)return;let n;if(p.widgetId){const e=p.serverUrl?.replace(/^http/,"ws"),t=new URLSearchParams({widget_id:p.widgetId});h.visitorId&&t.append("visitor_id",h.visitorId),h.sessionId&&t.append("session_id",h.sessionId),n=`${e}/public/ws?${t.toString()}`}else n=e||p.serverUrl?.replace(/^http/,"ws")+"/ws";try{u=new WebSocket(n),u.onopen=()=>{h.isConnected=!0,b=0,E(!0),w("connected")},u.onclose=()=>{if(h.isConnected=!1,E(!1),w("disconnected"),b<5){b++;const n=Math.min(1e3*Math.pow(2,b),3e4);setTimeout(()=>_(e),n)}else console.warn("WebSocket reconnection failed, falling back to polling"),B()},u.onerror=e=>{console.error("WebSocket error:",e)},u.onmessage=e=>{try{const n=JSON.parse(e.data);if("connected"===n.type)n.session_id&&(h.sessionId=n.session_id,p.persistSession&&y("session_id",h.sessionId)),n.visitor_id&&(h.visitorId=n.visitor_id,p.persistSession&&y("visitor_id",h.visitorId)),n.welcome_message&&0===h.messages.length&&A(n.welcome_message,"bot");else if("message"===n.type){S();const e="user"===n.sender?"user":"bot";A(n.content,e,{confidence:n.confidence,agent_name:n.agent_name,escalation_offered:n.escalation_offered,escalated:n.escalated})}else"typing"===n.type?n.is_typing?$():S():"pong"===n.type||"error"===n.type&&(console.error("WebSocket server error:",n.message),w("error",{message:n.message}))}catch{}},function(){if(U)return;U=setInterval(()=>{u&&u.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"ping"}))},3e4)}()}catch{console.warn("WebSocket not supported, using polling"),B()}}let U=null;function B(){f||(f=setInterval(async()=>{if(h.sessionId)try{const e=await fetch(`${p.serverUrl}/api/messages?session_id=${h.sessionId}&since=${Date.now()-5e3}&widget_id=${p.widgetId}`),n=await e.json();n.messages&&n.messages.forEach(e=>{h.messages.find(n=>n.id===e.id)||A(e.content,e.sender_type,e.metadata)})}catch{}},5e3))}function E(e){g.statusDot&&g.statusDot.classList.toggle("offline",!e),g.statusText&&(g.statusText.textContent=e?"Online":"Offline")}function M(){h.isOpen||(h.isOpen=!0,h.unreadCount=0,g.badge&&(g.badge.textContent=""),g.toggle&&g.toggle.classList.add("open"),g.window&&g.window.classList.add("open"),setTimeout(()=>g.input?.focus(),300),w("open"))}function z(){h.isOpen&&(h.isOpen=!1,g.toggle&&g.toggle.classList.remove("open"),g.window&&g.window.classList.remove("open"),w("close"))}function L(){h.isOpen?z():M()}function O(){h.sessionId=null,h.messages=[],y("session_id",null),g.messages&&(g.messages.innerHTML=""),p.welcomeMessage&&A(p.welcomeMessage,"bot")}async function F(e){if(!e.widgetId)return console.error("IhoomanChat: widgetId is required"),null;p={...n,...e},h.visitorId=y("visitor_id")||x("v_"),y("visitor_id",h.visitorId),p.persistSession&&(h.sessionId=y("session_id"));const t=p.serverUrl||"https://api.ihooman.ai",o=await async function(e,n){try{const t=await fetch(`${n}/api/widget/config?widget_id=${encodeURIComponent(e)}`);return t.ok?await t.json():{success:!1,error:(await t.json().catch(()=>({}))).error||`HTTP ${t.status}`}}catch(e){return{success:!1,error:"Unable to connect. Please check your internet connection."}}}(p.widgetId,t);let i;var a;return o.success&&o.config?(a=o.config,p.title=a.title||p.title,p.subtitle=a.subtitle||p.subtitle,p.welcomeMessage=a.welcomeMessage||p.welcomeMessage,p.placeholder=a.placeholder||p.placeholder,p.position=a.position||p.position,a.theme&&(p.primaryColor=a.theme.primaryColor||p.primaryColor,p.gradientFrom=a.theme.gradientFrom||p.gradientFrom,p.gradientTo=a.theme.gradientTo||p.gradientTo,p.fontFamily=a.theme.fontFamily||p.fontFamily,a.theme.borderRadius&&(p.borderRadius=parseInt(a.theme.borderRadius,10)||p.borderRadius)),a.behavior&&(p.startOpen=a.behavior.startOpen??p.startOpen,p.showTypingIndicator=a.behavior.showTypingIndicator??p.showTypingIndicator,p.showTimestamps=a.behavior.showTimestamps??p.showTimestamps,p.enableSounds=a.behavior.enableSounds??p.enableSounds,p.enableFileUpload=a.behavior.enableFileUpload??p.enableFileUpload,p.persistSession=a.behavior.persistSession??p.persistSession),a.branding&&(p.avatarUrl=a.branding.avatarUrl||p.avatarUrl,p.poweredBy=a.branding.poweredBy??p.poweredBy),i=o.chatEndpoint):o.error&&(console.warn("IhoomanChat: Could not fetch server config:",o.error),"Widget not authorized for this domain"===o.error&&console.error("IhoomanChat: Widget configuration error. Please contact support.")),v(),h.messages.forEach(e=>A(e.content,e.sender,e.metadata)),0===h.messages.length&&p.welcomeMessage&&A(p.welcomeMessage,"bot"),_(i),p.startOpen&&setTimeout(M,500),w("ready"),j}const j={init:F,open:M,close:z,toggle:L,destroy:function(){U&&(clearInterval(U),U=null),u&&(u.close(),u=null),f&&(clearInterval(f),f=null),g.widget&&g.widget.remove();const e=document.getElementById("ihooman-widget-styles");e&&e.remove(),h={isOpen:!1,isConnected:!1,messages:[],sessionId:null,visitorId:null,unreadCount:0},g={},b=0},sendMessage:function(e){e.trim()&&(g.input&&(g.input.value=e),I())},setUser:function(e){e.name&&y("user_name",e.name),e.email&&y("user_email",e.email),e.metadata&&y("user_metadata",e.metadata)},clearHistory:function(){O()},on:function(e,n){m[e]||(m[e]=[]),m[e].push(n)},off:function(e,n){m[e]&&(m[e]=m[e].filter(e=>e!==n))},getState:function(){return{...h}},version:"2.0.0"},q=j;!function(){if("undefined"==typeof document)return;let e=document.currentScript;if(!e){const n=document.getElementsByTagName("script");for(let t=0;t<n.length;t++)if(n[t].src&&n[t].src.includes("ihooman")){e=n[t];break}}if(!e)return;const n=e.getAttribute("data-widget-id");if(n){const t={widgetId:n},o=e.getAttribute("data-server-url");o&&(t.serverUrl=o);const i=e.getAttribute("data-theme");"light"!==i&&"dark"!==i||(t.theme=i);const a=e.getAttribute("data-position");a&&(t.position=a);"true"===e.getAttribute("data-start-open")&&(t.startOpen=!0),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>F(t)):F(t)}}(),"undefined"!=typeof window&&(window.IhoomanChat=q),e.IhoomanChat=q,e.createWidgetInstance=function(){return{...j}},e.default=q,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
2
2
|
//# sourceMappingURL=index.umd.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.min.js","sources":["../src/widget.ts"],"sourcesContent":[null],"names":["defaultConfig","serverUrl","theme","position","title","subtitle","welcomeMessage","placeholder","primaryColor","gradientFrom","gradientTo","showTimestamps","showTypingIndicator","enableSounds","enableFileUpload","startOpen","persistSession","zIndex","width","height","buttonSize","borderRadius","fontFamily","avatarUrl","poweredBy","icons","config","widgetId","state","isOpen","isConnected","messages","sessionId","visitorId","unreadCount","elements","eventListeners","ws","pollInterval","reconnectAttempts","generateId","prefix","Math","random","toString","slice","Date","now","escapeHtml","text","div","document","createElement","textContent","innerHTML","storage","key","value","fullKey","undefined","item","localStorage","getItem","JSON","parse","removeItem","setItem","stringify","emit","event","data","forEach","fn","e","console","error","callbackName","charAt","toUpperCase","callback","createWidget","styleEl","id","isDark","bgColor","textColor","mutedColor","borderColor","inputBg","messageBgUser","messageBgBot","positionRight","includes","positionBottom","generateStyles","head","appendChild","widget","className","body","toggle","querySelector","badge","window","input","sendBtn","attachBtn","fileInput","statusDot","statusText","addEventListener","handleSendClick","disabled","trim","style","min","scrollHeight","shiftKey","preventDefault","click","handleFileSelect","startNewConversation","close","setupEventListeners","addMessage","content","sender","metadata","message","timestamp","push","el","date","replace","toLocaleTimeString","hour","minute","typing","remove","scrollTop","String","audio","Audio","volume","play","catch","playSound","showTyping","hideTyping","async","response","fetch","method","headers","session_id","visitor_id","widget_id","json","sources","confidence","sendMessageToServer","target","file","files","name","formData","FormData","append","then","r","connectWebSocket","chatEndpoint","startPolling","wsUrl","WebSocket","onopen","updateStatus","readyState","OPEN","send","type","onclose","delay","pow","setTimeout","onerror","onmessage","sender_type","is_typing","setInterval","msg","find","m","online","classList","open","add","focus","init","userConfig","configResponse","encodeURIComponent","ok","success","status","fetchWidgetConfig","serverConfig","parseInt","behavior","branding","warn","length","publicAPI","destroy","clearInterval","styles","getElementById","sendMessage","setUser","user","email","clearHistory","on","off","filter","getState","version","IhoomanChat","script","currentScript","scripts","getElementsByTagName","i","src","getAttribute","autoConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.min.js","sources":["../src/widget.ts"],"sourcesContent":[null],"names":["defaultConfig","serverUrl","theme","position","title","subtitle","welcomeMessage","placeholder","primaryColor","gradientFrom","gradientTo","showTimestamps","showTypingIndicator","enableSounds","enableFileUpload","startOpen","persistSession","zIndex","width","height","buttonSize","borderRadius","fontFamily","avatarUrl","poweredBy","icons","config","widgetId","state","isOpen","isConnected","messages","sessionId","visitorId","unreadCount","elements","eventListeners","ws","pollInterval","reconnectAttempts","generateId","prefix","Math","random","toString","slice","Date","now","escapeHtml","text","div","document","createElement","textContent","innerHTML","storage","key","value","fullKey","undefined","item","localStorage","getItem","JSON","parse","removeItem","setItem","stringify","emit","event","data","forEach","fn","e","console","error","callbackName","charAt","toUpperCase","callback","createWidget","styleEl","id","isDark","bgColor","textColor","mutedColor","borderColor","inputBg","messageBgUser","messageBgBot","positionRight","includes","positionBottom","generateStyles","head","appendChild","widget","className","body","toggle","querySelector","badge","window","input","sendBtn","attachBtn","fileInput","statusDot","statusText","addEventListener","handleSendClick","disabled","trim","style","min","scrollHeight","shiftKey","preventDefault","click","handleFileSelect","startNewConversation","close","setupEventListeners","addMessage","content","sender","metadata","message","timestamp","push","el","showEscalationButtons","escalation_offered","escalationButtonsHtml","date","replace","toLocaleTimeString","hour","minute","liveAgentBtn","ticketBtn","handleEscalationAction","typing","remove","scrollTop","String","audio","Audio","volume","play","catch","playSound","action","querySelectorAll","btn","showTyping","sendMessageToServer","hideTyping","async","readyState","WebSocket","OPEN","send","type","response","fetch","method","headers","session_id","visitor_id","widget_id","json","sources","confidence","target","file","files","name","formData","FormData","append","then","r","connectWebSocket","chatEndpoint","wsUrl","baseWsUrl","params","URLSearchParams","onopen","updateStatus","onclose","delay","pow","setTimeout","warn","startPolling","onerror","onmessage","welcome_message","length","agent_name","escalated","is_typing","heartbeatInterval","setInterval","startHeartbeat","msg","find","m","sender_type","online","classList","open","add","focus","init","userConfig","configResponse","encodeURIComponent","ok","success","status","fetchWidgetConfig","serverConfig","parseInt","behavior","branding","publicAPI","destroy","clearInterval","styles","getElementById","sendMessage","setUser","user","email","clearHistory","on","off","filter","getState","version","IhoomanChat","script","currentScript","scripts","getElementsByTagName","i","src","getAttribute","autoConfig"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -160,6 +160,12 @@ export interface Message {
|
|
|
160
160
|
}>;
|
|
161
161
|
/** Confidence score for AI responses */
|
|
162
162
|
confidence?: number;
|
|
163
|
+
/** Agent name for live agent messages */
|
|
164
|
+
agent_name?: string;
|
|
165
|
+
/** Whether escalation was offered */
|
|
166
|
+
escalation_offered?: boolean;
|
|
167
|
+
/** Whether conversation was escalated */
|
|
168
|
+
escalated?: boolean;
|
|
163
169
|
};
|
|
164
170
|
}
|
|
165
171
|
/**
|
|
@@ -182,7 +188,7 @@ export interface WidgetState {
|
|
|
182
188
|
/**
|
|
183
189
|
* Widget event types
|
|
184
190
|
*/
|
|
185
|
-
export type WidgetEvent = 'ready' | 'open' | 'close' | 'message' | 'error';
|
|
191
|
+
export type WidgetEvent = 'ready' | 'open' | 'close' | 'message' | 'error' | 'connected' | 'disconnected';
|
|
186
192
|
/**
|
|
187
193
|
* Event callback function type
|
|
188
194
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/widget.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAMV,cAAc,EAEf,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAMV,cAAc,EAEf,MAAM,SAAS,CAAC;AAypCjB;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,cAA0B,CAAC;AAErD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
|
package/package.json
CHANGED
package/src/types.ts
CHANGED
|
@@ -195,6 +195,12 @@ export interface Message {
|
|
|
195
195
|
}>;
|
|
196
196
|
/** Confidence score for AI responses */
|
|
197
197
|
confidence?: number;
|
|
198
|
+
/** Agent name for live agent messages */
|
|
199
|
+
agent_name?: string;
|
|
200
|
+
/** Whether escalation was offered */
|
|
201
|
+
escalation_offered?: boolean;
|
|
202
|
+
/** Whether conversation was escalated */
|
|
203
|
+
escalated?: boolean;
|
|
198
204
|
};
|
|
199
205
|
}
|
|
200
206
|
|
|
@@ -219,7 +225,7 @@ export interface WidgetState {
|
|
|
219
225
|
/**
|
|
220
226
|
* Widget event types
|
|
221
227
|
*/
|
|
222
|
-
export type WidgetEvent = 'ready' | 'open' | 'close' | 'message' | 'error';
|
|
228
|
+
export type WidgetEvent = 'ready' | 'open' | 'close' | 'message' | 'error' | 'connected' | 'disconnected';
|
|
223
229
|
|
|
224
230
|
/**
|
|
225
231
|
* Event callback function type
|
package/src/widget.ts
CHANGED
|
@@ -70,6 +70,8 @@ const icons = {
|
|
|
70
70
|
minimize: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line></svg>`,
|
|
71
71
|
refresh: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>`,
|
|
72
72
|
bot: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="10" rx="2"></rect><circle cx="12" cy="5" r="2"></circle><path d="M12 7v4"></path></svg>`,
|
|
73
|
+
agent: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>`,
|
|
74
|
+
ticket: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><line x1="10" y1="9" x2="8" y2="9"></line></svg>`,
|
|
73
75
|
};
|
|
74
76
|
|
|
75
77
|
/**
|
|
@@ -300,6 +302,14 @@ function generateStyles(): string {
|
|
|
300
302
|
.ihooman-powered { text-align: center; padding: 8px; font-size: 11px; color: ${mutedColor}; background: ${bgColor}; }
|
|
301
303
|
.ihooman-powered a { color: ${primaryColor}; text-decoration: none; }
|
|
302
304
|
.ihooman-error { padding: 16px; text-align: center; color: #ef4444; background: ${bgColor}; }
|
|
305
|
+
.ihooman-escalation-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
|
|
306
|
+
.ihooman-escalation-btn { display: inline-flex; align-items: center; gap: 6px; padding: 10px 16px; border-radius: 8px; border: none; cursor: pointer; font-family: inherit; font-size: 13px; font-weight: 500; transition: all 0.2s ease; }
|
|
307
|
+
.ihooman-escalation-btn svg { width: 16px; height: 16px; }
|
|
308
|
+
.ihooman-escalation-btn.primary { background: linear-gradient(135deg, ${gradientFrom}, ${gradientTo}); color: white; }
|
|
309
|
+
.ihooman-escalation-btn.primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 174, 255, 0.3); }
|
|
310
|
+
.ihooman-escalation-btn.secondary { background: ${isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'}; color: ${textColor}; border: 1px solid ${borderColor}; }
|
|
311
|
+
.ihooman-escalation-btn.secondary:hover { background: ${isDark ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.08)'}; }
|
|
312
|
+
.ihooman-escalation-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }
|
|
303
313
|
@media (max-width: 480px) { .ihooman-window { width: calc(100vw - 20px); height: calc(100vh - 100px); left: 10px; right: 10px; bottom: 80px; max-height: none; } .ihooman-toggle { ${positionRight ? 'right: 16px' : 'left: 16px'}; bottom: 16px; } }
|
|
304
314
|
`;
|
|
305
315
|
}
|
|
@@ -433,11 +443,45 @@ function addMessage(content: string, sender: 'user' | 'bot' = 'bot', metadata: M
|
|
|
433
443
|
|
|
434
444
|
const el = document.createElement('div');
|
|
435
445
|
el.className = `ihooman-message ${sender}`;
|
|
446
|
+
|
|
447
|
+
// Check if this message should show escalation buttons
|
|
448
|
+
const showEscalationButtons = sender === 'bot' && metadata?.escalation_offered === true;
|
|
449
|
+
|
|
450
|
+
let escalationButtonsHtml = '';
|
|
451
|
+
if (showEscalationButtons) {
|
|
452
|
+
escalationButtonsHtml = `
|
|
453
|
+
<div class="ihooman-escalation-actions">
|
|
454
|
+
<button class="ihooman-escalation-btn primary" data-action="live-agent">
|
|
455
|
+
${icons.agent}
|
|
456
|
+
<span>Talk to Agent</span>
|
|
457
|
+
</button>
|
|
458
|
+
<button class="ihooman-escalation-btn secondary" data-action="create-ticket">
|
|
459
|
+
${icons.ticket}
|
|
460
|
+
<span>Create Ticket</span>
|
|
461
|
+
</button>
|
|
462
|
+
</div>
|
|
463
|
+
`;
|
|
464
|
+
}
|
|
465
|
+
|
|
436
466
|
el.innerHTML = `
|
|
437
467
|
<div class="ihooman-message-content">${parseMarkdown(content)}</div>
|
|
468
|
+
${escalationButtonsHtml}
|
|
438
469
|
${config.showTimestamps ? `<div class="ihooman-message-time">${formatTime(message.timestamp)}</div>` : ''}
|
|
439
470
|
`;
|
|
440
471
|
|
|
472
|
+
// Add event listeners for escalation buttons
|
|
473
|
+
if (showEscalationButtons) {
|
|
474
|
+
const liveAgentBtn = el.querySelector('[data-action="live-agent"]');
|
|
475
|
+
const ticketBtn = el.querySelector('[data-action="create-ticket"]');
|
|
476
|
+
|
|
477
|
+
if (liveAgentBtn) {
|
|
478
|
+
liveAgentBtn.addEventListener('click', () => handleEscalationAction('live-agent'));
|
|
479
|
+
}
|
|
480
|
+
if (ticketBtn) {
|
|
481
|
+
ticketBtn.addEventListener('click', () => handleEscalationAction('create-ticket'));
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
441
485
|
// Remove typing indicator if present
|
|
442
486
|
const typing = elements.messages.querySelector('.ihooman-typing');
|
|
443
487
|
if (typing) typing.remove();
|
|
@@ -458,6 +502,27 @@ function addMessage(content: string, sender: 'user' | 'bot' = 'bot', metadata: M
|
|
|
458
502
|
return message;
|
|
459
503
|
}
|
|
460
504
|
|
|
505
|
+
/**
|
|
506
|
+
* Handle escalation action button clicks
|
|
507
|
+
*/
|
|
508
|
+
function handleEscalationAction(action: 'live-agent' | 'create-ticket'): void {
|
|
509
|
+
// Disable all escalation buttons to prevent double-clicks
|
|
510
|
+
const buttons = document.querySelectorAll('.ihooman-escalation-btn');
|
|
511
|
+
buttons.forEach(btn => (btn as HTMLButtonElement).disabled = true);
|
|
512
|
+
|
|
513
|
+
if (action === 'live-agent') {
|
|
514
|
+
// Send message to request live agent
|
|
515
|
+
addMessage('Connect me with a live agent', 'user');
|
|
516
|
+
showTyping();
|
|
517
|
+
sendMessageToServer('Connect me with a live agent');
|
|
518
|
+
} else if (action === 'create-ticket') {
|
|
519
|
+
// Send message to create ticket
|
|
520
|
+
addMessage('I would like to create a support ticket', 'user');
|
|
521
|
+
showTyping();
|
|
522
|
+
sendMessageToServer('I would like to create a support ticket');
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
461
526
|
/**
|
|
462
527
|
* Show typing indicator
|
|
463
528
|
*/
|
|
@@ -502,8 +567,19 @@ function handleSendClick(): void {
|
|
|
502
567
|
|
|
503
568
|
/**
|
|
504
569
|
* Send message to the server
|
|
570
|
+
* Uses WebSocket if connected, otherwise falls back to REST API
|
|
505
571
|
*/
|
|
506
572
|
async function sendMessageToServer(content: string): Promise<void> {
|
|
573
|
+
// If WebSocket is connected, send via WebSocket
|
|
574
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
575
|
+
ws.send(JSON.stringify({
|
|
576
|
+
type: 'message',
|
|
577
|
+
content: content,
|
|
578
|
+
}));
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Fallback to REST API
|
|
507
583
|
try {
|
|
508
584
|
const response = await fetch(`${config.serverUrl}/api/v1/public/chat`, {
|
|
509
585
|
method: 'POST',
|
|
@@ -586,21 +662,35 @@ function playSound(): void {
|
|
|
586
662
|
// ============================================================================
|
|
587
663
|
|
|
588
664
|
/**
|
|
589
|
-
* Connect to WebSocket for real-time messaging
|
|
590
|
-
*
|
|
591
|
-
*
|
|
665
|
+
* Connect to WebSocket for real-time messaging.
|
|
666
|
+
*
|
|
667
|
+
* For public widgets (using Widget ID), connects to /public/ws endpoint
|
|
668
|
+
* which authenticates via Widget ID + Domain validation.
|
|
669
|
+
*
|
|
670
|
+
* For authenticated users (dashboard), connects to /ws endpoint with JWT.
|
|
592
671
|
*/
|
|
593
672
|
function connectWebSocket(chatEndpoint?: string): void {
|
|
594
|
-
// For public widgets (using widget ID), skip WebSocket and use REST
|
|
595
|
-
// WebSocket is only for authenticated dashboard users
|
|
596
|
-
if (config.widgetId) {
|
|
597
|
-
startPolling();
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
|
|
601
673
|
if (!config.serverUrl && !chatEndpoint) return;
|
|
602
674
|
|
|
603
|
-
|
|
675
|
+
let wsUrl: string;
|
|
676
|
+
|
|
677
|
+
if (config.widgetId) {
|
|
678
|
+
// Public widget - use /public/ws endpoint with widget_id auth
|
|
679
|
+
const baseWsUrl = config.serverUrl?.replace(/^http/, 'ws');
|
|
680
|
+
const params = new URLSearchParams({
|
|
681
|
+
widget_id: config.widgetId,
|
|
682
|
+
});
|
|
683
|
+
if (state.visitorId) {
|
|
684
|
+
params.append('visitor_id', state.visitorId);
|
|
685
|
+
}
|
|
686
|
+
if (state.sessionId) {
|
|
687
|
+
params.append('session_id', state.sessionId);
|
|
688
|
+
}
|
|
689
|
+
wsUrl = `${baseWsUrl}/public/ws?${params.toString()}`;
|
|
690
|
+
} else {
|
|
691
|
+
// Authenticated user - use /ws endpoint
|
|
692
|
+
wsUrl = chatEndpoint || config.serverUrl?.replace(/^http/, 'ws') + '/ws';
|
|
693
|
+
}
|
|
604
694
|
|
|
605
695
|
try {
|
|
606
696
|
ws = new WebSocket(wsUrl);
|
|
@@ -609,21 +699,13 @@ function connectWebSocket(chatEndpoint?: string): void {
|
|
|
609
699
|
state.isConnected = true;
|
|
610
700
|
reconnectAttempts = 0;
|
|
611
701
|
updateStatus(true);
|
|
612
|
-
|
|
613
|
-
// Send initial connection message with widget ID
|
|
614
|
-
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
615
|
-
ws.send(JSON.stringify({
|
|
616
|
-
type: 'connect',
|
|
617
|
-
widget_id: config.widgetId,
|
|
618
|
-
visitor_id: state.visitorId,
|
|
619
|
-
session_id: state.sessionId,
|
|
620
|
-
}));
|
|
621
|
-
}
|
|
702
|
+
emit('connected');
|
|
622
703
|
};
|
|
623
704
|
|
|
624
705
|
ws.onclose = () => {
|
|
625
706
|
state.isConnected = false;
|
|
626
707
|
updateStatus(false);
|
|
708
|
+
emit('disconnected');
|
|
627
709
|
|
|
628
710
|
// Attempt reconnection with exponential backoff
|
|
629
711
|
if (reconnectAttempts < maxReconnectAttempts) {
|
|
@@ -631,34 +713,95 @@ function connectWebSocket(chatEndpoint?: string): void {
|
|
|
631
713
|
const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 30000);
|
|
632
714
|
setTimeout(() => connectWebSocket(chatEndpoint), delay);
|
|
633
715
|
} else {
|
|
634
|
-
// Fall back to polling
|
|
716
|
+
// Fall back to polling after max reconnect attempts
|
|
717
|
+
console.warn('WebSocket reconnection failed, falling back to polling');
|
|
635
718
|
startPolling();
|
|
636
719
|
}
|
|
637
720
|
};
|
|
638
721
|
|
|
639
|
-
ws.onerror = () => {
|
|
722
|
+
ws.onerror = (error) => {
|
|
723
|
+
console.error('WebSocket error:', error);
|
|
640
724
|
// WebSocket error - will trigger onclose
|
|
641
725
|
};
|
|
642
726
|
|
|
643
727
|
ws.onmessage = (e: MessageEvent) => {
|
|
644
728
|
try {
|
|
645
729
|
const data = JSON.parse(e.data);
|
|
646
|
-
|
|
730
|
+
|
|
731
|
+
if (data.type === 'connected') {
|
|
732
|
+
// Server confirmed connection - update session info
|
|
733
|
+
if (data.session_id) {
|
|
734
|
+
state.sessionId = data.session_id;
|
|
735
|
+
if (config.persistSession) storage('session_id', state.sessionId);
|
|
736
|
+
}
|
|
737
|
+
if (data.visitor_id) {
|
|
738
|
+
state.visitorId = data.visitor_id;
|
|
739
|
+
if (config.persistSession) storage('visitor_id', state.visitorId);
|
|
740
|
+
}
|
|
741
|
+
// Show welcome message if provided
|
|
742
|
+
if (data.welcome_message && state.messages.length === 0) {
|
|
743
|
+
addMessage(data.welcome_message, 'bot');
|
|
744
|
+
}
|
|
745
|
+
} else if (data.type === 'message') {
|
|
647
746
|
hideTyping();
|
|
648
|
-
|
|
747
|
+
const sender = data.sender === 'user' ? 'user' : 'bot';
|
|
748
|
+
addMessage(data.content, sender, {
|
|
749
|
+
confidence: data.confidence,
|
|
750
|
+
agent_name: data.agent_name,
|
|
751
|
+
escalation_offered: data.escalation_offered,
|
|
752
|
+
escalated: data.escalated,
|
|
753
|
+
});
|
|
649
754
|
} else if (data.type === 'typing') {
|
|
650
755
|
data.is_typing ? showTyping() : hideTyping();
|
|
756
|
+
} else if (data.type === 'pong') {
|
|
757
|
+
// Heartbeat response - connection is alive
|
|
758
|
+
} else if (data.type === 'error') {
|
|
759
|
+
console.error('WebSocket server error:', data.message);
|
|
760
|
+
emit('error', { message: data.message });
|
|
651
761
|
}
|
|
652
762
|
} catch {
|
|
653
763
|
// Ignore parse errors
|
|
654
764
|
}
|
|
655
765
|
};
|
|
766
|
+
|
|
767
|
+
// Start heartbeat to keep connection alive
|
|
768
|
+
startHeartbeat();
|
|
769
|
+
|
|
656
770
|
} catch {
|
|
657
771
|
// WebSocket not supported, fall back to polling
|
|
772
|
+
console.warn('WebSocket not supported, using polling');
|
|
658
773
|
startPolling();
|
|
659
774
|
}
|
|
660
775
|
}
|
|
661
776
|
|
|
777
|
+
/**
|
|
778
|
+
* Heartbeat interval reference
|
|
779
|
+
*/
|
|
780
|
+
let heartbeatInterval: ReturnType<typeof setInterval> | null = null;
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Start heartbeat to keep WebSocket connection alive
|
|
784
|
+
*/
|
|
785
|
+
function startHeartbeat(): void {
|
|
786
|
+
if (heartbeatInterval) return;
|
|
787
|
+
|
|
788
|
+
heartbeatInterval = setInterval(() => {
|
|
789
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
790
|
+
ws.send(JSON.stringify({ type: 'ping' }));
|
|
791
|
+
}
|
|
792
|
+
}, 30000); // Ping every 30 seconds
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/**
|
|
796
|
+
* Stop heartbeat
|
|
797
|
+
*/
|
|
798
|
+
function stopHeartbeat(): void {
|
|
799
|
+
if (heartbeatInterval) {
|
|
800
|
+
clearInterval(heartbeatInterval);
|
|
801
|
+
heartbeatInterval = null;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
662
805
|
/**
|
|
663
806
|
* Start polling for messages (fallback when WebSocket unavailable)
|
|
664
807
|
*/
|
|
@@ -771,6 +914,9 @@ function startNewConversation(): void {
|
|
|
771
914
|
* Destroy the widget and clean up resources
|
|
772
915
|
*/
|
|
773
916
|
function destroy(): void {
|
|
917
|
+
// Stop heartbeat
|
|
918
|
+
stopHeartbeat();
|
|
919
|
+
|
|
774
920
|
// Close WebSocket
|
|
775
921
|
if (ws) {
|
|
776
922
|
ws.close();
|