vue-chat-kit 0.3.8 → 0.3.10
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/dist/vue-chat-kit.css +1 -1
- package/dist/vue-chat-kit.es.js +2948 -2148
- package/dist/vue-chat-kit.umd.js +1 -1
- package/package.json +1 -1
- package/src/components/ChatPanel.vue +1381 -44
- package/src/composables/useChat.js +157 -596
- package/src/composables/useChatCore.js +207 -0
- package/src/composables/useFriendChat.js +423 -0
- package/src/composables/useGroupChat.js +748 -0
- package/src/config/index.js +21 -2
- package/src/core/adapter-example.js +90 -0
- package/src/core/api.js +189 -0
- package/src/core/websocket.js +25 -9
- package/src/index.js +0 -4
- package/src/components/ChatWindow.vue +0 -2144
package/dist/vue-chat-kit.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(J,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("dayjs"),require("element-plus")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","dayjs","element-plus"],e):(J=typeof globalThis<"u"?globalThis:J||self,e(J.VueChatKit={},J.Vue,J.ElementPlusIconsVue,J.dayjs,J.ElementPlus))})(this,function(J,e,V,Ae,j){"use strict";class ve{constructor(t,s={}){this.userId=t,this.wsUrl=s.wsUrl||"",this.socket=null,this.reconnectAttempts=0,this.maxReconnectAttempts=s.maxReconnectAttempts||5,this.reconnectDelay=s.reconnectDelay||3e3,this.handlers={message:[],open:[],close:[],error:[]},this.isConnecting=!1,this.manualClose=!1}connect(){if(!(this.isConnecting||this.isConnected())){this.isConnecting=!0,this.manualClose=!1;try{this.socket=new WebSocket(this.wsUrl),this.socket.onopen=()=>{console.log("[VueChatKit] WebSocket 连接成功"),this.isConnecting=!1,this.reconnectAttempts=0,this.emit("open")},this.socket.onmessage=t=>{try{const s=t.data;this.emit("message",s)}catch(s){console.error("[VueChatKit] WebSocket 消息解析失败",s)}},this.socket.onclose=t=>{console.log("[VueChatKit] WebSocket 连接关闭",t.code),this.isConnecting=!1,this.emit("close",t),!this.manualClose&&t.code!==1e3&&this.reconnect()},this.socket.onerror=t=>{console.error("[VueChatKit] WebSocket 连接错误",t),this.isConnecting=!1,this.emit("error",t)}}catch(t){console.error("[VueChatKit] WebSocket 创建连接失败",t),this.isConnecting=!1}}}send(t,s,d="text",_="",H="",D=0){if(this.isConnected()){const X=JSON.stringify({to:t,msg:s,type:d,fileUrl:_,fileName:H,fileSize:D});return this.socket.send(X),!0}return console.warn("[VueChatKit] WebSocket 连接未建立,无法发送消息"),!1}on(t,s){this.handlers[t]&&this.handlers[t].push(s)}off(t,s){if(this.handlers[t]){const d=this.handlers[t].indexOf(s);d>-1&&this.handlers[t].splice(d,1)}}emit(t,...s){this.handlers[t]&&this.handlers[t].forEach(d=>d(...s))}reconnect(){this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,console.log(`[VueChatKit] 尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`),setTimeout(()=>this.connect(),this.reconnectDelay)):console.error("[VueChatKit] 重连次数已达上限")}close(){this.manualClose=!0,this.socket&&(this.socket.close(),this.socket=null,this.handlers={message:[],open:[],close:[],error:[]})}isConnected(){return this.socket&&this.socket.readyState===WebSocket.OPEN}}class $e extends Error{constructor(t,s,d,_){super(t),this.name="RequestError",this.status=s||0,this.code=d||0,this.data=_}}class et{constructor(t={}){this.baseUrl=t.baseUrl||"",this.timeout=t.timeout||1e4,this.headers=t.headers||{},this.requestInterceptors=[],this.responseInterceptors=[],t.requestInterceptors&&Array.isArray(t.requestInterceptors)&&t.requestInterceptors.forEach(s=>{this.requestInterceptors.push(s)}),this.addRequestInterceptor(s=>(s.body instanceof FormData||(s.headers={"Content-Type":"application/json",...s.headers}),s)),t.responseInterceptors&&Array.isArray(t.responseInterceptors)&&t.responseInterceptors.forEach(s=>{this.responseInterceptors.push(s)})}addRequestInterceptor(t){this.requestInterceptors.push(t)}addResponseInterceptor(t){this.responseInterceptors.push(t)}timeoutPromise(t){return new Promise((s,d)=>{setTimeout(()=>{d(new $e("请求超时",408,408))},t)})}async request(t,s={}){const{method:d="GET",headers:_={},body:H,params:D}=s;let X=t.startsWith("http")?t:`${this.baseUrl}${t}`,b={method:d,headers:{...this.headers,..._},body:H,params:D};this.requestInterceptors.forEach(w=>{b=w(b)});const Q={method:b.method,headers:b.headers,credentials:"include"};if(b.body&&d!=="GET"&&(b.body instanceof FormData?Q.body=b.body:typeof b.body=="object"?Q.body=JSON.stringify(b.body):Q.body=b.body),b.params){const w=new URLSearchParams;for(const N in b.params)b.params[N]!==void 0&&b.params[N]!==null&&b.params[N]!==""&&w.append(N,b.params[N]);const k=w.toString();k&&(X+=(X.includes("?")?"&":"?")+k)}try{let k=await Promise.race([fetch(X,Q),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(ae=>{k=ae(k)}),!k.ok)throw new $e(`HTTP ${k.status}: ${k.statusText}`,k.status,k.status);const N=k.headers.get("content-type");let p;return N&&N.includes("application/json")?p=await k.json():p=await k.text(),p}catch(w){throw w instanceof $e?w:new $e(w instanceof Error?w.message:"网络错误",0,0)}}get(t,s,d){return this.request(t,{...d,method:"GET",params:s})}post(t,s,d){return this.request(t,{...d,method:"POST",body:s})}put(t,s,d){return this.request(t,{...d,method:"PUT",body:s})}delete(t,s){return this.request(t,{...s,method:"DELETE"})}}class ze{constructor(t,s=null){this.config=t,this.endpoints=t.api.endpoints,this.customAdapter=t.api.adapter,s?this.http=s:this.http=new et({baseUrl:t.api.baseUrl,headers:t.headers,requestInterceptors:t.requestInterceptors,responseInterceptors:t.responseInterceptors})}async _call(t,...s){return this.customAdapter&&typeof this.customAdapter[t]=="function"?this.customAdapter[t](...s):this[`_${t}`](...s)}async getFriends(t){return this._call("getFriends",t)}async _getFriends(t){return this.http.get(this.endpoints.getFriends,{currentUser:t})}async getAvailableUsers(t){return this._call("getAvailableUsers",t)}async _getAvailableUsers(t){return this.http.get(this.endpoints.getAvailableUsers,{currentUser:t})}async searchUser(t){return this._call("searchUser",t)}async _searchUser(t){return this.http.get(this.endpoints.searchUser,{keyword:t})}async addFriend(t,s){return this._call("addFriend",t,s)}async _addFriend(t,s){return this.http.post(this.endpoints.addFriend,{currentUser:t,friendUser:s})}async getApplyList(t){return this._call("getApplyList",t)}async _getApplyList(t){return this.http.get(this.endpoints.getApplyList,{currentUser:t})}async agreeFriend(t,s){return this._call("agreeFriend",t,s)}async _agreeFriend(t,s){return this.http.post(this.endpoints.agreeFriend,{applyUser:t,friendUser:s})}async setChatStatus(t,s,d=1){return this._call("setChatStatus",t,s,d)}async _setChatStatus(t,s,d){return this.http.post(this.endpoints.setChatStatus,null,{params:{currentUser:t,friendUser:s,status:d}})}async getHistory(t,s){return this._call("getHistory",t,s)}async _getHistory(t,s){return this.http.get(this.endpoints.getHistory,{fromUser:t,toUser:s})}async setRead(t,s){return this._call("setRead",t,s)}async _setRead(t,s){return this.http.post(this.endpoints.setRead,{currentUser:t,friendUser:s})}async uploadFile(t){return this._call("uploadFile",t)}async _uploadFile(t){const s=new FormData;return s.append("file",t),this.http.post(this.endpoints.uploadFile,s)}async updateUserInfo(t,s){return this._call("updateUserInfo",t,s)}async _updateUserInfo(t,s){return this.http.put(this.endpoints.updateUserInfo,{username:t,...s})}async getUserAvatar(t){return this._call("getUserAvatar",t)}async _getUserAvatar(t){return this.http.get(this.endpoints.getUserAvatar,{username:t})}async uploadAvatar(t,s){return this._call("uploadAvatar",t,s)}async _uploadAvatar(t,s){const d=new FormData;return d.append("file",t),d.append("username",s),this.http.post(this.endpoints.uploadAvatar,d)}}const tt=Object.freeze(Object.defineProperty({__proto__:null,ChatApi:ze,default:ze},Symbol.toStringTag,{value:"Module"}));function Re(g,t){const s=new ze(g);let d=null;const _=g.user.username,H=e.ref(g.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${_}`),D=e.ref({username:_,nickname:g.user.nickname||"",email:g.user.email||"",phone:g.user.phone||"",bio:g.user.bio||""}),X=e.ref(!1),b=e.ref([]),Q=e.ref([]),w=e.ref([]),k=e.ref(""),N=e.ref(""),p=e.ref(""),ae=e.ref(null),he=e.ref(!1),le=e.ref(""),y=e.ref([]),ne=e.ref(!1),ce=e.ref([]),ge=e.ref(!1),de=e.computed(()=>{let r=Q.value;if(N.value){const i=N.value.toLowerCase();r=r.filter(f=>{var B;return(B=f.username)==null?void 0:B.toLowerCase().includes(i)})}return r.map(i=>({id:i.username,name:i.username,avatar:i.avatar||H.value,online:i.online,lastMsg:i.lastMsg||"暂无消息",lastTime:i.lastTime,unread:i.unReadNum||0}))}),pe=e.computed(()=>{let r=b.value;if(N.value){const i=N.value.toLowerCase();r=r.filter(f=>{var B;return(B=f.username)==null?void 0:B.toLowerCase().includes(i)})}return r.map(i=>({id:i.username,name:i.username,avatar:i.avatar||H.value,online:i.online,isChatting:i.isChatting}))}),ye=e.computed(()=>y.value),ke=e.computed(()=>de.value.find(r=>r.id===k.value)||null),Ce=e.computed(()=>w.value.map(r=>{const i=r.type==="file"||r.fileUrl||r.fileName,f=r.fileName||r.msgContent;return{text:r.msgContent,isSelf:r.sendUsername===_,time:r.createTime,sendUsername:r.sendUsername,type:i?"file":"text",fileType:u(f)?"image":E(f),fileUrl:r.fileUrl||"",fileName:f,fileSize:r.fileSize||0}})),be=r=>Ae(r).format("HH:mm"),_e=r=>{if(!r)return"";const i=Ae(),f=Ae(r);return i.isSame(f,"day")?f.format("HH:mm"):i.diff(f,"day")===1?"昨天":i.diff(f,"day")<7?["周日","周一","周二","周三","周四","周五","周六"][f.day()]:f.format("MM/DD")},u=r=>{if(!r)return!1;const i=["jpg","jpeg","png","gif","bmp","webp","svg"],f=r.split(".").pop().toLowerCase();return i.includes(f)},E=r=>{if(!r)return"default";const i=r.split(".").pop().toLowerCase();return["xls","xlsx"].includes(i)?"excel":["pdf"].includes(i)?"pdf":["doc","docx"].includes(i)?"docx":"default"},T=()=>{e.nextTick(()=>{ae.value&&(ae.value.scrollTop=ae.value.scrollHeight)})},S=async()=>{try{const i=(await s.getFriends(_)).data||[];b.value=i,Q.value=i.filter(f=>f.isChatting===1);for(const f of Q.value)try{const P=(await s.getHistory(_,f.username)).data||[];f.unReadNum=P.filter(L=>L.isRead===0&&L.sendUsername===f.username).length}catch{f.unReadNum=0}}catch(r){console.error("[VueChatKit] 获取好友列表失败",r)}},$=async r=>{try{const i=await s.getHistory(_,r);w.value=i.data||[],T()}catch(i){console.error("[VueChatKit] 获取聊天历史失败",i)}},z=async r=>{try{await s.setRead(_,r),S()}catch(i){console.error("[VueChatKit] 标记已读失败",i)}},A=async r=>{k.value=r.id,await $(r.id),await z(r.id),T()},Y=async(r,i=1)=>{try{return await s.setChatStatus(_,r,i),await S(),!0}catch(f){return console.error("[VueChatKit] 设置聊天状态失败",f),!1}},q=()=>{if(!p.value.trim()||!k.value||!d)return;if(d.send(k.value,p.value.trim(),"text")){const i={msgContent:p.value.trim(),sendUsername:_,receiveUsername:k.value,createTime:new Date,isRead:0,type:"text"};w.value.push(i),p.value="",T(),setTimeout(()=>{$(k.value),S()},300)}},F=async r=>{if(!k.value||!d)return!1;try{const i=await s.uploadFile(r);if(i.code===200&&i.data){const{fileUrl:f,fileName:B}=i.data;if(d.send(k.value,B,"file",f,B,r.size)){const L={msgContent:B,sendUsername:_,receiveUsername:k.value,createTime:new Date,isRead:0,type:"file",fileUrl:f,fileName:B,fileSize:r.size};return w.value.push(L),T(),!0}}return!1}catch(i){return console.error("[VueChatKit] 发送文件失败",i),!1}},I=async(r,i)=>{if(!(!k.value||!d)){if(i&&i.trim()&&d.send(k.value,i.trim(),"text")){const B={msgContent:i.trim(),sendUsername:_,receiveUsername:k.value,createTime:new Date,isRead:0,type:"text"};w.value.push(B)}for(const f of r){const B=f.file||f;await F(B)}setTimeout(()=>{$(k.value),S()},300)}},K=r=>{try{try{const f=JSON.parse(r);if(f.to||f.msg)return{to:f.to,content:f.msg,type:f.type||"text",fileUrl:f.fileUrl||"",fileName:f.fileName||"",fileSize:f.fileSize||0}}catch{}const i=r.match(/^\[(.+?)\]:(.+)$/);if(i)return{username:i[1],content:i[2],type:"text"}}catch(i){console.error("[VueChatKit] 解析消息失败",i)}return null},G=r=>{if(r.includes("【状态变更】")){const f=/【状态变更】(.+?) 已(上线|下线)/,B=r.match(f);if(B){const P=B[1],L=B[2]==="上线",se=b.value.find(ue=>ue.username===P);se&&(se.online=L)}return}const i=K(r);if(i){const f={content:i.content,username:i.username||k.value,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0,timestamp:new Date};if(k.value){try{let B={msgContent:i.content,sendUsername:f.username,receiveUsername:_,createTime:new Date,isRead:0,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0};w.value.push(B),T()}catch(B){console.error("[VueChatKit] 添加临时消息失败",B)}$(k.value)}S(),t&&typeof t=="function"&&t(f)}},Z=()=>{const r=`${g.api.websocketUrl}?userId=${_}`;d=new ve(_,{wsUrl:r,maxReconnectAttempts:g.websocket.maxReconnectAttempts,reconnectDelay:g.websocket.reconnectDelay}),d.on("message",G),d.connect()},O=()=>{d&&(d.close(),d=null)},C=async()=>{he.value=!0,le.value="",y.value=[]},U=async(r="")=>{ne.value=!0;try{let i;r?i=await s.searchUser(r):i=await s.getAvailableUsers(_),y.value=(i==null?void 0:i.data)||[]}catch(i){console.error("[VueChatKit] 获取可用用户失败",i)}finally{ne.value=!1}},x=async r=>{try{await s.addFriend(_,r.username),await S(),he.value=!1}catch(i){console.error("[VueChatKit] 添加好友失败",i)}},R=async()=>{ge.value=!0;try{const r=await s.getApplyList(_);ce.value=r.data||[]}catch(r){console.error("[VueChatKit] 获取好友申请列表失败",r)}finally{ge.value=!1}},v=async r=>{try{await s.agreeFriend(r,_),await R(),await S()}catch(i){console.error("[VueChatKit] 同意好友申请失败",i)}},W=async()=>{try{const r=await s.getUserAvatar(_);r.code===200&&r.data&&(H.value=r.data)}catch(r){console.warn("[VueChatKit] 加载头像失败",r)}},ee=r=>{H.value=r},fe=async r=>{try{return(await s.updateUserInfo(_,r)).code===200?(D.value={...D.value,...r},!0):!1}catch(i){return console.error("[VueChatKit] 更新用户信息失败",i),!1}},ie=()=>{k.value="",w.value=[],p.value="",N.value=""};return W(),e.watch(le,async r=>{await U(r)}),{myUsername:_,myAvatar:H,userInfo:D,loadingUserInfo:X,friendList:b,chatList:Q,filteredFriendList:pe,chatMsgList:w,currentSelectName:k,searchText:N,inputText:p,messagesContainer:ae,filteredUsers:de,filteredAvailableUsers:ye,currentUser:ke,currentMessages:Ce,addFriendDialogVisible:he,addFriendSearchText:le,availableUsers:y,loadingAvailableUsers:ne,friendApplyList:ce,loadingFriendApply:ge,formatTime:be,formatLastTime:_e,scrollToBottom:T,getFriendList:S,getChatHistory:$,setFriendToChatStatus:Y,selectUser:A,sendMessage:q,sendFile:F,sendFilesAndText:I,initWebSocket:Z,closeWebSocket:O,reset:ie,openAddFriendDialog:C,loadAvailableUsers:U,addFriend:x,loadFriendApplyList:R,agreeFriend:v,updateMyAvatar:ee,updateUserInfo:fe}}const Fe=(g,t)=>{const s=g.__vccOpts||g;for(const[d,_]of t)s[d]=_;return s},it={class:"avatar-crop-container"},rt={key:0,class:"crop-wrapper"},ct=["src"],dt=["onMousedown","onTouchstart"],mt={class:"preview-wrapper"},pt=["width","height"],ft={class:"dialog-footer"},Me=Fe({__name:"AvatarCrop",props:{modelValue:Boolean,src:{type:String,default:""},dialogWidth:{type:String,default:"520px"},cropAreaHeight:{type:String,default:"288px"},previewSize:{type:Number,default:96},outputSize:{type:Number,default:400},outputType:{type:String,default:"image/jpeg"},outputQuality:{type:Number,default:.9},appendToBody:{type:Boolean,default:!0},aspectRatio:{type:Number,default:1},minSize:{type:Number,default:50}},emits:["update:modelValue","confirm","cancel","closed"],setup(g,{expose:t,emit:s}){const d=g,_=s,H=e.computed({get:()=>d.modelValue,set:u=>_("update:modelValue",u)}),D=e.computed({get:()=>d.src,set:u=>{}}),X=["nw","n","ne","e","se","s","sw","w"],b=e.ref(!1),Q=e.ref(null),w=e.ref(null),k=e.ref(null),N=e.ref({naturalWidth:0,naturalHeight:0,displayWidth:0,displayHeight:0,offsetX:0,offsetY:0}),p=e.ref({x:0,y:0,size:150,minSize:d.minSize}),ae=e.computed(()=>({width:`${N.value.displayWidth}px`,height:`${N.value.displayHeight}px`,maxWidth:"none",maxHeight:"none",display:"block"})),he=e.computed(()=>({left:`${p.value.x}px`,top:`${p.value.y}px`,width:`${p.value.size}px`,height:`${p.value.size/d.aspectRatio}px`}));let le=null,y=null;const ne=()=>{e.nextTick(()=>{const u=w.value,E=Q.value;if(!u||!E)return;const T=E.clientWidth,S=E.clientHeight,$=u.naturalWidth/u.naturalHeight,z=T/S;let A,Y,q,F;$>z?(A=T,Y=T/$,q=0,F=(S-Y)/2):(Y=S,A=S*$,q=(T-A)/2,F=0),N.value={naturalWidth:u.naturalWidth,naturalHeight:u.naturalHeight,displayWidth:A,displayHeight:Y,offsetX:q,offsetY:F};const I=Math.min(A,Y)*.6;p.value.size=I,p.value.x=q+(A-I)/2,p.value.y=F+(Y-I/d.aspectRatio)/2,ce()})},ce=()=>{const u=k.value,E=w.value;if(!u||!E)return;const T=u.getContext("2d"),{naturalWidth:S,naturalHeight:$,displayWidth:z,displayHeight:A,offsetX:Y,offsetY:q}=N.value,F=S/z,I=$/A,K=(p.value.x-Y)*F,G=(p.value.y-q)*I,Z=p.value.size*F,O=p.value.size/d.aspectRatio*I;T.clearRect(0,0,u.width,u.height),T.drawImage(E,K,G,Z,O,0,0,u.width,u.height)},ge=u=>{u.preventDefault();const E=u.clientX||u.touches[0].clientX,T=u.clientY||u.touches[0].clientY;le={startX:E,startY:T,boxX:p.value.x,boxY:p.value.y};const S=z=>{const A=z.clientX||z.touches[0].clientX,Y=z.clientY||z.touches[0].clientY,q=A-le.startX,F=Y-le.startY,{offsetX:I,offsetY:K,displayWidth:G,displayHeight:Z}=N.value,O=p.value.size/d.aspectRatio,C=Math.max(I,Math.min(I+G-p.value.size,le.boxX+q)),U=Math.max(K,Math.min(K+Z-O,le.boxY+F));p.value.x=C,p.value.y=U,ce()},$=()=>{le=null,document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",$),document.removeEventListener("touchmove",S),document.removeEventListener("touchend",$)};document.addEventListener("mousemove",S),document.addEventListener("mouseup",$),document.addEventListener("touchmove",S,{passive:!1}),document.addEventListener("touchend",$)},de=(u,E)=>{E.preventDefault();const T=E.clientX||E.touches[0].clientX,S=E.clientY||E.touches[0].clientY;y={handle:u,startX:T,startY:S,boxX:p.value.x,boxY:p.value.y,boxSize:p.value.size};const $=A=>{const Y=A.clientX||A.touches[0].clientX,q=A.clientY||A.touches[0].clientY,F=Y-y.startX,I=q-y.startY,{offsetX:K,offsetY:G,displayWidth:Z,displayHeight:O}=N.value;let C=y.boxSize,U=y.boxX,x=y.boxY;const R=y.boxSize/d.aspectRatio;switch(u){case"se":C=Math.max(p.value.minSize,Math.min(Z-(y.boxX-K),O-(y.boxY-G),y.boxSize+Math.max(F,I)));break;case"nw":C=Math.max(p.value.minSize,Math.min(y.boxX-K+y.boxSize,y.boxY-G+R,y.boxSize-Math.max(F,I))),U=y.boxX+(y.boxSize-C),x=y.boxY+(R-C/d.aspectRatio);break;case"ne":C=Math.max(p.value.minSize,Math.min(K+Z-y.boxX,y.boxY-G+R,y.boxSize+Math.max(F,-I))),x=y.boxY+(R-C/d.aspectRatio);break;case"sw":C=Math.max(p.value.minSize,Math.min(y.boxX-K+y.boxSize,G+O-y.boxY,y.boxSize+Math.max(-F,I))),U=y.boxX+(y.boxSize-C);break;case"n":C=Math.max(p.value.minSize,Math.min(y.boxY-G+R,y.boxSize-I)),x=y.boxY+(R-C/d.aspectRatio);break;case"s":C=Math.max(p.value.minSize,Math.min(G+O-y.boxY,y.boxSize+I));break;case"w":C=Math.max(p.value.minSize,Math.min(y.boxX-K+y.boxSize,y.boxSize-F)),U=y.boxX+(y.boxSize-C);break;case"e":C=Math.max(p.value.minSize,Math.min(K+Z-y.boxX,y.boxSize+F));break}p.value.size=C,p.value.x=U,p.value.y=x,ce()},z=()=>{y=null,document.removeEventListener("mousemove",$),document.removeEventListener("mouseup",z),document.removeEventListener("touchmove",$),document.removeEventListener("touchend",z)};document.addEventListener("mousemove",$),document.addEventListener("mouseup",z),document.addEventListener("touchmove",$,{passive:!1}),document.addEventListener("touchend",z)},pe=()=>{const u=document.createElement("canvas"),E=w.value;if(!E)return null;const{naturalWidth:T,naturalHeight:S,displayWidth:$,displayHeight:z,offsetX:A,offsetY:Y}=N.value,q=T/$,F=S/z,I=(p.value.x-A)*q,K=(p.value.y-Y)*F,G=p.value.size*q,Z=p.value.size/d.aspectRatio*F;return u.width=d.outputSize,u.height=d.outputSize/d.aspectRatio,u.getContext("2d").drawImage(E,I,K,G,Z,0,0,u.width,u.height),new Promise(C=>{u.toBlob(U=>{C(new File([U],"avatar.jpg",{type:d.outputType}))},d.outputType,d.outputQuality)})},ye=()=>{const u=document.createElement("canvas"),E=w.value;if(!E)return null;const{naturalWidth:T,naturalHeight:S,displayWidth:$,displayHeight:z,offsetX:A,offsetY:Y}=N.value,q=T/$,F=S/z,I=(p.value.x-A)*q,K=(p.value.y-Y)*F,G=p.value.size*q,Z=p.value.size/d.aspectRatio*F;return u.width=d.outputSize,u.height=d.outputSize/d.aspectRatio,u.getContext("2d").drawImage(E,I,K,G,Z,0,0,u.width,u.height),u.toDataURL(d.outputType,d.outputQuality)},ke=async()=>{if(D.value){b.value=!0;try{const u=await pe(),E=ye();u&&_("confirm",{file:u,dataUrl:E})}catch(u){console.error(u),j.ElMessage.error("生成图片失败")}finally{b.value=!1}}},Ce=()=>{_("cancel"),H.value=!1},be=()=>{_e(),_("closed")},_e=()=>{p.value={x:0,y:0,size:150,minSize:d.minSize}};return e.watch(()=>d.src,u=>{u&&e.nextTick(()=>{w.value&&w.value.complete&&ne()})}),t({getCroppedImage:pe,getCroppedImageDataUrl:ye,reset:_e}),(u,E)=>{const T=e.resolveComponent("el-empty"),S=e.resolveComponent("el-button"),$=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock($,{modelValue:H.value,"onUpdate:modelValue":E[0]||(E[0]=z=>H.value=z),title:"调整头像",width:g.dialogWidth,"close-on-click-modal":!1,"append-to-body":g.appendToBody,onClosed:be},{footer:e.withCtx(()=>[e.createElementVNode("div",ft,[e.createVNode(S,{onClick:Ce},{default:e.withCtx(()=>[...E[2]||(E[2]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(S,{type:"primary",loading:b.value,disabled:!D.value,onClick:ke},{default:e.withCtx(()=>[...E[3]||(E[3]=[e.createTextVNode(" 确认 ",-1)])]),_:1},8,["loading","disabled"])])]),default:e.withCtx(()=>[e.createElementVNode("div",it,[D.value?(e.openBlock(),e.createElementBlock("div",rt,[e.createElementVNode("div",{ref_key:"cropAreaRef",ref:Q,class:"crop-area",style:e.normalizeStyle({height:g.cropAreaHeight})},[e.createElementVNode("img",{src:D.value,ref_key:"imageRef",ref:w,onLoad:ne,style:e.normalizeStyle(ae.value)},null,44,ct),e.createElementVNode("div",{class:"crop-box",style:e.normalizeStyle(he.value),onMousedown:ge,onTouchstart:ge},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(X,z=>e.createElementVNode("div",{key:z,class:e.normalizeClass(["crop-handle",z]),onMousedown:e.withModifiers(A=>de(z,A),["stop"]),onTouchstart:e.withModifiers(A=>de(z,A),["stop"])},null,42,dt)),64))],36)],4),e.createElementVNode("div",mt,[E[1]||(E[1]=e.createElementVNode("div",{class:"preview-label"},"预览",-1)),e.createElementVNode("div",{class:"preview-box",style:e.normalizeStyle({width:g.previewSize+"px",height:g.previewSize+"px"})},[e.createElementVNode("canvas",{ref_key:"previewCanvasRef",ref:k,width:g.previewSize,height:g.previewSize,class:"preview-canvas"},null,8,pt)],4)])])):(e.openBlock(),e.createBlock(T,{key:1,description:"请上传图片"}))])]),_:1},8,["modelValue","width","append-to-body"])}}},[["__scopeId","data-v-594eeaf3"]]),ht={class:"emoji-header"},gt=["onClick"],ut={class:"emoji-body"},yt=["onClick"],at=Fe({__name:"EmojiPicker",props:{visible:{type:Boolean,default:!1}},emits:["select","close"],setup(g,{emit:t}){const s=t,d=e.ref(0),_=[{id:"emoticons",icon:"😀",name:"表情",emojis:["😀","😃","😄","😁","😆","😅","🤣","😂","🙂","🙃","😉","😊","😇","🥰","😍","🤩","😘","😗","😚","😋","😛","😜","🤪","😝","🤑","🤗","🤭","🤫","🤔","🤐","🤨","😐","😑","😶","😏","😒","🙄","😬","🤥","😌","😔","😪","🤤","😴","😷","🤒","🤕","🤢","🤮","🤧","🥵","🥶","🥴","😵","🤯","🤠","🥳","😎","🤓","🧐","😕","😟","🙁","☹️","😮","😯","😲","😳","🥺","😦","😧","😨","😰","😥","😢","😭","😱","😖","😣","😞"]},{id:"gestures",icon:"👋",name:"手势",emojis:["👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","🤚🏻","🖐🏻","✋🏻","🖖🏻","👌🏻","🤌🏻","🤏🏻","✌🏻","🤞🏻","🤟🏻","🤘🏻","🤙🏻","👈🏻","👉🏻","👆🏻","🖕🏻","👇🏻","☝🏻","👍🏻"]},{id:"animals",icon:"🐶",name:"动物",emojis:["🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🐞","🐜","🦟","🦗","🕷️","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑"]},{id:"food",icon:"🍎",name:"食物",emojis:["🍎","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🥦","🥬","🥒","🌶️","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮"]},{id:"objects",icon:"⌚",name:"物品",emojis:["⌚","📱","📲","💻","⌨️","🖥️","🖨️","🖱️","🖲️","🕹️","🗜️","💽","💾","💿","📀","🧮","🎥","🎞️","📽️","🎬","📺","📷","📸","📹","📼","🔍","🔎","🕯️","💡","🔦","🏮","📔","📕","📖","📗","📘","📙","📚","📓","📒","📃","📜","📄","📰","🗞️","📑","🔖","🏷️","💰","🪙"]},{id:"nature",icon:"☀️",name:"自然",emojis:["☀️","🌤️","⛅","🌥️","☁️","🌦️","🌧️","⛈️","🌩️","🌨️","❄️","☃️","⛄","🌬️","💨","🌪️","🌫️","🌊","💧","💦","☔","☂️","🌱","🌲","🌳","🌴","🌵","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","⭐","🌟","✨","💫","🌙","🌚","🌛","🌜","🌝","🪐","🌍","🌎","🌏","⛱️","🏖️"]}],H=D=>{s("select",D)};return(D,X)=>g.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"emoji-picker",onClick:X[0]||(X[0]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",ht,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(_,(b,Q)=>e.createElementVNode("div",{key:b.id,class:e.normalizeClass(["emoji-category-tab",{active:d.value===Q}]),onClick:w=>d.value=Q},e.toDisplayString(b.icon),11,gt)),64))]),e.createElementVNode("div",ut,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_[d.value].emojis,b=>(e.openBlock(),e.createElementBlock("div",{key:b,class:"emoji-item",onClick:Q=>H(b)},e.toDisplayString(b),9,yt))),128))])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-6ca53096"]]),kt={class:"chat-panel"},_t={class:"chat-sidebar"},Vt=["src"],Et=["onClick"],Nt={key:0,class:"sidebar-nav-badge"},Ct={class:"chat-content-panel"},bt={class:"chat-search-bar"},wt={class:"chat-content-scroll"},xt={key:0},Bt=["onClick","onContextmenu"],St={class:"chat-list-avatar-wrapper"},Ut=["src","alt"],$t={key:0,class:"chat-list-online-indicator"},zt={class:"chat-list-info"},Ft={class:"chat-list-header"},Mt={class:"chat-list-name"},Dt={class:"chat-list-time"},At={class:"chat-list-preview"},Rt={class:"chat-list-last-msg"},Tt={key:0,class:"chat-list-unread"},Lt={key:1},It={class:"add-friend-section"},Wt={class:"add-friend-icon"},jt=["onClick"],Ht={class:"chat-list-avatar-wrapper"},Xt=["src","alt"],Yt={class:"chat-list-info"},qt={class:"chat-list-name"},Kt={key:2},Ot={class:"friend-request-info"},Pt=["src","alt"],Gt={class:"friend-request-details"},Jt={class:"friend-request-username"},Qt={class:"chat-main-area"},Zt={key:0,class:"friend-profile-area"},vt=["src","alt"],ea={class:"profile-name"},ta={class:"profile-status"},aa={key:1,class:"chat-window-area"},sa={class:"chat-window-header"},na={class:"chat-window-title"},oa={class:"chat-window-name"},la={class:"chat-window-actions"},ia={class:"message-avatar"},ra=["src"],ca={key:0,class:"message-sender-name"},da={class:"message-bubble-wrapper"},ma=["onClick"],pa=["src","alt"],fa={key:0,class:"message-image-size"},ha=["onClick"],ga={class:"message-file-content"},ua={class:"message-file-icon"},ya={class:"message-file-info"},ka={class:"message-file-name"},_a={class:"message-file-meta"},Va={key:0},Ea={key:0,class:"pending-files-area"},Na={key:0,class:"pending-image-wrapper"},Ca=["src","alt"],ba=["onClick"],wa={key:1,class:"pending-file-wrapper"},xa={class:"pending-file-name"},Ba=["onClick"],Sa={key:1,class:"input-toolbar"},Ua={class:"emoji-button-wrapper"},$a={class:"input-textarea-wrapper"},za=["onKeydown"],Fa={class:"input-send-wrapper"},Ma={key:2,class:"chat-empty-state"},Da={class:"empty-state-text"},Aa={key:0,class:"chat-detail-panel"},Ra={class:"chat-detail-content"},Ta={class:"chat-detail-profile"},La=["src","alt"],Ia={class:"chat-detail-name"},Wa={class:"add-friend-search-wrapper"},ja={class:"add-friend-users-list"},Ha={class:"add-friend-user-info"},Xa=["src","alt"],Ya={class:"add-friend-user-name"},qa={class:"chat-settings-container"},Ka={class:"chat-settings-avatar-section"},Oa={class:"chat-settings-avatar-wrapper"},Pa=["src"],Ga={class:"chat-settings-user-display"},Ja={class:"chat-settings-nickname"},Qa={class:"chat-settings-username"},Za={class:"chat-settings-form-section"},va={class:"chat-settings-form-header"},es={class:"chat-settings-form-title"},ts={class:"chat-settings-form"},as={class:"chat-settings-form-item"},ss={key:1,class:"chat-settings-form-value"},ns={class:"chat-settings-form-item"},os={key:1,class:"chat-settings-form-value"},ls={class:"chat-settings-form-item"},is={key:1,class:"chat-settings-form-value"},rs={class:"chat-settings-form-item"},cs={key:1,class:"chat-settings-form-value bio-value"},ds={key:0,class:"chat-settings-form-actions"},st=Fe({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(g,{emit:t}){const s=g,d=t,{myUsername:_,myAvatar:H,userInfo:D,loadingUserInfo:X,friendList:b,filteredFriendList:Q,searchText:w,inputText:k,messagesContainer:N,filteredUsers:p,filteredAvailableUsers:ae,currentUser:he,currentMessages:le,addFriendDialogVisible:y,addFriendSearchText:ne,availableUsers:ce,loadingAvailableUsers:ge,friendApplyList:de,loadingFriendApply:pe,formatTime:ye,formatLastTime:ke,scrollToBottom:Ce,getFriendList:be,getChatHistory:_e,setFriendToChatStatus:u,selectUser:E,sendMessage:T,sendFile:S,sendFilesAndText:$,initWebSocket:z,closeWebSocket:A,reset:Y,openAddFriendDialog:q,addFriend:F,loadFriendApplyList:I,agreeFriend:K,updateMyAvatar:G}=Re(s.config,m=>{d("message",m)}),Z=e.computed(()=>{var l;const m=[{id:"chat",icon:V.ChatDotRound,badge:0}];return s.config.modules.friends&&m.push({id:"friends",icon:V.UserFilled,badge:0}),s.config.modules.apply&&m.push({id:"apply",icon:V.Bell,badge:((l=de.value)==null?void 0:l.length)||0}),m}),O=e.ref("chat"),C=e.ref(null),U=e.ref(null),x=e.ref(null),R=e.ref(!1),v=e.ref(!1),W=e.ref({nickname:"",email:"",phone:"",bio:""}),ee=e.ref(!1),fe=e.ref(!1),ie=e.ref(!1),r=e.ref(!1),i=e.ref(null),f=e.ref(""),B=e.ref(null),P=e.ref([]),L=e.ref({visible:!1,x:0,y:0,chat:null}),se=e.ref(!1),ue=(m,l)=>{m.preventDefault(),m.stopPropagation(),L.value={visible:!0,x:m.clientX,y:m.clientY,chat:l}},Ve=()=>{L.value.visible=!1},Te=async()=>{if(!L.value.chat)return;await u(L.value.chat.id,0)&&C.value===L.value.chat.id&&(C.value=null,U.value=null),Ve()},Ee=m=>{C.value=m.id,U.value=m,x.value=null,R.value=!1,E({id:m.id,name:m.name,avatar:m.avatar,online:m.online})},Le=m=>{x.value=m,C.value=null,U.value=null},Ie=async()=>{if(!x.value)return;if(await u(x.value.id)){O.value="chat",await e.nextTick();const l=p.value.find(c=>c.id===x.value.id);l&&Ee(l),x.value=null}},We=()=>{fe.value=!0},je=()=>{var m;(m=i.value)==null||m.click()},He=()=>{var m;(m=B.value)==null||m.click()},Xe=m=>{const l=Array.from(m.target.files||[]);if(l.length!==0){for(const c of l){if(c.size>50*1024*1024){j.ElMessage.warning(`文件 ${c.name} 超过50MB,已跳过`);continue}const a=URL.createObjectURL(c);P.value.push({id:Date.now()+Math.random(),file:c,name:c.name,size:c.size,type:c.type,previewUrl:a,isImage:c.type.startsWith("image/")})}B.value&&(B.value.value="")}},xe=m=>{const l=P.value[m];l.previewUrl&&URL.revokeObjectURL(l.previewUrl),P.value.splice(m,1)},Be=m=>{if(m===0)return"0 B";const l=1024,c=["B","KB","MB","GB"],a=Math.floor(Math.log(m)/Math.log(l));return parseFloat((m/Math.pow(l,a)).toFixed(2))+" "+c[a]},Se=async()=>{if(!k.value.trim()&&P.value.length===0)return;const m=[...P.value],l=k.value;k.value="",P.value.forEach(c=>{c.previewUrl&&URL.revokeObjectURL(c.previewUrl)}),P.value=[],await $(m,l),d("send",{text:l,files:m})},Ye=m=>{var c;const l=(c=m.clipboardData)==null?void 0:c.items;if(l){for(const a of l)if(a.kind==="file"){const h=a.getAsFile();if(h){if(h.size>50*1024*1024){j.ElMessage.warning(`文件 ${h.name} 超过50MB,已跳过`);continue}const M=URL.createObjectURL(h);P.value.push({id:Date.now()+Math.random(),file:h,name:h.name,size:h.size,type:h.type,previewUrl:M,isImage:h.type.startsWith("image/")})}}}},Ue=m=>{if(!m){j.ElMessage.warning("文件地址无效");return}window.open(m,"_blank")},qe=m=>{console.warn("图片加载失败",m)},Ke=m=>{k.value+=m,se.value=!1},Oe=m=>{const l=m.target.files[0];if(!l)return;if(!l.type.startsWith("image/")){j.ElMessage.error("只能上传图片文件");return}if(l.size>5*1024*1024){j.ElMessage.error("图片大小不能超过 5MB");return}const c=new FileReader;c.onload=a=>{f.value=a.target.result,ie.value=!0},c.readAsDataURL(l)},Pe=async({file:m})=>{if(m){r.value=!0;try{const{ChatApi:l}=await Promise.resolve().then(()=>tt),a=await new l(s.config).uploadAvatar(m,_);a.code===200?(j.ElMessage.success("头像上传成功"),G(a.data),De()):j.ElMessage.error(a.msg||"头像上传失败")}catch(l){console.error(l),j.ElMessage.error("头像上传失败")}finally{r.value=!1}}},De=()=>{f.value="",ie.value=!1,i.value&&(i.value.value="")},Ge=()=>{W.value={nickname:D.value.nickname||"",email:D.value.email||"",phone:D.value.phone||"",bio:D.value.bio||""},v.value=!0},Je=()=>{v.value=!1,W.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{ee.value=!0;try{await updateUserInfo(W.value)?(j.ElMessage.success("保存成功"),v.value=!1):j.ElMessage.error("保存失败")}catch(m){console.error(m),j.ElMessage.error("保存失败")}finally{ee.value=!1}};return e.onMounted(async()=>{await Promise.all([be(),I()]),z(),p.value.length>0&&Ee(p.value[0]),d("init"),document.addEventListener("click",Ve)}),e.onUnmounted(()=>{Y(),A(),document.removeEventListener("click",Ve)}),(m,l)=>{var re,we,Ne;const c=e.resolveComponent("el-icon"),a=e.resolveComponent("el-input"),h=e.resolveComponent("el-empty"),M=e.resolveComponent("el-button"),te=e.resolveComponent("el-dialog");return e.openBlock(),e.createElementBlock("div",kt,[e.createElementVNode("div",_t,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:We},[e.createElementVNode("img",{src:e.unref(H),alt:"头像",class:"sidebar-avatar-img"},null,8,Vt)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Z.value,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["sidebar-nav-item",O.value===o.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:oe=>O.value=o.id},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.icon)))]),_:2},1024),o.badge?(e.openBlock(),e.createElementBlock("span",Nt,e.toDisplayString(o.badge>99?"99+":o.badge),1)):e.createCommentVNode("",!0)],10,Et))),128)),l[15]||(l[15]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"sidebar-nav-item sidebar-nav-item-inactive",onClick:l[0]||(l[0]=o=>fe.value=!0),title:"设置"},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ct,[e.createElementVNode("div",bt,[e.createVNode(a,{modelValue:e.unref(w),"onUpdate:modelValue":l[1]||(l[1]=o=>e.isRef(w)?w.value=o:null),placeholder:"搜索","prefix-icon":e.unref(V.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",wt,[O.value==="chat"?(e.openBlock(),e.createElementBlock("div",xt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(p),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["chat-list-item",C.value===o.id?"chat-list-item-active":""]),onClick:oe=>Ee(o),onContextmenu:e.withModifiers(oe=>ue(oe,o),["prevent","stop"])},[e.createElementVNode("div",St,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,Ut),o.online?(e.openBlock(),e.createElementBlock("span",$t)):e.createCommentVNode("",!0)]),e.createElementVNode("div",zt,[e.createElementVNode("div",Ft,[e.createElementVNode("span",Mt,e.toDisplayString(o.name),1),e.createElementVNode("span",Dt,e.toDisplayString(e.unref(ke)(o.lastTime)),1)]),e.createElementVNode("div",At,[e.createElementVNode("span",Rt,e.toDisplayString(o.lastMsg),1),o.unread>0?(e.openBlock(),e.createElementBlock("span",Tt,e.toDisplayString(o.unread>99?"99+":o.unread),1)):e.createCommentVNode("",!0)])])],42,Bt))),128))])):e.createCommentVNode("",!0),O.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",Lt,[e.createElementVNode("div",It,[e.createElementVNode("div",{class:"add-friend-btn",onClick:l[2]||(l[2]=(...o)=>e.unref(q)&&e.unref(q)(...o))},[e.createElementVNode("div",Wt,[e.createVNode(c,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Plus))]),_:1})]),l[16]||(l[16]=e.createElementVNode("span",{class:"add-friend-text"},"添加好友",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Q),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"chat-list-item",onClick:oe=>Le(o)},[e.createElementVNode("div",Ht,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,Xt),e.createElementVNode("span",{class:e.normalizeClass(["chat-list-online-indicator",o.online?"chat-list-online":"chat-list-offline"])},null,2)]),e.createElementVNode("div",Yt,[e.createElementVNode("span",qt,e.toDisplayString(o.name),1)])],8,jt))),128))])):e.createCommentVNode("",!0),O.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Kt,[e.unref(pe)?(e.openBlock(),e.createBlock(h,{key:0,description:"加载中..."})):e.unref(de).length===0?(e.openBlock(),e.createBlock(h,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(de),o=>(e.openBlock(),e.createElementBlock("div",{key:o.applyUser||o.id,class:"friend-request-item"},[e.createElementVNode("div",Ot,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.applyUser}`,alt:o.applyUser,class:"friend-request-avatar"},null,8,Pt),e.createElementVNode("div",Gt,[e.createElementVNode("div",Jt,e.toDisplayString(o.applyUser),1),l[17]||(l[17]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(M,{type:"primary",size:"small",onClick:oe=>e.unref(K)(o.applyUser)},{default:e.withCtx(()=>[...l[18]||(l[18]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Qt,[x.value&&!U.value?(e.openBlock(),e.createElementBlock("div",Zt,[e.createElementVNode("img",{src:x.value.avatar,alt:x.value.name,class:"profile-avatar"},null,8,vt),e.createElementVNode("div",ea,e.toDisplayString(x.value.name),1),e.createElementVNode("div",ta,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",x.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(x.value.online?"在线":"离线"),1)]),e.createVNode(M,{type:"primary",size:"large",onClick:Ie,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),U.value?(e.openBlock(),e.createElementBlock("div",aa,[e.createElementVNode("div",sa,[e.createElementVNode("div",na,[e.createElementVNode("span",oa,e.toDisplayString(U.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["chat-window-status",U.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString(U.value.online?"在线":"离线"),3)]),e.createElementVNode("div",la,[e.createVNode(c,{class:"chat-action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Search))]),_:1}),e.createVNode(c,{class:"chat-action-icon",onClick:l[3]||(l[3]=o=>R.value=!R.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(V.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:N,class:"chat-messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(le),(o,oe)=>(e.openBlock(),e.createElementBlock("div",{key:oe,class:e.normalizeClass(["message-wrapper",o.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",ia,[e.createElementVNode("img",{src:o.isSelf?e.unref(H):U.value.avatar,class:"message-avatar-img"},null,8,ra)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content",o.isSelf?"message-content-self":"message-content-other"])},[o.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ca,e.toDisplayString(U.value.name),1)),e.createElementVNode("div",da,[o.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"])},e.toDisplayString(o.text),3)):o.type==="file"&&o.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","message-image-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:n=>Ue(o.fileUrl)},[e.createElementVNode("img",{src:o.fileUrl,alt:o.fileName,class:"message-image",onError:qe},null,40,pa),o.fileSize?(e.openBlock(),e.createElementBlock("div",fa,e.toDisplayString(Be(o.fileSize)),1)):e.createCommentVNode("",!0)],10,ma)):o.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","message-file-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:n=>Ue(o.fileUrl)},[e.createElementVNode("div",ga,[e.createElementVNode("div",ua,[e.createVNode(c,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Document))]),_:1})]),e.createElementVNode("div",ya,[e.createElementVNode("div",ka,e.toDisplayString(o.fileName||o.text),1),e.createElementVNode("div",_a,[e.createVNode(c,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Download))]),_:1}),l[20]||(l[20]=e.createElementVNode("span",null,"点击下载",-1)),o.fileSize?(e.openBlock(),e.createElementBlock("span",Va,"· "+e.toDisplayString(Be(o.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,ha)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",o.isSelf?"message-time-right":"message-time-left"])},e.toDisplayString(e.unref(ye)(o.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",{class:"chat-input-area",onClick:l[6]||(l[6]=o=>se.value=!1)},[P.value.length>0?(e.openBlock(),e.createElementBlock("div",Ea,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(P.value,(o,oe)=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"pending-file-item"},[o.isImage?(e.openBlock(),e.createElementBlock("div",Na,[e.createElementVNode("img",{src:o.previewUrl,alt:o.name,class:"pending-image"},null,8,Ca),e.createElementVNode("button",{onClick:n=>xe(oe),class:"pending-file-remove-btn"}," × ",8,ba)])):(e.openBlock(),e.createElementBlock("div",wa,[e.createVNode(c,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createElementVNode("span",xa,e.toDisplayString(o.name),1),e.createElementVNode("button",{onClick:n=>xe(oe),class:"pending-file-remove-btn"}," × ",8,Ba)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Sa,[e.createElementVNode("div",Ua,[e.createVNode(c,{class:"input-toolbar-icon",onClick:l[4]||(l[4]=e.withModifiers(o=>se.value=!se.value,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),e.createVNode(at,{visible:se.value,onSelect:Ke},null,8,["visible"])]),e.createVNode(c,{class:"input-toolbar-icon",onClick:He},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",$a,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":l[5]||(l[5]=o=>e.isRef(k)?k.value=o:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Ye,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,za),[[e.vModelText,e.unref(k)]])]),e.createElementVNode("div",Fa,[e.createVNode(M,{type:"primary",disabled:!e.unref(k).trim()&&P.value.length===0,onClick:Se,class:"send-message-btn"},{default:e.withCtx(()=>[...l[21]||(l[21]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:B,type:"file",multiple:"",class:"hidden-file-input",onChange:Xe},null,544)])])):x.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ma,[e.createVNode(c,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatLineRound))]),_:1}),e.createElementVNode("div",Da,e.toDisplayString(O.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),R.value?(e.openBlock(),e.createElementBlock("div",Aa,[l[23]||(l[23]=e.createElementVNode("div",{class:"chat-detail-header"},"聊天详情",-1)),e.createElementVNode("div",Ra,[e.createElementVNode("div",Ta,[e.createElementVNode("img",{src:(re=U.value)==null?void 0:re.avatar,alt:(we=U.value)==null?void 0:we.name,class:"chat-detail-avatar"},null,8,La),e.createElementVNode("div",Ia,e.toDisplayString((Ne=U.value)==null?void 0:Ne.name),1),l[22]||(l[22]=e.createElementVNode("div",{class:"chat-detail-actions"},[e.createElementVNode("div",{class:"chat-detail-action-item"},"查找聊天记录"),e.createElementVNode("div",{class:"chat-detail-action-item"},"清空聊天记录")],-1))])])])):e.createCommentVNode("",!0),e.createVNode(te,{modelValue:e.unref(y),"onUpdate:modelValue":l[8]||(l[8]=o=>e.isRef(y)?y.value=o:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Wa,[e.createVNode(a,{modelValue:e.unref(ne),"onUpdate:modelValue":l[7]||(l[7]=o=>e.isRef(ne)?ne.value=o:null),placeholder:"搜索用户","prefix-icon":e.unref(V.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ja,[e.unref(ge)?(e.openBlock(),e.createBlock(h,{key:0,description:"加载中..."})):e.unref(ae).length===0?(e.openBlock(),e.createBlock(h,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(ae),o=>(e.openBlock(),e.createElementBlock("div",{key:o.username,class:"add-friend-user-item"},[e.createElementVNode("div",Ha,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.username}`,alt:o.username,class:"add-friend-user-avatar"},null,8,Xa),e.createElementVNode("div",Ya,e.toDisplayString(o.username),1)]),e.createVNode(M,{type:"primary",size:"small",onClick:oe=>e.unref(F)(o)},{default:e.withCtx(()=>[...l[24]||(l[24]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(te,{modelValue:fe.value,"onUpdate:modelValue":l[13]||(l[13]=o=>fe.value=o),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"chat-settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",qa,[e.createElementVNode("div",Ka,[e.createElementVNode("div",Oa,[e.createElementVNode("img",{src:e.unref(H),alt:"头像",class:"chat-settings-avatar"},null,8,Pa),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:je},[e.createVNode(c,{size:18,class:"chat-settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:i,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Oe},null,544)]),e.createElementVNode("div",Ga,[e.createElementVNode("div",Ja,e.toDisplayString(e.unref(D).nickname||e.unref(_)),1),e.createElementVNode("div",Qa,"@"+e.toDisplayString(e.unref(_)),1)])]),e.createElementVNode("div",Za,[e.createElementVNode("div",va,[e.createElementVNode("div",es,[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.UserFilled))]),_:1}),l[25]||(l[25]=e.createTextVNode(" 个人信息 ",-1))]),v.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(M,{key:0,type:"primary",size:"small",onClick:Ge,class:"chat-settings-edit-btn"},{default:e.withCtx(()=>[...l[26]||(l[26]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",ts,[e.createElementVNode("div",as,[l[27]||(l[27]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),v.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:W.value.nickname,"onUpdate:modelValue":l[9]||(l[9]=o=>W.value.nickname=o),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ss,e.toDisplayString(e.unref(D).nickname||"未设置"),1))]),e.createElementVNode("div",ns,[l[28]||(l[28]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),v.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:W.value.email,"onUpdate:modelValue":l[10]||(l[10]=o=>W.value.email=o),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",os,e.toDisplayString(e.unref(D).email||"未设置"),1))]),e.createElementVNode("div",ls,[l[29]||(l[29]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),v.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:W.value.phone,"onUpdate:modelValue":l[11]||(l[11]=o=>W.value.phone=o),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",is,e.toDisplayString(e.unref(D).phone||"未设置"),1))]),e.createElementVNode("div",rs,[l[30]||(l[30]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),v.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:W.value.bio,"onUpdate:modelValue":l[12]||(l[12]=o=>W.value.bio=o),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",cs,e.toDisplayString(e.unref(D).bio||"这个人很懒,什么都没写~"),1))]),v.value?(e.openBlock(),e.createElementBlock("div",ds,[e.createVNode(M,{size:"default",onClick:Je},{default:e.withCtx(()=>[...l[31]||(l[31]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(M,{type:"primary",size:"default",loading:ee.value,onClick:Qe},{default:e.withCtx(()=>[...l[32]||(l[32]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Me,{modelValue:ie.value,"onUpdate:modelValue":l[14]||(l[14]=o=>ie.value=o),src:f.value,onConfirm:Pe},null,8,["modelValue","src"]),L.value.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-context-menu",style:e.normalizeStyle({left:L.value.x+"px",top:L.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Te},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4f950e86"]]),ms={class:"chat-container"},ps={class:"sidebar-nav"},fs=["src"],hs=["onClick"],gs={key:0,class:"nav-badge"},us={class:"content-panel"},ys={class:"search-bar"},ks={class:"content-scroll"},_s={key:0},Vs=["onClick","onContextmenu"],Es={class:"friend-avatar-wrapper"},Ns=["src","alt"],Cs={key:0,class:"online-indicator"},bs={class:"friend-info"},ws={class:"friend-header"},xs={class:"friend-name"},Bs={class:"last-time"},Ss={class:"friend-preview"},Us={class:"last-msg"},$s={key:0,class:"unread-badge"},zs={key:1},Fs={class:"add-friend-section"},Ms={class:"add-friend-icon"},Ds=["onClick"],As={class:"friend-avatar-wrapper"},Rs=["src","alt"],Ts={class:"friend-info"},Ls={class:"friend-name"},Is={key:2},Ws={class:"request-info"},js=["src","alt"],Hs={class:"request-details"},Xs={class:"request-username"},Ys={class:"chat-area"},qs={key:0,class:"friend-profile"},Ks=["src","alt"],Os={class:"profile-name"},Ps={class:"profile-status"},Gs={key:1,class:"chat-window"},Js={class:"chat-header"},Qs={class:"chat-title"},Zs={class:"chat-name"},vs={class:"chat-actions"},en={class:"message-avatar"},tn=["src"],an={key:0,class:"sender-name"},sn={class:"message-bubble-wrapper"},nn=["onClick"],on=["src","alt"],ln={key:0,class:"image-size"},rn=["onClick"],cn={class:"file-content"},dn={class:"file-icon"},mn={class:"file-info"},pn={class:"file-name"},fn={class:"file-meta"},hn={key:0},gn={key:0,class:"pending-files"},un={key:0,class:"pending-image-wrapper"},yn=["src","alt"],kn=["onClick"],_n={key:1,class:"pending-file-wrapper"},Vn={class:"pending-file-name"},En=["onClick"],Nn={key:1,class:"input-actions"},Cn={class:"emoji-button-wrapper"},bn={class:"input-wrapper"},wn=["onKeydown"],xn={class:"send-btn-wrapper"},Bn={key:2,class:"empty-state"},Sn={class:"empty-text"},Un={key:0,class:"detail-panel"},$n={class:"detail-content"},zn={class:"detail-profile"},Fn=["src","alt"],Mn={class:"detail-name"},Dn={class:"search-users-wrapper"},An={class:"search-users-input"},Rn={class:"users-list-scroll"},Tn={class:"available-user-info"},Ln=["src","alt"],In={class:"available-user-name"},Wn={class:"settings-container"},jn={class:"settings-avatar-section"},Hn={class:"settings-avatar-wrapper"},Xn=["src"],Yn={class:"settings-user-display"},qn={class:"settings-nickname"},Kn={class:"settings-username"},On={class:"settings-form-section"},Pn={class:"settings-form-header"},Gn={class:"settings-form-title"},Jn={class:"settings-form"},Qn={class:"settings-form-item"},Zn={key:1,class:"settings-form-value"},vn={class:"settings-form-item"},eo={key:1,class:"settings-form-value"},to={class:"settings-form-item"},ao={key:1,class:"settings-form-value"},so={class:"settings-form-item"},no={key:1,class:"settings-form-value bio-value"},oo={key:0,class:"settings-form-actions"},nt=Fe({__name:"ChatWindow",props:{modelValue:{type:Boolean,default:!1},config:{type:Object,required:!0},width:{type:[String,Number],default:"1100px"}},emits:["update:modelValue","open","close","message","send","error"],setup(g,{emit:t}){const s=g,d=t,_=e.computed({get:()=>s.modelValue,set:c=>d("update:modelValue",c)}),{myUsername:H,myAvatar:D,userInfo:X,loadingUserInfo:b,friendList:Q,filteredFriendList:w,searchText:k,inputText:N,messagesContainer:p,filteredUsers:ae,filteredAvailableUsers:he,currentUser:le,currentMessages:y,addFriendDialogVisible:ne,addFriendSearchText:ce,availableUsers:ge,loadingAvailableUsers:de,friendApplyList:pe,loadingFriendApply:ye,formatTime:ke,formatLastTime:Ce,scrollToBottom:be,getFriendList:_e,getChatHistory:u,setFriendToChatStatus:E,selectUser:T,sendMessage:S,sendFile:$,sendFilesAndText:z,initWebSocket:A,closeWebSocket:Y,reset:q,openAddFriendDialog:F,addFriend:I,loadFriendApplyList:K,agreeFriend:G,updateMyAvatar:Z}=Re(s.config),O=e.computed(()=>{var a;const c=[{id:"chat",icon:V.ChatDotRound,badge:0}];return s.config.modules.friends&&c.push({id:"friends",icon:V.UserFilled,badge:0}),s.config.modules.apply&&c.push({id:"apply",icon:V.Bell,badge:((a=pe.value)==null?void 0:a.length)||0}),c}),C=e.ref("chat"),U=e.ref(null),x=e.ref(null),R=e.ref(null),v=e.ref(!1),W=e.ref(!1),ee=e.ref({nickname:"",email:"",phone:"",bio:""}),fe=e.ref(!1),ie=e.ref(!1),r=e.ref(!1),i=e.ref(!1),f=e.ref(null),B=e.ref(""),P=e.ref(null),L=e.ref([]),se=e.ref({visible:!1,x:0,y:0,chat:null}),ue=e.ref(!1),Ve=()=>{se.value.visible=!1},Te=async()=>{if(!se.value.chat)return;await E(se.value.chat.id,0)&&U.value===se.value.chat.id&&(U.value=null,x.value=null),Ve()},Ee=c=>{U.value=c.id,x.value=c,R.value=null,v.value=!1,T({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},Le=c=>{R.value=c,U.value=null,x.value=null},Ie=async()=>{if(!R.value)return;if(await E(R.value.id)){C.value="chat",await e.nextTick();const a=ae.value.find(h=>h.id===R.value.id);a&&Ee(a),R.value=null}},We=()=>{ie.value=!0},je=()=>{var c;(c=f.value)==null||c.click()},He=()=>{var c;(c=P.value)==null||c.click()},Xe=c=>{const a=Array.from(c.target.files||[]);if(a.length!==0){for(const h of a){if(h.size>50*1024*1024){j.ElMessage.warning(`文件 ${h.name} 超过50MB,已跳过`);continue}const M=URL.createObjectURL(h);L.value.push({id:Date.now()+Math.random(),file:h,name:h.name,size:h.size,type:h.type,previewUrl:M,isImage:h.type.startsWith("image/")})}P.value&&(P.value.value="")}},xe=c=>{const a=L.value[c];a.previewUrl&&URL.revokeObjectURL(a.previewUrl),L.value.splice(c,1)},Be=c=>{if(c===0)return"0 B";const a=1024,h=["B","KB","MB","GB"],M=Math.floor(Math.log(c)/Math.log(a));return parseFloat((c/Math.pow(a,M)).toFixed(2))+" "+h[M]},Se=async()=>{if(!N.value.trim()&&L.value.length===0)return;const c=[...L.value],a=N.value;N.value="",L.value.forEach(h=>{h.previewUrl&&URL.revokeObjectURL(h.previewUrl)}),L.value=[],await z(c,a),d("send",{text:a,files:c})},Ye=c=>{var h;const a=(h=c.clipboardData)==null?void 0:h.items;if(a){for(const M of a)if(M.kind==="file"){const te=M.getAsFile();if(te){if(te.size>50*1024*1024){j.ElMessage.warning(`文件 ${te.name} 超过50MB,已跳过`);continue}const re=URL.createObjectURL(te);L.value.push({id:Date.now()+Math.random(),file:te,name:te.name,size:te.size,type:te.type,previewUrl:re,isImage:te.type.startsWith("image/")})}}}},Ue=c=>{if(!c){j.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},qe=c=>{console.warn("图片加载失败",c)},Ke=c=>{N.value+=c,ue.value=!1},Oe=c=>{const a=c.target.files[0];if(!a)return;if(!a.type.startsWith("image/")){j.ElMessage.error("只能上传图片文件");return}if(a.size>5*1024*1024){j.ElMessage.error("图片大小不能超过 5MB");return}const h=new FileReader;h.onload=M=>{B.value=M.target.result,r.value=!0},h.readAsDataURL(a)},Pe=async({file:c})=>{if(c){i.value=!0;try{const{ChatApi:a}=await Promise.resolve().then(()=>tt),M=await new a(s.config).uploadAvatar(c,H);M.code===200?(j.ElMessage.success("头像上传成功"),Z(M.data),De()):j.ElMessage.error(M.msg||"头像上传失败")}catch(a){console.error(a),j.ElMessage.error("头像上传失败")}finally{i.value=!1}}},De=()=>{B.value="",r.value=!1,f.value&&(f.value.value="")},Ge=()=>{ee.value={nickname:X.value.nickname||"",email:X.value.email||"",phone:X.value.phone||"",bio:X.value.bio||""},W.value=!0},Je=()=>{W.value=!1,ee.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{fe.value=!0;try{await updateUserInfo(ee.value)?(j.ElMessage.success("保存成功"),W.value=!1):j.ElMessage.error("保存失败")}catch(c){console.error(c),j.ElMessage.error("保存失败")}finally{fe.value=!1}},m=()=>{q(),Y(),v.value=!1,ie.value=!1,De(),W.value=!1,d("close")},l=async()=>{await Promise.all([_e(),K()]),A(),ae.value.length>0&&Ee(ae.value[0]),d("open")};return e.onMounted(()=>{document.addEventListener("click",Ve)}),e.onUnmounted(()=>{document.removeEventListener("click",Ve),Y()}),(c,a)=>{const h=e.resolveComponent("el-icon"),M=e.resolveComponent("el-input"),te=e.resolveComponent("el-empty"),re=e.resolveComponent("el-button"),we=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(we,{modelValue:_.value,"onUpdate:modelValue":a[15]||(a[15]=Ne=>_.value=Ne),width:g.width,"close-on-click-modal":!1,class:"chat-dialog","append-to-body":"",onClosed:m,onOpen:l},{default:e.withCtx(()=>{var Ne,o,oe;return[e.createElementVNode("div",ms,[e.createElementVNode("div",ps,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:We},[e.createElementVNode("img",{src:e.unref(D),alt:"头像",class:"avatar-img"},null,8,fs)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.value,n=>(e.openBlock(),e.createElementBlock("div",{key:n.id,class:e.normalizeClass(["nav-item",C.value===n.id?"nav-item-active":"nav-item-inactive"]),onClick:me=>C.value=n.id},[e.createVNode(h,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.icon)))]),_:2},1024),n.badge?(e.openBlock(),e.createElementBlock("span",gs,e.toDisplayString(n.badge>99?"99+":n.badge),1)):e.createCommentVNode("",!0)],10,hs))),128)),a[16]||(a[16]=e.createElementVNode("div",{class:"nav-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"nav-item nav-item-inactive",onClick:a[0]||(a[0]=n=>ie.value=!0),title:"设置"},[e.createVNode(h,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",us,[e.createElementVNode("div",ys,[e.createVNode(M,{modelValue:e.unref(k),"onUpdate:modelValue":a[1]||(a[1]=n=>e.isRef(k)?k.value=n:null),placeholder:"搜索","prefix-icon":e.unref(V.Search)},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ks,[C.value==="chat"?(e.openBlock(),e.createElementBlock("div",_s,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(ae),n=>(e.openBlock(),e.createElementBlock("div",{key:n.id,class:e.normalizeClass(["chat-item",U.value===n.id?"chat-item-active":""]),onClick:me=>Ee(n),onContextmenu:e.withModifiers(me=>c.showContextMenu(me,n),["prevent","stop"])},[e.createElementVNode("div",Es,[e.createElementVNode("img",{src:n.avatar,alt:n.name,class:"friend-avatar"},null,8,Ns),n.online?(e.openBlock(),e.createElementBlock("span",Cs)):e.createCommentVNode("",!0)]),e.createElementVNode("div",bs,[e.createElementVNode("div",ws,[e.createElementVNode("span",xs,e.toDisplayString(n.name),1),e.createElementVNode("span",Bs,e.toDisplayString(e.unref(Ce)(n.lastTime)),1)]),e.createElementVNode("div",Ss,[e.createElementVNode("span",Us,e.toDisplayString(n.lastMsg),1),n.unread>0?(e.openBlock(),e.createElementBlock("span",$s,e.toDisplayString(n.unread>99?"99+":n.unread),1)):e.createCommentVNode("",!0)])])],42,Vs))),128))])):e.createCommentVNode("",!0),C.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",zs,[e.createElementVNode("div",Fs,[e.createElementVNode("div",{class:"add-friend-btn",onClick:a[2]||(a[2]=(...n)=>e.unref(F)&&e.unref(F)(...n))},[e.createElementVNode("div",Ms,[e.createVNode(h,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Plus))]),_:1})]),a[17]||(a[17]=e.createElementVNode("span",{class:"add-friend-text"},"添加好友",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(w),n=>(e.openBlock(),e.createElementBlock("div",{key:n.id,class:"chat-item",onClick:me=>Le(n)},[e.createElementVNode("div",As,[e.createElementVNode("img",{src:n.avatar,alt:n.name,class:"friend-avatar"},null,8,Rs),e.createElementVNode("span",{class:e.normalizeClass(["online-indicator",n.online?"online":"offline"])},null,2)]),e.createElementVNode("div",Ts,[e.createElementVNode("span",Ls,e.toDisplayString(n.name),1)])],8,Ds))),128))])):e.createCommentVNode("",!0),C.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Is,[e.unref(ye)?(e.openBlock(),e.createBlock(te,{key:0,description:"加载中..."})):e.unref(pe).length===0?(e.openBlock(),e.createBlock(te,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(pe),n=>(e.openBlock(),e.createElementBlock("div",{key:n.applyUser||n.id,class:"friend-request-item"},[e.createElementVNode("div",Ws,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${n.applyUser}`,alt:n.applyUser,class:"request-avatar"},null,8,js),e.createElementVNode("div",Hs,[e.createElementVNode("div",Xs,e.toDisplayString(n.applyUser),1),a[18]||(a[18]=e.createElementVNode("div",{class:"request-desc"},"请求添加你为好友",-1))])]),e.createVNode(re,{type:"primary",size:"small",onClick:me=>e.unref(G)(n.applyUser)},{default:e.withCtx(()=>[...a[19]||(a[19]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ys,[R.value&&!x.value?(e.openBlock(),e.createElementBlock("div",qs,[e.createElementVNode("img",{src:R.value.avatar,alt:R.value.name,class:"profile-avatar"},null,8,Ks),e.createElementVNode("div",Os,e.toDisplayString(R.value.name),1),e.createElementVNode("div",Ps,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",R.value.online?"status-online":"status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(R.value.online?"在线":"离线"),1)]),e.createVNode(re,{type:"primary",size:"large",onClick:Ie,class:"start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),a[20]||(a[20]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),x.value?(e.openBlock(),e.createElementBlock("div",Gs,[e.createElementVNode("div",Js,[e.createElementVNode("div",Qs,[e.createElementVNode("span",Zs,e.toDisplayString(x.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["status-badge",x.value.online?"status-badge-online":"status-badge-offline"])},e.toDisplayString(x.value.online?"在线":"离线"),3)]),e.createElementVNode("div",vs,[e.createVNode(h,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Search))]),_:1}),e.createVNode(h,{class:"action-icon",onClick:a[3]||(a[3]=n=>v.value=!v.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(V.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:p,class:"messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(y),(n,me)=>(e.openBlock(),e.createElementBlock("div",{key:me,class:e.normalizeClass(["message-wrapper",n.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",en,[e.createElementVNode("img",{src:n.isSelf?e.unref(D):x.value.avatar,class:"avatar-sm"},null,8,tn)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content-wrapper",n.isSelf?"content-self":"content-other"])},[n.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",an,e.toDisplayString(x.value.name),1)),e.createElementVNode("div",sn,[n.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",n.isSelf?"bubble-self":"bubble-other"])},e.toDisplayString(n.text),3)):n.type==="file"&&n.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","image-bubble",n.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>Ue(n.fileUrl)},[e.createElementVNode("img",{src:n.fileUrl,alt:n.fileName,class:"message-image",onError:qe},null,40,on),n.fileSize?(e.openBlock(),e.createElementBlock("div",ln,e.toDisplayString(Be(n.fileSize)),1)):e.createCommentVNode("",!0)],10,nn)):n.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","file-bubble",n.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>Ue(n.fileUrl)},[e.createElementVNode("div",cn,[e.createElementVNode("div",dn,[e.createVNode(h,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Document))]),_:1})]),e.createElementVNode("div",mn,[e.createElementVNode("div",pn,e.toDisplayString(n.fileName||n.text),1),e.createElementVNode("div",fn,[e.createVNode(h,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Download))]),_:1}),a[21]||(a[21]=e.createElementVNode("span",null,"点击下载",-1)),n.fileSize?(e.openBlock(),e.createElementBlock("span",hn,"· "+e.toDisplayString(Be(n.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,rn)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",n.isSelf?"time-right":"time-left"])},e.toDisplayString(e.unref(ke)(n.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",{class:"input-area",onClick:a[6]||(a[6]=n=>ue.value=!1)},[L.value.length>0?(e.openBlock(),e.createElementBlock("div",gn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(L.value,(n,me)=>(e.openBlock(),e.createElementBlock("div",{key:n.id,class:"pending-file"},[n.isImage?(e.openBlock(),e.createElementBlock("div",un,[e.createElementVNode("img",{src:n.previewUrl,alt:n.name,class:"pending-image"},null,8,yn),e.createElementVNode("button",{onClick:Ze=>xe(me),class:"remove-file-btn"}," × ",8,kn)])):(e.openBlock(),e.createElementBlock("div",_n,[e.createVNode(h,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createElementVNode("span",Vn,e.toDisplayString(n.name),1),e.createElementVNode("button",{onClick:Ze=>xe(me),class:"remove-file-btn"}," × ",8,En)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Nn,[e.createElementVNode("div",Cn,[e.createVNode(h,{class:"action-icon",onClick:a[4]||(a[4]=e.withModifiers(n=>ue.value=!ue.value,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),e.createVNode(at,{visible:ue.value,onSelect:Ke},null,8,["visible"])]),e.createVNode(h,{class:"action-icon",onClick:He},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createVNode(h,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",bn,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":a[5]||(a[5]=n=>e.isRef(N)?N.value=n:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Ye,placeholder:"输入消息或粘贴文件...",class:"message-input",rows:"3"},null,40,wn),[[e.vModelText,e.unref(N)]])]),e.createElementVNode("div",xn,[e.createVNode(re,{type:"primary",disabled:!e.unref(N).trim()&&L.value.length===0,onClick:Se,class:"send-btn"},{default:e.withCtx(()=>[...a[22]||(a[22]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:P,type:"file",multiple:"",class:"hidden-file-input",onChange:Xe},null,544)])])):R.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(h,{size:64,class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatLineRound))]),_:1}),e.createElementVNode("div",Sn,e.toDisplayString(C.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),v.value?(e.openBlock(),e.createElementBlock("div",Un,[a[24]||(a[24]=e.createElementVNode("div",{class:"detail-header"},"聊天详情",-1)),e.createElementVNode("div",$n,[e.createElementVNode("div",zn,[e.createElementVNode("img",{src:(Ne=x.value)==null?void 0:Ne.avatar,alt:(o=x.value)==null?void 0:o.name,class:"detail-avatar"},null,8,Fn),e.createElementVNode("div",Mn,e.toDisplayString((oe=x.value)==null?void 0:oe.name),1),a[23]||(a[23]=e.createElementVNode("div",{class:"detail-actions"},[e.createElementVNode("div",{class:"detail-action-item"},"查找聊天记录"),e.createElementVNode("div",{class:"detail-action-item"},"清空聊天记录")],-1))])])])):e.createCommentVNode("",!0)]),e.createVNode(we,{modelValue:e.unref(ne),"onUpdate:modelValue":a[8]||(a[8]=n=>e.isRef(ne)?ne.value=n:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Dn,[e.createElementVNode("div",An,[e.createVNode(M,{modelValue:e.unref(ce),"onUpdate:modelValue":a[7]||(a[7]=n=>e.isRef(ce)?ce.value=n:null),placeholder:"搜索用户","prefix-icon":e.unref(V.Search)},null,8,["modelValue","prefix-icon"])])]),e.createElementVNode("div",Rn,[e.unref(de)?(e.openBlock(),e.createBlock(te,{key:0,description:"加载中..."})):e.unref(he).length===0?(e.openBlock(),e.createBlock(te,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(he),n=>(e.openBlock(),e.createElementBlock("div",{key:n.username,class:"available-user-item"},[e.createElementVNode("div",Tn,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${n.username}`,alt:n.username,class:"available-user-avatar"},null,8,Ln),e.createElementVNode("div",In,e.toDisplayString(n.username),1)]),e.createVNode(re,{type:"primary",size:"small",onClick:me=>e.unref(I)(n)},{default:e.withCtx(()=>[...a[25]||(a[25]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(we,{modelValue:ie.value,"onUpdate:modelValue":a[13]||(a[13]=n=>ie.value=n),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",Wn,[e.createElementVNode("div",jn,[e.createElementVNode("div",Hn,[e.createElementVNode("img",{src:e.unref(D),alt:"头像",class:"settings-avatar"},null,8,Xn),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"settings-avatar-edit",onClick:je},[e.createVNode(h,{size:18,class:"settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:f,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Oe},null,544)]),e.createElementVNode("div",Yn,[e.createElementVNode("div",qn,e.toDisplayString(e.unref(X).nickname||e.unref(H)),1),e.createElementVNode("div",Kn,"@"+e.toDisplayString(e.unref(H)),1)])]),e.createElementVNode("div",On,[e.createElementVNode("div",Pn,[e.createElementVNode("div",Gn,[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.UserFilled))]),_:1}),a[26]||(a[26]=e.createTextVNode(" 个人信息 ",-1))]),W.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(re,{key:0,type:"primary",size:"small",onClick:Ge,class:"settings-edit-btn"},{default:e.withCtx(()=>[...a[27]||(a[27]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",Jn,[e.createElementVNode("div",Qn,[a[28]||(a[28]=e.createElementVNode("label",{class:"settings-form-label"},"昵称",-1)),W.value?(e.openBlock(),e.createBlock(M,{key:0,modelValue:ee.value.nickname,"onUpdate:modelValue":a[9]||(a[9]=n=>ee.value.nickname=n),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Zn,e.toDisplayString(e.unref(X).nickname||"未设置"),1))]),e.createElementVNode("div",vn,[a[29]||(a[29]=e.createElementVNode("label",{class:"settings-form-label"},"邮箱",-1)),W.value?(e.openBlock(),e.createBlock(M,{key:0,modelValue:ee.value.email,"onUpdate:modelValue":a[10]||(a[10]=n=>ee.value.email=n),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",eo,e.toDisplayString(e.unref(X).email||"未设置"),1))]),e.createElementVNode("div",to,[a[30]||(a[30]=e.createElementVNode("label",{class:"settings-form-label"},"手机号",-1)),W.value?(e.openBlock(),e.createBlock(M,{key:0,modelValue:ee.value.phone,"onUpdate:modelValue":a[11]||(a[11]=n=>ee.value.phone=n),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ao,e.toDisplayString(e.unref(X).phone||"未设置"),1))]),e.createElementVNode("div",so,[a[31]||(a[31]=e.createElementVNode("label",{class:"settings-form-label"},"个人简介",-1)),W.value?(e.openBlock(),e.createBlock(M,{key:0,modelValue:ee.value.bio,"onUpdate:modelValue":a[12]||(a[12]=n=>ee.value.bio=n),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",no,e.toDisplayString(e.unref(X).bio||"这个人很懒,什么都没写~"),1))]),W.value?(e.openBlock(),e.createElementBlock("div",oo,[e.createVNode(re,{size:"default",onClick:Je},{default:e.withCtx(()=>[...a[32]||(a[32]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(re,{type:"primary",size:"default",loading:fe.value,onClick:Qe},{default:e.withCtx(()=>[...a[33]||(a[33]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Me,{modelValue:r.value,"onUpdate:modelValue":a[14]||(a[14]=n=>r.value=n),src:B.value,onConfirm:Pe},null,8,["modelValue","src"]),se.value.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"context-menu",style:e.normalizeStyle({left:se.value.x+"px",top:se.value.y+"px"})},[e.createElementVNode("div",{class:"context-menu-item",onClick:Te},"删除聊天")],4)):e.createCommentVNode("",!0)]}),_:1},8,["modelValue","width"])}}},[["__scopeId","data-v-b69ff046"]]),lo={api:{baseUrl:"",websocketUrl:"",endpoints:{getFriends:"/chart/friends",getHistory:"/chart/history",setRead:"/chart/read",uploadFile:"/chart/upload/file",addFriend:"/chart/friend/add",getApplyList:"/chart/friend/applyList",agreeFriend:"/chart/friend/agree",setChatStatus:"/chart/friend/chat/status",getAvailableUsers:"/chart/user/canAddFriend",searchUser:"/chart/user/search",getUserAvatar:"/user/getAvatar",uploadAvatar:"/user/uploadAvatar"},adapter:null},user:{username:"",avatar:"",nickname:"",email:"",phone:"",bio:""},modules:{friends:!0,apply:!0,settings:!0,fileUpload:!0,avatarCrop:!0},theme:{primaryColor:"#07c160",selfMessageBg:"#95ec69",otherMessageBg:"#ffffff"},headers:{},requestInterceptors:[],responseInterceptors:[],websocket:{maxReconnectAttempts:5,reconnectDelay:3e3},file:{maxSize:50*1024*1024,allowedTypes:["*"]}};function io(g={}){const t=ot(lo,g);return t.api.baseUrl||console.warn("[VueChatKit] 请配置 api.baseUrl"),t.api.websocketUrl||console.warn("[VueChatKit] 请配置 api.websocketUrl"),t.user.username||console.warn("[VueChatKit] 请配置 user.username"),t}function ot(g,t){const s={...g};for(const d in t)t[d]&&typeof t[d]=="object"&&!Array.isArray(t[d])?s[d]=ot(g[d]||{},t[d]):s[d]=t[d];return s}const lt={install(g){g.component("ChatPanel",st),g.component("ChatWindow",nt),g.component("AvatarCrop",Me)}};J.AvatarCrop=Me,J.ChatApi=ze,J.ChatPanel=st,J.ChatWebSocket=ve,J.ChatWindow=nt,J.HttpClient=et,J.VueChatKit=lt,J.createChatConfig=io,J.default=lt,J.useChat=Re,Object.defineProperties(J,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(Z,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("dayjs"),require("element-plus")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","dayjs","element-plus"],e):(Z=typeof globalThis<"u"?globalThis:Z||self,e(Z.VueChatKit={},Z.Vue,Z.ElementPlusIconsVue,Z.dayjs,Z.ElementPlus))})(this,function(Z,e,x,Ke,Ue){"use strict";class ve{constructor(a,s={}){this.userId=a,this.wsUrl=s.wsUrl||"",this.socket=null,this.reconnectAttempts=0,this.maxReconnectAttempts=s.maxReconnectAttempts||5,this.reconnectDelay=s.reconnectDelay||3e3,this.handlers={message:[],open:[],close:[],error:[]},this.isConnecting=!1,this.manualClose=!1}connect(){if(!(this.isConnecting||this.isConnected())){this.isConnecting=!0,this.manualClose=!1;try{this.socket=new WebSocket(this.wsUrl),this.socket.onopen=()=>{console.log("[VueChatKit] WebSocket 连接成功"),this.isConnecting=!1,this.reconnectAttempts=0,this.emit("open")},this.socket.onmessage=a=>{try{const s=a.data;this.emit("message",s)}catch(s){console.error("[VueChatKit] WebSocket 消息解析失败",s)}},this.socket.onclose=a=>{console.log("[VueChatKit] WebSocket 连接关闭",a.code),this.isConnecting=!1,this.emit("close",a),!this.manualClose&&a.code!==1e3&&this.reconnect()},this.socket.onerror=a=>{console.error("[VueChatKit] WebSocket 连接错误",a),this.isConnecting=!1,this.emit("error",a)}}catch(a){console.error("[VueChatKit] WebSocket 创建连接失败",a),this.isConnecting=!1}}}send(a,s,n="text",u="",G="",S=0,j=!1){if(this.isConnected()){const C=JSON.stringify(j?{toGroupId:a,msg:s,type:n,fileUrl:u,fileName:G,fileSize:S}:{to:a,msg:s,type:n,fileUrl:u,fileName:G,fileSize:S});return this.socket.send(C),!0}return console.warn("[VueChatKit] WebSocket 连接未建立,无法发送消息"),!1}on(a,s){this.handlers[a]&&this.handlers[a].push(s)}off(a,s){if(this.handlers[a]){const n=this.handlers[a].indexOf(s);n>-1&&this.handlers[a].splice(n,1)}}emit(a,...s){this.handlers[a]&&this.handlers[a].forEach(n=>n(...s))}reconnect(){this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,console.log(`[VueChatKit] 尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`),setTimeout(()=>this.connect(),this.reconnectDelay)):console.error("[VueChatKit] 重连次数已达上限")}close(){this.manualClose=!0,this.socket&&(this.socket.close(),this.socket=null,this.handlers={message:[],open:[],close:[],error:[]})}isConnected(){return this.socket&&this.socket.readyState===WebSocket.OPEN}}class Me extends Error{constructor(a,s,n,u){super(a),this.name="RequestError",this.status=s||0,this.code=n||0,this.data=u}}class et{constructor(a={}){this.baseUrl=a.baseUrl||"",this.timeout=a.timeout||1e4,this.headers=a.headers||{},this.requestInterceptors=[],this.responseInterceptors=[],a.requestInterceptors&&Array.isArray(a.requestInterceptors)&&a.requestInterceptors.forEach(s=>{this.requestInterceptors.push(s)}),this.addRequestInterceptor(s=>(s.body instanceof FormData||(s.headers={"Content-Type":"application/json",...s.headers}),s)),a.responseInterceptors&&Array.isArray(a.responseInterceptors)&&a.responseInterceptors.forEach(s=>{this.responseInterceptors.push(s)})}addRequestInterceptor(a){this.requestInterceptors.push(a)}addResponseInterceptor(a){this.responseInterceptors.push(a)}timeoutPromise(a){return new Promise((s,n)=>{setTimeout(()=>{n(new Me("请求超时",408,408))},a)})}async request(a,s={}){const{method:n="GET",headers:u={},body:G,params:S}=s;let j=a.startsWith("http")?a:`${this.baseUrl}${a}`,C={method:n,headers:{...this.headers,...u},body:G,params:S};this.requestInterceptors.forEach(V=>{C=V(C)});const d={method:C.method,headers:C.headers,credentials:"include"};if(C.body&&n!=="GET"&&(C.body instanceof FormData?d.body=C.body:typeof C.body=="object"?d.body=JSON.stringify(C.body):d.body=C.body),C.params){const V=new URLSearchParams;for(const L in C.params)C.params[L]!==void 0&&C.params[L]!==null&&C.params[L]!==""&&V.append(L,C.params[L]);const U=V.toString();U&&(j+=(j.includes("?")?"&":"?")+U)}try{let U=await Promise.race([fetch(j,d),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(te=>{U=te(U)}),!U.ok)throw new Me(`HTTP ${U.status}: ${U.statusText}`,U.status,U.status);const L=U.headers.get("content-type");let y;return L&&L.includes("application/json")?y=await U.json():y=await U.text(),y}catch(V){throw V instanceof Me?V:new Me(V instanceof Error?V.message:"网络错误",0,0)}}get(a,s,n){return this.request(a,{...n,method:"GET",params:s})}post(a,s,n){return this.request(a,{...n,method:"POST",body:s})}put(a,s,n){return this.request(a,{...n,method:"PUT",body:s})}delete(a,s){return this.request(a,{...s,method:"DELETE"})}}class Ge{constructor(a,s=null){this.config=a,this.endpoints=a.api.endpoints,this.customAdapter=a.api.adapter,s?this.http=s:this.http=new et({baseUrl:a.api.baseUrl,headers:a.headers,requestInterceptors:a.requestInterceptors,responseInterceptors:a.responseInterceptors})}async _call(a,...s){return this.customAdapter&&typeof this.customAdapter[a]=="function"?this.customAdapter[a](...s):this[`_${a}`](...s)}async getFriends(a){return this._call("getFriends",a)}async _getFriends(a){return this.http.get(this.endpoints.getFriends,{currentUser:a})}async getAvailableUsers(a){return this._call("getAvailableUsers",a)}async _getAvailableUsers(a){return this.http.get(this.endpoints.getAvailableUsers,{currentUser:a})}async searchUser(a){return this._call("searchUser",a)}async _searchUser(a){return this.http.get(this.endpoints.searchUser,{keyword:a})}async addFriend(a,s){return this._call("addFriend",a,s)}async _addFriend(a,s){return this.http.post(this.endpoints.addFriend,{currentUser:a,friendUser:s})}async getApplyList(a){return this._call("getApplyList",a)}async _getApplyList(a){return this.http.get(this.endpoints.getApplyList,{currentUser:a})}async agreeFriend(a,s){return this._call("agreeFriend",a,s)}async _agreeFriend(a,s){return this.http.post(this.endpoints.agreeFriend,{applyUser:a,friendUser:s})}async setChatStatus(a,s,n=1){return this._call("setChatStatus",a,s,n)}async _setChatStatus(a,s,n){return this.http.post(this.endpoints.setChatStatus,null,{params:{currentUser:a,friendUser:s,status:n}})}async getHistory(a,s){return this._call("getHistory",a,s)}async _getHistory(a,s){return this.http.get(this.endpoints.getHistory,{fromUser:a,toUser:s})}async setRead(a,s){return this._call("setRead",a,s)}async _setRead(a,s){return this.http.post(this.endpoints.setRead,{currentUser:a,friendUser:s})}async uploadFile(a){return this._call("uploadFile",a)}async _uploadFile(a){const s=new FormData;return s.append("file",a),this.http.post(this.endpoints.uploadFile,s)}async updateUserInfo(a,s){return this._call("updateUserInfo",a,s)}async _updateUserInfo(a,s){return this.http.put(this.endpoints.updateUserInfo,{username:a,...s})}async getUserAvatar(a){return this._call("getUserAvatar",a)}async _getUserAvatar(a){return this.http.get(this.endpoints.getUserAvatar,{username:a})}async uploadAvatar(a,s){return this._call("uploadAvatar",a,s)}async _uploadAvatar(a,s){const n=new FormData;return n.append("file",a),n.append("username",s),this.http.post(this.endpoints.uploadAvatar,n)}async createGroup(a){return this._call("createGroup",a)}async _createGroup(a){return this.http.post(this.endpoints.createGroup,a)}async getMyGroups(a){return this._call("getMyGroups",a)}async _getMyGroups(a){return this.http.get(this.endpoints.getMyGroups,{currentUser:a})}async getGroupInfo(a,s){return this._call("getGroupInfo",a,s)}async _getGroupInfo(a,s){return this.http.get(this.endpoints.getGroupInfo,{groupId:a,currentUser:s})}async addGroupMember(a,s,n){return this._call("addGroupMember",a,s,n)}async _addGroupMember(a,s,n){return this.http.post(this.endpoints.addGroupMember,null,{params:{groupId:a,targetUser:s,currentUser:n}})}async inviteGroupMembers(a,s,n){return this._call("inviteGroupMembers",a,s,n)}async _inviteGroupMembers(a,s,n){return this.http.post(this.endpoints.addGroupMember,{groupId:a,currentUser:s,targetUserList:n})}async getGroupMembers(a,s){return this._call("getGroupMembers",a,s)}async _getGroupMembers(a,s){return this.http.get(this.endpoints.getGroupMembers,{groupId:a,currentUser:s})}async quitGroup(a,s){return this._call("quitGroup",a,s)}async _quitGroup(a,s){return this.http.post(this.endpoints.quitGroup,null,{params:{groupId:a,currentUser:s}})}async getGroupHistory(a,s){return this._call("getGroupHistory",a,s)}async _getGroupHistory(a,s){return this.http.get(this.endpoints.getGroupHistory,{groupId:a,currentUser:s})}async getGroupUnreadCount(a,s){return this._call("getGroupUnreadCount",a,s)}async _getGroupUnreadCount(a,s){return this.http.get(this.endpoints.getGroupUnreadCount,{groupId:a,currentUser:s})}async getMsgReadUserList(a,s,n){return this._call("getMsgReadUserList",a,s,n)}async _getMsgReadUserList(a,s,n){return this.http.get(this.endpoints.getMsgReadUserList,{groupId:a,groupMsgId:s,currentUser:n})}async updateGroupInfo(a,s,n,u,G){return this._call("updateGroupInfo",a,s,n,u,G)}async _updateGroupInfo(a,s,n,u,G){return this.http.post(this.endpoints.updateGroupInfo,{groupId:a,currentUser:s,groupNickname:n,remark:u,notice:G})}async updateMemberNick(a,s,n,u){return this._call("updateMemberNick",a,s,n,u)}async _updateMemberNick(a,s,n,u){return this.http.post(this.endpoints.updateMemberNick,{groupId:a,currentUser:s,targetUsername:n,memberNick:u})}async deleteGroup(a,s){return this._call("deleteGroup",a,s)}async _deleteGroup(a,s){return this.http.post(this.endpoints.deleteGroup,{groupId:a,currentUser:s})}async removeGroupMember(a,s,n){return this._call("removeGroupMember",a,s,n)}async _removeGroupMember(a,s,n){return this.http.post(this.endpoints.removeGroupMember,{groupId:a,currentUser:s,targetUsername:n})}async transferGroupOwner(a,s,n){return this._call("transferGroupOwner",a,s,n)}async _transferGroupOwner(a,s,n){return this.http.post(this.endpoints.transferGroupOwner,{groupId:a,currentUser:s,newOwnerUsername:n})}async readSingleGroupMsg(a,s,n){return this._call("readSingleGroupMsg",a,s,n)}async _readSingleGroupMsg(a,s,n){return this.http.post(this.endpoints.readSingleGroupMsg,{groupId:a,currentUser:s,groupMsgId:n})}async readAllGroupMsg(a,s){return this._call("readAllGroupMsg",a,s)}async _readAllGroupMsg(a,s){return this.http.post(this.endpoints.readAllGroupMsg,{groupId:a,currentUser:s})}}const Tt=Object.freeze(Object.defineProperty({__proto__:null,ChatApi:Ge,default:Ge},Symbol.toStringTag,{value:"Module"}));function zt(m,a){const s=new Ge(m);let n=null;const u=m.user.username,G=e.ref(m.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${u}`),S=e.ref({username:u,nickname:m.user.nickname||"",email:m.user.email||"",phone:m.user.phone||"",bio:m.user.bio||""}),j=e.ref(!1),C=e.ref(""),d=e.ref(""),V=e.ref(null),U=E=>Ke(E).format("HH:mm"),L=E=>{if(!E)return"";const W=Ke(),k=Ke(E);return W.isSame(k,"day")?k.format("HH:mm"):W.diff(k,"day")===1?"昨天":W.diff(k,"day")<7?["周日","周一","周二","周三","周四","周五","周六"][k.day()]:k.format("MM/DD")},y=E=>{if(!E)return!1;const W=["jpg","jpeg","png","gif","bmp","webp","svg"],k=E.split(".").pop().toLowerCase();return W.includes(k)},te=E=>{if(!E)return"default";const W=E.split(".").pop().toLowerCase();return["xls","xlsx"].includes(W)?"excel":["pdf"].includes(W)?"pdf":["doc","docx"].includes(W)?"docx":"default"},ce=()=>{e.nextTick(()=>{V.value&&(V.value.scrollTop=V.value.scrollHeight)})},T=E=>{try{try{const k=JSON.parse(E);if(k.to||k.toGroupId||k.msg)return{to:k.to,toGroupId:k.toGroupId,from:k.from,content:k.msg,type:k.type||"text",fileUrl:k.fileUrl||"",fileName:k.fileName||"",fileSize:k.fileSize||0}}catch{}const W=E.match(/^\[(.+?)\]:(.+)$/);if(W)return{username:W[1],content:W[2],type:"text"}}catch(W){console.error("[VueChatKit] 解析消息失败",W)}return null},h=E=>{const W=`${m.api.websocketUrl}?userId=${u}`;n=new ve(u,{wsUrl:W,maxReconnectAttempts:m.websocket.maxReconnectAttempts,reconnectDelay:m.websocket.reconnectDelay}),n.on("message",E),n.connect()},re=()=>{n&&(n.close(),n=null)},ae=()=>n,ne=async()=>{try{const E=await s.getUserAvatar(u);E.code===200&&E.data&&(G.value=`${m.api.baseUrl}${E.data}`)}catch(E){console.warn("[VueChatKit] 加载头像失败",E)}},v=E=>{G.value=E},O=async E=>{try{return(await s.updateUserInfo(u,E)).code===200?(S.value={...S.value,...E},!0):!1}catch(W){return console.error("[VueChatKit] 更新用户信息失败",W),!1}};return ne(),{api:s,config:m,myUsername:u,myAvatar:G,userInfo:S,loadingUserInfo:j,searchText:C,inputText:d,messagesContainer:V,formatTime:U,formatLastTime:L,isImageFile:y,getFileIconType:te,scrollToBottom:ce,parseWsMessage:T,initWebSocket:h,closeWebSocket:re,getSocket:ae,initUserAvatar:ne,updateMyAvatar:v,updateUserInfo:O}}function Ft(m){const{api:a,myUsername:s,myAvatar:n,config:u,scrollToBottom:G,getSocket:S}=m,j=e.ref([]),C=e.ref([]),d=e.ref([]),V=e.ref(""),U=e.ref(!1),L=e.ref(""),y=e.ref([]),te=e.ref(!1),ce=e.ref([]),T=e.ref(!1),h=e.computed(()=>{let i=C.value;if(m.searchText.value){const p=m.searchText.value.toLowerCase();i=i.filter(N=>{var B;return(B=N.username)==null?void 0:B.toLowerCase().includes(p)})}return i.map(p=>({id:p.username,name:p.username,avatar:p.avatar?`${u.api.baseUrl}${p.avatar}`:n.value,online:p.online,lastMsg:p.lastMsg||"暂无消息",lastTime:p.lastTime,unread:p.unReadNum||0}))}),re=e.computed(()=>{let i=j.value;if(m.searchText.value){const p=m.searchText.value.toLowerCase();i=i.filter(N=>{var B;return(B=N.username)==null?void 0:B.toLowerCase().includes(p)})}return i.map(p=>({id:p.username,name:p.username,avatar:p.avatar?`${u.api.baseUrl}${p.avatar}`:n.value,online:p.online,isChatting:p.isChatting}))}),ae=e.computed(()=>y.value),ne=e.computed(()=>h.value.find(i=>i.id===V.value)||null),v=e.computed(()=>d.value.map(i=>{const p=i.type==="file"||i.fileUrl||i.fileName,N=i.fileName||i.msgContent;let B="";if(i.sendUsername!==s){const I=j.value.find(A=>A.username===i.sendUsername);B=I!=null&&I.avatar?`${u.api.baseUrl}${I.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${i.sendUsername}`}else B=n.value;return{text:i.msgContent,isSelf:i.sendUsername===s,time:i.createTime,sendUsername:i.sendUsername,avatar:B,type:p?"file":"text",fileType:m.isImageFile(N)?"image":m.getFileIconType(N),fileUrl:i.fileUrl||"",fileName:N,fileSize:i.fileSize||0}})),O=async()=>{try{const p=(await a.getFriends(s)).data||[];j.value=p,C.value=p.filter(N=>N.isChatting===1);for(const N of C.value)try{const I=(await a.getHistory(s,N.username)).data||[];N.unReadNum=I.filter(A=>A.isRead===0&&A.sendUsername===N.username).length}catch{N.unReadNum=0}}catch(i){console.error("[VueChatKit] 获取好友列表失败",i)}},E=async i=>{try{const p=await a.getHistory(s,i);d.value=p.data||[],G()}catch(p){console.error("[VueChatKit] 获取聊天历史失败",p)}},W=async i=>{try{await a.setRead(s,i),O()}catch(p){console.error("[VueChatKit] 标记已读失败",p)}},k=async i=>{V.value=i.id,await E(i.id),await W(i.id),G()},oe=async(i,p=1)=>{try{return await a.setChatStatus(s,i,p),await O(),!0}catch(N){return console.error("[VueChatKit] 设置聊天状态失败",N),!1}},ee=()=>{const i=S();if(!m.inputText.value.trim()||!V.value||!i)return;if(i.send(V.value,m.inputText.value.trim(),"text")){const N={msgContent:m.inputText.value.trim(),sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"text"};d.value.push(N),m.inputText.value="",G(),setTimeout(()=>{E(V.value),O()},300)}},g=async i=>{const p=S();if(!V.value||!p)return!1;try{const N=await a.uploadFile(i);if(N.code===200&&N.data){const{fileUrl:B,fileName:I}=N.data;if(p.send(V.value,I,"file",B,I,i.size)){const J={msgContent:I,sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"file",fileUrl:B,fileName:I,fileSize:i.size};return d.value.push(J),G(),!0}}return!1}catch(N){return console.error("[VueChatKit] 发送文件失败",N),!1}},w=async(i,p)=>{const N=S();if(!(!V.value||!N)){if(p&&p.trim()&&N.send(V.value,p.trim(),"text")){const I={msgContent:p.trim(),sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"text"};d.value.push(I)}for(const B of i){const I=B.file||B;await g(I)}setTimeout(()=>{E(V.value),O()},300)}},q=i=>{const p={content:i.content,username:i.username||i.from||V.value,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0,timestamp:new Date};if(V.value){try{let N={msgContent:i.content,sendUsername:p.username,receiveUsername:s,createTime:new Date,isRead:0,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0};d.value.push(N),G()}catch(N){console.error("[VueChatKit] 添加临时消息失败",N)}E(V.value)}O()},_=(i,p)=>{const N=j.value.find(B=>B.username===i);N&&(N.online=p)},z=async()=>{U.value=!0,L.value="",y.value=[]},b=async(i="")=>{te.value=!0;try{let p;i?p=await a.searchUser(i):p=await a.getAvailableUsers(s),y.value=(p==null?void 0:p.data)||[]}catch(p){console.error("[VueChatKit] 获取可用用户失败",p)}finally{te.value=!1}},F=async i=>{try{await a.addFriend(s,i.username),await O(),U.value=!1}catch(p){console.error("[VueChatKit] 添加好友失败",p)}},X=async()=>{T.value=!0;try{const i=await a.getApplyList(s);ce.value=i.data||[]}catch(i){console.error("[VueChatKit] 获取好友申请列表失败",i)}finally{T.value=!1}},Y=async i=>{try{await a.agreeFriend(i,s),await X(),await O()}catch(p){console.error("[VueChatKit] 同意好友申请失败",p)}},R=()=>{V.value="",d.value=[]};return e.watch(L,async i=>{await b(i)}),{friendList:j,chatList:C,chatMsgList:d,currentSelectName:V,filteredUsers:h,filteredFriendList:re,filteredAvailableUsers:ae,currentUser:ne,currentMessages:v,addFriendDialogVisible:U,addFriendSearchText:L,availableUsers:y,loadingAvailableUsers:te,friendApplyList:ce,loadingFriendApply:T,getFriendList:O,getChatHistory:E,markAsRead:W,selectUser:k,setFriendToChatStatus:oe,sendMessage:ee,sendFile:g,sendFilesAndText:w,handleFriendWsMessage:q,handleFriendStatusChange:_,openAddFriendDialog:z,loadAvailableUsers:b,addFriend:F,loadFriendApplyList:X,agreeFriend:Y,resetFriendChat:R}}function It(m){const{api:a,myUsername:s,myAvatar:n,config:u,scrollToBottom:G,getSocket:S}=m,j=e.ref("friends"),C=e.ref([]),d=e.ref(null),V=e.ref([]),U=e.ref([]),L=e.ref({}),y=e.ref(!1),te=e.ref(!1),ce=e.ref(""),T=e.ref(""),h=e.ref([]),re=e.ref(!1),ae=e.ref([]),ne=e.ref(!1),v=e.ref({groupNickname:"",remark:"",notice:""}),O=e.ref({targetUsername:"",memberNick:""}),E=e.ref(!1),W=e.ref(!1),k=e.ref({readUserList:[],unreadUserList:[]}),oe=e.ref(null),ee=e.ref({groupNickname:!1,remark:!1,notice:!1}),g=e.ref({groupNickname:"",remark:"",notice:""}),w=e.computed(()=>{let o=C.value;if(m.searchText.value){const l=m.searchText.value.toLowerCase();o=o.filter(M=>M.groupName&&M.groupName.toLowerCase().includes(l)||M.remark&&M.remark.toLowerCase().includes(l))}return o.map(l=>{const P=(L.value[l.groupId]||[]).slice(0,4).map(Ee=>({username:Ee.username,avatar:Ee.avatar?`${u.api.baseUrl}${Ee.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${Ee.username}`}));let se="暂无消息";l.lastMsg?se=l.lastMsg:l.lastMessage?se=l.lastMessage:l.latestMessage&&(se=l.latestMessage);let ge=0;l.unReadNum!==void 0&&l.unReadNum!==null?ge=l.unReadNum:l.unreadCount!==void 0&&l.unreadCount!==null?ge=l.unreadCount:l.unread!==void 0&&l.unread!==null&&(ge=l.unread);let me=l.lastTime;return!me&&l.latestTime?me=l.latestTime:!me&&l.lastMsgTime&&(me=l.lastMsgTime),{id:l.groupId,groupId:l.groupId,name:l.groupName,remark:l.remark,owner:l.ownerUsername,avatar:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.groupId}`,memberAvatars:P,lastMsg:se,lastTime:me,unread:ge,memberCount:l.memberCount||0,notice:l.notice,groupNickname:l.groupNickname}})}),q=e.computed(()=>V.value.map(o=>{const l=o.type==="file"||o.fileUrl||o.fileName,M=o.fileName||o.msgContent,P=U.value.find(me=>me.username===o.sendUsername),se=(P==null?void 0:P.memberNick)||o.sendUsername,ge=P!=null&&P.avatar?`${u.api.baseUrl}${P.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.sendUsername}`;return{text:o.msgContent,isSelf:o.sendUsername===s,time:o.createTime,sendUsername:o.sendUsername,displayName:se,avatar:ge,type:l?"file":"text",fileType:m.isImageFile(M)?"image":m.getFileIconType(M),fileUrl:o.fileUrl||"",fileName:M,fileSize:o.fileSize||0}})),_=async()=>{try{const o=await a.getMyGroups(s);C.value=o.data||[];for(const l of C.value)try{const M=await a.getGroupMembers(l.groupId,s);L.value[l.groupId]=M.data||[]}catch(M){console.error(`[VueChatKit] 获取群 ${l.groupId} 成员失败`,M),L.value[l.groupId]=[]}}catch(o){console.error("[VueChatKit] 获取群聊列表失败",o)}},z=async o=>{try{const l=await a.getGroupHistory(o,s);V.value=l.data||[],G()}catch(l){console.error("[VueChatKit] 获取群聊历史失败",l)}},b=async o=>{try{const l=await a.getGroupMembers(o,s);U.value=l.data||[]}catch(l){console.error("[VueChatKit] 获取群成员失败",l)}},F=async o=>{await Te(o.groupId),await _(),d.value=o,await z(o.groupId),await b(o.groupId),G()},X=async o=>{try{return(await a.getGroupUnreadCount(o,s)).data||0}catch(l){return console.error("[VueChatKit] 获取群未读数失败",l),0}},Y=async(o,l)=>{try{const M=await a.getMsgReadUserList(o,l,s);k.value=M.data||{readUserList:[],unreadUserList:[]},W.value=!0}catch(M){console.error("[VueChatKit] 获取消息已读成员失败",M)}},R=async o=>{try{const l=await a.getGroupInfo(o,s);l.code===200&&l.data&&(oe.value=l.data,g.value={groupNickname:l.data.groupNickname||l.data.groupName||"",remark:l.data.remark||"",notice:l.data.notice||""})}catch(l){console.error("[VueChatKit] 获取群详情失败",l)}},i=async o=>{if(!d.value||!oe.value)return!1;try{const l={groupId:d.value.groupId,currentUser:s,groupNickname:o==="groupNickname"?g.value.groupNickname:oe.value.groupNickname,remark:o==="remark"?g.value.remark:oe.value.remark,notice:o==="notice"?g.value.notice:oe.value.notice};return(await a._updateGroupInfo(l.groupId,l.currentUser,l.groupNickname,l.remark,l.notice)).code===200?(await R(d.value.groupId),await _(),!0):!1}catch(l){return console.error("[VueChatKit] 修改群信息失败",l),!1}},p=o=>{!oe.value&&d.value&&R(d.value.groupId),ee.value[o]=!0},N=o=>{ee.value[o]=!1,oe.value&&(g.value[o]=oe.value[o]||"")},B=async o=>{const l=await i(o);return l&&(ee.value[o]=!1),l},I=async()=>{if(!d.value)return!1;try{return(await a.updateGroupInfo(d.value.groupId,s,v.value.groupNickname,v.value.remark,v.value.notice)).code===200?(ne.value=!1,await _(),d.value&&await R(d.value.groupId),!0):!1}catch(o){return console.error("[VueChatKit] 修改群信息失败",o),!1}},A=async()=>{if(!d.value)return!1;try{return(await a.updateMemberNick(d.value.groupId,s,O.value.targetUsername,O.value.memberNick)).code===200?(E.value=!1,await b(d.value.groupId),!0):!1}catch(o){return console.error("[VueChatKit] 修改群成员昵称失败",o),!1}},J=async()=>{if(!d.value)return!1;try{return(await a.deleteGroup(d.value.groupId,s)).code===200?(d.value=null,V.value=[],te.value=!1,await _(),!0):!1}catch(o){return console.error("[VueChatKit] 解散群聊失败",o),!1}},le=async o=>{if(!d.value)return!1;try{return(await a.removeGroupMember(d.value.groupId,s,o)).code===200?(await b(d.value.groupId),!0):!1}catch(l){return console.error("[VueChatKit] 移除成员失败",l),!1}},pe=async o=>{if(!d.value)return!1;try{return(await a.transferGroupOwner(d.value.groupId,s,o)).code===200?(await b(d.value.groupId),!0):!1}catch(l){return console.error("[VueChatKit] 转让群主失败",l),!1}},ye=async o=>{if(!d.value)return!1;try{return(await a.readSingleGroupMsg(d.value.groupId,s,o)).code===200}catch(l){return console.error("[VueChatKit] 标记消息已读失败",l),!1}},Te=async o=>{var M;const l=o||((M=d.value)==null?void 0:M.groupId);if(!l)return!1;try{return(await a.readAllGroupMsg(l,s)).code===200}catch(P){return console.error("[VueChatKit] 标记全部已读失败",P),!1}},ze=()=>{d.value&&(v.value={groupNickname:d.value.name||"",remark:d.value.remark||"",notice:d.value.notice||""},ne.value=!0)},nt=o=>{O.value={targetUsername:o.username,memberNick:o.memberNick||""},E.value=!0},qe=async()=>{if(!ce.value.trim())return console.warn("[VueChatKit] 请输入群名称"),!1;try{const o=await a.createGroup({groupName:ce.value.trim(),remark:T.value.trim(),ownerUsername:s});if(o.code===200&&o.data){if(h.value.length>0){const l=h.value.map(M=>M.id);await a.inviteGroupMembers(o.data.groupId||o.data,s,l)}return ce.value="",T.value="",h.value=[],y.value=!1,await _(),!0}return!1}catch(o){return console.error("[VueChatKit] 创建群聊失败",o),!1}},ot=async()=>{if(!d.value||ae.value.length===0)return!1;try{const o=ae.value.map(l=>l.id);return await a.inviteGroupMembers(d.value.groupId,s,o),ae.value=[],re.value=!1,await b(d.value.groupId),!0}catch(o){return console.error("[VueChatKit] 邀请成员失败",o),!1}},Fe=async()=>{if(!d.value)return!1;try{return await a.quitGroup(d.value.groupId,s),d.value=null,V.value=[],te.value=!1,await _(),!0}catch(o){return console.error("[VueChatKit] 退出群聊失败",o),!1}},je=()=>{const o=S();if(!m.inputText.value.trim()||!d.value||!o)return;if(o.send(d.value.groupId,m.inputText.value.trim(),"text","","",0,!0)){const M={msgContent:m.inputText.value.trim(),sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"text"};V.value.push(M),m.inputText.value="",G(),setTimeout(()=>{z(d.value.groupId),_()},300)}},Xe=async o=>{const l=S();if(!d.value||!l)return!1;try{const M=await a.uploadFile(o);if(M.code===200&&M.data){const{fileUrl:P,fileName:se}=M.data;if(l.send(d.value.groupId,se,"file",P,se,o.size,!0)){const me={msgContent:se,sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"file",fileUrl:P,fileName:se,fileSize:o.size};return V.value.push(me),G(),!0}}return!1}catch(M){return console.error("[VueChatKit] 发送群聊文件失败",M),!1}};return{activeTab:j,groupList:C,currentSelectGroup:d,groupMsgList:V,groupMemberList:U,groupMembersMap:L,createGroupDialogVisible:y,groupDetailVisible:te,newGroupName:ce,newGroupRemark:T,selectedMembersForCreate:h,inviteMemberDialogVisible:re,selectedMembersForInvite:ae,groupInfoVisible:ne,editingGroupInfo:v,editingMemberNick:O,memberNickDialogVisible:E,msgReadUserDialogVisible:W,currentMsgReadList:k,currentGroupInfo:oe,editingFields:ee,tempEditValues:g,filteredGroupList:w,currentGroupMessages:q,getGroupList:_,getGroupHistory:z,getGroupMembers:b,selectGroup:F,createGroup:qe,inviteGroupMember:ot,quitGroup:Fe,sendGroupMessage:je,sendGroupFile:Xe,sendGroupFilesAndText:async(o,l)=>{const M=S();if(!(!d.value||!M)){if(l&&l.trim()&&M.send(d.value.groupId,l.trim(),"text","","",0,!0)){const se={msgContent:l.trim(),sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"text"};V.value.push(se)}for(const P of o){const se=P.file||P;await Xe(se)}setTimeout(()=>{z(d.value.groupId),_()},300)}},handleGroupWsMessage:o=>{if(d.value&&d.value.groupId===o.toGroupId){try{let l={msgContent:o.content,sendUsername:o.from||"未知用户",toGroupId:o.toGroupId,createTime:new Date,isRead:0,type:o.type||"text",fileUrl:o.fileUrl||"",fileName:o.fileName||"",fileSize:o.fileSize||0};V.value.push(l),G()}catch(l){console.error("[VueChatKit] 添加临时群聊消息失败",l)}z(o.toGroupId)}_()},switchTab:o=>{j.value=o,o==="groups"&&_()},resetGroupChat:()=>{d.value=null,V.value=[]},getGroupUnreadCount:X,getMsgReadUserList:Y,updateGroupInfo:I,updateMemberNick:A,deleteGroup:J,removeGroupMember:le,transferGroupOwner:pe,readSingleGroupMsg:ye,readAllGroupMsg:Te,openEditGroupInfo:ze,openEditMemberNick:nt,fetchGroupDetail:R,updateSingleGroupField:i,startEditField:p,cancelEditField:N,saveEditField:B}}function tt(m,a){const s=zt(m),n=Ft(s),u=It(s),G=e.computed(()=>u.currentSelectGroup.value?{type:"group",data:u.currentSelectGroup.value}:n.currentSelectName.value&&n.currentUser.value?{type:"friend",data:n.currentUser.value}:null),S=e.computed(()=>u.currentSelectGroup.value?u.currentGroupMessages.value:n.currentMessages.value),j=T=>{if(T.includes("【状态变更】")){const re=/【状态变更】(.+?) 已(上线|下线)/,ae=T.match(re);if(ae){const ne=ae[1],v=ae[2]==="上线";n.handleFriendStatusChange(ne,v)}return}const h=s.parseWsMessage(T);h&&(h.toGroupId?u.handleGroupWsMessage(h):n.handleFriendWsMessage(h),a&&typeof a=="function"&&a({...h,isGroup:!!h.toGroupId}))};return{...s,initWebSocket:()=>{s.initWebSocket(j)},...n,selectUser:async T=>{u.resetGroupChat(),await n.selectUser(T)},...u,selectGroup:async T=>{n.resetFriendChat(),await u.selectGroup(T)},currentChatTarget:G,currentAllMessages:S,switchTab:T=>{u.switchTab(T),T==="apply"&&n.loadFriendApplyList()},sendMessage:()=>{u.currentSelectGroup.value?u.sendGroupMessage():n.currentSelectName.value&&n.sendMessage()},sendFile:async T=>u.currentSelectGroup.value?await u.sendGroupFile(T):n.currentSelectName.value?await n.sendFile(T):!1,sendFilesAndText:async(T,h)=>{u.currentSelectGroup.value?await u.sendGroupFilesAndText(T,h):n.currentSelectName.value&&await n.sendFilesAndText(T,h)},reset:()=>{n.resetFriendChat(),u.resetGroupChat(),s.inputText.value="",s.searchText.value=""}}}const We=(m,a)=>{const s=m.__vccOpts||m;for(const[n,u]of a)s[n]=u;return s},Dt={class:"avatar-crop-container"},At={key:0,class:"crop-wrapper"},Lt=["src"],Rt=["onMousedown","onTouchstart"],$t={class:"preview-wrapper"},Kt=["width","height"],Wt={class:"dialog-footer"},He=We({__name:"AvatarCrop",props:{modelValue:Boolean,src:{type:String,default:""},dialogWidth:{type:String,default:"520px"},cropAreaHeight:{type:String,default:"288px"},previewSize:{type:Number,default:96},outputSize:{type:Number,default:400},outputType:{type:String,default:"image/jpeg"},outputQuality:{type:Number,default:.9},appendToBody:{type:Boolean,default:!0},aspectRatio:{type:Number,default:1},minSize:{type:Number,default:50}},emits:["update:modelValue","confirm","cancel","closed"],setup(m,{expose:a,emit:s}){const n=m,u=s,G=e.computed({get:()=>n.modelValue,set:g=>u("update:modelValue",g)}),S=e.computed({get:()=>n.src,set:g=>{}}),j=["nw","n","ne","e","se","s","sw","w"],C=e.ref(!1),d=e.ref(null),V=e.ref(null),U=e.ref(null),L=e.ref({naturalWidth:0,naturalHeight:0,displayWidth:0,displayHeight:0,offsetX:0,offsetY:0}),y=e.ref({x:0,y:0,size:150,minSize:n.minSize}),te=e.computed(()=>({width:`${L.value.displayWidth}px`,height:`${L.value.displayHeight}px`,maxWidth:"none",maxHeight:"none",display:"block"})),ce=e.computed(()=>({left:`${y.value.x}px`,top:`${y.value.y}px`,width:`${y.value.size}px`,height:`${y.value.size/n.aspectRatio}px`}));let T=null,h=null;const re=()=>{e.nextTick(()=>{const g=V.value,w=d.value;if(!g||!w)return;const q=w.clientWidth,_=w.clientHeight,z=g.naturalWidth/g.naturalHeight,b=q/_;let F,X,Y,R;z>b?(F=q,X=q/z,Y=0,R=(_-X)/2):(X=_,F=_*z,Y=(q-F)/2,R=0),L.value={naturalWidth:g.naturalWidth,naturalHeight:g.naturalHeight,displayWidth:F,displayHeight:X,offsetX:Y,offsetY:R};const i=Math.min(F,X)*.6;y.value.size=i,y.value.x=Y+(F-i)/2,y.value.y=R+(X-i/n.aspectRatio)/2,ae()})},ae=()=>{const g=U.value,w=V.value;if(!g||!w)return;const q=g.getContext("2d"),{naturalWidth:_,naturalHeight:z,displayWidth:b,displayHeight:F,offsetX:X,offsetY:Y}=L.value,R=_/b,i=z/F,p=(y.value.x-X)*R,N=(y.value.y-Y)*i,B=y.value.size*R,I=y.value.size/n.aspectRatio*i;q.clearRect(0,0,g.width,g.height),q.drawImage(w,p,N,B,I,0,0,g.width,g.height)},ne=g=>{g.preventDefault();const w=g.clientX||g.touches[0].clientX,q=g.clientY||g.touches[0].clientY;T={startX:w,startY:q,boxX:y.value.x,boxY:y.value.y};const _=b=>{const F=b.clientX||b.touches[0].clientX,X=b.clientY||b.touches[0].clientY,Y=F-T.startX,R=X-T.startY,{offsetX:i,offsetY:p,displayWidth:N,displayHeight:B}=L.value,I=y.value.size/n.aspectRatio,A=Math.max(i,Math.min(i+N-y.value.size,T.boxX+Y)),J=Math.max(p,Math.min(p+B-I,T.boxY+R));y.value.x=A,y.value.y=J,ae()},z=()=>{T=null,document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",z),document.removeEventListener("touchmove",_),document.removeEventListener("touchend",z)};document.addEventListener("mousemove",_),document.addEventListener("mouseup",z),document.addEventListener("touchmove",_,{passive:!1}),document.addEventListener("touchend",z)},v=(g,w)=>{w.preventDefault();const q=w.clientX||w.touches[0].clientX,_=w.clientY||w.touches[0].clientY;h={handle:g,startX:q,startY:_,boxX:y.value.x,boxY:y.value.y,boxSize:y.value.size};const z=F=>{const X=F.clientX||F.touches[0].clientX,Y=F.clientY||F.touches[0].clientY,R=X-h.startX,i=Y-h.startY,{offsetX:p,offsetY:N,displayWidth:B,displayHeight:I}=L.value;let A=h.boxSize,J=h.boxX,le=h.boxY;const pe=h.boxSize/n.aspectRatio;switch(g){case"se":A=Math.max(y.value.minSize,Math.min(B-(h.boxX-p),I-(h.boxY-N),h.boxSize+Math.max(R,i)));break;case"nw":A=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,h.boxY-N+pe,h.boxSize-Math.max(R,i))),J=h.boxX+(h.boxSize-A),le=h.boxY+(pe-A/n.aspectRatio);break;case"ne":A=Math.max(y.value.minSize,Math.min(p+B-h.boxX,h.boxY-N+pe,h.boxSize+Math.max(R,-i))),le=h.boxY+(pe-A/n.aspectRatio);break;case"sw":A=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,N+I-h.boxY,h.boxSize+Math.max(-R,i))),J=h.boxX+(h.boxSize-A);break;case"n":A=Math.max(y.value.minSize,Math.min(h.boxY-N+pe,h.boxSize-i)),le=h.boxY+(pe-A/n.aspectRatio);break;case"s":A=Math.max(y.value.minSize,Math.min(N+I-h.boxY,h.boxSize+i));break;case"w":A=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,h.boxSize-R)),J=h.boxX+(h.boxSize-A);break;case"e":A=Math.max(y.value.minSize,Math.min(p+B-h.boxX,h.boxSize+R));break}y.value.size=A,y.value.x=J,y.value.y=le,ae()},b=()=>{h=null,document.removeEventListener("mousemove",z),document.removeEventListener("mouseup",b),document.removeEventListener("touchmove",z),document.removeEventListener("touchend",b)};document.addEventListener("mousemove",z),document.addEventListener("mouseup",b),document.addEventListener("touchmove",z,{passive:!1}),document.addEventListener("touchend",b)},O=()=>{const g=document.createElement("canvas"),w=V.value;if(!w)return null;const{naturalWidth:q,naturalHeight:_,displayWidth:z,displayHeight:b,offsetX:F,offsetY:X}=L.value,Y=q/z,R=_/b,i=(y.value.x-F)*Y,p=(y.value.y-X)*R,N=y.value.size*Y,B=y.value.size/n.aspectRatio*R;return g.width=n.outputSize,g.height=n.outputSize/n.aspectRatio,g.getContext("2d").drawImage(w,i,p,N,B,0,0,g.width,g.height),new Promise(A=>{g.toBlob(J=>{A(new File([J],"avatar.jpg",{type:n.outputType}))},n.outputType,n.outputQuality)})},E=()=>{const g=document.createElement("canvas"),w=V.value;if(!w)return null;const{naturalWidth:q,naturalHeight:_,displayWidth:z,displayHeight:b,offsetX:F,offsetY:X}=L.value,Y=q/z,R=_/b,i=(y.value.x-F)*Y,p=(y.value.y-X)*R,N=y.value.size*Y,B=y.value.size/n.aspectRatio*R;return g.width=n.outputSize,g.height=n.outputSize/n.aspectRatio,g.getContext("2d").drawImage(w,i,p,N,B,0,0,g.width,g.height),g.toDataURL(n.outputType,n.outputQuality)},W=async()=>{if(S.value){C.value=!0;try{const g=await O(),w=E();g&&u("confirm",{file:g,dataUrl:w})}catch(g){console.error(g),Ue.ElMessage.error("生成图片失败")}finally{C.value=!1}}},k=()=>{u("cancel"),G.value=!1},oe=()=>{ee(),u("closed")},ee=()=>{y.value={x:0,y:0,size:150,minSize:n.minSize}};return e.watch(()=>n.src,g=>{g&&e.nextTick(()=>{V.value&&V.value.complete&&re()})}),a({getCroppedImage:O,getCroppedImageDataUrl:E,reset:ee}),(g,w)=>{const q=e.resolveComponent("el-empty"),_=e.resolveComponent("el-button"),z=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(z,{modelValue:G.value,"onUpdate:modelValue":w[0]||(w[0]=b=>G.value=b),title:"调整头像",width:m.dialogWidth,"close-on-click-modal":!1,"append-to-body":m.appendToBody,onClosed:oe},{footer:e.withCtx(()=>[e.createElementVNode("div",Wt,[e.createVNode(_,{onClick:k},{default:e.withCtx(()=>[...w[2]||(w[2]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(_,{type:"primary",loading:C.value,disabled:!S.value,onClick:W},{default:e.withCtx(()=>[...w[3]||(w[3]=[e.createTextVNode(" 确认 ",-1)])]),_:1},8,["loading","disabled"])])]),default:e.withCtx(()=>[e.createElementVNode("div",Dt,[S.value?(e.openBlock(),e.createElementBlock("div",At,[e.createElementVNode("div",{ref_key:"cropAreaRef",ref:d,class:"crop-area",style:e.normalizeStyle({height:m.cropAreaHeight})},[e.createElementVNode("img",{src:S.value,ref_key:"imageRef",ref:V,onLoad:re,style:e.normalizeStyle(te.value)},null,44,Lt),e.createElementVNode("div",{class:"crop-box",style:e.normalizeStyle(ce.value),onMousedown:ne,onTouchstart:ne},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(j,b=>e.createElementVNode("div",{key:b,class:e.normalizeClass(["crop-handle",b]),onMousedown:e.withModifiers(F=>v(b,F),["stop"]),onTouchstart:e.withModifiers(F=>v(b,F),["stop"])},null,42,Rt)),64))],36)],4),e.createElementVNode("div",$t,[w[1]||(w[1]=e.createElementVNode("div",{class:"preview-label"},"预览",-1)),e.createElementVNode("div",{class:"preview-box",style:e.normalizeStyle({width:m.previewSize+"px",height:m.previewSize+"px"})},[e.createElementVNode("canvas",{ref_key:"previewCanvasRef",ref:U,width:m.previewSize,height:m.previewSize,class:"preview-canvas"},null,8,Kt)],4)])])):(e.openBlock(),e.createBlock(q,{key:1,description:"请上传图片"}))])]),_:1},8,["modelValue","width","append-to-body"])}}},[["__scopeId","data-v-594eeaf3"]]),Ht={class:"emoji-header"},qt=["onClick"],jt={class:"emoji-body"},Xt=["onClick"],Yt=We({__name:"EmojiPicker",props:{visible:{type:Boolean,default:!1}},emits:["select","close"],setup(m,{emit:a}){const s=a,n=e.ref(0),u=[{id:"emoticons",icon:"😀",name:"表情",emojis:["😀","😃","😄","😁","😆","😅","🤣","😂","🙂","🙃","😉","😊","😇","🥰","😍","🤩","😘","😗","😚","😋","😛","😜","🤪","😝","🤑","🤗","🤭","🤫","🤔","🤐","🤨","😐","😑","😶","😏","😒","🙄","😬","🤥","😌","😔","😪","🤤","😴","😷","🤒","🤕","🤢","🤮","🤧","🥵","🥶","🥴","😵","🤯","🤠","🥳","😎","🤓","🧐","😕","😟","🙁","☹️","😮","😯","😲","😳","🥺","😦","😧","😨","😰","😥","😢","😭","😱","😖","😣","😞"]},{id:"gestures",icon:"👋",name:"手势",emojis:["👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","🤚🏻","🖐🏻","✋🏻","🖖🏻","👌🏻","🤌🏻","🤏🏻","✌🏻","🤞🏻","🤟🏻","🤘🏻","🤙🏻","👈🏻","👉🏻","👆🏻","🖕🏻","👇🏻","☝🏻","👍🏻"]},{id:"animals",icon:"🐶",name:"动物",emojis:["🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🐞","🐜","🦟","🦗","🕷️","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑"]},{id:"food",icon:"🍎",name:"食物",emojis:["🍎","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🥦","🥬","🥒","🌶️","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮"]},{id:"objects",icon:"⌚",name:"物品",emojis:["⌚","📱","📲","💻","⌨️","🖥️","🖨️","🖱️","🖲️","🕹️","🗜️","💽","💾","💿","📀","🧮","🎥","🎞️","📽️","🎬","📺","📷","📸","📹","📼","🔍","🔎","🕯️","💡","🔦","🏮","📔","📕","📖","📗","📘","📙","📚","📓","📒","📃","📜","📄","📰","🗞️","📑","🔖","🏷️","💰","🪙"]},{id:"nature",icon:"☀️",name:"自然",emojis:["☀️","🌤️","⛅","🌥️","☁️","🌦️","🌧️","⛈️","🌩️","🌨️","❄️","☃️","⛄","🌬️","💨","🌪️","🌫️","🌊","💧","💦","☔","☂️","🌱","🌲","🌳","🌴","🌵","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","⭐","🌟","✨","💫","🌙","🌚","🌛","🌜","🌝","🪐","🌍","🌎","🌏","⛱️","🏖️"]}],G=S=>{s("select",S)};return(S,j)=>m.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"emoji-picker",onClick:j[0]||(j[0]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",Ht,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(u,(C,d)=>e.createElementVNode("div",{key:C.id,class:e.normalizeClass(["emoji-category-tab",{active:n.value===d}]),onClick:V=>n.value=d},e.toDisplayString(C.icon),11,qt)),64))]),e.createElementVNode("div",jt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u[n.value].emojis,C=>(e.openBlock(),e.createElementBlock("div",{key:C,class:"emoji-item",onClick:d=>G(C)},e.toDisplayString(C),9,Xt))),128))])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-6ca53096"]]),Pt={class:"chat-panel"},Ot={class:"chat-sidebar"},Jt=["src"],Qt=["onClick"],Zt={key:0,class:"sidebar-nav-badge"},vt={class:"chat-content-panel"},ea={class:"chat-search-bar"},ta={class:"chat-content-scroll"},aa={key:0},sa=["onClick","onContextmenu"],ra={class:"chat-list-avatar-wrapper"},na=["src","alt"],oa={key:0,class:"chat-list-online-indicator"},la={class:"chat-list-info"},ia={class:"chat-list-header"},ca={class:"chat-list-name"},da={class:"chat-list-time"},pa={class:"chat-list-preview"},ma={class:"chat-list-last-msg"},ua={key:0,class:"chat-list-unread"},fa={key:1},ha={class:"add-friend-section"},ga={class:"add-friend-icon"},ka=["onClick"],ya={class:"chat-list-avatar-wrapper"},Va=["src","alt"],Na={class:"chat-list-info"},Ca={class:"chat-list-name"},wa={key:2},ba={class:"friend-request-info"},Ea=["src","alt"],_a={class:"friend-request-details"},xa={class:"friend-request-username"},Ba={key:3},Sa={class:"add-friend-section"},Ua={class:"add-friend-icon"},Ma=["onClick"],Ga={class:"chat-list-avatar-wrapper"},Ta={key:0,class:"group-avatar-grid"},za=["src","alt"],Fa=["src","alt"],Ia={class:"chat-list-info"},Da={class:"chat-list-header"},Aa={class:"chat-list-name"},La={class:"chat-list-time"},Ra={class:"chat-list-preview"},$a={class:"chat-list-last-msg"},Ka={key:0,class:"chat-list-unread"},Wa={class:"chat-main-area"},Ha={key:0,class:"friend-profile-area"},qa=["src","alt"],ja={class:"profile-name"},Xa={class:"profile-status"},Ya={key:1,class:"chat-window-area"},Pa={class:"chat-window-header"},Oa={class:"chat-window-title"},Ja={class:"chat-window-name"},Qa={key:1,class:"chat-window-status"},Za={class:"chat-window-actions"},va={class:"message-avatar"},es=["src"],ts={key:0,class:"message-sender-name"},as={class:"message-bubble-wrapper"},ss=["onClick"],rs=["src","alt"],ns={key:0,class:"message-image-size"},os=["onClick"],ls={class:"message-file-content"},is={class:"message-file-icon"},cs={class:"message-file-info"},ds={class:"message-file-name"},ps={class:"message-file-meta"},ms={key:0},us={key:0,class:"pending-files-area"},fs={key:0,class:"pending-image-wrapper"},hs=["src","alt"],gs=["onClick"],ks={key:1,class:"pending-file-wrapper"},ys={class:"pending-file-name"},Vs=["onClick"],Ns={key:1,class:"input-toolbar"},Cs={class:"emoji-button-wrapper"},ws={class:"input-textarea-wrapper"},bs=["onKeydown"],Es={class:"input-send-wrapper"},_s={key:2,class:"chat-empty-state"},xs={class:"empty-state-text"},Bs={key:0,class:"group-sidebar"},Ss={class:"group-sidebar-header"},Us={class:"group-sidebar-content"},Ms={class:"group-members-avatar-section"},Gs={class:"group-members-grid"},Ts=["onClick"],zs=["src","alt"],Fs={class:"group-member-nickname"},Is={class:"group-member-add-icon"},Ds={class:"group-member-add-icon"},As={class:"group-settings-section"},Ls={key:0,class:"group-setting-item"},Rs={class:"group-setting-value-wrapper"},$s={key:0,class:"group-edit-wrapper"},Ks={class:"group-edit-buttons"},Ws={key:1,class:"group-setting-item"},Hs={class:"group-setting-value-text"},qs={key:2,class:"group-setting-item"},js={class:"group-setting-value-wrapper"},Xs={key:0,class:"group-edit-wrapper"},Ys={class:"group-edit-buttons"},Ps={class:"group-setting-value-text"},Os={key:3,class:"group-setting-item"},Js={class:"group-setting-value-text"},Qs={key:4,class:"group-setting-item"},Zs={class:"group-setting-value-wrapper"},vs={key:0,class:"group-edit-wrapper"},er={class:"group-edit-buttons"},tr={class:"group-setting-value-text"},ar={key:5,class:"group-setting-item"},sr={class:"group-setting-value-text"},rr={class:"group-setting-value"},nr={class:"group-setting-value-text"},or={class:"group-setting-item"},lr={class:"group-setting-item"},ir={key:0,class:"chat-detail-panel"},cr={class:"chat-detail-content"},dr={class:"chat-detail-profile"},pr=["src","alt"],mr={class:"chat-detail-name"},ur={class:"add-friend-search-wrapper"},fr={class:"add-friend-users-list"},hr={class:"add-friend-user-info"},gr=["src","alt"],kr={class:"add-friend-user-name"},yr={class:"create-group-form"},Vr={class:"form-item"},Nr={class:"form-item"},Cr={class:"form-item"},wr={class:"member-selection"},br={key:1,class:"member-list"},Er=["onClick"],_r=["src","alt"],xr={class:"member-name"},Br={class:"group-detail-content"},Sr={class:"group-info-section"},Ur={class:"group-info-item"},Mr={class:"info-value"},Gr={class:"group-info-item"},Tr={class:"info-value"},zr={class:"group-info-item"},Fr={class:"info-value"},Ir={key:0,class:"group-actions-section"},Dr={class:"group-actions-list"},Ar={class:"group-members-section"},Lr={class:"section-header"},Rr={class:"group-members-list"},$r=["src","alt"],Kr={class:"group-member-info"},Wr={class:"group-member-name"},Hr={key:0,class:"group-member-badge"},qr={key:0,class:"group-member-actions"},jr={key:1,class:"group-member-actions"},Xr={class:"msg-read-users-content"},Yr={class:"read-users-section"},Pr={class:"section-title"},Or={class:"users-list"},Jr={key:1,class:"users-tag-list"},Qr={class:"unread-users-section"},Zr={class:"section-title"},vr={class:"users-list"},en={key:1,class:"users-tag-list"},tn={class:"invite-member-content"},an={class:"invite-member-list"},sn={key:1,class:"member-list"},rn=["onClick"],nn=["src","alt"],on={class:"member-name"},ln={class:"chat-settings-container"},cn={class:"chat-settings-avatar-section"},dn={class:"chat-settings-avatar-wrapper"},pn=["src"],mn={class:"chat-settings-user-display"},un={class:"chat-settings-nickname"},fn={class:"chat-settings-username"},hn={class:"chat-settings-form-section"},gn={class:"chat-settings-form-header"},kn={class:"chat-settings-form-title"},yn={class:"chat-settings-form"},Vn={class:"chat-settings-form-item"},Nn={key:1,class:"chat-settings-form-value"},Cn={class:"chat-settings-form-item"},wn={key:1,class:"chat-settings-form-value"},bn={class:"chat-settings-form-item"},En={key:1,class:"chat-settings-form-value"},_n={class:"chat-settings-form-item"},xn={key:1,class:"chat-settings-form-value bio-value"},Bn={key:0,class:"chat-settings-form-actions"},at=We({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(m,{emit:a}){const s=m,n=a,{myUsername:u,myAvatar:G,userInfo:S,loadingUserInfo:j,friendList:C,filteredFriendList:d,searchText:V,inputText:U,messagesContainer:L,filteredUsers:y,filteredAvailableUsers:te,currentUser:ce,currentMessages:T,addFriendDialogVisible:h,addFriendSearchText:re,availableUsers:ae,loadingAvailableUsers:ne,friendApplyList:v,loadingFriendApply:O,activeTab:E,groupList:W,currentSelectGroup:k,groupMsgList:oe,groupMemberList:ee,createGroupDialogVisible:g,groupDetailVisible:w,newGroupName:q,newGroupRemark:_,selectedMembersForCreate:z,inviteMemberDialogVisible:b,selectedMembersForInvite:F,filteredGroupList:X,currentChatTarget:Y,currentGroupMessages:R,currentAllMessages:i,groupInfoVisible:p,editingGroupInfo:N,editingMemberNick:B,memberNickDialogVisible:I,msgReadUserDialogVisible:A,currentMsgReadList:J,currentGroupInfo:le,editingFields:pe,tempEditValues:ye,formatTime:Te,formatLastTime:ze,scrollToBottom:nt,getFriendList:qe,getChatHistory:ot,setFriendToChatStatus:Fe,selectUser:je,sendMessage:Xe,sendFile:Mn,sendFilesAndText:lt,initWebSocket:it,closeWebSocket:ct,reset:o,openAddFriendDialog:l,addFriend:M,loadFriendApplyList:P,agreeFriend:se,updateMyAvatar:ge,getGroupList:me,getGroupHistory:Ee,getGroupMembers:_o,selectGroup:Gn,createGroup:Tn,inviteGroupMember:zn,quitGroup:Fn,sendGroupMessage:xo,sendGroupFile:Bo,sendGroupFilesAndText:In,switchTab:So,getGroupUnreadCount:Uo,getMsgReadUserList:Mo,updateGroupInfo:Dn,updateMemberNick:An,deleteGroup:Ln,removeGroupMember:Rn,transferGroupOwner:$n,readSingleGroupMsg:Go,readAllGroupMsg:To,openEditGroupInfo:Kn,openEditMemberNick:Ie,fetchGroupDetail:Wn,updateSingleGroupField:zo,startEditField:Ye,cancelEditField:Pe,saveEditField:Hn}=tt(s.config,c=>{n("message",c)}),qn=e.computed(()=>{var t;const c=[{id:"chat",icon:x.ChatDotRound,badge:0}];return s.config.modules.friends&&c.push({id:"friends",icon:x.UserFilled,badge:0}),s.config.modules.groups&&c.push({id:"groups",icon:x.UserFilled,badge:0}),s.config.modules.apply&&c.push({id:"apply",icon:x.Bell,badge:((t=v.value)==null?void 0:t.length)||0}),c}),Ve=e.ref("chat"),we=e.ref(null),de=e.ref(null),ie=e.ref(null),_e=e.ref(!1),ke=e.ref(!1),ue=e.ref({nickname:"",email:"",phone:"",bio:""}),Oe=e.ref(!1),De=e.ref(!1),Ae=e.ref(!1),dt=e.ref(!1),Le=e.ref(null),Je=e.ref(""),Re=e.ref(null),fe=e.ref([]),Ne=e.ref({visible:!1,x:0,y:0,chat:null}),xe=e.ref(!1),be=e.ref(!1),pt=e.ref(!1);e.ref(null),e.watch(be,c=>{c&&k.value&&Wn(k.value.groupId)});const jn=e.computed(()=>{const c=ee.value.find(t=>t.username===u);return(c==null?void 0:c.memberNick)||""}),Xn=()=>{const c=ee.value.find(t=>t.username===u);c&&Ie(c)},Yn=(c,t)=>{c.preventDefault(),c.stopPropagation(),Ne.value={visible:!0,x:c.clientX,y:c.clientY,chat:t}},Qe=()=>{Ne.value.visible=!1},Pn=async()=>{if(!Ne.value.chat)return;await Fe(Ne.value.chat.id,0)&&we.value===Ne.value.chat.id&&(we.value=null,de.value=null),Qe()},Ze=c=>{we.value=c.id,de.value=c,ie.value=null,k.value=null,_e.value=!1,w.value=!1,je({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},On=c=>{ie.value=c,we.value=null,de.value=null,k.value=null},Jn=c=>{k.value=c,we.value=null,de.value=null,ie.value=null,_e.value=!1,w.value=!1,Gn(c)},Qn=async()=>{if(!ie.value)return;if(await Fe(ie.value.id)){Ve.value="chat",await e.nextTick();const t=y.value.find(f=>f.id===ie.value.id);t&&Ze(t),ie.value=null}},Zn=()=>{De.value=!0},vn=()=>{var c;(c=Le.value)==null||c.click()},eo=()=>{var c;(c=Re.value)==null||c.click()},to=c=>{const t=Array.from(c.target.files||[]);if(t.length!==0){for(const f of t){if(f.size>50*1024*1024){Ue.ElMessage.warning(`文件 ${f.name} 超过50MB,已跳过`);continue}const H=URL.createObjectURL(f);fe.value.push({id:Date.now()+Math.random(),file:f,name:f.name,size:f.size,type:f.type,previewUrl:H,isImage:f.type.startsWith("image/")})}Re.value&&(Re.value.value="")}},mt=c=>{const t=fe.value[c];t.previewUrl&&URL.revokeObjectURL(t.previewUrl),fe.value.splice(c,1)},ut=c=>{if(c===0)return"0 B";const t=1024,f=["B","KB","MB","GB"],H=Math.floor(Math.log(c)/Math.log(t));return parseFloat((c/Math.pow(t,H)).toFixed(2))+" "+f[H]},ft=async()=>{if(!U.value.trim()&&fe.value.length===0)return;const c=[...fe.value],t=U.value;U.value="",fe.value.forEach(f=>{f.previewUrl&&URL.revokeObjectURL(f.previewUrl)}),fe.value=[],k.value?await In(c,t):await lt(c,t),n("send",{text:t,files:c})},ao=c=>{var f;const t=(f=c.clipboardData)==null?void 0:f.items;if(t){for(const H of t)if(H.kind==="file"){const Q=H.getAsFile();if(Q){if(Q.size>50*1024*1024){Ue.ElMessage.warning(`文件 ${Q.name} 超过50MB,已跳过`);continue}const D=URL.createObjectURL(Q);fe.value.push({id:Date.now()+Math.random(),file:Q,name:Q.name,size:Q.size,type:Q.type,previewUrl:D,isImage:Q.type.startsWith("image/")})}}}},ht=c=>{if(!c){Ue.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},so=c=>{console.warn("图片加载失败",c)},ro=c=>{U.value+=c,xe.value=!1},no=(c,t)=>{const f={};return c===1?(f.width="100%",f.height="100%"):c===2?(f.width="50%",f.height="100%"):c===3&&t===0?(f.width="100%",f.height="50%"):(f.width="50%",f.height="50%"),f},oo=c=>{const t=z.value.findIndex(f=>f.id===c.id);t!==-1?z.value.splice(t,1):z.value.push(c)},lo=c=>{const t=F.value.findIndex(f=>f.id===c.id);t!==-1?F.value.splice(t,1):F.value.push(c)},io=async()=>{await Tn()},co=async()=>{await zn()},gt=async()=>{await Fn()},kt=async()=>{await Ln(),be.value=!1},Be=async c=>{try{await Hn(c)}catch(t){console.error("保存失败",t)}},po=async()=>{try{await An()&&(I.value=!1)}catch(c){console.error("修改失败",c)}},mo=async c=>{try{await Rn(c)}catch(t){console.error("移除失败",t)}},uo=async c=>{try{await $n(c)}catch(t){console.error("转让失败",t)}},fo=async()=>{await Dn()},ho=c=>{const t=c.target.files[0];if(!t)return;if(!t.type.startsWith("image/")){console.error("只能上传图片文件");return}if(t.size>5*1024*1024){console.error("图片大小不能超过 5MB");return}const f=new FileReader;f.onload=H=>{Je.value=H.target.result,Ae.value=!0},f.readAsDataURL(t)},go=async({file:c})=>{if(c){dt.value=!0;try{const{ChatApi:t}=await Promise.resolve().then(()=>Tt),H=await new t(s.config).uploadAvatar(c,u);H.code===200&&(ge(H.data),ko())}catch(t){console.error(t)}finally{dt.value=!1}}},ko=()=>{Je.value="",Ae.value=!1,Le.value&&(Le.value.value="")},yo=()=>{ue.value={nickname:S.value.nickname||"",email:S.value.email||"",phone:S.value.phone||"",bio:S.value.bio||""},ke.value=!0},Vo=()=>{ke.value=!1,ue.value={nickname:"",email:"",phone:"",bio:""}},No=async()=>{Oe.value=!0;try{await updateUserInfo(ue.value)&&(ke.value=!1)}catch(c){console.error(c)}finally{Oe.value=!1}};return e.onMounted(async()=>{const c=[qe(),P()];s.config.modules.groups&&c.push(me()),await Promise.all(c),it(),y.value.length>0&&Ze(y.value[0]),n("init"),document.addEventListener("click",Qe)}),e.onUnmounted(()=>{o(),ct(),document.removeEventListener("click",Qe)}),(c,t)=>{var Nt,Ct,wt;const f=e.resolveComponent("el-icon"),H=e.resolveComponent("el-input"),Q=e.resolveComponent("el-empty"),D=e.resolveComponent("el-button"),Co=e.resolveComponent("el-switch"),Ce=e.resolveComponent("el-dialog"),Se=e.resolveComponent("el-form-item"),yt=e.resolveComponent("el-form"),Vt=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",Pt,[e.createElementVNode("div",Ot,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Zn},[e.createElementVNode("img",{src:e.unref(G),alt:"头像",class:"sidebar-avatar-img"},null,8,Jt)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(qn.value,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["sidebar-nav-item",Ve.value===r.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:$=>Ve.value=r.id},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.icon)))]),_:2},1024),r.badge?(e.openBlock(),e.createElementBlock("span",Zt,e.toDisplayString(r.badge>99?"99+":r.badge),1)):e.createCommentVNode("",!0)],10,Qt))),128)),t[54]||(t[54]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),m.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"sidebar-nav-item sidebar-nav-item-inactive",onClick:t[0]||(t[0]=r=>De.value=!0),title:"设置"},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",vt,[e.createElementVNode("div",ea,[e.createVNode(H,{modelValue:e.unref(V),"onUpdate:modelValue":t[1]||(t[1]=r=>e.isRef(V)?V.value=r:null),placeholder:"搜索","prefix-icon":e.unref(x.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ta,[Ve.value==="chat"?(e.openBlock(),e.createElementBlock("div",aa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(y),r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["chat-list-item",we.value===r.id?"chat-list-item-active":""]),onClick:$=>Ze(r),onContextmenu:e.withModifiers($=>Yn($,r),["prevent","stop"])},[e.createElementVNode("div",ra,[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"chat-list-avatar"},null,8,na),r.online?(e.openBlock(),e.createElementBlock("span",oa)):e.createCommentVNode("",!0)]),e.createElementVNode("div",la,[e.createElementVNode("div",ia,[e.createElementVNode("span",ca,e.toDisplayString(r.name),1),e.createElementVNode("span",da,e.toDisplayString(e.unref(ze)(r.lastTime)),1)]),e.createElementVNode("div",pa,[e.createElementVNode("span",ma,e.toDisplayString(r.lastMsg),1),r.unread>0?(e.openBlock(),e.createElementBlock("span",ua,e.toDisplayString(r.unread>99?"99+":r.unread),1)):e.createCommentVNode("",!0)])])],42,sa))),128))])):e.createCommentVNode("",!0),Ve.value==="friends"&&m.config.modules.friends?(e.openBlock(),e.createElementBlock("div",fa,[e.createElementVNode("div",ha,[e.createElementVNode("div",{class:"add-friend-btn",onClick:t[2]||(t[2]=(...r)=>e.unref(l)&&e.unref(l)(...r))},[e.createElementVNode("div",ga,[e.createVNode(f,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Plus))]),_:1})]),t[55]||(t[55]=e.createElementVNode("span",{class:"add-friend-text"},"添加好友",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(d),r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:"chat-list-item",onClick:$=>On(r)},[e.createElementVNode("div",ya,[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"chat-list-avatar"},null,8,Va),e.createElementVNode("span",{class:e.normalizeClass(["chat-list-online-indicator",r.online?"chat-list-online":"chat-list-offline"])},null,2)]),e.createElementVNode("div",Na,[e.createElementVNode("span",Ca,e.toDisplayString(r.name),1)])],8,ka))),128))])):e.createCommentVNode("",!0),Ve.value==="apply"&&m.config.modules.apply?(e.openBlock(),e.createElementBlock("div",wa,[e.unref(O)?(e.openBlock(),e.createBlock(Q,{key:0,description:"加载中..."})):e.unref(v).length===0?(e.openBlock(),e.createBlock(Q,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(v),r=>(e.openBlock(),e.createElementBlock("div",{key:r.applyUser||r.id,class:"friend-request-item"},[e.createElementVNode("div",ba,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${r.applyUser}`,alt:r.applyUser,class:"friend-request-avatar"},null,8,Ea),e.createElementVNode("div",_a,[e.createElementVNode("div",xa,e.toDisplayString(r.applyUser),1),t[56]||(t[56]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(D,{type:"primary",size:"small",onClick:$=>e.unref(se)(r.applyUser)},{default:e.withCtx(()=>[...t[57]||(t[57]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0),Ve.value==="groups"&&m.config.modules.groups?(e.openBlock(),e.createElementBlock("div",Ba,[e.createElementVNode("div",Sa,[e.createElementVNode("div",{class:"add-friend-btn",onClick:t[3]||(t[3]=r=>g.value=!0)},[e.createElementVNode("div",Ua,[e.createVNode(f,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Plus))]),_:1})]),t[58]||(t[58]=e.createElementVNode("span",{class:"add-friend-text"},"创建群聊",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(X),r=>{var $;return e.openBlock(),e.createElementBlock("div",{key:r.groupId,class:e.normalizeClass(["chat-list-item",(($=e.unref(k))==null?void 0:$.groupId)===r.groupId?"chat-list-item-active":""]),onClick:he=>Jn(r)},[e.createElementVNode("div",Ga,[r.memberAvatars&&r.memberAvatars.length>0?(e.openBlock(),e.createElementBlock("div",Ta,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.memberAvatars,(he,$e)=>(e.openBlock(),e.createElementBlock("div",{key:he.username,class:"group-avatar-item",style:e.normalizeStyle(no(r.memberAvatars.length,$e))},[e.createElementVNode("img",{src:he.avatar,alt:he.username,class:"group-avatar-img"},null,8,za)],4))),128))])):(e.openBlock(),e.createElementBlock("img",{key:1,src:r.avatar,alt:r.name,class:"chat-list-avatar"},null,8,Fa))]),e.createElementVNode("div",Ia,[e.createElementVNode("div",Da,[e.createElementVNode("span",Aa,e.toDisplayString(r.name),1),e.createElementVNode("span",La,e.toDisplayString(e.unref(ze)(r.lastTime)),1)]),e.createElementVNode("div",Ra,[e.createElementVNode("span",$a,e.toDisplayString(r.lastMsg),1),r.unread>0?(e.openBlock(),e.createElementBlock("span",Ka,e.toDisplayString(r.unread>99?"99+":r.unread),1)):e.createCommentVNode("",!0)])])],10,Ma)}),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Wa,[ie.value&&!de.value?(e.openBlock(),e.createElementBlock("div",Ha,[e.createElementVNode("img",{src:ie.value.avatar,alt:ie.value.name,class:"profile-avatar"},null,8,qa),e.createElementVNode("div",ja,e.toDisplayString(ie.value.name),1),e.createElementVNode("div",Xa,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",ie.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(ie.value.online?"在线":"离线"),1)]),e.createVNode(D,{type:"primary",size:"large",onClick:Qn,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.ChatDotRound))]),_:1}),t[59]||(t[59]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),de.value||e.unref(k)?(e.openBlock(),e.createElementBlock("div",Ya,[e.createElementVNode("div",Pa,[e.createElementVNode("div",Oa,[e.createElementVNode("span",Ja,e.toDisplayString(e.unref(k)?e.unref(k).name:de.value.name),1),e.unref(k)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["chat-window-status",de.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString(de.value.online?"在线":"离线"),3)),e.unref(k)?(e.openBlock(),e.createElementBlock("span",Qa,e.toDisplayString(e.unref(ee).length)+" 人 ",1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Za,[e.createVNode(f,{class:"chat-action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Search))]),_:1}),e.unref(k)?(e.openBlock(),e.createBlock(f,{key:0,class:"chat-action-icon",onClick:t[4]||(t[4]=r=>be.value=!be.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(x.MoreFilled))]),_:1})):(e.openBlock(),e.createBlock(f,{key:1,class:"chat-action-icon",onClick:t[5]||(t[5]=r=>_e.value=!_e.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(x.MoreFilled))]),_:1}))])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:L,class:"chat-messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k)?e.unref(R):e.unref(T),(r,$)=>(e.openBlock(),e.createElementBlock("div",{key:$,class:e.normalizeClass(["message-wrapper",r.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",va,[e.createElementVNode("img",{src:r.avatar,class:"message-avatar-img"},null,8,es)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content",r.isSelf?"message-content-self":"message-content-other"])},[r.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ts,e.toDisplayString(e.unref(k)?r.displayName||r.sendUsername:de.value.name),1)),e.createElementVNode("div",as,[r.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",r.isSelf?"message-bubble-self":"message-bubble-other"])},e.toDisplayString(r.text),3)):r.type==="file"&&r.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","message-image-bubble",r.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:he=>ht(r.fileUrl)},[e.createElementVNode("img",{src:r.fileUrl,alt:r.fileName,class:"message-image",onError:so},null,40,rs),r.fileSize?(e.openBlock(),e.createElementBlock("div",ns,e.toDisplayString(ut(r.fileSize)),1)):e.createCommentVNode("",!0)],10,ss)):r.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","message-file-bubble",r.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:he=>ht(r.fileUrl)},[e.createElementVNode("div",ls,[e.createElementVNode("div",is,[e.createVNode(f,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Document))]),_:1})]),e.createElementVNode("div",cs,[e.createElementVNode("div",ds,e.toDisplayString(r.fileName||r.text),1),e.createElementVNode("div",ps,[e.createVNode(f,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Download))]),_:1}),t[60]||(t[60]=e.createElementVNode("span",null,"点击下载",-1)),r.fileSize?(e.openBlock(),e.createElementBlock("span",ms,"· "+e.toDisplayString(ut(r.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,os)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",r.isSelf?"message-time-right":"message-time-left"])},e.toDisplayString(e.unref(Te)(r.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",{class:"chat-input-area",onClick:t[8]||(t[8]=r=>xe.value=!1)},[fe.value.length>0?(e.openBlock(),e.createElementBlock("div",us,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(fe.value,(r,$)=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:"pending-file-item"},[r.isImage?(e.openBlock(),e.createElementBlock("div",fs,[e.createElementVNode("img",{src:r.previewUrl,alt:r.name,class:"pending-image"},null,8,hs),e.createElementVNode("button",{onClick:he=>mt($),class:"pending-file-remove-btn"}," × ",8,gs)])):(e.openBlock(),e.createElementBlock("div",ks,[e.createVNode(f,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Folder))]),_:1}),e.createElementVNode("span",ys,e.toDisplayString(r.name),1),e.createElementVNode("button",{onClick:he=>mt($),class:"pending-file-remove-btn"}," × ",8,Vs)]))]))),128))])):e.createCommentVNode("",!0),m.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Ns,[e.createElementVNode("div",Cs,[e.createVNode(f,{class:"input-toolbar-icon",onClick:t[6]||(t[6]=e.withModifiers(r=>xe.value=!xe.value,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(x.ChatDotRound))]),_:1}),e.createVNode(Yt,{visible:xe.value,onSelect:ro},null,8,["visible"])]),e.createVNode(f,{class:"input-toolbar-icon",onClick:eo},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Folder))]),_:1}),e.createVNode(f,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",ws,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":t[7]||(t[7]=r=>e.isRef(U)?U.value=r:null),onKeydown:e.withKeys(e.withModifiers(ft,["prevent"]),["enter"]),onPaste:ao,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,bs),[[e.vModelText,e.unref(U)]])]),e.createElementVNode("div",Es,[e.createVNode(D,{type:"primary",disabled:!e.unref(U).trim()&&fe.value.length===0,onClick:ft,class:"send-message-btn"},{default:e.withCtx(()=>[...t[61]||(t[61]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:Re,type:"file",multiple:"",class:"hidden-file-input",onChange:to},null,544)])])):ie.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",_s,[e.createVNode(f,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.ChatLineRound))]),_:1}),e.createElementVNode("div",xs,e.toDisplayString(Ve.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),e.createVNode(e.Transition,{name:"slide"},{default:e.withCtx(()=>{var r,$,he,$e,bt,Et,_t,xt,Bt,St,Ut,Mt,Gt;return[be.value&&e.unref(k)?(e.openBlock(),e.createElementBlock("div",Bs,[e.createElementVNode("div",Ss,[t[62]||(t[62]=e.createElementVNode("span",{class:"group-sidebar-title"},"群聊信息",-1)),e.createVNode(f,{class:"group-sidebar-close",onClick:t[9]||(t[9]=K=>be.value=!1)},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Close))]),_:1})]),e.createElementVNode("div",Us,[e.createElementVNode("div",Ms,[e.createElementVNode("div",Gs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(ee).slice(0,12),K=>(e.openBlock(),e.createElementBlock("div",{key:K.username,class:"group-member-avatar-item",onClick:Fo=>e.unref(Ie)(K)},[e.createElementVNode("img",{src:K.avatar?`${m.config.api.baseUrl}${K.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${K.username}`,alt:K.username,class:"group-member-avatar-small"},null,8,zs),e.createElementVNode("span",Fs,e.toDisplayString(K.memberNick||K.username),1)],8,Ts))),128)),e.unref(ee).length>12?(e.openBlock(),e.createElementBlock("div",{key:0,class:"group-member-avatar-item",onClick:t[10]||(t[10]=K=>b.value=!0)},[e.createElementVNode("div",Is,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Plus))]),_:1})]),t[63]||(t[63]=e.createElementVNode("span",{class:"group-member-nickname"},"邀请",-1))])):(e.openBlock(),e.createElementBlock("div",{key:1,class:"group-member-avatar-item",onClick:t[11]||(t[11]=K=>b.value=!0)},[e.createElementVNode("div",Ds,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Plus))]),_:1})]),t[64]||(t[64]=e.createElementVNode("span",{class:"group-member-nickname"},"邀请",-1))]))])]),t[84]||(t[84]=e.createElementVNode("div",{class:"group-divider"},null,-1)),e.createElementVNode("div",As,[((r=e.unref(k))==null?void 0:r.owner)===e.unref(u)?(e.openBlock(),e.createElementBlock("div",Ls,[t[67]||(t[67]=e.createElementVNode("span",{class:"group-setting-label"},"群聊名称",-1)),e.createElementVNode("div",Rs,[e.unref(pe).groupNickname?(e.openBlock(),e.createElementBlock("div",$s,[e.createVNode(H,{modelValue:e.unref(ye).groupNickname,"onUpdate:modelValue":t[12]||(t[12]=K=>e.unref(ye).groupNickname=K),placeholder:"请输入群聊名称",onKeyup:t[13]||(t[13]=e.withKeys(K=>Be("groupNickname"),["enter"])),class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",Ks,[e.createVNode(D,{size:"small",onClick:t[14]||(t[14]=K=>e.unref(Pe)("groupNickname"))},{default:e.withCtx(()=>[...t[65]||(t[65]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{size:"small",type:"primary",onClick:t[15]||(t[15]=K=>Be("groupNickname"))},{default:e.withCtx(()=>[...t[66]||(t[66]=[e.createTextVNode("保存",-1)])]),_:1})])])):(e.openBlock(),e.createElementBlock("div",{key:1,class:"group-setting-value",onClick:t[16]||(t[16]=K=>e.unref(Ye)("groupNickname"))},[e.createElementVNode("span",null,e.toDisplayString((($=e.unref(le))==null?void 0:$.groupNickname)||((he=e.unref(le))==null?void 0:he.groupName)||(($e=e.unref(k))==null?void 0:$e.name)||""),1),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Edit))]),_:1})]))])])):(e.openBlock(),e.createElementBlock("div",Ws,[t[68]||(t[68]=e.createElementVNode("span",{class:"group-setting-label"},"群聊名称",-1)),e.createElementVNode("span",Hs,e.toDisplayString(((bt=e.unref(le))==null?void 0:bt.groupNickname)||((Et=e.unref(le))==null?void 0:Et.groupName)||((_t=e.unref(k))==null?void 0:_t.name)||""),1)])),((xt=e.unref(k))==null?void 0:xt.owner)===e.unref(u)?(e.openBlock(),e.createElementBlock("div",qs,[t[71]||(t[71]=e.createElementVNode("span",{class:"group-setting-label"},"群公告",-1)),e.createElementVNode("div",js,[e.unref(pe).notice?(e.openBlock(),e.createElementBlock("div",Xs,[e.createVNode(H,{modelValue:e.unref(ye).notice,"onUpdate:modelValue":t[17]||(t[17]=K=>e.unref(ye).notice=K),type:"textarea",rows:3,placeholder:"请输入群公告",class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",Ys,[e.createVNode(D,{size:"small",onClick:t[18]||(t[18]=K=>e.unref(Pe)("notice"))},{default:e.withCtx(()=>[...t[69]||(t[69]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{size:"small",type:"primary",onClick:t[19]||(t[19]=K=>Be("notice"))},{default:e.withCtx(()=>[...t[70]||(t[70]=[e.createTextVNode("保存",-1)])]),_:1})])])):(e.openBlock(),e.createElementBlock("div",{key:1,class:"group-setting-value",onClick:t[20]||(t[20]=K=>e.unref(Ye)("notice"))},[e.createElementVNode("span",Ps,e.toDisplayString(((Bt=e.unref(le))==null?void 0:Bt.notice)||"暂无公告"),1),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Edit))]),_:1})]))])])):(e.openBlock(),e.createElementBlock("div",Os,[t[72]||(t[72]=e.createElementVNode("span",{class:"group-setting-label"},"群公告",-1)),e.createElementVNode("span",Js,e.toDisplayString(((St=e.unref(le))==null?void 0:St.notice)||"暂无公告"),1)])),((Ut=e.unref(k))==null?void 0:Ut.owner)===e.unref(u)?(e.openBlock(),e.createElementBlock("div",Qs,[t[75]||(t[75]=e.createElementVNode("span",{class:"group-setting-label"},"备注",-1)),e.createElementVNode("div",Zs,[e.unref(pe).remark?(e.openBlock(),e.createElementBlock("div",vs,[e.createVNode(H,{modelValue:e.unref(ye).remark,"onUpdate:modelValue":t[21]||(t[21]=K=>e.unref(ye).remark=K),placeholder:"请输入备注",onKeyup:t[22]||(t[22]=e.withKeys(K=>Be("remark"),["enter"])),class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",er,[e.createVNode(D,{size:"small",onClick:t[23]||(t[23]=K=>e.unref(Pe)("remark"))},{default:e.withCtx(()=>[...t[73]||(t[73]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{size:"small",type:"primary",onClick:t[24]||(t[24]=K=>Be("remark"))},{default:e.withCtx(()=>[...t[74]||(t[74]=[e.createTextVNode("保存",-1)])]),_:1})])])):(e.openBlock(),e.createElementBlock("div",{key:1,class:"group-setting-value",onClick:t[25]||(t[25]=K=>e.unref(Ye)("remark"))},[e.createElementVNode("span",tr,e.toDisplayString(((Mt=e.unref(le))==null?void 0:Mt.remark)||"群聊的备注仅自己可见"),1),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Edit))]),_:1})]))])])):(e.openBlock(),e.createElementBlock("div",ar,[t[76]||(t[76]=e.createElementVNode("span",{class:"group-setting-label"},"备注",-1)),e.createElementVNode("span",sr,e.toDisplayString(((Gt=e.unref(le))==null?void 0:Gt.remark)||"群聊的备注仅自己可见"),1)])),e.createElementVNode("div",{class:"group-setting-item",onClick:Xn},[t[77]||(t[77]=e.createElementVNode("span",{class:"group-setting-label"},"我在本群的昵称",-1)),e.createElementVNode("div",rr,[e.createElementVNode("span",nr,e.toDisplayString(jn.value||e.unref(u)),1),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Edit))]),_:1})])]),t[82]||(t[82]=e.createElementVNode("div",{class:"group-divider"},null,-1)),e.createElementVNode("div",or,[t[78]||(t[78]=e.createElementVNode("span",{class:"group-setting-label"},"查找聊天内容",-1)),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.ArrowRight))]),_:1})]),e.createElementVNode("div",lr,[t[79]||(t[79]=e.createElementVNode("span",{class:"group-setting-label"},"消息免打扰",-1)),e.createVNode(Co,{modelValue:pt.value,"onUpdate:modelValue":t[26]||(t[26]=K=>pt.value=K)},null,8,["modelValue"])]),t[83]||(t[83]=e.createElementVNode("div",{class:"group-divider"},null,-1)),e.unref(k).owner===e.unref(u)?(e.openBlock(),e.createElementBlock("div",{key:6,class:"group-setting-item danger",onClick:kt},[...t[80]||(t[80]=[e.createElementVNode("span",{class:"group-setting-label"},"解散群聊",-1)])])):(e.openBlock(),e.createElementBlock("div",{key:7,class:"group-setting-item danger",onClick:gt},[...t[81]||(t[81]=[e.createElementVNode("span",{class:"group-setting-label"},"删除并退出",-1)])]))])])])):e.createCommentVNode("",!0)]}),_:1}),_e.value?(e.openBlock(),e.createElementBlock("div",ir,[t[86]||(t[86]=e.createElementVNode("div",{class:"chat-detail-header"},"聊天详情",-1)),e.createElementVNode("div",cr,[e.createElementVNode("div",dr,[e.createElementVNode("img",{src:(Nt=de.value)==null?void 0:Nt.avatar,alt:(Ct=de.value)==null?void 0:Ct.name,class:"chat-detail-avatar"},null,8,pr),e.createElementVNode("div",mr,e.toDisplayString((wt=de.value)==null?void 0:wt.name),1),t[85]||(t[85]=e.createElementVNode("div",{class:"chat-detail-actions"},[e.createElementVNode("div",{class:"chat-detail-action-item"},"查找聊天记录"),e.createElementVNode("div",{class:"chat-detail-action-item"},"清空聊天记录")],-1))])])])):e.createCommentVNode("",!0),e.createVNode(Ce,{modelValue:e.unref(h),"onUpdate:modelValue":t[28]||(t[28]=r=>e.isRef(h)?h.value=r:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",ur,[e.createVNode(H,{modelValue:e.unref(re),"onUpdate:modelValue":t[27]||(t[27]=r=>e.isRef(re)?re.value=r:null),placeholder:"搜索用户","prefix-icon":e.unref(x.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",fr,[e.unref(ne)?(e.openBlock(),e.createBlock(Q,{key:0,description:"加载中..."})):e.unref(te).length===0?(e.openBlock(),e.createBlock(Q,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(te),r=>(e.openBlock(),e.createElementBlock("div",{key:r.username,class:"add-friend-user-item"},[e.createElementVNode("div",hr,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${r.username}`,alt:r.username,class:"add-friend-user-avatar"},null,8,gr),e.createElementVNode("div",kr,e.toDisplayString(r.username),1)]),e.createVNode(D,{type:"primary",size:"small",onClick:$=>e.unref(M)(r)},{default:e.withCtx(()=>[...t[87]||(t[87]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(Ce,{modelValue:e.unref(g),"onUpdate:modelValue":t[32]||(t[32]=r=>e.isRef(g)?g.value=r:null),title:"创建群聊",width:"600px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[31]||(t[31]=r=>g.value=!1)},{default:e.withCtx(()=>[...t[91]||(t[91]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{type:"primary",onClick:io,disabled:!e.unref(q).trim()},{default:e.withCtx(()=>[...t[92]||(t[92]=[e.createTextVNode("创建",-1)])]),_:1},8,["disabled"])]),default:e.withCtx(()=>[e.createElementVNode("div",yr,[e.createElementVNode("div",Vr,[t[88]||(t[88]=e.createElementVNode("label",{class:"form-label"},"群名称",-1)),e.createVNode(H,{modelValue:e.unref(q),"onUpdate:modelValue":t[29]||(t[29]=r=>e.isRef(q)?q.value=r:null),placeholder:"请输入群名称",maxlength:"50"},null,8,["modelValue"])]),e.createElementVNode("div",Nr,[t[89]||(t[89]=e.createElementVNode("label",{class:"form-label"},"群备注",-1)),e.createVNode(H,{modelValue:e.unref(_),"onUpdate:modelValue":t[30]||(t[30]=r=>e.isRef(_)?_.value=r:null),type:"textarea",placeholder:"请输入群备注(可选)",rows:3,maxlength:"200"},null,8,["modelValue"])]),e.createElementVNode("div",Cr,[t[90]||(t[90]=e.createElementVNode("label",{class:"form-label"},"选择成员",-1)),e.createElementVNode("div",wr,[e.unref(d).length===0?(e.openBlock(),e.createBlock(Q,{key:0,description:"暂无好友可以添加"})):(e.openBlock(),e.createElementBlock("div",br,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(d),r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["member-item",e.unref(z).some($=>$.id===r.id)?"member-selected":""]),onClick:$=>oo(r)},[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"member-avatar"},null,8,_r),e.createElementVNode("span",xr,e.toDisplayString(r.name),1),e.unref(z).some($=>$.id===r.id)?(e.openBlock(),e.createBlock(f,{key:0,class:"member-check"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.CircleCheck))]),_:1})):e.createCommentVNode("",!0)],10,Er))),128))]))])])])]),_:1},8,["modelValue"]),e.unref(k)?(e.openBlock(),e.createBlock(Ce,{key:1,modelValue:e.unref(w),"onUpdate:modelValue":t[35]||(t[35]=r=>e.isRef(w)?w.value=r:null),title:e.unref(k).name,width:"500px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[34]||(t[34]=r=>w.value=!1)},{default:e.withCtx(()=>[...t[105]||(t[105]=[e.createTextVNode("关闭",-1)])]),_:1}),e.createVNode(D,{type:"danger",onClick:gt},{default:e.withCtx(()=>[...t[106]||(t[106]=[e.createTextVNode("退出群聊",-1)])]),_:1})]),default:e.withCtx(()=>[e.createElementVNode("div",Br,[e.createElementVNode("div",Sr,[e.createElementVNode("div",Ur,[t[93]||(t[93]=e.createElementVNode("span",{class:"info-label"},"群ID",-1)),e.createElementVNode("span",Mr,e.toDisplayString(e.unref(k).groupId),1)]),e.createElementVNode("div",Gr,[t[94]||(t[94]=e.createElementVNode("span",{class:"info-label"},"群主",-1)),e.createElementVNode("span",Tr,e.toDisplayString(e.unref(k).owner),1)]),e.createElementVNode("div",zr,[t[95]||(t[95]=e.createElementVNode("span",{class:"info-label"},"成员数",-1)),e.createElementVNode("span",Fr,e.toDisplayString(e.unref(ee).length),1)])]),e.unref(k).owner===e.unref(u)?(e.openBlock(),e.createElementBlock("div",Ir,[t[98]||(t[98]=e.createElementVNode("div",{class:"section-header"},[e.createElementVNode("span",{class:"section-title"},"群管理")],-1)),e.createElementVNode("div",Dr,[e.createVNode(D,{type:"primary",size:"small",onClick:e.unref(Kn)},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Edit))]),_:1}),t[96]||(t[96]=e.createTextVNode("编辑群信息 ",-1))]),_:1},8,["onClick"]),e.createVNode(D,{type:"danger",size:"small",onClick:kt},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Delete))]),_:1}),t[97]||(t[97]=e.createTextVNode("解散群聊 ",-1))]),_:1})])])):e.createCommentVNode("",!0),e.createElementVNode("div",Ar,[e.createElementVNode("div",Lr,[t[100]||(t[100]=e.createElementVNode("span",{class:"section-title"},"群成员",-1)),e.createVNode(D,{size:"small",onClick:t[33]||(t[33]=r=>b.value=!0)},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Plus))]),_:1}),t[99]||(t[99]=e.createTextVNode("邀请成员 ",-1))]),_:1})]),e.createElementVNode("div",Rr,[e.unref(ee).length===0?(e.openBlock(),e.createBlock(Q,{key:0,description:"暂无成员"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(e.unref(ee),r=>(e.openBlock(),e.createElementBlock("div",{key:r.id||r.username,class:"group-member-item"},[e.createElementVNode("img",{src:r.avatar?`${s.config.api.baseUrl}${r.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${r.username}`,alt:r.username,class:"group-member-avatar"},null,8,$r),e.createElementVNode("div",Kr,[e.createElementVNode("span",Wr,e.toDisplayString(r.memberNick||r.username),1),r.username===e.unref(k).owner?(e.openBlock(),e.createElementBlock("span",Hr,"群主")):e.createCommentVNode("",!0)]),e.unref(k).owner===e.unref(u)&&r.username!==e.unref(u)?(e.openBlock(),e.createElementBlock("div",qr,[e.createVNode(D,{size:"small",link:"",onClick:$=>e.unref(Ie)(r)},{default:e.withCtx(()=>[...t[101]||(t[101]=[e.createTextVNode(" 改昵称 ",-1)])]),_:1},8,["onClick"]),e.createVNode(D,{size:"small",link:"",type:"danger",onClick:$=>mo(r.username)},{default:e.withCtx(()=>[...t[102]||(t[102]=[e.createTextVNode(" 移除 ",-1)])]),_:1},8,["onClick"]),e.createVNode(D,{size:"small",link:"",type:"warning",onClick:$=>uo(r.username)},{default:e.withCtx(()=>[...t[103]||(t[103]=[e.createTextVNode(" 转让 ",-1)])]),_:1},8,["onClick"])])):r.username===e.unref(u)?(e.openBlock(),e.createElementBlock("div",jr,[e.createVNode(D,{size:"small",link:"",onClick:$=>e.unref(Ie)(r)},{default:e.withCtx(()=>[...t[104]||(t[104]=[e.createTextVNode(" 改昵称 ",-1)])]),_:1},8,["onClick"])])):e.createCommentVNode("",!0)]))),128))])])])]),_:1},8,["modelValue","title"])):e.createCommentVNode("",!0),e.unref(k)?(e.openBlock(),e.createBlock(Ce,{key:2,modelValue:e.unref(p),"onUpdate:modelValue":t[40]||(t[40]=r=>e.isRef(p)?p.value=r:null),title:"编辑群信息",width:"500px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[39]||(t[39]=r=>p.value=!1)},{default:e.withCtx(()=>[...t[107]||(t[107]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{type:"primary",onClick:fo},{default:e.withCtx(()=>[...t[108]||(t[108]=[e.createTextVNode("保存",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(yt,{"label-width":"80px"},{default:e.withCtx(()=>[e.createVNode(Se,{label:"群名称"},{default:e.withCtx(()=>[e.createVNode(H,{modelValue:e.unref(N).groupNickname,"onUpdate:modelValue":t[36]||(t[36]=r=>e.unref(N).groupNickname=r),placeholder:"请输入群名称"},null,8,["modelValue"])]),_:1}),e.createVNode(Se,{label:"群备注"},{default:e.withCtx(()=>[e.createVNode(H,{modelValue:e.unref(N).remark,"onUpdate:modelValue":t[37]||(t[37]=r=>e.unref(N).remark=r),type:"textarea",rows:3,placeholder:"请输入群备注"},null,8,["modelValue"])]),_:1}),e.createVNode(Se,{label:"群公告"},{default:e.withCtx(()=>[e.createVNode(H,{modelValue:e.unref(N).notice,"onUpdate:modelValue":t[38]||(t[38]=r=>e.unref(N).notice=r),type:"textarea",rows:3,placeholder:"请输入群公告"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.unref(k)?(e.openBlock(),e.createBlock(Ce,{key:3,modelValue:e.unref(I),"onUpdate:modelValue":t[43]||(t[43]=r=>e.isRef(I)?I.value=r:null),title:"编辑群昵称",width:"400px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[42]||(t[42]=r=>I.value=!1)},{default:e.withCtx(()=>[...t[109]||(t[109]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{type:"primary",onClick:po},{default:e.withCtx(()=>[...t[110]||(t[110]=[e.createTextVNode("保存",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(yt,{"label-width":"80px"},{default:e.withCtx(()=>[e.createVNode(Se,{label:"成员"},{default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(e.unref(B).targetUsername),1)]),_:1}),e.createVNode(Se,{label:"群昵称"},{default:e.withCtx(()=>[e.createVNode(H,{modelValue:e.unref(B).memberNick,"onUpdate:modelValue":t[41]||(t[41]=r=>e.unref(B).memberNick=r),placeholder:"请输入群昵称"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.unref(k)?(e.openBlock(),e.createBlock(Ce,{key:4,modelValue:e.unref(A),"onUpdate:modelValue":t[45]||(t[45]=r=>e.isRef(A)?A.value=r:null),title:"消息已读状态",width:"500px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[44]||(t[44]=r=>A.value=!1)},{default:e.withCtx(()=>[...t[111]||(t[111]=[e.createTextVNode("关闭",-1)])]),_:1})]),default:e.withCtx(()=>[e.createElementVNode("div",Xr,[e.createElementVNode("div",Yr,[e.createElementVNode("div",Pr,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Check))]),_:1}),e.createTextVNode("已读 ("+e.toDisplayString(e.unref(J).readUserList.length)+") ",1)]),e.createElementVNode("div",Or,[e.unref(J).readUserList.length===0?(e.openBlock(),e.createBlock(Q,{key:0,description:"暂无已读成员"})):(e.openBlock(),e.createElementBlock("div",Jr,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(J).readUserList,r=>(e.openBlock(),e.createBlock(Vt,{key:r,class:"user-tag"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r),1)]),_:2},1024))),128))]))])]),e.createElementVNode("div",Qr,[e.createElementVNode("div",Zr,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.Clock))]),_:1}),e.createTextVNode("未读 ("+e.toDisplayString(e.unref(J).unreadUserList.length)+") ",1)]),e.createElementVNode("div",vr,[e.unref(J).unreadUserList.length===0?(e.openBlock(),e.createBlock(Q,{key:0,description:"全部已读"})):(e.openBlock(),e.createElementBlock("div",en,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(J).unreadUserList,r=>(e.openBlock(),e.createBlock(Vt,{key:r,type:"info",class:"user-tag"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r),1)]),_:2},1024))),128))]))])])])]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.unref(k)?(e.openBlock(),e.createBlock(Ce,{key:5,modelValue:e.unref(b),"onUpdate:modelValue":t[47]||(t[47]=r=>e.isRef(b)?b.value=r:null),title:"邀请成员",width:"500px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(D,{onClick:t[46]||(t[46]=r=>b.value=!1)},{default:e.withCtx(()=>[...t[112]||(t[112]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{type:"primary",onClick:co,disabled:e.unref(F).length===0},{default:e.withCtx(()=>[e.createTextVNode(" 邀请 "+e.toDisplayString(e.unref(F).length)+" 人 ",1)]),_:1},8,["disabled"])]),default:e.withCtx(()=>[e.createElementVNode("div",tn,[e.createElementVNode("div",an,[e.unref(d).length===0?(e.openBlock(),e.createBlock(Q,{key:0,description:"暂无好友可以邀请"})):(e.openBlock(),e.createElementBlock("div",sn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(d),r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["member-item",e.unref(F).some($=>$.id===r.id)?"member-selected":""]),onClick:$=>lo(r)},[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"member-avatar"},null,8,nn),e.createElementVNode("span",on,e.toDisplayString(r.name),1),e.unref(F).some($=>$.id===r.id)?(e.openBlock(),e.createBlock(f,{key:0,class:"member-check"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.CircleCheck))]),_:1})):e.createCommentVNode("",!0)],10,rn))),128))]))])])]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(Ce,{modelValue:De.value,"onUpdate:modelValue":t[52]||(t[52]=r=>De.value=r),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"chat-settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",ln,[e.createElementVNode("div",cn,[e.createElementVNode("div",dn,[e.createElementVNode("img",{src:e.unref(G),alt:"头像",class:"chat-settings-avatar"},null,8,pn),m.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:vn},[e.createVNode(f,{size:18,class:"chat-settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:Le,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:ho},null,544)]),e.createElementVNode("div",mn,[e.createElementVNode("div",un,e.toDisplayString(e.unref(S).nickname||e.unref(u)),1),e.createElementVNode("div",fn,"@"+e.toDisplayString(e.unref(u)),1)])]),e.createElementVNode("div",hn,[e.createElementVNode("div",gn,[e.createElementVNode("div",kn,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(x.UserFilled))]),_:1}),t[113]||(t[113]=e.createTextVNode(" 个人信息 ",-1))]),ke.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(D,{key:0,type:"primary",size:"small",onClick:yo,class:"chat-settings-edit-btn"},{default:e.withCtx(()=>[...t[114]||(t[114]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",yn,[e.createElementVNode("div",Vn,[t[115]||(t[115]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),ke.value?(e.openBlock(),e.createBlock(H,{key:0,modelValue:ue.value.nickname,"onUpdate:modelValue":t[48]||(t[48]=r=>ue.value.nickname=r),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Nn,e.toDisplayString(e.unref(S).nickname||"未设置"),1))]),e.createElementVNode("div",Cn,[t[116]||(t[116]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),ke.value?(e.openBlock(),e.createBlock(H,{key:0,modelValue:ue.value.email,"onUpdate:modelValue":t[49]||(t[49]=r=>ue.value.email=r),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",wn,e.toDisplayString(e.unref(S).email||"未设置"),1))]),e.createElementVNode("div",bn,[t[117]||(t[117]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),ke.value?(e.openBlock(),e.createBlock(H,{key:0,modelValue:ue.value.phone,"onUpdate:modelValue":t[50]||(t[50]=r=>ue.value.phone=r),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",En,e.toDisplayString(e.unref(S).phone||"未设置"),1))]),e.createElementVNode("div",_n,[t[118]||(t[118]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),ke.value?(e.openBlock(),e.createBlock(H,{key:0,modelValue:ue.value.bio,"onUpdate:modelValue":t[51]||(t[51]=r=>ue.value.bio=r),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",xn,e.toDisplayString(e.unref(S).bio||"这个人很懒,什么都没写~"),1))]),ke.value?(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(D,{size:"default",onClick:Vo},{default:e.withCtx(()=>[...t[119]||(t[119]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(D,{type:"primary",size:"default",loading:Oe.value,onClick:No},{default:e.withCtx(()=>[...t[120]||(t[120]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(He,{modelValue:Ae.value,"onUpdate:modelValue":t[53]||(t[53]=r=>Ae.value=r),src:Je.value,onConfirm:go},null,8,["modelValue","src"]),Ne.value.visible?(e.openBlock(),e.createElementBlock("div",{key:6,class:"chat-context-menu",style:e.normalizeStyle({left:Ne.value.x+"px",top:Ne.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Pn},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-18e78d30"]]),Sn={api:{baseUrl:"",websocketUrl:"",endpoints:{getFriends:"/chart/friends",getHistory:"/chart/history",setRead:"/chart/read",uploadFile:"/chart/upload/file",addFriend:"/chart/friend/add",getApplyList:"/chart/friend/applyList",agreeFriend:"/chart/friend/agree",setChatStatus:"/chart/friend/chat/status",getAvailableUsers:"/chart/user/canAddFriend",searchUser:"/chart/user/search",getUserAvatar:"/user/getAvatar",uploadAvatar:"/user/uploadAvatar",createGroup:"/chart/group/create",getMyGroups:"/chart/group/my",getGroupInfo:"/chart/group/info",addGroupMember:"/chart/group/member/add",getGroupMembers:"/chart/group/member/list",quitGroup:"/chart/group/member/quit",getGroupHistory:"/chart/group/history",getGroupUnreadCount:"/chart/group/unread/count",getMsgReadUserList:"/chart/group/msg/read/list",updateGroupInfo:"/chart/group/update/info",updateMemberNick:"/chart/group/member/nick/update",deleteGroup:"/chart/group/delete",removeGroupMember:"/chart/group/member/remove",transferGroupOwner:"/chart/group/owner/transfer",readSingleGroupMsg:"/chart/group/msg/read/single",readAllGroupMsg:"/chart/group/msg/read/all"},adapter:null},user:{username:"",avatar:"",nickname:"",email:"",phone:"",bio:""},modules:{friends:!0,apply:!0,settings:!0,fileUpload:!0,avatarCrop:!0,groups:!0,groupMembers:!0},theme:{primaryColor:"#07c160",selfMessageBg:"#95ec69",otherMessageBg:"#ffffff"},headers:{},requestInterceptors:[],responseInterceptors:[],websocket:{maxReconnectAttempts:5,reconnectDelay:3e3},file:{maxSize:50*1024*1024,allowedTypes:["*"]}};function Un(m={}){const a=st(Sn,m);return a.api.baseUrl||console.warn("[VueChatKit] 请配置 api.baseUrl"),a.api.websocketUrl||console.warn("[VueChatKit] 请配置 api.websocketUrl"),a.user.username||console.warn("[VueChatKit] 请配置 user.username"),a}function st(m,a){const s={...m};for(const n in a)a[n]&&typeof a[n]=="object"&&!Array.isArray(a[n])?s[n]=st(m[n]||{},a[n]):s[n]=a[n];return s}const rt={install(m){m.component("ChatPanel",at),m.component("AvatarCrop",He)}};Z.AvatarCrop=He,Z.ChatApi=Ge,Z.ChatPanel=at,Z.ChatWebSocket=ve,Z.HttpClient=et,Z.VueChatKit=rt,Z.createChatConfig=Un,Z.default=rt,Z.useChat=tt,Object.defineProperties(Z,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|