k2-im 0.1.20 → 0.1.22

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.
@@ -108,12 +108,17 @@ type LastMessageSummary = {
108
108
  *
109
109
  * 只给结构化计数与配文,**不在这里拼「2 张照片, 1 个视频」这种文案**——中英文的量词、复数与
110
110
  * 连接符各不相同,必须由 im-i18n 按 locale 组装。`caption` 非空时宿主优先显示配文(对齐三端)。
111
+ *
112
+ * `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数无法决定该配
113
+ * 照片图标还是视频图标,三端统一按第一项取(对齐 iOS `IMMediaAlbumMessageBody`)。
114
+ * 入站解析后所有项都被丢弃时缺省,宿主据此不显示类型图标。
111
115
  */
112
116
  | {
113
117
  kind: 'mediaAlbum';
114
118
  imageCount: number;
115
119
  videoCount: number;
116
120
  caption?: string;
121
+ firstItemKind?: 'image' | 'video';
117
122
  } | {
118
123
  kind: 'encrypted';
119
124
  } | {
@@ -1 +1 @@
1
- import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-EEICKR6L.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-IYDCZ2PY.js';import'./chunk-67E52PC5.js';import'./chunk-4RG5NHIL.js';import'./chunk-ZDD7A2BS.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,p=0;for(let u of t)u.kind==="video"?p+=1:i+=1;return {imageCount:i,videoCount:p}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:p}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):p["unsupported-body"]!==void 0?p["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let p=wt();function u(o,l){let T=Array.isArray(l)?l:[l];return T.length===1&&isVNode(T[0])?cloneVNode(T[0],{key:o}):h$1(Fragment,{key:o},T)}function m(o){return l=>{p?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{p?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let l=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:l}):i.message!==void 0?i.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:l}):h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:T=>i["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:p$1,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,l=[],T,L,S,D=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,N=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==l.length||A.some((K,Z)=>l[Z]!==K);l=Object.freeze(A),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",l),i("settled",{visibleMessageIds:l,...l.length===0?{}:{newestVisibleMessageId:l[l.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ie(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function ne(){ie(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(T=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,i("reach-start"),ie(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=N,i("reach-end"),ie(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||N===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ie(he)),O&&!Y&&de(),!J&&q$1&&N!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else d(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,ne();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function oe(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function h(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&oe();},Zt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,h();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(oe(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,h();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,y();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),d(),!O&&y());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function te(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,N+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||N===ee||(f!==void 0&&oe(),J=true,e.scrollTop<=ge()&&Oe()&&ae());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),oe(),O=false,q$1=false,Y=false,c=void 0,R=void 0,N+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),y());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,te(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(te(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(te(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;oe();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),ne();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(T,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,ne();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}ne();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ie(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ie(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=T;ie(()=>{m$1.value!==null&&(f!==void 0?(d(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}D=true,ne();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}ne();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),oe(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),p$1({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:p}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,l=null,T="",L="",S="",D=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),N=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,h=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},h);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let h=await d();return t.hooks?.afterAction?.(r,h),h}catch(h){throw t.hooks?.onError?.(r,h),h}}function v(){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older"},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,d=s.value.loadingNewer??s.value.loading;return !O.value||d||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let d=0;d<sr;d+=1){if(!O.value)return;let h=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!h||y!==null||(r==="older"?await v():await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=N.value;S="";let d;try{d=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(h){throw N.value===r&&(S=r),h}return V.value||(l=null,be()),d}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,d){return m.value?.scrollToMessage(r,d)??false}function he(r,d){return !H&&o===d&&N.value===r&&O.value}async function me(r,d,h,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(h,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ie(r,d,h){let y=m.value;if(y===null||!y.isMeasurable()||y.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,d,h,{behavior:"auto",block:"center"})),te=async le=>{if(!he(r,d)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;y.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw y.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&y.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await te("older")&&(C=true),!j&&!await te("newer")&&(j=true);let ve="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await te(le)||(le==="older"?C=true:j=true);}return he(r,d)}async function Be(r,d={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let h=N.value,y=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(h,y))return false}return !await me(h,y,r,{...d,behavior:"auto"})||!await ie(h,y,r)?false:me(h,y,r,d)}function ne(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(ne(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let d=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let h=g[g.length-1];if(h===void 0)return;let y=r.resolveTarget===void 0?h:r.resolveTarget(h);y!=null&&Promise.resolve(r.markRead(y)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},d);}function Oe(r){g=Object.freeze([...r]);let d={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(d);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(d,void 0);}catch(h){throw t.hooks?.onError?.(d,h),h}V.value?Te():be();}function ae(r,d){return !H&&M===d&&N.value===r&&!D}function xe(r,d){ae(r,d)&&(T=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,d,h){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(h,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=N.value,d=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null||T===r&&(L===d||D)||S===r||l!==null)return;if(!Y.value.enabled){T=r,L=d,V.value=true,Te();return}let h=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,h))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,h,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,h)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!ae(r,h)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,h)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,h,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,h);})().catch(()=>{N.value===r&&(S=r);}).finally(()=>{l===y&&(l=null);});l=y;}function se(r){M+=1,l=null,D=false,V.value=r,(T="",L="",S=""),ne();}function Ve(){if(V.value)return;let r=N.value;D=true,M+=1,l=null,T=r,V.value=true,Te();}let oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(oe),watch(J,r=>{r&&V.value?Te():ne();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,N],()=>{let r=m.value;if(r===null||!O.value)return;let d=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(d,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([N,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,d,h,,,y],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&y!==C&&!D&&y.startsWith("located:")&&(T="",L="",V.value=false),r===""){se(false);return}if(h!==null){V.value||se(false);return}d||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:oe},d=[p.header?.(r),p["before-list"]?.(r)];if(!O.value)d.push(p.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(p.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(p.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let h=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:p["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:y=>{let x=s.value.messages.find(C=>C.id===y);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{default:()=>[p["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:p.item,"date-separator":p["date-separator"],"entry-unread":p["entry-unread"],encryption:p.encryption,system:p.system,message:p.message,"recalled-message":p["recalled-message"],"deleted-message":p["deleted-message"],"unsupported-body":p["unsupported-body"]}),p["viewport-after"]?.(r)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[p["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),h])),s.value.error!==null&&d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.push(p["after-list"]?.(r),p["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),p["context-menu"]?.(r),p.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let p=Object.freeze([...i.keys()]);return Object.freeze({kinds:p,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let p=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,p*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),p=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,l=null,T=null,L=null,S=false,D=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&T!==null||l===null)return;let R=l.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(D||S)return;X(),G();let c=l?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},p));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},i));}function N(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){l?.removeEventListener("scroll",Y),T?.disconnect(),L?.disconnect(),T=null,L=null,l=null;}function Q(c=true){if(D)return;let R=t.getRoot();if(!(R===l&&l!==null)){if(ee(),l=R,l===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,D||(Q(false),q());}));return}if(l.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){T=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:l,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())T.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(D)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),T?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){D||(U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),D=true);}}}function pr(t){let i=new Map,p=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(T=>T.channel===I).map(T=>T.item),l=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(l);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;p.set(g,M);let o=false,l=S=>({channel:g,item:S});function T(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,D){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(D===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=l(S);M.set(H,{target:B,element:D}),k.register(B,D);},isRevealed:S=>k.isRevealed(l(S)),isActivated:S=>k.isActivated(l(S)),isSettledVisible:S=>k.isSettledVisible(l(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:T,dispose(){o||(T(),o=true,i.delete(g),p.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of p.values())for(let I of g.values())k.register(I.target,null);p.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
1
+ import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-NA7DHED6.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-75HBZ5NK.js';import'./chunk-GW6QR4SJ.js';import'./chunk-GZEX4V3P.js';import'./chunk-VKNZ76EP.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,p=0;for(let u of t)u.kind==="video"?p+=1:i+=1;return {imageCount:i,videoCount:p}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:p}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):p["unsupported-body"]!==void 0?p["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let p=wt();function u(o,l){let T=Array.isArray(l)?l:[l];return T.length===1&&isVNode(T[0])?cloneVNode(T[0],{key:o}):h$1(Fragment,{key:o},T)}function m(o){return l=>{p?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{p?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let l=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:l}):i.message!==void 0?i.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:l}):h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:T=>i["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:p$1,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,l=[],T,L,S,D=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,N=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==l.length||A.some((K,Z)=>l[Z]!==K);l=Object.freeze(A),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",l),i("settled",{visibleMessageIds:l,...l.length===0?{}:{newestVisibleMessageId:l[l.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ie(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function ne(){ie(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(T=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,i("reach-start"),ie(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=N,i("reach-end"),ie(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||N===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ie(he)),O&&!Y&&de(),!J&&q$1&&N!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else d(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,ne();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function oe(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function h(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&oe();},Zt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,h();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(oe(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,h();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,y();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),d(),!O&&y());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function te(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,N+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||N===ee||(f!==void 0&&oe(),J=true,e.scrollTop<=ge()&&Oe()&&ae());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),oe(),O=false,q$1=false,Y=false,c=void 0,R=void 0,N+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),y());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,te(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(te(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(te(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;oe();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),ne();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(T,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,ne();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}ne();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ie(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ie(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=T;ie(()=>{m$1.value!==null&&(f!==void 0?(d(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}D=true,ne();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}ne();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),oe(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),p$1({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:p}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,l=null,T="",L="",S="",D=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),N=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,h=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},h);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let h=await d();return t.hooks?.afterAction?.(r,h),h}catch(h){throw t.hooks?.onError?.(r,h),h}}function v(){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older"},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,d=s.value.loadingNewer??s.value.loading;return !O.value||d||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let d=0;d<sr;d+=1){if(!O.value)return;let h=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!h||y!==null||(r==="older"?await v():await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=N.value;S="";let d;try{d=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(h){throw N.value===r&&(S=r),h}return V.value||(l=null,be()),d}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,d){return m.value?.scrollToMessage(r,d)??false}function he(r,d){return !H&&o===d&&N.value===r&&O.value}async function me(r,d,h,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(h,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ie(r,d,h){let y=m.value;if(y===null||!y.isMeasurable()||y.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,d,h,{behavior:"auto",block:"center"})),te=async le=>{if(!he(r,d)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;y.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw y.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&y.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await te("older")&&(C=true),!j&&!await te("newer")&&(j=true);let ve="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await te(le)||(le==="older"?C=true:j=true);}return he(r,d)}async function Be(r,d={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let h=N.value,y=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(h,y))return false}return !await me(h,y,r,{...d,behavior:"auto"})||!await ie(h,y,r)?false:me(h,y,r,d)}function ne(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(ne(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let d=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let h=g[g.length-1];if(h===void 0)return;let y=r.resolveTarget===void 0?h:r.resolveTarget(h);y!=null&&Promise.resolve(r.markRead(y)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},d);}function Oe(r){g=Object.freeze([...r]);let d={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(d);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(d,void 0);}catch(h){throw t.hooks?.onError?.(d,h),h}V.value?Te():be();}function ae(r,d){return !H&&M===d&&N.value===r&&!D}function xe(r,d){ae(r,d)&&(T=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,d,h){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(h,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=N.value,d=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null||T===r&&(L===d||D)||S===r||l!==null)return;if(!Y.value.enabled){T=r,L=d,V.value=true,Te();return}let h=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,h))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,h,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,h)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!ae(r,h)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,h)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,h,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,h);})().catch(()=>{N.value===r&&(S=r);}).finally(()=>{l===y&&(l=null);});l=y;}function se(r){M+=1,l=null,D=false,V.value=r,(T="",L="",S=""),ne();}function Ve(){if(V.value)return;let r=N.value;D=true,M+=1,l=null,T=r,V.value=true,Te();}let oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(oe),watch(J,r=>{r&&V.value?Te():ne();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,N],()=>{let r=m.value;if(r===null||!O.value)return;let d=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(d,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([N,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,d,h,,,y],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&y!==C&&!D&&y.startsWith("located:")&&(T="",L="",V.value=false),r===""){se(false);return}if(h!==null){V.value||se(false);return}d||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:oe},d=[p.header?.(r),p["before-list"]?.(r)];if(!O.value)d.push(p.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(p.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(p.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let h=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:p["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:y=>{let x=s.value.messages.find(C=>C.id===y);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{default:()=>[p["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:p.item,"date-separator":p["date-separator"],"entry-unread":p["entry-unread"],encryption:p.encryption,system:p.system,message:p.message,"recalled-message":p["recalled-message"],"deleted-message":p["deleted-message"],"unsupported-body":p["unsupported-body"]}),p["viewport-after"]?.(r)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[p["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),h])),s.value.error!==null&&d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.push(p["after-list"]?.(r),p["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),p["context-menu"]?.(r),p.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let p=Object.freeze([...i.keys()]);return Object.freeze({kinds:p,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let p=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,p*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),p=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,l=null,T=null,L=null,S=false,D=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&T!==null||l===null)return;let R=l.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(D||S)return;X(),G();let c=l?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},p));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},i));}function N(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){l?.removeEventListener("scroll",Y),T?.disconnect(),L?.disconnect(),T=null,L=null,l=null;}function Q(c=true){if(D)return;let R=t.getRoot();if(!(R===l&&l!==null)){if(ee(),l=R,l===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,D||(Q(false),q());}));return}if(l.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){T=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:l,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())T.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(D)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),T?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){D||(U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),D=true);}}}function pr(t){let i=new Map,p=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(T=>T.channel===I).map(T=>T.item),l=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(l);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;p.set(g,M);let o=false,l=S=>({channel:g,item:S});function T(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,D){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(D===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=l(S);M.set(H,{target:B,element:D}),k.register(B,D);},isRevealed:S=>k.isRevealed(l(S)),isActivated:S=>k.isActivated(l(S)),isSettledVisible:S=>k.isSettledVisible(l(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:T,dispose(){o||(T(),o=true,i.delete(g),p.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of p.values())for(let I of g.values())k.register(I.target,null);p.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
@@ -126,12 +126,17 @@ type LastMessageSummary = {
126
126
  *
127
127
  * 只给结构化计数与配文,**不在这里拼「2 张照片, 1 个视频」这种文案**——中英文的量词、复数与
128
128
  * 连接符各不相同,必须由 im-i18n 按 locale 组装。`caption` 非空时宿主优先显示配文(对齐三端)。
129
+ *
130
+ * `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数无法决定该配
131
+ * 照片图标还是视频图标,三端统一按第一项取(对齐 iOS `IMMediaAlbumMessageBody`)。
132
+ * 入站解析后所有项都被丢弃时缺省,宿主据此不显示类型图标。
129
133
  */
130
134
  | {
131
135
  kind: 'mediaAlbum';
132
136
  imageCount: number;
133
137
  videoCount: number;
134
138
  caption?: string;
139
+ firstItemKind?: 'image' | 'video';
135
140
  } | {
136
141
  kind: 'encrypted';
137
142
  } | {
@@ -4137,12 +4142,16 @@ type ConversationLastMessageSummary = {
4137
4142
  *
4138
4143
  * 只给计数与配文,数量文案由宿主经 im-i18n 按 locale 组装;有配文时优先显示配文。
4139
4144
  * 两个计数都为 0 表示入站正文残缺(所有项都无法解析),宿主应按未知正文处理。
4145
+ *
4146
+ * `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数决定不了该配
4147
+ * 照片图标还是视频图标,三端统一按第一项取;正文残缺时缺省,宿主据此不显示类型图标。
4140
4148
  */
4141
4149
  | {
4142
4150
  kind: 'mediaAlbum';
4143
4151
  imageCount: number;
4144
4152
  videoCount: number;
4145
4153
  caption?: string;
4154
+ firstItemKind?: 'image' | 'video';
4146
4155
  } | {
4147
4156
  kind: 'encrypted';
4148
4157
  } | {
@@ -4518,6 +4527,12 @@ interface ConversationOpenOptions {
4518
4527
  * 后续 read 事件或新消息不会移动分隔线。
4519
4528
  */
4520
4529
  initialPosition?: ConversationInitialPosition;
4530
+ /**
4531
+ * 默认 blocking 等待整个初始窗口;local-first 在本地窗口可读后返回,远端补齐和未读定位后台继续。
4532
+ * local-first 调用方必须订阅 loading/error:加载失败保留本地窗口并写入 error,允许通过 history 重试;
4533
+ * loading 结束前不要提交可见已读或最终首屏定位。本地存储打开失败仍会拒绝 openConversation。
4534
+ */
4535
+ initialLoad?: 'blocking' | 'local-first';
4521
4536
  }
4522
4537
  /**
4523
4538
  * 产品会话的连续窗口快照;协议 cursor、窗口 id 与 generation 始终保持在 SDK 内部。
@@ -5029,6 +5044,31 @@ interface ImMediaTasksApi {
5029
5044
  * @throws 持久缓存读取失败时抛 `IM_SDK_MEDIA_CACHE_READ_FAILED`,不能把存储故障伪装成 cache miss。
5030
5045
  */
5031
5046
  getCached: (message: ImMessageRef) => Promise<Blob | null>;
5047
+ /**
5048
+ * 为宿主手里的**本地**图片/视频文件预读展示元信息:尺寸、视频时长、视频首帧封面的 JPEG 字节。
5049
+ *
5050
+ * 给「发送前预览」这类场景用:宿主要在用户还没点发送时就把缩略图画出来,而浏览器读不出视频的
5051
+ * 首帧——`<video preload="metadata">` 在 iOS Safari 上只加载元信息、**不解码任何一帧**,
5052
+ * 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
5053
+ *
5054
+ * 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
5055
+ * `sendMediaAlbum`:发送链路会跳过重复解码,上传中的气泡也从第一帧就有封面。
5056
+ * 视频封面用的就是发送链路那套规格(长边 320、JPEG),所以弹层里看到的与最终发出去的是同一张。
5057
+ *
5058
+ * @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
5059
+ * @param input.file 本地文件;不会被上传,也不会进任何缓存。
5060
+ * @param input.signal 宿主放弃时中止解码(例如预览弹层被关掉)。
5061
+ * @returns 解码成功返回元信息;**浏览器确实读不出这个文件**(格式不支持、解码超时)时返回 `null`,
5062
+ * 调用方应当显式呈现「这个文件读不出来」,不要拿空白格子糊过去。失败原因会记入 SDK 结构化诊断。
5063
+ * @throws 宿主通过 `signal` 中止时抛 `AbortError`——那是调用方自己的取消,不能和「读不出来」混为一谈。
5064
+ * @throws runtime 已 logout/dispose 时抛 `IM_SDK_MEDIA_RUNTIME_INACTIVE`;
5065
+ * 未装配预览端口时抛 `IM_SDK_MEDIA_PREVIEW_UNAVAILABLE`,不静默返回 `null`。
5066
+ */
5067
+ prepareLocalPreview: <TKind extends 'image' | 'video'>(input: {
5068
+ kind: TKind;
5069
+ file: Blob;
5070
+ signal?: AbortSignal;
5071
+ }) => Promise<(TKind extends 'video' ? VideoPreviewMetadata : ImagePreviewMetadata) | null>;
5032
5072
  }
5033
5073
 
5034
5074
  /**
@@ -5477,14 +5517,8 @@ interface ImSearchApi {
5477
5517
  readonly messages: ImMessageSearchApi;
5478
5518
  }
5479
5519
 
5480
- /**
5481
- * 会话收藏稳定产品门面。
5482
- *
5483
- * 本模块不缓存服务端列表;每次 list/add/delete 都以当前账号 provider 为准。
5484
- * 收藏快照与原聊天消息解耦:原消息删除、撤回或编辑不会回写收藏。
5485
- */
5486
-
5487
5520
  type ImSessionFavoriteItem = Readonly<ImSessionFavoriteItem$1>;
5521
+
5488
5522
  /** 产品层会话收藏 API。 */
5489
5523
  interface ImSessionFavoritesApi {
5490
5524
  list: () => Promise<readonly ImSessionFavoriteItem[]>;
@@ -6117,6 +6151,13 @@ type ConversationListPreviewSegment = {
6117
6151
  kind: 'legacy-emoji-placeholder';
6118
6152
  text: string;
6119
6153
  };
6154
+ /**
6155
+ * 会话列表摘要文字前面那个类型图标的种类;宿主各自把它映射成自己的 SVG 组件。
6156
+ *
6157
+ * `mediaAlbum` 专指「照片和视频混装」的合集,产品用相机图标;只有照片或只有视频的合集归到
6158
+ * `image` / `video`,因为用户看到的文案也是「2张照片」「2个视频」。
6159
+ */
6160
+ type ConversationListPreviewMediaKind = 'image' | 'video' | 'gif' | 'sticker' | 'mediaAlbum';
6120
6161
  /** 由各宿主按当前产品语言注入的会话列表标签。 */
6121
6162
  interface ConversationListPresentationLabels {
6122
6163
  /** 没有草稿和最后消息时显示的占位文案。 */
@@ -6152,6 +6193,13 @@ interface ConversationListPresentation {
6152
6193
  preview: string;
6153
6194
  /** 不包含 @我提示与发送者前缀的摘要分段。 */
6154
6195
  previewSegments: readonly ConversationListPreviewSegment[];
6196
+ /**
6197
+ * 摘要前面该显示哪个类型图标;不需要图标时缺省。
6198
+ *
6199
+ * 草稿、撤回、管理员删除、系统事件显示的是整句话而不是类型占位,一律不给图标;语音、文件、
6200
+ * 名片等没有产品 glyph 的类型同样不给,它们的文案自带方括号来和真实文本区分。
6201
+ */
6202
+ previewMediaKind?: ConversationListPreviewMediaKind;
6155
6203
  /** 群聊或社群普通消息的发送者前缀;其它摘要为空串。 */
6156
6204
  senderPrefix: string;
6157
6205
  /** 未读 @ 提示;草稿、系统、撤回和管理员删除摘要为空串。 */
@@ -6939,6 +6987,31 @@ declare namespace forward_service {
6939
6987
  export type { forward_service_ForwardCommandHooks as ForwardCommandHooks, forward_service_ImForwardOperationResult as ImForwardOperationResult };
6940
6988
  }
6941
6989
 
6990
+ /**
6991
+ * 为宿主手里的本地图片/视频文件预读展示元信息(尺寸、视频时长、视频首帧封面 JPEG 字节)。
6992
+ *
6993
+ * 给「发送前预览」用:宿主要在用户点发送之前就把缩略图画出来。**不要用 `<video>` 当缩略图**——
6994
+ * `preload="metadata"` 在 iOS Safari 上只加载元信息、不解码任何一帧,格子会是空白的,
6995
+ * 而且 N 个文件就是 N 路解码。
6996
+ *
6997
+ * 返回值可以**原样**作为 `localPreviewMetadata` 传给发送命令:发送链路会跳过重复解码,
6998
+ * 上传中的气泡也从第一帧就有封面。视频封面用的就是发送链路那套规格,弹层里看到的与发出去的是同一张。
6999
+ *
7000
+ * @param runtime 当前账号 runtime。
7001
+ * @param input 预读入参。
7002
+ * @param input.kind 文件类型;`'video'` 才会抽首帧与读时长。
7003
+ * @param input.file 本地文件;不上传、不进缓存。
7004
+ * @param input.signal 宿主放弃时中止解码(例如弹层被关掉)。
7005
+ * @returns 解码成功返回元信息;**浏览器确实读不出这个文件**时返回 `null`,
7006
+ * 调用方必须显式呈现「这个文件读不出来」,不要留一块空白让用户以为还在加载。
7007
+ * 账号切换、Client 未就绪同样返回 `null`(此时页面已经不该再画这一格)。
7008
+ * @throws 宿主自己通过 `signal` 中止时抛 `AbortError`;那是调用方的取消,不是文件读不出来。
7009
+ */
7010
+ declare function prepareLocalMediaPreview<TKind extends 'image' | 'video'>(runtime: ChatRuntime, input: {
7011
+ kind: TKind;
7012
+ file: Blob;
7013
+ signal?: AbortSignal;
7014
+ }): Promise<(TKind extends 'video' ? VideoPreviewMetadata : ImagePreviewMetadata) | null>;
6942
7015
  /** 根据文件头确认解密结果是否为 JPEG、PNG、GIF 或 WebP;不是已知图片时返回 `null`,避免页面显示裂图。 */
6943
7016
  declare function detectImageMime(bytes: Uint8Array): string | null;
6944
7017
  /** 根据文件头识别 WebM 或 MP4;无法识别时返回 `video/mp4`,由浏览器播放器继续判断是否能播放。 */
@@ -6977,6 +7050,7 @@ declare function loadCachedVideoObjectUrl(runtime: ChatRuntime, message: ImMessa
6977
7050
  * 同一条门槛),不把无效二进制交给 `<img>`。
6978
7051
  *
6979
7052
  * 返回 `null` 表示下标越界、正文不是合集、内容非法或下载失败,失败原因经 `setNote` 反馈。
7053
+ * **唯一不反馈的失败是用户自己取消**(关预览浮层时取消这一项的在途下载):同样返回 `null`,但不提示。
6980
7054
  * **调用方在不再使用地址时必须 `URL.revokeObjectURL`。**
6981
7055
  */
6982
7056
  declare function loadMediaAlbumItemObjectUrl(runtime: ChatRuntime, message: ImMessageView, itemIndex: number, hooks: ServiceNoteHooks, onProgress?: (percent: number) => void): Promise<string | null>;
@@ -7020,6 +7094,7 @@ declare const media_service_loadImageObjectUrl: typeof loadImageObjectUrl;
7020
7094
  declare const media_service_loadMediaAlbumItemObjectUrl: typeof loadMediaAlbumItemObjectUrl;
7021
7095
  declare const media_service_loadVideoObjectUrl: typeof loadVideoObjectUrl;
7022
7096
  declare const media_service_loadVoiceBytes: typeof loadVoiceBytes;
7097
+ declare const media_service_prepareLocalMediaPreview: typeof prepareLocalMediaPreview;
7023
7098
  declare namespace media_service {
7024
7099
  export {
7025
7100
  media_service_acquireMediaBlob as acquireMediaBlob,
@@ -7033,6 +7108,7 @@ declare namespace media_service {
7033
7108
  media_service_loadMediaAlbumItemObjectUrl as loadMediaAlbumItemObjectUrl,
7034
7109
  media_service_loadVideoObjectUrl as loadVideoObjectUrl,
7035
7110
  media_service_loadVoiceBytes as loadVoiceBytes,
7111
+ media_service_prepareLocalMediaPreview as prepareLocalMediaPreview,
7036
7112
  };
7037
7113
  }
7038
7114
 
@@ -8447,4 +8523,4 @@ declare function resampleWaveform(data: readonly number[], targetCount: number):
8447
8523
  declare function placeholderWaveform(seed: string, count: number): number[];
8448
8524
 
8449
8525
  export { DEFAULT_EMOJI_ASSET_BASE, DEFAULT_LOADING_MINIMUM_VISIBLE_MS, DEFAULT_LOADING_SHOW_DELAY_MS, EMOJI_CATALOG, EMOJI_GAME_DICE_STABLE_KEY, EMOJI_GAME_RPS_STABLE_KEY, EMOJI_TOKEN_RE, MAX_BATCH_FILES, MAX_RECENT_EMOJI_COUNT, SPIKE_STEP, UNICODE_EMOJI_CATALOG, blockReasonForChannelSession, blockReasonForChannelState, blockReasonForGroupState, blockReasonForSession, calculateMediaBox, canEditMessage, canPinChannelMessage, canPinGroupMessage, canPinMessage, canPromoteMediaPresentationSource, canRecallMessage, canTransmit, canTransmitByType, canTransmitContent, cancelMediaUpload, captureRuntimeClientOperation, captureRuntimeOperation, classifyGifFile, createChatRuntime, createDelayedLoadingIndicator, createEmojiMatcher, createLinkMatcher, createNewMessageBadgeController, createThreadItems, decideConversationAction, decideMemberTargetAction, decideMessageAction, emojiAssetUrl, emojiUrlByCode, fetchConversationFileBatch, fetchConversationImageBatch, fetchConversationMessageBatch, fetchConversationVideoBatch, fetchConversationVoiceBatch, fetchNextConversationSearchBatch, formatChatDateSeparator, formatConversationDisplayTime, formatFileSize, formatMediaDuration, forward_service as forwardService, getFileExtension, getLocalDayKey, hasEmojiCandidate, hasLinkCandidate, highlightSegments, isGifFile, isMessageLocateScrollProtected, isMessageTailChangeFromOlderWindowTrim, isMessageViewportMeasurable, isMessageVisibleForNewMessageBadge, isPinnedMessageProtected, isVoiceStorageConfigured, loadOlderUntilBoundary, mediaBatchBudgetBytes, media_service as mediaService, message_service as messageService, normalizeLinkHref, parseUnicodeEmojiCode, pinnedMessage_service as pinnedMessageService, placeholderWaveform, prependRecentEmoji, profile_service as profileService, read_service as readService, refreshPrependMessageAnchorPosition, replaceInterruptedMediaFile, requiresConversationEncryption, requiresForwardTypeConfirmation, resampleWaveform, resolveBestMediaPresentationSource, resolveCenteredMessageScrollTop, resolveChannelMemberAvatarUrl, resolveChannelMemberDisplayName, resolveConversationListPresentation, resolveDisplayTimestamp, resolveEmojiToken, resolveFriendDisplayName, resolveImProfileAccessDestination, resolveImThreadActiveDate, resolveMediaPresentation, resolveMemberDisplayName, resolveMessageBodyKind, resolveMessageNotificationDecision, resolveMessageTimelineTimestamp, resolvePrependMessageAnchor, resolvePrependMessageAnchorAdjustment, resolvePrependMessageAnchorPosition, resolvePublicNickname, resolveQuotedMessagePresentation, resolveSenderAvatarUrl, resolveStandaloneEmojiMessage, resolveSurvivingMessageAnchorAdjustment, resolveUnicodeEmoji, resolveVisibleMessageAnchorPositions, retryMessage, runMediaSendBatch, sendAsFilesBatch, sendBlockReasonForDecision, sendMediaAlbum, sendMediaFile, sendMediaFilesBatch, sendText, sendVoice, shouldCompleteInitialViewport, shouldFillInitialHistoryViewport, shouldFollowIncomingMessage, shouldLoadNewerHistoryPage, shouldPrefetchOlderHistory, shouldRestoreMessageViewportFocus, shouldShowChatDateSeparator, shouldTrackRemoteMessageForBadge, spikeCountForDuration, supportsConversationMention, unicodeEmojiTextFromCode };
8450
- export type { ApplySessionResult, BrowseMessagesInput, CanPinMessageInput, CenteredMessageScrollInput, ChatMediaMessageRef, ChatProfileAdapter, ChatRuntime, ChatRuntimeCredentials, ChatRuntimeFactories, ChatRuntimeHostDeps, ChatRuntimeOpResult, ConversationCapabilityAction, ConversationListPresentation, ConversationListPresentationLabels, ConversationListPresentationOptions, ConversationListPreviewSegment, ConversationSearchCategory, CreateThreadItemsInput, DelayedLoadingIndicator, DelayedLoadingIndicatorOptions, EmojiEntry, EmojiRecentItem, EmojiSegment, FormatTimeDisplayContext, ForwardCommandHooks, GifFileClassification, HighlightSegment, ImChannelMemberPresentation, ImChannelMentionPresentation, ImChannelProfilePresentation, ImForwardOperationResult, ImGroupMemberPresentation, ImMediaBatchSendResult, ImMessageActionResult, ImMessageBodyKind, ImMessageView, ImPinnedMessageActionResult, ImPinnedMessageSnapshot, ImProfileAccessDestination, ImQuotedMessagePresentation, ImTextResolver, ImThreadActiveDateSnapshot, ImThreadDateMarkerMetric, ImThreadDecoration, ImThreadEncryptionItem, ImThreadIntent, ImThreadItem, ImThreadPresentationAdapter, ImThreadReadActions, ImThreadReadTargetResolver, ImThreadViewportMetrics, IncomingMessageFollowInput, InitialHistoryViewportFillInput, InitialViewportCompletionInput, LinkSegment, MediaBatchBudgetOptions, MediaBatchLimitInfo, MediaLimitItem, MediaObjectUrlLease, MediaPresentationFit, MediaPresentationPolicy, MediaPresentationRule, MediaPresentationSourceCandidate, MediaPresentationSourceQuality, MediaSendBatchResult, MemberTargetCapabilityAction, MemberTargetCapabilityInput, MessageCapabilityAction, MessageCapabilityInput, MessageLocateScrollProtectionInput, MessageNotificationDecision, MessageNotificationInput, NewMessageBadgeController, NewMessageBadgeCountListener, NewMessageBadgeVisibilityInput, NewerHistoryPageTriggerInput, OlderHistoryPrefetchInput, PrependAnchorCandidate, PrependAnchorViewport, PrependMessageAnchorPosition, RemoteMessageBadgeTrackingInput, ResolveMediaPresentationInput, ResolvedMediaPresentation, RichExtraSegment, RuntimeClientOperation, RuntimeOperation, SearchBatchResult, SearchFilesInput, SearchMessagesInput, SearchTextMessagesInput, SendCapabilityMode, SendCommandHooks, SendVoicePayload, SenderProfileEntry, ServiceNoteHooks, StandaloneEmojiMessage, UnicodeEmojiEntry };
8526
+ export type { ApplySessionResult, BrowseMessagesInput, CanPinMessageInput, CenteredMessageScrollInput, ChatMediaMessageRef, ChatProfileAdapter, ChatRuntime, ChatRuntimeCredentials, ChatRuntimeFactories, ChatRuntimeHostDeps, ChatRuntimeOpResult, ConversationCapabilityAction, ConversationListPresentation, ConversationListPresentationLabels, ConversationListPresentationOptions, ConversationListPreviewMediaKind, ConversationListPreviewSegment, ConversationSearchCategory, CreateThreadItemsInput, DelayedLoadingIndicator, DelayedLoadingIndicatorOptions, EmojiEntry, EmojiRecentItem, EmojiSegment, FormatTimeDisplayContext, ForwardCommandHooks, GifFileClassification, HighlightSegment, ImChannelMemberPresentation, ImChannelMentionPresentation, ImChannelProfilePresentation, ImForwardOperationResult, ImGroupMemberPresentation, ImMediaBatchSendResult, ImMessageActionResult, ImMessageBodyKind, ImMessageView, ImPinnedMessageActionResult, ImPinnedMessageSnapshot, ImProfileAccessDestination, ImQuotedMessagePresentation, ImTextResolver, ImThreadActiveDateSnapshot, ImThreadDateMarkerMetric, ImThreadDecoration, ImThreadEncryptionItem, ImThreadIntent, ImThreadItem, ImThreadPresentationAdapter, ImThreadReadActions, ImThreadReadTargetResolver, ImThreadViewportMetrics, IncomingMessageFollowInput, InitialHistoryViewportFillInput, InitialViewportCompletionInput, LinkSegment, MediaBatchBudgetOptions, MediaBatchLimitInfo, MediaLimitItem, MediaObjectUrlLease, MediaPresentationFit, MediaPresentationPolicy, MediaPresentationRule, MediaPresentationSourceCandidate, MediaPresentationSourceQuality, MediaSendBatchResult, MemberTargetCapabilityAction, MemberTargetCapabilityInput, MessageCapabilityAction, MessageCapabilityInput, MessageLocateScrollProtectionInput, MessageNotificationDecision, MessageNotificationInput, NewMessageBadgeController, NewMessageBadgeCountListener, NewMessageBadgeVisibilityInput, NewerHistoryPageTriggerInput, OlderHistoryPrefetchInput, PrependAnchorCandidate, PrependAnchorViewport, PrependMessageAnchorPosition, RemoteMessageBadgeTrackingInput, ResolveMediaPresentationInput, ResolvedMediaPresentation, RichExtraSegment, RuntimeClientOperation, RuntimeOperation, SearchBatchResult, SearchFilesInput, SearchMessagesInput, SearchTextMessagesInput, SendCapabilityMode, SendCommandHooks, SendVoicePayload, SenderProfileEntry, ServiceNoteHooks, StandaloneEmojiMessage, UnicodeEmojiEntry };
package/dist/chat-kit.js CHANGED
@@ -1 +1 @@
1
- export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-LNCHWSAT.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,L as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,K as blockReasonForChannelSession,J as blockReasonForChannelState,Q as blockReasonForGroupState,T as blockReasonForSession,E as canEditMessage,u as canPinChannelMessage,t as canPinGroupMessage,v as canPinMessage,D as canRecallMessage,aa as cancelMediaUpload,O as classifyGifFile,s as createChatRuntime,p as createEmojiMatcher,G as decideConversationAction,I as decideMemberTargetAction,H as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Aa as fetchConversationFileBatch,Ba as fetchConversationImageBatch,ya as fetchConversationMessageBatch,Ca as fetchConversationVideoBatch,Da as fetchConversationVoiceBatch,Ea as fetchNextConversationSearchBatch,da as forwardService,o as hasEmojiCandidate,P as isGifFile,w as isPinnedMessageProtected,X as isVoiceStorageConfigured,M as mediaBatchBudgetBytes,ia as messageService,e as parseUnicodeEmojiCode,na as pinnedMessageService,d as prependRecentEmoji,xa as profileService,W as replaceInterruptedMediaFile,R as requiresConversationEncryption,z as resolveChannelMemberAvatarUrl,y as resolveChannelMemberDisplayName,k as resolveEmojiToken,C as resolveFriendDisplayName,oa as resolveImProfileAccessDestination,x as resolveMemberDisplayName,r as resolveMessageNotificationDecision,B as resolvePublicNickname,A as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ba as retryMessage,N as runMediaSendBatch,$ as sendAsFilesBatch,F as sendBlockReasonForDecision,Z as sendMediaAlbum,V as sendMediaFile,_ as sendMediaFilesBatch,U as sendText,Y as sendVoice,S as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-BKZ3VNAT.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-EEICKR6L.js';import'./chunk-IYDCZ2PY.js';import'./chunk-67E52PC5.js';import'./chunk-4RG5NHIL.js';export{pa as canTransmit,na as canTransmitByType,oa as canTransmitContent,ma as requiresForwardTypeConfirmation}from'./chunk-ZDD7A2BS.js';import'./chunk-WOT6VMZA.js';
1
+ export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-OQ5FNJVI.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,L as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,K as blockReasonForChannelSession,J as blockReasonForChannelState,Q as blockReasonForGroupState,T as blockReasonForSession,E as canEditMessage,u as canPinChannelMessage,t as canPinGroupMessage,v as canPinMessage,D as canRecallMessage,aa as cancelMediaUpload,O as classifyGifFile,s as createChatRuntime,p as createEmojiMatcher,G as decideConversationAction,I as decideMemberTargetAction,H as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Aa as fetchConversationFileBatch,Ba as fetchConversationImageBatch,ya as fetchConversationMessageBatch,Ca as fetchConversationVideoBatch,Da as fetchConversationVoiceBatch,Ea as fetchNextConversationSearchBatch,da as forwardService,o as hasEmojiCandidate,P as isGifFile,w as isPinnedMessageProtected,X as isVoiceStorageConfigured,M as mediaBatchBudgetBytes,ia as messageService,e as parseUnicodeEmojiCode,na as pinnedMessageService,d as prependRecentEmoji,xa as profileService,W as replaceInterruptedMediaFile,R as requiresConversationEncryption,z as resolveChannelMemberAvatarUrl,y as resolveChannelMemberDisplayName,k as resolveEmojiToken,C as resolveFriendDisplayName,oa as resolveImProfileAccessDestination,x as resolveMemberDisplayName,r as resolveMessageNotificationDecision,B as resolvePublicNickname,A as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ba as retryMessage,N as runMediaSendBatch,$ as sendAsFilesBatch,F as sendBlockReasonForDecision,Z as sendMediaAlbum,V as sendMediaFile,_ as sendMediaFilesBatch,U as sendText,Y as sendVoice,S as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-TP32EJAN.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-NA7DHED6.js';import'./chunk-75HBZ5NK.js';import'./chunk-GW6QR4SJ.js';import'./chunk-GZEX4V3P.js';export{pa as canTransmit,na as canTransmitByType,oa as canTransmitContent,ma as requiresForwardTypeConfirmation}from'./chunk-VKNZ76EP.js';import'./chunk-WOT6VMZA.js';