vue-chat-button-simple
Version:
Vue 2 & Vue 3 compatible chat button components with badge support, modal popup, fixed positioning, environment configuration, and customizable themes
1 lines • 62.2 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VueChatButtonGlobal={})}(this,(function(t){"use strict";const e={name:"ChatModal",props:{visible:{type:Boolean,default:!1},position:{type:String,default:"center"},width:{type:String,default:"400px"},height:{type:String,default:"600px"},closeOnOverlay:{type:Boolean,default:!1},closeOnEscape:{type:Boolean,default:!1},draggable:{type:Boolean,default:!0},resizable:{type:Boolean,default:!0},initialX:{type:Number,default:void 0},initialY:{type:Number,default:void 0},initialWidth:{type:Number,default:void 0},initialHeight:{type:Number,default:void 0},enableBoundary:{type:Boolean,default:!0},showFullscreen:{type:Boolean,default:!1},enableAdjustSize:{type:Boolean,default:!1}},data:()=>({iframeUrl:"",modalTitle:"西之月客服",visible:!1,modalInstance:null,modalElement:null,isFullscreen:!1,isDragging:!1,isResizing:!1,hasBeenDragged:!1,modalPosition:{x:0,y:0},modalSize:{width:400,height:600},dragStart:{x:0,y:0},resizeStart:{x:0,y:0,width:0,height:0}}),computed:{modalStyle(){return this.isFullscreen||"fullscreen"===this.position?{width:"100vw",height:"100vh",left:"0",top:"0",right:"0",bottom:"0",transform:"none",position:"fixed",maxWidth:"none",maxHeight:"none",margin:"0",borderRadius:"0"}:this.hasBeenDragged||"custom"===this.position||0!==this.modalPosition.x&&0!==this.modalPosition.y?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:this.modalPosition.x+"px",top:this.modalPosition.y+"px",transform:"none",position:"fixed"}:"center"===this.position?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:"50%",top:"50%",transform:"translate(-50%, -50%)",position:"fixed"}:"right"===this.position?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",right:"20px",top:"50%",transform:"translateY(-50%)",position:"fixed"}:{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:this.modalPosition.x+"px",top:this.modalPosition.y+"px",transform:"none",position:"fixed"}}},mounted(){this.closeOnEscape&&document.addEventListener("keydown",this.handleKeydown,!0),this.initializePosition()},beforeDestroy(){document.removeEventListener("keydown",this.handleKeydown,!0),this.destroyModal(),this.stopDrag(),this.stopResize()},methods:{createModal(){if(this.modalInstance)return;const t=document.createElement("div");t.id="chat-modal-container-"+Date.now(),document.body.appendChild(t);const e={template:'\n <div v-if="visible" class="chat-modal-overlay" @click="handleOverlayClick">\n <div \n ref="modalRef"\n class="chat-modal-container" \n :class="[position, { \'fullscreen\': isFullscreen, \'dragging\': isDragging }]" \n :style="modalStyle" \n @click.stop\n >\n \x3c!-- 弹窗头部 --\x3e\n <div \n class="chat-modal-header" \n :class="{ \'draggable\': !isFullscreen }"\n @mousedown="startDrag"\n @touchstart="startDrag"\n >\n <div class="chat-modal-title center">\n <img :src="logoUrl" alt="logo" class="chat-modal-logo" />\n <span>{{ modalTitle }}</span>\n </div>\n <div class="chat-modal-controls" @mousedown.stop @touchstart.stop>\n <template v-if="showFullscreen">\n \x3c!-- 全屏切换按钮 --\x3e\n <button\n v-if="!isFullscreen"\n class="chat-modal-close full-screen-icon" \n @click="toggleFullscreen"\n title="全屏"\n >\n <svg viewBox="0 0 1024 1024" width="20" height="20">\n <path d="M999.908535 950.445791l-224.725864-224.789851h212.184216a36.473161 36.473161 0 1 0 0-73.138287H650.214103v334.849216a36.473161 36.473161 0 1 0 73.138286 0v-209.880648l224.725864 224.725864a36.601137 36.601137 0 0 0 51.766294-51.830282zM300.583659 36.697119v214.423796L74.706011 25.243267a36.601137 36.601137 0 0 0-51.766294 51.766294L247.729569 301.735425H36.569161a36.473161 36.473161 0 1 0 0 73.138286H373.785933V36.633131a36.473161 36.473161 0 1 0-73.138286 0zM998.756751 28.570643a36.601137 36.601137 0 0 0-51.766294 0l-223.57408 223.638068V36.633131a36.473161 36.473161 0 1 0-73.138286 0v338.24058h337.088796a36.473161 36.473161 0 1 0 0-73.138286h-209.880648l221.270512-221.3345a36.601137 36.601137 0 0 0 0-51.766294zM0.096 689.11879a36.473161 36.473161 0 0 0 36.537149 36.53715h213.336L21.851921 953.837156a36.601137 36.601137 0 0 0 51.830282 51.830281l226.965444-227.09342v208.792852a36.473161 36.473161 0 1 0 73.138286 0v-334.849216H36.633149a36.473161 36.473161 0 0 0-36.537149 36.601137z" fill="#374866"/>\n </svg>\n </button>\n </template>\n \x3c!-- 关闭按钮 --\x3e\n <button class="chat-modal-close" @click="closeModal">\n <svg viewBox="0 0 1024 1024" width="20" height="20">\n <path d="M213.333333 469.333333m21.333334 0l554.666666 0q21.333333 0 21.333334 21.333334l0 42.666666q0 21.333333-21.333334 21.333334l-554.666666 0q-21.333333 0-21.333334-21.333334l0-42.666666q0-21.333333 21.333334-21.333334Z" fill="#4A4A4A"/>\n </svg>\n </button>\n <button class="chat-modal-close" @click="closeModal">\n <svg viewBox="0 0 1024 1024" fill="red" width="20" height="20">\n <path d="M571.01312 523.776l311.3472-311.35232c15.7184-15.71328 15.7184-41.6256 0-57.344l-1.69472-1.69984c-15.7184-15.71328-41.6256-15.71328-57.34912 0l-311.3472 311.77728-311.35232-311.77728c-15.7184-15.71328-41.63072-15.71328-57.344 0l-1.69984 1.69984a40.0128 40.0128 0 0 0 0 57.344L452.92544 523.776l-311.35232 311.35744c-15.71328 15.71328-15.71328 41.63072 0 57.33888l1.69984 1.69984c15.71328 15.7184 41.6256 15.7184 57.344 0l311.35232-311.35232 311.3472 311.35232c15.72352 15.7184 41.63072 15.7184 57.34912 0l1.69472-1.69984c15.7184-15.70816 15.7184-41.6256 0-57.33888l-311.3472-311.35744z"/>\n </svg>\n </button>\n </div>\n </div>\n\n \x3c!-- 弹窗内容 --\x3e\n <div class="chat-modal-content">\n <iframe v-if="iframeUrl" :src="iframeUrl" :title="modalTitle" class="chat-modal-iframe" frameborder="0" allowfullscreen></iframe>\n <div v-else class="chat-modal-placeholder">\n <p>请设置 iframe URL</p>\n </div>\n </div>\n\n \x3c!-- 调整大小手柄 --\x3e\n <div \n v-if="!isFullscreen && position !== \'fullscreen\' && enableAdjustSize"\n class="chat-modal-resize-handle"\n @mousedown="startResize"\n @touchstart="startResize"\n ></div>\n </div>\n </div>\n ',props:["visible","position","width","height","closeOnOverlay","closeOnEscape","draggable","resizable","initialX","initialY","initialWidth","initialHeight","enableBoundary","showFullscreen","enableAdjustSize"],data:()=>({iframeUrl:"",modalTitle:"西之月客服",logoUrl:"data:image/png;base64,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",isFullscreen:!1,isDragging:!1,isResizing:!1,hasBeenDragged:!1,modalPosition:{x:0,y:0},modalSize:{width:400,height:600},dragStart:{x:0,y:0},resizeStart:{x:0,y:0,width:0,height:0}}),computed:{modalStyle(){return this.isFullscreen||"fullscreen"===this.position?{width:"100vw",height:"100vh",left:"0",top:"0",right:"0",bottom:"0",transform:"none",position:"fixed",maxWidth:"none",maxHeight:"none",margin:"0",borderRadius:"0"}:this.hasBeenDragged||"custom"===this.position||0!==this.modalPosition.x&&0!==this.modalPosition.y?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:this.modalPosition.x+"px",top:this.modalPosition.y+"px",transform:"none",position:"fixed"}:"center"===this.position?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:"50%",top:"50%",transform:"translate(-50%, -50%)",position:"fixed"}:"right"===this.position?{width:this.modalSize.width+"px",height:this.modalSize.height+"px",right:"20px",top:"50%",transform:"translateY(-50%)",position:"fixed"}:{width:this.modalSize.width+"px",height:this.modalSize.height+"px",left:this.modalPosition.x+"px",top:this.modalPosition.y+"px",transform:"none",position:"fixed"}}},methods:{closeModal(){this.$emit("close")},handleOverlayClick(){this.closeOnOverlay&&this.closeModal()},initializePosition(){if(this.hasBeenDragged=!1,this.initialWidth&&this.initialHeight)this.modalSize={width:this.initialWidth,height:this.initialHeight};else{const t=parseInt(this.width),e=parseInt(this.height);this.modalSize={width:t,height:e}}void 0!==this.initialX&&void 0!==this.initialY?(this.modalPosition={x:this.initialX,y:this.initialY},this.hasBeenDragged=!0):"center"===this.position?this.modalPosition={x:(window.innerWidth-this.modalSize.width)/2,y:(window.innerHeight-this.modalSize.height)/2}:"right"===this.position?this.modalPosition={x:window.innerWidth-this.modalSize.width-20,y:(window.innerHeight-this.modalSize.height)/2}:this.modalPosition={x:100,y:100}},resetPosition(){this.initializePosition()},toggleFullscreen(){if(this.isFullscreen=!this.isFullscreen,this.$emit("fullscreen",this.isFullscreen),this.isFullscreen){const t=this.$refs.modalRef?this.$refs.modalRef.getBoundingClientRect():null;t&&(this.modalPosition={x:t.left,y:t.top},this.modalSize={width:t.width,height:t.height})}},startDrag(t){if(this.isFullscreen||!this.draggable)return;t.preventDefault(),this.isDragging=!0,this.hasBeenDragged=!0;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY,n=this.$refs.modalRef?this.$refs.modalRef.getBoundingClientRect():null;n&&("center"===this.position||"right"===this.position||0===this.modalPosition.x&&0===this.modalPosition.y)&&(this.modalPosition={x:n.left,y:n.top}),this.dragStart={x:e-this.modalPosition.x,y:i-this.modalPosition.y},document.addEventListener("mousemove",this.handleDrag),document.addEventListener("mouseup",this.stopDrag),document.addEventListener("touchmove",this.handleDrag),document.addEventListener("touchend",this.stopDrag)},handleDrag(t){if(!this.isDragging)return;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY;let n=e-this.dragStart.x,o=i-this.dragStart.y;if(this.enableBoundary){const t=0,e=window.innerWidth-this.modalSize.width,i=0,s=window.innerHeight-this.modalSize.height;n<t?n=t:n>e&&(n=e),o<i?o=i:o>s&&(o=s)}this.modalPosition={x:n,y:o},this.$emit("move",this.modalPosition)},stopDrag(){this.isDragging=!1,document.removeEventListener("mousemove",this.handleDrag),document.removeEventListener("mouseup",this.stopDrag),document.removeEventListener("touchmove",this.handleDrag),document.removeEventListener("touchend",this.stopDrag)},startResize(t){if(this.isFullscreen||!this.resizable)return;t.preventDefault(),this.isResizing=!0;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY;this.resizeStart={x:e,y:i,width:this.modalSize.width,height:this.modalSize.height},document.addEventListener("mousemove",this.handleResize),document.addEventListener("mouseup",this.stopResize),document.addEventListener("touchmove",this.handleResize),document.addEventListener("touchend",this.stopResize)},handleResize(t){if(!this.isResizing)return;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY,n=e-this.resizeStart.x,o=i-this.resizeStart.y;let s=Math.max(300,this.resizeStart.width+n),a=Math.max(200,this.resizeStart.height+o);if(this.enableBoundary){const t=window.innerWidth-this.modalPosition.x,e=window.innerHeight-this.modalPosition.y;s>t&&(s=t),a>e&&(a=e)}this.modalSize={width:s,height:a},this.$emit("resize",this.modalSize)},stopResize(){this.isResizing=!1,document.removeEventListener("mousemove",this.handleResize),document.removeEventListener("mouseup",this.stopResize),document.removeEventListener("touchmove",this.handleResize),document.removeEventListener("touchend",this.stopResize)}}};this.modalInstance=new Vue({render:h=>h(e,{props:{visible:this.visible,position:this.position,width:this.width,height:this.height,closeOnOverlay:this.closeOnOverlay,closeOnEscape:this.closeOnEscape,draggable:this.draggable,resizable:this.resizable,initialX:this.initialX,initialY:this.initialY,initialWidth:this.initialWidth,initialHeight:this.initialHeight,enableBoundary:this.enableBoundary,showFullscreen:this.showFullscreen,enableAdjustSize:this.enableAdjustSize},on:{close:()=>{this.closeModal(),this.$emit("close")},fullscreen:t=>this.$emit("fullscreen",t),move:t=>this.$emit("move",t),resize:t=>this.$emit("resize",t)}})}),this.modalInstance.$mount(t),this.modalElement=t,this.modalInstance.$children[0]&&this.modalInstance.$children[0].initializePosition&&this.modalInstance.$children[0].initializePosition()},destroyModal(){this.modalInstance&&(this.modalInstance.$destroy(),this.modalInstance=null),this.modalElement&&this.modalElement.parentNode&&(this.modalElement.parentNode.removeChild(this.modalElement),this.modalElement=null)},closeModal(){this.visible=!1,this.isFullscreen=!1,this.$emit("update:visible",!1),this.modalInstance&&(this.modalInstance.$children[0].visible=!1,this.modalInstance.$children[0].isFullscreen=!1)},handleOverlayClick(){this.closeOnOverlay&&this.closeModal()},handleKeydown(t){"Escape"===t.key&&this.visible&&(this.isFullscreen?this.toggleFullscreen():this.closeOnEscape&&(t.preventDefault(),this.closeModal()))},initializePosition(){if(this.hasBeenDragged=!1,this.initialWidth&&this.initialHeight)this.modalSize={width:this.initialWidth,height:this.initialHeight};else{const t=parseInt(this.width),e=parseInt(this.height);this.modalSize={width:t,height:e}}void 0!==this.initialX&&void 0!==this.initialY?(this.modalPosition={x:this.initialX,y:this.initialY},this.hasBeenDragged=!0):"center"===this.position?this.modalPosition={x:(window.innerWidth-this.modalSize.width)/2,y:(window.innerHeight-this.modalSize.height)/2}:"right"===this.position?this.modalPosition={x:window.innerWidth-this.modalSize.width-20,y:(window.innerHeight-this.modalSize.height)/2}:this.modalPosition={x:100,y:100}},resetPosition(){this.initializePosition()},startDrag(t){if(this.isFullscreen||!this.draggable)return;t.preventDefault(),this.isDragging=!0,this.hasBeenDragged=!0;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY,n=this.$refs.modalRef?this.$refs.modalRef.getBoundingClientRect():null;n&&("center"===this.position||"right"===this.position||0===this.modalPosition.x&&0===this.modalPosition.y)&&(this.modalPosition={x:n.left,y:n.top}),this.dragStart={x:e-this.modalPosition.x,y:i-this.modalPosition.y},document.addEventListener("mousemove",this.handleDrag),document.addEventListener("mouseup",this.stopDrag),document.addEventListener("touchmove",this.handleDrag),document.addEventListener("touchend",this.stopDrag)},handleDrag(t){if(!this.isDragging)return;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY;let n=e-this.dragStart.x,o=i-this.dragStart.y;if(this.enableBoundary){const t=0,e=window.innerWidth-this.modalSize.width,i=0,s=window.innerHeight-this.modalSize.height;n<t?n=t:n>e&&(n=e),o<i?o=i:o>s&&(o=s)}this.modalPosition={x:n,y:o},this.$emit("move",this.modalPosition)},stopDrag(){this.isDragging=!1,document.removeEventListener("mousemove",this.handleDrag),document.removeEventListener("mouseup",this.stopDrag),document.removeEventListener("touchmove",this.handleDrag),document.removeEventListener("touchend",this.stopDrag)},startResize(t){if(this.isFullscreen||!this.resizable)return;t.preventDefault(),this.isResizing=!0;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY;this.resizeStart={x:e,y:i,width:this.modalSize.width,height:this.modalSize.height},document.addEventListener("mousemove",this.handleResize),document.addEventListener("mouseup",this.stopResize),document.addEventListener("touchmove",this.handleResize),document.addEventListener("touchend",this.stopResize)},handleResize(t){if(!this.isResizing)return;const e="touches"in t?t.touches[0].clientX:t.clientX,i="touches"in t?t.touches[0].clientY:t.clientY,n=e-this.resizeStart.x,o=i-this.resizeStart.y;let s=Math.max(300,this.resizeStart.width+n),a=Math.max(200,this.resizeStart.height+o);if(this.enableBoundary){const t=window.innerWidth-this.modalPosition.x,e=window.innerHeight-this.modalPosition.y;s>t&&(s=t),a>e&&(a=e)}this.modalSize={width:s,height:a},this.$emit("resize",this.modalSize)},stopResize(){this.isResizing=!1,document.removeEventListener("mousemove",this.handleResize),document.removeEventListener("mouseup",this.stopResize),document.removeEventListener("touchmove",this.handleResize),document.removeEventListener("touchend",this.stopResize)},open(t,e="西之月客服"){this.iframeUrl=t,this.modalTitle=e,this.visible=!0,this.$nextTick((()=>{if(this.createModal(),this.modalInstance&&this.modalInstance.$children[0]){const i=this.modalInstance.$children[0];i.iframeUrl=t,i.modalTitle=e,i.visible=!0,i.initializePosition&&i.initializePosition()}})),this.$emit("update:visible",!0),console.log("ChatModal open 方法被调用,visible:",this.visible)},close(){this.closeModal()},toggle(){this.visible=!this.visible,this.$emit("update:visible",this.visible)},setPosition(t,e){if(this.modalInstance&&this.modalInstance.$children[0]){const i=this.modalInstance.$children[0];i.modalPosition={x:t,y:e},i.hasBeenDragged=!0,this.$emit("move",{x:t,y:e})}},setSize(t,e){if(this.modalInstance&&this.modalInstance.$children[0]){this.modalInstance.$children[0].modalSize={width:t,height:e},this.$emit("resize",{width:t,height:e})}},toggleFullscreen(){if(this.modalInstance&&this.modalInstance.$children[0]){this.modalInstance.$children[0].toggleFullscreen()}},isFullscreen(){if(this.modalInstance&&this.modalInstance.$children[0]){return this.modalInstance.$children[0].isFullscreen}return!1},handleLeftButtonClick(){this.$emit("left-button-click")}},render:createElement=>null},i={development:"https://api.dev.szad.teehmoon.com/chat-service",test:"https://api.test.szad.teehmoon.com/chat-service",production:"https://api-x.westmonth.com/chat-service",uat:"https://api.uat.teehmoon.com/chat-service"},n={dev:"http://localhost:5666",development:"https://im.dev.szad.teehmoon.com",production:"https://im.westmonth.com",test:"https://im.test.szad.teehmoon.com",uat:"https://im.uat.teehmoon.com"},o={development:"wss://api.test.szad.teehmoon.com/chat-service/init",test:"wss://api.test.szad.teehmoon.com/chat-service/init",uat:"wss://api.uat.teehmoon.com/chat-service/init",production:"wss://api-x.westmonth.com/chat-service/init"},s=(t,e)=>{const s=o[t];return{...{isProduction:"production"===t,apiBaseUrl:i[t],timeout:1e4,retryCount:3,modalUrl:n[t],wsUrl:e?`${s}?token=${e}`:s}}},a=()=>{localStorage.removeItem("im_token")},l=()=>localStorage.getItem("im_token"),d=t=>{localStorage.setItem("im_token",t)};class r{constructor(t,e={}){this.url=t,this.socket=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5,this.reconnectInterval=3e3,this.reconnectTimer=null,this.heartbeatTimer=null,this.heartbeatInterval=3e3,this.pongTimeout=5e3,this.callbacks={onOpen:e.onOpen||(()=>{}),onMessage:e.onMessage||(()=>{}),onError:e.onError||(()=>{}),onClose:e.onClose||(()=>{}),onStatusChange:e.onStatusChange||(()=>{}),onBadgeUpdate:e.onBadgeUpdate||(()=>{})},this.status="disconnected"}on(t,e){this.callbacks[t]&&(this.callbacks[t]=e)}connect(t){return this.socket&&this.socket.readyState===WebSocket.OPEN?(console.log("WebSocket已经连接"),Promise.resolve()):new Promise(((e,i)=>{this.updateStatus("connecting"),this.currentToken=t;try{this.socket=new WebSocket(this.url,[t]),this.socket.onopen=t=>{this.handleOpen(t),e(t)},this.socket.onmessage=t=>{this.handleMessage(t)},this.socket.onerror=t=>{this.handleError(t),i(t)},this.socket.onclose=t=>{this.handleClose(t)}}catch(n){console.error("WebSocket连接错误:",n),this.updateStatus("disconnected"),this.callbacks.onError(n),i(n)}}))}handleOpen(t){console.log("WebSocket连接已建立"),this.reconnectAttempts=0,this.updateStatus("connected"),this.callbacks.onOpen(t),this.startHeartbeat()}handleMessage(t){try{const e=JSON.parse(t.data);this.callbacks.onBadgeUpdate(e.data.unread_data.default.total||0),this.callbacks.onMessage(e,t)}catch(e){this.callbacks.onMessage(t.data,t)}}handleError(t){this.updateStatus("disconnected"),this.callbacks.onError(t),this.stopHeartbeat()}handleClose(t){this.updateStatus("disconnected"),this.stopHeartbeat(),this.callbacks.onClose(t),1e3!==t.code&&this.reconnectAttempts<this.maxReconnectAttempts?this.scheduleReconnect():this.reconnectAttempts>=this.maxReconnectAttempts&&this.callbacks.onError(new Error("WebSocket重连次数已达上限"))}scheduleReconnect(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectAttempts++,this.reconnectTimer=setTimeout((()=>{this.currentToken&&this.reconnectAttempts<=this.maxReconnectAttempts&&this.connect(this.currentToken).catch((t=>{console.error(`第${this.reconnectAttempts}次重连失败:`,t)}))}),this.reconnectInterval)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval((()=>{this.socket&&this.socket.readyState===WebSocket.OPEN?this.send({type:"ping",timestamp:Date.now()}):this.stopHeartbeat()}),this.heartbeatInterval)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}send(t){if(!this.socket||this.socket.readyState!==WebSocket.OPEN)return console.warn("WebSocket未连接,无法发送消息"),!1;try{const e="object"==typeof t?JSON.stringify(t):t;return this.socket.send(e),!0}catch(e){return console.error("WebSocket发送失败:",e),this.callbacks.onError(e),!1}}disconnect(){this.reconnectAttempts=this.maxReconnectAttempts,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.stopHeartbeat(),this.socket&&(this.socket.close(1e3,"用户主动断开"),this.socket=null),this.updateStatus("disconnected")}updateStatus(t){this.status!==t&&(this.status=t,this.callbacks.onStatusChange(t))}getStatus(){return this.status}isConnected(){return this.socket&&this.socket.readyState===WebSocket.OPEN}resetReconnectCount(){this.reconnectAttempts=0}getReconnectAttempts(){return this.reconnectAttempts}reconnect(){return this.resetReconnectCount(),this.currentToken?this.connect(this.currentToken):Promise.reject(new Error("没有可用的token"))}}const c={name:"GlobalLoading",props:{visible:{type:Boolean,default:!1},text:{type:String,default:""},background:{type:String,default:"rgba(0, 0, 0, 0.5)"},zIndex:{type:Number,default:9999},size:{type:String,default:"40px"},color:{type:String,default:"#007BFF"},spinnerType:{type:String,default:"spinner",validator:t=>["spinner","dots","bars"].includes(t)},fullscreen:{type:Boolean,default:!0},target:{type:String,default:"body"}},data:()=>({loadingInstance:null,loadingElement:null,isVisible:!1}),watch:{visible:{handler(t){this.$nextTick((()=>{t?this.show():this.hide()}))},immediate:!0}},mounted(){this.visible&&this.show()},beforeDestroy(){this.hide()},methods:{show(){this.isVisible||(this.createLoading(),this.isVisible=!0)},hide(){this.isVisible&&(this.destroyLoading(),this.isVisible=!1)},createLoading(){if(this.loadingInstance)return;this.ensureStyles();const t=document.createElement("div");t.id=`global-loading-container-${Date.now()}`,t.className="global-loading-container";const e={position:"fixed",top:"0",left:"0",width:"100%",height:"100%",backgroundColor:this.background,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",zIndex:this.zIndex,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',pointerEvents:"auto"};Object.assign(t.style,e);const i=document.createElement("div");i.className="global-loading-content",i.style.cssText="\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n padding: 24px;\n min-width: 120px;\n text-align: center;\n pointer-events: none;\n ";const n=this.createSpinner();if(i.appendChild(n),this.text){const t=document.createElement("div");t.className="global-loading-text",t.textContent=this.text,t.style.cssText="\n margin-top: 16px;\n color: #333;\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n white-space: nowrap;\n ",i.appendChild(t)}t.appendChild(i);const o="body"===this.target?document.body:document.querySelector(this.target);o&&(o.appendChild(t),this.loadingElement=t),this.loadingInstance=new Vue({el:t,data:()=>({visible:!0}),methods:{hide(){this.visible=!1,this.$emit("hide")}}})},ensureStyles(){if(document.getElementById("global-loading-styles"))return;const t=document.createElement("style");t.id="global-loading-styles",t.textContent="\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n \n @keyframes bounce {\n 0%, 80%, 100% {\n transform: scale(0);\n opacity: 0.3;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n }\n \n @keyframes bars {\n 0%, 40%, 100% {\n transform: scaleY(0.4);\n opacity: 0.3;\n }\n 20% {\n transform: scaleY(1);\n opacity: 1;\n }\n }\n \n // .global-loading-container {\n // animation: fadeIn 0.2s ease-in-out;\n // }\n \n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n \n // .global-loading-content {\n // animation: slideIn 0.3s ease-out;\n // }\n \n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(-20px) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n ",document.head.appendChild(t)},createSpinner(){const t=document.createElement("div");switch(t.className="global-loading-spinner",t.style.cssText=`\n width: ${this.size};\n height: ${this.size};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,this.spinnerType){case"spinner":default:this.createSpinnerAnimation(t);break;case"dots":this.createDotsAnimation(t);break;case"bars":this.createBarsAnimation(t)}return t},createSpinnerAnimation(t){const e=document.createElement("div");e.style.cssText=`\n width: 100%;\n height: 100%;\n border: 3px solid #f3f3f3;\n border-top: 3px solid ${this.color};\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n `,t.appendChild(e)},createDotsAnimation(t){const e=document.createElement("div");e.style.cssText="\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n ";for(let i=0;i<3;i++){const t=document.createElement("div");t.style.cssText=`\n width: 8px;\n height: 8px;\n background-color: ${this.color};\n border-radius: 50%;\n animation: bounce 1.4s ease-in-out infinite both;\n animation-delay: ${.16*i}s;\n flex-shrink: 0;\n `,e.appendChild(t)}t.appendChild(e)},createBarsAnimation(t){const e=document.createElement("div");e.style.cssText="\n display: flex;\n gap: 4px;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n ";for(let i=0;i<4;i++){const t=document.createElement("div");t.style.cssText=`\n width: 4px;\n height: 20px;\n background-color: ${this.color};\n animation: bars 1.2s ease-in-out infinite both;\n animation-delay: ${.1*i}s;\n flex-shrink: 0;\n border-radius: 2px;\n `,e.appendChild(t)}t.appendChild(e)},destroyLoading(){if(this.loadingInstance){try{this.loadingInstance.$destroy()}catch(t){console.error(t)}this.loadingInstance=null}if(this.loadingElement)try{this.loadingElement.parentNode&&this.loadingElement.parentNode.removeChild(this.loadingElement),this.loadingElement=null}catch(t){console.error(t),this.loadingElement&&(this.loadingElement.style.display="none",this.loadingElement.style.visibility="hidden")}this.cleanupAllLoadingElements()},cleanupAllLoadingElements(){try{document.querySelectorAll(".global-loading-container").forEach((t=>{t.parentNode&&t.parentNode.removeChild(t)}));const t=document.getElementById("global-loading-styles");t&&t.parentNode&&t.parentNode.removeChild(t)}catch(t){console.error("GlobalLoading cleanupAllLoadingElements() - error:",t)}},updateText(t){if(this.text=t,this.loadingElement){const e=this.loadingElement.querySelector(".global-loading-text");e&&(e.textContent=t)}},updateBackground(t){this.background=t,this.loadingElement&&(this.loadingElement.style.backgroundColor=t)},updateColor(t){if(this.color=t,this.loadingElement){const t=this.loadingElement.querySelector(".global-loading-spinner");t&&(t.innerHTML="",this.createSpinner())}}},render:()=>null},m={name:"ChatButtonWithBadge",components:{ChatModal:e,GlobalLoading:c},props:{autoFetch:{type:Boolean,default:!0},params:{type:Object,default:()=>({})},iconUrl:{type:String,default:""},iconColor:{type:String,default:"#fff"},themeColor:{type:String,default:"#1890ff"},badgeColor:{type:String,default:"#ff3860"},environment:{type:String,default:"development",validator:t=>["development","production","test"].includes(t)},showBadge:{type:Boolean,default:!0},modalUrl:{type:String,default:""},modalTitle:{type:String,default:"西之月客服"},modalPosition:{type:String,default:"center",validator:t=>["right","center","fullscreen"].includes(t)},modalWidth:{type:String,default:"600px"},modalHeight:{type:String,default:"600px"},closeOnOverlay:{type:Boolean,default:!1},closeOnEscape:{type:Boolean,default:!1},isFixed:{type:Boolean,default:!0},fixedPosition:{type:String,default:"bottom-right",validator:t=>["bottom-right","bottom-left","top-right","top-left"].includes(t)},fixedOffset:{type:Object,default:()=>({x:20,y:60})},autoPosition:{type:Boolean,default:!0},isOrder:{type:Boolean,default:!1},isOpenTab:{type:Boolean,default:!1},path:{type:String,default:"/chat"},token:{type:String,required:!0},showGlobalLoading:{type:Boolean,default:!0},globalLoadingText:{type:String,default:""},globalLoadingDelay:{type:Number,default:100},loadingSpinnerType:{type:String,default:"spinner",validator:t=>["spinner","dots","bars"].includes(t)},loadingColor:{type:String,default:"#1890ff"},loadingSize:{type:String,default:"40px"}},data:()=>({badgeCount:0,loading:!1,globalLoading:!1,globalLoadingTimer:null,errorModalVisible:!1,errorModalMessage:"",accessToken:"",startChat:!1,wsClient:null,wsStatus:"disconnected",wsConnecting:!1}),computed:{buttonStyle(){return{background:this.themeColor,boxShadow:`0 4px 12px ${this.themeColor}30`,fill:this.iconColor}},badgeStyle(){return{background:this.badgeColor,boxShadow:`0 2px 4px ${this.badgeColor}30`}},fixedStyle(){if(!this.isFixed)return{};const{x:t=20,y:e=20}=this.fixedOffset||{};const i={position:"fixed",zIndex:"9999"};switch(this.fixedPosition||"bottom-right"){case"bottom-right":default:i.right=`${t}px`,i.bottom=`${e}px`;break;case"bottom-left":i.left=`${t}px`,i.bottom=`${e}px`;break;case"top-r