lemon-imui-vue3
Version:
> npm install lemon-imui-vue3 -S
2 lines (1 loc) • 34.7 kB
JavaScript
(function(f,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],s):(f=typeof globalThis<"u"?globalThis:f||self,s(f.LemonIMUI={},f.Vue))})(this,function(f,s){"use strict";function H(e){return Object.prototype.toString.call(e)==="[object Object]"}function u(e){return typeof e=="string"}function z(e){return new Date().getTime()-e<864e5}function p(e){return!!(!e||Array.isArray(e)&&e.length==0||H(e)&&Object.values(e).length==0)}function _(e){return e&&typeof e=="function"}const D=[],Y={hover(e){},focus(e){e.addEventListener("focus",t=>{this.changeVisible()}),e.addEventListener("blur",t=>{this.changeVisible()})},click(e){e.stopPropagation(),x.hide(),this.changeVisible()},contextmenu(e){e.addEventListener("contextmenu",t=>{t.preventDefault(),this.changeVisible()})}},L={name:"LemonPopover",props:{trigger:{type:String,default:"click",validator(e){return Object.keys(Y).includes(e)}}},data(){return this.defaultElm=null,{popoverStyle:{},visible:!1}},created(){document.addEventListener("click",this._documentClickEvent),D.push(this.close)},mounted(){},render(){return s.createVNode("span",{style:"position:relative"},[s.createVNode(s.Transition,{name:"lemon-slide-top"},{default:()=>[this.visible&&s.createVNode("div",{class:"lemon-popover",ref:"popover",style:this.popoverStyle,onClick:e=>e.stopPropagation()},[s.createVNode("div",{class:"lemon-popover__content"},[this.$slots.content&&this.$slots.content()]),s.createVNode("div",{class:"lemon-popover__arrow"},null)])]}),s.createVNode("span",{ref:"trigger",onClick:e=>{e.stopPropagation(),x.hide(),this.changeVisible()}},[this.$slots.default&&this.$slots.default()])])},destroyed(){document.removeEventListener("click",this._documentClickEvent)},computed:{},watch:{async visible(e){if(e){await this.$nextTick();const{trigger:t,popover:n}=this.$refs;this.popoverStyle={top:`-${n.offsetHeight+10}px`,left:`${t.offsetWidth/2-n.offsetWidth/2}px`}}}},methods:{_documentClickEvent(e){e.stopPropagation(),this.visible&&this.close()},changeVisible(){this.visible?this.close():this.open()},open(){this.closeAll(),this.visible=!0},closeAll(){D.forEach(e=>e())},close(){this.visible=!1}}},ue="";let h;const I=()=>{h&&(h.style.display="none")},W=()=>{h&&(h.style.display="block")};document.addEventListener("click",e=>{I()});const x={hide:I,bind(e,t,n){e.addEventListener(t.modifiers.click?"click":"contextmenu",i=>{if(p(t.value)||!Array.isArray(t.value))return;t.modifiers.click&&i.stopPropagation(),i.preventDefault(),L.methods.closeAll();let a,o=[];t.modifiers.message?a=n.context:t.modifiers.contact&&(a=n.child),h||(h=document.createElement("div"),h.className="lemon-contextmenu",document.body.appendChild(h)),h.innerHTML=t.value.map(r=>{let c;if(_(r.visible)?c=r.visible(a):c=r.visible===void 0?!0:r.visible,c){o.push(r);const l=r.icon?`<i class="lemon-contextmenu__icon ${r.icon}"></i>`:"";return`<div style="color:${r.color}" title="${r.text}" class="lemon-contextmenu__item">${l}<span>${r.text}</span></div>`}return""}).join(""),h.style.top=`${i.pageY}px`,h.style.left=`${i.pageX}px`,h.childNodes.forEach((r,c)=>{const{click:l,render:C}=o[c];r.addEventListener("click",y=>{y.stopPropagation(),_(l)&&l(y,a,I)})}),W()})}},G={name:"LemonTabs",props:{activeIndex:String},data(){return{active:this.activeIndex}},mounted(){this.active||(this.active=this.$slots["tab-pane"][0].data.attrs.index)},render(){const e=[],t=[];return this.$slots["tab-pane"].map(n=>{const{tab:i,index:a}=n.data.attrs;e.push(s.withDirectives(s.createVNode("div",{class:"lemon-tabs-content__pane"},[n]),[[s.vShow,this.active==a]])),t.push(s.createVNode("div",{class:["lemon-tabs-nav__item",this.active==a&&"lemon-tabs-nav__item--active"],onClick:()=>this._handleNavClick(a)},[i]))}),s.createVNode("div",{class:"lemon-tabs"},[s.createVNode("div",{class:"lemon-tabs-content"},[e]),s.createVNode("div",{class:"lemon-tabs-nav"},[t])])},methods:{_handleNavClick(e){this.active=e}}},fe="",X={name:"LemonButton",props:{color:{type:String,default:"default"},disabled:Boolean},render(){return s.createVNode("button",{class:["lemon-button",`lemon-button--color-${this.color}`],disabled:this.disabled,type:"button"},[this.$slots.default&&this.$slots.default()])},methods:{}},pe="",q={name:"LemonBadge",props:{count:[Number,Boolean],overflowCount:{type:Number,default:99}},render(){return s.createVNode("span",{class:"lemon-badge"},[this.$slots.default&&this.$slots.default(),this.count!==0&&this.count!==void 0&&s.createVNode("span",{class:["lemon-badge__label",this.isDot&&"lemon-badge__label--dot"]},[this.label])])},computed:{isDot(){return this.count===!0},label(){return this.isDot?"":this.count>this.overflowCount?`${this.overflowCount}+`:this.count}},methods:{}},ge="",Z={name:"LemonAvatar",inject:["IMUI"],props:{src:String,icon:{type:String,default:"lemon-icon-people"},circle:{type:Boolean,default(){return this&&this.IMUI?this.IMUI.avatarCricle:!1}},size:{type:Number,default:32}},data(){return{imageFinishLoad:!0}},render(){return s.createVNode("span",{style:this.style,class:["lemon-avatar",{"lemon-avatar--circle":this.circle}],onClick:e=>this.$emit("click",e)},[(this.imageFinishLoad||!this.src)&&s.createVNode("i",{class:this.icon},null),s.createVNode("img",{src:this.src,onLoad:this._handleLoad},null)])},computed:{style(){const e=`${this.size}px`;return{width:e,height:e,lineHeight:e,fontSize:`${this.size/2}px`}}},methods:{_handleLoad(){this.imageFinishLoad=!1}}},_e="";function m(e,t,n){return e?e(n):t}function N(e){return e<10?`0${e}`:e}function F(e){const t=new Date(e),n=new Date,i=l=>l.getFullYear(),a=l=>`${l.getMonth()+1}-${l.getDate()}`,o=i(t),r=i(n);let c;return o!==r?c="y年m月d日 h:i":`${o}-${a(t)}`==`${r}-${a(n)}`?c="h:i":c="m月d日 h:i",U(e,c)}function U(e,t){t||(t="y-m-d h:i:s"),e?e=new Date(e):e=new Date;const n=[e.getFullYear().toString(),N((e.getMonth()+1).toString()),N(e.getDate().toString()),N(e.getHours().toString()),N(e.getMinutes().toString()),N(e.getSeconds().toString())],i="ymdhis";for(let a=0;a<n.length;a++)t=t.replace(i.charAt(a),n[a]);return t}function j(e,t){_(e)?e(()=>{t()}):t()}function Q(e){return e.replace(/<.*?>/gi,"")}function E(e){return e.replace(/<(?!img).*?>/gi,"")}function J(e){if(e==null||e=="")return"0 Bytes";var t=["B","K","M","G","T","P","E","Z","Y"],n=0,i=parseFloat(e);n=Math.floor(Math.log(i)/Math.log(1024));var a=i/Math.pow(1024,n);return a=parseFloat(a.toFixed(2)),a+t[n]}function ee(){var e=new Date().getTime();window.performance&&typeof window.performance.now=="function"&&(e+=performance.now());var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(n){var i=(e+Math.random()*16)%16|0;return e=Math.floor(e/16),(n=="x"?i:i&3|8).toString(16)});return t}const te={name:"LemonContact",components:{},inject:{IMUI:{from:"IMUI",default(){return this}}},data(){return{}},props:{contact:Object,simple:Boolean,timeFormat:{type:Function,default(e){return U(e,z(e)?"h:i":"y/m/d")}}},render(){return s.createVNode("div",{class:["lemon-contact",{"lemon-contact--name-center":this.simple}],title:this.contact.displayName,onClick:e=>this._handleClick(e,this.contact)},[m(this.$slots.default,this._renderInner(),this.contact)])},created(){},mounted(){},computed:{},watch:{},methods:{_renderInner(){const{contact:e}=this;return[s.createVNode(s.resolveComponent("lemon-badge"),{count:this.simple?0:e.unread,class:"lemon-contact__avatar"},{default:()=>[s.createVNode(s.resolveComponent("lemon-avatar"),{size:40,src:e.avatar},null)]}),s.createVNode("div",{class:"lemon-contact__inner"},[s.createVNode("p",{class:"lemon-contact__label"},[s.createVNode("span",{class:"lemon-contact__name"},[e.displayName]),!this.simple&&s.createVNode("span",{class:"lemon-contact__time"},[this.timeFormat(e.lastSendTime)])]),!this.simple&&s.createVNode("p",{class:"lemon-contact__content"},[u(e.lastContent)?s.createVNode("span",{innerHTML:e.lastContent},null):e.lastContent])])]},_handleClick(e,t){this.$emit("click",t)}}},Ce="";function se(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!s.isVNode(e)}const T=(e,t)=>{document.execCommand(e,!1,t)},V=window.getSelection();let g,w=[];const ne={name:"LemonEditor",inject:{IMUI:{from:"IMUI",default(){return this}}},components:{},props:{tools:{type:Array,default:()=>[]},sendText:{type:String,default:"发 送"},wrapKey:{type:Function,default:function(e){return e.keyCode==13&&e.ctrlKey==!1&&e.shiftKey==!1}},sendKey:{type:Function,default(e){return e.keyCode==13&&e.ctrlKey===!0}}},data(){return this.clipboardBlob=null,{clipboardUrl:"",submitDisabled:!0,accept:""}},created(){},mounted(){},render(){const e=[],t=[];return this.proxyTools.forEach(({name:n,title:i,render:a,click:o,isRight:r})=>{o=o||new Function;const c=["lemon-editor__tool-item",{"lemon-editor__tool-item--right":r}];let l;n=="emoji"?l=w.length==0?"":s.createVNode(s.resolveComponent("lemon-popover"),{class:"lemon-editor__emoji"},{content:()=>this._renderEmojiTabs(),default:()=>s.createVNode("div",{class:c,title:i},[a()])}):l=s.createVNode("div",{class:c,onClick:o,title:i},[a()]),r?t.push(l):e.push(l)}),s.createVNode("div",{class:"lemon-editor"},[this.clipboardUrl&&s.createVNode("div",{class:"lemon-editor__clipboard-image"},[s.createVNode("img",{src:this.clipboardUrl},null),s.createVNode("div",null,[s.createVNode(s.resolveComponent("lemon-button"),{style:{marginRight:"10px"},onClick:this.closeClipboardImage,color:"grey"},{default:()=>[s.createTextVNode("取消")]}),s.createVNode(s.resolveComponent("lemon-button"),{onClick:this.sendClipboardImage},{default:()=>[s.createTextVNode("发送图片")]})])]),s.createVNode("input",{style:"display:none",type:"file",multiple:"multiple",ref:"fileInput",accept:this.accept,onChange:this._handleChangeFile},null),s.createVNode("div",{class:"lemon-editor__tool"},[s.createVNode("div",{class:"lemon-editor__tool-left"},[e]),s.createVNode("div",{class:"lemon-editor__tool-right"},[t])]),s.createVNode("div",{class:"lemon-editor__inner"},[s.createVNode("div",{class:"lemon-editor__input",ref:"textarea",contenteditable:"true",onKeyup:this._handleKeyup,onKeydown:this._handleKeydown,onPaste:this._handlePaste,onClick:this._handleClick,spellcheck:"false"},null)]),s.createVNode("div",{class:"lemon-editor__footer"},[s.createVNode("div",{class:"lemon-editor__tip"},[m(this.IMUI.$slots["editor-footer"],"使用 ctrl + enter 快捷发送消息")]),s.createVNode("div",{class:"lemon-editor__submit"},[s.createVNode(s.resolveComponent("lemon-button"),{disabled:this.submitDisabled,onClick:this._handleSend},{default:()=>[this.sendText]})])])])},computed:{proxyTools(){if(!this.tools)return[];const e=[{name:"emoji",title:"表情",click:null,render:n=>s.createVNode("i",{class:"lemon-icon-emoji"},null)},{name:"uploadFile",title:"文件上传",click:()=>this.selectFile("*"),render:n=>s.createVNode("i",{class:"lemon-icon-folder"},null)},{name:"uploadImage",title:"图片上传",click:()=>this.selectFile("image/*"),render:n=>s.createVNode("i",{class:"lemon-icon-image"},null)}];let t=[];if(Array.isArray(this.tools)){const n={emoji:0,uploadFile:1,uploadImage:2},i=Object.keys(n);t=this.tools.map(a=>i.includes(a.name)?{...e[n[a.name]],...a}:a)}else t=e;return t}},methods:{closeClipboardImage(){this.clipboardUrl="",this.clipboardBlob=null},sendClipboardImage(){this.clipboardBlob&&(this.$emit("upload",this.clipboardBlob),this.closeClipboardImage())},saveRangeToLast(){g||(g=document.createRange()),g.selectNodeContents(textarea.value),g.collapse(!1),V.removeAllRanges(),V.addRange(g)},inertContent(e,t=!1){t&&saveRangeToLast(),this.focusRange(),T("insertHTML",e),this.saveRange()},saveRange(){g=V.getRangeAt(0)},focusRange(){this.$refs.textarea.focus(),g&&(V.removeAllRanges(),V.addRange(g))},_handleClick(){this.saveRange()},_renderEmojiTabs(){const e=t=>t.map(n=>s.createVNode("img",{src:n.src,title:n.title,class:"lemon-editor__emoji-item",onClick:()=>this._handleSelectEmoji(n)},null));if(w[0].label){const t=w.map((n,i)=>s.createVNode("div",{slot:"tab-pane",index:i,tab:n.label},[e(n.children)]));return s.createVNode(s.resolveComponent("lemon-tabs"),{style:"width: 412px"},se(t)?t:{default:()=>[t]})}else return s.createVNode("div",{class:"lemon-tabs-content",style:"width:406px"},[e(w)])},_handleSelectEmoji(e){this.inertContent(`<img emoji-name="${e.name}" src="${e.src}"></img>`),this._checkSubmitDisabled()},async selectFile(e){this.accept=e,await this.$nextTick(),this.$refs.fileInput.click()},_handlePaste(e){e.preventDefault();const t=e.clipboardData||window.clipboardData,n=t.getData("Text");if(n)this.submitDisabled=!1,window.clipboardData?this.$refs.textarea.innerHTML=n:T("insertText",n);else{const{blob:i,blobUrl:a}=this._getClipboardBlob(t);this.clipboardBlob=i,this.clipboardUrl=a}},_getClipboardBlob(e){let t,n;for(var i=0;i<e.items.length;++i)e.items[i].kind=="file"&&e.items[i].type.indexOf("image/")!==-1&&(t=e.items[i].getAsFile(),n=(window.URL||window.webkitURL).createObjectURL(t));return{blob:t,blobUrl:n}},_handleKeyup(e){this.saveRange(),this._checkSubmitDisabled()},_handleKeydown(e){(e.keyCode==13||e.keyCode==13&&e.shiftKey)&&e.preventDefault(),this.wrapKey(e)&&(e.preventDefault(),T("insertLineBreak")),this.submitDisabled==!1&&this.sendKey(e)&&this._handleSend()},getFormatValue(){return this.IMUI.emojiImageToName(this.$refs.textarea.innerHTML)},_checkSubmitDisabled(){this.submitDisabled=!E(this.$refs.textarea.innerHTML.trim())},_handleSend(e){const t=this.getFormatValue();this.$emit("send",t),this.clear(),this._checkSubmitDisabled()},_handleChangeFile(e){const{fileInput:t}=this.$refs;Array.from(t.files).forEach(n=>{this.$emit("upload",n)}),t.value=""},clear(){this.$refs.textarea.innerHTML=""},initEmoji(e){w=e,this.$forceUpdate()},setValue(e){this.$refs.textarea.innerHTML=this.IMUI.emojiNameToImage(e),this._checkSubmitDisabled()}}},be="",B={name:"lemonMessageText",inheritAttrs:!1,inject:["IMUI"],render(){return s.createVNode(s.resolveComponent("lemon-message-basic"),s.mergeProps({class:"lemon-message-text"},this.$attrs),{content:e=>{const t=this.IMUI.emojiNameToImage(e.content);return s.createVNode("span",{innerHTML:t},null)}})}},ye="",A={name:"lemonMessageFile",inheritAttrs:!1,render(){return s.createVNode(s.resolveComponent("lemon-message-basic"),{class:"lemon-message-file",props:{...this.$attrs},scopedSlots:{content:e=>[s.createVNode("div",{class:"lemon-message-file__inner"},[s.createVNode("p",{class:"lemon-message-file__name"},[e.fileName]),s.createVNode("p",{class:"lemon-message-file__byte"},[J(e.fileSize)])]),s.createVNode("div",{class:"lemon-message-file__sfx"},[s.createVNode("i",{class:"lemon-icon-attah"},null)])]}},null)}},xe="",R={name:"lemonMessageImage",inheritAttrs:!1,render(){return s.createVNode(s.resolveComponent("lemon-message-basic"),s.mergeProps({class:"lemon-message-image"},this.$attrs),{content:e=>s.createVNode("img",{src:e.content},null)})}},Ne="",ie={LemonMessageText:B,LemonMessageFile:A,LemonMessageImage:R},ae={name:"LemonMessages",props:{hideName:Boolean,hideTime:Boolean,reverseUserId:[String,Number],timeRange:{type:Number,default:1},timeFormat:{type:Function,default(e){return F(e)}},loadingText:{type:[String,Function]},loadendText:{type:[String,Function],default:"暂无更多消息"},messages:{type:Array,default:()=>[]}},data(){return this._lockScroll=!1,{_loading:!1,_loadend:!1}},render(){return s.createVNode("div",{class:"lemon-messages",ref:"wrap",onScroll:this._handleScroll},[s.createVNode("div",{class:["lemon-messages__load",`lemon-messages__load--${this._loadend?"end":"ing"}`]},[s.createVNode("span",{class:"lemon-messages__loadend"},[u(this.loadendText)?this.loadendText:this.loadendText()]),s.createVNode("span",{class:"lemon-messages__loading"},[this.loadingText?u(this.loadingText)?this.loadingText:this.loadingText():s.createVNode("i",{class:"lemon-icon-loading lemonani-spin"},null)])]),this.messages.map((e,t)=>{const n=[],i=`LemonMessage${s.capitalize(e.type)}`,a=this.messages[t-1];a&&this.msecRange&&e.sendTime-a.sendTime>this.msecRange&&n.push(s.createVNode(s.resolveComponent("lemon-message-event"),{message:{id:"__time__",type:"event",content:F(e.sendTime)}},null));let o;e.type=="event"?o={message:e}:o={timeFormat:this.timeFormat,message:e,reverse:this.reverseUserId==e.fromUser.id,hideTime:this.hideTime,hideName:this.hideName};const r=ie[i];return n.push(s.createVNode(r,s.mergeProps({ref:"message",refInFor:!0},o),null)),n})])},computed:{msecRange(){return this.timeRange*1e3*60}},watch:{},methods:{loaded(){this._loadend=!0,this.$forceUpdate()},resetLoadState(){this._lockScroll=!0,this._loading=!1,this._loadend=!1,setTimeout(()=>{this._lockScroll=!1},200)},async _handleScroll(e){if(this._lockScroll)return;console.log(123);const{target:t}=e;if(x.hide(),t.scrollTop==0&&this._loading==!1&&this._loadend==!1){this._loading=!0,await this.$nextTick();const n=t.scrollHeight;this.$emit("reach-top",async i=>{await this.$nextTick(),t.scrollTop=t.scrollHeight-n,this._loading=!1,this._loadend=!!i})}},async scrollToBottom(){await this.$nextTick();const{wrap:e}=this.$refs;e&&(e.scrollTop=e.scrollHeight)}},created(){},mounted(){}},Ve="",oe={name:"lemonMessageBasic",inject:{IMUI:{from:"IMUI",default(){return this}}},props:{contextmenu:Array,message:{type:Object,default:()=>({})},timeFormat:{type:Function,default:()=>""},reverse:Boolean,hideName:Boolean,hideTime:Boolean},data(){return{}},render(){const{fromUser:e,status:t,sendTime:n}=this.message,i=this.hideName==!0&&this.hideTime==!0;return s.createVNode("div",{class:["lemon-message",`lemon-message--status-${t}`,{"lemon-message--reverse":this.reverse,"lemon-message--hide-title":i}]},[s.createVNode("div",{class:"lemon-message__avatar"},[s.createVNode(s.resolveComponent("lemon-avatar"),{size:36,shape:"square",src:e.avatar,onClick:a=>{this._emitClick(a,"avatar")}},null)]),s.createVNode("div",{class:"lemon-message__inner"},[s.createVNode("div",{class:"lemon-message__title"},[this.hideName==!1&&s.createVNode("span",{onClick:a=>{this._emitClick(a,"displayName")}},[e.displayName]),this.hideTime==!1&&s.createVNode("span",{class:"lemon-message__time",onClick:a=>{this._emitClick(a,"sendTime")}},[this.timeFormat(n)])]),s.createVNode("div",{class:"lemon-message__content-flex"},[s.withDirectives(s.createVNode("div",{class:"lemon-message__content",onClick:a=>{this._emitClick(a,"content")}},[m(this.$slots.content,null,this.message)]),[[s.resolveDirective("lemon-contextmenu"),this.IMUI.contextmenu,void 0,{message:!0}]]),s.createVNode("div",{class:"lemon-message__content-after"},[m(this.IMUI.$slots["message-after"],null,this.message)]),s.createVNode("div",{class:"lemon-message__status",onClick:a=>{this._emitClick(a,"status")}},[s.createVNode("i",{class:"lemon-icon-loading lemonani-spin"},null),s.createVNode("i",{class:"lemon-icon-prompt",title:"重发消息",style:{color:"#ff2525",cursor:"pointer"}},null)])])])])},created(){},mounted(){},computed:{},watch:{},methods:{_emitClick(e,t){this.IMUI.$emit("message-click",e,t,this.message,this.IMUI)}}},we="",re={name:"lemonMessageEvent",inheritAttrs:!1,inject:["IMUI"],render(){const{content:e}=this.$attrs.message;return s.createVNode("div",{class:"lemon-message lemon-message-event"},[s.createVNode("span",{class:"lemon-message-event__content",onClick:t=>this._emitClick(t,"content")},[e])])},methods:{_emitClick(e,t){this.IMUI.$emit("message-click",e,t,this.$attrs.message,this.IMUI)}}},Me="",b="messages",M="contacts",le=[b,M],S={file(e){return"[文件]"},image(e){return"[图片]"},text(e){return this.emojiNameToImage(Q(e.content))},event(e){return"[通知]"}};class ${constructor(){this.table={}}get(t){return t?this.table[t]:this.table}set(t,n){this.table[t]=n}remove(t){t?delete this.table[t]:this.table={}}has(t){return!!this.table[t]}}function ce(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!s.isVNode(e)}let d=s.reactive({});const k={},O=e=>u(e)?e:`${e}px`,v=e=>e.replace("%","")/100;let P=()=>{};const de={name:"LemonImui",provide(){return{IMUI:this}},props:{width:{type:[String,Number],default:850},height:{type:[String,Number],default:580},theme:{type:String,default:"default"},simple:{type:Boolean,default:!1},loadingText:[String,Function],loadendText:[String,Function],messageTimeFormat:Function,contactTimeFormat:Function,hideDrawer:{type:Boolean,default:!0},hideMenuAvatar:Boolean,hideMenu:Boolean,hideMessageName:Boolean,hideMessageTime:Boolean,sendKey:Function,wrapKey:Function,sendText:String,contextmenu:Array,contactContextmenu:Array,avatarCricle:Boolean,user:{type:Object,default:()=>({})}},data(){return this.CacheContactContainer=new $,this.CacheMenuContainer=new $,this.CacheMessageLoaded=new $,this.CacheDraft=new $,{drawerVisible:!this.hideDrawer,currentContactId:null,currentMessages:[],activeSidebar:b,contacts:[],menus:[],editorTools:[{name:"emoji"},{name:"uploadFile"},{name:"uploadImage"}]}},render(){return this._renderWrapper([this._renderMenu(),this._renderSidebarMessage(),this._renderSidebarContact(),this._renderContainer(),this._renderDrawer()])},created(){this.initMenus()},async mounted(){await this.$nextTick()},computed:{currentContact(){return this.contacts.find(e=>e.id==this.currentContactId)||{}},currentMenu(){return this.menus.find(e=>e.name==this.activeSidebar)||{}},currentIsDefSidebar(){return le.includes(this.activeSidebar)},lastMessages(){const e=this.contacts.filter(t=>!p(t.lastContent));return e.sort((t,n)=>n.lastSendTime-t.lastSendTime),e}},watch:{activeSidebar(){}},methods:{_menuIsContacts(){return this.activeSidebar==M},_menuIsMessages(){return this.activeSidebar==b},_createMessage(e){return{id:ee(),type:"text",status:"going",sendTime:new Date().getTime(),toContactId:this.currentContactId,fromUser:{...this.user},...e}},appendMessage(e,t=!1){let n="+1",i=d[e.toContactId];if((e.type=="event"||this.user.id==e.fromUser.id)&&(n="+0"),i===void 0)this.updateContact({id:e.toContactId,unread:n,lastSendTime:e.sendTime,lastContent:this.lastContentRender(e)});else{if(i.some(({id:r})=>r==e.id))return;this._addMessage(e,e.toContactId,1);const o={id:e.toContactId,lastContent:this.lastContentRender(e),lastSendTime:e.sendTime};e.toContactId==this.currentContactId?(t==!0&&this.messageViewToBottom(),this.CacheDraft.remove(e.toContactId)):o.unread=n,this.updateContact(o)}},_emitSend(e,t,n){this.$emit("send",e,(i={status:"succeed"})=>{t(),this.updateMessage(Object.assign(e,i))},n)},_handleSend(e){const t=this._createMessage({content:e});this.appendMessage(t,!0),this._emitSend(t,()=>{this.updateContact({id:t.toContactId,lastContent:this.lastContentRender(t),lastSendTime:t.sendTime}),this.CacheDraft.remove(t.toContactId)})},_handleUpload(e){const t=["image/gif","image/jpeg","image/png"];let n;t.includes(e.type)?n={type:"image",content:URL.createObjectURL(e)}:n={type:"file",fileSize:e.size,fileName:e.name,content:""};const i=this._createMessage(n);this.appendMessage(i,!0),this._emitSend(i,()=>{this.updateContact({id:i.toContactId,lastContent:this.lastContentRender(i),lastSendTime:i.sendTime})},e)},_emitPullMessages(e){this._changeContactLock=!0,this.$emit("pull-messages",this.currentContact,(t=[],n=!1)=>{this._addMessage(t,this.currentContactId,0),this.CacheMessageLoaded.set(this.currentContactId,n),n==!0&&this.$refs.messages.loaded(),this.updateCurrentMessages(),this._changeContactLock=!1,e(n)},this)},clearCacheContainer(e){this.CacheContactContainer.remove(e),this.CacheMenuContainer.remove(e)},_renderWrapper(e){return s.createVNode("div",{style:{width:O(this.width),height:O(this.height)},ref:"wrapper",class:["lemon-wrapper",`lemon-wrapper--theme-${this.theme}`,{"lemon-wrapper--simple":this.simple},this.drawerVisible&&"lemon-wrapper--drawer-show"]},[e])},_renderMenu(){const e=this._renderMenuItem();return s.withDirectives(s.createVNode("div",{class:"lemon-menu"},[s.withDirectives(s.createVNode(s.resolveComponent("lemon-avatar"),{onClick:t=>{this.$emit("menu-avatar-click",t)},class:"lemon-menu__avatar",src:this.user.avatar},null),[[s.vShow,!this.hideMenuAvatar]]),e.top,this.$slots.menu,s.createVNode("div",{class:"lemon-menu__bottom"},[this.$slots["menu-bottom"],e.bottom])]),[[s.vShow,!this.hideMenu]])},_renderMenuAvatar(){},_renderMenuItem(){const e=[],t=[];return this.menus.forEach(n=>{let i;const{name:a,title:o,unread:r,render:c,click:l}=n,C=s.createVNode("div",{class:["lemon-menu__item",{"lemon-menu__item--active":this.activeSidebar==a}],onClick:()=>{j(l,()=>{a&&this.changeMenu(a)})},title:o},[s.createVNode(s.resolveComponent("lemon-badge"),{count:r},ce(i=c(n))?i:{default:()=>[i]})]);n.isBottom===!0?t.push(C):e.push(C)}),{top:e,bottom:t}},_renderSidebarMessage(){return this._renderSidebar([m(this.$slots["sidebar-message-top"],null,this),this.lastMessages.map(e=>this._renderContact({contact:e,timeFormat:this.contactTimeFormat},()=>this.changeContact(e.id),this.$slots["sidebar-message"]))],b,m(this.$slots["sidebar-message-fixedtop"],null,this))},_renderContact(e,t,n){const{click:i,renderContainer:a,id:o}=e.contact,r=()=>{j(i,()=>{t(),this._customContainerReady(a,this.CacheContactContainer,o)})};return s.withDirectives(s.createVNode(s.resolveComponent("lemon-contact"),s.mergeProps({class:{"lemon-contact--active":this.currentContactId==e.contact.id}},e,{onClick:r,scopedSlots:{default:n}}),null),[[s.resolveDirective("lemon-contextmenu"),this.contactContextmenu,void 0,{contact:!0}]])},_renderSidebarContact(){let e;return this._renderSidebar([m(this.$slots["sidebar-contact-top"],null,this),this.contacts.map(t=>{if(!t.index)return;t.index=t.index.replace(/\[[0-9]*\]/,"");const n=[t.index!==e&&s.createVNode("p",{class:"lemon-sidebar__label"},[t.index]),this._renderContact({contact:t,simple:!0},()=>{this.changeContact(t.id)},this.$slots["sidebar-contact"])];return e=t.index,n})],M,m(this.$slots["sidebar-contact-fixedtop"],null,this))},_renderSidebar(e,t,n){return s.withDirectives(s.createVNode("div",{class:"lemon-sidebar","on-scroll":this._handleSidebarScroll},[s.createVNode("div",{class:"lemon-sidebar__fixed-top"},[n]),s.createVNode("div",{class:"lemon-sidebar__scroll"},[e])]),[[s.vShow,this.activeSidebar==t]])},_renderDrawer(){return this._menuIsMessages()&&this.currentContactId?s.createVNode("div",{class:"lemon-drawer",ref:"drawer"},[P(this.currentContact),m(this.$slots.drawer,"",this.currentContact)]):""},_isContactContainerCache(e){return e.startsWith("contact#")},_renderContainer(){const e=[],t="lemon-container",n=this.currentContact;let i=!0;for(const a in this.CacheContactContainer.get()){const o=n.id==a&&this.currentIsDefSidebar;o&&(i=!o),e.push(s.withDirectives(s.createVNode("div",{class:t},[this.CacheContactContainer.get(a)]),[[s.vShow,o]]))}for(const a in this.CacheMenuContainer.get())e.push(s.withDirectives(s.createVNode("div",{class:t},[this.CacheMenuContainer.get(a)]),[[s.vShow,this.activeSidebar==a&&!this.currentIsDefSidebar]]));return e.push(s.withDirectives(s.createVNode("div",{class:t},[s.createVNode("div",{class:"lemon-container__title"},[m(this.$slots["message-title"],s.createVNode("div",{class:"lemon-container__displayname"},[n.displayName]),n)]),s.createVNode("div",{class:"lemon-vessel"},[s.createVNode("div",{class:"lemon-vessel__left"},[s.createVNode(s.resolveComponent("lemon-messages"),{ref:"messages","loading-text":this.loadingText,"loadend-text":this.loadendText,"hide-time":this.hideMessageTime,"hide-name":this.hideMessageName,"time-format":this.messageTimeFormat,"reverse-user-id":this.user.id,onReachTop:this._emitPullMessages,messages:this.currentMessages},null),s.createVNode(s.resolveComponent("lemon-editor"),{ref:"editor",tools:this.editorTools,sendText:this.sendText,sendKey:this.sendKey,wrapKey:this.wrapKey,onSend:this._handleSend,onUpload:this._handleUpload},null)]),s.createVNode("div",{class:"lemon-vessel__right"},[m(this.$slots["message-side"],null,n)])])]),[[s.vShow,this._menuIsMessages()&&i&&n.id]])),e.push(s.withDirectives(s.createVNode("div",{class:t},[this.$slots.cover]),[[s.vShow,!n.id&&this.currentIsDefSidebar]])),e.push(s.withDirectives(s.createVNode("div",{class:t},[m(this.$slots["contact-info"],s.createVNode("div",{class:"lemon-contact-info"},[s.createVNode(s.resolveComponent("lemon-avatar"),{src:n.avatar,size:90},null),s.createVNode("h4",null,[n.displayName]),s.createVNode(s.resolveComponent("lemon-button"),{onClick:()=>{p(n.lastContent)&&this.updateContact({id:n.id,lastContent:" "}),this.changeContact(n.id,b)}},{default:()=>[s.createTextVNode("发送消息")]})]),n)]),[[s.vShow,this._menuIsContacts()&&i&&n.id]])),e},_handleSidebarScroll(){x.hide()},_addContact(e,t){const n={0:"unshift",1:"push"}[t];this.contacts[n](e)},_addMessage(e,t,n){const i={0:"unshift",1:"push"}[n];Array.isArray(e)||(e=[e]),d[t]=d[t]||[],d[t][i](...e)},setLastContentRender(e,t){S[e]=t},lastContentRender(e){return _(S[e.type])?S[e.type].call(this,e):(console.error(`not found '${e.type}' of the latest message renderer,try to use ‘setLastContentRender()’`),"")},emojiNameToImage(e){return e.replace(/\[!(\w+)\]/gi,(t,n)=>{const i=n;return k[i]?`<img emoji-name="${n}" src="${k[i]}" />`:`[!${n}]`})},emojiImageToName(e){return e.replace(/<img emoji-name=\"([^\"]*?)\" [^>]*>/gi,"[!$1]")},updateCurrentMessages(){d[this.currentContactId]||(d[this.currentContactId]=[]),this.currentMessages=d[this.currentContactId]},messageViewToBottom(){this.$refs.messages.scrollToBottom()},setDraft(e,t){if(p(e)||p(t))return!1;const n=this.findContact(e);let i=n.lastContent;if(p(n))return!1;this.CacheDraft.has(e)&&(i=this.CacheDraft.get(e).lastContent),this.CacheDraft.set(e,{editorValue:t,lastContent:i}),this.updateContact({id:e,lastContent:`<span style="color:red;">[草稿]</span><span>${this.lastContentRender({type:"text",content:t})}</span>`})},clearDraft(e){const t=this.CacheDraft.get(e);t&&(this.findContact(e).lastContent.indexOf('<span style="color:red;">[草稿]</span>')===0&&this.updateContact({id:e,lastContent:t.lastContent}),this.CacheDraft.remove(e))},async changeContact(e,t){if(t)this.changeMenu(t);else if(this._changeContactLock||this.currentContactId==e)return!1;if(this.currentContactId){const i=E(this.getEditorValue()).trim();i?(this.setDraft(this.currentContactId,i),this.setEditorValue()):this.clearDraft(this.currentContactId)}if(this.currentContactId=e,!this.currentContactId)return!1;if(this.$emit("change-contact",this.currentContact,this),_(this.currentContact.renderContainer)||this.activeSidebar==M)return;const n=this.CacheDraft.get(e);n&&this.setEditorValue(n.editorValue),this.CacheMessageLoaded.has(e)?this.$refs.messages.loaded():this.$refs.messages.resetLoadState(),d[e]?setTimeout(()=>{this.updateCurrentMessages(),this.messageViewToBottom()},0):(this.updateCurrentMessages(),this._emitPullMessages(i=>{this.messageViewToBottom()}))},removeMessage(e){const t=this.findMessage(e);if(!t)return!1;const n=d[t.toContactId].findIndex(({id:i})=>i==e);return d[t.toContactId].splice(n,1),!0},updateMessage(e){if(!e.id)return!1;let t=this.findMessage(e.id);return t?(t=Object.assign(t,e,{toContactId:t.toContactId}),!0):!1},forceUpdateMessage(e){if(!e)this.$refs.messages.$forceUpdate();else{const t=this.$refs.messages.$refs.message;if(t){const n=t.find(i=>i.$attrs.message.id==e);n&&n.$forceUpdate()}}},_customContainerReady(e,t,n){_(e)&&!t.has(n)&&t.set(n,e.call(this))},changeMenu(e){this.$emit("change-menu",e),this.activeSidebar=e},initEmoji(e){let t=[];this.$refs.editor.initEmoji(e),e[0].label?e.forEach(n=>{t.push(...n.children)}):t=e,t.forEach(({name:n,src:i})=>k[n]=i)},initEditorTools(e){this.editorTools=e},initMenus(e){const t=[{name:b,title:"聊天",unread:0,click:null,render:i=>s.createVNode("i",{class:"lemon-icon-message"},null),isBottom:!1},{name:M,title:"通讯录",unread:0,click:null,render:i=>s.createVNode("i",{class:"lemon-icon-addressbook"},null),isBottom:!1}];let n=[];if(Array.isArray(e)){const i={messages:0,contacts:1},a=Object.keys(i);n=e.map(o=>a.includes(o.name)?{...t[i[o.name]],...o,renderContainer:null}:(o.renderContainer&&this._customContainerReady(o.renderContainer,this.CacheMenuContainer,o.name),o))}else n=t;this.menus=n},initContacts(e){this.contacts=e,this.sortContacts()},sortContacts(){this.contacts.sort((e,t)=>{if(e.index)return e.index.localeCompare(t.index)})},appendContact(e){return p(e.id)||p(e.displayName)?(console.error("id | displayName cant be empty"),!1):(this.hasContact(e.id)||this.contacts.push(Object.assign({id:"",displayName:"",avatar:"",index:"",unread:0,lastSendTime:"",lastContent:""},e)),!0)},removeContact(e){const t=this.findContactIndexById(e);return t===-1?!1:(this.contacts.splice(t,1),this.CacheDraft.remove(e),this.CacheMessageLoaded.remove(e),!0)},updateContact(e){const t=e.id;delete e.id;const n=this.findContactIndexById(t);if(n!==-1){const{unread:i}=e;u(i)&&(i.indexOf("+")===0||i.indexOf("-")===0)&&(e.unread=parseInt(i)+parseInt(this.contacts[n].unread));for(const a in e)this.contacts[n][a]=e[a]}},findContactIndexById(e){return this.contacts.findIndex(t=>t.id==e)},hasContact(e){return this.findContactIndexById(e)!==-1},findMessage(e){for(const t in d){const n=d[t].find(({id:i})=>i==e);if(n)return n}},findContact(e){return this.getContacts().find(({id:t})=>t==e)},getContacts(){return this.contacts},getCurrentContact(){return this.currentContact},getCurrentMessages(){return this.currentMessages},setEditorValue(e=""){if(!u(e))return!1;this.$refs.editor.setValue(this.emojiNameToImage(e))},getEditorValue(){return this.$refs.editor.getFormatValue()},clearMessages(e){return e?(delete d[e],this.CacheMessageLoaded.remove(e),this.CacheDraft.remove(e)):(d={},this.CacheMessageLoaded.remove(),this.CacheDraft.remove()),!0},getMessages(e){return(e?d[e]:d)||[]},changeDrawer(e){this.drawerVisible=!this.drawerVisible,this.drawerVisible==!0&&this.openDrawer(e)},openDrawer(e){P=_(e)?e:e.render||new Function;const t=this.$refs.wrapper.clientWidth,n=this.$refs.wrapper.clientHeight;let i=e.width||200,a=e.height||n,o=e.offsetX||0,r=e.offsetY||0;const c=e.position||"right";u(i)&&(i=t*v(i)),u(a)&&(a=n*v(a)),u(o)&&(o=t*v(o)),u(r)&&(r=n*v(r)),this.$refs.drawer.style.width=`${i}px`,this.$refs.drawer.style.height=`${a}px`;let l=0,C=0,y="";c=="right"?l=t:c=="rightInside"?(l=t-i,y="-15px 0 16px -14px rgba(0,0,0,0.08)"):c=="center"&&(l=t/2-i/2,C=n/2-a/2,y="0 0 20px rgba(0,0,0,0.08)"),l+=o,C+=r+-1,this.$refs.drawer.style.top=`${C}px`,this.$refs.drawer.style.left=`${l}px`,this.$refs.drawer.style.boxShadow=y,this.drawerVisible=!0},closeDrawer(){this.drawerVisible=!1}}},$e="",ve="",he="1.4.2",me=[de,te,ae,ne,Z,q,X,L,G,oe,B,R,A,re],K=e=>{e.directive("LemonContextmenu",x),me.forEach(t=>{e.component(t.name,t)})};typeof window<"u"&&window.Vue&&K(window.Vue),f.install=K,f.version=he,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});