vue-chat-kit 0.3.7 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -4
- package/dist/vue-chat-kit.css +1 -1
- package/dist/vue-chat-kit.es.js +3392 -2122
- package/dist/vue-chat-kit.umd.js +1 -1
- package/package.json +1 -1
- package/src/components/ChatPanel.vue +1570 -57
- package/src/components/EmojiPicker.vue +197 -0
- package/src/composables/useChat.js +157 -613
- 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 -4
- package/src/core/adapter-example.js +90 -20
- package/src/core/api.js +189 -13
- package/src/core/websocket.js +25 -9
- package/src/index.js +0 -4
- package/src/components/ChatWindow.vue +0 -2094
package/dist/vue-chat-kit.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(Q,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):(Q=typeof globalThis<"u"?globalThis:Q||self,e(Q.VueChatKit={},Q.Vue,Q.ElementPlusIconsVue,Q.dayjs,Q.ElementPlus))})(this,function(Q,e,V,Ae,L){"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",_="",K="",M=0){if(this.isConnected()){const q=JSON.stringify({to:t,msg:s,type:d,fileUrl:_,fileName:K,fileSize:M});return this.socket.send(q),!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:K,params:M}=s;let q=t.startsWith("http")?t:`${this.baseUrl}${t}`,D={method:d,headers:{...this.headers,..._},body:K,params:M};this.requestInterceptors.forEach(C=>{D=C(D)});const se={method:D.method,headers:D.headers,credentials:"include"};if(D.body&&d!=="GET"&&(D.body instanceof FormData?se.body=D.body:typeof D.body=="object"?se.body=JSON.stringify(D.body):se.body=D.body),D.params){const C=new URLSearchParams;for(const N in D.params)D.params[N]!==void 0&&D.params[N]!==null&&D.params[N]!==""&&C.append(N,D.params[N]);const k=C.toString();k&&(q+=(q.includes("?")?"&":"?")+k)}try{let k=await Promise.race([fetch(q,se),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(te=>{k=te(k)}),!k.ok)throw new $e(`HTTP ${k.status}: ${k.statusText}`,k.status,k.status);const N=k.headers.get("content-type");let m;return N&&N.includes("application/json")?m=await k.json():m=await k.text(),m}catch(C){throw C instanceof $e?C:new $e(C instanceof Error?C.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 Fe{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 getUserInfo(t){return this._call("getUserInfo",t)}async _getUserInfo(t){return this.http.get(this.endpoints.getUserInfo,{username:t})}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:Fe,default:Fe},Symbol.toStringTag,{value:"Module"}));function Re(y,t){const s=new Fe(y);let d=null;const _=y.user.username,K=e.ref(y.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${_}`),M=e.ref({username:_,nickname:y.user.nickname||"",email:y.user.email||"",phone:y.user.phone||"",bio:y.user.bio||""}),q=e.ref(!1),D=e.ref([]),se=e.ref([]),C=e.ref([]),k=e.ref(""),N=e.ref(""),m=e.ref(""),te=e.ref(null),ue=e.ref(!1),re=e.ref(""),u=e.ref([]),oe=e.ref(!1),de=e.ref([]),ye=e.ref(!1),me=e.computed(()=>{let n=se.value;if(N.value){const i=N.value.toLowerCase();n=n.filter(f=>{var b;return(b=f.username)==null?void 0:b.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||K.value,online:i.online,lastMsg:i.lastMsg||"暂无消息",lastTime:i.lastTime,unread:i.unReadNum||0}))}),he=e.computed(()=>{let n=D.value;if(N.value){const i=N.value.toLowerCase();n=n.filter(f=>{var b;return(b=f.username)==null?void 0:b.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||K.value,online:i.online,isChatting:i.isChatting}))}),ke=e.computed(()=>u.value),_e=e.computed(()=>me.value.find(n=>n.id===k.value)||null),be=e.computed(()=>C.value.map(n=>{const i=n.type==="file"||n.fileUrl||n.fileName,f=n.fileName||n.msgContent;return{text:n.msgContent,isSelf:n.sendUsername===_,time:n.createTime,sendUsername:n.sendUsername,type:i?"file":"text",fileType:g(f)?"image":E(f),fileUrl:n.fileUrl||"",fileName:f,fileSize:n.fileSize||0}})),we=n=>Ae(n).format("HH:mm"),Ve=n=>{if(!n)return"";const i=Ae(),f=Ae(n);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")},g=n=>{if(!n)return!1;const i=["jpg","jpeg","png","gif","bmp","webp","svg"],f=n.split(".").pop().toLowerCase();return i.includes(f)},E=n=>{if(!n)return"default";const i=n.split(".").pop().toLowerCase();return["xls","xlsx"].includes(i)?"excel":["pdf"].includes(i)?"pdf":["doc","docx"].includes(i)?"docx":"default"},A=()=>{e.nextTick(()=>{te.value&&(te.value.scrollTop=te.value.scrollHeight)})},w=async()=>{try{const i=(await s.getFriends(_)).data||[];D.value=i,se.value=i.filter(f=>f.isChatting===1);for(const f of se.value)try{const ie=(await s.getHistory(_,f.username)).data||[];f.unReadNum=ie.filter(X=>X.isRead===0&&X.sendUsername===f.username).length}catch{f.unReadNum=0}}catch(n){console.error("[VueChatKit] 获取好友列表失败",n)}},x=async n=>{try{const i=await s.getHistory(_,n);C.value=i.data||[],A()}catch(i){console.error("[VueChatKit] 获取聊天历史失败",i)}},B=async n=>{try{await s.setRead(_,n),w()}catch(i){console.error("[VueChatKit] 标记已读失败",i)}},z=async n=>{k.value=n.id,await x(n.id),await B(n.id),A()},W=async(n,i=1)=>{try{return await s.setChatStatus(_,n,i),await w(),!0}catch(f){return console.error("[VueChatKit] 设置聊天状态失败",f),!1}},H=()=>{if(!m.value.trim()||!k.value||!d)return;if(d.send(k.value,m.value.trim(),"text")){const i={msgContent:m.value.trim(),sendUsername:_,receiveUsername:k.value,createTime:new Date,isRead:0,type:"text"};C.value.push(i),m.value="",A(),setTimeout(()=>{x(k.value),w()},300)}},S=async n=>{if(!k.value||!d)return!1;try{const i=await s.uploadFile(n);if(i.code===200&&i.data){const{fileUrl:f,fileName:b}=i.data;if(d.send(k.value,b,"file",f,b,n.size)){const X={msgContent:b,sendUsername:_,receiveUsername:k.value,createTime:new Date,isRead:0,type:"file",fileUrl:f,fileName:b,fileSize:n.size};return C.value.push(X),A(),!0}}return!1}catch(i){return console.error("[VueChatKit] 发送文件失败",i),!1}},R=async(n,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"};C.value.push(b)}for(const f of n){const b=f.file||f;await S(b)}setTimeout(()=>{x(k.value),w()},300)}},j=n=>{try{try{const f=JSON.parse(n);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=n.match(/^\[(.+?)\]:(.+)$/);if(i)return{username:i[1],content:i[2],type:"text"}}catch(i){console.error("[VueChatKit] 解析消息失败",i)}return null},P=n=>{if(n.includes("【状态变更】")){const f=/【状态变更】(.+?) 已(上线|下线)/,b=n.match(f);if(b){const ie=b[1],X=b[2]==="上线",Y=D.value.find(pe=>pe.username===ie);Y&&(Y.online=X)}return}const i=j(n);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};C.value.push(b),A()}catch(b){console.error("[VueChatKit] 添加临时消息失败",b)}x(k.value)}w(),t&&typeof t=="function"&&t(f)}},ae=()=>{const n=`${y.api.websocketUrl}?userId=${_}`;d=new ve(_,{wsUrl:n,maxReconnectAttempts:y.websocket.maxReconnectAttempts,reconnectDelay:y.websocket.reconnectDelay}),d.on("message",P),d.connect()},ne=()=>{d&&(d.close(),d=null)},T=async()=>{ue.value=!0,re.value="",u.value=[]},O=async(n="")=>{oe.value=!0;try{let i;n?i=await s.searchUser(n):i=await s.getAvailableUsers(_),u.value=(i==null?void 0:i.data)||[]}catch(i){console.error("[VueChatKit] 获取可用用户失败",i)}finally{oe.value=!1}},G=async n=>{try{await s.addFriend(_,n.username),await w(),ue.value=!1}catch(i){console.error("[VueChatKit] 添加好友失败",i)}},$=async()=>{ye.value=!0;try{const n=await s.getApplyList(_);de.value=n.data||[]}catch(n){console.error("[VueChatKit] 获取好友申请列表失败",n)}finally{ye.value=!1}},F=async n=>{try{await s.agreeFriend(n,_),await $(),await w()}catch(i){console.error("[VueChatKit] 同意好友申请失败",i)}},J=async()=>{try{const n=await s.getUserAvatar(_);n.code===200&&n.data&&(K.value=n.data)}catch(n){console.warn("[VueChatKit] 加载头像失败",n)}},Z=n=>{K.value=n},I=async()=>{q.value=!0;try{const n=await s.getUserInfo(_);n.code===200&&n.data&&(M.value={...M.value,...n.data})}catch(n){console.error("[VueChatKit] 获取用户信息失败",n)}finally{q.value=!1}},v=async n=>{try{return(await s.updateUserInfo(_,n)).code===200?(M.value={...M.value,...n},!0):!1}catch(i){return console.error("[VueChatKit] 更新用户信息失败",i),!1}},ge=()=>{k.value="",C.value=[],m.value="",N.value=""};return J(),e.watch(re,async n=>{await O(n)}),{myUsername:_,myAvatar:K,userInfo:M,loadingUserInfo:q,friendList:D,chatList:se,filteredFriendList:he,chatMsgList:C,currentSelectName:k,searchText:N,inputText:m,messagesContainer:te,filteredUsers:me,filteredAvailableUsers:ke,currentUser:_e,currentMessages:be,addFriendDialogVisible:ue,addFriendSearchText:re,availableUsers:u,loadingAvailableUsers:oe,friendApplyList:de,loadingFriendApply:ye,formatTime:we,formatLastTime:Ve,scrollToBottom:A,getFriendList:w,getChatHistory:x,setFriendToChatStatus:W,selectUser:z,sendMessage:H,sendFile:S,sendFilesAndText:R,initWebSocket:ae,closeWebSocket:ne,reset:ge,openAddFriendDialog:T,loadAvailableUsers:O,addFriend:G,loadFriendApplyList:$,agreeFriend:F,updateMyAvatar:Z,getUserInfo:I,updateUserInfo:v}}const Te=(y,t)=>{const s=y.__vccOpts||y;for(const[d,_]of t)s[d]=_;return s},lt={class:"avatar-crop-container"},rt={key:0,class:"crop-wrapper"},it=["src"],ct=["onMousedown","onTouchstart"],dt={class:"preview-wrapper"},mt=["width","height"],pt={class:"dialog-footer"},Me=Te({__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(y,{expose:t,emit:s}){const d=y,_=s,K=e.computed({get:()=>d.modelValue,set:g=>_("update:modelValue",g)}),M=e.computed({get:()=>d.src,set:g=>{}}),q=["nw","n","ne","e","se","s","sw","w"],D=e.ref(!1),se=e.ref(null),C=e.ref(null),k=e.ref(null),N=e.ref({naturalWidth:0,naturalHeight:0,displayWidth:0,displayHeight:0,offsetX:0,offsetY:0}),m=e.ref({x:0,y:0,size:150,minSize:d.minSize}),te=e.computed(()=>({width:`${N.value.displayWidth}px`,height:`${N.value.displayHeight}px`,maxWidth:"none",maxHeight:"none",display:"block"})),ue=e.computed(()=>({left:`${m.value.x}px`,top:`${m.value.y}px`,width:`${m.value.size}px`,height:`${m.value.size/d.aspectRatio}px`}));let re=null,u=null;const oe=()=>{e.nextTick(()=>{const g=C.value,E=se.value;if(!g||!E)return;const A=E.clientWidth,w=E.clientHeight,x=g.naturalWidth/g.naturalHeight,B=A/w;let z,W,H,S;x>B?(z=A,W=A/x,H=0,S=(w-W)/2):(W=w,z=w*x,H=(A-z)/2,S=0),N.value={naturalWidth:g.naturalWidth,naturalHeight:g.naturalHeight,displayWidth:z,displayHeight:W,offsetX:H,offsetY:S};const R=Math.min(z,W)*.6;m.value.size=R,m.value.x=H+(z-R)/2,m.value.y=S+(W-R/d.aspectRatio)/2,de()})},de=()=>{const g=k.value,E=C.value;if(!g||!E)return;const A=g.getContext("2d"),{naturalWidth:w,naturalHeight:x,displayWidth:B,displayHeight:z,offsetX:W,offsetY:H}=N.value,S=w/B,R=x/z,j=(m.value.x-W)*S,P=(m.value.y-H)*R,ae=m.value.size*S,ne=m.value.size/d.aspectRatio*R;A.clearRect(0,0,g.width,g.height),A.drawImage(E,j,P,ae,ne,0,0,g.width,g.height)},ye=g=>{g.preventDefault();const E=g.clientX||g.touches[0].clientX,A=g.clientY||g.touches[0].clientY;re={startX:E,startY:A,boxX:m.value.x,boxY:m.value.y};const w=B=>{const z=B.clientX||B.touches[0].clientX,W=B.clientY||B.touches[0].clientY,H=z-re.startX,S=W-re.startY,{offsetX:R,offsetY:j,displayWidth:P,displayHeight:ae}=N.value,ne=m.value.size/d.aspectRatio,T=Math.max(R,Math.min(R+P-m.value.size,re.boxX+H)),O=Math.max(j,Math.min(j+ae-ne,re.boxY+S));m.value.x=T,m.value.y=O,de()},x=()=>{re=null,document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",x),document.removeEventListener("touchmove",w),document.removeEventListener("touchend",x)};document.addEventListener("mousemove",w),document.addEventListener("mouseup",x),document.addEventListener("touchmove",w,{passive:!1}),document.addEventListener("touchend",x)},me=(g,E)=>{E.preventDefault();const A=E.clientX||E.touches[0].clientX,w=E.clientY||E.touches[0].clientY;u={handle:g,startX:A,startY:w,boxX:m.value.x,boxY:m.value.y,boxSize:m.value.size};const x=z=>{const W=z.clientX||z.touches[0].clientX,H=z.clientY||z.touches[0].clientY,S=W-u.startX,R=H-u.startY,{offsetX:j,offsetY:P,displayWidth:ae,displayHeight:ne}=N.value;let T=u.boxSize,O=u.boxX,G=u.boxY;const $=u.boxSize/d.aspectRatio;switch(g){case"se":T=Math.max(m.value.minSize,Math.min(ae-(u.boxX-j),ne-(u.boxY-P),u.boxSize+Math.max(S,R)));break;case"nw":T=Math.max(m.value.minSize,Math.min(u.boxX-j+u.boxSize,u.boxY-P+$,u.boxSize-Math.max(S,R))),O=u.boxX+(u.boxSize-T),G=u.boxY+($-T/d.aspectRatio);break;case"ne":T=Math.max(m.value.minSize,Math.min(j+ae-u.boxX,u.boxY-P+$,u.boxSize+Math.max(S,-R))),G=u.boxY+($-T/d.aspectRatio);break;case"sw":T=Math.max(m.value.minSize,Math.min(u.boxX-j+u.boxSize,P+ne-u.boxY,u.boxSize+Math.max(-S,R))),O=u.boxX+(u.boxSize-T);break;case"n":T=Math.max(m.value.minSize,Math.min(u.boxY-P+$,u.boxSize-R)),G=u.boxY+($-T/d.aspectRatio);break;case"s":T=Math.max(m.value.minSize,Math.min(P+ne-u.boxY,u.boxSize+R));break;case"w":T=Math.max(m.value.minSize,Math.min(u.boxX-j+u.boxSize,u.boxSize-S)),O=u.boxX+(u.boxSize-T);break;case"e":T=Math.max(m.value.minSize,Math.min(j+ae-u.boxX,u.boxSize+S));break}m.value.size=T,m.value.x=O,m.value.y=G,de()},B=()=>{u=null,document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",B),document.removeEventListener("touchmove",x),document.removeEventListener("touchend",B)};document.addEventListener("mousemove",x),document.addEventListener("mouseup",B),document.addEventListener("touchmove",x,{passive:!1}),document.addEventListener("touchend",B)},he=()=>{const g=document.createElement("canvas"),E=C.value;if(!E)return null;const{naturalWidth:A,naturalHeight:w,displayWidth:x,displayHeight:B,offsetX:z,offsetY:W}=N.value,H=A/x,S=w/B,R=(m.value.x-z)*H,j=(m.value.y-W)*S,P=m.value.size*H,ae=m.value.size/d.aspectRatio*S;return g.width=d.outputSize,g.height=d.outputSize/d.aspectRatio,g.getContext("2d").drawImage(E,R,j,P,ae,0,0,g.width,g.height),new Promise(T=>{g.toBlob(O=>{T(new File([O],"avatar.jpg",{type:d.outputType}))},d.outputType,d.outputQuality)})},ke=()=>{const g=document.createElement("canvas"),E=C.value;if(!E)return null;const{naturalWidth:A,naturalHeight:w,displayWidth:x,displayHeight:B,offsetX:z,offsetY:W}=N.value,H=A/x,S=w/B,R=(m.value.x-z)*H,j=(m.value.y-W)*S,P=m.value.size*H,ae=m.value.size/d.aspectRatio*S;return g.width=d.outputSize,g.height=d.outputSize/d.aspectRatio,g.getContext("2d").drawImage(E,R,j,P,ae,0,0,g.width,g.height),g.toDataURL(d.outputType,d.outputQuality)},_e=async()=>{if(M.value){D.value=!0;try{const g=await he(),E=ke();g&&_("confirm",{file:g,dataUrl:E})}catch(g){console.error(g),L.ElMessage.error("生成图片失败")}finally{D.value=!1}}},be=()=>{_("cancel"),K.value=!1},we=()=>{Ve(),_("closed")},Ve=()=>{m.value={x:0,y:0,size:150,minSize:d.minSize}};return e.watch(()=>d.src,g=>{g&&e.nextTick(()=>{C.value&&C.value.complete&&oe()})}),t({getCroppedImage:he,getCroppedImageDataUrl:ke,reset:Ve}),(g,E)=>{const A=e.resolveComponent("el-empty"),w=e.resolveComponent("el-button"),x=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(x,{modelValue:K.value,"onUpdate:modelValue":E[0]||(E[0]=B=>K.value=B),title:"调整头像",width:y.dialogWidth,"close-on-click-modal":!1,"append-to-body":y.appendToBody,onClosed:we},{footer:e.withCtx(()=>[e.createElementVNode("div",pt,[e.createVNode(w,{onClick:be},{default:e.withCtx(()=>[...E[2]||(E[2]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(w,{type:"primary",loading:D.value,disabled:!M.value,onClick:_e},{default:e.withCtx(()=>[...E[3]||(E[3]=[e.createTextVNode(" 确认 ",-1)])]),_:1},8,["loading","disabled"])])]),default:e.withCtx(()=>[e.createElementVNode("div",lt,[M.value?(e.openBlock(),e.createElementBlock("div",rt,[e.createElementVNode("div",{ref_key:"cropAreaRef",ref:se,class:"crop-area",style:e.normalizeStyle({height:y.cropAreaHeight})},[e.createElementVNode("img",{src:M.value,ref_key:"imageRef",ref:C,onLoad:oe,style:e.normalizeStyle(te.value)},null,44,it),e.createElementVNode("div",{class:"crop-box",style:e.normalizeStyle(ue.value),onMousedown:ye,onTouchstart:ye},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(q,B=>e.createElementVNode("div",{key:B,class:e.normalizeClass(["crop-handle",B]),onMousedown:e.withModifiers(z=>me(B,z),["stop"]),onTouchstart:e.withModifiers(z=>me(B,z),["stop"])},null,42,ct)),64))],36)],4),e.createElementVNode("div",dt,[E[1]||(E[1]=e.createElementVNode("div",{class:"preview-label"},"预览",-1)),e.createElementVNode("div",{class:"preview-box",style:e.normalizeStyle({width:y.previewSize+"px",height:y.previewSize+"px"})},[e.createElementVNode("canvas",{ref_key:"previewCanvasRef",ref:k,width:y.previewSize,height:y.previewSize,class:"preview-canvas"},null,8,mt)],4)])])):(e.openBlock(),e.createBlock(A,{key:1,description:"请上传图片"}))])]),_:1},8,["modelValue","width","append-to-body"])}}},[["__scopeId","data-v-594eeaf3"]]),ft={class:"chat-panel"},ht={class:"chat-sidebar"},gt=["src"],ut=["onClick"],yt={key:0,class:"sidebar-nav-badge"},kt={class:"chat-content-panel"},_t={class:"chat-search-bar"},Vt={class:"chat-content-scroll"},Et={key:0},Nt=["onClick","onContextmenu"],Ct={class:"chat-list-avatar-wrapper"},bt=["src","alt"],wt={key:0,class:"chat-list-online-indicator"},xt={class:"chat-list-info"},Bt={class:"chat-list-header"},St={class:"chat-list-name"},Ut={class:"chat-list-time"},zt={class:"chat-list-preview"},$t={class:"chat-list-last-msg"},Ft={key:0,class:"chat-list-unread"},Mt={key:1},Dt={class:"add-friend-section"},At={class:"add-friend-icon"},Rt=["onClick"],Tt={class:"chat-list-avatar-wrapper"},It=["src","alt"],Lt={class:"chat-list-info"},Wt={class:"chat-list-name"},Ht={key:2},Xt={class:"friend-request-info"},Yt=["src","alt"],qt={class:"friend-request-details"},Kt={class:"friend-request-username"},jt={class:"chat-main-area"},Ot={key:0,class:"friend-profile-area"},Pt=["src","alt"],Gt={class:"profile-name"},Jt={class:"profile-status"},Qt={key:1,class:"chat-window-area"},Zt={class:"chat-window-header"},vt={class:"chat-window-title"},ea={class:"chat-window-name"},ta={class:"chat-window-actions"},aa={class:"message-avatar"},sa=["src"],na={key:0,class:"message-sender-name"},oa={class:"message-bubble-wrapper"},la=["onClick"],ra=["src","alt"],ia={key:0,class:"message-image-size"},ca=["onClick"],da={class:"message-file-content"},ma={class:"message-file-icon"},pa={class:"message-file-info"},fa={class:"message-file-name"},ha={class:"message-file-meta"},ga={key:0},ua={class:"chat-input-area"},ya={key:0,class:"pending-files-area"},ka={key:0,class:"pending-image-wrapper"},_a=["src","alt"],Va=["onClick"],Ea={key:1,class:"pending-file-wrapper"},Na={class:"pending-file-name"},Ca=["onClick"],ba={key:1,class:"input-toolbar"},wa={class:"input-textarea-wrapper"},xa=["onKeydown"],Ba={class:"input-send-wrapper"},Sa={key:2,class:"chat-empty-state"},Ua={class:"empty-state-text"},za={key:0,class:"chat-detail-panel"},$a={class:"chat-detail-content"},Fa={class:"chat-detail-profile"},Ma=["src","alt"],Da={class:"chat-detail-name"},Aa={class:"add-friend-search-wrapper"},Ra={class:"add-friend-users-list"},Ta={class:"add-friend-user-info"},Ia=["src","alt"],La={class:"add-friend-user-name"},Wa={class:"chat-settings-container"},Ha={class:"chat-settings-avatar-section"},Xa={class:"chat-settings-avatar-wrapper"},Ya=["src"],qa={class:"chat-settings-user-display"},Ka={class:"chat-settings-nickname"},ja={class:"chat-settings-username"},Oa={class:"chat-settings-form-section"},Pa={class:"chat-settings-form-header"},Ga={class:"chat-settings-form-title"},Ja={class:"chat-settings-form"},Qa={class:"chat-settings-form-item"},Za={key:1,class:"chat-settings-form-value"},va={class:"chat-settings-form-item"},es={key:1,class:"chat-settings-form-value"},ts={class:"chat-settings-form-item"},as={key:1,class:"chat-settings-form-value"},ss={class:"chat-settings-form-item"},ns={key:1,class:"chat-settings-form-value bio-value"},os={key:0,class:"chat-settings-form-actions"},at=Te({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(y,{emit:t}){const s=y,d=t,{myUsername:_,myAvatar:K,userInfo:M,loadingUserInfo:q,friendList:D,filteredFriendList:se,searchText:C,inputText:k,messagesContainer:N,filteredUsers:m,filteredAvailableUsers:te,currentUser:ue,currentMessages:re,addFriendDialogVisible:u,addFriendSearchText:oe,availableUsers:de,loadingAvailableUsers:ye,friendApplyList:me,loadingFriendApply:he,formatTime:ke,formatLastTime:_e,scrollToBottom:be,getFriendList:we,getChatHistory:Ve,setFriendToChatStatus:g,selectUser:E,sendMessage:A,sendFile:w,sendFilesAndText:x,initWebSocket:B,closeWebSocket:z,reset:W,openAddFriendDialog:H,addFriend:S,loadFriendApplyList:R,agreeFriend:j,updateMyAvatar:P,getUserInfo:ae,updateUserInfo:ne}=Re(s.config,p=>{d("message",p)}),T=e.computed(()=>{var r;const p=[{id:"chat",icon:V.ChatDotRound,badge:0}];return s.config.modules.friends&&p.push({id:"friends",icon:V.UserFilled,badge:0}),s.config.modules.apply&&p.push({id:"apply",icon:V.Bell,badge:((r=me.value)==null?void 0:r.length)||0}),p}),O=e.ref("chat"),G=e.ref(null),$=e.ref(null),F=e.ref(null),J=e.ref(!1),Z=e.ref(!1),I=e.ref({nickname:"",email:"",phone:"",bio:""}),v=e.ref(!1),ge=e.ref(!1),n=e.ref(!1),i=e.ref(!1),f=e.ref(null),b=e.ref(""),ie=e.ref(null),X=e.ref([]),Y=e.ref({visible:!1,x:0,y:0,chat:null}),pe=(p,r)=>{p.preventDefault(),p.stopPropagation(),Y.value={visible:!0,x:p.clientX,y:p.clientY,chat:r}},Ee=()=>{Y.value.visible=!1},Ie=async()=>{if(!Y.value.chat)return;await g(Y.value.chat.id,0)&&G.value===Y.value.chat.id&&(G.value=null,$.value=null),Ee()},Ne=p=>{G.value=p.id,$.value=p,F.value=null,J.value=!1,E({id:p.id,name:p.name,avatar:p.avatar,online:p.online})},Le=p=>{F.value=p,G.value=null,$.value=null},We=async()=>{if(!F.value)return;if(await g(F.value.id)){O.value="chat",await e.nextTick();const r=m.value.find(c=>c.id===F.value.id);r&&Ne(r),F.value=null}},He=()=>{ge.value=!0},Xe=()=>{var p;(p=f.value)==null||p.click()},Ye=()=>{var p;(p=ie.value)==null||p.click()},qe=p=>{const r=Array.from(p.target.files||[]);if(r.length!==0){for(const c of r){if(c.size>50*1024*1024){L.ElMessage.warning(`文件 ${c.name} 超过50MB,已跳过`);continue}const a=URL.createObjectURL(c);X.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/")})}ie.value&&(ie.value.value="")}},Be=p=>{const r=X.value[p];r.previewUrl&&URL.revokeObjectURL(r.previewUrl),X.value.splice(p,1)},Se=p=>{if(p===0)return"0 B";const r=1024,c=["B","KB","MB","GB"],a=Math.floor(Math.log(p)/Math.log(r));return parseFloat((p/Math.pow(r,a)).toFixed(2))+" "+c[a]},Ue=async()=>{if(!k.value.trim()&&X.value.length===0)return;const p=[...X.value],r=k.value;k.value="",X.value.forEach(c=>{c.previewUrl&&URL.revokeObjectURL(c.previewUrl)}),X.value=[],await x(p,r),d("send",{text:r,files:p})},Ke=p=>{var c;const r=(c=p.clipboardData)==null?void 0:c.items;if(r){for(const a of r)if(a.kind==="file"){const h=a.getAsFile();if(h){if(h.size>50*1024*1024){L.ElMessage.warning(`文件 ${h.name} 超过50MB,已跳过`);continue}const U=URL.createObjectURL(h);X.value.push({id:Date.now()+Math.random(),file:h,name:h.name,size:h.size,type:h.type,previewUrl:U,isImage:h.type.startsWith("image/")})}}}},ze=p=>{if(!p){L.ElMessage.warning("文件地址无效");return}window.open(p,"_blank")},je=p=>{console.warn("图片加载失败",p)},Oe=p=>{const r=p.target.files[0];if(!r)return;if(!r.type.startsWith("image/")){L.ElMessage.error("只能上传图片文件");return}if(r.size>5*1024*1024){L.ElMessage.error("图片大小不能超过 5MB");return}const c=new FileReader;c.onload=a=>{b.value=a.target.result,n.value=!0},c.readAsDataURL(r)},Pe=async({file:p})=>{if(p){i.value=!0;try{const{ChatApi:r}=await Promise.resolve().then(()=>tt),a=await new r(s.config).uploadAvatar(p,_);a.code===200?(L.ElMessage.success("头像上传成功"),P(a.data),De()):L.ElMessage.error(a.msg||"头像上传失败")}catch(r){console.error(r),L.ElMessage.error("头像上传失败")}finally{i.value=!1}}},De=()=>{b.value="",n.value=!1,f.value&&(f.value.value="")},Ge=()=>{I.value={nickname:M.value.nickname||"",email:M.value.email||"",phone:M.value.phone||"",bio:M.value.bio||""},Z.value=!0},Je=()=>{Z.value=!1,I.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{v.value=!0;try{await ne(I.value)?(L.ElMessage.success("保存成功"),Z.value=!1):L.ElMessage.error("保存失败")}catch(p){console.error(p),L.ElMessage.error("保存失败")}finally{v.value=!1}};return e.onMounted(async()=>{await Promise.all([we(),R()]),B(),m.value.length>0&&Ne(m.value[0]),d("init"),document.addEventListener("click",Ee)}),e.onUnmounted(()=>{W(),z(),document.removeEventListener("click",Ee)}),(p,r)=>{var ce,xe,Ce;const c=e.resolveComponent("el-icon"),a=e.resolveComponent("el-input"),h=e.resolveComponent("el-empty"),U=e.resolveComponent("el-button"),ee=e.resolveComponent("el-dialog");return e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("div",ht,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:He},[e.createElementVNode("img",{src:e.unref(K),alt:"头像",class:"sidebar-avatar-img"},null,8,gt)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["sidebar-nav-item",O.value===l.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:le=>O.value=l.id},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.icon)))]),_:2},1024),l.badge?(e.openBlock(),e.createElementBlock("span",yt,e.toDisplayString(l.badge>99?"99+":l.badge),1)):e.createCommentVNode("",!0)],10,ut))),128)),r[13]||(r[13]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),y.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"sidebar-nav-item sidebar-nav-item-inactive",onClick:r[0]||(r[0]=l=>ge.value=!0),title:"设置"},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",kt,[e.createElementVNode("div",_t,[e.createVNode(a,{modelValue:e.unref(C),"onUpdate:modelValue":r[1]||(r[1]=l=>e.isRef(C)?C.value=l:null),placeholder:"搜索","prefix-icon":e.unref(V.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",Vt,[O.value==="chat"?(e.openBlock(),e.createElementBlock("div",Et,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(m),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["chat-list-item",G.value===l.id?"chat-list-item-active":""]),onClick:le=>Ne(l),onContextmenu:e.withModifiers(le=>pe(le,l),["prevent","stop"])},[e.createElementVNode("div",Ct,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"chat-list-avatar"},null,8,bt),l.online?(e.openBlock(),e.createElementBlock("span",wt)):e.createCommentVNode("",!0)]),e.createElementVNode("div",xt,[e.createElementVNode("div",Bt,[e.createElementVNode("span",St,e.toDisplayString(l.name),1),e.createElementVNode("span",Ut,e.toDisplayString(e.unref(_e)(l.lastTime)),1)]),e.createElementVNode("div",zt,[e.createElementVNode("span",$t,e.toDisplayString(l.lastMsg),1),l.unread>0?(e.openBlock(),e.createElementBlock("span",Ft,e.toDisplayString(l.unread>99?"99+":l.unread),1)):e.createCommentVNode("",!0)])])],42,Nt))),128))])):e.createCommentVNode("",!0),O.value==="friends"&&y.config.modules.friends?(e.openBlock(),e.createElementBlock("div",Mt,[e.createElementVNode("div",Dt,[e.createElementVNode("div",{class:"add-friend-btn",onClick:r[2]||(r[2]=(...l)=>e.unref(H)&&e.unref(H)(...l))},[e.createElementVNode("div",At,[e.createVNode(c,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Plus))]),_:1})]),r[14]||(r[14]=e.createElementVNode("span",{class:"add-friend-text"},"添加好友",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(se),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"chat-list-item",onClick:le=>Le(l)},[e.createElementVNode("div",Tt,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"chat-list-avatar"},null,8,It),e.createElementVNode("span",{class:e.normalizeClass(["chat-list-online-indicator",l.online?"chat-list-online":"chat-list-offline"])},null,2)]),e.createElementVNode("div",Lt,[e.createElementVNode("span",Wt,e.toDisplayString(l.name),1)])],8,Rt))),128))])):e.createCommentVNode("",!0),O.value==="apply"&&y.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Ht,[e.unref(he)?(e.openBlock(),e.createBlock(h,{key:0,description:"加载中..."})):e.unref(me).length===0?(e.openBlock(),e.createBlock(h,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(me),l=>(e.openBlock(),e.createElementBlock("div",{key:l.applyUser||l.id,class:"friend-request-item"},[e.createElementVNode("div",Xt,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.applyUser}`,alt:l.applyUser,class:"friend-request-avatar"},null,8,Yt),e.createElementVNode("div",qt,[e.createElementVNode("div",Kt,e.toDisplayString(l.applyUser),1),r[15]||(r[15]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(U,{type:"primary",size:"small",onClick:le=>e.unref(j)(l.applyUser)},{default:e.withCtx(()=>[...r[16]||(r[16]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",jt,[F.value&&!$.value?(e.openBlock(),e.createElementBlock("div",Ot,[e.createElementVNode("img",{src:F.value.avatar,alt:F.value.name,class:"profile-avatar"},null,8,Pt),e.createElementVNode("div",Gt,e.toDisplayString(F.value.name),1),e.createElementVNode("div",Jt,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",F.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(F.value.online?"在线":"离线"),1)]),e.createVNode(U,{type:"primary",size:"large",onClick:We,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),r[17]||(r[17]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),$.value?(e.openBlock(),e.createElementBlock("div",Qt,[e.createElementVNode("div",Zt,[e.createElementVNode("div",vt,[e.createElementVNode("span",ea,e.toDisplayString($.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["chat-window-status",$.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString($.value.online?"在线":"离线"),3)]),e.createElementVNode("div",ta,[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:r[3]||(r[3]=l=>J.value=!J.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(re),(l,le)=>(e.openBlock(),e.createElementBlock("div",{key:le,class:e.normalizeClass(["message-wrapper",l.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",aa,[e.createElementVNode("img",{src:l.isSelf?e.unref(K):$.value.avatar,class:"message-avatar-img"},null,8,sa)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content",l.isSelf?"message-content-self":"message-content-other"])},[l.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",na,e.toDisplayString($.value.name),1)),e.createElementVNode("div",oa,[l.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",l.isSelf?"message-bubble-self":"message-bubble-other"])},e.toDisplayString(l.text),3)):l.type==="file"&&l.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","message-image-bubble",l.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:o=>ze(l.fileUrl)},[e.createElementVNode("img",{src:l.fileUrl,alt:l.fileName,class:"message-image",onError:je},null,40,ra),l.fileSize?(e.openBlock(),e.createElementBlock("div",ia,e.toDisplayString(Se(l.fileSize)),1)):e.createCommentVNode("",!0)],10,la)):l.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","message-file-bubble",l.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:o=>ze(l.fileUrl)},[e.createElementVNode("div",da,[e.createElementVNode("div",ma,[e.createVNode(c,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Document))]),_:1})]),e.createElementVNode("div",pa,[e.createElementVNode("div",fa,e.toDisplayString(l.fileName||l.text),1),e.createElementVNode("div",ha,[e.createVNode(c,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Download))]),_:1}),r[18]||(r[18]=e.createElementVNode("span",null,"点击下载",-1)),l.fileSize?(e.openBlock(),e.createElementBlock("span",ga,"· "+e.toDisplayString(Se(l.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,ca)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",l.isSelf?"message-time-right":"message-time-left"])},e.toDisplayString(e.unref(ke)(l.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",ua,[X.value.length>0?(e.openBlock(),e.createElementBlock("div",ya,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(X.value,(l,le)=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"pending-file-item"},[l.isImage?(e.openBlock(),e.createElementBlock("div",ka,[e.createElementVNode("img",{src:l.previewUrl,alt:l.name,class:"pending-image"},null,8,_a),e.createElementVNode("button",{onClick:o=>Be(le),class:"pending-file-remove-btn"}," × ",8,Va)])):(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(c,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createElementVNode("span",Na,e.toDisplayString(l.name),1),e.createElementVNode("button",{onClick:o=>Be(le),class:"pending-file-remove-btn"}," × ",8,Ca)]))]))),128))])):e.createCommentVNode("",!0),y.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",ba,[e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon",onClick:Ye},{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",wa,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":r[4]||(r[4]=l=>e.isRef(k)?k.value=l:null),onKeydown:e.withKeys(e.withModifiers(Ue,["prevent"]),["enter"]),onPaste:Ke,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,xa),[[e.vModelText,e.unref(k)]])]),e.createElementVNode("div",Ba,[e.createVNode(U,{type:"primary",disabled:!e.unref(k).trim()&&X.value.length===0,onClick:Ue,class:"send-message-btn"},{default:e.withCtx(()=>[...r[19]||(r[19]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:ie,type:"file",multiple:"",class:"hidden-file-input",onChange:qe},null,544)])])):F.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Sa,[e.createVNode(c,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatLineRound))]),_:1}),e.createElementVNode("div",Ua,e.toDisplayString(O.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),J.value?(e.openBlock(),e.createElementBlock("div",za,[r[21]||(r[21]=e.createElementVNode("div",{class:"chat-detail-header"},"聊天详情",-1)),e.createElementVNode("div",$a,[e.createElementVNode("div",Fa,[e.createElementVNode("img",{src:(ce=$.value)==null?void 0:ce.avatar,alt:(xe=$.value)==null?void 0:xe.name,class:"chat-detail-avatar"},null,8,Ma),e.createElementVNode("div",Da,e.toDisplayString((Ce=$.value)==null?void 0:Ce.name),1),r[20]||(r[20]=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(ee,{modelValue:e.unref(u),"onUpdate:modelValue":r[6]||(r[6]=l=>e.isRef(u)?u.value=l:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Aa,[e.createVNode(a,{modelValue:e.unref(oe),"onUpdate:modelValue":r[5]||(r[5]=l=>e.isRef(oe)?oe.value=l:null),placeholder:"搜索用户","prefix-icon":e.unref(V.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",Ra,[e.unref(ye)?(e.openBlock(),e.createBlock(h,{key:0,description:"加载中..."})):e.unref(te).length===0?(e.openBlock(),e.createBlock(h,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(te),l=>(e.openBlock(),e.createElementBlock("div",{key:l.username,class:"add-friend-user-item"},[e.createElementVNode("div",Ta,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.username}`,alt:l.username,class:"add-friend-user-avatar"},null,8,Ia),e.createElementVNode("div",La,e.toDisplayString(l.username),1)]),e.createVNode(U,{type:"primary",size:"small",onClick:le=>e.unref(S)(l)},{default:e.withCtx(()=>[...r[22]||(r[22]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(ee,{modelValue:ge.value,"onUpdate:modelValue":r[11]||(r[11]=l=>ge.value=l),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"chat-settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",Wa,[e.createElementVNode("div",Ha,[e.createElementVNode("div",Xa,[e.createElementVNode("img",{src:e.unref(K),alt:"头像",class:"chat-settings-avatar"},null,8,Ya),y.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:Xe},[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:f,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Oe},null,544)]),e.createElementVNode("div",qa,[e.createElementVNode("div",Ka,e.toDisplayString(e.unref(M).nickname||e.unref(_)),1),e.createElementVNode("div",ja,"@"+e.toDisplayString(e.unref(_)),1)])]),e.createElementVNode("div",Oa,[e.createElementVNode("div",Pa,[e.createElementVNode("div",Ga,[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.UserFilled))]),_:1}),r[23]||(r[23]=e.createTextVNode(" 个人信息 ",-1))]),Z.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(U,{key:0,type:"primary",size:"small",onClick:Ge,class:"chat-settings-edit-btn"},{default:e.withCtx(()=>[...r[24]||(r[24]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",Ja,[e.createElementVNode("div",Qa,[r[25]||(r[25]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),Z.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:I.value.nickname,"onUpdate:modelValue":r[7]||(r[7]=l=>I.value.nickname=l),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Za,e.toDisplayString(e.unref(M).nickname||"未设置"),1))]),e.createElementVNode("div",va,[r[26]||(r[26]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),Z.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:I.value.email,"onUpdate:modelValue":r[8]||(r[8]=l=>I.value.email=l),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",es,e.toDisplayString(e.unref(M).email||"未设置"),1))]),e.createElementVNode("div",ts,[r[27]||(r[27]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),Z.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:I.value.phone,"onUpdate:modelValue":r[9]||(r[9]=l=>I.value.phone=l),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",as,e.toDisplayString(e.unref(M).phone||"未设置"),1))]),e.createElementVNode("div",ss,[r[28]||(r[28]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),Z.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:I.value.bio,"onUpdate:modelValue":r[10]||(r[10]=l=>I.value.bio=l),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ns,e.toDisplayString(e.unref(M).bio||"这个人很懒,什么都没写~"),1))]),Z.value?(e.openBlock(),e.createElementBlock("div",os,[e.createVNode(U,{size:"default",onClick:Je},{default:e.withCtx(()=>[...r[29]||(r[29]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(U,{type:"primary",size:"default",loading:v.value,onClick:Qe},{default:e.withCtx(()=>[...r[30]||(r[30]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Me,{modelValue:n.value,"onUpdate:modelValue":r[12]||(r[12]=l=>n.value=l),src:b.value,onConfirm:Pe},null,8,["modelValue","src"]),Y.value.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-context-menu",style:e.normalizeStyle({left:Y.value.x+"px",top:Y.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Ie},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-c08932e1"]]),ls={class:"chat-container"},rs={class:"sidebar-nav"},is=["src"],cs=["onClick"],ds={key:0,class:"nav-badge"},ms={class:"content-panel"},ps={class:"search-bar"},fs={class:"content-scroll"},hs={key:0},gs=["onClick","onContextmenu"],us={class:"friend-avatar-wrapper"},ys=["src","alt"],ks={key:0,class:"online-indicator"},_s={class:"friend-info"},Vs={class:"friend-header"},Es={class:"friend-name"},Ns={class:"last-time"},Cs={class:"friend-preview"},bs={class:"last-msg"},ws={key:0,class:"unread-badge"},xs={key:1},Bs={class:"add-friend-section"},Ss={class:"add-friend-icon"},Us=["onClick"],zs={class:"friend-avatar-wrapper"},$s=["src","alt"],Fs={class:"friend-info"},Ms={class:"friend-name"},Ds={key:2},As={class:"request-info"},Rs=["src","alt"],Ts={class:"request-details"},Is={class:"request-username"},Ls={class:"chat-area"},Ws={key:0,class:"friend-profile"},Hs=["src","alt"],Xs={class:"profile-name"},Ys={class:"profile-status"},qs={key:1,class:"chat-window"},Ks={class:"chat-header"},js={class:"chat-title"},Os={class:"chat-name"},Ps={class:"chat-actions"},Gs={class:"message-avatar"},Js=["src"],Qs={key:0,class:"sender-name"},Zs={class:"message-bubble-wrapper"},vs=["onClick"],en=["src","alt"],tn={key:0,class:"image-size"},an=["onClick"],sn={class:"file-content"},nn={class:"file-icon"},on={class:"file-info"},ln={class:"file-name"},rn={class:"file-meta"},cn={key:0},dn={class:"input-area"},mn={key:0,class:"pending-files"},pn={key:0,class:"pending-image-wrapper"},fn=["src","alt"],hn=["onClick"],gn={key:1,class:"pending-file-wrapper"},un={class:"pending-file-name"},yn=["onClick"],kn={key:1,class:"input-actions"},_n={class:"input-wrapper"},Vn=["onKeydown"],En={class:"send-btn-wrapper"},Nn={key:2,class:"empty-state"},Cn={class:"empty-text"},bn={key:0,class:"detail-panel"},wn={class:"detail-content"},xn={class:"detail-profile"},Bn=["src","alt"],Sn={class:"detail-name"},Un={class:"search-users-wrapper"},zn={class:"search-users-input"},$n={class:"users-list-scroll"},Fn={class:"available-user-info"},Mn=["src","alt"],Dn={class:"available-user-name"},An={class:"settings-container"},Rn={class:"settings-avatar-section"},Tn={class:"settings-avatar-wrapper"},In=["src"],Ln={class:"settings-user-display"},Wn={class:"settings-nickname"},Hn={class:"settings-username"},Xn={class:"settings-form-section"},Yn={class:"settings-form-header"},qn={class:"settings-form-title"},Kn={class:"settings-form"},jn={class:"settings-form-item"},On={key:1,class:"settings-form-value"},Pn={class:"settings-form-item"},Gn={key:1,class:"settings-form-value"},Jn={class:"settings-form-item"},Qn={key:1,class:"settings-form-value"},Zn={class:"settings-form-item"},vn={key:1,class:"settings-form-value bio-value"},eo={key:0,class:"settings-form-actions"},st=Te({__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(y,{emit:t}){const s=y,d=t,_=e.computed({get:()=>s.modelValue,set:c=>d("update:modelValue",c)}),{myUsername:K,myAvatar:M,userInfo:q,loadingUserInfo:D,friendList:se,filteredFriendList:C,searchText:k,inputText:N,messagesContainer:m,filteredUsers:te,filteredAvailableUsers:ue,currentUser:re,currentMessages:u,addFriendDialogVisible:oe,addFriendSearchText:de,availableUsers:ye,loadingAvailableUsers:me,friendApplyList:he,loadingFriendApply:ke,formatTime:_e,formatLastTime:be,scrollToBottom:we,getFriendList:Ve,getChatHistory:g,setFriendToChatStatus:E,selectUser:A,sendMessage:w,sendFile:x,sendFilesAndText:B,initWebSocket:z,closeWebSocket:W,reset:H,openAddFriendDialog:S,addFriend:R,loadFriendApplyList:j,agreeFriend:P,updateMyAvatar:ae,getUserInfo:ne,updateUserInfo:T}=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=he.value)==null?void 0:a.length)||0}),c}),G=e.ref("chat"),$=e.ref(null),F=e.ref(null),J=e.ref(null),Z=e.ref(!1),I=e.ref(!1),v=e.ref({nickname:"",email:"",phone:"",bio:""}),ge=e.ref(!1),n=e.ref(!1),i=e.ref(!1),f=e.ref(!1),b=e.ref(null),ie=e.ref(""),X=e.ref(null),Y=e.ref([]),pe=e.ref({visible:!1,x:0,y:0,chat:null}),Ee=()=>{pe.value.visible=!1},Ie=async()=>{if(!pe.value.chat)return;await E(pe.value.chat.id,0)&&$.value===pe.value.chat.id&&($.value=null,F.value=null),Ee()},Ne=c=>{$.value=c.id,F.value=c,J.value=null,Z.value=!1,A({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},Le=c=>{J.value=c,$.value=null,F.value=null},We=async()=>{if(!J.value)return;if(await E(J.value.id)){G.value="chat",await e.nextTick();const a=te.value.find(h=>h.id===J.value.id);a&&Ne(a),J.value=null}},He=()=>{n.value=!0},Xe=()=>{var c;(c=b.value)==null||c.click()},Ye=()=>{var c;(c=X.value)==null||c.click()},qe=c=>{const a=Array.from(c.target.files||[]);if(a.length!==0){for(const h of a){if(h.size>50*1024*1024){L.ElMessage.warning(`文件 ${h.name} 超过50MB,已跳过`);continue}const U=URL.createObjectURL(h);Y.value.push({id:Date.now()+Math.random(),file:h,name:h.name,size:h.size,type:h.type,previewUrl:U,isImage:h.type.startsWith("image/")})}X.value&&(X.value.value="")}},Be=c=>{const a=Y.value[c];a.previewUrl&&URL.revokeObjectURL(a.previewUrl),Y.value.splice(c,1)},Se=c=>{if(c===0)return"0 B";const a=1024,h=["B","KB","MB","GB"],U=Math.floor(Math.log(c)/Math.log(a));return parseFloat((c/Math.pow(a,U)).toFixed(2))+" "+h[U]},Ue=async()=>{if(!N.value.trim()&&Y.value.length===0)return;const c=[...Y.value],a=N.value;N.value="",Y.value.forEach(h=>{h.previewUrl&&URL.revokeObjectURL(h.previewUrl)}),Y.value=[],await B(c,a),d("send",{text:a,files:c})},Ke=c=>{var h;const a=(h=c.clipboardData)==null?void 0:h.items;if(a){for(const U of a)if(U.kind==="file"){const ee=U.getAsFile();if(ee){if(ee.size>50*1024*1024){L.ElMessage.warning(`文件 ${ee.name} 超过50MB,已跳过`);continue}const ce=URL.createObjectURL(ee);Y.value.push({id:Date.now()+Math.random(),file:ee,name:ee.name,size:ee.size,type:ee.type,previewUrl:ce,isImage:ee.type.startsWith("image/")})}}}},ze=c=>{if(!c){L.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},je=c=>{console.warn("图片加载失败",c)},Oe=c=>{const a=c.target.files[0];if(!a)return;if(!a.type.startsWith("image/")){L.ElMessage.error("只能上传图片文件");return}if(a.size>5*1024*1024){L.ElMessage.error("图片大小不能超过 5MB");return}const h=new FileReader;h.onload=U=>{ie.value=U.target.result,i.value=!0},h.readAsDataURL(a)},Pe=async({file:c})=>{if(c){f.value=!0;try{const{ChatApi:a}=await Promise.resolve().then(()=>tt),U=await new a(s.config).uploadAvatar(c,K);U.code===200?(L.ElMessage.success("头像上传成功"),ae(U.data),De()):L.ElMessage.error(U.msg||"头像上传失败")}catch(a){console.error(a),L.ElMessage.error("头像上传失败")}finally{f.value=!1}}},De=()=>{ie.value="",i.value=!1,b.value&&(b.value.value="")},Ge=()=>{v.value={nickname:q.value.nickname||"",email:q.value.email||"",phone:q.value.phone||"",bio:q.value.bio||""},I.value=!0},Je=()=>{I.value=!1,v.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{ge.value=!0;try{await T(v.value)?(L.ElMessage.success("保存成功"),I.value=!1):L.ElMessage.error("保存失败")}catch(c){console.error(c),L.ElMessage.error("保存失败")}finally{ge.value=!1}},p=()=>{H(),W(),Z.value=!1,n.value=!1,De(),I.value=!1,d("close")},r=async()=>{await Promise.all([Ve(),j(),ne()]),z(),te.value.length>0&&Ne(te.value[0]),d("open")};return e.onMounted(()=>{document.addEventListener("click",Ee)}),e.onUnmounted(()=>{document.removeEventListener("click",Ee),W()}),(c,a)=>{const h=e.resolveComponent("el-icon"),U=e.resolveComponent("el-input"),ee=e.resolveComponent("el-empty"),ce=e.resolveComponent("el-button"),xe=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(xe,{modelValue:_.value,"onUpdate:modelValue":a[13]||(a[13]=Ce=>_.value=Ce),width:y.width,"close-on-click-modal":!1,class:"chat-dialog","append-to-body":"",onClosed:p,onOpen:r},{default:e.withCtx(()=>{var Ce,l,le;return[e.createElementVNode("div",ls,[e.createElementVNode("div",rs,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:He},[e.createElementVNode("img",{src:e.unref(M),alt:"头像",class:"avatar-img"},null,8,is)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.value,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["nav-item",G.value===o.id?"nav-item-active":"nav-item-inactive"]),onClick:fe=>G.value=o.id},[e.createVNode(h,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.icon)))]),_:2},1024),o.badge?(e.openBlock(),e.createElementBlock("span",ds,e.toDisplayString(o.badge>99?"99+":o.badge),1)):e.createCommentVNode("",!0)],10,cs))),128)),a[14]||(a[14]=e.createElementVNode("div",{class:"nav-spacer"},null,-1)),y.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"nav-item nav-item-inactive",onClick:a[0]||(a[0]=o=>n.value=!0),title:"设置"},[e.createVNode(h,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",ms,[e.createElementVNode("div",ps,[e.createVNode(U,{modelValue:e.unref(k),"onUpdate:modelValue":a[1]||(a[1]=o=>e.isRef(k)?k.value=o:null),placeholder:"搜索","prefix-icon":e.unref(V.Search)},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",fs,[G.value==="chat"?(e.openBlock(),e.createElementBlock("div",hs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(te),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["chat-item",$.value===o.id?"chat-item-active":""]),onClick:fe=>Ne(o),onContextmenu:e.withModifiers(fe=>c.showContextMenu(fe,o),["prevent","stop"])},[e.createElementVNode("div",us,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"friend-avatar"},null,8,ys),o.online?(e.openBlock(),e.createElementBlock("span",ks)):e.createCommentVNode("",!0)]),e.createElementVNode("div",_s,[e.createElementVNode("div",Vs,[e.createElementVNode("span",Es,e.toDisplayString(o.name),1),e.createElementVNode("span",Ns,e.toDisplayString(e.unref(be)(o.lastTime)),1)]),e.createElementVNode("div",Cs,[e.createElementVNode("span",bs,e.toDisplayString(o.lastMsg),1),o.unread>0?(e.openBlock(),e.createElementBlock("span",ws,e.toDisplayString(o.unread>99?"99+":o.unread),1)):e.createCommentVNode("",!0)])])],42,gs))),128))])):e.createCommentVNode("",!0),G.value==="friends"&&y.config.modules.friends?(e.openBlock(),e.createElementBlock("div",xs,[e.createElementVNode("div",Bs,[e.createElementVNode("div",{class:"add-friend-btn",onClick:a[2]||(a[2]=(...o)=>e.unref(S)&&e.unref(S)(...o))},[e.createElementVNode("div",Ss,[e.createVNode(h,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Plus))]),_:1})]),a[15]||(a[15]=e.createElementVNode("span",{class:"add-friend-text"},"添加好友",-1))])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(C),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"chat-item",onClick:fe=>Le(o)},[e.createElementVNode("div",zs,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"friend-avatar"},null,8,$s),e.createElementVNode("span",{class:e.normalizeClass(["online-indicator",o.online?"online":"offline"])},null,2)]),e.createElementVNode("div",Fs,[e.createElementVNode("span",Ms,e.toDisplayString(o.name),1)])],8,Us))),128))])):e.createCommentVNode("",!0),G.value==="apply"&&y.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Ds,[e.unref(ke)?(e.openBlock(),e.createBlock(ee,{key:0,description:"加载中..."})):e.unref(he).length===0?(e.openBlock(),e.createBlock(ee,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(he),o=>(e.openBlock(),e.createElementBlock("div",{key:o.applyUser||o.id,class:"friend-request-item"},[e.createElementVNode("div",As,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.applyUser}`,alt:o.applyUser,class:"request-avatar"},null,8,Rs),e.createElementVNode("div",Ts,[e.createElementVNode("div",Is,e.toDisplayString(o.applyUser),1),a[16]||(a[16]=e.createElementVNode("div",{class:"request-desc"},"请求添加你为好友",-1))])]),e.createVNode(ce,{type:"primary",size:"small",onClick:fe=>e.unref(P)(o.applyUser)},{default:e.withCtx(()=>[...a[17]||(a[17]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ls,[J.value&&!F.value?(e.openBlock(),e.createElementBlock("div",Ws,[e.createElementVNode("img",{src:J.value.avatar,alt:J.value.name,class:"profile-avatar"},null,8,Hs),e.createElementVNode("div",Xs,e.toDisplayString(J.value.name),1),e.createElementVNode("div",Ys,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",J.value.online?"status-online":"status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(J.value.online?"在线":"离线"),1)]),e.createVNode(ce,{type:"primary",size:"large",onClick:We,class:"start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),a[18]||(a[18]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),F.value?(e.openBlock(),e.createElementBlock("div",qs,[e.createElementVNode("div",Ks,[e.createElementVNode("div",js,[e.createElementVNode("span",Os,e.toDisplayString(F.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["status-badge",F.value.online?"status-badge-online":"status-badge-offline"])},e.toDisplayString(F.value.online?"在线":"离线"),3)]),e.createElementVNode("div",Ps,[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]=o=>Z.value=!Z.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(V.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:m,class:"messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(u),(o,fe)=>(e.openBlock(),e.createElementBlock("div",{key:fe,class:e.normalizeClass(["message-wrapper",o.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",Gs,[e.createElementVNode("img",{src:o.isSelf?e.unref(M):F.value.avatar,class:"avatar-sm"},null,8,Js)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content-wrapper",o.isSelf?"content-self":"content-other"])},[o.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Qs,e.toDisplayString(F.value.name),1)),e.createElementVNode("div",Zs,[o.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",o.isSelf?"bubble-self":"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","image-bubble",o.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>ze(o.fileUrl)},[e.createElementVNode("img",{src:o.fileUrl,alt:o.fileName,class:"message-image",onError:je},null,40,en),o.fileSize?(e.openBlock(),e.createElementBlock("div",tn,e.toDisplayString(Se(o.fileSize)),1)):e.createCommentVNode("",!0)],10,vs)):o.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","file-bubble",o.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>ze(o.fileUrl)},[e.createElementVNode("div",sn,[e.createElementVNode("div",nn,[e.createVNode(h,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Document))]),_:1})]),e.createElementVNode("div",on,[e.createElementVNode("div",ln,e.toDisplayString(o.fileName||o.text),1),e.createElementVNode("div",rn,[e.createVNode(h,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Download))]),_:1}),a[19]||(a[19]=e.createElementVNode("span",null,"点击下载",-1)),o.fileSize?(e.openBlock(),e.createElementBlock("span",cn,"· "+e.toDisplayString(Se(o.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,an)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",o.isSelf?"time-right":"time-left"])},e.toDisplayString(e.unref(_e)(o.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",dn,[Y.value.length>0?(e.openBlock(),e.createElementBlock("div",mn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Y.value,(o,fe)=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"pending-file"},[o.isImage?(e.openBlock(),e.createElementBlock("div",pn,[e.createElementVNode("img",{src:o.previewUrl,alt:o.name,class:"pending-image"},null,8,fn),e.createElementVNode("button",{onClick:Ze=>Be(fe),class:"remove-file-btn"}," × ",8,hn)])):(e.openBlock(),e.createElementBlock("div",gn,[e.createVNode(h,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.Folder))]),_:1}),e.createElementVNode("span",un,e.toDisplayString(o.name),1),e.createElementVNode("button",{onClick:Ze=>Be(fe),class:"remove-file-btn"}," × ",8,yn)]))]))),128))])):e.createCommentVNode("",!0),y.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",kn,[e.createVNode(h,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatDotRound))]),_:1}),e.createVNode(h,{class:"action-icon",onClick:Ye},{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",_n,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":a[4]||(a[4]=o=>e.isRef(N)?N.value=o:null),onKeydown:e.withKeys(e.withModifiers(Ue,["prevent"]),["enter"]),onPaste:Ke,placeholder:"输入消息或粘贴文件...",class:"message-input",rows:"3"},null,40,Vn),[[e.vModelText,e.unref(N)]])]),e.createElementVNode("div",En,[e.createVNode(ce,{type:"primary",disabled:!e.unref(N).trim()&&Y.value.length===0,onClick:Ue,class:"send-btn"},{default:e.withCtx(()=>[...a[20]||(a[20]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:X,type:"file",multiple:"",class:"hidden-file-input",onChange:qe},null,544)])])):J.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Nn,[e.createVNode(h,{size:64,class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.ChatLineRound))]),_:1}),e.createElementVNode("div",Cn,e.toDisplayString(G.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),Z.value?(e.openBlock(),e.createElementBlock("div",bn,[a[22]||(a[22]=e.createElementVNode("div",{class:"detail-header"},"聊天详情",-1)),e.createElementVNode("div",wn,[e.createElementVNode("div",xn,[e.createElementVNode("img",{src:(Ce=F.value)==null?void 0:Ce.avatar,alt:(l=F.value)==null?void 0:l.name,class:"detail-avatar"},null,8,Bn),e.createElementVNode("div",Sn,e.toDisplayString((le=F.value)==null?void 0:le.name),1),a[21]||(a[21]=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(xe,{modelValue:e.unref(oe),"onUpdate:modelValue":a[6]||(a[6]=o=>e.isRef(oe)?oe.value=o:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Un,[e.createElementVNode("div",zn,[e.createVNode(U,{modelValue:e.unref(de),"onUpdate:modelValue":a[5]||(a[5]=o=>e.isRef(de)?de.value=o:null),placeholder:"搜索用户","prefix-icon":e.unref(V.Search)},null,8,["modelValue","prefix-icon"])])]),e.createElementVNode("div",$n,[e.unref(me)?(e.openBlock(),e.createBlock(ee,{key:0,description:"加载中..."})):e.unref(ue).length===0?(e.openBlock(),e.createBlock(ee,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(ue),o=>(e.openBlock(),e.createElementBlock("div",{key:o.username,class:"available-user-item"},[e.createElementVNode("div",Fn,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.username}`,alt:o.username,class:"available-user-avatar"},null,8,Mn),e.createElementVNode("div",Dn,e.toDisplayString(o.username),1)]),e.createVNode(ce,{type:"primary",size:"small",onClick:fe=>e.unref(R)(o)},{default:e.withCtx(()=>[...a[23]||(a[23]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(xe,{modelValue:n.value,"onUpdate:modelValue":a[11]||(a[11]=o=>n.value=o),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",An,[e.createElementVNode("div",Rn,[e.createElementVNode("div",Tn,[e.createElementVNode("img",{src:e.unref(M),alt:"头像",class:"settings-avatar"},null,8,In),y.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"settings-avatar-edit",onClick:Xe},[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:b,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Oe},null,544)]),e.createElementVNode("div",Ln,[e.createElementVNode("div",Wn,e.toDisplayString(e.unref(q).nickname||e.unref(K)),1),e.createElementVNode("div",Hn,"@"+e.toDisplayString(e.unref(K)),1)])]),e.createElementVNode("div",Xn,[e.createElementVNode("div",Yn,[e.createElementVNode("div",qn,[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(V.UserFilled))]),_:1}),a[24]||(a[24]=e.createTextVNode(" 个人信息 ",-1))]),I.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(ce,{key:0,type:"primary",size:"small",onClick:Ge,class:"settings-edit-btn"},{default:e.withCtx(()=>[...a[25]||(a[25]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",Kn,[e.createElementVNode("div",jn,[a[26]||(a[26]=e.createElementVNode("label",{class:"settings-form-label"},"昵称",-1)),I.value?(e.openBlock(),e.createBlock(U,{key:0,modelValue:v.value.nickname,"onUpdate:modelValue":a[7]||(a[7]=o=>v.value.nickname=o),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",On,e.toDisplayString(e.unref(q).nickname||"未设置"),1))]),e.createElementVNode("div",Pn,[a[27]||(a[27]=e.createElementVNode("label",{class:"settings-form-label"},"邮箱",-1)),I.value?(e.openBlock(),e.createBlock(U,{key:0,modelValue:v.value.email,"onUpdate:modelValue":a[8]||(a[8]=o=>v.value.email=o),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Gn,e.toDisplayString(e.unref(q).email||"未设置"),1))]),e.createElementVNode("div",Jn,[a[28]||(a[28]=e.createElementVNode("label",{class:"settings-form-label"},"手机号",-1)),I.value?(e.openBlock(),e.createBlock(U,{key:0,modelValue:v.value.phone,"onUpdate:modelValue":a[9]||(a[9]=o=>v.value.phone=o),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Qn,e.toDisplayString(e.unref(q).phone||"未设置"),1))]),e.createElementVNode("div",Zn,[a[29]||(a[29]=e.createElementVNode("label",{class:"settings-form-label"},"个人简介",-1)),I.value?(e.openBlock(),e.createBlock(U,{key:0,modelValue:v.value.bio,"onUpdate:modelValue":a[10]||(a[10]=o=>v.value.bio=o),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",vn,e.toDisplayString(e.unref(q).bio||"这个人很懒,什么都没写~"),1))]),I.value?(e.openBlock(),e.createElementBlock("div",eo,[e.createVNode(ce,{size:"default",onClick:Je},{default:e.withCtx(()=>[...a[30]||(a[30]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(ce,{type:"primary",size:"default",loading:ge.value,onClick:Qe},{default:e.withCtx(()=>[...a[31]||(a[31]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Me,{modelValue:i.value,"onUpdate:modelValue":a[12]||(a[12]=o=>i.value=o),src:ie.value,onConfirm:Pe},null,8,["modelValue","src"]),pe.value.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"context-menu",style:e.normalizeStyle({left:pe.value.x+"px",top:pe.value.y+"px"})},[e.createElementVNode("div",{class:"context-menu-item",onClick:Ie},"删除聊天")],4)):e.createCommentVNode("",!0)]}),_:1},8,["modelValue","width"])}}},[["__scopeId","data-v-a76a4ef3"]]),to={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",getUserInfo:"/user/info",updateUserInfo:"/user/info",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 ao(y={}){const t=nt(to,y);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 nt(y,t){const s={...y};for(const d in t)t[d]&&typeof t[d]=="object"&&!Array.isArray(t[d])?s[d]=nt(y[d]||{},t[d]):s[d]=t[d];return s}const ot={install(y){y.component("ChatPanel",at),y.component("ChatWindow",st),y.component("AvatarCrop",Me)}};Q.AvatarCrop=Me,Q.ChatApi=Fe,Q.ChatPanel=at,Q.ChatWebSocket=ve,Q.ChatWindow=st,Q.HttpClient=et,Q.VueChatKit=ot,Q.createChatConfig=ao,Q.default=ot,Q.useChat=Re,Object.defineProperties(Q,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(v,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):(v=typeof globalThis<"u"?globalThis:v||self,e(v.VueChatKit={},v.Vue,v.ElementPlusIconsVue,v.dayjs,v.ElementPlus))})(this,function(v,e,B,Ke,x){"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,o="text",f="",T="",S=0,X=!1){if(this.isConnected()){const C=JSON.stringify(X?{toGroupId:a,msg:s,type:o,fileUrl:f,fileName:T,fileSize:S}:{to:a,msg:s,type:o,fileUrl:f,fileName:T,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 o=this.handlers[a].indexOf(s);o>-1&&this.handlers[a].splice(o,1)}}emit(a,...s){this.handlers[a]&&this.handlers[a].forEach(o=>o(...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 Ue extends Error{constructor(a,s,o,f){super(a),this.name="RequestError",this.status=s||0,this.code=o||0,this.data=f}}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,o)=>{setTimeout(()=>{o(new Ue("请求超时",408,408))},a)})}async request(a,s={}){const{method:o="GET",headers:f={},body:T,params:S}=s;let X=a.startsWith("http")?a:`${this.baseUrl}${a}`,C={method:o,headers:{...this.headers,...f},body:T,params:S};this.requestInterceptors.forEach(V=>{C=V(C)});const d={method:C.method,headers:C.headers,credentials:"include"};if(C.body&&o!=="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 $ in C.params)C.params[$]!==void 0&&C.params[$]!==null&&C.params[$]!==""&&V.append($,C.params[$]);const U=V.toString();U&&(X+=(X.includes("?")?"&":"?")+U)}try{let U=await Promise.race([fetch(X,d),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(ae=>{U=ae(U)}),!U.ok)throw new Ue(`HTTP ${U.status}: ${U.statusText}`,U.status,U.status);const $=U.headers.get("content-type");let y;return $&&$.includes("application/json")?y=await U.json():y=await U.text(),y}catch(V){throw V instanceof Ue?V:new Ue(V instanceof Error?V.message:"网络错误",0,0)}}get(a,s,o){return this.request(a,{...o,method:"GET",params:s})}post(a,s,o){return this.request(a,{...o,method:"POST",body:s})}put(a,s,o){return this.request(a,{...o,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,o=1){return this._call("setChatStatus",a,s,o)}async _setChatStatus(a,s,o){return this.http.post(this.endpoints.setChatStatus,null,{params:{currentUser:a,friendUser:s,status:o}})}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 o=new FormData;return o.append("file",a),o.append("username",s),this.http.post(this.endpoints.uploadAvatar,o)}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,o){return this._call("addGroupMember",a,s,o)}async _addGroupMember(a,s,o){return this.http.post(this.endpoints.addGroupMember,null,{params:{groupId:a,targetUser:s,currentUser:o}})}async inviteGroupMembers(a,s,o){return this._call("inviteGroupMembers",a,s,o)}async _inviteGroupMembers(a,s,o){return this.http.post(this.endpoints.addGroupMember,{groupId:a,currentUser:s,targetUserList:o})}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,o){return this._call("getMsgReadUserList",a,s,o)}async _getMsgReadUserList(a,s,o){return this.http.get(this.endpoints.getMsgReadUserList,{groupId:a,groupMsgId:s,currentUser:o})}async updateGroupInfo(a,s,o,f,T){return this._call("updateGroupInfo",a,s,o,f,T)}async _updateGroupInfo(a,s,o,f,T){return this.http.post(this.endpoints.updateGroupInfo,{groupId:a,currentUser:s,groupNickname:o,remark:f,notice:T})}async updateMemberNick(a,s,o,f){return this._call("updateMemberNick",a,s,o,f)}async _updateMemberNick(a,s,o,f){return this.http.post(this.endpoints.updateMemberNick,{groupId:a,currentUser:s,targetUsername:o,memberNick:f})}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,o){return this._call("removeGroupMember",a,s,o)}async _removeGroupMember(a,s,o){return this.http.post(this.endpoints.removeGroupMember,{groupId:a,currentUser:s,targetUsername:o})}async transferGroupOwner(a,s,o){return this._call("transferGroupOwner",a,s,o)}async _transferGroupOwner(a,s,o){return this.http.post(this.endpoints.transferGroupOwner,{groupId:a,currentUser:s,newOwnerUsername:o})}async readSingleGroupMsg(a,s,o){return this._call("readSingleGroupMsg",a,s,o)}async _readSingleGroupMsg(a,s,o){return this.http.post(this.endpoints.readSingleGroupMsg,{groupId:a,currentUser:s,groupMsgId:o})}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(u,a){const s=new Ge(u);let o=null;const f=u.user.username,T=e.ref(u.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${f}`),S=e.ref({username:f,nickname:u.user.nickname||"",email:u.user.email||"",phone:u.user.phone||"",bio:u.user.bio||""}),X=e.ref(!1),C=e.ref(""),d=e.ref(""),V=e.ref(null),U=E=>Ke(E).format("HH:mm"),$=E=>{if(!E)return"";const q=Ke(),k=Ke(E);return q.isSame(k,"day")?k.format("HH:mm"):q.diff(k,"day")===1?"昨天":q.diff(k,"day")<7?["周日","周一","周二","周三","周四","周五","周六"][k.day()]:k.format("MM/DD")},y=E=>{if(!E)return!1;const q=["jpg","jpeg","png","gif","bmp","webp","svg"],k=E.split(".").pop().toLowerCase();return q.includes(k)},ae=E=>{if(!E)return"default";const q=E.split(".").pop().toLowerCase();return["xls","xlsx"].includes(q)?"excel":["pdf"].includes(q)?"pdf":["doc","docx"].includes(q)?"docx":"default"},de=()=>{e.nextTick(()=>{V.value&&(V.value.scrollTop=V.value.scrollHeight)})},z=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 q=E.match(/^\[(.+?)\]:(.+)$/);if(q)return{username:q[1],content:q[2],type:"text"}}catch(q){console.error("[VueChatKit] 解析消息失败",q)}return null},h=E=>{const q=`${u.api.websocketUrl}?userId=${f}`;o=new ve(f,{wsUrl:q,maxReconnectAttempts:u.websocket.maxReconnectAttempts,reconnectDelay:u.websocket.reconnectDelay}),o.on("message",E),o.connect()},oe=()=>{o&&(o.close(),o=null)},se=()=>o,ne=async()=>{try{const E=await s.getUserAvatar(f);E.code===200&&E.data&&(T.value=`${u.api.baseUrl}${E.data}`)}catch(E){console.warn("[VueChatKit] 加载头像失败",E)}},ee=E=>{T.value=E},Q=async E=>{try{return(await s.updateUserInfo(f,E)).code===200?(S.value={...S.value,...E},!0):!1}catch(q){return console.error("[VueChatKit] 更新用户信息失败",q),!1}};return ne(),{api:s,config:u,myUsername:f,myAvatar:T,userInfo:S,loadingUserInfo:X,searchText:C,inputText:d,messagesContainer:V,formatTime:U,formatLastTime:$,isImageFile:y,getFileIconType:ae,scrollToBottom:de,parseWsMessage:z,initWebSocket:h,closeWebSocket:oe,getSocket:se,initUserAvatar:ne,updateMyAvatar:ee,updateUserInfo:Q}}function Ft(u){const{api:a,myUsername:s,myAvatar:o,config:f,scrollToBottom:T,getSocket:S}=u,X=e.ref([]),C=e.ref([]),d=e.ref([]),V=e.ref(""),U=e.ref(!1),$=e.ref(""),y=e.ref([]),ae=e.ref(!1),de=e.ref([]),z=e.ref(!1),h=e.computed(()=>{let i=C.value;if(u.searchText.value){const p=u.searchText.value.toLowerCase();i=i.filter(N=>{var M;return(M=N.username)==null?void 0:M.toLowerCase().includes(p)})}return i.map(p=>({id:p.username,name:p.username,avatar:p.avatar?`${f.api.baseUrl}${p.avatar}`:o.value,online:p.online,lastMsg:p.lastMsg||"暂无消息",lastTime:p.lastTime,unread:p.unReadNum||0}))}),oe=e.computed(()=>{let i=X.value;if(u.searchText.value){const p=u.searchText.value.toLowerCase();i=i.filter(N=>{var M;return(M=N.username)==null?void 0:M.toLowerCase().includes(p)})}return i.map(p=>({id:p.username,name:p.username,avatar:p.avatar?`${f.api.baseUrl}${p.avatar}`:o.value,online:p.online,isChatting:p.isChatting}))}),se=e.computed(()=>y.value),ne=e.computed(()=>h.value.find(i=>i.id===V.value)||null),ee=e.computed(()=>d.value.map(i=>{const p=i.type==="file"||i.fileUrl||i.fileName,N=i.fileName||i.msgContent;let M="";if(i.sendUsername!==s){const A=X.value.find(R=>R.username===i.sendUsername);M=A!=null&&A.avatar?`${f.api.baseUrl}${A.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${i.sendUsername}`}else M=o.value;return{text:i.msgContent,isSelf:i.sendUsername===s,time:i.createTime,sendUsername:i.sendUsername,avatar:M,type:p?"file":"text",fileType:u.isImageFile(N)?"image":u.getFileIconType(N),fileUrl:i.fileUrl||"",fileName:N,fileSize:i.fileSize||0}})),Q=async()=>{try{const p=(await a.getFriends(s)).data||[];X.value=p,C.value=p.filter(N=>N.isChatting===1);for(const N of C.value)try{const A=(await a.getHistory(s,N.username)).data||[];N.unReadNum=A.filter(R=>R.isRead===0&&R.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||[],T()}catch(p){console.error("[VueChatKit] 获取聊天历史失败",p)}},q=async i=>{try{await a.setRead(s,i),Q()}catch(p){console.error("[VueChatKit] 标记已读失败",p)}},k=async i=>{V.value=i.id,await E(i.id),await q(i.id),T()},le=async(i,p=1)=>{try{return await a.setChatStatus(s,i,p),await Q(),!0}catch(N){return console.error("[VueChatKit] 设置聊天状态失败",N),!1}},te=()=>{const i=S();if(!u.inputText.value.trim()||!V.value||!i)return;if(i.send(V.value,u.inputText.value.trim(),"text")){const N={msgContent:u.inputText.value.trim(),sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"text"};d.value.push(N),u.inputText.value="",T(),setTimeout(()=>{E(V.value),Q()},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:M,fileName:A}=N.data;if(p.send(V.value,A,"file",M,A,i.size)){const Z={msgContent:A,sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"file",fileUrl:M,fileName:A,fileSize:i.size};return d.value.push(Z),T(),!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 A={msgContent:p.trim(),sendUsername:s,receiveUsername:V.value,createTime:new Date,isRead:0,type:"text"};d.value.push(A)}for(const M of i){const A=M.file||M;await g(A)}setTimeout(()=>{E(V.value),Q()},300)}},j=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),T()}catch(N){console.error("[VueChatKit] 添加临时消息失败",N)}E(V.value)}Q()},_=(i,p)=>{const N=X.value.find(M=>M.username===i);N&&(N.online=p)},F=async()=>{U.value=!0,$.value="",y.value=[]},b=async(i="")=>{ae.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{ae.value=!1}},I=async i=>{try{await a.addFriend(s,i.username),await Q(),U.value=!1}catch(p){console.error("[VueChatKit] 添加好友失败",p)}},Y=async()=>{z.value=!0;try{const i=await a.getApplyList(s);de.value=i.data||[]}catch(i){console.error("[VueChatKit] 获取好友申请列表失败",i)}finally{z.value=!1}},O=async i=>{try{await a.agreeFriend(i,s),await Y(),await Q()}catch(p){console.error("[VueChatKit] 同意好友申请失败",p)}},K=()=>{V.value="",d.value=[]};return e.watch($,async i=>{await b(i)}),{friendList:X,chatList:C,chatMsgList:d,currentSelectName:V,filteredUsers:h,filteredFriendList:oe,filteredAvailableUsers:se,currentUser:ne,currentMessages:ee,addFriendDialogVisible:U,addFriendSearchText:$,availableUsers:y,loadingAvailableUsers:ae,friendApplyList:de,loadingFriendApply:z,getFriendList:Q,getChatHistory:E,markAsRead:q,selectUser:k,setFriendToChatStatus:le,sendMessage:te,sendFile:g,sendFilesAndText:w,handleFriendWsMessage:j,handleFriendStatusChange:_,openAddFriendDialog:F,loadAvailableUsers:b,addFriend:I,loadFriendApplyList:Y,agreeFriend:O,resetFriendChat:K}}function It(u){const{api:a,myUsername:s,myAvatar:o,config:f,scrollToBottom:T,getSocket:S}=u,X=e.ref("friends"),C=e.ref([]),d=e.ref(null),V=e.ref([]),U=e.ref([]),$=e.ref({}),y=e.ref(!1),ae=e.ref(!1),de=e.ref(""),z=e.ref(""),h=e.ref([]),oe=e.ref(!1),se=e.ref([]),ne=e.ref(!1),ee=e.ref({groupNickname:"",remark:"",notice:""}),Q=e.ref({targetUsername:"",memberNick:""}),E=e.ref(!1),q=e.ref(!1),k=e.ref({readUserList:[],unreadUserList:[]}),le=e.ref(null),te=e.ref({groupNickname:!1,remark:!1,notice:!1}),g=e.ref({groupNickname:"",remark:"",notice:""}),w=e.computed(()=>{let n=C.value;if(u.searchText.value){const l=u.searchText.value.toLowerCase();n=n.filter(G=>G.groupName&&G.groupName.toLowerCase().includes(l)||G.remark&&G.remark.toLowerCase().includes(l))}return n.map(l=>{const J=($.value[l.groupId]||[]).slice(0,4).map(xe=>({username:xe.username,avatar:xe.avatar?`${f.api.baseUrl}${xe.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${xe.username}`}));let re="暂无消息";l.lastMsg?re=l.lastMsg:l.lastMessage?re=l.lastMessage:l.latestMessage&&(re=l.latestMessage);let ke=0;l.unReadNum!==void 0&&l.unReadNum!==null?ke=l.unReadNum:l.unreadCount!==void 0&&l.unreadCount!==null?ke=l.unreadCount:l.unread!==void 0&&l.unread!==null&&(ke=l.unread);let ue=l.lastTime;return!ue&&l.latestTime?ue=l.latestTime:!ue&&l.lastMsgTime&&(ue=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:J,lastMsg:re,lastTime:ue,unread:ke,memberCount:l.memberCount||0,notice:l.notice,groupNickname:l.groupNickname}})}),j=e.computed(()=>V.value.map(n=>{const l=n.type==="file"||n.fileUrl||n.fileName,G=n.fileName||n.msgContent,J=U.value.find(ue=>ue.username===n.sendUsername),re=(J==null?void 0:J.memberNick)||n.sendUsername,ke=J!=null&&J.avatar?`${f.api.baseUrl}${J.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${n.sendUsername}`;return{text:n.msgContent,isSelf:n.sendUsername===s,time:n.createTime,sendUsername:n.sendUsername,displayName:re,avatar:ke,type:l?"file":"text",fileType:u.isImageFile(G)?"image":u.getFileIconType(G),fileUrl:n.fileUrl||"",fileName:G,fileSize:n.fileSize||0}})),_=async()=>{try{const n=await a.getMyGroups(s);C.value=n.data||[];for(const l of C.value)try{const G=await a.getGroupMembers(l.groupId,s);$.value[l.groupId]=G.data||[]}catch(G){console.error(`[VueChatKit] 获取群 ${l.groupId} 成员失败`,G),$.value[l.groupId]=[]}}catch(n){console.error("[VueChatKit] 获取群聊列表失败",n)}},F=async n=>{try{const l=await a.getGroupHistory(n,s);V.value=l.data||[],T()}catch(l){console.error("[VueChatKit] 获取群聊历史失败",l)}},b=async n=>{try{const l=await a.getGroupMembers(n,s);U.value=l.data||[]}catch(l){console.error("[VueChatKit] 获取群成员失败",l)}},I=async n=>{await Te(n.groupId),await _(),d.value=n,await F(n.groupId),await b(n.groupId),T()},Y=async n=>{try{return(await a.getGroupUnreadCount(n,s)).data||0}catch(l){return console.error("[VueChatKit] 获取群未读数失败",l),0}},O=async(n,l)=>{try{const G=await a.getMsgReadUserList(n,l,s);k.value=G.data||{readUserList:[],unreadUserList:[]},q.value=!0}catch(G){console.error("[VueChatKit] 获取消息已读成员失败",G)}},K=async n=>{try{const l=await a.getGroupInfo(n,s);l.code===200&&l.data&&(le.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 n=>{if(!d.value||!le.value)return!1;try{const l={groupId:d.value.groupId,currentUser:s,groupNickname:n==="groupNickname"?g.value.groupNickname:le.value.groupNickname,remark:n==="remark"?g.value.remark:le.value.remark,notice:n==="notice"?g.value.notice:le.value.notice};return(await a._updateGroupInfo(l.groupId,l.currentUser,l.groupNickname,l.remark,l.notice)).code===200?(await K(d.value.groupId),await _(),!0):!1}catch(l){return console.error("[VueChatKit] 修改群信息失败",l),!1}},p=n=>{!le.value&&d.value&&K(d.value.groupId),te.value[n]=!0},N=n=>{te.value[n]=!1,le.value&&(g.value[n]=le.value[n]||"")},M=async n=>{const l=await i(n);return l&&(te.value[n]=!1),l},A=async()=>{if(!d.value)return!1;try{return(await a.updateGroupInfo(d.value.groupId,s,ee.value.groupNickname,ee.value.remark,ee.value.notice)).code===200?(ne.value=!1,await _(),d.value&&await K(d.value.groupId),!0):!1}catch(n){return console.error("[VueChatKit] 修改群信息失败",n),!1}},R=async()=>{if(!d.value)return!1;try{return(await a.updateMemberNick(d.value.groupId,s,Q.value.targetUsername,Q.value.memberNick)).code===200?(E.value=!1,await b(d.value.groupId),!0):!1}catch(n){return console.error("[VueChatKit] 修改群成员昵称失败",n),!1}},Z=async()=>{if(!d.value)return!1;try{return(await a.deleteGroup(d.value.groupId,s)).code===200?(d.value=null,V.value=[],ae.value=!1,await _(),!0):!1}catch(n){return console.error("[VueChatKit] 解散群聊失败",n),!1}},ie=async n=>{if(!d.value)return!1;try{return(await a.removeGroupMember(d.value.groupId,s,n)).code===200?(await b(d.value.groupId),!0):!1}catch(l){return console.error("[VueChatKit] 移除成员失败",l),!1}},me=async n=>{if(!d.value)return!1;try{return(await a.transferGroupOwner(d.value.groupId,s,n)).code===200?(await b(d.value.groupId),!0):!1}catch(l){return console.error("[VueChatKit] 转让群主失败",l),!1}},Ve=async n=>{if(!d.value)return!1;try{return(await a.readSingleGroupMsg(d.value.groupId,s,n)).code===200}catch(l){return console.error("[VueChatKit] 标记消息已读失败",l),!1}},Te=async n=>{var G;const l=n||((G=d.value)==null?void 0:G.groupId);if(!l)return!1;try{return(await a.readAllGroupMsg(l,s)).code===200}catch(J){return console.error("[VueChatKit] 标记全部已读失败",J),!1}},ze=()=>{d.value&&(ee.value={groupNickname:d.value.name||"",remark:d.value.remark||"",notice:d.value.notice||""},ne.value=!0)},ot=n=>{Q.value={targetUsername:n.username,memberNick:n.memberNick||""},E.value=!0},qe=async()=>{if(!de.value.trim())return console.warn("[VueChatKit] 请输入群名称"),!1;try{const n=await a.createGroup({groupName:de.value.trim(),remark:z.value.trim(),ownerUsername:s});if(n.code===200&&n.data){if(h.value.length>0){const l=h.value.map(G=>G.id);await a.inviteGroupMembers(n.data.groupId||n.data,s,l)}return de.value="",z.value="",h.value=[],y.value=!1,await _(),!0}return!1}catch(n){return console.error("[VueChatKit] 创建群聊失败",n),!1}},nt=async()=>{if(!d.value||se.value.length===0)return!1;try{const n=se.value.map(l=>l.id);return await a.inviteGroupMembers(d.value.groupId,s,n),se.value=[],oe.value=!1,await b(d.value.groupId),!0}catch(n){return console.error("[VueChatKit] 邀请成员失败",n),!1}},Fe=async()=>{if(!d.value)return!1;try{return await a.quitGroup(d.value.groupId,s),d.value=null,V.value=[],ae.value=!1,await _(),!0}catch(n){return console.error("[VueChatKit] 退出群聊失败",n),!1}},je=()=>{const n=S();if(!u.inputText.value.trim()||!d.value||!n)return;if(n.send(d.value.groupId,u.inputText.value.trim(),"text","","",0,!0)){const G={msgContent:u.inputText.value.trim(),sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"text"};V.value.push(G),u.inputText.value="",T(),setTimeout(()=>{F(d.value.groupId),_()},300)}},Xe=async n=>{const l=S();if(!d.value||!l)return!1;try{const G=await a.uploadFile(n);if(G.code===200&&G.data){const{fileUrl:J,fileName:re}=G.data;if(l.send(d.value.groupId,re,"file",J,re,n.size,!0)){const ue={msgContent:re,sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"file",fileUrl:J,fileName:re,fileSize:n.size};return V.value.push(ue),T(),!0}}return!1}catch(G){return console.error("[VueChatKit] 发送群聊文件失败",G),!1}};return{activeTab:X,groupList:C,currentSelectGroup:d,groupMsgList:V,groupMemberList:U,groupMembersMap:$,createGroupDialogVisible:y,groupDetailVisible:ae,newGroupName:de,newGroupRemark:z,selectedMembersForCreate:h,inviteMemberDialogVisible:oe,selectedMembersForInvite:se,groupInfoVisible:ne,editingGroupInfo:ee,editingMemberNick:Q,memberNickDialogVisible:E,msgReadUserDialogVisible:q,currentMsgReadList:k,currentGroupInfo:le,editingFields:te,tempEditValues:g,filteredGroupList:w,currentGroupMessages:j,getGroupList:_,getGroupHistory:F,getGroupMembers:b,selectGroup:I,createGroup:qe,inviteGroupMember:nt,quitGroup:Fe,sendGroupMessage:je,sendGroupFile:Xe,sendGroupFilesAndText:async(n,l)=>{const G=S();if(!(!d.value||!G)){if(l&&l.trim()&&G.send(d.value.groupId,l.trim(),"text","","",0,!0)){const re={msgContent:l.trim(),sendUsername:s,toGroupId:d.value.groupId,createTime:new Date,isRead:0,type:"text"};V.value.push(re)}for(const J of n){const re=J.file||J;await Xe(re)}setTimeout(()=>{F(d.value.groupId),_()},300)}},handleGroupWsMessage:n=>{if(d.value&&d.value.groupId===n.toGroupId){try{let l={msgContent:n.content,sendUsername:n.from||"未知用户",toGroupId:n.toGroupId,createTime:new Date,isRead:0,type:n.type||"text",fileUrl:n.fileUrl||"",fileName:n.fileName||"",fileSize:n.fileSize||0};V.value.push(l),T()}catch(l){console.error("[VueChatKit] 添加临时群聊消息失败",l)}F(n.toGroupId)}_()},switchTab:n=>{X.value=n,n==="groups"&&_()},resetGroupChat:()=>{d.value=null,V.value=[]},getGroupUnreadCount:Y,getMsgReadUserList:O,updateGroupInfo:A,updateMemberNick:R,deleteGroup:Z,removeGroupMember:ie,transferGroupOwner:me,readSingleGroupMsg:Ve,readAllGroupMsg:Te,openEditGroupInfo:ze,openEditMemberNick:ot,fetchGroupDetail:K,updateSingleGroupField:i,startEditField:p,cancelEditField:N,saveEditField:M}}function tt(u,a){const s=zt(u),o=Ft(s),f=It(s),T=e.computed(()=>f.currentSelectGroup.value?{type:"group",data:f.currentSelectGroup.value}:o.currentSelectName.value&&o.currentUser.value?{type:"friend",data:o.currentUser.value}:null),S=e.computed(()=>f.currentSelectGroup.value?f.currentGroupMessages.value:o.currentMessages.value),X=z=>{if(z.includes("【状态变更】")){const oe=/【状态变更】(.+?) 已(上线|下线)/,se=z.match(oe);if(se){const ne=se[1],ee=se[2]==="上线";o.handleFriendStatusChange(ne,ee)}return}const h=s.parseWsMessage(z);h&&(h.toGroupId?f.handleGroupWsMessage(h):o.handleFriendWsMessage(h),a&&typeof a=="function"&&a({...h,isGroup:!!h.toGroupId}))};return{...s,initWebSocket:()=>{s.initWebSocket(X)},...o,selectUser:async z=>{f.resetGroupChat(),await o.selectUser(z)},...f,selectGroup:async z=>{o.resetFriendChat(),await f.selectGroup(z)},currentChatTarget:T,currentAllMessages:S,switchTab:z=>{f.switchTab(z),z==="apply"&&o.loadFriendApplyList()},sendMessage:()=>{f.currentSelectGroup.value?f.sendGroupMessage():o.currentSelectName.value&&o.sendMessage()},sendFile:async z=>f.currentSelectGroup.value?await f.sendGroupFile(z):o.currentSelectName.value?await o.sendFile(z):!1,sendFilesAndText:async(z,h)=>{f.currentSelectGroup.value?await f.sendGroupFilesAndText(z,h):o.currentSelectName.value&&await o.sendFilesAndText(z,h)},reset:()=>{o.resetFriendChat(),f.resetGroupChat(),s.inputText.value="",s.searchText.value=""}}}const We=(u,a)=>{const s=u.__vccOpts||u;for(const[o,f]of a)s[o]=f;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(u,{expose:a,emit:s}){const o=u,f=s,T=e.computed({get:()=>o.modelValue,set:g=>f("update:modelValue",g)}),S=e.computed({get:()=>o.src,set:g=>{}}),X=["nw","n","ne","e","se","s","sw","w"],C=e.ref(!1),d=e.ref(null),V=e.ref(null),U=e.ref(null),$=e.ref({naturalWidth:0,naturalHeight:0,displayWidth:0,displayHeight:0,offsetX:0,offsetY:0}),y=e.ref({x:0,y:0,size:150,minSize:o.minSize}),ae=e.computed(()=>({width:`${$.value.displayWidth}px`,height:`${$.value.displayHeight}px`,maxWidth:"none",maxHeight:"none",display:"block"})),de=e.computed(()=>({left:`${y.value.x}px`,top:`${y.value.y}px`,width:`${y.value.size}px`,height:`${y.value.size/o.aspectRatio}px`}));let z=null,h=null;const oe=()=>{e.nextTick(()=>{const g=V.value,w=d.value;if(!g||!w)return;const j=w.clientWidth,_=w.clientHeight,F=g.naturalWidth/g.naturalHeight,b=j/_;let I,Y,O,K;F>b?(I=j,Y=j/F,O=0,K=(_-Y)/2):(Y=_,I=_*F,O=(j-I)/2,K=0),$.value={naturalWidth:g.naturalWidth,naturalHeight:g.naturalHeight,displayWidth:I,displayHeight:Y,offsetX:O,offsetY:K};const i=Math.min(I,Y)*.6;y.value.size=i,y.value.x=O+(I-i)/2,y.value.y=K+(Y-i/o.aspectRatio)/2,se()})},se=()=>{const g=U.value,w=V.value;if(!g||!w)return;const j=g.getContext("2d"),{naturalWidth:_,naturalHeight:F,displayWidth:b,displayHeight:I,offsetX:Y,offsetY:O}=$.value,K=_/b,i=F/I,p=(y.value.x-Y)*K,N=(y.value.y-O)*i,M=y.value.size*K,A=y.value.size/o.aspectRatio*i;j.clearRect(0,0,g.width,g.height),j.drawImage(w,p,N,M,A,0,0,g.width,g.height)},ne=g=>{g.preventDefault();const w=g.clientX||g.touches[0].clientX,j=g.clientY||g.touches[0].clientY;z={startX:w,startY:j,boxX:y.value.x,boxY:y.value.y};const _=b=>{const I=b.clientX||b.touches[0].clientX,Y=b.clientY||b.touches[0].clientY,O=I-z.startX,K=Y-z.startY,{offsetX:i,offsetY:p,displayWidth:N,displayHeight:M}=$.value,A=y.value.size/o.aspectRatio,R=Math.max(i,Math.min(i+N-y.value.size,z.boxX+O)),Z=Math.max(p,Math.min(p+M-A,z.boxY+K));y.value.x=R,y.value.y=Z,se()},F=()=>{z=null,document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",F),document.removeEventListener("touchmove",_),document.removeEventListener("touchend",F)};document.addEventListener("mousemove",_),document.addEventListener("mouseup",F),document.addEventListener("touchmove",_,{passive:!1}),document.addEventListener("touchend",F)},ee=(g,w)=>{w.preventDefault();const j=w.clientX||w.touches[0].clientX,_=w.clientY||w.touches[0].clientY;h={handle:g,startX:j,startY:_,boxX:y.value.x,boxY:y.value.y,boxSize:y.value.size};const F=I=>{const Y=I.clientX||I.touches[0].clientX,O=I.clientY||I.touches[0].clientY,K=Y-h.startX,i=O-h.startY,{offsetX:p,offsetY:N,displayWidth:M,displayHeight:A}=$.value;let R=h.boxSize,Z=h.boxX,ie=h.boxY;const me=h.boxSize/o.aspectRatio;switch(g){case"se":R=Math.max(y.value.minSize,Math.min(M-(h.boxX-p),A-(h.boxY-N),h.boxSize+Math.max(K,i)));break;case"nw":R=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,h.boxY-N+me,h.boxSize-Math.max(K,i))),Z=h.boxX+(h.boxSize-R),ie=h.boxY+(me-R/o.aspectRatio);break;case"ne":R=Math.max(y.value.minSize,Math.min(p+M-h.boxX,h.boxY-N+me,h.boxSize+Math.max(K,-i))),ie=h.boxY+(me-R/o.aspectRatio);break;case"sw":R=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,N+A-h.boxY,h.boxSize+Math.max(-K,i))),Z=h.boxX+(h.boxSize-R);break;case"n":R=Math.max(y.value.minSize,Math.min(h.boxY-N+me,h.boxSize-i)),ie=h.boxY+(me-R/o.aspectRatio);break;case"s":R=Math.max(y.value.minSize,Math.min(N+A-h.boxY,h.boxSize+i));break;case"w":R=Math.max(y.value.minSize,Math.min(h.boxX-p+h.boxSize,h.boxSize-K)),Z=h.boxX+(h.boxSize-R);break;case"e":R=Math.max(y.value.minSize,Math.min(p+M-h.boxX,h.boxSize+K));break}y.value.size=R,y.value.x=Z,y.value.y=ie,se()},b=()=>{h=null,document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",b),document.removeEventListener("touchmove",F),document.removeEventListener("touchend",b)};document.addEventListener("mousemove",F),document.addEventListener("mouseup",b),document.addEventListener("touchmove",F,{passive:!1}),document.addEventListener("touchend",b)},Q=()=>{const g=document.createElement("canvas"),w=V.value;if(!w)return null;const{naturalWidth:j,naturalHeight:_,displayWidth:F,displayHeight:b,offsetX:I,offsetY:Y}=$.value,O=j/F,K=_/b,i=(y.value.x-I)*O,p=(y.value.y-Y)*K,N=y.value.size*O,M=y.value.size/o.aspectRatio*K;return g.width=o.outputSize,g.height=o.outputSize/o.aspectRatio,g.getContext("2d").drawImage(w,i,p,N,M,0,0,g.width,g.height),new Promise(R=>{g.toBlob(Z=>{R(new File([Z],"avatar.jpg",{type:o.outputType}))},o.outputType,o.outputQuality)})},E=()=>{const g=document.createElement("canvas"),w=V.value;if(!w)return null;const{naturalWidth:j,naturalHeight:_,displayWidth:F,displayHeight:b,offsetX:I,offsetY:Y}=$.value,O=j/F,K=_/b,i=(y.value.x-I)*O,p=(y.value.y-Y)*K,N=y.value.size*O,M=y.value.size/o.aspectRatio*K;return g.width=o.outputSize,g.height=o.outputSize/o.aspectRatio,g.getContext("2d").drawImage(w,i,p,N,M,0,0,g.width,g.height),g.toDataURL(o.outputType,o.outputQuality)},q=async()=>{if(S.value){C.value=!0;try{const g=await Q(),w=E();g&&f("confirm",{file:g,dataUrl:w})}catch(g){console.error(g),x.ElMessage.error("生成图片失败")}finally{C.value=!1}}},k=()=>{f("cancel"),T.value=!1},le=()=>{te(),f("closed")},te=()=>{y.value={x:0,y:0,size:150,minSize:o.minSize}};return e.watch(()=>o.src,g=>{g&&e.nextTick(()=>{V.value&&V.value.complete&&oe()})}),a({getCroppedImage:Q,getCroppedImageDataUrl:E,reset:te}),(g,w)=>{const j=e.resolveComponent("el-empty"),_=e.resolveComponent("el-button"),F=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(F,{modelValue:T.value,"onUpdate:modelValue":w[0]||(w[0]=b=>T.value=b),title:"调整头像",width:u.dialogWidth,"close-on-click-modal":!1,"append-to-body":u.appendToBody,onClosed:le},{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:q},{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:u.cropAreaHeight})},[e.createElementVNode("img",{src:S.value,ref_key:"imageRef",ref:V,onLoad:oe,style:e.normalizeStyle(ae.value)},null,44,Lt),e.createElementVNode("div",{class:"crop-box",style:e.normalizeStyle(de.value),onMousedown:ne,onTouchstart:ne},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(X,b=>e.createElementVNode("div",{key:b,class:e.normalizeClass(["crop-handle",b]),onMousedown:e.withModifiers(I=>ee(b,I),["stop"]),onTouchstart:e.withModifiers(I=>ee(b,I),["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:u.previewSize+"px",height:u.previewSize+"px"})},[e.createElementVNode("canvas",{ref_key:"previewCanvasRef",ref:U,width:u.previewSize,height:u.previewSize,class:"preview-canvas"},null,8,Kt)],4)])])):(e.openBlock(),e.createBlock(j,{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(u,{emit:a}){const s=a,o=e.ref(0),f=[{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:["☀️","🌤️","⛅","🌥️","☁️","🌦️","🌧️","⛈️","🌩️","🌨️","❄️","☃️","⛄","🌬️","💨","🌪️","🌫️","🌊","💧","💦","☔","☂️","🌱","🌲","🌳","🌴","🌵","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","⭐","🌟","✨","💫","🌙","🌚","🌛","🌜","🌝","🪐","🌍","🌎","🌏","⛱️","🏖️"]}],T=S=>{s("select",S)};return(S,X)=>u.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(f,(C,d)=>e.createElementVNode("div",{key:C.id,class:e.normalizeClass(["emoji-category-tab",{active:o.value===d}]),onClick:V=>o.value=d},e.toDisplayString(C.icon),11,qt)),64))]),e.createElementVNode("div",jt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f[o.value].emojis,C=>(e.openBlock(),e.createElementBlock("div",{key:C,class:"emoji-item",onClick:d=>T(C)},e.toDisplayString(C),9,Xt))),128))])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-6ca53096"]]),Ot={class:"chat-panel"},Jt={class:"chat-sidebar"},Qt=["src"],Zt=["onClick"],Pt={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"},oa=["src","alt"],na={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"],xa={class:"friend-request-details"},_a={class:"friend-request-username"},Ba={key:3},Ma={class:"add-friend-section"},Sa={class:"add-friend-icon"},Ua=["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"},Oa={class:"chat-window-header"},Ja={class:"chat-window-title"},Qa={class:"chat-window-name"},Za={key:1,class:"chat-window-status"},Pa={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"],os={key:0,class:"message-image-size"},ns=["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"},xs={key:2,class:"chat-empty-state"},_s={class:"empty-state-text"},Bs={key:0,class:"group-sidebar"},Ms={class:"group-sidebar-header"},Ss={class:"group-sidebar-content"},Us={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"},Os={class:"group-setting-value-text"},Js={key:3,class:"group-setting-item"},Qs={class:"group-setting-value-text"},Zs={key:4,class:"group-setting-item"},Ps={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"},or={class:"group-setting-value-text"},nr={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"],xr=["src","alt"],_r={class:"member-name"},Br={class:"group-detail-content"},Mr={class:"group-info-section"},Sr={class:"group-info-item"},Ur={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"},Or={class:"section-title"},Jr={class:"users-list"},Qr={key:1,class:"users-tag-list"},Zr={class:"unread-users-section"},Pr={class:"section-title"},vr={class:"users-list"},eo={key:1,class:"users-tag-list"},to={class:"invite-member-content"},ao={class:"invite-member-list"},so={key:1,class:"member-list"},ro=["onClick"],oo=["src","alt"],no={class:"member-name"},lo={class:"chat-settings-container"},io={class:"chat-settings-avatar-section"},co={class:"chat-settings-avatar-wrapper"},po=["src"],mo={class:"chat-settings-user-display"},uo={class:"chat-settings-nickname"},fo={class:"chat-settings-username"},ho={class:"chat-settings-form-section"},go={class:"chat-settings-form-header"},ko={class:"chat-settings-form-title"},yo={class:"chat-settings-form"},Vo={class:"chat-settings-form-item"},No={key:1,class:"chat-settings-form-value"},Co={class:"chat-settings-form-item"},wo={key:1,class:"chat-settings-form-value"},bo={class:"chat-settings-form-item"},Eo={key:1,class:"chat-settings-form-value"},xo={class:"chat-settings-form-item"},_o={key:1,class:"chat-settings-form-value bio-value"},Bo={key:0,class:"chat-settings-form-actions"},at=We({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(u,{emit:a}){const s=u,o=a,{myUsername:f,myAvatar:T,userInfo:S,loadingUserInfo:X,friendList:C,filteredFriendList:d,searchText:V,inputText:U,messagesContainer:$,filteredUsers:y,filteredAvailableUsers:ae,currentUser:de,currentMessages:z,addFriendDialogVisible:h,addFriendSearchText:oe,availableUsers:se,loadingAvailableUsers:ne,friendApplyList:ee,loadingFriendApply:Q,activeTab:E,groupList:q,currentSelectGroup:k,groupMsgList:le,groupMemberList:te,createGroupDialogVisible:g,groupDetailVisible:w,newGroupName:j,newGroupRemark:_,selectedMembersForCreate:F,inviteMemberDialogVisible:b,selectedMembersForInvite:I,filteredGroupList:Y,currentChatTarget:O,currentGroupMessages:K,currentAllMessages:i,groupInfoVisible:p,editingGroupInfo:N,editingMemberNick:M,memberNickDialogVisible:A,msgReadUserDialogVisible:R,currentMsgReadList:Z,currentGroupInfo:ie,editingFields:me,tempEditValues:Ve,formatTime:Te,formatLastTime:ze,scrollToBottom:ot,getFriendList:qe,getChatHistory:nt,setFriendToChatStatus:Fe,selectUser:je,sendMessage:Xe,sendFile:Uo,sendFilesAndText:lt,initWebSocket:it,closeWebSocket:ct,reset:n,openAddFriendDialog:l,addFriend:G,loadFriendApplyList:J,agreeFriend:re,updateMyAvatar:ke,getGroupList:ue,getGroupHistory:xe,getGroupMembers:xn,selectGroup:Go,createGroup:To,inviteGroupMember:zo,quitGroup:Fo,sendGroupMessage:_n,sendGroupFile:Bn,sendGroupFilesAndText:Io,switchTab:Mn,getGroupUnreadCount:Sn,getMsgReadUserList:Un,updateGroupInfo:Do,updateMemberNick:Ao,deleteGroup:Lo,removeGroupMember:Ro,transferGroupOwner:$o,readSingleGroupMsg:Gn,readAllGroupMsg:Tn,openEditGroupInfo:Ko,openEditMemberNick:Ie,fetchGroupDetail:Wo,updateSingleGroupField:zn,startEditField:Ye,cancelEditField:Oe,saveEditField:Ho}=tt(s.config,c=>{o("message",c)}),qo=e.computed(()=>{var t;const c=[{id:"chat",icon:B.ChatDotRound,badge:0}];return s.config.modules.friends&&c.push({id:"friends",icon:B.UserFilled,badge:0}),s.config.modules.groups&&c.push({id:"groups",icon:B.UserFilled,badge:0}),s.config.modules.apply&&c.push({id:"apply",icon:B.Bell,badge:((t=ee.value)==null?void 0:t.length)||0}),c}),Ne=e.ref("chat"),be=e.ref(null),pe=e.ref(null),ce=e.ref(null),_e=e.ref(!1),ye=e.ref(!1),fe=e.ref({nickname:"",email:"",phone:"",bio:""}),Je=e.ref(!1),De=e.ref(!1),Ae=e.ref(!1),dt=e.ref(!1),Le=e.ref(null),Qe=e.ref(""),Re=e.ref(null),he=e.ref([]),Ce=e.ref({visible:!1,x:0,y:0,chat:null}),Be=e.ref(!1),Ee=e.ref(!1),pt=e.ref(!1);e.ref(null),e.watch(Ee,c=>{c&&k.value&&Wo(k.value.groupId)});const jo=e.computed(()=>{const c=te.value.find(t=>t.username===f);return(c==null?void 0:c.memberNick)||""}),Xo=()=>{const c=te.value.find(t=>t.username===f);c&&Ie(c)},Yo=(c,t)=>{c.preventDefault(),c.stopPropagation(),Ce.value={visible:!0,x:c.clientX,y:c.clientY,chat:t}},Ze=()=>{Ce.value.visible=!1},Oo=async()=>{if(!Ce.value.chat)return;await Fe(Ce.value.chat.id,0)&&be.value===Ce.value.chat.id&&(be.value=null,pe.value=null),Ze()},Pe=c=>{be.value=c.id,pe.value=c,ce.value=null,k.value=null,_e.value=!1,w.value=!1,je({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},Jo=c=>{ce.value=c,be.value=null,pe.value=null,k.value=null},Qo=c=>{k.value=c,be.value=null,pe.value=null,ce.value=null,_e.value=!1,w.value=!1,Go(c)},Zo=async()=>{if(!ce.value)return;if(await Fe(ce.value.id)){Ne.value="chat",await e.nextTick();const t=y.value.find(m=>m.id===ce.value.id);t&&Pe(t),ce.value=null}},Po=()=>{De.value=!0},vo=()=>{var c;(c=Le.value)==null||c.click()},en=()=>{var c;(c=Re.value)==null||c.click()},tn=c=>{const t=Array.from(c.target.files||[]);if(t.length!==0){for(const m of t){if(m.size>50*1024*1024){x.ElMessage.warning(`文件 ${m.name} 超过50MB,已跳过`);continue}const D=URL.createObjectURL(m);he.value.push({id:Date.now()+Math.random(),file:m,name:m.name,size:m.size,type:m.type,previewUrl:D,isImage:m.type.startsWith("image/")})}Re.value&&(Re.value.value="")}},mt=c=>{const t=he.value[c];t.previewUrl&&URL.revokeObjectURL(t.previewUrl),he.value.splice(c,1)},ut=c=>{if(c===0)return"0 B";const t=1024,m=["B","KB","MB","GB"],D=Math.floor(Math.log(c)/Math.log(t));return parseFloat((c/Math.pow(t,D)).toFixed(2))+" "+m[D]},ft=async()=>{if(!U.value.trim()&&he.value.length===0)return;const c=[...he.value],t=U.value;U.value="",he.value.forEach(m=>{m.previewUrl&&URL.revokeObjectURL(m.previewUrl)}),he.value=[],k.value?await Io(c,t):await lt(c,t),o("send",{text:t,files:c})},an=c=>{var m;const t=(m=c.clipboardData)==null?void 0:m.items;if(t){for(const D of t)if(D.kind==="file"){const P=D.getAsFile();if(P){if(P.size>50*1024*1024){x.ElMessage.warning(`文件 ${P.name} 超过50MB,已跳过`);continue}const L=URL.createObjectURL(P);he.value.push({id:Date.now()+Math.random(),file:P,name:P.name,size:P.size,type:P.type,previewUrl:L,isImage:P.type.startsWith("image/")})}}}},ht=c=>{if(!c){x.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},sn=c=>{console.warn("图片加载失败",c)},rn=c=>{U.value+=c,Be.value=!1},on=(c,t)=>{const m={};return c===1?(m.width="100%",m.height="100%"):c===2?(m.width="50%",m.height="100%"):c===3&&t===0?(m.width="100%",m.height="50%"):(m.width="50%",m.height="50%"),m},nn=c=>{const t=F.value.findIndex(m=>m.id===c.id);t!==-1?F.value.splice(t,1):F.value.push(c)},ln=c=>{const t=I.value.findIndex(m=>m.id===c.id);t!==-1?I.value.splice(t,1):I.value.push(c)},cn=async()=>{await To()?x.ElMessage.success("群聊创建成功"):x.ElMessage.error("群聊创建失败")},dn=async()=>{await zo()?x.ElMessage.success("邀请成功"):x.ElMessage.error("邀请失败")},gt=async()=>{await x.ElMessageBox.confirm("确定要退出群聊吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).catch(()=>{})&&(await Fo()?x.ElMessage.success("已退出群聊"):x.ElMessage.error("退出失败"))},kt=async()=>{await x.ElMessageBox.confirm("确定要解散该群聊吗?此操作不可恢复!","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).catch(()=>{})&&(await Lo()?(x.ElMessage.success("群聊已解散"),Ee.value=!1):x.ElMessage.error("解散失败"))},Me=async c=>{const t=ElLoading.service({lock:!0,text:"保存中...",background:"rgba(0, 0, 0, 0.7)"});try{await Ho(c)?x.ElMessage.success("保存成功"):x.ElMessage.error("保存失败")}catch(m){console.error("保存失败",m),x.ElMessage.error("保存失败")}finally{t.close()}},pn=async()=>{const c=ElLoading.service({lock:!0,text:"保存中...",background:"rgba(0, 0, 0, 0.7)"});try{await Ao()?(x.ElMessage.success("群昵称修改成功"),A.value=!1):x.ElMessage.error("修改失败")}catch(t){console.error("修改失败",t),x.ElMessage.error("修改失败")}finally{c.close()}},mn=async c=>{if(await x.ElMessageBox.confirm(`确定要移除成员 ${c} 吗?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).catch(()=>{})){const m=ElLoading.service({lock:!0,text:"移除中...",background:"rgba(0, 0, 0, 0.7)"});try{await Ro(c)?x.ElMessage.success("成员已移除"):x.ElMessage.error("移除失败")}catch(D){console.error("移除失败",D),x.ElMessage.error("移除失败")}finally{m.close()}}},un=async c=>{if(await x.ElMessageBox.confirm(`确定要将群主转让给 ${c} 吗?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).catch(()=>{})){const m=ElLoading.service({lock:!0,text:"转让中...",background:"rgba(0, 0, 0, 0.7)"});try{await $o(c)?x.ElMessage.success("群主已转让"):x.ElMessage.error("转让失败")}catch(D){console.error("转让失败",D),x.ElMessage.error("转让失败")}finally{m.close()}}},fn=async()=>{await Do()?x.ElMessage.success("群信息已更新"):x.ElMessage.error("更新失败")},hn=c=>{const t=c.target.files[0];if(!t)return;if(!t.type.startsWith("image/")){x.ElMessage.error("只能上传图片文件");return}if(t.size>5*1024*1024){x.ElMessage.error("图片大小不能超过 5MB");return}const m=new FileReader;m.onload=D=>{Qe.value=D.target.result,Ae.value=!0},m.readAsDataURL(t)},gn=async({file:c})=>{if(c){dt.value=!0;try{const{ChatApi:t}=await Promise.resolve().then(()=>Tt),D=await new t(s.config).uploadAvatar(c,f);D.code===200?(x.ElMessage.success("头像上传成功"),ke(D.data),kn()):x.ElMessage.error(D.msg||"头像上传失败")}catch(t){console.error(t),x.ElMessage.error("头像上传失败")}finally{dt.value=!1}}},kn=()=>{Qe.value="",Ae.value=!1,Le.value&&(Le.value.value="")},yn=()=>{fe.value={nickname:S.value.nickname||"",email:S.value.email||"",phone:S.value.phone||"",bio:S.value.bio||""},ye.value=!0},Vn=()=>{ye.value=!1,fe.value={nickname:"",email:"",phone:"",bio:""}},Nn=async()=>{Je.value=!0;try{await updateUserInfo(fe.value)?(x.ElMessage.success("保存成功"),ye.value=!1):x.ElMessage.error("保存失败")}catch(c){console.error(c),x.ElMessage.error("保存失败")}finally{Je.value=!1}};return e.onMounted(async()=>{const c=[qe(),J()];s.config.modules.groups&&c.push(ue()),await Promise.all(c),it(),y.value.length>0&&Pe(y.value[0]),o("init"),document.addEventListener("click",Ze)}),e.onUnmounted(()=>{n(),ct(),document.removeEventListener("click",Ze)}),(c,t)=>{var Nt,Ct,wt;const m=e.resolveComponent("el-icon"),D=e.resolveComponent("el-input"),P=e.resolveComponent("el-empty"),L=e.resolveComponent("el-button"),Cn=e.resolveComponent("el-switch"),we=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",Ot,[e.createElementVNode("div",Jt,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Po},[e.createElementVNode("img",{src:e.unref(T),alt:"头像",class:"sidebar-avatar-img"},null,8,Qt)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(qo.value,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["sidebar-nav-item",Ne.value===r.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:W=>Ne.value=r.id},[e.createVNode(m,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.icon)))]),_:2},1024),r.badge?(e.openBlock(),e.createElementBlock("span",Pt,e.toDisplayString(r.badge>99?"99+":r.badge),1)):e.createCommentVNode("",!0)],10,Zt))),128)),t[54]||(t[54]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),u.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(m,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",vt,[e.createElementVNode("div",ea,[e.createVNode(D,{modelValue:e.unref(V),"onUpdate:modelValue":t[1]||(t[1]=r=>e.isRef(V)?V.value=r:null),placeholder:"搜索","prefix-icon":e.unref(B.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ta,[Ne.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",be.value===r.id?"chat-list-item-active":""]),onClick:W=>Pe(r),onContextmenu:e.withModifiers(W=>Yo(W,r),["prevent","stop"])},[e.createElementVNode("div",ra,[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"chat-list-avatar"},null,8,oa),r.online?(e.openBlock(),e.createElementBlock("span",na)):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),Ne.value==="friends"&&u.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(m,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(B.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:W=>Jo(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),Ne.value==="apply"&&u.config.modules.apply?(e.openBlock(),e.createElementBlock("div",wa,[e.unref(Q)?(e.openBlock(),e.createBlock(P,{key:0,description:"加载中..."})):e.unref(ee).length===0?(e.openBlock(),e.createBlock(P,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(ee),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",xa,[e.createElementVNode("div",_a,e.toDisplayString(r.applyUser),1),t[56]||(t[56]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(L,{type:"primary",size:"small",onClick:W=>e.unref(re)(r.applyUser)},{default:e.withCtx(()=>[...t[57]||(t[57]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0),Ne.value==="groups"&&u.config.modules.groups?(e.openBlock(),e.createElementBlock("div",Ba,[e.createElementVNode("div",Ma,[e.createElementVNode("div",{class:"add-friend-btn",onClick:t[3]||(t[3]=r=>g.value=!0)},[e.createElementVNode("div",Sa,[e.createVNode(m,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(B.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(Y),r=>{var W;return e.openBlock(),e.createElementBlock("div",{key:r.groupId,class:e.normalizeClass(["chat-list-item",((W=e.unref(k))==null?void 0:W.groupId)===r.groupId?"chat-list-item-active":""]),onClick:ge=>Qo(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,(ge,$e)=>(e.openBlock(),e.createElementBlock("div",{key:ge.username,class:"group-avatar-item",style:e.normalizeStyle(on(r.memberAvatars.length,$e))},[e.createElementVNode("img",{src:ge.avatar,alt:ge.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,Ua)}),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Wa,[ce.value&&!pe.value?(e.openBlock(),e.createElementBlock("div",Ha,[e.createElementVNode("img",{src:ce.value.avatar,alt:ce.value.name,class:"profile-avatar"},null,8,qa),e.createElementVNode("div",ja,e.toDisplayString(ce.value.name),1),e.createElementVNode("div",Xa,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",ce.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(ce.value.online?"在线":"离线"),1)]),e.createVNode(L,{type:"primary",size:"large",onClick:Zo,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.ChatDotRound))]),_:1}),t[59]||(t[59]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),pe.value||e.unref(k)?(e.openBlock(),e.createElementBlock("div",Ya,[e.createElementVNode("div",Oa,[e.createElementVNode("div",Ja,[e.createElementVNode("span",Qa,e.toDisplayString(e.unref(k)?e.unref(k).name:pe.value.name),1),e.unref(k)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["chat-window-status",pe.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString(pe.value.online?"在线":"离线"),3)),e.unref(k)?(e.openBlock(),e.createElementBlock("span",Za,e.toDisplayString(e.unref(te).length)+" 人 ",1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Pa,[e.createVNode(m,{class:"chat-action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Search))]),_:1}),e.unref(k)?(e.openBlock(),e.createBlock(m,{key:0,class:"chat-action-icon",onClick:t[4]||(t[4]=r=>Ee.value=!Ee.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(B.MoreFilled))]),_:1})):(e.openBlock(),e.createBlock(m,{key:1,class:"chat-action-icon",onClick:t[5]||(t[5]=r=>_e.value=!_e.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(B.MoreFilled))]),_:1}))])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:$,class:"chat-messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k)?e.unref(K):e.unref(z),(r,W)=>(e.openBlock(),e.createElementBlock("div",{key:W,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:pe.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:ge=>ht(r.fileUrl)},[e.createElementVNode("img",{src:r.fileUrl,alt:r.fileName,class:"message-image",onError:sn},null,40,rs),r.fileSize?(e.openBlock(),e.createElementBlock("div",os,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:ge=>ht(r.fileUrl)},[e.createElementVNode("div",ls,[e.createElementVNode("div",is,[e.createVNode(m,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Document))]),_:1})]),e.createElementVNode("div",cs,[e.createElementVNode("div",ds,e.toDisplayString(r.fileName||r.text),1),e.createElementVNode("div",ps,[e.createVNode(m,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(B.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,ns)):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=>Be.value=!1)},[he.value.length>0?(e.openBlock(),e.createElementBlock("div",us,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(he.value,(r,W)=>(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:ge=>mt(W),class:"pending-file-remove-btn"}," × ",8,gs)])):(e.openBlock(),e.createElementBlock("div",ks,[e.createVNode(m,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Folder))]),_:1}),e.createElementVNode("span",ys,e.toDisplayString(r.name),1),e.createElementVNode("button",{onClick:ge=>mt(W),class:"pending-file-remove-btn"}," × ",8,Vs)]))]))),128))])):e.createCommentVNode("",!0),u.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Ns,[e.createElementVNode("div",Cs,[e.createVNode(m,{class:"input-toolbar-icon",onClick:t[6]||(t[6]=e.withModifiers(r=>Be.value=!Be.value,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(B.ChatDotRound))]),_:1}),e.createVNode(Yt,{visible:Be.value,onSelect:rn},null,8,["visible"])]),e.createVNode(m,{class:"input-toolbar-icon",onClick:en},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Folder))]),_:1}),e.createVNode(m,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.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:an,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,bs),[[e.vModelText,e.unref(U)]])]),e.createElementVNode("div",Es,[e.createVNode(L,{type:"primary",disabled:!e.unref(U).trim()&&he.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:tn},null,544)])])):ce.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",xs,[e.createVNode(m,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.ChatLineRound))]),_:1}),e.createElementVNode("div",_s,e.toDisplayString(Ne.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),e.createVNode(e.Transition,{name:"slide"},{default:e.withCtx(()=>{var r,W,ge,$e,bt,Et,xt,_t,Bt,Mt,St,Ut,Gt;return[Ee.value&&e.unref(k)?(e.openBlock(),e.createElementBlock("div",Bs,[e.createElementVNode("div",Ms,[t[62]||(t[62]=e.createElementVNode("span",{class:"group-sidebar-title"},"群聊信息",-1)),e.createVNode(m,{class:"group-sidebar-close",onClick:t[9]||(t[9]=H=>Ee.value=!1)},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Close))]),_:1})]),e.createElementVNode("div",Ss,[e.createElementVNode("div",Us,[e.createElementVNode("div",Gs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(te).slice(0,12),H=>(e.openBlock(),e.createElementBlock("div",{key:H.username,class:"group-member-avatar-item",onClick:Fn=>e.unref(Ie)(H)},[e.createElementVNode("img",{src:H.avatar?`${u.config.api.baseUrl}${H.avatar}`:`https://api.dicebear.com/7.x/avataaars/svg?seed=${H.username}`,alt:H.username,class:"group-member-avatar-small"},null,8,zs),e.createElementVNode("span",Fs,e.toDisplayString(H.memberNick||H.username),1)],8,Ts))),128)),e.unref(te).length>12?(e.openBlock(),e.createElementBlock("div",{key:0,class:"group-member-avatar-item",onClick:t[10]||(t[10]=H=>b.value=!0)},[e.createElementVNode("div",Is,[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.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]=H=>b.value=!0)},[e.createElementVNode("div",Ds,[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.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(f)?(e.openBlock(),e.createElementBlock("div",Ls,[t[67]||(t[67]=e.createElementVNode("span",{class:"group-setting-label"},"群聊名称",-1)),e.createElementVNode("div",Rs,[e.unref(me).groupNickname?(e.openBlock(),e.createElementBlock("div",$s,[e.createVNode(D,{modelValue:e.unref(Ve).groupNickname,"onUpdate:modelValue":t[12]||(t[12]=H=>e.unref(Ve).groupNickname=H),placeholder:"请输入群聊名称",onKeyup:t[13]||(t[13]=e.withKeys(H=>Me("groupNickname"),["enter"])),class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",Ks,[e.createVNode(L,{size:"small",onClick:t[14]||(t[14]=H=>e.unref(Oe)("groupNickname"))},{default:e.withCtx(()=>[...t[65]||(t[65]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{size:"small",type:"primary",onClick:t[15]||(t[15]=H=>Me("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]=H=>e.unref(Ye)("groupNickname"))},[e.createElementVNode("span",null,e.toDisplayString(((W=e.unref(ie))==null?void 0:W.groupNickname)||((ge=e.unref(ie))==null?void 0:ge.groupName)||(($e=e.unref(k))==null?void 0:$e.name)||""),1),e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.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(ie))==null?void 0:bt.groupNickname)||((Et=e.unref(ie))==null?void 0:Et.groupName)||((xt=e.unref(k))==null?void 0:xt.name)||""),1)])),((_t=e.unref(k))==null?void 0:_t.owner)===e.unref(f)?(e.openBlock(),e.createElementBlock("div",qs,[t[71]||(t[71]=e.createElementVNode("span",{class:"group-setting-label"},"群公告",-1)),e.createElementVNode("div",js,[e.unref(me).notice?(e.openBlock(),e.createElementBlock("div",Xs,[e.createVNode(D,{modelValue:e.unref(Ve).notice,"onUpdate:modelValue":t[17]||(t[17]=H=>e.unref(Ve).notice=H),type:"textarea",rows:3,placeholder:"请输入群公告",class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",Ys,[e.createVNode(L,{size:"small",onClick:t[18]||(t[18]=H=>e.unref(Oe)("notice"))},{default:e.withCtx(()=>[...t[69]||(t[69]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{size:"small",type:"primary",onClick:t[19]||(t[19]=H=>Me("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]=H=>e.unref(Ye)("notice"))},[e.createElementVNode("span",Os,e.toDisplayString(((Bt=e.unref(ie))==null?void 0:Bt.notice)||"暂无公告"),1),e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Edit))]),_:1})]))])])):(e.openBlock(),e.createElementBlock("div",Js,[t[72]||(t[72]=e.createElementVNode("span",{class:"group-setting-label"},"群公告",-1)),e.createElementVNode("span",Qs,e.toDisplayString(((Mt=e.unref(ie))==null?void 0:Mt.notice)||"暂无公告"),1)])),((St=e.unref(k))==null?void 0:St.owner)===e.unref(f)?(e.openBlock(),e.createElementBlock("div",Zs,[t[75]||(t[75]=e.createElementVNode("span",{class:"group-setting-label"},"备注",-1)),e.createElementVNode("div",Ps,[e.unref(me).remark?(e.openBlock(),e.createElementBlock("div",vs,[e.createVNode(D,{modelValue:e.unref(Ve).remark,"onUpdate:modelValue":t[21]||(t[21]=H=>e.unref(Ve).remark=H),placeholder:"请输入备注",onKeyup:t[22]||(t[22]=e.withKeys(H=>Me("remark"),["enter"])),class:"group-input-edit"},null,8,["modelValue"]),e.createElementVNode("div",er,[e.createVNode(L,{size:"small",onClick:t[23]||(t[23]=H=>e.unref(Oe)("remark"))},{default:e.withCtx(()=>[...t[73]||(t[73]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{size:"small",type:"primary",onClick:t[24]||(t[24]=H=>Me("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]=H=>e.unref(Ye)("remark"))},[e.createElementVNode("span",tr,e.toDisplayString(((Ut=e.unref(ie))==null?void 0:Ut.remark)||"群聊的备注仅自己可见"),1),e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.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(ie))==null?void 0:Gt.remark)||"群聊的备注仅自己可见"),1)])),e.createElementVNode("div",{class:"group-setting-item",onClick:Xo},[t[77]||(t[77]=e.createElementVNode("span",{class:"group-setting-label"},"我在本群的昵称",-1)),e.createElementVNode("div",rr,[e.createElementVNode("span",or,e.toDisplayString(jo.value||e.unref(f)),1),e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Edit))]),_:1})])]),t[82]||(t[82]=e.createElementVNode("div",{class:"group-divider"},null,-1)),e.createElementVNode("div",nr,[t[78]||(t[78]=e.createElementVNode("span",{class:"group-setting-label"},"查找聊天内容",-1)),e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.ArrowRight))]),_:1})]),e.createElementVNode("div",lr,[t[79]||(t[79]=e.createElementVNode("span",{class:"group-setting-label"},"消息免打扰",-1)),e.createVNode(Cn,{modelValue:pt.value,"onUpdate:modelValue":t[26]||(t[26]=H=>pt.value=H)},null,8,["modelValue"])]),t[83]||(t[83]=e.createElementVNode("div",{class:"group-divider"},null,-1)),e.unref(k).owner===e.unref(f)?(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=pe.value)==null?void 0:Nt.avatar,alt:(Ct=pe.value)==null?void 0:Ct.name,class:"chat-detail-avatar"},null,8,pr),e.createElementVNode("div",mr,e.toDisplayString((wt=pe.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(we,{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(D,{modelValue:e.unref(oe),"onUpdate:modelValue":t[27]||(t[27]=r=>e.isRef(oe)?oe.value=r:null),placeholder:"搜索用户","prefix-icon":e.unref(B.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",fr,[e.unref(ne)?(e.openBlock(),e.createBlock(P,{key:0,description:"加载中..."})):e.unref(ae).length===0?(e.openBlock(),e.createBlock(P,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(ae),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(L,{type:"primary",size:"small",onClick:W=>e.unref(G)(r)},{default:e.withCtx(()=>[...t[87]||(t[87]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(we,{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(L,{onClick:t[31]||(t[31]=r=>g.value=!1)},{default:e.withCtx(()=>[...t[91]||(t[91]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:cn,disabled:!e.unref(j).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(D,{modelValue:e.unref(j),"onUpdate:modelValue":t[29]||(t[29]=r=>e.isRef(j)?j.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(D,{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(P,{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(F).some(W=>W.id===r.id)?"member-selected":""]),onClick:W=>nn(r)},[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"member-avatar"},null,8,xr),e.createElementVNode("span",_r,e.toDisplayString(r.name),1),e.unref(F).some(W=>W.id===r.id)?(e.openBlock(),e.createBlock(m,{key:0,class:"member-check"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.CircleCheck))]),_:1})):e.createCommentVNode("",!0)],10,Er))),128))]))])])])]),_:1},8,["modelValue"]),e.unref(k)?(e.openBlock(),e.createBlock(we,{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(L,{onClick:t[34]||(t[34]=r=>w.value=!1)},{default:e.withCtx(()=>[...t[105]||(t[105]=[e.createTextVNode("关闭",-1)])]),_:1}),e.createVNode(L,{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",Mr,[e.createElementVNode("div",Sr,[t[93]||(t[93]=e.createElementVNode("span",{class:"info-label"},"群ID",-1)),e.createElementVNode("span",Ur,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(te).length),1)])]),e.unref(k).owner===e.unref(f)?(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(L,{type:"primary",size:"small",onClick:e.unref(Ko)},{default:e.withCtx(()=>[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Edit))]),_:1}),t[96]||(t[96]=e.createTextVNode("编辑群信息 ",-1))]),_:1},8,["onClick"]),e.createVNode(L,{type:"danger",size:"small",onClick:kt},{default:e.withCtx(()=>[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.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(L,{size:"small",onClick:t[33]||(t[33]=r=>b.value=!0)},{default:e.withCtx(()=>[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Plus))]),_:1}),t[99]||(t[99]=e.createTextVNode("邀请成员 ",-1))]),_:1})]),e.createElementVNode("div",Rr,[e.unref(te).length===0?(e.openBlock(),e.createBlock(P,{key:0,description:"暂无成员"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(e.unref(te),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(f)&&r.username!==e.unref(f)?(e.openBlock(),e.createElementBlock("div",qr,[e.createVNode(L,{size:"small",link:"",onClick:W=>e.unref(Ie)(r)},{default:e.withCtx(()=>[...t[101]||(t[101]=[e.createTextVNode(" 改昵称 ",-1)])]),_:1},8,["onClick"]),e.createVNode(L,{size:"small",link:"",type:"danger",onClick:W=>mn(r.username)},{default:e.withCtx(()=>[...t[102]||(t[102]=[e.createTextVNode(" 移除 ",-1)])]),_:1},8,["onClick"]),e.createVNode(L,{size:"small",link:"",type:"warning",onClick:W=>un(r.username)},{default:e.withCtx(()=>[...t[103]||(t[103]=[e.createTextVNode(" 转让 ",-1)])]),_:1},8,["onClick"])])):r.username===e.unref(f)?(e.openBlock(),e.createElementBlock("div",jr,[e.createVNode(L,{size:"small",link:"",onClick:W=>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(we,{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(L,{onClick:t[39]||(t[39]=r=>p.value=!1)},{default:e.withCtx(()=>[...t[107]||(t[107]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:fn},{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(D,{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(D,{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(D,{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(we,{key:3,modelValue:e.unref(A),"onUpdate:modelValue":t[43]||(t[43]=r=>e.isRef(A)?A.value=r:null),title:"编辑群昵称",width:"400px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(L,{onClick:t[42]||(t[42]=r=>A.value=!1)},{default:e.withCtx(()=>[...t[109]||(t[109]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:pn},{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(M).targetUsername),1)]),_:1}),e.createVNode(Se,{label:"群昵称"},{default:e.withCtx(()=>[e.createVNode(D,{modelValue:e.unref(M).memberNick,"onUpdate:modelValue":t[41]||(t[41]=r=>e.unref(M).memberNick=r),placeholder:"请输入群昵称"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.unref(k)?(e.openBlock(),e.createBlock(we,{key:4,modelValue:e.unref(R),"onUpdate:modelValue":t[45]||(t[45]=r=>e.isRef(R)?R.value=r:null),title:"消息已读状态",width:"500px","append-to-body":""},{footer:e.withCtx(()=>[e.createVNode(L,{onClick:t[44]||(t[44]=r=>R.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",Or,[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Check))]),_:1}),e.createTextVNode("已读 ("+e.toDisplayString(e.unref(Z).readUserList.length)+") ",1)]),e.createElementVNode("div",Jr,[e.unref(Z).readUserList.length===0?(e.openBlock(),e.createBlock(P,{key:0,description:"暂无已读成员"})):(e.openBlock(),e.createElementBlock("div",Qr,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Z).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",Zr,[e.createElementVNode("div",Pr,[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.Clock))]),_:1}),e.createTextVNode("未读 ("+e.toDisplayString(e.unref(Z).unreadUserList.length)+") ",1)]),e.createElementVNode("div",vr,[e.unref(Z).unreadUserList.length===0?(e.openBlock(),e.createBlock(P,{key:0,description:"全部已读"})):(e.openBlock(),e.createElementBlock("div",eo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Z).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(we,{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(L,{onClick:t[46]||(t[46]=r=>b.value=!1)},{default:e.withCtx(()=>[...t[112]||(t[112]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:dn,disabled:e.unref(I).length===0},{default:e.withCtx(()=>[e.createTextVNode(" 邀请 "+e.toDisplayString(e.unref(I).length)+" 人 ",1)]),_:1},8,["disabled"])]),default:e.withCtx(()=>[e.createElementVNode("div",to,[e.createElementVNode("div",ao,[e.unref(d).length===0?(e.openBlock(),e.createBlock(P,{key:0,description:"暂无好友可以邀请"})):(e.openBlock(),e.createElementBlock("div",so,[(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(I).some(W=>W.id===r.id)?"member-selected":""]),onClick:W=>ln(r)},[e.createElementVNode("img",{src:r.avatar,alt:r.name,class:"member-avatar"},null,8,oo),e.createElementVNode("span",no,e.toDisplayString(r.name),1),e.unref(I).some(W=>W.id===r.id)?(e.openBlock(),e.createBlock(m,{key:0,class:"member-check"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.CircleCheck))]),_:1})):e.createCommentVNode("",!0)],10,ro))),128))]))])])]),_:1},8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(we,{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",lo,[e.createElementVNode("div",io,[e.createElementVNode("div",co,[e.createElementVNode("img",{src:e.unref(T),alt:"头像",class:"chat-settings-avatar"},null,8,po),u.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:vo},[e.createVNode(m,{size:18,class:"chat-settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(B.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:Le,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:hn},null,544)]),e.createElementVNode("div",mo,[e.createElementVNode("div",uo,e.toDisplayString(e.unref(S).nickname||e.unref(f)),1),e.createElementVNode("div",fo,"@"+e.toDisplayString(e.unref(f)),1)])]),e.createElementVNode("div",ho,[e.createElementVNode("div",go,[e.createElementVNode("div",ko,[e.createVNode(m,null,{default:e.withCtx(()=>[e.createVNode(e.unref(B.UserFilled))]),_:1}),t[113]||(t[113]=e.createTextVNode(" 个人信息 ",-1))]),ye.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"primary",size:"small",onClick:yn,class:"chat-settings-edit-btn"},{default:e.withCtx(()=>[...t[114]||(t[114]=[e.createTextVNode(" 编辑 ",-1)])]),_:1}))]),e.createElementVNode("div",yo,[e.createElementVNode("div",Vo,[t[115]||(t[115]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),ye.value?(e.openBlock(),e.createBlock(D,{key:0,modelValue:fe.value.nickname,"onUpdate:modelValue":t[48]||(t[48]=r=>fe.value.nickname=r),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",No,e.toDisplayString(e.unref(S).nickname||"未设置"),1))]),e.createElementVNode("div",Co,[t[116]||(t[116]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),ye.value?(e.openBlock(),e.createBlock(D,{key:0,modelValue:fe.value.email,"onUpdate:modelValue":t[49]||(t[49]=r=>fe.value.email=r),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",wo,e.toDisplayString(e.unref(S).email||"未设置"),1))]),e.createElementVNode("div",bo,[t[117]||(t[117]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),ye.value?(e.openBlock(),e.createBlock(D,{key:0,modelValue:fe.value.phone,"onUpdate:modelValue":t[50]||(t[50]=r=>fe.value.phone=r),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Eo,e.toDisplayString(e.unref(S).phone||"未设置"),1))]),e.createElementVNode("div",xo,[t[118]||(t[118]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),ye.value?(e.openBlock(),e.createBlock(D,{key:0,modelValue:fe.value.bio,"onUpdate:modelValue":t[51]||(t[51]=r=>fe.value.bio=r),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",_o,e.toDisplayString(e.unref(S).bio||"这个人很懒,什么都没写~"),1))]),ye.value?(e.openBlock(),e.createElementBlock("div",Bo,[e.createVNode(L,{size:"default",onClick:Vn},{default:e.withCtx(()=>[...t[119]||(t[119]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",size:"default",loading:Je.value,onClick:Nn},{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:Qe.value,onConfirm:gn},null,8,["modelValue","src"]),Ce.value.visible?(e.openBlock(),e.createElementBlock("div",{key:6,class:"chat-context-menu",style:e.normalizeStyle({left:Ce.value.x+"px",top:Ce.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Oo},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-d3ae5bc1"]]),Mo={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 So(u={}){const a=st(Mo,u);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(u,a){const s={...u};for(const o in a)a[o]&&typeof a[o]=="object"&&!Array.isArray(a[o])?s[o]=st(u[o]||{},a[o]):s[o]=a[o];return s}const rt={install(u){u.component("ChatPanel",at),u.component("AvatarCrop",He)}};v.AvatarCrop=He,v.ChatApi=Ge,v.ChatPanel=at,v.ChatWebSocket=ve,v.HttpClient=et,v.VueChatKit=rt,v.createChatConfig=So,v.default=rt,v.useChat=tt,Object.defineProperties(v,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|