mirror of
https://git-qiuchenly.yltfspace.com/QiuChenly/corepatch
synced 2025-11-25 05:40:27 +08:00
112 lines
26 KiB
JavaScript
112 lines
26 KiB
JavaScript
import{d as e,r as s,c as a,w as t,o as n,I as l,i,a as o,e as c,m as u,g as d,b as r,z as v,l as m,q as g,F as p,B as h,t as f,n as y,u as k,A as w,C as b,D as C,p as I,G as E,k as M,H as T,h as x}from"./CdD4XvnD.js"
|
||
import{c as S,i as N,g as A,u as D,f as $,j as L,W as _,_ as B,b as O,M as z,T as R,A as F,a as U}from"./BaSQ3xJt.js"
|
||
import{I as j}from"./j0cGtmjd.js"
|
||
import{I as W}from"./JespKOZ3.js"
|
||
import{u as G}from"./4xYhABhf.js"
|
||
import{u as q}from"./lyDeIg7R.js"
|
||
import"./BqTCaadz.js"
|
||
const V={class:"messages-page"},K={class:"page-container"},H={class:"page-header"},P={class:"page-title"},J={key:0,class:"title-badge"},Q={class:"messages-layout"},X={class:"conversations-sidebar"},Y={class:"sidebar-header"},Z={class:"conversations-list"},ee={key:0,class:"conversations-loading"},se=["onClick","onContextmenu"],ae={class:"conversation-avatar"},te=["title"],ne={key:0,class:"unread-badge"},le={class:"conversation-info"},ie={class:"conversation-header"},oe={class:"conversation-name"},ce={class:"conversation-time"},ue={class:"conversation-preview"},de={class:"preview-text"},re={key:0,class:"unread-indicator"},ve=["onClick"],me={key:2,class:"empty-conversations"},ge={class:"messages-content"},pe={key:0,class:"user-selection-view"},he={class:"selection-header"},fe={class:"selection-search"},ye={class:"search-input-wrapper"},ke={class:"user-list-container"},we={key:0,class:"users-loading"},be={key:1,class:"users-error"},Ce={key:2,class:"users-empty"},Ie={key:3,class:"users-list"},Ee=["onClick"],Me={class:"user-item-info"},Te={class:"user-item-name"},xe={key:0,class:"user-item-username"},Se={key:1,class:"user-item-username"},Ne={key:1,class:"empty-conversation-view"},Ae={key:2,class:"conversation-view"},De={class:"conversation-header-bar"},$e={class:"header-user-info"},Le={class:"user-details"},_e={class:"user-name"},Be={class:"user-status"},Oe={key:0,class:"status-badge blocked"},ze={key:1,class:"status-badge muted"},Re={key:2,class:"status-badge online"},Fe={key:3,class:"status-badge offline"},Ue={key:4,class:"status-badge offline"},je={class:"header-actions-group"},We={key:0,class:"messages-loading"},Ge={key:0,class:"message-item system-message"},qe={class:"system-message-content"},Ve={key:0,class:"message-avatar"},Ke={class:"message-content-wrapper"},He={class:"message-content"},Pe={key:0,class:"message-text"},Je={key:1,class:"message-attachments"},Qe={key:0,class:"message-images"},Xe={key:1,class:"message-files"},Ye=["onClick"],Ze={class:"attachment-name"},es={class:"attachment-size"},ss={class:"message-footer"},as={class:"message-time"},ts={key:0,class:"message-status sending"},ns={key:1,class:"message-status sent"},ls={key:2,class:"message-status failed"},is={key:3,class:"message-actions"},os=["onClick"],cs=["onClick"],us={key:1,class:"message-avatar"},ds={class:"message-input-area"},rs={key:0,class:"input-disabled-notice"},vs={key:1},ms={class:"input-toolbar"},gs=["disabled"],ps=["disabled"],hs=["onKeydown"],fs={key:2,class:"attachments-preview"},ys=["src"],ks=["onClick"],ws={class:"file-name"},bs=["onClick"],Cs={key:3,class:"input-footer"},Is={class:"char-count"},Es=["disabled"],Ms=U(e({__name:"Messages",setup(e){const U=T(),Ms=l(),{toasts:Ts,error:xs,success:Ss,info:Ns,removeToast:As}=S(),Ds=N(),{loadingState:$s,show:Ls,hide:_s}=A(),{user:Bs}=D()
|
||
$()
|
||
const Os=L(),{isConnected:zs,getConversations:Rs,deleteConversation:Fs,getMessages:Us,sendMessage:js,recallMessage:Ws,deleteMessage:Gs}=Os,{isUserOnline:qs,queryUsersOnlineStatus:Vs}=G(),Ks=s([]),Hs=s(!1),Ps=s(!1),Js=s(null),Qs=s(""),Xs=s([]),Ys=s([]),Zs=s(null),ea=s(null),sa=s(null),aa=s(!1),ta=q(),na=s(null),la=s(!1),ia=s(null),oa=s(!1),ca=s(""),ua=s([]),da=s(!1),ra=s(""),va=s(1),ma=s(50),ga=s(0),pa=a(()=>Ks.value.find(e=>e.id===Js.value)||null),ha=a(()=>{var e
|
||
return(null==(e=pa.value)?void 0:e.userId)?qs(pa.value.userId).value:null}),fa=a(()=>Ks.value.reduce((e,s)=>e+(s.unreadCount||0),0)),ya=a(()=>Qs.value.trim().length>0||Xs.value.length>0||Ys.value.length>0),ka=async e=>{oa.value=!1,Js.value=e
|
||
const s=Ks.value.find(s=>s.id===e)
|
||
s&&(s.unreadCount=0,s.messages&&0!==s.messages.length||await ba(e)),M(()=>{qa()})},wa=(e,s=!1)=>{if(e&&e.conversations){const s=e.conversations.map(e=>{var s
|
||
return{id:e.id,userId:e.userId,userName:e.userName,userAvatar:e.userAvatar||e.avatar,lastMessage:e.lastMessage,lastMessageTime:e.lastMessageTime,unreadCount:e.unreadCount||0,messages:(null==(s=Ks.value.find(s=>s.id===e.id))?void 0:s.messages)||[],blocked:e.blocked||!1,muted:e.muted||!1}}),a=new Map(Ks.value.map(e=>[e.id,e])),t=s.filter(e=>!a.has(e.id)&&e.lastMessage&&e.lastMessage.trim().length>0),n=s.filter(e=>!(a.has(e.id)||e.lastMessage&&0!==e.lastMessage.trim().length)),l=[],i=[]
|
||
s.forEach(e=>{const s=a.get(e.id)
|
||
if(s){const a=s.lastMessageTime!==e.lastMessageTime&&e.lastMessage&&e.lastMessage.trim().length>0,t=s.unreadCount!==e.unreadCount
|
||
a||t?l.push({...e,messages:s.messages||[]}):i.push(s)}}),0===Ks.value.length?Ks.value=s:Ks.value=[...l,...t,...i,...n]}else s||(Ks.value=[])
|
||
if(window.dispatchEvent(new CustomEvent("messages:conversations-updated")),e&&e.conversations&&e.conversations.length>0){const s=e.conversations.map(e=>e.userId).filter(Boolean)
|
||
s.length>0&&zs.value&&Vs(s).catch(e=>{})}},ba=async e=>{if(zs.value){Ps.value=!0
|
||
try{const s=await Us(e,1,100)
|
||
if(s&&s.messages){const a=Ks.value.find(s=>s.id===e)
|
||
a&&(a.messages=s.messages.map(e=>({id:e.id,content:e.content,sendTime:e.sendTime,sent:e.sent,status:e.sent?"sent":void 0,attachments:e.attachments,recalled:e.recalled||!1,deleted:e.deleted||!1})))}}catch(s){if(s.message&&s.message.includes("WebSocket未连接"))return
|
||
xs(s.message||"加载消息列表失败",2e3)}finally{Ps.value=!1}}},Ca=()=>{oa.value=!0,Js.value=null,ca.value="",va.value=1,Ea()},Ia=()=>{oa.value=!1,ca.value="",va.value=1},Ea=async()=>{da.value=!0,ra.value=""
|
||
try{const e=await F.getUsersForChat(va.value,ma.value,ca.value||void 0)
|
||
e.users&&Array.isArray(e.users)?(ua.value=e.users.map(e=>{var s
|
||
return{id:e.id||e._id||(null==(s=e._id)?void 0:s.toString()),username:e.username||"",nickName:e.nickName||"",avatar:e.avatar||"",age:e.age}}),ga.value=e.total||0):ra.value="加载用户列表失败"}catch(e){ra.value=e.message||"加载用户列表失败"}finally{da.value=!1}},Ma=()=>{clearTimeout(Ma.timer),Ma.timer=setTimeout(()=>{va.value=1,Ea()},300)},Ta=()=>{ca.value="",va.value=1,Ea()},xa=a(()=>{if(!ca.value.trim())return ua.value
|
||
const e=ca.value.toLowerCase()
|
||
return ua.value.filter(s=>s.username&&s.username.toLowerCase().includes(e)||s.nickName&&s.nickName.toLowerCase().includes(e))}),Sa=async e=>{Ls("创建会话...")
|
||
try{const a=await F.getOrCreateConversationByUserId(e)
|
||
if(a.success&&a.data){const{conversationId:t,userName:n}=a.data
|
||
if(Ks.value.find(e=>e.id===t))Js.value=t,await ka(t)
|
||
else{let a
|
||
try{const s=await F.getUserInfo(e)
|
||
s&&(a=s.avatar)}catch(s){}const l={id:t,userId:e,userName:n,userAvatar:a,lastMessage:"",lastMessageTime:(new Date).toISOString(),unreadCount:0,messages:[],blocked:!1,muted:!1}
|
||
Ks.value.push(l),Js.value=t,await ka(t)}U.replace({path:"/messages",query:{}})}else xs(a.message||"创建会话失败",2e3)}catch(s){xs("创建会话失败",2e3)}finally{_s()}},Na=()=>{pa.value&&(na.value={userId:pa.value.userId,userName:pa.value.userName,content:"",type:void 0},aa.value=!0,la.value=!1)},Aa=async()=>{if(pa.value){Ls("设置拒收...")
|
||
try{const e=await F.setConversationMute(pa.value.id,!0)
|
||
e.success?(pa.value.muted=!0,la.value=!1):xs(e.message||"操作失败",2e3)}catch(e){xs("设置拒收失败",2e3)}finally{_s()}}},Da=async()=>{if(pa.value){Ls("取消拒收...")
|
||
try{const e=await F.setConversationMute(pa.value.id,!1)
|
||
e.success?(pa.value.muted=!1,la.value=!1):xs(e.message||"操作失败",2e3)}catch(e){xs("取消拒收失败",2e3)}finally{_s()}}},$a=async()=>{if(!pa.value)return
|
||
const e=await Ds.show({title:"拉黑用户",message:`确定要拉黑用户"${pa.value.userName}"吗?拉黑后将无法接收该用户的消息。`,type:"warning",confirmText:"拉黑",cancelText:"取消"})
|
||
if(e&&null!==e){Ls("拉黑用户...")
|
||
try{const e=await F.setConversationBlock(pa.value.id,!0)
|
||
e.success?(pa.value.blocked=!0,pa.value.muted=!0,la.value=!1):xs(e.message||"操作失败",2e3)}catch(s){xs("拉黑用户失败",2e3)}finally{_s()}}},La=async()=>{if(pa.value){Ls("取消拉黑...")
|
||
try{const e=await F.setConversationBlock(pa.value.id,!1)
|
||
e.success?(pa.value.blocked=!1,la.value=!1):xs(e.message||"操作失败",2e3)}catch(e){xs("取消拉黑失败",2e3)}finally{_s()}}},_a=e=>{const s=e.target
|
||
ia.value&&!ia.value.contains(s)&&(la.value=!1)},Ba=async()=>{if(!ya.value||!pa.value)return
|
||
const e=Qs.value.trim()
|
||
if(!e&&0===Xs.value.length&&0===Ys.value.length)return
|
||
if(!zs.value)return void xs("WebSocket未连接,无法发送消息",2e3)
|
||
const s=`temp-${Date.now()}-${Math.random()}`,a={id:s,content:e||"",sendTime:(new Date).toISOString(),sent:!0,status:"sending",attachments:[...Xs.value.map((e,s)=>({id:`temp-img-${s}`,name:e.file.name,type:"image",size:e.file.size})),...Ys.value.map((e,s)=>({id:`temp-file-${s}`,name:e.file.name,type:"file",size:e.file.size}))],recalled:!1,deleted:!1}
|
||
pa.value.messages.push(a)
|
||
const t=[...Xs.value],n=[...Ys.value]
|
||
Qs.value="",Xs.value=[],Ys.value=[],M(()=>{qa()})
|
||
try{const a=[]
|
||
for(let e=0;e<t.length;e++){const s=t[e],n=await F.uploadImageAttachment(s.file)
|
||
if(!n.success||!n.attachmentId)throw new Error(n.message||"图片上传失败")
|
||
a.push(n.attachmentId)}for(let e=0;e<n.length;e++){const s=n[e],t=await F.uploadFileAttachment(s.file)
|
||
if(!t.success||!t.attachmentId)throw new Error(t.message||"文件上传失败")
|
||
a.push(t.attachmentId)}const l=await js(pa.value.id,e||"",a.length>0?a:void 0),i=pa.value.messages.findIndex(e=>e.id===s),o=l.sendTime instanceof Date?l.sendTime.toISOString():l.sendTime;-1!==i&&(pa.value.messages[i]={id:l.messageId,content:l.content,sendTime:o,sent:!0,status:"sent",attachments:l.attachments||[],recalled:!1,deleted:!1}),pa.value.lastMessage=e||"[附件]",pa.value.lastMessageTime=o,window.dispatchEvent(new CustomEvent("messages:conversations-updated"))}catch(l){const e=pa.value.messages.findIndex(e=>e.id===s);-1!==e&&(pa.value.messages[e].status="failed"),xs(l.message||"发送消息失败",2e3)}},Oa=()=>{var e
|
||
null==(e=Zs.value)||e.click()},za=()=>{var e
|
||
null==(e=ea.value)||e.click()},Ra=e=>{const s=e.target
|
||
Array.from(s.files||[]).forEach(e=>{if(Xs.value.length>=5)return
|
||
if(e.size>10485760)return void xs("图片大小不能超过10MB",2e3)
|
||
const s=new FileReader
|
||
s.onload=s=>{var a
|
||
Xs.value.push({file:e,preview:null==(a=s.target)?void 0:a.result})},s.readAsDataURL(e)}),s.value=""},Fa=e=>{const s=e.target
|
||
Array.from(s.files||[]).forEach(e=>{Ys.value.length>=5||(e.size>20971520?xs("文件大小不能超过20MB",2e3):Ys.value.push({file:e}))}),s.value=""},Ua=async e=>{const s=e.clipboardData
|
||
if(!s)return
|
||
const a=Array.from(s.items).find(e=>e.type.startsWith("image/"))
|
||
if(!a)return
|
||
if(e.preventDefault(),Xs.value.length>=5)return void xs("图片数量不能超过5张",2e3)
|
||
const t=a.getAsFile()
|
||
if(!t)return
|
||
if(t.size>10485760)return void xs("图片大小不能超过10MB",2e3)
|
||
const n=Date.now(),l=t.type.split("/")[1]||"png",i=new File([t],`paste-${n}.${l}`,{type:t.type}),o=new FileReader
|
||
o.onload=e=>{var s
|
||
Xs.value.push({file:i,preview:null==(s=e.target)?void 0:s.result})},o.readAsDataURL(i),Ss("图片已粘贴",2e3)},ja=e=>e.filter(e=>"image"===e.type),Wa=e=>e.filter(e=>"image"!==e.type),Ga=e=>{const s=new Date(e),a=(new Date).getTime()-s.getTime(),t=Math.floor(a/6e4),n=Math.floor(a/36e5),l=Math.floor(a/864e5)
|
||
return t<1?"刚刚":t<60?`${t}分钟前`:n<24?`${n}小时前`:l<7?`${l}天前`:s.toLocaleDateString("zh-CN")},qa=()=>{sa.value&&(sa.value.scrollTop=sa.value.scrollHeight)},Va=e=>{const s=e.detail
|
||
Hs.value&&(Hs.value=!1),wa(s,!0)},Ka=e=>{var s
|
||
const a=e.detail,{conversationId:t,messageId:n,content:l,sendTime:i,senderId:o,attachments:c}=a,u=Ks.value.find(e=>e.id===t)
|
||
if(u){Js.value===t?u.messages.some(e=>e.id===n)||(u.messages.push({id:n,content:l||"",sendTime:i,sent:o===(null==(s=Bs.value)?void 0:s._id),status:"sent",attachments:c||[],recalled:!1,deleted:!1}),M(()=>{qa()})):u.unreadCount=(u.unreadCount||0)+1,u.lastMessage=l.length>50?l.substring(0,50)+"...":l,u.lastMessageTime=i
|
||
const e=Ks.value.findIndex(e=>e.id===t)
|
||
e>0&&(Ks.value.splice(e,1),Ks.value.unshift(u))}window.dispatchEvent(new CustomEvent("messages:conversations-updated"))},Ha=e=>{const s=e,{messageId:a,conversationId:t,senderName:n}=s.detail,l=Ks.value.find(e=>e.id===t)
|
||
if(l){const e=l.messages.findIndex(e=>e.id===a)
|
||
if(-1!==e&&(l.messages.splice(e,1),n)){const s={id:`system-${Date.now()}-${Math.random()}`,content:`${n} 已撤回消息`,sendTime:(new Date).toISOString(),sent:!1,type:"system"}
|
||
l.messages.splice(e,0,s)}}},Pa=e=>{const s=e,{messageId:a,conversationId:t,senderName:n,deleteForBoth:l}=s.detail,i=Ks.value.find(e=>e.id===t)
|
||
if(i){const e=i.messages.findIndex(e=>e.id===a)
|
||
if(-1!==e){if(i.messages.splice(e,1),n&&l){const s={id:`system-${Date.now()}-${Math.random()}`,content:`${n} 已删除消息`,sendTime:(new Date).toISOString(),sent:!1,type:"system"}
|
||
i.messages.splice(e,0,s)}}else if(!i.messages.some(e=>"system"===e.type&&e.content.includes("已删除消息")&&e.content.includes(n))&&n&&l){const e={id:`system-${Date.now()}-${Math.random()}`,content:`${n} 已删除消息`,sendTime:(new Date).toISOString(),sent:!1,type:"system"}
|
||
i.messages.push(e)}}},Ja=async(e=0,s=3)=>{if(zs.value&&(!Hs.value||0!==e)){Hs.value=!0
|
||
try{const e=await Rs(1,50)
|
||
e&&e.conversations&&wa(e,!1)}catch(a){const t=a.message||"",n=t.includes("超时")||t.includes("timeout")||t.includes("请求超时")
|
||
if(n&&e<s)return Hs.value=!1,void setTimeout(()=>{Ja(e+1,s)},1e3*(e+1))
|
||
n||!t||t.includes("WebSocket未连接")||xs(t||"加载会话列表失败",2e3)}finally{0!==e&&Hs.value||(Hs.value=!1)}}}
|
||
return t(zs,e=>{e?setTimeout(()=>{zs.value&&Ja()},300):Hs.value&&(Hs.value=!1)}),n(async()=>{zs.value?setTimeout(async()=>{zs.value&&await Ja()},300):0===Ks.value.length&&(Hs.value=!0)
|
||
const e=Ms.query.userId
|
||
e&&await Sa(e),document.addEventListener("click",_a),window.addEventListener(_.CONVERSATIONS,Va),window.addEventListener(_.NEW_MESSAGE,Ka),window.addEventListener(_.MESSAGE_RECALLED,Ha),window.addEventListener(_.MESSAGE_DELETED,Pa)}),t(()=>Ms.query.userId,async e=>{e&&"string"==typeof e&&await Sa(e)}),i(()=>{document.removeEventListener("click",_a),window.removeEventListener(_.CONVERSATIONS,Va),window.removeEventListener(_.NEW_MESSAGE,Ka),window.removeEventListener(_.MESSAGE_RECALLED,Ha),window.removeEventListener(_.MESSAGE_DELETED,Pa)}),(e,s)=>(x(),o(p,null,[c("div",V,[c("div",K,[c("div",H,[c("h1",P,[s[5]||(s[5]=d(" 私信 ",-1)),fa.value>0?(x(),o("span",J,v(fa.value>99?"99+":fa.value),1)):r("",!0)]),s[6]||(s[6]=c("p",{class:"page-description"},"与用户进行一对一私信交流",-1))]),c("div",Q,[c("div",X,[c("div",Y,[s[8]||(s[8]=c("h2",null,"会话列表",-1)),c("button",{class:"new-conversation-btn",onClick:Ca},[u(B,{icon:"mdi:plus",class:"btn-icon"}),s[7]||(s[7]=d(" 新会话 ",-1))])]),c("div",Z,[Hs.value&&0===Ks.value.length?(x(),o("div",ee,[u(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[9]||(s[9]=c("span",null,"加载会话列表...",-1))])):(x(),m(w,{key:1,name:"conversation-list",tag:"div",class:"conversations-transition-wrapper"},{default:g(()=>[(x(!0),o(p,null,h(Ks.value,e=>(x(),o("div",{key:e.id,class:y(["conversation-item",{active:Js.value===e.id}]),onClick:s=>ka(e.id),onContextmenu:f(e=>{},["prevent"])},[c("div",ae,[u(O,{"user-id":e.userId,"user-name":e.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",{class:y(["conversation-online-indicator",{online:!0===k(qs)(e.userId).value,offline:!1===k(qs)(e.userId).value}]),title:!0===k(qs)(e.userId).value?"在线":!1===k(qs)(e.userId).value?"离线":"状态未知"},null,10,te),e.unreadCount>0?(x(),o("span",ne,v(e.unreadCount),1)):r("",!0)]),c("div",le,[c("div",ie,[c("span",oe,v(e.userName),1),c("span",ce,v(Ga(e.lastMessageTime)),1)]),c("div",ue,[c("span",de,v(e.lastMessage),1),e.unreadCount>0?(x(),o("span",re)):r("",!0)])]),c("button",{class:"conversation-delete-btn",onClick:f(s=>(async e=>{const s=await Ds.show({title:"隐藏会话",message:`确定要隐藏与"${e.userName}"的会话吗?\n\n隐藏后会话将从列表中移除,但所有消息记录都会保留。重新建立会话时可以恢复。`,type:"warning",confirmText:"隐藏",cancelText:"取消"})
|
||
if(s&&null!==s)if(zs.value)try{await Fs(e.id),Js.value===e.id&&(Js.value=null)
|
||
const s=Ks.value.findIndex(s=>s.id===e.id);-1!==s&&Ks.value.splice(s,1),window.dispatchEvent(new CustomEvent("messages:conversations-updated")),Ss("隐藏会话成功",2e3)}catch(a){xs(a.message||"隐藏会话失败",2e3)}else xs("WebSocket未连接,无法隐藏会话",2e3)})(e),["stop"]),title:"隐藏会话"},[u(B,{icon:"mdi:delete-outline"})],8,ve)],42,se))),128))]),_:1})),Hs.value||0!==Ks.value.length?r("",!0):(x(),o("div",me,[u(B,{icon:"fluent-color:comment-multiple-32",class:"empty-icon"}),s[10]||(s[10]=c("p",null,"暂无会话",-1))]))])]),c("div",ge,[oa.value?(x(),o("div",pe,[c("div",he,[s[11]||(s[11]=c("h2",null,"选择用户开始聊天",-1)),c("button",{class:"close-btn",onClick:Ia},[u(B,{icon:"mdi:close"})])]),c("div",fe,[c("div",ye,[u(B,{icon:"mdi:magnify",class:"search-icon"}),b(c("input",{"onUpdate:modelValue":s[0]||(s[0]=e=>ca.value=e),type:"text",placeholder:"搜索用户名或昵称...",class:"search-input",onInput:Ma},null,544),[[C,ca.value]]),ca.value?(x(),o("button",{key:0,class:"clear-search-btn",onClick:Ta},[u(B,{icon:"mdi:close-circle"})])):r("",!0)])]),c("div",ke,[da.value?(x(),o("div",we,[u(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[12]||(s[12]=c("span",null,"加载用户列表...",-1))])):ra.value?(x(),o("div",be,[u(B,{icon:"mdi:alert-circle",class:"error-icon"}),c("p",null,v(ra.value),1),c("button",{class:"retry-btn",onClick:Ea},"重试")])):0===xa.value.length?(x(),o("div",Ce,[u(B,{icon:"mdi:account-off",class:"empty-icon"}),c("p",null,v(ca.value?"未找到匹配的用户":"暂无用户"),1)])):(x(),o("div",Ie,[(x(!0),o(p,null,h(xa.value,e=>(x(),o("div",{key:e.id,class:"user-item",onClick:s=>(async e=>{Ia(),await Sa(e.id)})(e)},[u(O,{"user-id":e.id,"user-name":e.nickName||e.username,width:48,height:48},null,8,["user-id","user-name"]),c("div",Me,[c("div",Te,v(e.nickName||e.username||"未知用户"),1),e.username?(x(),o("div",xe,"@"+v(e.username),1)):e.age?(x(),o("div",Se,"年龄: "+v(e.age),1)):r("",!0)]),u(B,{icon:"mdi:chevron-right",class:"chevron-icon"})],8,Ee))),128))]))])])):pa.value?(x(),o("div",Ae,[c("div",De,[c("div",$e,[u(O,{"user-id":pa.value.userId,"user-name":pa.value.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",Le,[c("h3",_e,v(pa.value.userName),1),c("span",Be,[pa.value.blocked?(x(),o("span",Oe,"已拉黑")):pa.value.muted?(x(),o("span",ze,"已拒收")):!0===ha.value?(x(),o("span",Re,"在线")):!1===ha.value?(x(),o("span",Fe,"离线")):(x(),o("span",Ue,"状态未知"))])])]),c("div",je,[c("button",{class:"header-action-btn report-btn",onClick:Na},[u(B,{icon:"mdi:flag-outline"})]),c("div",{class:"more-actions-wrapper",ref_key:"moreActionsRef",ref:ia},[c("button",{class:"header-action-btn",onClick:s[1]||(s[1]=e=>la.value=!la.value)},[u(B,{icon:"mdi:dots-vertical"})]),u(I,{name:"menu-fade"},{default:g(()=>[la.value?(x(),o("div",{key:0,class:"more-actions-menu",onClick:s[2]||(s[2]=f(()=>{},["stop"]))},[pa.value.muted?(x(),o("div",{key:1,class:"menu-item",onClick:Da},[u(B,{icon:"mdi:bell-outline",class:"menu-icon"}),s[15]||(s[15]=c("span",null,"接收消息",-1))])):(x(),o("div",{key:0,class:"menu-item",onClick:Aa},[u(B,{icon:"mdi:bell-off-outline",class:"menu-icon"}),s[14]||(s[14]=c("span",null,"拒收消息",-1))])),pa.value.blocked?(x(),o("div",{key:3,class:"menu-item",onClick:La},[u(B,{icon:"mdi:account-check-outline",class:"menu-icon"}),s[17]||(s[17]=c("span",null,"取消拉黑",-1))])):(x(),o("div",{key:2,class:"menu-item danger",onClick:$a},[u(B,{icon:"mdi:block-helper",class:"menu-icon"}),s[16]||(s[16]=c("span",null,"拉黑用户",-1))]))])):r("",!0)]),_:1})],512)])]),c("div",{class:"messages-list",ref_key:"messagesListRef",ref:sa},[Ps.value?(x(),o("div",We,[u(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[18]||(s[18]=c("span",null,"加载消息...",-1))])):(x(!0),o(p,{key:1},h(pa.value.messages,e=>{var s,a,t,n,l
|
||
return x(),o(p,{key:e.id},["system"===e.type?(x(),o("div",Ge,[c("div",qe,[u(B,{icon:"mdi:information-outline",class:"system-icon"}),c("span",null,v(e.content),1)])])):(x(),o("div",{key:1,class:y(["message-item",{sent:e.sent,received:!e.sent}])},[e.sent?r("",!0):(x(),o("div",Ve,[u(O,{"user-id":pa.value.userId,"user-name":pa.value.userName,width:40,height:40},null,8,["user-id","user-name"])])),c("div",Ke,[c("div",He,[e.content?(x(),o("p",Pe,v(e.content),1)):r("",!0),e.attachments&&e.attachments.length>0?(x(),o("div",Je,[ja(e.attachments).length>0?(x(),o("div",Qe,[u(W,{"image-ids":(l=e.attachments,ja(l).map(e=>e.id)),"show-index":!1,columns:4,"max-width":120,onImageClick:s=>(async(e,s)=>{await ta.handleImageClick(e,s)})(e.attachments,s)},null,8,["image-ids","onImageClick"])])):r("",!0),Wa(e.attachments).length>0?(x(),o("div",Xe,[(x(!0),o(p,null,h(Wa(e.attachments),e=>{return x(),o("div",{key:e.id,class:"attachment-item clickable",onClick:s=>(async e=>{const s=await F.getAttachmentDownloadUrl(e.id)
|
||
if(!s)return
|
||
const a=document.createElement("a")
|
||
a.href=s.url,a.download=s.name,a.target="_blank",document.body.appendChild(a),a.click(),document.body.removeChild(a)})(e)},[u(B,{icon:"mdi:file",class:"attachment-icon"}),c("span",Ze,v(e.name),1),c("span",es,v((s=e.size,s<1024?`${s} B`:s<1048576?`${(s/1024).toFixed(1)} KB`:`${(s/1048576).toFixed(1)} MB`)),1),u(B,{icon:"mdi:download",class:"attachment-action-icon",title:"下载文件"})],8,Ye)
|
||
var s}),128))])):r("",!0)])):r("",!0),c("div",ss,[c("span",as,v(Ga(e.sendTime)),1),e.sent&&"sending"===e.status?(x(),o("span",ts,[u(B,{icon:"mdi:loading",class:"status-icon spinning"})])):e.sent&&"sent"===e.status?(x(),o("span",ns,[u(B,{icon:"mdi:check-circle",class:"status-icon"})])):e.sent&&"failed"===e.status?(x(),o("span",ls,[u(B,{icon:"mdi:alert-circle",class:"status-icon",title:"发送失败"})])):r("",!0),!e.sent||e.recalled||e.deleted||"sending"===e.status?r("",!0):(x(),o("div",is,[c("button",{class:"message-action-btn",onClick:f(s=>(async e=>{if(!Ds.show)return
|
||
const s=await Ds.show({title:"撤回消息",message:"确定要撤回这条消息吗?",confirmText:"撤回",cancelText:"取消"})
|
||
if(s&&null!==s)try{await Ws(e.id)
|
||
const s=pa.value
|
||
if(s){const a=s.messages.findIndex(s=>s.id===e.id);-1!==a&&s.messages.splice(a,1)}Ss("消息已撤回",2e3)}catch(a){xs(a.message||"撤回消息失败",2e3)}})(e),["stop"]),title:"撤回"},[u(B,{icon:"mdi:undo"})],8,os),c("button",{class:"message-action-btn",onClick:f(s=>(async e=>{if(!Ds.show)return
|
||
const s=await Ds.show({title:"删除消息",message:"确定要删除这条消息吗?删除后双方都看不到这条消息。",confirmText:"删除",cancelText:"取消"})
|
||
if(s&&null!==s)try{await Gs(e.id,!0),Ss("消息已删除",2e3)}catch(a){xs(a.message||"删除消息失败",2e3)}})(e),["stop"]),title:"删除"},[u(B,{icon:"mdi:delete-outline"})],8,cs)]))])])]),e.sent?(x(),o("div",us,[u(O,{"user-id":(null==(s=k(Bs))?void 0:s.id)||(null==(a=k(Bs))?void 0:a._id),"user-name":(null==(t=k(Bs))?void 0:t.nickName)||(null==(n=k(Bs))?void 0:n.username)||"我",width:40,height:40},null,8,["user-id","user-name"])])):r("",!0)],2))],64)}),128))],512),c("div",ds,[pa.value.blocked||pa.value.muted?(x(),o("div",rs,[u(B,{icon:pa.value.blocked?"mdi:block-helper":"mdi:bell-off-outline",class:"notice-icon"},null,8,["icon"]),c("span",null,v(pa.value.blocked?"该用户已被拉黑,无法发送消息":"已拒收该用户的消息"),1)])):(x(),o("div",vs,[c("div",ms,[c("button",{class:"toolbar-btn",onClick:Oa,disabled:Xs.value.length>=5,title:"添加图片(最多5张,每张10M以内)"},[u(B,{icon:"mdi:image-outline"})],8,gs),c("button",{class:"toolbar-btn",onClick:za,disabled:Ys.value.length>=5,title:"添加文件(最多5个,每个20M以内)"},[u(B,{icon:"mdi:file-outline"})],8,ps)]),b(c("textarea",{"onUpdate:modelValue":s[3]||(s[3]=e=>Qs.value=e),class:"message-textarea",placeholder:"输入消息...",rows:"3",maxlength:"2000",onKeydown:E(f(Ba,["ctrl"]),["enter"]),onPaste:Ua},null,40,hs),[[C,Qs.value]])])),pa.value.blocked||pa.value.muted||!(Xs.value.length>0||Ys.value.length>0)?r("",!0):(x(),o("div",fs,[(x(!0),o(p,null,h(Xs.value,(e,s)=>(x(),o("div",{key:`img-${s}`,class:"attachment-preview-item"},[c("img",{src:e.preview,alt:"预览"},null,8,ys),c("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Xs.value.splice(e,1)})(s)},[u(B,{icon:"mdi:close"})],8,ks)]))),128)),(x(!0),o(p,null,h(Ys.value,(e,s)=>(x(),o("div",{key:`file-${s}`,class:"attachment-preview-item file"},[u(B,{icon:"mdi:file"}),c("span",ws,v(e.file.name),1),c("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Ys.value.splice(e,1)})(s)},[u(B,{icon:"mdi:close"})],8,bs)]))),128))])),pa.value.blocked||pa.value.muted?r("",!0):(x(),o("div",Cs,[c("span",Is,v(Qs.value.length)+"/2000",1),c("button",{class:"send-btn",onClick:Ba,disabled:!ya.value},[u(B,{icon:"mdi:send",class:"btn-icon"}),s[19]||(s[19]=d(" 发送 ",-1))],8,Es)])),c("input",{ref_key:"imageInput",ref:Zs,type:"file",accept:"image/*",multiple:"",onChange:Ra,style:{display:"none"}},null,544),c("input",{ref_key:"fileInput",ref:ea,type:"file",multiple:"",onChange:Fa,style:{display:"none"}},null,544)])])):(x(),o("div",Ne,[u(B,{icon:"fluent-color:chat-32",class:"empty-icon"}),s[13]||(s[13]=c("p",{class:"empty-text"},"选择一个会话开始聊天",-1))]))])])]),u(j,{visible:k(ta).previewVisible.value,"images-info":k(ta).previewImagesInfo.value,"initial-index":k(ta).previewIndex.value,onClose:k(ta).closePreview,onIndexChange:s[4]||(s[4]=e=>k(ta).previewIndex.value=e)},null,8,["visible","images-info","initial-index","onClose"])]),u(z,{visible:k(Ds).visible.value,title:k(Ds).config.value.title||"",message:k(Ds).config.value.message||"",type:"danger"===k(Ds).config.value.type?"error":k(Ds).config.value.type||"warning","confirm-text":k(Ds).config.value.confirmText,"cancel-text":k(Ds).config.value.cancelText,"show-close-button":!0,"close-button-position":"top-right",onConfirm:k(Ds).handleConfirm,onCancel:k(Ds).handleCancel,onClose:k(Ds).handleClose},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel","onClose"]),u(R,{toasts:k(Ts),onRemove:k(As)},null,8,["toasts","onRemove"]),u(z,{visible:k($s).visible,title:k($s).text,loading:!0,simple:!0,"close-on-overlay-click":!1,"enable-keyboard":!1},null,8,["visible","title"])],64))}}),[["__scopeId","data-v-60e089c3"]])
|
||
export{Ms as default}
|