vue-chat-kit 0.2.1 → 0.3.1

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.
@@ -1 +1 @@
1
- (function(R,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):(R=typeof globalThis<"u"?globalThis:R||self,e(R.VueChatKit={},R.Vue,R.ElementPlusIconsVue,R.dayjs,R.ElementPlus))})(this,function(R,e,u,ze,A){"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="",I="",w=0){if(this.isConnected()){const U=JSON.stringify({to:t,msg:s,type:d,fileUrl:k,fileName:I,fileSize:w});return this.socket.send(U),!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 Fe extends Error{constructor(t,s,d,k){super(t),this.name="RequestError",this.status=s||0,this.code=d||0,this.data=k}}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 Fe("请求超时",408,408))},t)})}async request(t,s={}){const{method:d="GET",headers:k={},body:I,params:w}=s;let U=t.startsWith("http")?t:`${this.baseUrl}${t}`,x={method:d,headers:{...this.headers,...k},body:I,params:w};this.requestInterceptors.forEach(_=>{x=_(x)});const T={method:x.method,headers:x.headers,credentials:"include"};if(x.body&&d!=="GET"&&(x.body instanceof FormData?T.body=x.body:typeof x.body=="object"?T.body=JSON.stringify(x.body):T.body=x.body),x.params){const _=new URLSearchParams;for(const E in x.params)x.params[E]!==void 0&&x.params[E]!==null&&x.params[E]!==""&&_.append(E,x.params[E]);const h=_.toString();h&&(U+=(U.includes("?")?"&":"?")+h)}try{let h=await Promise.race([fetch(U,T),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(W=>{h=W(h)}),!h.ok)throw new Fe(`HTTP ${h.status}: ${h.statusText}`,h.status,h.status);const E=h.headers.get("content-type");let b;return E&&E.includes("application/json")?b=await h.json():b=await h.text(),b}catch(_){throw _ instanceof Fe?_:new Fe(_ instanceof Error?_.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 De{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 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:De,default:De},Symbol.toStringTag,{value:"Module"}));function Ie(g,t){const s=new De(g);let d=null;const k=g.user.username,I=e.ref(g.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${k}`),w=e.ref({username:k,nickname:g.user.nickname||"",email:g.user.email||"",phone:g.user.phone||"",bio:g.user.bio||""}),U=e.ref(!1),x=e.ref([]),T=e.ref([]),_=e.ref([]),h=e.ref(""),E=e.ref(""),b=e.ref(""),W=e.ref(null),se=e.ref(!1),G=e.ref(""),j=e.ref([]),X=e.ref(!1),oe=e.ref([]),y=e.ref(!1),B=e.computed(()=>{let n=T.value;if(E.value){const i=E.value.toLowerCase();n=n.filter(p=>{var V;return(V=p.username)==null?void 0:V.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||I.value,online:i.online,lastMsg:i.lastMsg||"暂无消息",lastTime:i.lastTime,unread:i.unReadNum||0}))}),S=e.computed(()=>{let n=x.value;if(E.value){const i=E.value.toLowerCase();n=n.filter(p=>{var V;return(V=p.username)==null?void 0:V.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||I.value,online:i.online,isChatting:i.isChatting}))}),H=e.computed(()=>G.value?j.value.filter(n=>{var i;return(i=n.username)==null?void 0:i.toLowerCase().includes(G.value.toLowerCase())}):j.value),ne=e.computed(()=>B.value.find(n=>n.id===h.value)||null),J=e.computed(()=>_.value.map(n=>{const i=n.type==="file"||n.fileUrl||n.fileName,p=n.fileName||n.msgContent;return{text:n.msgContent,isSelf:n.sendUsername===k,time:n.createTime,sendUsername:n.sendUsername,type:i?"file":"text",fileType:me(p)?"image":ie(p),fileUrl:n.fileUrl||"",fileName:p,fileSize:n.fileSize||0}})),re=n=>ze(n).format("HH:mm"),de=n=>{if(!n)return"";const i=ze(),p=ze(n);return i.isSame(p,"day")?p.format("HH:mm"):i.diff(p,"day")===1?"昨天":i.diff(p,"day")<7?["周日","周一","周二","周三","周四","周五","周六"][p.day()]:p.format("MM/DD")},me=n=>{if(!n)return!1;const i=["jpg","jpeg","png","gif","bmp","webp","svg"],p=n.split(".").pop().toLowerCase();return i.includes(p)},ie=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"},Q=()=>{e.nextTick(()=>{W.value&&(W.value.scrollTop=W.value.scrollHeight)})},Z=async()=>{try{const i=(await s.getFriends(k)).data||[];x.value=i,T.value=i.filter(p=>p.isChatting===1);for(const p of T.value)try{const Y=(await s.getHistory(k,p.username)).data||[];p.unReadNum=Y.filter(F=>F.isRead===0&&F.sendUsername===p.username).length}catch{p.unReadNum=0}}catch(n){console.error("[VueChatKit] 获取好友列表失败",n)}},ce=async n=>{try{const i=await s.getHistory(k,n);_.value=i.data||[],Q()}catch(i){console.error("[VueChatKit] 获取聊天历史失败",i)}},_e=async n=>{try{await s.setRead(k,n),Z()}catch(i){console.error("[VueChatKit] 标记已读失败",i)}},Ve=async n=>{h.value=n.id,await ce(n.id),await _e(n.id),Q()},ke=async(n,i=1)=>{try{return await s.setChatStatus(k,n,i),await Z(),!0}catch(p){return console.error("[VueChatKit] 设置聊天状态失败",p),!1}},ye=()=>{if(!b.value.trim()||!h.value||!d)return;if(d.send(h.value,b.value.trim(),"text")){const i={msgContent:b.value.trim(),sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"text"};_.value.push(i),b.value="",Q(),setTimeout(()=>{ce(h.value),Z()},300)}},pe=async n=>{if(!h.value||!d)return!1;try{const i=await s.uploadFile(n);if(i.code===200&&i.data){const{fileUrl:p,fileName:V}=i.data;if(d.send(h.value,V,"file",p,V,n.size)){const F={msgContent:V,sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"file",fileUrl:p,fileName:V,fileSize:n.size};return _.value.push(F),Q(),!0}}return!1}catch(i){return console.error("[VueChatKit] 发送文件失败",i),!1}},Ne=async(n,i)=>{if(!(!h.value||!d)){if(i&&i.trim()&&d.send(h.value,i.trim(),"text")){const V={msgContent:i.trim(),sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"text"};_.value.push(V)}for(const p of n){const V=p.file||p;await pe(V)}setTimeout(()=>{ce(h.value),Z()},300)}},Ee=n=>{try{try{const p=JSON.parse(n);if(p.to||p.msg)return{to:p.to,content:p.msg,type:p.type||"text",fileUrl:p.fileUrl||"",fileName:p.fileName||"",fileSize:p.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},Ce=n=>{if(n.includes("【状态变更】")){const p=/【状态变更】(.+?) 已(上线|下线)/,V=n.match(p);if(V){const Y=V[1],F=V[2]==="上线",D=x.value.find(te=>te.username===Y);D&&(D.online=F)}return}const i=Ee(n);if(i){const p={content:i.content,username:i.username||h.value,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0,timestamp:new Date};if(h.value){try{let V={msgContent:i.content,sendUsername:p.username,receiveUsername:k,createTime:new Date,isRead:0,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0};_.value.push(V),Q()}catch(V){console.error("[VueChatKit] 添加临时消息失败",V)}ce(h.value)}Z(),t&&typeof t=="function"&&t(p)}},we=()=>{const n=`${g.api.websocketUrl}?userId=${k}`;d=new ve(k,{wsUrl:n,maxReconnectAttempts:g.websocket.maxReconnectAttempts,reconnectDelay:g.websocket.reconnectDelay}),d.on("message",Ce),d.connect()},be=()=>{d&&(d.close(),d=null)},Be=async()=>{se.value=!0,G.value="",await ee()},ee=async()=>{X.value=!0;try{const n=await s.getAvailableUsers(k);j.value=(n==null?void 0:n.data)||[]}catch(n){console.error("[VueChatKit] 获取可用用户失败",n)}finally{X.value=!1}},O=async n=>{try{await s.addFriend(k,n.username),await Z(),se.value=!1}catch(i){console.error("[VueChatKit] 添加好友失败",i)}},z=async()=>{y.value=!0;try{const n=await s.getApplyList(k);oe.value=n.data||[]}catch(n){console.error("[VueChatKit] 获取好友申请列表失败",n)}finally{y.value=!1}},C=async n=>{try{await s.agreeFriend(n,k),await z(),await Z()}catch(i){console.error("[VueChatKit] 同意好友申请失败",i)}},M=async()=>{try{const n=await s.getUserAvatar(k);n.code===200&&n.data&&(I.value=n.data)}catch(n){console.warn("[VueChatKit] 加载头像失败",n)}},L=n=>{I.value=n},$=async()=>{U.value=!0;try{const n=await s.getUserInfo(k);n.code===200&&n.data&&(w.value={...w.value,...n.data})}catch(n){console.error("[VueChatKit] 获取用户信息失败",n)}finally{U.value=!1}},q=async n=>{try{return(await s.updateUserInfo(k,n)).code===200?(w.value={...w.value,...n},!0):!1}catch(i){return console.error("[VueChatKit] 更新用户信息失败",i),!1}},le=()=>{h.value="",_.value=[],b.value="",E.value=""};return M(),{myUsername:k,myAvatar:I,userInfo:w,loadingUserInfo:U,friendList:x,chatList:T,filteredFriendList:S,chatMsgList:_,currentSelectName:h,searchText:E,inputText:b,messagesContainer:W,filteredUsers:B,filteredAvailableUsers:H,currentUser:ne,currentMessages:J,addFriendDialogVisible:se,addFriendSearchText:G,availableUsers:j,loadingAvailableUsers:X,friendApplyList:oe,loadingFriendApply:y,formatTime:re,formatLastTime:de,scrollToBottom:Q,getFriendList:Z,getChatHistory:ce,setFriendToChatStatus:ke,selectUser:Ve,sendMessage:ye,sendFile:pe,sendFilesAndText:Ne,initWebSocket:we,closeWebSocket:be,reset:le,openAddFriendDialog:Be,addFriend:O,loadFriendApplyList:z,agreeFriend:C,updateMyAvatar:L,getUserInfo:$,updateUserInfo:q}}const Te=(g,t)=>{const s=g.__vccOpts||g;for(const[d,k]of t)s[d]=k;return s},nt={class:"avatar-crop-container"},lt=["src"],ot={class:"crop-overlay"},rt={class:"crop-box"},it={key:0,class:"crop-mask"},ct={class:"zoom-controls"},Me=Te({__name:"AvatarCrop",props:{modelValue:{type:Boolean,default:!1},src:{type:String,default:""}},emits:["update:modelValue","confirm"],setup(g,{emit:t}){const s=g,d=t,k=e.computed({get:()=>s.modelValue,set:y=>d("update:modelValue",y)}),I=e.ref(""),w=e.ref(null),U=e.ref(null),x=e.ref(null),T=e.ref(1),_=e.ref({x:0,y:0}),h=e.ref(!1),E=e.ref({x:0,y:0}),b=e.ref({width:0,height:0});e.watch(()=>s.src,y=>{y&&(I.value=y,T.value=1,_.value={x:0,y:0})});const W=()=>{e.nextTick(()=>{if(w.value&&U.value){const y=w.value,B=U.value,S=Math.min(B.clientWidth,B.clientHeight);y.naturalWidth>y.naturalHeight?(b.value.height=S,b.value.width=y.naturalWidth/y.naturalHeight*S):(b.value.width=S,b.value.height=y.naturalHeight/y.naturalWidth*S),_.value={x:(S-b.value.width)/2,y:(S-b.value.height)/2}}})},se=y=>{h.value=!0;const B=y.touches?y.touches[0].clientX:y.clientX,S=y.touches?y.touches[0].clientY:y.clientY;E.value={x:B-_.value.x,y:S-_.value.y},document.addEventListener("mousemove",G),document.addEventListener("mouseup",j),document.addEventListener("touchmove",G),document.addEventListener("touchend",j)},G=y=>{if(!h.value)return;const B=y.touches?y.touches[0].clientX:y.clientX,S=y.touches?y.touches[0].clientY:y.clientY;_.value={x:B-E.value.x,y:S-E.value.y}},j=()=>{h.value=!1,document.removeEventListener("mousemove",G),document.removeEventListener("mouseup",j),document.removeEventListener("touchmove",G),document.removeEventListener("touchend",j)},X=()=>{const y=document.createElement("canvas"),B=y.getContext("2d"),S=200;y.width=S,y.height=S;const H=w.value,ne=x.value,J=U.value;if(H&&ne&&J){const re=ne.getBoundingClientRect(),de=J.getBoundingClientRect(),me=(re.left-de.left-_.value.x)/T.value,ie=(re.top-de.top-_.value.y)/T.value,Q=re.width/T.value;B.drawImage(H,me*(H.naturalWidth/b.value.width),ie*(H.naturalHeight/b.value.height),Q*(H.naturalWidth/b.value.width),Q*(H.naturalHeight/b.value.height),0,0,S,S),y.toBlob(Z=>{d("confirm",{file:Z,url:y.toDataURL("image/png")}),k.value=!1},"image/png")}},oe=()=>{I.value="",T.value=1,_.value={x:0,y:0}};return(y,B)=>{const S=e.resolveComponent("el-slider"),H=e.resolveComponent("el-button"),ne=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(ne,{modelValue:k.value,"onUpdate:modelValue":B[2]||(B[2]=J=>k.value=J),title:"裁剪头像",width:"500px","close-on-click-modal":!1,onClosed:oe},{footer:e.withCtx(()=>[e.createVNode(H,{onClick:B[1]||(B[1]=J=>k.value=!1)},{default:e.withCtx(()=>[...B[3]||(B[3]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(H,{type:"primary",onClick:X},{default:e.withCtx(()=>[...B[4]||(B[4]=[e.createTextVNode("确定",-1)])]),_:1})]),default:e.withCtx(()=>[e.createElementVNode("div",nt,[e.createElementVNode("div",{class:"crop-area",ref_key:"cropAreaRef",ref:U},[e.createElementVNode("img",{src:I.value,ref_key:"imageRef",ref:w,class:"crop-image",onLoad:W,onMousedown:se,onTouchstart:se},null,40,lt),e.createElementVNode("div",ot,[e.createElementVNode("div",rt,[e.createElementVNode("div",{class:"crop-border",ref_key:"cropBoxRef",ref:x},null,512)])]),h.value?(e.openBlock(),e.createElementBlock("div",it)):e.createCommentVNode("",!0)],512),e.createElementVNode("div",ct,[e.createVNode(S,{modelValue:T.value,"onUpdate:modelValue":B[0]||(B[0]=J=>T.value=J),min:.5,max:3,step:.1,"show-tooltip":!1},null,8,["modelValue"])])])]),_:1},8,["modelValue"])}}},[["__scopeId","data-v-4e4a992b"]]),dt={class:"chat-panel"},mt={class:"chat-sidebar"},pt=["src"],ft=["onClick"],ht={key:0,class:"sidebar-nav-badge"},gt={class:"chat-content-panel"},kt={class:"chat-search-bar"},yt={class:"chat-content-scroll"},ut={key:0},_t=["onClick","onContextmenu"],Vt={class:"chat-list-avatar-wrapper"},Nt=["src","alt"],Et={key:0,class:"chat-list-online-indicator"},Ct={class:"chat-list-info"},wt={class:"chat-list-header"},bt={class:"chat-list-name"},Bt={class:"chat-list-time"},xt={class:"chat-list-preview"},Ut={class:"chat-list-last-msg"},St={key:0,class:"chat-list-unread"},$t={key:1},Ft={class:"add-friend-section"},Dt={class:"add-friend-icon"},At=["onClick"],zt={class:"chat-list-avatar-wrapper"},It=["src","alt"],Tt={class:"chat-list-info"},Mt={class:"chat-list-name"},Rt={key:2},Lt={class:"friend-request-info"},qt=["src","alt"],Kt={class:"friend-request-details"},Wt={class:"friend-request-username"},jt={class:"chat-main-area"},Ht={key:0,class:"friend-profile-area"},Ot=["src","alt"],Pt={class:"profile-name"},Xt={class:"profile-status"},Yt={key:1,class:"chat-window-area"},Gt={class:"chat-window-header"},Jt={class:"chat-window-title"},Qt={class:"chat-window-name"},Zt={class:"chat-window-actions"},vt={class:"message-avatar"},ea=["src"],ta={key:0,class:"message-sender-name"},aa={class:"message-bubble-wrapper"},sa=["onClick"],na=["src","alt"],la={key:0,class:"message-image-size"},oa=["onClick"],ra={class:"message-file-content"},ia={class:"message-file-icon"},ca={class:"message-file-info"},da={class:"message-file-name"},ma={class:"message-file-meta"},pa={key:0},fa={class:"chat-input-area"},ha={key:0,class:"pending-files-area"},ga={key:0,class:"pending-image-wrapper"},ka=["src","alt"],ya=["onClick"],ua={key:1,class:"pending-file-wrapper"},_a={class:"pending-file-name"},Va=["onClick"],Na={key:1,class:"input-toolbar"},Ea={class:"input-textarea-wrapper"},Ca=["onKeydown"],wa={class:"input-send-wrapper"},ba={key:2,class:"chat-empty-state"},Ba={class:"empty-state-text"},xa={key:0,class:"chat-detail-panel"},Ua={class:"chat-detail-content"},Sa={class:"chat-detail-profile"},$a=["src","alt"],Fa={class:"chat-detail-name"},Da={class:"add-friend-search-wrapper"},Aa={class:"add-friend-users-list"},za={class:"add-friend-user-info"},Ia=["src","alt"],Ta={class:"add-friend-user-name"},Ma={class:"chat-settings-container"},Ra={class:"chat-settings-avatar-section"},La={class:"chat-settings-avatar-wrapper"},qa=["src"],Ka={class:"chat-settings-user-display"},Wa={class:"chat-settings-nickname"},ja={class:"chat-settings-username"},Ha={class:"chat-settings-form-section"},Oa={class:"chat-settings-form-header"},Pa={class:"chat-settings-form-title"},Xa={class:"chat-settings-form"},Ya={class:"chat-settings-form-item"},Ga={key:1,class:"chat-settings-form-value"},Ja={class:"chat-settings-form-item"},Qa={key:1,class:"chat-settings-form-value"},Za={class:"chat-settings-form-item"},va={key:1,class:"chat-settings-form-value"},es={class:"chat-settings-form-item"},ts={key:1,class:"chat-settings-form-value bio-value"},as={key:0,class:"chat-settings-form-actions"},ss=Te({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(g,{emit:t}){const s=g,d=t,{myUsername:k,myAvatar:I,userInfo:w,loadingUserInfo:U,friendList:x,filteredFriendList:T,searchText:_,inputText:h,messagesContainer:E,filteredUsers:b,filteredAvailableUsers:W,currentUser:se,currentMessages:G,addFriendDialogVisible:j,addFriendSearchText:X,availableUsers:oe,loadingAvailableUsers:y,friendApplyList:B,loadingFriendApply:S,formatTime:H,formatLastTime:ne,scrollToBottom:J,getFriendList:re,getChatHistory:de,setFriendToChatStatus:me,selectUser:ie,sendMessage:Q,sendFile:Z,sendFilesAndText:ce,initWebSocket:_e,closeWebSocket:Ve,reset:ke,openAddFriendDialog:ye,addFriend:pe,loadFriendApplyList:Ne,agreeFriend:Ee,updateMyAvatar:Ce,getUserInfo:we,updateUserInfo:be}=Ie(s.config,m=>{d("message",m)}),Be=e.computed(()=>{var r;const m=[{id:"chat",icon:u.ChatDotRound,badge:0}];return s.config.modules.friends&&m.push({id:"friends",icon:u.UserFilled,badge:0}),s.config.modules.apply&&m.push({id:"apply",icon:u.Bell,badge:((r=B.value)==null?void 0:r.length)||0}),m}),ee=e.ref("chat"),O=e.ref(null),z=e.ref(null),C=e.ref(null),M=e.ref(!1),L=e.ref(!1),$=e.ref({nickname:"",email:"",phone:"",bio:""}),q=e.ref(!1),le=e.ref(!1),n=e.ref(!1),i=e.ref(!1),p=e.ref(null),V=e.ref(""),Y=e.ref(null),F=e.ref([]),D=e.ref({visible:!1,x:0,y:0,chat:null}),te=(m,r)=>{m.preventDefault(),m.stopPropagation(),D.value={visible:!0,x:m.clientX,y:m.clientY,chat:r}},fe=()=>{D.value.visible=!1},Re=async()=>{if(!D.value.chat)return;await me(D.value.chat.id,0)&&O.value===D.value.chat.id&&(O.value=null,z.value=null),fe()},he=m=>{O.value=m.id,z.value=m,C.value=null,M.value=!1,ie({id:m.id,name:m.name,avatar:m.avatar,online:m.online})},Le=m=>{C.value=m,O.value=null,z.value=null},qe=async()=>{if(!C.value)return;if(await me(C.value.id)){ee.value="chat",await e.nextTick();const r=b.value.find(c=>c.id===C.value.id);r&&he(r),C.value=null}},Ke=()=>{le.value=!0},We=()=>{var m;(m=p.value)==null||m.click()},je=()=>{var m;(m=Y.value)==null||m.click()},He=m=>{const r=Array.from(m.target.files||[]);if(r.length!==0){for(const c of r){if(c.size>50*1024*1024){A.ElMessage.warning(`文件 ${c.name} 超过50MB,已跳过`);continue}const a=URL.createObjectURL(c);F.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/")})}Y.value&&(Y.value.value="")}},xe=m=>{const r=F.value[m];r.previewUrl&&URL.revokeObjectURL(r.previewUrl),F.value.splice(m,1)},Ue=m=>{if(m===0)return"0 B";const r=1024,c=["B","KB","MB","GB"],a=Math.floor(Math.log(m)/Math.log(r));return parseFloat((m/Math.pow(r,a)).toFixed(2))+" "+c[a]},Se=async()=>{if(!h.value.trim()&&F.value.length===0)return;const m=[...F.value],r=h.value;h.value="",F.value.forEach(c=>{c.previewUrl&&URL.revokeObjectURL(c.previewUrl)}),F.value=[],await ce(m,r),d("send",{text:r,files:m})},Oe=m=>{var c;const r=(c=m.clipboardData)==null?void 0:c.items;if(r){for(const a of r)if(a.kind==="file"){const f=a.getAsFile();if(f){if(f.size>50*1024*1024){A.ElMessage.warning(`文件 ${f.name} 超过50MB,已跳过`);continue}const N=URL.createObjectURL(f);F.value.push({id:Date.now()+Math.random(),file:f,name:f.name,size:f.size,type:f.type,previewUrl:N,isImage:f.type.startsWith("image/")})}}}},$e=m=>{if(!m){A.ElMessage.warning("文件地址无效");return}window.open(m,"_blank")},Pe=m=>{console.warn("图片加载失败",m)},Xe=m=>{const r=m.target.files[0];if(!r)return;if(!r.type.startsWith("image/")){A.ElMessage.error("只能上传图片文件");return}if(r.size>5*1024*1024){A.ElMessage.error("图片大小不能超过 5MB");return}const c=new FileReader;c.onload=a=>{V.value=a.target.result,n.value=!0},c.readAsDataURL(r)},Ye=async({file:m})=>{if(m){i.value=!0;try{const{ChatApi:r}=await Promise.resolve().then(()=>tt),a=await new r(s.config).uploadAvatar(m,k);a.code===200?(A.ElMessage.success("头像上传成功"),Ce(a.data),Ae()):A.ElMessage.error(a.msg||"头像上传失败")}catch(r){console.error(r),A.ElMessage.error("头像上传失败")}finally{i.value=!1}}},Ae=()=>{V.value="",n.value=!1,p.value&&(p.value.value="")},Ge=()=>{$.value={nickname:w.value.nickname||"",email:w.value.email||"",phone:w.value.phone||"",bio:w.value.bio||""},L.value=!0},Je=()=>{L.value=!1,$.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{q.value=!0;try{await be($.value)?(A.ElMessage.success("保存成功"),L.value=!1):A.ElMessage.error("保存失败")}catch(m){console.error(m),A.ElMessage.error("保存失败")}finally{q.value=!1}};return e.onMounted(async()=>{await Promise.all([re(),Ne(),we()]),_e(),b.value.length>0&&he(b.value[0]),d("init"),document.addEventListener("click",fe)}),e.onUnmounted(()=>{ke(),Ve(),document.removeEventListener("click",fe)}),(m,r)=>{var v,ue,ge;const c=e.resolveComponent("el-icon"),a=e.resolveComponent("el-input"),f=e.resolveComponent("el-empty"),N=e.resolveComponent("el-button"),K=e.resolveComponent("el-dialog");return e.openBlock(),e.createElementBlock("div",dt,[e.createElementVNode("div",mt,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Ke},[e.createElementVNode("img",{src:e.unref(I),alt:"头像",class:"sidebar-avatar-img"},null,8,pt)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Be.value,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["sidebar-nav-item",ee.value===o.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:P=>ee.value=o.id},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.icon)))]),_:2},1024),o.badge?(e.openBlock(),e.createElementBlock("span",ht,e.toDisplayString(o.badge>99?"99+":o.badge),1)):e.createCommentVNode("",!0)],10,ft))),128)),r[13]||(r[13]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"sidebar-nav-item sidebar-nav-item-inactive",onClick:r[0]||(r[0]=o=>le.value=!0),title:"设置"},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",gt,[e.createElementVNode("div",kt,[e.createVNode(a,{modelValue:e.unref(_),"onUpdate:modelValue":r[1]||(r[1]=o=>e.isRef(_)?_.value=o:null),placeholder:"搜索","prefix-icon":e.unref(u.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",yt,[ee.value==="chat"?(e.openBlock(),e.createElementBlock("div",ut,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(b),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["chat-list-item",O.value===o.id?"chat-list-item-active":""]),onClick:P=>he(o),onContextmenu:e.withModifiers(P=>te(P,o),["prevent","stop"])},[e.createElementVNode("div",Vt,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,Nt),o.online?(e.openBlock(),e.createElementBlock("span",Et)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ct,[e.createElementVNode("div",wt,[e.createElementVNode("span",bt,e.toDisplayString(o.name),1),e.createElementVNode("span",Bt,e.toDisplayString(e.unref(ne)(o.lastTime)),1)]),e.createElementVNode("div",xt,[e.createElementVNode("span",Ut,e.toDisplayString(o.lastMsg),1),o.unread>0?(e.openBlock(),e.createElementBlock("span",St,e.toDisplayString(o.unread>99?"99+":o.unread),1)):e.createCommentVNode("",!0)])])],42,_t))),128))])):e.createCommentVNode("",!0),ee.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",$t,[e.createElementVNode("div",Ft,[e.createElementVNode("div",{class:"add-friend-btn",onClick:r[2]||(r[2]=(...o)=>e.unref(ye)&&e.unref(ye)(...o))},[e.createElementVNode("div",Dt,[e.createVNode(c,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(u.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(T),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"chat-list-item",onClick:P=>Le(o)},[e.createElementVNode("div",zt,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,It),e.createElementVNode("span",{class:e.normalizeClass(["chat-list-online-indicator",o.online?"chat-list-online":"chat-list-offline"])},null,2)]),e.createElementVNode("div",Tt,[e.createElementVNode("span",Mt,e.toDisplayString(o.name),1)])],8,At))),128))])):e.createCommentVNode("",!0),ee.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Rt,[e.unref(S)?(e.openBlock(),e.createBlock(f,{key:0,description:"加载中..."})):e.unref(B).length===0?(e.openBlock(),e.createBlock(f,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(B),o=>(e.openBlock(),e.createElementBlock("div",{key:o.applyUser||o.id,class:"friend-request-item"},[e.createElementVNode("div",Lt,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.applyUser}`,alt:o.applyUser,class:"friend-request-avatar"},null,8,qt),e.createElementVNode("div",Kt,[e.createElementVNode("div",Wt,e.toDisplayString(o.applyUser),1),r[15]||(r[15]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(N,{type:"primary",size:"small",onClick:P=>e.unref(Ee)(o.applyUser)},{default:e.withCtx(()=>[...r[16]||(r[16]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",jt,[C.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Ht,[e.createElementVNode("img",{src:C.value.avatar,alt:C.value.name,class:"profile-avatar"},null,8,Ot),e.createElementVNode("div",Pt,e.toDisplayString(C.value.name),1),e.createElementVNode("div",Xt,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",C.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(C.value.online?"在线":"离线"),1)]),e.createVNode(N,{type:"primary",size:"large",onClick:qe,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),r[17]||(r[17]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),z.value?(e.openBlock(),e.createElementBlock("div",Yt,[e.createElementVNode("div",Gt,[e.createElementVNode("div",Jt,[e.createElementVNode("span",Qt,e.toDisplayString(z.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["chat-window-status",z.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString(z.value.online?"在线":"离线"),3)]),e.createElementVNode("div",Zt,[e.createVNode(c,{class:"chat-action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Search))]),_:1}),e.createVNode(c,{class:"chat-action-icon",onClick:r[3]||(r[3]=o=>M.value=!M.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:E,class:"chat-messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(G),(o,P)=>(e.openBlock(),e.createElementBlock("div",{key:P,class:e.normalizeClass(["message-wrapper",o.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",vt,[e.createElementVNode("img",{src:o.isSelf?e.unref(I):z.value.avatar,class:"message-avatar-img"},null,8,ea)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content",o.isSelf?"message-content-self":"message-content-other"])},[o.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ta,e.toDisplayString(z.value.name),1)),e.createElementVNode("div",aa,[o.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"])},e.toDisplayString(o.text),3)):o.type==="file"&&o.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","message-image-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:l=>$e(o.fileUrl)},[e.createElementVNode("img",{src:o.fileUrl,alt:o.fileName,class:"message-image",onError:Pe},null,40,na),o.fileSize?(e.openBlock(),e.createElementBlock("div",la,e.toDisplayString(Ue(o.fileSize)),1)):e.createCommentVNode("",!0)],10,sa)):o.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","message-file-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:l=>$e(o.fileUrl)},[e.createElementVNode("div",ra,[e.createElementVNode("div",ia,[e.createVNode(c,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Document))]),_:1})]),e.createElementVNode("div",ca,[e.createElementVNode("div",da,e.toDisplayString(o.fileName||o.text),1),e.createElementVNode("div",ma,[e.createVNode(c,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Download))]),_:1}),r[18]||(r[18]=e.createElementVNode("span",null,"点击下载",-1)),o.fileSize?(e.openBlock(),e.createElementBlock("span",pa,"· "+e.toDisplayString(Ue(o.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,oa)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",o.isSelf?"message-time-right":"message-time-left"])},e.toDisplayString(e.unref(H)(o.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",fa,[F.value.length>0?(e.openBlock(),e.createElementBlock("div",ha,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.value,(o,P)=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"pending-file-item"},[o.isImage?(e.openBlock(),e.createElementBlock("div",ga,[e.createElementVNode("img",{src:o.previewUrl,alt:o.name,class:"pending-image"},null,8,ka),e.createElementVNode("button",{onClick:l=>xe(P),class:"pending-file-remove-btn"}," × ",8,ya)])):(e.openBlock(),e.createElementBlock("div",ua,[e.createVNode(c,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createElementVNode("span",_a,e.toDisplayString(o.name),1),e.createElementVNode("button",{onClick:l=>xe(P),class:"pending-file-remove-btn"}," × ",8,Va)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Na,[e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon",onClick:je},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",Ea,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":r[4]||(r[4]=o=>e.isRef(h)?h.value=o:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Oe,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,Ca),[[e.vModelText,e.unref(h)]])]),e.createElementVNode("div",wa,[e.createVNode(N,{type:"primary",disabled:!e.unref(h).trim()&&F.value.length===0,onClick:Se,class:"send-message-btn"},{default:e.withCtx(()=>[...r[19]||(r[19]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:Y,type:"file",multiple:"",class:"hidden-file-input",onChange:He},null,544)])])):C.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ba,[e.createVNode(c,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatLineRound))]),_:1}),e.createElementVNode("div",Ba,e.toDisplayString(ee.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),M.value?(e.openBlock(),e.createElementBlock("div",xa,[r[21]||(r[21]=e.createElementVNode("div",{class:"chat-detail-header"},"聊天详情",-1)),e.createElementVNode("div",Ua,[e.createElementVNode("div",Sa,[e.createElementVNode("img",{src:(v=z.value)==null?void 0:v.avatar,alt:(ue=z.value)==null?void 0:ue.name,class:"chat-detail-avatar"},null,8,$a),e.createElementVNode("div",Fa,e.toDisplayString((ge=z.value)==null?void 0:ge.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(K,{modelValue:e.unref(j),"onUpdate:modelValue":r[6]||(r[6]=o=>e.isRef(j)?j.value=o:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Da,[e.createVNode(a,{modelValue:e.unref(X),"onUpdate:modelValue":r[5]||(r[5]=o=>e.isRef(X)?X.value=o:null),placeholder:"搜索用户","prefix-icon":e.unref(u.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",Aa,[e.unref(y)?(e.openBlock(),e.createBlock(f,{key:0,description:"加载中..."})):e.unref(W).length===0?(e.openBlock(),e.createBlock(f,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(W),o=>(e.openBlock(),e.createElementBlock("div",{key:o.username,class:"add-friend-user-item"},[e.createElementVNode("div",za,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.username}`,alt:o.username,class:"add-friend-user-avatar"},null,8,Ia),e.createElementVNode("div",Ta,e.toDisplayString(o.username),1)]),e.createVNode(N,{type:"primary",size:"small",onClick:P=>e.unref(pe)(o)},{default:e.withCtx(()=>[...r[22]||(r[22]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(K,{modelValue:le.value,"onUpdate:modelValue":r[11]||(r[11]=o=>le.value=o),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"chat-settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",Ma,[e.createElementVNode("div",Ra,[e.createElementVNode("div",La,[e.createElementVNode("img",{src:e.unref(I),alt:"头像",class:"chat-settings-avatar"},null,8,qa),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:We},[e.createVNode(c,{size:18,class:"chat-settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:p,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Xe},null,544)]),e.createElementVNode("div",Ka,[e.createElementVNode("div",Wa,e.toDisplayString(e.unref(w).nickname||e.unref(k)),1),e.createElementVNode("div",ja,"@"+e.toDisplayString(e.unref(k)),1)])]),e.createElementVNode("div",Ha,[e.createElementVNode("div",Oa,[e.createElementVNode("div",Pa,[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.UserFilled))]),_:1}),r[23]||(r[23]=e.createTextVNode(" 个人信息 ",-1))]),L.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(N,{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",Xa,[e.createElementVNode("div",Ya,[r[25]||(r[25]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.nickname,"onUpdate:modelValue":r[7]||(r[7]=o=>$.value.nickname=o),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Ga,e.toDisplayString(e.unref(w).nickname||"未设置"),1))]),e.createElementVNode("div",Ja,[r[26]||(r[26]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.email,"onUpdate:modelValue":r[8]||(r[8]=o=>$.value.email=o),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Qa,e.toDisplayString(e.unref(w).email||"未设置"),1))]),e.createElementVNode("div",Za,[r[27]||(r[27]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.phone,"onUpdate:modelValue":r[9]||(r[9]=o=>$.value.phone=o),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",va,e.toDisplayString(e.unref(w).phone||"未设置"),1))]),e.createElementVNode("div",es,[r[28]||(r[28]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.bio,"onUpdate:modelValue":r[10]||(r[10]=o=>$.value.bio=o),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ts,e.toDisplayString(e.unref(w).bio||"这个人很懒,什么都没写~"),1))]),L.value?(e.openBlock(),e.createElementBlock("div",as,[e.createVNode(N,{size:"default",onClick:Je},{default:e.withCtx(()=>[...r[29]||(r[29]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(N,{type:"primary",size:"default",loading:q.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]=o=>n.value=o),src:V.value,onConfirm:Ye},null,8,["modelValue","src"]),D.value.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-context-menu",style:e.normalizeStyle({left:D.value.x+"px",top:D.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Re},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-f5908195"]]),ns={class:"chat-container"},ls={class:"sidebar-nav"},os=["src"],rs=["onClick"],is={key:0,class:"nav-badge"},cs={class:"content-panel"},ds={class:"search-bar"},ms={class:"content-scroll"},ps={key:0},fs=["onClick","onContextmenu"],hs={class:"friend-avatar-wrapper"},gs=["src","alt"],ks={key:0,class:"online-indicator"},ys={class:"friend-info"},us={class:"friend-header"},_s={class:"friend-name"},Vs={class:"last-time"},Ns={class:"friend-preview"},Es={class:"last-msg"},Cs={key:0,class:"unread-badge"},ws={key:1},bs={class:"add-friend-section"},Bs={class:"add-friend-icon"},xs=["onClick"],Us={class:"friend-avatar-wrapper"},Ss=["src","alt"],$s={class:"friend-info"},Fs={class:"friend-name"},Ds={key:2},As={class:"request-info"},zs=["src","alt"],Is={class:"request-details"},Ts={class:"request-username"},Ms={class:"chat-area"},Rs={key:0,class:"friend-profile"},Ls=["src","alt"],qs={class:"profile-name"},Ks={class:"profile-status"},Ws={key:1,class:"chat-window"},js={class:"chat-header"},Hs={class:"chat-title"},Os={class:"chat-name"},Ps={class:"chat-actions"},Xs={class:"message-avatar"},Ys=["src"],Gs={key:0,class:"sender-name"},Js={class:"message-bubble-wrapper"},Qs=["onClick"],Zs=["src","alt"],vs={key:0,class:"image-size"},en=["onClick"],tn={class:"file-content"},an={class:"file-icon"},sn={class:"file-info"},nn={class:"file-name"},ln={class:"file-meta"},on={key:0},rn={class:"input-area"},cn={key:0,class:"pending-files"},dn={key:0,class:"pending-image-wrapper"},mn=["src","alt"],pn=["onClick"],fn={key:1,class:"pending-file-wrapper"},hn={class:"pending-file-name"},gn=["onClick"],kn={key:1,class:"input-actions"},yn={class:"input-wrapper"},un=["onKeydown"],_n={class:"send-btn-wrapper"},Vn={key:2,class:"empty-state"},Nn={class:"empty-text"},En={key:0,class:"detail-panel"},Cn={class:"detail-content"},wn={class:"detail-profile"},bn=["src","alt"],Bn={class:"detail-name"},xn={class:"search-users-wrapper"},Un={class:"search-users-input"},Sn={class:"users-list-scroll"},$n={class:"available-user-info"},Fn=["src","alt"],Dn={class:"available-user-name"},An={class:"settings-container"},zn={class:"settings-avatar-section"},In={class:"settings-avatar-wrapper"},Tn=["src"],Mn={class:"settings-user-display"},Rn={class:"settings-nickname"},Ln={class:"settings-username"},qn={class:"settings-form-section"},Kn={class:"settings-form-header"},Wn={class:"settings-form-title"},jn={class:"settings-form"},Hn={class:"settings-form-item"},On={key:1,class:"settings-form-value"},Pn={class:"settings-form-item"},Xn={key:1,class:"settings-form-value"},Yn={class:"settings-form-item"},Gn={key:1,class:"settings-form-value"},Jn={class:"settings-form-item"},Qn={key:1,class:"settings-form-value bio-value"},Zn={key:0,class:"settings-form-actions"},vn=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(g,{emit:t}){const s=g,d=t,k=e.computed({get:()=>s.modelValue,set:c=>d("update:modelValue",c)}),{myUsername:I,myAvatar:w,userInfo:U,loadingUserInfo:x,friendList:T,filteredFriendList:_,searchText:h,inputText:E,messagesContainer:b,filteredUsers:W,filteredAvailableUsers:se,currentUser:G,currentMessages:j,addFriendDialogVisible:X,addFriendSearchText:oe,availableUsers:y,loadingAvailableUsers:B,friendApplyList:S,loadingFriendApply:H,formatTime:ne,formatLastTime:J,scrollToBottom:re,getFriendList:de,getChatHistory:me,setFriendToChatStatus:ie,selectUser:Q,sendMessage:Z,sendFile:ce,sendFilesAndText:_e,initWebSocket:Ve,closeWebSocket:ke,reset:ye,openAddFriendDialog:pe,addFriend:Ne,loadFriendApplyList:Ee,agreeFriend:Ce,updateMyAvatar:we,getUserInfo:be,updateUserInfo:Be}=Ie(s.config),ee=e.computed(()=>{var a;const c=[{id:"chat",icon:u.ChatDotRound,badge:0}];return s.config.modules.friends&&c.push({id:"friends",icon:u.UserFilled,badge:0}),s.config.modules.apply&&c.push({id:"apply",icon:u.Bell,badge:((a=S.value)==null?void 0:a.length)||0}),c}),O=e.ref("chat"),z=e.ref(null),C=e.ref(null),M=e.ref(null),L=e.ref(!1),$=e.ref(!1),q=e.ref({nickname:"",email:"",phone:"",bio:""}),le=e.ref(!1),n=e.ref(!1),i=e.ref(!1),p=e.ref(!1),V=e.ref(null),Y=e.ref(""),F=e.ref(null),D=e.ref([]),te=e.ref({visible:!1,x:0,y:0,chat:null}),fe=()=>{te.value.visible=!1},Re=async()=>{if(!te.value.chat)return;await ie(te.value.chat.id,0)&&z.value===te.value.chat.id&&(z.value=null,C.value=null),fe()},he=c=>{z.value=c.id,C.value=c,M.value=null,L.value=!1,Q({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},Le=c=>{M.value=c,z.value=null,C.value=null},qe=async()=>{if(!M.value)return;if(await ie(M.value.id)){O.value="chat",await e.nextTick();const a=W.value.find(f=>f.id===M.value.id);a&&he(a),M.value=null}},Ke=()=>{n.value=!0},We=()=>{var c;(c=V.value)==null||c.click()},je=()=>{var c;(c=F.value)==null||c.click()},He=c=>{const a=Array.from(c.target.files||[]);if(a.length!==0){for(const f of a){if(f.size>50*1024*1024){A.ElMessage.warning(`文件 ${f.name} 超过50MB,已跳过`);continue}const N=URL.createObjectURL(f);D.value.push({id:Date.now()+Math.random(),file:f,name:f.name,size:f.size,type:f.type,previewUrl:N,isImage:f.type.startsWith("image/")})}F.value&&(F.value.value="")}},xe=c=>{const a=D.value[c];a.previewUrl&&URL.revokeObjectURL(a.previewUrl),D.value.splice(c,1)},Ue=c=>{if(c===0)return"0 B";const a=1024,f=["B","KB","MB","GB"],N=Math.floor(Math.log(c)/Math.log(a));return parseFloat((c/Math.pow(a,N)).toFixed(2))+" "+f[N]},Se=async()=>{if(!E.value.trim()&&D.value.length===0)return;const c=[...D.value],a=E.value;E.value="",D.value.forEach(f=>{f.previewUrl&&URL.revokeObjectURL(f.previewUrl)}),D.value=[],await _e(c,a),d("send",{text:a,files:c})},Oe=c=>{var f;const a=(f=c.clipboardData)==null?void 0:f.items;if(a){for(const N of a)if(N.kind==="file"){const K=N.getAsFile();if(K){if(K.size>50*1024*1024){A.ElMessage.warning(`文件 ${K.name} 超过50MB,已跳过`);continue}const v=URL.createObjectURL(K);D.value.push({id:Date.now()+Math.random(),file:K,name:K.name,size:K.size,type:K.type,previewUrl:v,isImage:K.type.startsWith("image/")})}}}},$e=c=>{if(!c){A.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},Pe=c=>{console.warn("图片加载失败",c)},Xe=c=>{const a=c.target.files[0];if(!a)return;if(!a.type.startsWith("image/")){A.ElMessage.error("只能上传图片文件");return}if(a.size>5*1024*1024){A.ElMessage.error("图片大小不能超过 5MB");return}const f=new FileReader;f.onload=N=>{Y.value=N.target.result,i.value=!0},f.readAsDataURL(a)},Ye=async({file:c})=>{if(c){p.value=!0;try{const{ChatApi:a}=await Promise.resolve().then(()=>tt),N=await new a(s.config).uploadAvatar(c,I);N.code===200?(A.ElMessage.success("头像上传成功"),we(N.data),Ae()):A.ElMessage.error(N.msg||"头像上传失败")}catch(a){console.error(a),A.ElMessage.error("头像上传失败")}finally{p.value=!1}}},Ae=()=>{Y.value="",i.value=!1,V.value&&(V.value.value="")},Ge=()=>{q.value={nickname:U.value.nickname||"",email:U.value.email||"",phone:U.value.phone||"",bio:U.value.bio||""},$.value=!0},Je=()=>{$.value=!1,q.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{le.value=!0;try{await Be(q.value)?(A.ElMessage.success("保存成功"),$.value=!1):A.ElMessage.error("保存失败")}catch(c){console.error(c),A.ElMessage.error("保存失败")}finally{le.value=!1}},m=()=>{ye(),ke(),L.value=!1,n.value=!1,Ae(),$.value=!1,d("close")},r=async()=>{await Promise.all([de(),Ee(),be()]),Ve(),W.value.length>0&&he(W.value[0]),d("open")};return e.onMounted(()=>{document.addEventListener("click",fe)}),e.onUnmounted(()=>{document.removeEventListener("click",fe),ke()}),(c,a)=>{const f=e.resolveComponent("el-icon"),N=e.resolveComponent("el-input"),K=e.resolveComponent("el-empty"),v=e.resolveComponent("el-button"),ue=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(ue,{modelValue:k.value,"onUpdate:modelValue":a[13]||(a[13]=ge=>k.value=ge),width:g.width,"close-on-click-modal":!1,class:"chat-dialog","append-to-body":"",onClosed:m,onOpen:r},{default:e.withCtx(()=>{var ge,o,P;return[e.createElementVNode("div",ns,[e.createElementVNode("div",ls,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Ke},[e.createElementVNode("img",{src:e.unref(w),alt:"头像",class:"avatar-img"},null,8,os)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(ee.value,l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["nav-item",O.value===l.id?"nav-item-active":"nav-item-inactive"]),onClick:ae=>O.value=l.id},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.icon)))]),_:2},1024),l.badge?(e.openBlock(),e.createElementBlock("span",is,e.toDisplayString(l.badge>99?"99+":l.badge),1)):e.createCommentVNode("",!0)],10,rs))),128)),a[14]||(a[14]=e.createElementVNode("div",{class:"nav-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"nav-item nav-item-inactive",onClick:a[0]||(a[0]=l=>n.value=!0),title:"设置"},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",cs,[e.createElementVNode("div",ds,[e.createVNode(N,{modelValue:e.unref(h),"onUpdate:modelValue":a[1]||(a[1]=l=>e.isRef(h)?h.value=l:null),placeholder:"搜索","prefix-icon":e.unref(u.Search)},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ms,[O.value==="chat"?(e.openBlock(),e.createElementBlock("div",ps,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(W),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["chat-item",z.value===l.id?"chat-item-active":""]),onClick:ae=>he(l),onContextmenu:e.withModifiers(ae=>c.showContextMenu(ae,l),["prevent","stop"])},[e.createElementVNode("div",hs,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"friend-avatar"},null,8,gs),l.online?(e.openBlock(),e.createElementBlock("span",ks)):e.createCommentVNode("",!0)]),e.createElementVNode("div",ys,[e.createElementVNode("div",us,[e.createElementVNode("span",_s,e.toDisplayString(l.name),1),e.createElementVNode("span",Vs,e.toDisplayString(e.unref(J)(l.lastTime)),1)]),e.createElementVNode("div",Ns,[e.createElementVNode("span",Es,e.toDisplayString(l.lastMsg),1),l.unread>0?(e.openBlock(),e.createElementBlock("span",Cs,e.toDisplayString(l.unread>99?"99+":l.unread),1)):e.createCommentVNode("",!0)])])],42,fs))),128))])):e.createCommentVNode("",!0),O.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",ws,[e.createElementVNode("div",bs,[e.createElementVNode("div",{class:"add-friend-btn",onClick:a[2]||(a[2]=(...l)=>e.unref(pe)&&e.unref(pe)(...l))},[e.createElementVNode("div",Bs,[e.createVNode(f,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(u.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(_),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"chat-item",onClick:ae=>Le(l)},[e.createElementVNode("div",Us,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"friend-avatar"},null,8,Ss),e.createElementVNode("span",{class:e.normalizeClass(["online-indicator",l.online?"online":"offline"])},null,2)]),e.createElementVNode("div",$s,[e.createElementVNode("span",Fs,e.toDisplayString(l.name),1)])],8,xs))),128))])):e.createCommentVNode("",!0),O.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",Ds,[e.unref(H)?(e.openBlock(),e.createBlock(K,{key:0,description:"加载中..."})):e.unref(S).length===0?(e.openBlock(),e.createBlock(K,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(S),l=>(e.openBlock(),e.createElementBlock("div",{key:l.applyUser||l.id,class:"friend-request-item"},[e.createElementVNode("div",As,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.applyUser}`,alt:l.applyUser,class:"request-avatar"},null,8,zs),e.createElementVNode("div",Is,[e.createElementVNode("div",Ts,e.toDisplayString(l.applyUser),1),a[16]||(a[16]=e.createElementVNode("div",{class:"request-desc"},"请求添加你为好友",-1))])]),e.createVNode(v,{type:"primary",size:"small",onClick:ae=>e.unref(Ce)(l.applyUser)},{default:e.withCtx(()=>[...a[17]||(a[17]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ms,[M.value&&!C.value?(e.openBlock(),e.createElementBlock("div",Rs,[e.createElementVNode("img",{src:M.value.avatar,alt:M.value.name,class:"profile-avatar"},null,8,Ls),e.createElementVNode("div",qs,e.toDisplayString(M.value.name),1),e.createElementVNode("div",Ks,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",M.value.online?"status-online":"status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(M.value.online?"在线":"离线"),1)]),e.createVNode(v,{type:"primary",size:"large",onClick:qe,class:"start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),a[18]||(a[18]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),C.value?(e.openBlock(),e.createElementBlock("div",Ws,[e.createElementVNode("div",js,[e.createElementVNode("div",Hs,[e.createElementVNode("span",Os,e.toDisplayString(C.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["status-badge",C.value.online?"status-badge-online":"status-badge-offline"])},e.toDisplayString(C.value.online?"在线":"离线"),3)]),e.createElementVNode("div",Ps,[e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Search))]),_:1}),e.createVNode(f,{class:"action-icon",onClick:a[3]||(a[3]=l=>L.value=!L.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:b,class:"messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(j),(l,ae)=>(e.openBlock(),e.createElementBlock("div",{key:ae,class:e.normalizeClass(["message-wrapper",l.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",Xs,[e.createElementVNode("img",{src:l.isSelf?e.unref(w):C.value.avatar,class:"avatar-sm"},null,8,Ys)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content-wrapper",l.isSelf?"content-self":"content-other"])},[l.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Gs,e.toDisplayString(C.value.name),1)),e.createElementVNode("div",Js,[l.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",l.isSelf?"bubble-self":"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","image-bubble",l.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>$e(l.fileUrl)},[e.createElementVNode("img",{src:l.fileUrl,alt:l.fileName,class:"message-image",onError:Pe},null,40,Zs),l.fileSize?(e.openBlock(),e.createElementBlock("div",vs,e.toDisplayString(Ue(l.fileSize)),1)):e.createCommentVNode("",!0)],10,Qs)):l.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","file-bubble",l.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>$e(l.fileUrl)},[e.createElementVNode("div",tn,[e.createElementVNode("div",an,[e.createVNode(f,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Document))]),_:1})]),e.createElementVNode("div",sn,[e.createElementVNode("div",nn,e.toDisplayString(l.fileName||l.text),1),e.createElementVNode("div",ln,[e.createVNode(f,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Download))]),_:1}),a[19]||(a[19]=e.createElementVNode("span",null,"点击下载",-1)),l.fileSize?(e.openBlock(),e.createElementBlock("span",on,"· "+e.toDisplayString(Ue(l.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,en)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",l.isSelf?"time-right":"time-left"])},e.toDisplayString(e.unref(ne)(l.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",rn,[D.value.length>0?(e.openBlock(),e.createElementBlock("div",cn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,(l,ae)=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"pending-file"},[l.isImage?(e.openBlock(),e.createElementBlock("div",dn,[e.createElementVNode("img",{src:l.previewUrl,alt:l.name,class:"pending-image"},null,8,mn),e.createElementVNode("button",{onClick:Ze=>xe(ae),class:"remove-file-btn"}," × ",8,pn)])):(e.openBlock(),e.createElementBlock("div",fn,[e.createVNode(f,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createElementVNode("span",hn,e.toDisplayString(l.name),1),e.createElementVNode("button",{onClick:Ze=>xe(ae),class:"remove-file-btn"}," × ",8,gn)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",kn,[e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),e.createVNode(f,{class:"action-icon",onClick:je},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",yn,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":a[4]||(a[4]=l=>e.isRef(E)?E.value=l:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Oe,placeholder:"输入消息或粘贴文件...",class:"message-input",rows:"3"},null,40,un),[[e.vModelText,e.unref(E)]])]),e.createElementVNode("div",_n,[e.createVNode(v,{type:"primary",disabled:!e.unref(E).trim()&&D.value.length===0,onClick:Se,class:"send-btn"},{default:e.withCtx(()=>[...a[20]||(a[20]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:F,type:"file",multiple:"",class:"hidden-file-input",onChange:He},null,544)])])):M.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Vn,[e.createVNode(f,{size:64,class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatLineRound))]),_:1}),e.createElementVNode("div",Nn,e.toDisplayString(O.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),L.value?(e.openBlock(),e.createElementBlock("div",En,[a[22]||(a[22]=e.createElementVNode("div",{class:"detail-header"},"聊天详情",-1)),e.createElementVNode("div",Cn,[e.createElementVNode("div",wn,[e.createElementVNode("img",{src:(ge=C.value)==null?void 0:ge.avatar,alt:(o=C.value)==null?void 0:o.name,class:"detail-avatar"},null,8,bn),e.createElementVNode("div",Bn,e.toDisplayString((P=C.value)==null?void 0:P.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(ue,{modelValue:e.unref(X),"onUpdate:modelValue":a[6]||(a[6]=l=>e.isRef(X)?X.value=l:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",xn,[e.createElementVNode("div",Un,[e.createVNode(N,{modelValue:e.unref(oe),"onUpdate:modelValue":a[5]||(a[5]=l=>e.isRef(oe)?oe.value=l:null),placeholder:"搜索用户","prefix-icon":e.unref(u.Search)},null,8,["modelValue","prefix-icon"])])]),e.createElementVNode("div",Sn,[e.unref(B)?(e.openBlock(),e.createBlock(K,{key:0,description:"加载中..."})):e.unref(se).length===0?(e.openBlock(),e.createBlock(K,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(se),l=>(e.openBlock(),e.createElementBlock("div",{key:l.username,class:"available-user-item"},[e.createElementVNode("div",$n,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.username}`,alt:l.username,class:"available-user-avatar"},null,8,Fn),e.createElementVNode("div",Dn,e.toDisplayString(l.username),1)]),e.createVNode(v,{type:"primary",size:"small",onClick:ae=>e.unref(Ne)(l)},{default:e.withCtx(()=>[...a[23]||(a[23]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(ue,{modelValue:n.value,"onUpdate:modelValue":a[11]||(a[11]=l=>n.value=l),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",An,[e.createElementVNode("div",zn,[e.createElementVNode("div",In,[e.createElementVNode("img",{src:e.unref(w),alt:"头像",class:"settings-avatar"},null,8,Tn),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"settings-avatar-edit",onClick:We},[e.createVNode(f,{size:18,class:"settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:V,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Xe},null,544)]),e.createElementVNode("div",Mn,[e.createElementVNode("div",Rn,e.toDisplayString(e.unref(U).nickname||e.unref(I)),1),e.createElementVNode("div",Ln,"@"+e.toDisplayString(e.unref(I)),1)])]),e.createElementVNode("div",qn,[e.createElementVNode("div",Kn,[e.createElementVNode("div",Wn,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.UserFilled))]),_:1}),a[24]||(a[24]=e.createTextVNode(" 个人信息 ",-1))]),$.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(v,{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",jn,[e.createElementVNode("div",Hn,[a[26]||(a[26]=e.createElementVNode("label",{class:"settings-form-label"},"昵称",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.nickname,"onUpdate:modelValue":a[7]||(a[7]=l=>q.value.nickname=l),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",On,e.toDisplayString(e.unref(U).nickname||"未设置"),1))]),e.createElementVNode("div",Pn,[a[27]||(a[27]=e.createElementVNode("label",{class:"settings-form-label"},"邮箱",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.email,"onUpdate:modelValue":a[8]||(a[8]=l=>q.value.email=l),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Xn,e.toDisplayString(e.unref(U).email||"未设置"),1))]),e.createElementVNode("div",Yn,[a[28]||(a[28]=e.createElementVNode("label",{class:"settings-form-label"},"手机号",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.phone,"onUpdate:modelValue":a[9]||(a[9]=l=>q.value.phone=l),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Gn,e.toDisplayString(e.unref(U).phone||"未设置"),1))]),e.createElementVNode("div",Jn,[a[29]||(a[29]=e.createElementVNode("label",{class:"settings-form-label"},"个人简介",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.bio,"onUpdate:modelValue":a[10]||(a[10]=l=>q.value.bio=l),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Qn,e.toDisplayString(e.unref(U).bio||"这个人很懒,什么都没写~"),1))]),$.value?(e.openBlock(),e.createElementBlock("div",Zn,[e.createVNode(v,{size:"default",onClick:Je},{default:e.withCtx(()=>[...a[30]||(a[30]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(v,{type:"primary",size:"default",loading:le.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]=l=>i.value=l),src:Y.value,onConfirm:Ye},null,8,["modelValue","src"]),te.value.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"context-menu",style:e.normalizeStyle({left:te.value.x+"px",top:te.value.y+"px"})},[e.createElementVNode("div",{class:"context-menu-item",onClick:Re},"删除聊天")],4)):e.createCommentVNode("",!0)]}),_:1},8,["modelValue","width"])}}},[["__scopeId","data-v-a76a4ef3"]]),el={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",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 tl(g={}){const t=at(el,g);return t.api.baseUrl||console.warn("[VueChatKit] 请配置 api.baseUrl"),t.api.websocketUrl||console.warn("[VueChatKit] 请配置 api.websocketUrl"),t.user.username||console.warn("[VueChatKit] 请配置 user.username"),t}function at(g,t){const s={...g};for(const d in t)t[d]&&typeof t[d]=="object"&&!Array.isArray(t[d])?s[d]=at(g[d]||{},t[d]):s[d]=t[d];return s}const st={install(g){g.component("ChatPanel",ChatPanel),g.component("ChatWindow",ChatWindow),g.component("AvatarCrop",AvatarCrop)}};R.AvatarCrop=Me,R.ChatApi=De,R.ChatPanel=ss,R.ChatWebSocket=ve,R.ChatWindow=vn,R.HttpClient=et,R.VueChatKit=st,R.createChatConfig=tl,R.default=st,R.useChat=Ie,Object.defineProperties(R,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(R,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):(R=typeof globalThis<"u"?globalThis:R||self,e(R.VueChatKit={},R.Vue,R.ElementPlusIconsVue,R.dayjs,R.ElementPlus))})(this,function(R,e,u,Ie,A){"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="",I="",b=0){if(this.isConnected()){const U=JSON.stringify({to:t,msg:s,type:d,fileUrl:k,fileName:I,fileSize:b});return this.socket.send(U),!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 Fe extends Error{constructor(t,s,d,k){super(t),this.name="RequestError",this.status=s||0,this.code=d||0,this.data=k}}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 Fe("请求超时",408,408))},t)})}async request(t,s={}){const{method:d="GET",headers:k={},body:I,params:b}=s;let U=t.startsWith("http")?t:`${this.baseUrl}${t}`,x={method:d,headers:{...this.headers,...k},body:I,params:b};this.requestInterceptors.forEach(_=>{x=_(x)});const T={method:x.method,headers:x.headers,credentials:"include"};if(x.body&&d!=="GET"&&(x.body instanceof FormData?T.body=x.body:typeof x.body=="object"?T.body=JSON.stringify(x.body):T.body=x.body),x.params){const _=new URLSearchParams;for(const E in x.params)x.params[E]!==void 0&&x.params[E]!==null&&x.params[E]!==""&&_.append(E,x.params[E]);const h=_.toString();h&&(U+=(U.includes("?")?"&":"?")+h)}try{let h=await Promise.race([fetch(U,T),this.timeoutPromise(this.timeout)]);if(this.responseInterceptors.forEach(W=>{h=W(h)}),!h.ok)throw new Fe(`HTTP ${h.status}: ${h.statusText}`,h.status,h.status);const E=h.headers.get("content-type");let w;return E&&E.includes("application/json")?w=await h.json():w=await h.text(),w}catch(_){throw _ instanceof Fe?_:new Fe(_ instanceof Error?_.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 De{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 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:De,default:De},Symbol.toStringTag,{value:"Module"}));function Te(g,t){const s=new De(g);let d=null;const k=g.user.username,I=e.ref(g.user.avatar||`https://api.dicebear.com/7.x/avataaars/svg?seed=${k}`),b=e.ref({username:k,nickname:g.user.nickname||"",email:g.user.email||"",phone:g.user.phone||"",bio:g.user.bio||""}),U=e.ref(!1),x=e.ref([]),T=e.ref([]),_=e.ref([]),h=e.ref(""),E=e.ref(""),w=e.ref(""),W=e.ref(null),se=e.ref(!1),G=e.ref(""),j=e.ref([]),X=e.ref(!1),oe=e.ref([]),y=e.ref(!1),B=e.computed(()=>{let n=T.value;if(E.value){const i=E.value.toLowerCase();n=n.filter(p=>{var V;return(V=p.username)==null?void 0:V.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||I.value,online:i.online,lastMsg:i.lastMsg||"暂无消息",lastTime:i.lastTime,unread:i.unReadNum||0}))}),S=e.computed(()=>{let n=x.value;if(E.value){const i=E.value.toLowerCase();n=n.filter(p=>{var V;return(V=p.username)==null?void 0:V.toLowerCase().includes(i)})}return n.map(i=>({id:i.username,name:i.username,avatar:i.avatar||I.value,online:i.online,isChatting:i.isChatting}))}),H=e.computed(()=>G.value?j.value.filter(n=>{var i;return(i=n.username)==null?void 0:i.toLowerCase().includes(G.value.toLowerCase())}):j.value),ne=e.computed(()=>B.value.find(n=>n.id===h.value)||null),J=e.computed(()=>_.value.map(n=>{const i=n.type==="file"||n.fileUrl||n.fileName,p=n.fileName||n.msgContent;return{text:n.msgContent,isSelf:n.sendUsername===k,time:n.createTime,sendUsername:n.sendUsername,type:i?"file":"text",fileType:me(p)?"image":ie(p),fileUrl:n.fileUrl||"",fileName:p,fileSize:n.fileSize||0}})),re=n=>Ie(n).format("HH:mm"),de=n=>{if(!n)return"";const i=Ie(),p=Ie(n);return i.isSame(p,"day")?p.format("HH:mm"):i.diff(p,"day")===1?"昨天":i.diff(p,"day")<7?["周日","周一","周二","周三","周四","周五","周六"][p.day()]:p.format("MM/DD")},me=n=>{if(!n)return!1;const i=["jpg","jpeg","png","gif","bmp","webp","svg"],p=n.split(".").pop().toLowerCase();return i.includes(p)},ie=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"},Q=()=>{e.nextTick(()=>{W.value&&(W.value.scrollTop=W.value.scrollHeight)})},Z=async()=>{try{const i=(await s.getFriends(k)).data||[];x.value=i,T.value=i.filter(p=>p.isChatting===1);for(const p of T.value)try{const Y=(await s.getHistory(k,p.username)).data||[];p.unReadNum=Y.filter(F=>F.isRead===0&&F.sendUsername===p.username).length}catch{p.unReadNum=0}}catch(n){console.error("[VueChatKit] 获取好友列表失败",n)}},ce=async n=>{try{const i=await s.getHistory(k,n);_.value=i.data||[],Q()}catch(i){console.error("[VueChatKit] 获取聊天历史失败",i)}},_e=async n=>{try{await s.setRead(k,n),Z()}catch(i){console.error("[VueChatKit] 标记已读失败",i)}},Ve=async n=>{h.value=n.id,await ce(n.id),await _e(n.id),Q()},ke=async(n,i=1)=>{try{return await s.setChatStatus(k,n,i),await Z(),!0}catch(p){return console.error("[VueChatKit] 设置聊天状态失败",p),!1}},ye=()=>{if(!w.value.trim()||!h.value||!d)return;if(d.send(h.value,w.value.trim(),"text")){const i={msgContent:w.value.trim(),sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"text"};_.value.push(i),w.value="",Q(),setTimeout(()=>{ce(h.value),Z()},300)}},pe=async n=>{if(!h.value||!d)return!1;try{const i=await s.uploadFile(n);if(i.code===200&&i.data){const{fileUrl:p,fileName:V}=i.data;if(d.send(h.value,V,"file",p,V,n.size)){const F={msgContent:V,sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"file",fileUrl:p,fileName:V,fileSize:n.size};return _.value.push(F),Q(),!0}}return!1}catch(i){return console.error("[VueChatKit] 发送文件失败",i),!1}},Ne=async(n,i)=>{if(!(!h.value||!d)){if(i&&i.trim()&&d.send(h.value,i.trim(),"text")){const V={msgContent:i.trim(),sendUsername:k,receiveUsername:h.value,createTime:new Date,isRead:0,type:"text"};_.value.push(V)}for(const p of n){const V=p.file||p;await pe(V)}setTimeout(()=>{ce(h.value),Z()},300)}},Ee=n=>{try{try{const p=JSON.parse(n);if(p.to||p.msg)return{to:p.to,content:p.msg,type:p.type||"text",fileUrl:p.fileUrl||"",fileName:p.fileName||"",fileSize:p.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},Ce=n=>{if(n.includes("【状态变更】")){const p=/【状态变更】(.+?) 已(上线|下线)/,V=n.match(p);if(V){const Y=V[1],F=V[2]==="上线",D=x.value.find(te=>te.username===Y);D&&(D.online=F)}return}const i=Ee(n);if(i){const p={content:i.content,username:i.username||h.value,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0,timestamp:new Date};if(h.value){try{let V={msgContent:i.content,sendUsername:p.username,receiveUsername:k,createTime:new Date,isRead:0,type:i.type||"text",fileUrl:i.fileUrl||"",fileName:i.fileName||"",fileSize:i.fileSize||0};_.value.push(V),Q()}catch(V){console.error("[VueChatKit] 添加临时消息失败",V)}ce(h.value)}Z(),t&&typeof t=="function"&&t(p)}},be=()=>{const n=`${g.api.websocketUrl}?userId=${k}`;d=new ve(k,{wsUrl:n,maxReconnectAttempts:g.websocket.maxReconnectAttempts,reconnectDelay:g.websocket.reconnectDelay}),d.on("message",Ce),d.connect()},we=()=>{d&&(d.close(),d=null)},Be=async()=>{se.value=!0,G.value="",await ee()},ee=async()=>{X.value=!0;try{const n=await s.getAvailableUsers(k);j.value=(n==null?void 0:n.data)||[]}catch(n){console.error("[VueChatKit] 获取可用用户失败",n)}finally{X.value=!1}},O=async n=>{try{await s.addFriend(k,n.username),await Z(),se.value=!1}catch(i){console.error("[VueChatKit] 添加好友失败",i)}},z=async()=>{y.value=!0;try{const n=await s.getApplyList(k);oe.value=n.data||[]}catch(n){console.error("[VueChatKit] 获取好友申请列表失败",n)}finally{y.value=!1}},C=async n=>{try{await s.agreeFriend(n,k),await z(),await Z()}catch(i){console.error("[VueChatKit] 同意好友申请失败",i)}},M=async()=>{try{const n=await s.getUserAvatar(k);n.code===200&&n.data&&(I.value=n.data)}catch(n){console.warn("[VueChatKit] 加载头像失败",n)}},L=n=>{I.value=n},$=async()=>{U.value=!0;try{const n=await s.getUserInfo(k);n.code===200&&n.data&&(b.value={...b.value,...n.data})}catch(n){console.error("[VueChatKit] 获取用户信息失败",n)}finally{U.value=!1}},q=async n=>{try{return(await s.updateUserInfo(k,n)).code===200?(b.value={...b.value,...n},!0):!1}catch(i){return console.error("[VueChatKit] 更新用户信息失败",i),!1}},le=()=>{h.value="",_.value=[],w.value="",E.value=""};return M(),{myUsername:k,myAvatar:I,userInfo:b,loadingUserInfo:U,friendList:x,chatList:T,filteredFriendList:S,chatMsgList:_,currentSelectName:h,searchText:E,inputText:w,messagesContainer:W,filteredUsers:B,filteredAvailableUsers:H,currentUser:ne,currentMessages:J,addFriendDialogVisible:se,addFriendSearchText:G,availableUsers:j,loadingAvailableUsers:X,friendApplyList:oe,loadingFriendApply:y,formatTime:re,formatLastTime:de,scrollToBottom:Q,getFriendList:Z,getChatHistory:ce,setFriendToChatStatus:ke,selectUser:Ve,sendMessage:ye,sendFile:pe,sendFilesAndText:Ne,initWebSocket:be,closeWebSocket:we,reset:le,openAddFriendDialog:Be,addFriend:O,loadFriendApplyList:z,agreeFriend:C,updateMyAvatar:L,getUserInfo:$,updateUserInfo:q}}const Me=(g,t)=>{const s=g.__vccOpts||g;for(const[d,k]of t)s[d]=k;return s},ot={class:"avatar-crop-container"},rt=["src"],it={class:"crop-overlay"},ct={class:"crop-box"},dt={key:0,class:"crop-mask"},mt={class:"zoom-controls"},Ae=Me({__name:"AvatarCrop",props:{modelValue:{type:Boolean,default:!1},src:{type:String,default:""}},emits:["update:modelValue","confirm"],setup(g,{emit:t}){const s=g,d=t,k=e.computed({get:()=>s.modelValue,set:y=>d("update:modelValue",y)}),I=e.ref(""),b=e.ref(null),U=e.ref(null),x=e.ref(null),T=e.ref(1),_=e.ref({x:0,y:0}),h=e.ref(!1),E=e.ref({x:0,y:0}),w=e.ref({width:0,height:0});e.watch(()=>s.src,y=>{y&&(I.value=y,T.value=1,_.value={x:0,y:0})});const W=()=>{e.nextTick(()=>{if(b.value&&U.value){const y=b.value,B=U.value,S=Math.min(B.clientWidth,B.clientHeight);y.naturalWidth>y.naturalHeight?(w.value.height=S,w.value.width=y.naturalWidth/y.naturalHeight*S):(w.value.width=S,w.value.height=y.naturalHeight/y.naturalWidth*S),_.value={x:(S-w.value.width)/2,y:(S-w.value.height)/2}}})},se=y=>{h.value=!0;const B=y.touches?y.touches[0].clientX:y.clientX,S=y.touches?y.touches[0].clientY:y.clientY;E.value={x:B-_.value.x,y:S-_.value.y},document.addEventListener("mousemove",G),document.addEventListener("mouseup",j),document.addEventListener("touchmove",G),document.addEventListener("touchend",j)},G=y=>{if(!h.value)return;const B=y.touches?y.touches[0].clientX:y.clientX,S=y.touches?y.touches[0].clientY:y.clientY;_.value={x:B-E.value.x,y:S-E.value.y}},j=()=>{h.value=!1,document.removeEventListener("mousemove",G),document.removeEventListener("mouseup",j),document.removeEventListener("touchmove",G),document.removeEventListener("touchend",j)},X=()=>{const y=document.createElement("canvas"),B=y.getContext("2d"),S=200;y.width=S,y.height=S;const H=b.value,ne=x.value,J=U.value;if(H&&ne&&J){const re=ne.getBoundingClientRect(),de=J.getBoundingClientRect(),me=(re.left-de.left-_.value.x)/T.value,ie=(re.top-de.top-_.value.y)/T.value,Q=re.width/T.value;B.drawImage(H,me*(H.naturalWidth/w.value.width),ie*(H.naturalHeight/w.value.height),Q*(H.naturalWidth/w.value.width),Q*(H.naturalHeight/w.value.height),0,0,S,S),y.toBlob(Z=>{d("confirm",{file:Z,url:y.toDataURL("image/png")}),k.value=!1},"image/png")}},oe=()=>{I.value="",T.value=1,_.value={x:0,y:0}};return(y,B)=>{const S=e.resolveComponent("el-slider"),H=e.resolveComponent("el-button"),ne=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(ne,{modelValue:k.value,"onUpdate:modelValue":B[2]||(B[2]=J=>k.value=J),title:"裁剪头像",width:"500px","close-on-click-modal":!1,onClosed:oe},{footer:e.withCtx(()=>[e.createVNode(H,{onClick:B[1]||(B[1]=J=>k.value=!1)},{default:e.withCtx(()=>[...B[3]||(B[3]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(H,{type:"primary",onClick:X},{default:e.withCtx(()=>[...B[4]||(B[4]=[e.createTextVNode("确定",-1)])]),_:1})]),default:e.withCtx(()=>[e.createElementVNode("div",ot,[e.createElementVNode("div",{class:"crop-area",ref_key:"cropAreaRef",ref:U},[e.createElementVNode("img",{src:I.value,ref_key:"imageRef",ref:b,class:"crop-image",onLoad:W,onMousedown:se,onTouchstart:se},null,40,rt),e.createElementVNode("div",it,[e.createElementVNode("div",ct,[e.createElementVNode("div",{class:"crop-border",ref_key:"cropBoxRef",ref:x},null,512)])]),h.value?(e.openBlock(),e.createElementBlock("div",dt)):e.createCommentVNode("",!0)],512),e.createElementVNode("div",mt,[e.createVNode(S,{modelValue:T.value,"onUpdate:modelValue":B[0]||(B[0]=J=>T.value=J),min:.5,max:3,step:.1,"show-tooltip":!1},null,8,["modelValue"])])])]),_:1},8,["modelValue"])}}},[["__scopeId","data-v-4e4a992b"]]),pt={class:"chat-panel"},ft={class:"chat-sidebar"},ht=["src"],gt=["onClick"],kt={key:0,class:"sidebar-nav-badge"},yt={class:"chat-content-panel"},ut={class:"chat-search-bar"},_t={class:"chat-content-scroll"},Vt={key:0},Nt=["onClick","onContextmenu"],Et={class:"chat-list-avatar-wrapper"},Ct=["src","alt"],bt={key:0,class:"chat-list-online-indicator"},wt={class:"chat-list-info"},Bt={class:"chat-list-header"},xt={class:"chat-list-name"},Ut={class:"chat-list-time"},St={class:"chat-list-preview"},$t={class:"chat-list-last-msg"},Ft={key:0,class:"chat-list-unread"},Dt={key:1},At={class:"add-friend-section"},zt={class:"add-friend-icon"},It=["onClick"],Tt={class:"chat-list-avatar-wrapper"},Mt=["src","alt"],Rt={class:"chat-list-info"},Lt={class:"chat-list-name"},qt={key:2},Kt={class:"friend-request-info"},Wt=["src","alt"],jt={class:"friend-request-details"},Ht={class:"friend-request-username"},Ot={class:"chat-main-area"},Pt={key:0,class:"friend-profile-area"},Xt=["src","alt"],Yt={class:"profile-name"},Gt={class:"profile-status"},Jt={key:1,class:"chat-window-area"},Qt={class:"chat-window-header"},Zt={class:"chat-window-title"},vt={class:"chat-window-name"},ea={class:"chat-window-actions"},ta={class:"message-avatar"},aa=["src"],sa={key:0,class:"message-sender-name"},na={class:"message-bubble-wrapper"},la=["onClick"],oa=["src","alt"],ra={key:0,class:"message-image-size"},ia=["onClick"],ca={class:"message-file-content"},da={class:"message-file-icon"},ma={class:"message-file-info"},pa={class:"message-file-name"},fa={class:"message-file-meta"},ha={key:0},ga={class:"chat-input-area"},ka={key:0,class:"pending-files-area"},ya={key:0,class:"pending-image-wrapper"},ua=["src","alt"],_a=["onClick"],Va={key:1,class:"pending-file-wrapper"},Na={class:"pending-file-name"},Ea=["onClick"],Ca={key:1,class:"input-toolbar"},ba={class:"input-textarea-wrapper"},wa=["onKeydown"],Ba={class:"input-send-wrapper"},xa={key:2,class:"chat-empty-state"},Ua={class:"empty-state-text"},Sa={key:0,class:"chat-detail-panel"},$a={class:"chat-detail-content"},Fa={class:"chat-detail-profile"},Da=["src","alt"],Aa={class:"chat-detail-name"},za={class:"add-friend-search-wrapper"},Ia={class:"add-friend-users-list"},Ta={class:"add-friend-user-info"},Ma=["src","alt"],Ra={class:"add-friend-user-name"},La={class:"chat-settings-container"},qa={class:"chat-settings-avatar-section"},Ka={class:"chat-settings-avatar-wrapper"},Wa=["src"],ja={class:"chat-settings-user-display"},Ha={class:"chat-settings-nickname"},Oa={class:"chat-settings-username"},Pa={class:"chat-settings-form-section"},Xa={class:"chat-settings-form-header"},Ya={class:"chat-settings-form-title"},Ga={class:"chat-settings-form"},Ja={class:"chat-settings-form-item"},Qa={key:1,class:"chat-settings-form-value"},Za={class:"chat-settings-form-item"},va={key:1,class:"chat-settings-form-value"},es={class:"chat-settings-form-item"},ts={key:1,class:"chat-settings-form-value"},as={class:"chat-settings-form-item"},ss={key:1,class:"chat-settings-form-value bio-value"},ns={key:0,class:"chat-settings-form-actions"},at=Me({__name:"ChatPanel",props:{config:{type:Object,required:!0}},emits:["message","send","error","init"],setup(g,{emit:t}){const s=g,d=t,{myUsername:k,myAvatar:I,userInfo:b,loadingUserInfo:U,friendList:x,filteredFriendList:T,searchText:_,inputText:h,messagesContainer:E,filteredUsers:w,filteredAvailableUsers:W,currentUser:se,currentMessages:G,addFriendDialogVisible:j,addFriendSearchText:X,availableUsers:oe,loadingAvailableUsers:y,friendApplyList:B,loadingFriendApply:S,formatTime:H,formatLastTime:ne,scrollToBottom:J,getFriendList:re,getChatHistory:de,setFriendToChatStatus:me,selectUser:ie,sendMessage:Q,sendFile:Z,sendFilesAndText:ce,initWebSocket:_e,closeWebSocket:Ve,reset:ke,openAddFriendDialog:ye,addFriend:pe,loadFriendApplyList:Ne,agreeFriend:Ee,updateMyAvatar:Ce,getUserInfo:be,updateUserInfo:we}=Te(s.config,m=>{d("message",m)}),Be=e.computed(()=>{var r;const m=[{id:"chat",icon:u.ChatDotRound,badge:0}];return s.config.modules.friends&&m.push({id:"friends",icon:u.UserFilled,badge:0}),s.config.modules.apply&&m.push({id:"apply",icon:u.Bell,badge:((r=B.value)==null?void 0:r.length)||0}),m}),ee=e.ref("chat"),O=e.ref(null),z=e.ref(null),C=e.ref(null),M=e.ref(!1),L=e.ref(!1),$=e.ref({nickname:"",email:"",phone:"",bio:""}),q=e.ref(!1),le=e.ref(!1),n=e.ref(!1),i=e.ref(!1),p=e.ref(null),V=e.ref(""),Y=e.ref(null),F=e.ref([]),D=e.ref({visible:!1,x:0,y:0,chat:null}),te=(m,r)=>{m.preventDefault(),m.stopPropagation(),D.value={visible:!0,x:m.clientX,y:m.clientY,chat:r}},fe=()=>{D.value.visible=!1},Re=async()=>{if(!D.value.chat)return;await me(D.value.chat.id,0)&&O.value===D.value.chat.id&&(O.value=null,z.value=null),fe()},he=m=>{O.value=m.id,z.value=m,C.value=null,M.value=!1,ie({id:m.id,name:m.name,avatar:m.avatar,online:m.online})},Le=m=>{C.value=m,O.value=null,z.value=null},qe=async()=>{if(!C.value)return;if(await me(C.value.id)){ee.value="chat",await e.nextTick();const r=w.value.find(c=>c.id===C.value.id);r&&he(r),C.value=null}},Ke=()=>{le.value=!0},We=()=>{var m;(m=p.value)==null||m.click()},je=()=>{var m;(m=Y.value)==null||m.click()},He=m=>{const r=Array.from(m.target.files||[]);if(r.length!==0){for(const c of r){if(c.size>50*1024*1024){A.ElMessage.warning(`文件 ${c.name} 超过50MB,已跳过`);continue}const a=URL.createObjectURL(c);F.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/")})}Y.value&&(Y.value.value="")}},xe=m=>{const r=F.value[m];r.previewUrl&&URL.revokeObjectURL(r.previewUrl),F.value.splice(m,1)},Ue=m=>{if(m===0)return"0 B";const r=1024,c=["B","KB","MB","GB"],a=Math.floor(Math.log(m)/Math.log(r));return parseFloat((m/Math.pow(r,a)).toFixed(2))+" "+c[a]},Se=async()=>{if(!h.value.trim()&&F.value.length===0)return;const m=[...F.value],r=h.value;h.value="",F.value.forEach(c=>{c.previewUrl&&URL.revokeObjectURL(c.previewUrl)}),F.value=[],await ce(m,r),d("send",{text:r,files:m})},Oe=m=>{var c;const r=(c=m.clipboardData)==null?void 0:c.items;if(r){for(const a of r)if(a.kind==="file"){const f=a.getAsFile();if(f){if(f.size>50*1024*1024){A.ElMessage.warning(`文件 ${f.name} 超过50MB,已跳过`);continue}const N=URL.createObjectURL(f);F.value.push({id:Date.now()+Math.random(),file:f,name:f.name,size:f.size,type:f.type,previewUrl:N,isImage:f.type.startsWith("image/")})}}}},$e=m=>{if(!m){A.ElMessage.warning("文件地址无效");return}window.open(m,"_blank")},Pe=m=>{console.warn("图片加载失败",m)},Xe=m=>{const r=m.target.files[0];if(!r)return;if(!r.type.startsWith("image/")){A.ElMessage.error("只能上传图片文件");return}if(r.size>5*1024*1024){A.ElMessage.error("图片大小不能超过 5MB");return}const c=new FileReader;c.onload=a=>{V.value=a.target.result,n.value=!0},c.readAsDataURL(r)},Ye=async({file:m})=>{if(m){i.value=!0;try{const{ChatApi:r}=await Promise.resolve().then(()=>tt),a=await new r(s.config).uploadAvatar(m,k);a.code===200?(A.ElMessage.success("头像上传成功"),Ce(a.data),ze()):A.ElMessage.error(a.msg||"头像上传失败")}catch(r){console.error(r),A.ElMessage.error("头像上传失败")}finally{i.value=!1}}},ze=()=>{V.value="",n.value=!1,p.value&&(p.value.value="")},Ge=()=>{$.value={nickname:b.value.nickname||"",email:b.value.email||"",phone:b.value.phone||"",bio:b.value.bio||""},L.value=!0},Je=()=>{L.value=!1,$.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{q.value=!0;try{await we($.value)?(A.ElMessage.success("保存成功"),L.value=!1):A.ElMessage.error("保存失败")}catch(m){console.error(m),A.ElMessage.error("保存失败")}finally{q.value=!1}};return e.onMounted(async()=>{await Promise.all([re(),Ne(),be()]),_e(),w.value.length>0&&he(w.value[0]),d("init"),document.addEventListener("click",fe)}),e.onUnmounted(()=>{ke(),Ve(),document.removeEventListener("click",fe)}),(m,r)=>{var v,ue,ge;const c=e.resolveComponent("el-icon"),a=e.resolveComponent("el-input"),f=e.resolveComponent("el-empty"),N=e.resolveComponent("el-button"),K=e.resolveComponent("el-dialog");return e.openBlock(),e.createElementBlock("div",pt,[e.createElementVNode("div",ft,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Ke},[e.createElementVNode("img",{src:e.unref(I),alt:"头像",class:"sidebar-avatar-img"},null,8,ht)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Be.value,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["sidebar-nav-item",ee.value===o.id?"sidebar-nav-item-active":"sidebar-nav-item-inactive"]),onClick:P=>ee.value=o.id},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.icon)))]),_:2},1024),o.badge?(e.openBlock(),e.createElementBlock("span",kt,e.toDisplayString(o.badge>99?"99+":o.badge),1)):e.createCommentVNode("",!0)],10,gt))),128)),r[13]||(r[13]=e.createElementVNode("div",{class:"sidebar-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"sidebar-nav-item sidebar-nav-item-inactive",onClick:r[0]||(r[0]=o=>le.value=!0),title:"设置"},[e.createVNode(c,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",yt,[e.createElementVNode("div",ut,[e.createVNode(a,{modelValue:e.unref(_),"onUpdate:modelValue":r[1]||(r[1]=o=>e.isRef(_)?_.value=o:null),placeholder:"搜索","prefix-icon":e.unref(u.Search),class:"chat-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",_t,[ee.value==="chat"?(e.openBlock(),e.createElementBlock("div",Vt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(w),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:e.normalizeClass(["chat-list-item",O.value===o.id?"chat-list-item-active":""]),onClick:P=>he(o),onContextmenu:e.withModifiers(P=>te(P,o),["prevent","stop"])},[e.createElementVNode("div",Et,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,Ct),o.online?(e.openBlock(),e.createElementBlock("span",bt)):e.createCommentVNode("",!0)]),e.createElementVNode("div",wt,[e.createElementVNode("div",Bt,[e.createElementVNode("span",xt,e.toDisplayString(o.name),1),e.createElementVNode("span",Ut,e.toDisplayString(e.unref(ne)(o.lastTime)),1)]),e.createElementVNode("div",St,[e.createElementVNode("span",$t,e.toDisplayString(o.lastMsg),1),o.unread>0?(e.openBlock(),e.createElementBlock("span",Ft,e.toDisplayString(o.unread>99?"99+":o.unread),1)):e.createCommentVNode("",!0)])])],42,Nt))),128))])):e.createCommentVNode("",!0),ee.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",Dt,[e.createElementVNode("div",At,[e.createElementVNode("div",{class:"add-friend-btn",onClick:r[2]||(r[2]=(...o)=>e.unref(ye)&&e.unref(ye)(...o))},[e.createElementVNode("div",zt,[e.createVNode(c,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(u.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(T),o=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"chat-list-item",onClick:P=>Le(o)},[e.createElementVNode("div",Tt,[e.createElementVNode("img",{src:o.avatar,alt:o.name,class:"chat-list-avatar"},null,8,Mt),e.createElementVNode("span",{class:e.normalizeClass(["chat-list-online-indicator",o.online?"chat-list-online":"chat-list-offline"])},null,2)]),e.createElementVNode("div",Rt,[e.createElementVNode("span",Lt,e.toDisplayString(o.name),1)])],8,It))),128))])):e.createCommentVNode("",!0),ee.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",qt,[e.unref(S)?(e.openBlock(),e.createBlock(f,{key:0,description:"加载中..."})):e.unref(B).length===0?(e.openBlock(),e.createBlock(f,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(B),o=>(e.openBlock(),e.createElementBlock("div",{key:o.applyUser||o.id,class:"friend-request-item"},[e.createElementVNode("div",Kt,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.applyUser}`,alt:o.applyUser,class:"friend-request-avatar"},null,8,Wt),e.createElementVNode("div",jt,[e.createElementVNode("div",Ht,e.toDisplayString(o.applyUser),1),r[15]||(r[15]=e.createElementVNode("div",{class:"friend-request-desc"},"请求添加你为好友",-1))])]),e.createVNode(N,{type:"primary",size:"small",onClick:P=>e.unref(Ee)(o.applyUser)},{default:e.withCtx(()=>[...r[16]||(r[16]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ot,[C.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Pt,[e.createElementVNode("img",{src:C.value.avatar,alt:C.value.name,class:"profile-avatar"},null,8,Xt),e.createElementVNode("div",Yt,e.toDisplayString(C.value.name),1),e.createElementVNode("div",Gt,[e.createElementVNode("span",{class:e.normalizeClass(["profile-status-dot",C.value.online?"profile-status-online":"profile-status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(C.value.online?"在线":"离线"),1)]),e.createVNode(N,{type:"primary",size:"large",onClick:qe,class:"profile-start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),r[17]||(r[17]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),z.value?(e.openBlock(),e.createElementBlock("div",Jt,[e.createElementVNode("div",Qt,[e.createElementVNode("div",Zt,[e.createElementVNode("span",vt,e.toDisplayString(z.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["chat-window-status",z.value.online?"chat-window-status-online":"chat-window-status-offline"])},e.toDisplayString(z.value.online?"在线":"离线"),3)]),e.createElementVNode("div",ea,[e.createVNode(c,{class:"chat-action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Search))]),_:1}),e.createVNode(c,{class:"chat-action-icon",onClick:r[3]||(r[3]=o=>M.value=!M.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:E,class:"chat-messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(G),(o,P)=>(e.openBlock(),e.createElementBlock("div",{key:P,class:e.normalizeClass(["message-wrapper",o.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",ta,[e.createElementVNode("img",{src:o.isSelf?e.unref(I):z.value.avatar,class:"message-avatar-img"},null,8,aa)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content",o.isSelf?"message-content-self":"message-content-other"])},[o.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",sa,e.toDisplayString(z.value.name),1)),e.createElementVNode("div",na,[o.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"])},e.toDisplayString(o.text),3)):o.type==="file"&&o.fileType==="image"?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["message-bubble","message-image-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:l=>$e(o.fileUrl)},[e.createElementVNode("img",{src:o.fileUrl,alt:o.fileName,class:"message-image",onError:Pe},null,40,oa),o.fileSize?(e.openBlock(),e.createElementBlock("div",ra,e.toDisplayString(Ue(o.fileSize)),1)):e.createCommentVNode("",!0)],10,la)):o.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","message-file-bubble",o.isSelf?"message-bubble-self":"message-bubble-other"]),onClick:l=>$e(o.fileUrl)},[e.createElementVNode("div",ca,[e.createElementVNode("div",da,[e.createVNode(c,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Document))]),_:1})]),e.createElementVNode("div",ma,[e.createElementVNode("div",pa,e.toDisplayString(o.fileName||o.text),1),e.createElementVNode("div",fa,[e.createVNode(c,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Download))]),_:1}),r[18]||(r[18]=e.createElementVNode("span",null,"点击下载",-1)),o.fileSize?(e.openBlock(),e.createElementBlock("span",ha,"· "+e.toDisplayString(Ue(o.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,ia)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",o.isSelf?"message-time-right":"message-time-left"])},e.toDisplayString(e.unref(H)(o.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",ga,[F.value.length>0?(e.openBlock(),e.createElementBlock("div",ka,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.value,(o,P)=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"pending-file-item"},[o.isImage?(e.openBlock(),e.createElementBlock("div",ya,[e.createElementVNode("img",{src:o.previewUrl,alt:o.name,class:"pending-image"},null,8,ua),e.createElementVNode("button",{onClick:l=>xe(P),class:"pending-file-remove-btn"}," × ",8,_a)])):(e.openBlock(),e.createElementBlock("div",Va,[e.createVNode(c,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createElementVNode("span",Na,e.toDisplayString(o.name),1),e.createElementVNode("button",{onClick:l=>xe(P),class:"pending-file-remove-btn"}," × ",8,Ea)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",Ca,[e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon",onClick:je},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createVNode(c,{class:"input-toolbar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",ba,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":r[4]||(r[4]=o=>e.isRef(h)?h.value=o:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Oe,placeholder:"输入消息或粘贴文件...",class:"message-input-textarea",rows:"3"},null,40,wa),[[e.vModelText,e.unref(h)]])]),e.createElementVNode("div",Ba,[e.createVNode(N,{type:"primary",disabled:!e.unref(h).trim()&&F.value.length===0,onClick:Se,class:"send-message-btn"},{default:e.withCtx(()=>[...r[19]||(r[19]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:Y,type:"file",multiple:"",class:"hidden-file-input",onChange:He},null,544)])])):C.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",xa,[e.createVNode(c,{size:64,class:"empty-state-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatLineRound))]),_:1}),e.createElementVNode("div",Ua,e.toDisplayString(ee.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),M.value?(e.openBlock(),e.createElementBlock("div",Sa,[r[21]||(r[21]=e.createElementVNode("div",{class:"chat-detail-header"},"聊天详情",-1)),e.createElementVNode("div",$a,[e.createElementVNode("div",Fa,[e.createElementVNode("img",{src:(v=z.value)==null?void 0:v.avatar,alt:(ue=z.value)==null?void 0:ue.name,class:"chat-detail-avatar"},null,8,Da),e.createElementVNode("div",Aa,e.toDisplayString((ge=z.value)==null?void 0:ge.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(K,{modelValue:e.unref(j),"onUpdate:modelValue":r[6]||(r[6]=o=>e.isRef(j)?j.value=o:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",za,[e.createVNode(a,{modelValue:e.unref(X),"onUpdate:modelValue":r[5]||(r[5]=o=>e.isRef(X)?X.value=o:null),placeholder:"搜索用户","prefix-icon":e.unref(u.Search),class:"add-friend-search-input"},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",Ia,[e.unref(y)?(e.openBlock(),e.createBlock(f,{key:0,description:"加载中..."})):e.unref(W).length===0?(e.openBlock(),e.createBlock(f,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(W),o=>(e.openBlock(),e.createElementBlock("div",{key:o.username,class:"add-friend-user-item"},[e.createElementVNode("div",Ta,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${o.username}`,alt:o.username,class:"add-friend-user-avatar"},null,8,Ma),e.createElementVNode("div",Ra,e.toDisplayString(o.username),1)]),e.createVNode(N,{type:"primary",size:"small",onClick:P=>e.unref(pe)(o)},{default:e.withCtx(()=>[...r[22]||(r[22]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(K,{modelValue:le.value,"onUpdate:modelValue":r[11]||(r[11]=o=>le.value=o),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"chat-settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",La,[e.createElementVNode("div",qa,[e.createElementVNode("div",Ka,[e.createElementVNode("img",{src:e.unref(I),alt:"头像",class:"chat-settings-avatar"},null,8,Wa),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"chat-settings-avatar-edit",onClick:We},[e.createVNode(c,{size:18,class:"chat-settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:p,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Xe},null,544)]),e.createElementVNode("div",ja,[e.createElementVNode("div",Ha,e.toDisplayString(e.unref(b).nickname||e.unref(k)),1),e.createElementVNode("div",Oa,"@"+e.toDisplayString(e.unref(k)),1)])]),e.createElementVNode("div",Pa,[e.createElementVNode("div",Xa,[e.createElementVNode("div",Ya,[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.UserFilled))]),_:1}),r[23]||(r[23]=e.createTextVNode(" 个人信息 ",-1))]),L.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(N,{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",Ga,[e.createElementVNode("div",Ja,[r[25]||(r[25]=e.createElementVNode("label",{class:"chat-settings-form-label"},"昵称",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.nickname,"onUpdate:modelValue":r[7]||(r[7]=o=>$.value.nickname=o),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Qa,e.toDisplayString(e.unref(b).nickname||"未设置"),1))]),e.createElementVNode("div",Za,[r[26]||(r[26]=e.createElementVNode("label",{class:"chat-settings-form-label"},"邮箱",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.email,"onUpdate:modelValue":r[8]||(r[8]=o=>$.value.email=o),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",va,e.toDisplayString(e.unref(b).email||"未设置"),1))]),e.createElementVNode("div",es,[r[27]||(r[27]=e.createElementVNode("label",{class:"chat-settings-form-label"},"手机号",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.phone,"onUpdate:modelValue":r[9]||(r[9]=o=>$.value.phone=o),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ts,e.toDisplayString(e.unref(b).phone||"未设置"),1))]),e.createElementVNode("div",as,[r[28]||(r[28]=e.createElementVNode("label",{class:"chat-settings-form-label"},"个人简介",-1)),L.value?(e.openBlock(),e.createBlock(a,{key:0,modelValue:$.value.bio,"onUpdate:modelValue":r[10]||(r[10]=o=>$.value.bio=o),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",ss,e.toDisplayString(e.unref(b).bio||"这个人很懒,什么都没写~"),1))]),L.value?(e.openBlock(),e.createElementBlock("div",ns,[e.createVNode(N,{size:"default",onClick:Je},{default:e.withCtx(()=>[...r[29]||(r[29]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(N,{type:"primary",size:"default",loading:q.value,onClick:Qe},{default:e.withCtx(()=>[...r[30]||(r[30]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Ae,{modelValue:n.value,"onUpdate:modelValue":r[12]||(r[12]=o=>n.value=o),src:V.value,onConfirm:Ye},null,8,["modelValue","src"]),D.value.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-context-menu",style:e.normalizeStyle({left:D.value.x+"px",top:D.value.y+"px"})},[e.createElementVNode("div",{class:"chat-context-menu-item",onClick:Re},"删除聊天")],4)):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-f5908195"]]),ls={class:"chat-container"},os={class:"sidebar-nav"},rs=["src"],is=["onClick"],cs={key:0,class:"nav-badge"},ds={class:"content-panel"},ms={class:"search-bar"},ps={class:"content-scroll"},fs={key:0},hs=["onClick","onContextmenu"],gs={class:"friend-avatar-wrapper"},ks=["src","alt"],ys={key:0,class:"online-indicator"},us={class:"friend-info"},_s={class:"friend-header"},Vs={class:"friend-name"},Ns={class:"last-time"},Es={class:"friend-preview"},Cs={class:"last-msg"},bs={key:0,class:"unread-badge"},ws={key:1},Bs={class:"add-friend-section"},xs={class:"add-friend-icon"},Us=["onClick"],Ss={class:"friend-avatar-wrapper"},$s=["src","alt"],Fs={class:"friend-info"},Ds={class:"friend-name"},As={key:2},zs={class:"request-info"},Is=["src","alt"],Ts={class:"request-details"},Ms={class:"request-username"},Rs={class:"chat-area"},Ls={key:0,class:"friend-profile"},qs=["src","alt"],Ks={class:"profile-name"},Ws={class:"profile-status"},js={key:1,class:"chat-window"},Hs={class:"chat-header"},Os={class:"chat-title"},Ps={class:"chat-name"},Xs={class:"chat-actions"},Ys={class:"message-avatar"},Gs=["src"],Js={key:0,class:"sender-name"},Qs={class:"message-bubble-wrapper"},Zs=["onClick"],vs=["src","alt"],en={key:0,class:"image-size"},tn=["onClick"],an={class:"file-content"},sn={class:"file-icon"},nn={class:"file-info"},ln={class:"file-name"},on={class:"file-meta"},rn={key:0},cn={class:"input-area"},dn={key:0,class:"pending-files"},mn={key:0,class:"pending-image-wrapper"},pn=["src","alt"],fn=["onClick"],hn={key:1,class:"pending-file-wrapper"},gn={class:"pending-file-name"},kn=["onClick"],yn={key:1,class:"input-actions"},un={class:"input-wrapper"},_n=["onKeydown"],Vn={class:"send-btn-wrapper"},Nn={key:2,class:"empty-state"},En={class:"empty-text"},Cn={key:0,class:"detail-panel"},bn={class:"detail-content"},wn={class:"detail-profile"},Bn=["src","alt"],xn={class:"detail-name"},Un={class:"search-users-wrapper"},Sn={class:"search-users-input"},$n={class:"users-list-scroll"},Fn={class:"available-user-info"},Dn=["src","alt"],An={class:"available-user-name"},zn={class:"settings-container"},In={class:"settings-avatar-section"},Tn={class:"settings-avatar-wrapper"},Mn=["src"],Rn={class:"settings-user-display"},Ln={class:"settings-nickname"},qn={class:"settings-username"},Kn={class:"settings-form-section"},Wn={class:"settings-form-header"},jn={class:"settings-form-title"},Hn={class:"settings-form"},On={class:"settings-form-item"},Pn={key:1,class:"settings-form-value"},Xn={class:"settings-form-item"},Yn={key:1,class:"settings-form-value"},Gn={class:"settings-form-item"},Jn={key:1,class:"settings-form-value"},Qn={class:"settings-form-item"},Zn={key:1,class:"settings-form-value bio-value"},vn={key:0,class:"settings-form-actions"},st=Me({__name:"ChatWindow",props:{modelValue:{type:Boolean,default:!1},config:{type:Object,required:!0},width:{type:[String,Number],default:"1100px"}},emits:["update:modelValue","open","close","message","send","error"],setup(g,{emit:t}){const s=g,d=t,k=e.computed({get:()=>s.modelValue,set:c=>d("update:modelValue",c)}),{myUsername:I,myAvatar:b,userInfo:U,loadingUserInfo:x,friendList:T,filteredFriendList:_,searchText:h,inputText:E,messagesContainer:w,filteredUsers:W,filteredAvailableUsers:se,currentUser:G,currentMessages:j,addFriendDialogVisible:X,addFriendSearchText:oe,availableUsers:y,loadingAvailableUsers:B,friendApplyList:S,loadingFriendApply:H,formatTime:ne,formatLastTime:J,scrollToBottom:re,getFriendList:de,getChatHistory:me,setFriendToChatStatus:ie,selectUser:Q,sendMessage:Z,sendFile:ce,sendFilesAndText:_e,initWebSocket:Ve,closeWebSocket:ke,reset:ye,openAddFriendDialog:pe,addFriend:Ne,loadFriendApplyList:Ee,agreeFriend:Ce,updateMyAvatar:be,getUserInfo:we,updateUserInfo:Be}=Te(s.config),ee=e.computed(()=>{var a;const c=[{id:"chat",icon:u.ChatDotRound,badge:0}];return s.config.modules.friends&&c.push({id:"friends",icon:u.UserFilled,badge:0}),s.config.modules.apply&&c.push({id:"apply",icon:u.Bell,badge:((a=S.value)==null?void 0:a.length)||0}),c}),O=e.ref("chat"),z=e.ref(null),C=e.ref(null),M=e.ref(null),L=e.ref(!1),$=e.ref(!1),q=e.ref({nickname:"",email:"",phone:"",bio:""}),le=e.ref(!1),n=e.ref(!1),i=e.ref(!1),p=e.ref(!1),V=e.ref(null),Y=e.ref(""),F=e.ref(null),D=e.ref([]),te=e.ref({visible:!1,x:0,y:0,chat:null}),fe=()=>{te.value.visible=!1},Re=async()=>{if(!te.value.chat)return;await ie(te.value.chat.id,0)&&z.value===te.value.chat.id&&(z.value=null,C.value=null),fe()},he=c=>{z.value=c.id,C.value=c,M.value=null,L.value=!1,Q({id:c.id,name:c.name,avatar:c.avatar,online:c.online})},Le=c=>{M.value=c,z.value=null,C.value=null},qe=async()=>{if(!M.value)return;if(await ie(M.value.id)){O.value="chat",await e.nextTick();const a=W.value.find(f=>f.id===M.value.id);a&&he(a),M.value=null}},Ke=()=>{n.value=!0},We=()=>{var c;(c=V.value)==null||c.click()},je=()=>{var c;(c=F.value)==null||c.click()},He=c=>{const a=Array.from(c.target.files||[]);if(a.length!==0){for(const f of a){if(f.size>50*1024*1024){A.ElMessage.warning(`文件 ${f.name} 超过50MB,已跳过`);continue}const N=URL.createObjectURL(f);D.value.push({id:Date.now()+Math.random(),file:f,name:f.name,size:f.size,type:f.type,previewUrl:N,isImage:f.type.startsWith("image/")})}F.value&&(F.value.value="")}},xe=c=>{const a=D.value[c];a.previewUrl&&URL.revokeObjectURL(a.previewUrl),D.value.splice(c,1)},Ue=c=>{if(c===0)return"0 B";const a=1024,f=["B","KB","MB","GB"],N=Math.floor(Math.log(c)/Math.log(a));return parseFloat((c/Math.pow(a,N)).toFixed(2))+" "+f[N]},Se=async()=>{if(!E.value.trim()&&D.value.length===0)return;const c=[...D.value],a=E.value;E.value="",D.value.forEach(f=>{f.previewUrl&&URL.revokeObjectURL(f.previewUrl)}),D.value=[],await _e(c,a),d("send",{text:a,files:c})},Oe=c=>{var f;const a=(f=c.clipboardData)==null?void 0:f.items;if(a){for(const N of a)if(N.kind==="file"){const K=N.getAsFile();if(K){if(K.size>50*1024*1024){A.ElMessage.warning(`文件 ${K.name} 超过50MB,已跳过`);continue}const v=URL.createObjectURL(K);D.value.push({id:Date.now()+Math.random(),file:K,name:K.name,size:K.size,type:K.type,previewUrl:v,isImage:K.type.startsWith("image/")})}}}},$e=c=>{if(!c){A.ElMessage.warning("文件地址无效");return}window.open(c,"_blank")},Pe=c=>{console.warn("图片加载失败",c)},Xe=c=>{const a=c.target.files[0];if(!a)return;if(!a.type.startsWith("image/")){A.ElMessage.error("只能上传图片文件");return}if(a.size>5*1024*1024){A.ElMessage.error("图片大小不能超过 5MB");return}const f=new FileReader;f.onload=N=>{Y.value=N.target.result,i.value=!0},f.readAsDataURL(a)},Ye=async({file:c})=>{if(c){p.value=!0;try{const{ChatApi:a}=await Promise.resolve().then(()=>tt),N=await new a(s.config).uploadAvatar(c,I);N.code===200?(A.ElMessage.success("头像上传成功"),be(N.data),ze()):A.ElMessage.error(N.msg||"头像上传失败")}catch(a){console.error(a),A.ElMessage.error("头像上传失败")}finally{p.value=!1}}},ze=()=>{Y.value="",i.value=!1,V.value&&(V.value.value="")},Ge=()=>{q.value={nickname:U.value.nickname||"",email:U.value.email||"",phone:U.value.phone||"",bio:U.value.bio||""},$.value=!0},Je=()=>{$.value=!1,q.value={nickname:"",email:"",phone:"",bio:""}},Qe=async()=>{le.value=!0;try{await Be(q.value)?(A.ElMessage.success("保存成功"),$.value=!1):A.ElMessage.error("保存失败")}catch(c){console.error(c),A.ElMessage.error("保存失败")}finally{le.value=!1}},m=()=>{ye(),ke(),L.value=!1,n.value=!1,ze(),$.value=!1,d("close")},r=async()=>{await Promise.all([de(),Ee(),we()]),Ve(),W.value.length>0&&he(W.value[0]),d("open")};return e.onMounted(()=>{document.addEventListener("click",fe)}),e.onUnmounted(()=>{document.removeEventListener("click",fe),ke()}),(c,a)=>{const f=e.resolveComponent("el-icon"),N=e.resolveComponent("el-input"),K=e.resolveComponent("el-empty"),v=e.resolveComponent("el-button"),ue=e.resolveComponent("el-dialog");return e.openBlock(),e.createBlock(ue,{modelValue:k.value,"onUpdate:modelValue":a[13]||(a[13]=ge=>k.value=ge),width:g.width,"close-on-click-modal":!1,class:"chat-dialog","append-to-body":"",onClosed:m,onOpen:r},{default:e.withCtx(()=>{var ge,o,P;return[e.createElementVNode("div",ls,[e.createElementVNode("div",os,[e.createElementVNode("div",{class:"sidebar-avatar",onClick:Ke},[e.createElementVNode("img",{src:e.unref(b),alt:"头像",class:"avatar-img"},null,8,rs)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(ee.value,l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["nav-item",O.value===l.id?"nav-item-active":"nav-item-inactive"]),onClick:ae=>O.value=l.id},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.icon)))]),_:2},1024),l.badge?(e.openBlock(),e.createElementBlock("span",cs,e.toDisplayString(l.badge>99?"99+":l.badge),1)):e.createCommentVNode("",!0)],10,is))),128)),a[14]||(a[14]=e.createElementVNode("div",{class:"nav-spacer"},null,-1)),g.config.modules.settings?(e.openBlock(),e.createElementBlock("div",{key:0,class:"nav-item nav-item-inactive",onClick:a[0]||(a[0]=l=>n.value=!0),title:"设置"},[e.createVNode(f,{size:24},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Setting))]),_:1})])):e.createCommentVNode("",!0)]),e.createElementVNode("div",ds,[e.createElementVNode("div",ms,[e.createVNode(N,{modelValue:e.unref(h),"onUpdate:modelValue":a[1]||(a[1]=l=>e.isRef(h)?h.value=l:null),placeholder:"搜索","prefix-icon":e.unref(u.Search)},null,8,["modelValue","prefix-icon"])]),e.createElementVNode("div",ps,[O.value==="chat"?(e.openBlock(),e.createElementBlock("div",fs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(W),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:e.normalizeClass(["chat-item",z.value===l.id?"chat-item-active":""]),onClick:ae=>he(l),onContextmenu:e.withModifiers(ae=>c.showContextMenu(ae,l),["prevent","stop"])},[e.createElementVNode("div",gs,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"friend-avatar"},null,8,ks),l.online?(e.openBlock(),e.createElementBlock("span",ys)):e.createCommentVNode("",!0)]),e.createElementVNode("div",us,[e.createElementVNode("div",_s,[e.createElementVNode("span",Vs,e.toDisplayString(l.name),1),e.createElementVNode("span",Ns,e.toDisplayString(e.unref(J)(l.lastTime)),1)]),e.createElementVNode("div",Es,[e.createElementVNode("span",Cs,e.toDisplayString(l.lastMsg),1),l.unread>0?(e.openBlock(),e.createElementBlock("span",bs,e.toDisplayString(l.unread>99?"99+":l.unread),1)):e.createCommentVNode("",!0)])])],42,hs))),128))])):e.createCommentVNode("",!0),O.value==="friends"&&g.config.modules.friends?(e.openBlock(),e.createElementBlock("div",ws,[e.createElementVNode("div",Bs,[e.createElementVNode("div",{class:"add-friend-btn",onClick:a[2]||(a[2]=(...l)=>e.unref(pe)&&e.unref(pe)(...l))},[e.createElementVNode("div",xs,[e.createVNode(f,{class:"text-white",size:20},{default:e.withCtx(()=>[e.createVNode(e.unref(u.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(_),l=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"chat-item",onClick:ae=>Le(l)},[e.createElementVNode("div",Ss,[e.createElementVNode("img",{src:l.avatar,alt:l.name,class:"friend-avatar"},null,8,$s),e.createElementVNode("span",{class:e.normalizeClass(["online-indicator",l.online?"online":"offline"])},null,2)]),e.createElementVNode("div",Fs,[e.createElementVNode("span",Ds,e.toDisplayString(l.name),1)])],8,Us))),128))])):e.createCommentVNode("",!0),O.value==="apply"&&g.config.modules.apply?(e.openBlock(),e.createElementBlock("div",As,[e.unref(H)?(e.openBlock(),e.createBlock(K,{key:0,description:"加载中..."})):e.unref(S).length===0?(e.openBlock(),e.createBlock(K,{key:1,description:"暂无好友申请"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(S),l=>(e.openBlock(),e.createElementBlock("div",{key:l.applyUser||l.id,class:"friend-request-item"},[e.createElementVNode("div",zs,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.applyUser}`,alt:l.applyUser,class:"request-avatar"},null,8,Is),e.createElementVNode("div",Ts,[e.createElementVNode("div",Ms,e.toDisplayString(l.applyUser),1),a[16]||(a[16]=e.createElementVNode("div",{class:"request-desc"},"请求添加你为好友",-1))])]),e.createVNode(v,{type:"primary",size:"small",onClick:ae=>e.unref(Ce)(l.applyUser)},{default:e.withCtx(()=>[...a[17]||(a[17]=[e.createTextVNode("同意",-1)])]),_:1},8,["onClick"])]))),128))])):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Rs,[M.value&&!C.value?(e.openBlock(),e.createElementBlock("div",Ls,[e.createElementVNode("img",{src:M.value.avatar,alt:M.value.name,class:"profile-avatar"},null,8,qs),e.createElementVNode("div",Ks,e.toDisplayString(M.value.name),1),e.createElementVNode("div",Ws,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",M.value.online?"status-online":"status-offline"])},null,2),e.createElementVNode("span",null,e.toDisplayString(M.value.online?"在线":"离线"),1)]),e.createVNode(v,{type:"primary",size:"large",onClick:qe,class:"start-chat-btn"},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),a[18]||(a[18]=e.createElementVNode("span",null,"发消息",-1))]),_:1})])):e.createCommentVNode("",!0),C.value?(e.openBlock(),e.createElementBlock("div",js,[e.createElementVNode("div",Hs,[e.createElementVNode("div",Os,[e.createElementVNode("span",Ps,e.toDisplayString(C.value.name),1),e.createElementVNode("span",{class:e.normalizeClass(["status-badge",C.value.online?"status-badge-online":"status-badge-offline"])},e.toDisplayString(C.value.online?"在线":"离线"),3)]),e.createElementVNode("div",Xs,[e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Search))]),_:1}),e.createVNode(f,{class:"action-icon",onClick:a[3]||(a[3]=l=>L.value=!L.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.MoreFilled))]),_:1})])]),e.createElementVNode("div",{ref_key:"messagesContainer",ref:w,class:"messages-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(j),(l,ae)=>(e.openBlock(),e.createElementBlock("div",{key:ae,class:e.normalizeClass(["message-wrapper",l.isSelf?"message-self":"message-other"])},[e.createElementVNode("div",Ys,[e.createElementVNode("img",{src:l.isSelf?e.unref(b):C.value.avatar,class:"avatar-sm"},null,8,Gs)]),e.createElementVNode("div",{class:e.normalizeClass(["message-content-wrapper",l.isSelf?"content-self":"content-other"])},[l.isSelf?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Js,e.toDisplayString(C.value.name),1)),e.createElementVNode("div",Qs,[l.type==="text"?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["message-bubble",l.isSelf?"bubble-self":"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","image-bubble",l.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>$e(l.fileUrl)},[e.createElementVNode("img",{src:l.fileUrl,alt:l.fileName,class:"message-image",onError:Pe},null,40,vs),l.fileSize?(e.openBlock(),e.createElementBlock("div",en,e.toDisplayString(Ue(l.fileSize)),1)):e.createCommentVNode("",!0)],10,Zs)):l.type==="file"?(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["message-bubble","file-bubble",l.isSelf?"bubble-self":"bubble-other"]),onClick:Ze=>$e(l.fileUrl)},[e.createElementVNode("div",an,[e.createElementVNode("div",sn,[e.createVNode(f,{size:28},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Document))]),_:1})]),e.createElementVNode("div",nn,[e.createElementVNode("div",ln,e.toDisplayString(l.fileName||l.text),1),e.createElementVNode("div",on,[e.createVNode(f,{size:12},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Download))]),_:1}),a[19]||(a[19]=e.createElementVNode("span",null,"点击下载",-1)),l.fileSize?(e.openBlock(),e.createElementBlock("span",rn,"· "+e.toDisplayString(Ue(l.fileSize)),1)):e.createCommentVNode("",!0)])])])],10,tn)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["message-time",l.isSelf?"time-right":"time-left"])},e.toDisplayString(e.unref(ne)(l.time)),3)])],2)],2))),128))],512),e.createElementVNode("div",cn,[D.value.length>0?(e.openBlock(),e.createElementBlock("div",dn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,(l,ae)=>(e.openBlock(),e.createElementBlock("div",{key:l.id,class:"pending-file"},[l.isImage?(e.openBlock(),e.createElementBlock("div",mn,[e.createElementVNode("img",{src:l.previewUrl,alt:l.name,class:"pending-image"},null,8,pn),e.createElementVNode("button",{onClick:Ze=>xe(ae),class:"remove-file-btn"}," × ",8,fn)])):(e.openBlock(),e.createElementBlock("div",hn,[e.createVNode(f,{class:"pending-file-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createElementVNode("span",gn,e.toDisplayString(l.name),1),e.createElementVNode("button",{onClick:Ze=>xe(ae),class:"remove-file-btn"}," × ",8,kn)]))]))),128))])):e.createCommentVNode("",!0),g.config.modules.fileUpload?(e.openBlock(),e.createElementBlock("div",yn,[e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatDotRound))]),_:1}),e.createVNode(f,{class:"action-icon",onClick:je},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Folder))]),_:1}),e.createVNode(f,{class:"action-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Picture))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",un,[e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":a[4]||(a[4]=l=>e.isRef(E)?E.value=l:null),onKeydown:e.withKeys(e.withModifiers(Se,["prevent"]),["enter"]),onPaste:Oe,placeholder:"输入消息或粘贴文件...",class:"message-input",rows:"3"},null,40,_n),[[e.vModelText,e.unref(E)]])]),e.createElementVNode("div",Vn,[e.createVNode(v,{type:"primary",disabled:!e.unref(E).trim()&&D.value.length===0,onClick:Se,class:"send-btn"},{default:e.withCtx(()=>[...a[20]||(a[20]=[e.createTextVNode(" 发送 ",-1)])]),_:1},8,["disabled"])]),e.createElementVNode("input",{ref_key:"fileInputRef",ref:F,type:"file",multiple:"",class:"hidden-file-input",onChange:He},null,544)])])):M.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Nn,[e.createVNode(f,{size:64,class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.ChatLineRound))]),_:1}),e.createElementVNode("div",En,e.toDisplayString(O.value==="apply"?"在左侧选择好友申请":"在左侧选择好友开始聊天"),1)]))]),L.value?(e.openBlock(),e.createElementBlock("div",Cn,[a[22]||(a[22]=e.createElementVNode("div",{class:"detail-header"},"聊天详情",-1)),e.createElementVNode("div",bn,[e.createElementVNode("div",wn,[e.createElementVNode("img",{src:(ge=C.value)==null?void 0:ge.avatar,alt:(o=C.value)==null?void 0:o.name,class:"detail-avatar"},null,8,Bn),e.createElementVNode("div",xn,e.toDisplayString((P=C.value)==null?void 0:P.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(ue,{modelValue:e.unref(X),"onUpdate:modelValue":a[6]||(a[6]=l=>e.isRef(X)?X.value=l:null),title:"添加好友",width:"500px","append-to-body":""},{default:e.withCtx(()=>[e.createElementVNode("div",Un,[e.createElementVNode("div",Sn,[e.createVNode(N,{modelValue:e.unref(oe),"onUpdate:modelValue":a[5]||(a[5]=l=>e.isRef(oe)?oe.value=l:null),placeholder:"搜索用户","prefix-icon":e.unref(u.Search)},null,8,["modelValue","prefix-icon"])])]),e.createElementVNode("div",$n,[e.unref(B)?(e.openBlock(),e.createBlock(K,{key:0,description:"加载中..."})):e.unref(se).length===0?(e.openBlock(),e.createBlock(K,{key:1,description:"暂无用户"})):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(se),l=>(e.openBlock(),e.createElementBlock("div",{key:l.username,class:"available-user-item"},[e.createElementVNode("div",Fn,[e.createElementVNode("img",{src:`https://api.dicebear.com/7.x/avataaars/svg?seed=${l.username}`,alt:l.username,class:"available-user-avatar"},null,8,Dn),e.createElementVNode("div",An,e.toDisplayString(l.username),1)]),e.createVNode(v,{type:"primary",size:"small",onClick:ae=>e.unref(Ne)(l)},{default:e.withCtx(()=>[...a[23]||(a[23]=[e.createTextVNode("添加",-1)])]),_:1},8,["onClick"])]))),128))])]),_:1},8,["modelValue"]),e.createVNode(ue,{modelValue:n.value,"onUpdate:modelValue":a[11]||(a[11]=l=>n.value=l),title:"个人设置",width:"560px","close-on-click-modal":!1,"append-to-body":"",class:"settings-dialog"},{default:e.withCtx(()=>[e.createElementVNode("div",zn,[e.createElementVNode("div",In,[e.createElementVNode("div",Tn,[e.createElementVNode("img",{src:e.unref(b),alt:"头像",class:"settings-avatar"},null,8,Mn),g.config.modules.avatarCrop?(e.openBlock(),e.createElementBlock("div",{key:0,class:"settings-avatar-edit",onClick:We},[e.createVNode(f,{size:18,class:"settings-avatar-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Camera))]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"avatarInputRef",ref:V,type:"file",accept:"image/*",class:"hidden-avatar-input",onChange:Xe},null,544)]),e.createElementVNode("div",Rn,[e.createElementVNode("div",Ln,e.toDisplayString(e.unref(U).nickname||e.unref(I)),1),e.createElementVNode("div",qn,"@"+e.toDisplayString(e.unref(I)),1)])]),e.createElementVNode("div",Kn,[e.createElementVNode("div",Wn,[e.createElementVNode("div",jn,[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(e.unref(u.UserFilled))]),_:1}),a[24]||(a[24]=e.createTextVNode(" 个人信息 ",-1))]),$.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(v,{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",Hn,[e.createElementVNode("div",On,[a[26]||(a[26]=e.createElementVNode("label",{class:"settings-form-label"},"昵称",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.nickname,"onUpdate:modelValue":a[7]||(a[7]=l=>q.value.nickname=l),placeholder:"请输入昵称",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Pn,e.toDisplayString(e.unref(U).nickname||"未设置"),1))]),e.createElementVNode("div",Xn,[a[27]||(a[27]=e.createElementVNode("label",{class:"settings-form-label"},"邮箱",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.email,"onUpdate:modelValue":a[8]||(a[8]=l=>q.value.email=l),placeholder:"请输入邮箱",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Yn,e.toDisplayString(e.unref(U).email||"未设置"),1))]),e.createElementVNode("div",Gn,[a[28]||(a[28]=e.createElementVNode("label",{class:"settings-form-label"},"手机号",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.phone,"onUpdate:modelValue":a[9]||(a[9]=l=>q.value.phone=l),placeholder:"请输入手机号",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Jn,e.toDisplayString(e.unref(U).phone||"未设置"),1))]),e.createElementVNode("div",Qn,[a[29]||(a[29]=e.createElementVNode("label",{class:"settings-form-label"},"个人简介",-1)),$.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:q.value.bio,"onUpdate:modelValue":a[10]||(a[10]=l=>q.value.bio=l),type:"textarea",rows:4,placeholder:"介绍一下自己吧...",size:"large"},null,8,["modelValue"])):(e.openBlock(),e.createElementBlock("div",Zn,e.toDisplayString(e.unref(U).bio||"这个人很懒,什么都没写~"),1))]),$.value?(e.openBlock(),e.createElementBlock("div",vn,[e.createVNode(v,{size:"default",onClick:Je},{default:e.withCtx(()=>[...a[30]||(a[30]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(v,{type:"primary",size:"default",loading:le.value,onClick:Qe},{default:e.withCtx(()=>[...a[31]||(a[31]=[e.createTextVNode("保存更改",-1)])]),_:1},8,["loading"])])):e.createCommentVNode("",!0)])])])]),_:1},8,["modelValue"]),e.createVNode(Ae,{modelValue:i.value,"onUpdate:modelValue":a[12]||(a[12]=l=>i.value=l),src:Y.value,onConfirm:Ye},null,8,["modelValue","src"]),te.value.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"context-menu",style:e.normalizeStyle({left:te.value.x+"px",top:te.value.y+"px"})},[e.createElementVNode("div",{class:"context-menu-item",onClick:Re},"删除聊天")],4)):e.createCommentVNode("",!0)]}),_:1},8,["modelValue","width"])}}},[["__scopeId","data-v-a76a4ef3"]]),el={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",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 tl(g={}){const t=nt(el,g);return t.api.baseUrl||console.warn("[VueChatKit] 请配置 api.baseUrl"),t.api.websocketUrl||console.warn("[VueChatKit] 请配置 api.websocketUrl"),t.user.username||console.warn("[VueChatKit] 请配置 user.username"),t}function nt(g,t){const s={...g};for(const d in t)t[d]&&typeof t[d]=="object"&&!Array.isArray(t[d])?s[d]=nt(g[d]||{},t[d]):s[d]=t[d];return s}const lt={install(g){g.component("ChatPanel",at),g.component("ChatWindow",st),g.component("AvatarCrop",Ae)}};R.AvatarCrop=Ae,R.ChatApi=De,R.ChatPanel=at,R.ChatWebSocket=ve,R.ChatWindow=st,R.HttpClient=et,R.VueChatKit=lt,R.createChatConfig=tl,R.default=lt,R.useChat=Te,Object.defineProperties(R,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-chat-kit",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "一个功能完整的 Vue 3 聊天组件库,支持 WebSocket 实时通信、文件上传、好友管理等功能。独立封装,无需额外 CSS 框架依赖。",
5
5
  "type": "module",
6
6
  "main": "dist/vue-chat-kit.umd.js",
package/src/index.js CHANGED
@@ -1,13 +1,18 @@
1
1
  // 导入样式
2
2
  import './style.css'
3
3
 
4
+ // 先导入组件用于 Vue 插件
5
+ import ChatPanel from './components/ChatPanel.vue'
6
+ import ChatWindow from './components/ChatWindow.vue'
7
+ import AvatarCrop from './components/AvatarCrop.vue'
8
+
4
9
  // 导出组件 - 新的独立面板组件(推荐使用)
5
- export { default as ChatPanel } from './components/ChatPanel.vue'
10
+ export { ChatPanel }
6
11
 
7
12
  // 保留旧版弹窗组件,向后兼容
8
- export { default as ChatWindow } from './components/ChatWindow.vue'
13
+ export { ChatWindow }
9
14
 
10
- export { default as AvatarCrop } from './components/AvatarCrop.vue'
15
+ export { AvatarCrop }
11
16
 
12
17
  // 导出 composables
13
18
  export { useChat } from './composables/useChat.js'