k2-im 0.1.42 → 0.1.44

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.
@@ -26,8 +26,8 @@ interface ConversationRef<TType extends ConversationType = ConversationType> {
26
26
  }
27
27
  /** 当前支持持久化草稿的会话类型;`supergroup` 必须继续 fail-fast。 */
28
28
  type DraftConversationType = Exclude<ConversationType, 'supergroup'>;
29
- /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);未知 wire 正文统一归一为 unknown。 */
30
- type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'unknown';
29
+ /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire 正文统一归一为 unknown。 */
30
+ type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'unknown';
31
31
  /**
32
32
  * 发送态(客户端态):消息从本地创建到服务端确认的生命周期。
33
33
  * `uploading` 仅媒体消息使用:文件上传阶段(uploading→pending→sending→sent);
@@ -98,6 +98,8 @@ type LastMessageSummary = {
98
98
  kind: 'transfer';
99
99
  } | {
100
100
  kind: 'gift';
101
+ } | {
102
+ kind: 'liveRoom';
101
103
  } | {
102
104
  kind: 'call';
103
105
  callKind: ImCallKind;
@@ -590,6 +592,40 @@ interface ImMediaAlbumBody {
590
592
  /** 媒体项,顺序即用户选择顺序(决定宫格 index 与首项朝向)。 */
591
593
  items: readonly ImMediaAlbumItem[];
592
594
  }
595
+ /** 直播间分享的直播类型。wire `liveType`:1 视频、2 语音、3 双手机、4 单手机录屏、5 语聊房。 */
596
+ type ImLiveRoomType = 'video' | 'voice' | 'dual-phone' | 'screen-record' | 'voice-chat';
597
+ /** 直播间分享的房间状态。wire `liveRoomStatus`:1 预告、2 直播中、3 已结束。 */
598
+ type ImLiveRoomStatus = 'preview' | 'live' | 'ended';
599
+ /**
600
+ * 直播间分享卡片正文(contentType==='liveRoom',协议 BMessage.contentType=30,fields 98-112)。
601
+ *
602
+ * @remarks 调用方先拿到直播间快照再写入本结构。Core 不请求直播接口,也不把缺省枚举猜成某一种直播。
603
+ * `uid` 是声网 SDK 初始化用的 UID,不是 IM 用户 id。
604
+ */
605
+ interface ImLiveRoomBody {
606
+ /** 直播间 ID(BMessage.liveRoomId)。 */
607
+ liveRoomId: string;
608
+ liveType: ImLiveRoomType;
609
+ liveRoomStatus: ImLiveRoomStatus;
610
+ /** 当前账号是否已关注主播。协议 bool 无法区分未设置,false 也是有效状态。 */
611
+ isFocus: boolean;
612
+ /** 当前账号是否已预约这场直播。 */
613
+ isReservation: boolean;
614
+ liveRecordId?: string;
615
+ /** 画面比例原文,例如 `16:9`。 */
616
+ screenRatio?: string;
617
+ broadcasterUserId?: string;
618
+ broadcasterUserName?: string;
619
+ /** 声网 SDK 初始化 UID(BMessage.uid)。 */
620
+ uid?: string;
621
+ liveCover?: string;
622
+ liveRoomName?: string;
623
+ /** 预告时间,秒级时间戳的十进制字符串。 */
624
+ livePreviewTime?: string;
625
+ livePreviewId?: string;
626
+ /** 直播间人数字符串,保持协议原文,不在 Core 换算。 */
627
+ liveRoomViewers?: string;
628
+ }
593
629
  interface ImMessageBody {
594
630
  /** P0 文本内容(明文,解密后的结果)。 */
595
631
  text?: string;
@@ -625,6 +661,8 @@ interface ImMessageBody {
625
661
  filesAlbum?: ImFilesAlbumBody;
626
662
  /** contentType==='robot' 时的机器人卡片。 */
627
663
  robot?: ImRobotBody;
664
+ /** contentType==='liveRoom' 时的直播间分享卡片。 */
665
+ liveRoom?: ImLiveRoomBody;
628
666
  /** contentType==='unknown' 时的稳定未知正文,不含原始 wire type。 */
629
667
  unknown?: UnknownMessageBody;
630
668
  }
@@ -2028,6 +2066,7 @@ interface ThreadVisibilityTargetGroup<TItem> {
2028
2066
  *
2029
2067
  * 同一通道只能创建一次;每个通道仍保留自己的 key 和回调,但底层共享一个 scroll listener
2030
2068
  * 与一组 IntersectionObserver,避免同一消息滚动根重复做可见性调度。
2069
+ * 多个通道可登记同一节点;注销其中一个通道不会移除其它通道的观察。
2031
2070
  */
2032
2071
  createFactory: (channel: string) => ThreadVisibilityTargetsFactory<TItem>;
2033
2072
  refresh: () => void;
@@ -1 +1 @@
1
- import {h,C,p,i,q,m,z,B,o,j,g}from'./chunk-CVLKJADF.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-PPXQWMHO.js';import'./chunk-SVA6OESM.js';import'./chunk-YNYTR73D.js';import'./chunk-J77L6JLQ.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 $t(t){let a=0,b=0;for(let c of t)c.kind==="video"?b+=1:a+=1;return {imageCount:a,videoCount:b}}function Xt(t){return {systemMessage:a=>a.body.system!==void 0?g$1(a.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:a=>i$1(a.contentType,{locale:t.locale(),durationMs:a.body.voice?.durationMs,stickerImageType:a.body.sticker?.imageType,gameType:a.body.game?.gameType,callKind:a.body.call?.callKind,...a.body.filesAlbum===void 0?{}:{filesAlbum:{count:a.body.filesAlbum.items.length,caption:a.body.filesAlbum.caption}},...a.body.mediaAlbum===void 0?{}:{mediaAlbum:$t(a.body.mediaAlbum.items)}}),lastMessage:a=>a.lastMessageSummary!==void 0?h$2(a.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):a.lastMessagePreview,failureText:a=>a.failure?.displayCode!==void 0?f(a.failure.displayCode,{locale:t.locale(),mediaKind:a.failure.mediaKind,params:a.failure.params}):a.failure?.message??""}}var Nt=Symbol("ImThreadReadActions");function kt(t){provide(Nt,t);}function Zt(){return inject(Nt,void 0)}var at=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:a,slots:b}){return kt(t.readActions),()=>{let c=h(t.message),m=t.rendererRegistry.resolve(c);return m!==void 0?h$1(m,{...a,message:t.message,presentation:t.presentation}):b["unsupported-body"]!==void 0?b["unsupported-body"]({kind:c,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":c,"aria-hidden":"true"})}}});var st=Symbol("ImThreadViewportRegistration");function Lt(){return inject(st,void 0)}var lt=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:a}){let b=Lt();function c(i,y){let k=Array.isArray(y)?y:[y];return k.length===1&&isVNode(k[0])?cloneVNode(k[0],{key:i}):h$1(Fragment,{key:i},k)}function m(i){return y=>{b?.registerMessageNode(i,y instanceof HTMLElement?y:null);}}function C(i,y){return k=>{b?.registerDateNode(i,y,k instanceof HTMLElement?k:null);}}function _(i){return a.encryption?.({item:i})??h$1("div",{"data-im-thread-encryption":i.key})}function p(i){let y=C(i.key,i.label);return a["date-separator"]?.({item:i,setElement:y})??h$1("div",{ref:y,"data-im-thread-date-separator":i.key},i.label)}function S(i){b?.registerEntryUnreadNode(i instanceof HTMLElement?i:null);}function I(i){return a["entry-unread"]?.({item:i,setElement:S})??h$1("div",{ref:S,"data-im-thread-entry-unread":i.key,...i.count===void 0?{}:{"data-count":String(i.count)}})}function O(i){let y=m(i.message.id);return a.item!==void 0?a.item({item:i,setElement:y}):a.message!==void 0?a.message({item:i,setElement:y}):i.message.deletedForEveryone!==void 0?a["deleted-message"]?.({item:i,setElement:y})??h$1("article",{ref:y,"data-im-thread-message-id":i.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):i.message.recalled!==void 0?a["recalled-message"]?.({item:i,setElement:y})??h$1("article",{ref:y,"data-im-thread-message-id":i.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):i.kind==="system"&&a.system!==void 0?a.system({item:i,setElement:y}):h$1("article",{ref:y,"data-im-thread-message-id":i.message.id,"data-first-of-run":i.kind==="message"?String(i.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(at,{message:i.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":a["unsupported-body"]===void 0?void 0:k=>a["unsupported-body"]?.(k)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(i=>{switch(i.kind){case "encryption":return a.item!==void 0?c(i.key,a.item({item:i})):c(i.key,_(i));case "date-separator":return a.item!==void 0?c(i.key,a.item({item:i,setElement:C(i.key,i.label)})):c(i.key,p(i));case "entry-unread":return a.item!==void 0?c(i.key,a.item({item:i,setElement:S})):c(i.key,I(i));case "system":case "message":return c(i.key,O(i))}return i}))}});var Bt=120,fn=500,Be=.5,mn=8;function dt(t){let a=t.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(a!==void 0&&Number.isFinite(a)&&a>0?a:1)}var ut=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:a,expose:b,slots:c}){let m$1=ref(null),C$1=ref(null),_=new Map,p$1,S=new Map,I=new Set,O=new Map,i=0,y=[],k,E,P,B$1,L=false,q$1,te=new Set,D=false,W,$="",Z=1,j$1=false,ee=false,G=true,K=false,V=false,ne=false,X=0,ce=-1,oe=-1,o$1,J,ae,H,N,f=ref(true),w=ref(0),u=C(e=>{w.value=e,a("new-message-count",e);});function F(e){let r=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=r}function T(e=t.messageIds){return e.flatMap(r=>{let s=_.get(r);if(s===void 0)return [];let h=s.getBoundingClientRect(),M=s.querySelector("[data-im-thread-anchor-point]");return [{id:r,top:h.top,bottom:h.bottom,anchorTop:M?.getBoundingClientRect().top??h.top}]})}function re(e="",r=1){let s=Math.min(1,Math.max(0,r));$!==""&&$!==e&&O.get($)?.element.style.removeProperty("opacity"),$=e,Z=s,e!==""&&O.get(e)?.element.style.setProperty("opacity",String(s));}function A(){re();}function z$1(){let e=m$1.value;if(D||e===null||!t.activeDateEnabled)return;let r=[...O.entries()].filter(([,U])=>e.contains(U.element)).map(([U,x])=>{let fe=x.element.getBoundingClientRect();return {key:U,label:x.label,top:fe.top,height:fe.height}}).sort((U,x)=>U.top-x.top),s=e.getBoundingClientRect(),h=r.find(U=>U.height>0)?.height??28,M=g({markers:r,viewportTop:s.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:h});if(M===null){A(),a("active-date-change",null);return}re(M.inlineDateKey,M.inlineOpacity),a("active-date-change",M);}function ye(e){E={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight};}function Ee(e){let r=E;if(r===void 0)return false;let s=Math.max(0,e.scrollHeight-e.clientHeight);return s<r.scrollHeight-r.height&&r.scrollTop>s&&Math.abs(e.scrollTop-s)<=dt(e)}function Ue(e){return Ee(e)||W!==void 0&&(W.behavior==="smooth"||Math.abs(e.scrollTop-W.targetTop)<=dt(e))?0:e.scrollTop-i}function _e(e,r){r!==0&&(i=e.scrollTop-r,W=void 0,Q());}function qe(e,r){let s=Ue(e);if(H!==void 0)return H.expectedOffset-=s,Ie(),_e(e,s),K||je(),false;let h=E;if(h===void 0)return false;let M=k,U=M===void 0?void 0:T([M.id])[0],x=e.scrollTop-h.scrollTop,fe=Ee(e)?0:x,Se=M===void 0||U===void 0?0:(U.anchorTop??U.top)-r.top-M.offset+x;return h.scrollHeight!==e.scrollHeight||h.width!==e.clientWidth||h.height!==e.clientHeight||Math.abs(Se)>Be?(E=void 0,!j$1&&!t.loadingNewer&&!t.hasNewer&&t.resizeFollowEnabled&&f.value&&Math.abs(fe)<=Be?(le(),true):(M!==void 0&&xe({...M,offset:M.offset-fe}),_e(e,s),false)):false}function ke(){let e=m$1.value;if(D||e===null)return;let r=e.getBoundingClientRect();if(qe(e,r))return;let s=B$1!==void 0&&L?t.messageIds.filter(x=>I.has(x)):t.messageIds,h=T(s);if(B$1!==void 0&&L&&h.length===0){f.value=F(e);return}let M=h.filter(x=>B({viewportTop:r.top,viewportBottom:r.bottom,messageTop:x.top,messageBottom:x.bottom,margin:t.visibleMargin})).map(x=>x.id),U=M.length!==y.length||M.some((x,fe)=>y[fe]!==x);y=Object.freeze(M),k=o(h,{top:r.top,bottom:r.bottom}),ye(e),u.acknowledgeVisible(M),f.value=F(e),U&&a("visible-range",y),a("settled",{visibleMessageIds:y,...y.length===0?{}:{newestVisibleMessageId:y[y.length-1]},isAtBottom:f.value,newMessageCount:w.value});}function Ae(e){if(te.add(e),q$1!==void 0)return;let r=()=>{q$1=void 0;let s=[...te];te.clear(),s.forEach(h=>h());};typeof globalThis.requestAnimationFrame=="function"?q$1=globalThis.requestAnimationFrame(r):q$1=globalThis.setTimeout(r,0);}function We(){q$1!==void 0&&(typeof q$1=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(q$1):globalThis.clearTimeout(q$1),q$1=void 0,te.clear());}function Te(){Ae(ke);}function He(){let e=m$1.value;if(e===null)return;let r=e.getBoundingClientRect(),s=o(T(),{top:r.top,bottom:r.bottom});s!==void 0&&(k=s,ye(e));}function Le(){return G&&H===void 0&&!ee&&!t.loadingOlder}function Ge(){He(),G=false,ce=X,ee=true,a("reach-start"),Ae(()=>{t.loadingOlder||(ee=false);});}function ze(e){return t.hasNewer&&!j$1&&!t.loadingOlder&&!t.loadingNewer&&F(e)}function Ye(){j$1=true,f.value=false,oe=X,a("reach-end"),Ae(()=>{t.loadingNewer||(j$1=false);});}function Ve(){let e=m$1.value;e===null||X===oe||!ze(e)||Ye();}function Q(){let e=m$1.value;if(D||e===null)return;let r=e.scrollTop,s=Ee(e),h=W,M=false;if(h!==void 0){let x=Math.abs(r-h.targetTop)<=dt(e);M=h.behavior==="smooth"||x,(h.behavior!=="smooth"||x)&&(W=void 0);}!M&&!s&&!K&&H===void 0&&r!==i&&(K=true,V=true,X+=1);let U=K&&!M&&!s&&r!==i;if(U&&(a("user-scroll"),Ae(z$1)),K&&!ne&&ve(),!G&&V&&X!==ce&&r<i&&r>Ke()&&(G=true),H!==void 0&&!M)if(K){let x=Ce();x!==void 0&&(H.expectedOffset=x);}else Ie(),je();Le()&&U&&r>=0&&m({previousScrollTop:i,currentScrollTop:r,topThreshold:t.olderPrefetchThreshold})&&Ge(),U&&ze(e)&&z({previousScrollTop:i,currentScrollTop:r,isAtBottom:F(e),isHistoryWindow:t.hasNewer,isPageSettling:M})&&Ye(),i=r,Te();}function De(e,r="auto"){W={targetTop:e,behavior:r};}function $e(e){let r=H,s=C$1.value;if(!(r===void 0||s===null)){if(r.visualOffset=Math.abs(e)<=Be?0:e,r.visualOffset===0){s.style.removeProperty("transform"),s.style.removeProperty("will-change");return}s.style.setProperty("transform",`translate3d(0, ${r.visualOffset}px, 0)`),s.style.setProperty("will-change","transform");}}function be(){N!==void 0&&(clearTimeout(N),N=void 0),H!==void 0&&H.visualOffset!==0&&(k=void 0,E=void 0);let e=C$1.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),H=void 0,W=void 0;}function Ce(){let e=m$1.value,r=H;if(e===null||r===void 0)return;let s=T().find(h=>h.id===r.anchor.id);if(s!==void 0)return (s.anchorTop??s.top)-e.getBoundingClientRect().top}function Ie(){let e=H,r=Ce();if(e===void 0||r===void 0)return;let s=e.expectedOffset-r;Math.abs(s)<=Be||($e(e.visualOffset+s),e.committed=false,e.attempts=0);}function Xe(){N!==void 0&&clearTimeout(N),N=setTimeout(()=>{N=void 0,!(K||H?.committed!==true)&&be();},fn);}function ue(){let e=m$1.value,r=H;if(D||e===null||r===void 0||K)return;let s=r.visualOffset;if(Math.abs(s)<=Be){r.committed=true,Xe();return}let h=Math.max(0,e.scrollHeight-e.clientHeight),M=Math.min(h,Math.max(0,e.scrollTop-s));if(De(M),e.scrollTop=M,Math.abs(e.scrollTop-M)>Be){W=void 0,r.committed=false,r.attempts+=1,r.attempts<mn?je():(be(),W=void 0,i=e.scrollTop);return}$e(0),i=e.scrollTop,r.expectedOffset=Ce()??r.expectedOffset,r.committed=true,r.attempts=0,Xe();}function je(){N!==void 0&&clearTimeout(N),N=setTimeout(()=>{N=void 0,ue();},Bt);}function we(e){e!==void 0&&(H===void 0&&(H={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),Ie(),!K&&ue());}function xe(e){let r=m$1.value;if(r===null||e===void 0)return;let s=r.getBoundingClientRect(),h=q(e,T(),{top:s.top,bottom:s.bottom});if(h!==void 0){let M=Math.max(0,r.scrollHeight-r.clientHeight),U=Math.min(M,Math.max(0,r.scrollTop+h));De(U),r.scrollTop=U,i=r.scrollTop,E=void 0;}}function Ke(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function Me(){W?.behavior==="smooth"&&(W=void 0),V=false,K||(K=true,X+=1),o$1!==void 0&&(clearTimeout(o$1),o$1=void 0);}function se(){let e=m$1.value;e===null||X===ce||(H!==void 0&&be(),G=true,e.scrollTop<=Ke()&&Le()&&Ge());}function Re(){k=void 0,E=void 0,o$1!==void 0&&(clearTimeout(o$1),o$1=void 0),be(),K=false,V=false,ne=false,J=void 0,ae=void 0,X+=1,ce=-1,oe=-1,G=true,ee=false,j$1=false,W=void 0;}function Je(){ne||(o$1!==void 0&&(clearTimeout(o$1),o$1=void 0),K=false,V=false,H!==void 0&&(H.attempts=0),ue());}function ve(){ne||(o$1!==void 0&&clearTimeout(o$1),o$1=setTimeout(()=>{o$1=void 0,Je();},Bt));}function n(){W=void 0,Je();}function d(e){ne=true,Me(),J=e.touches?.[0]?.clientY;}function l(e){let r=e.touches?.[0]?.clientY;r!==void 0&&(J!==void 0&&r>J?se():J!==void 0&&r<J&&Ve(),J=r);}function g$1(){ne=false,J=void 0,ve();}function v(e){Me(),e.deltaY<0?se():e.deltaY>0&&Ve(),ve();}function R(e){e.pointerType!=="touch"&&(Me(),ae=e.clientY,ve());}function Y(e){e.pointerType==="touch"||!K||ae===void 0||(e.clientY<ae?se():e.clientY>ae&&Ve(),ae=e.clientY,ve());}function ie(e){e.pointerType!=="touch"&&(ae=void 0,ve());}function he(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(Me(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?se():Ve(),ve());}function le(e="auto"){let r=m$1.value;if(r===null)return;E=void 0,be();let s=Math.max(0,r.scrollHeight-r.clientHeight);De(s,e),r.scrollTo?.({top:s,behavior:e}),r.scrollTop!==s&&(r.scrollTop=s),i=r.scrollTop,u.clear(),L=false,ke();}function Ne(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function nt(){let e=m$1.value;return Ne()&&e!==null&&e.scrollHeight>e.clientHeight+1}function _t(e,r={}){return ht(_.get(e),r)}function ht(e,r){let s=m$1.value;if(s===null||e===void 0||!s.contains(e)||s.clientHeight<=0)return false;be();let h=s.getBoundingClientRect(),M=e.getBoundingClientRect(),U=r.block??"center",x;U==="start"?x=s.scrollTop+M.top-h.top:U==="end"?x=s.scrollTop+M.bottom-h.bottom:U==="nearest"?M.top>=h.top&&M.bottom<=h.bottom?x=s.scrollTop:M.top<h.top?x=s.scrollTop+M.top-h.top:x=s.scrollTop+M.bottom-h.bottom:x=j({currentScrollTop:s.scrollTop,scrollHeight:s.scrollHeight,targetHeight:M.height,targetTop:M.top,viewportHeight:s.clientHeight,viewportTop:h.top});let fe=Math.max(0,s.scrollHeight-s.clientHeight),Se=Math.min(fe,Math.max(0,x));E=void 0;let Fe=r.behavior??"auto";return De(Se,Fe),s.scrollTo?.({top:Se,behavior:Fe}),s.scrollTop!==Se&&(s.scrollTop=Se),i=s.scrollTop,L=false,ke(),true}function jt(){let e=m$1.value;if(e===null||p$1===void 0||!e.contains(p$1)||e.clientHeight<=0)return null;let r=p$1.getBoundingClientRect(),s=e.scrollTop+r.top-e.getBoundingClientRect().top+r.height/2,h=e.clientHeight/2;return {older:s<h-1,newer:e.scrollHeight-s<h-1}}function Kt(){u.clear();}function qt(){j$1=true,f.value=false;}function Wt(){j$1=false,Te();}function Gt(e,r){let s=_.get(e);if(s!==void 0&&s!==r&&(B$1?.unobserve(s),P?.unobserve?.(s),S.delete(s),I.delete(e)),r===null){_.delete(e),I.delete(e);return}_.set(e,r),S.set(r,e),B$1?.observe(r),P?.observe(r),Te();}function zt(e,r,s){let h=O.get(e);if(s===null){O.delete(e);return}O.set(e,{element:s,label:r}),$===e&&s.style.setProperty("opacity",String(Z)),h?.element!==s&&(s.dataset.imThreadDateSeparator=e);}return provide(st,{registerMessageNode:Gt,registerDateNode:zt,registerEntryUnreadNode:e=>{p$1=e??void 0;}}),watch(()=>t.contentKey,(e,r)=>{if(e===r)return;Re();let s=m$1.value;s!==null&&(i=s.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,r)=>{let s=m$1.value;if(s===null)return;let h=new Set(r);r.length>0&&e.length>0&&!e.some(Oe=>h.has(Oe))&&Re();let U=s.getBoundingClientRect(),x=p(k,T(),{top:U.top,bottom:U.bottom}),fe=f.value,Se=r[r.length-1],Fe=Se===void 0?-1:e.indexOf(Se),rt=Fe<0?[]:e.slice(Fe+1).filter(Oe=>!h.has(Oe)),pt=j$1||t.loadingNewer,Yt=e.length===r.length&&e.every(Oe=>h.has(Oe))&&e.some((Oe,ot)=>Oe!==r[ot]);if(await nextTick(),D)return;if(Yt&&fe&&t.followNewMessages&&t.resizeFollowEnabled&&!t.hasNewer&&!pt){le();return}let yt=r[0];if(yt!==void 0&&e.indexOf(yt)>0&&(ee=false,we(x)),rt.length>0){if(pt){j$1=false,H===void 0&&xe(x),f.value=false,Te();return}(fe||rt.some(ot=>t.shouldFollowAppendedMessage?.(ot)===true))&&t.followNewMessages?le():u.add(rt);}Te();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,r)=>{e||!r||!j$1||Ae(()=>{t.loadingNewer||(j$1=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,r)=>{e||!r||!ee||Ae(()=>{t.loadingOlder||(ee=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(i=e.scrollTop,e.addEventListener("scroll",Q,{passive:true}),e.addEventListener("scrollend",n,{passive:true}),e.addEventListener("touchstart",d,{passive:true}),e.addEventListener("touchmove",l,{passive:true}),e.addEventListener("touchend",g$1,{passive:true}),e.addEventListener("touchcancel",g$1,{passive:true}),e.addEventListener("wheel",v,{passive:true}),e.addEventListener("pointerdown",R,{passive:true}),e.addEventListener("pointermove",Y,{passive:true}),e.addEventListener("pointerup",ie,{passive:true}),e.addEventListener("pointercancel",ie,{passive:true}),e.addEventListener("keydown",he),typeof globalThis.ResizeObserver=="function"){P=new globalThis.ResizeObserver(()=>{D||m$1.value===null||ke();}),P.observe(e),C$1.value!==null&&P.observe(C$1.value);for(let r of _.values())P.observe(r);}if(typeof globalThis.IntersectionObserver=="function"){B$1=new globalThis.IntersectionObserver(r=>{for(let s of r){let h=S.get(s.target);h!==void 0&&(s.isIntersecting?I.add(h):I.delete(h));}L=true,Te();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let r of _.values())B$1.observe(r);}Te();}}),onBeforeUnmount(()=>{D=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",Q),e!==null&&(e.removeEventListener("scrollend",n),e.removeEventListener("touchstart",d),e.removeEventListener("touchmove",l),e.removeEventListener("touchend",g$1),e.removeEventListener("touchcancel",g$1),e.removeEventListener("wheel",v),e.removeEventListener("pointerdown",R),e.removeEventListener("pointermove",Y),e.removeEventListener("pointerup",ie),e.removeEventListener("pointercancel",ie),e.removeEventListener("keydown",he)),o$1!==void 0&&clearTimeout(o$1),be(),We(),P?.disconnect(),B$1?.disconnect(),A(),p$1=void 0,_.clear(),S.clear(),I.clear(),O.clear(),u.clear();}),b({getViewportElement:()=>m$1.value,clearNewMessageBadge:Kt,clearActiveDate:A,isAtBottom:computed(()=>f.value),isMeasurable:Ne,isScrollable:nt,newMessageCount:computed(()=>w.value),prepareHistoryPageAppend:qt,cancelHistoryPageAppend:Wt,trackRemoteMessageIds:(e,r)=>u.trackRemote(e,r),scrollToLatest:le,scrollToMessage:_t,scrollToEntryUnread:()=>ht(p$1,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:jt,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:C$1,"data-im-thread-viewport-content":""},c.default?.())])}});var Ut=Symbol("ImThreadSurfaceContext");function hn(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 pn(t){provide(Ut,t);}function ct(){let t=inject(Ut);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var ft=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),mt=Object.freeze({enabled:true,maxFillPages:8}),bn=8,In=160;function wn(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var Mn=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:a,slots:b}){let c=t.context??ct(),m=ref(null),C=ref(0),_=ref(false),p=ref(false),S=ref(false),I,O,i$1=ref(false),y=ref(false),k=ref(false),E=false,P,B=ref(true),L=[],q,te=0,D=0,W,$=null,Z="",j="",ee="",G=false,K=false,V=ref(false),ne=ref(""),X=ref(false),ce,oe,o=computed(()=>c.getState()),J=computed(()=>!!o.value.pendingLocationMessageId),ae=computed(()=>o.value.pageVisible??c.isPageVisible?.()??true),H=computed(()=>o.value.pageEngaged??c.isPageEngaged?.()??true),N=computed(()=>wn(o.value.activeConversation,t.conversation)),f=computed(()=>({...ft,...t.viewportOptions})),w=computed(()=>{let n=t.initialViewportOptions.maxFillPages??mt.maxFillPages;return {enabled:t.initialViewportOptions.enabled??mt.enabled,maxFillPages:Number.isFinite(n)?Math.max(0,Math.floor(n)):mt.maxFillPages}}),u=computed(()=>!N.value||!o.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),F=computed(()=>N.value?i({messages:o.value.messages,entryUnread:o.value.entryUnread,formatDate:c.formatDate,leadingItems:c.leadingItems?.(),beforeMessageItems:c.beforeMessageItems}):[]),T=computed(()=>F.value.flatMap(n=>n.kind==="message"||n.kind==="system"?[n.message.id]:[]));function re(){ce!==void 0&&(clearTimeout(ce),ce=void 0),oe!==void 0&&(clearTimeout(oe),oe=void 0);}function A(n=false){if(re(),X.value=false,n){m.value?.clearActiveDate(),ne.value="";return}oe=setTimeout(()=>{oe=void 0,!X.value&&(m.value?.clearActiveDate(),ne.value="");},In);}function z(n){if(n===null){A();return}re(),ne.value=n.label,X.value=true;let d=f.value.activeDateIdleDelay,l=Number.isFinite(d)?Math.max(0,d):ft.activeDateIdleDelay;ce=setTimeout(()=>{ce=void 0,A();},l);}async function ye(n,d,l){t.hooks?.beforeAction?.(n);try{let g=await d();return l?.()!==!1&&t.hooks?.afterAction?.(n,g),g}catch(g){throw l?.()!==false&&t.hooks?.onError?.(n,g),g}}function Ee(n="automatic",d){return !N.value||o.value.loading||!o.value.hasOlder?Promise.resolve(0):ye({kind:"load-older",source:n},()=>c.actions.loadOlder(),d)}function Ue(){return _e()}function _e(n){let d=c.actions.loadNewer,l=o.value.loadingNewer??o.value.loading;return !N.value||l||!o.value.hasNewer||d===void 0?Promise.resolve(0):ye({kind:"load-newer"},()=>d(),n)}async function qe(n){for(let d=0;d<bn;d+=1){if(!N.value||S.value||p.value||J.value)return;let l=n==="older"?o.value.hasOlder:o.value.hasNewer,g=n==="older"?o.value.olderError:o.value.newerError;if(!l||g!==null||(n==="older"?await Ee("user-scroll"):await Ue())>0)return;let R=n==="older"?o.value.hasOlder:o.value.hasNewer,Y=n==="older"?o.value.olderError:o.value.newerError;if(!R||Y!==null)return}}async function ke(){return !N.value||c.actions.loadNewer===void 0?0:We({kind:"load-newer"},()=>c.actions.retryNewer?.()??c.actions.loadNewer?.({force:true})??Promise.resolve(0))}async function Ae(){return N.value?We({kind:"retry-older"},()=>c.actions.retryOlder?.()??c.actions.loadOlder({force:true})):0}async function We(n,d){let l=u.value,g=++te;$=null,ee="";let v;try{v=await ye(n,d);}catch(R){throw ue(l,g)&&(ee=l),R}return ue(l,g)&&!V.value&&($=null,Me()),v}async function Te(){if(!N.value)return false;let n=u.value;Re();let d=++D;return S.value=false,se(true),G=true,Z=n,j=xe(we()),!await ye({kind:"jump-to-latest"},()=>c.actions.jumpToLatest?.()??Promise.resolve(!o.value.isHistoryWindow),()=>Q(n,d))||!Q(n,d)||(await nextTick(),!Q(n,d))?false:(m.value?.scrollToLatest(),_.value=true,k.value=false,Le(),true)}function He(n=false){let d=m.value,l=d?.getViewportElement();y.value=d?.isScrollable()===true;let g=o.value.entryUnreadNavigation;i$1.value=g?.state==="located"&&L.includes(g.firstMessageId),V.value&&i$1.value&&(_.value=true);let v=l==null?0:Math.max(0,l.scrollHeight-l.clientHeight-l.scrollTop);k.value=g!==void 0&&v>50,n&&g!==void 0&&l!==null&&l!==void 0&&l.clientHeight>0&&v>=l.clientHeight&&(_.value=true);}function Le(){let n=c.actions.markConversationRead;if(n===void 0||!H.value||!N.value||!V.value||p.value||E&&(!B.value||o.value.hasNewer)||P!==void 0||o.value.error!==null)return;let d=u.value,l=n().then(()=>{P===l&&d===u.value&&(E=true);}).catch(g=>{!K&&P===l&&d===u.value&&t.hooks?.onError?.({kind:"mark-conversation-read"},g);}).finally(()=>{P===l&&(P=void 0);});P=l;}async function Ge(){let n=c.actions.loadEntryUnread;if(!N.value||p.value||n===void 0)return "cancelled";let d=u.value,l=++D;S.value=false;let g=new AbortController;O=g,I=l,p.value=true,se(true),G=true;try{let v=await ye({kind:"jump-to-entry-unread"},()=>n({signal:g.signal}),()=>Q(d,l));if(!Q(d,l))return "cancelled";if(!v||o.value.entryUnread.state!=="located")return "unavailable";let Y=await ze(d,l);return Y&&(_.value=!0),Y?"located":Q(d,l)?"unavailable":"cancelled"}catch(v){if(!Q(d,l))return "cancelled";throw v}finally{I===l&&(I=void 0,O=void 0,p.value=false);}}async function ze(n,d){await nextTick();for(let l=0;l<60;l+=1){if(!Q(n,d))return false;if(m.value?.scrollToEntryUnread())return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(g=>window.requestAnimationFrame(()=>g()));}return false}function Ye(n){B.value=n.isAtBottom,C.value=n.newMessageCount,He(),Me();}function Ve(n,d){return m.value?.scrollToMessage(n,d)??false}function Q(n,d){return !K&&D===d&&u.value===n&&N.value}async function De(n,d,l,g){for(let v=0;v<60;v+=1){if(!Q(n,d))return false;if(Ve(l,g))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(R=>window.requestAnimationFrame(()=>R()));}return false}async function $e(n,d){let l=m.value;if(l===null||!l.isMeasurable()||l.isScrollable())return true;let g=0,v=!o.value.hasOlder,R=!o.value.hasNewer||c.actions.loadNewer===void 0,Y=()=>Q(n,d),ie=async le=>{if(!Q(n,d)||g>=w.value.maxFillPages)return false;let Ne=0;if(le==="older"){if(v||!o.value.hasOlder)return false;Ne=await Ee("automatic",Y),v=!o.value.hasOlder;}else {if(R||!o.value.hasNewer)return false;l.prepareHistoryPageAppend();try{Ne=await _e(Y);}catch(nt){throw Y()&&l.cancelHistoryPageAppend(),nt}Y()&&Ne<=0&&!o.value.hasNewer&&l.cancelHistoryPageAppend(),R=!o.value.hasNewer;}return g+=1,await nextTick(),await nextTick(),Q(n,d)&&(Ne>0||!(le==="older"?v:R))};!v&&!await ie("older")&&(v=true),!R&&!await ie("newer")&&(R=true);let he="older";for(;Q(n,d)&&g<w.value.maxFillPages&&l.isMeasurable()&&!l.isScrollable()&&(!v||!R);){let le=he==="older"?v?"newer":"older":R?"older":"newer";he=le==="older"?"newer":"older",await ie(le)||(le==="older"?v=true:R=true);}return Q(n,d)}async function be(n,d={behavior:"auto",block:"center"}){if(!N.value||n==="")return false;let l=u.value;Re();let g=S.value||W!==void 0||(o.value.loadingOlder??o.value.loading)||(o.value.loadingNewer??o.value.loading),v=++D;S.value=true,se(true),G=true,Z=l,j=xe(we());let R=()=>Q(l,v);try{if(g||!T.value.includes(n)){let Y=c.actions.loadAround;if(Y===void 0)return !1;let ie={};W=ie;try{if(!await ye({kind:"locate-message",messageId:n},()=>Y(n),R)||!R())return !1}finally{W===ie&&(W=void 0);}}return await nextTick(),await nextTick(),!R()||!await $e(l,v)?!1:await De(l,v,n,d)}finally{D===v&&(S.value=false);}}function Ce(){q!==void 0&&(clearTimeout(q),q=void 0);}function Ie(){if(Ce(),!V.value)return;let n=t.readActions;if(n===void 0&&c.actions.markVisibleMessages===void 0)return;let d=Number.isFinite(f.value.visibleReadDelay)?Math.max(0,f.value.visibleReadDelay):ft.visibleReadDelay;q=setTimeout(()=>{if(q=void 0,!N.value||!H.value)return;Le();let l=c.actions.markVisibleMessages;if(l!==void 0){let R=L;l(R).catch(Y=>{t.hooks?.onError?.({kind:"visible-range",messageIds:R},Y);});return}if(n===void 0)return;let g=L[L.length-1];if(g===void 0)return;let v=n.resolveTarget===void 0?g:n.resolveTarget(g);v!=null&&Promise.resolve(n.markRead(v)).catch(R=>{t.hooks?.onError?.({kind:"visible-range",messageIds:L},R);});},d);}function Xe(n){L=Object.freeze([...n]),He();let d={kind:"visible-range",messageIds:L};t.hooks?.beforeAction?.(d);try{c.actions.onVisibleRange?.(L),t.hooks?.afterAction?.(d,void 0);}catch(l){throw t.hooks?.onError?.(d,l),l}V.value?Ie():Me();}function ue(n,d){return !K&&te===d&&u.value===n&&!G&&!J.value}function je(n,d){ue(n,d)&&(Z=n,j=xe(we()),V.value=true,He(),Le(),Ie());}function we(){return o.value.entryUnreadNavigation===void 0?o.value.entryUnread:{state:"none"}}function xe(n){return n.state!=="located"?n.state:`${n.state}:${n.firstMessageId}`}async function Ke(n,d,l){for(let g=0;g<60;g+=1){if(!ue(n,d))return false;if(m.value?.scrollToMessage(l,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(R=>window.requestAnimationFrame(()=>R()));}return false}function Me(){let n=u.value,d=xe(we());if(n===""||o.value.loading||S.value||J.value||o.value.error!==null&&o.value.messages.length===0||Z===n&&(j===d||j.startsWith("located:")||G)||ee===n||$!==null)return;if(!w.value.enabled){Z=n,j=d,V.value=true,Ie();return}let l=++te;G=false,V.value=false;let g=(async()=>{if(await nextTick(),!ue(n,l))return;let v=m.value;if(v===null||!v.isMeasurable())return;let R=we();if(R.state==="located"&&!T.value.includes(R.firstMessageId))return;let Y=R.state==="located"?await Ke(n,l,R.firstMessageId):false;if(R.state==="located"&&!Y)return;Y||v.scrollToLatest();let ie=0;for(;ue(n,l)&&ie<w.value.maxFillPages&&o.value.error===null&&(o.value.hasOlder||o.value.hasNewer&&c.actions.loadNewer!==void 0)&&v.isMeasurable()&&!v.isScrollable();){if(o.value.hasNewer&&c.actions.loadNewer!==void 0&&(o.value.messages.length===0||!o.value.hasOlder)){let le=D;v.prepareHistoryPageAppend();try{await Ue(),await nextTick();}finally{u.value===n&&D===le&&(te===l||G)&&v.cancelHistoryPageAppend();}}else await Ee();if(!ue(n,l)||(ie+=1,await nextTick(),await nextTick(),!v.isMeasurable()))return}if(!ue(n,l)||!v.isMeasurable())return;let he=we();if(he.state==="located"){if(!T.value.includes(he.firstMessageId)||!await Ke(n,l,he.firstMessageId))return}else v.scrollToLatest();await nextTick(),je(n,l);})().catch(()=>{ue(n,l)&&(ee=n);}).finally(()=>{$===g&&($=null);});$=g;}function se(n,d=false){te+=1,$=null,G=false,V.value=n,n||(Z="",j="",d||(ee="")),Ce();}function Re(){O!==void 0&&(D+=1,O.abort(),O=void 0,I=void 0,p.value=false);}function Je(){if(He(true),Re(),G=true,V.value)return;let n=u.value;te+=1,$=null,Z=n,V.value=true,Ie();}let ve=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:Ee,retryOlder:Ae,loadNewer:Ue,retryNewer:ke,jumpToLatest:Te,jumpToEntryUnread:Ge,scrollToMessage:Ve,locateMessage:be,focusViewport:()=>m.value?.focusViewport()});return a(ve),watch(H,n=>{n&&V.value?Ie():Ce();}),watch([()=>o.value.activeRemoteMessageRevision??0,m,u],()=>{let n=m.value;if(n===null||!N.value)return;let d=c.actions.drainActiveRemoteMessageIds?.()??[];n.trackRemoteMessageIds(d,{isAtBottom:B.value,isHistoryWindow:o.value.isHistoryWindow,isPageVisible:ae.value})&&(B.value=false);},{flush:"post"}),watch(()=>o.value.pendingLocationMessageId??"",n=>{(n!==""||S.value)&&(D+=1,S.value=false),n!==""&&(Re(),V.value||se(false));},{flush:"sync"}),watch([u,()=>o.value.loading,()=>o.value.error,()=>T.value.length,()=>o.value.hasOlder,()=>xe(we()),w,()=>o.value.hasNewer,J],([n,d,l,g,,v],[R,,,Y,,ie])=>{if(n!==R&&(Re(),D+=1,S.value=false,W=void 0,se(false),A(true),m.value?.clearNewMessageBadge(),C.value=0,B.value=true,L=[],_.value=false,i$1.value=false,y.value=false,k.value=false,p.value=false,I=void 0,E=false,P=void 0),n!==""&&n===R&&Y!==void 0&&Y>0&&g===0&&(o.value.hasOlder||o.value.hasNewer)&&V.value&&se(false,true),n!==""&&n===R&&v!==ie&&!j.startsWith("located:")&&!G&&v.startsWith("located:")&&(Z="",j="",V.value=false),n===""){se(false);return}if(l!==null&&o.value.messages.length===0){V.value||se(false,true);return}d||Me();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{K=true,Re(),D+=1,se(false),A(true);}),()=>{let n={conversation:t.conversation,state:o.value,items:F.value,actions:ve,initialViewportSettled:u.value!==""&&(o.value.messages.length===0?!o.value.loading&&o.value.error===null&&!o.value.hasOlder&&!o.value.hasNewer:V.value&&Z===u.value)},d=[b.header?.(n),b["before-list"]?.(n)];if(!N.value)d.push(b.unsupported?.(n)??h$1("div",{"data-im-thread-unsupported":""}));else if(!o.value.ready&&o.value.loading)d.push(b.loading?.(n)??h$1("div",{"data-im-thread-loading":""}));else if(o.value.error!==null&&o.value.messages.length===0)d.push(b.error?.(n)??h$1("div",{"data-im-thread-error":""}));else if(o.value.ready&&o.value.messages.length===0&&!o.value.hasOlder&&!o.value.hasNewer)d.push(b.empty?.(n)??h$1("div",{"data-im-thread-empty":""}));else {let l=h$1(ut,{ref:m,messageIds:T.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:o.value.loadingOlder??o.value.loading,hasNewer:o.value.hasNewer,loadingNewer:o.value.loadingNewer??o.value.loading,followThreshold:f.value.followThreshold,olderPrefetchThreshold:f.value.olderPrefetchThreshold,visibleMargin:f.value.visibleMargin,activeDateOffset:f.value.activeDateOffset,activeDateEnabled:b["active-date"]!==void 0,resizeFollowEnabled:V.value&&!p.value&&!S.value&&!J.value,followNewMessages:ae.value&&!p.value&&!S.value&&!J.value,shouldFollowAppendedMessage:g=>{let v=o.value.messages.find(R=>R.id===g);return v===void 0?false:c.shouldFollowMessage?.(v)===true},onReachStart:()=>{qe("older").catch(()=>{});},onReachEnd:()=>{qe("newer").catch(()=>{});},onSettled:Ye,onUserScroll:Je,onActiveDateChange:z,onVisibleRange:Xe,onNewMessageCount:g=>{C.value=g;}},{default:()=>[b["viewport-before"]?.(n),h$1(lt,{items:F.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:b.item,"date-separator":b["date-separator"],"entry-unread":b["entry-unread"],encryption:b.encryption,system:b.system,message:b.message,"recalled-message":b["recalled-message"],"deleted-message":b["deleted-message"],"unsupported-body":b["unsupported-body"]}),b["viewport-after"]?.(n)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[b["active-date"]?.({label:ne.value,visible:X.value&&ne.value!==""}),l,b["entry-unread-navigation"]?.({...n,count:o.value.entryUnreadNavigation?.state==="none"?0:o.value.entryUnreadNavigation?.count??0,loading:p.value,visible:n.initialViewportSettled&&!_.value&&!i$1.value&&!o.value.isHistoryWindow&&o.value.entryUnreadNavigation!==void 0&&o.value.entryUnreadNavigation.state!=="none"&&o.value.entryUnreadNavigation.count>0&&(y.value||o.value.hasOlder)})])),o.value.error!==null&&d.push(b.error?.(n)??h$1("div",{"data-im-thread-error":""}));}return d.push(b["after-list"]?.(n),b["jump-to-latest"]?.({...n,count:C.value,visible:k.value||!B.value||o.value.isHistoryWindow}),b["context-menu"]?.(n),b.composer?.(n)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function Rn(t){let a=new Map;for(let c of t){if(a.has(c.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${c.kind}`);a.set(c.kind,c.component);}let b=Object.freeze([...a.keys()]);return Object.freeze({kinds:b,resolve:c=>a.get(c)})}var Pn=140,En=120;function tt(t,a){if(t.width<=0||t.height<=0)return 0;let b=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),c=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,b*c/(t.width*t.height))}function gt(t,a){return {x:t.x,y:t.top-a,top:t.top-a,bottom:t.bottom+a,left:t.left,right:t.right,width:t.width,height:t.height+a*2,toJSON:()=>({})}}function vt(t){let a=Math.max(0,t.scrollIdleMs??Pn),b=Math.max(0,t.visibilityDwellMs??En),c=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),C=Math.max(0,t.preloadMarginPx??0),_=Math.max(m,C),p=Math.max(0,t.maxPreloadTargets??Number.POSITIVE_INFINITY),S=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),I=new Map,O=new Map,i=reactive(new Set),y=new Set,k=new Set,E=[],P=null,B=null,L=null,q=false,te=false,D=false,W=false,$,Z;function j(){$!==void 0&&clearTimeout($),$=void 0;}function ee(){Z!==void 0&&clearTimeout(Z),Z=void 0;}function G(f=false){if(!f&&B!==null||P===null)return;let w=P.getBoundingClientRect(),u=gt(w,_);for(let[F,T]of I){let re=F.getBoundingClientRect();T.ratio=tt(re,w),T.intersecting=T.ratio>0,T.revealIntersecting=_>0?tt(re,u)>0:T.intersecting&&T.ratio>=c;}}function K(f){return f.intersecting&&f.ratio>=c}function V(){for(let[f,w]of I)!w.revealIntersecting||i.has(w.key)||_>m&&(m===0&&!K(w)||m>0&&(P===null||tt(f.getBoundingClientRect(),gt(P.getBoundingClientRect(),m))<=0))||(i.add(w.key),t.onRevealed?.(w.item));}function ne(f,w=false){let u=new Set(f.map(T=>T.key));if(!(!(u.size!==k.size||[...u].some(T=>!k.has(T)))&&!w)){k.clear();for(let T of u)k.add(T);t.onSettledVisibleChange?.(f.map(T=>T.item));}}function X(f,w=false){!w&&f.length===E.length&&f.every((u,F)=>u.key===E[F]?.key&&u.item===E[F]?.item)||(E=f,t.onSettledPreloadChange?.(f.map(u=>u.item)));}function ce(){if(D||q)return;let f=te;te=false,G(),V();let w=P?.getBoundingClientRect(),u=w===void 0?0:(w.top+w.bottom)/2,F=[...I.entries()].filter(([,T])=>K(T)).sort(([T],[re])=>{let A=T.getBoundingClientRect(),z=re.getBoundingClientRect();return Math.abs((A.top+A.bottom)/2-u)-Math.abs((z.top+z.bottom)/2-u)}).slice(0,S).map(([,T])=>T);if(ne(F,f),t.onSettledPreloadChange!==void 0&&w!==void 0){let T=gt(w,C),re=[...I.entries()].filter(([,A])=>A.revealIntersecting).map(([A,z])=>({target:z,rect:A.getBoundingClientRect()})).filter(({target:A,rect:z})=>K(A)||C>0&&tt(z,T)>0).sort((A,z)=>Number(K(z.target))-Number(K(A.target))||Math.abs((A.rect.top+A.rect.bottom)/2-u)-Math.abs((z.rect.top+z.rect.bottom)/2-u)).slice(0,p).map(({target:A})=>A);X(re,f);}for(let T of F)y.has(T.key)||(y.add(T.key),t.onActivated?.(T.item));}function oe(){D||q||(ee(),Z=setTimeout(()=>{Z=void 0,ce();},b));}function o(){D||(te=true,J(true),X([]),G(),V(),ne([]),ee(),j(),$=setTimeout(()=>{$=void 0,J(false),oe();},a));}function J(f){q!==f&&(q=f,t.onScrollingChange?.(f));}function ae(){P?.removeEventListener("scroll",o),B?.disconnect(),L?.disconnect(),B=null,L=null,P=null;}function H(f=true){if(D)return;let w=t.getRoot();if(!(w===P&&P!==null)){if(X([]),ae(),P=w,P===null){f&&!W&&(W=true,Promise.resolve().then(()=>{W=false,D||(H(false),oe());}));return}if(P.addEventListener("scroll",o,{passive:true}),typeof IntersectionObserver<"u"){B=new IntersectionObserver(u=>{for(let F of u){let T=I.get(F.target);T!==void 0&&(T.intersecting=F.isIntersecting,T.ratio=F.intersectionRatio,_===0&&(T.revealIntersecting=F.isIntersecting&&F.intersectionRatio>=c));}V(),oe();},{root:P,threshold:[0,c,1]}),_>0&&(L=new IntersectionObserver(u=>{for(let F of u){let T=I.get(F.target);T!==void 0&&(T.revealIntersecting=F.isIntersecting);}V(),oe();},{root:P,rootMargin:`${_}px 0px`,threshold:0}));for(let u of I.keys())B.observe(u);for(let u of I.keys())L?.observe(u);}else G(),V();}}function N(f){X(E.filter(w=>w.key!==f)),i.delete(f),y.delete(f),k.delete(f);}return {register(f,w){if(D)return;let u=t.getKey(f),F=i.has(u),T=y.has(u),re=w===null?void 0:I.get(w);re!==void 0&&re.key!==u&&(O.delete(re.key),I.delete(w),N(re.key));let A=O.get(u);if(A!==void 0&&A!==w&&(B?.unobserve(A),L?.unobserve(A),I.delete(A),O.delete(u)),w===null){A!==void 0&&(B?.unobserve(A),L?.unobserve(A),I.delete(A),O.delete(u)),N(u);return}let z=I.get(w);if(z?.key===u&&z.item===f){H();return}I.set(w,{item:f,key:u,intersecting:z?.key===u?z.intersecting:false,ratio:z?.key===u?z.ratio:0,revealIntersecting:z?.key===u?z.revealIntersecting:false}),O.set(u,w),H(),B?.observe(w),L?.observe(w),G(true),V(),F&&t.onRevealed?.(f),T&&t.onActivated?.(f),oe();},isRevealed:f=>i.has(t.getKey(f)),isActivated:f=>y.has(t.getKey(f)),isSettledVisible:f=>k.has(t.getKey(f)),isScrolling:()=>q,notifyScroll:o,refresh(){H(),G(true),V(),oe();},reset(){j(),ee(),J(false),te=false,ne([]),X([]),ae(),I.clear(),O.clear(),i.clear(),y.clear();},dispose(){D||(j(),ee(),J(false),te=false,ne([]),X([]),ae(),I.clear(),O.clear(),i.clear(),y.clear(),D=true);}}}function An(t){let a=new Map,b=new Map,c=false,m=p=>{let S=a.get(p.channel);return S===void 0?p.channel:`${p.channel}\0${S.getKey(p.item)}`},C=vt({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,preloadMarginPx:t.preloadMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:p=>{for(let S of a.values())S.onScrollingChange?.(p);},onRevealed:p=>a.get(p.channel)?.onRevealed?.(p.item),onActivated:p=>a.get(p.channel)?.onActivated?.(p.item),onSettledPreloadChange:p=>{for(let[S,I]of a){let O=p.filter(i=>i.channel===S).map(i=>i.item);I.onSettledPreloadChange?.(O.slice(0,Math.max(0,I.maxPreloadTargets??Number.POSITIVE_INFINITY)));}},onSettledVisibleChange:p=>{for(let[S,I]of a){let O=p.filter(y=>y.channel===S).map(y=>y.item),i=I.maxSettledVisible===void 0?O:O.slice(0,I.maxSettledVisible);I.onSettledVisibleChange?.(i);}}});function _(p){return S=>{if(c)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(a.has(p))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${p}`);a.set(p,S);let I=new Map;b.set(p,I);let O=false,i=E=>({channel:p,item:E});function y(){for(let E of I.values())C.register(E.target,null);I.clear(),S.onScrollingChange?.(false),S.onSettledVisibleChange?.([]),S.onSettledPreloadChange?.([]);}return {register(E,P){if(O||c)return;let B=S.getKey(E),L=I.get(B);if(P===null){L!==void 0&&(C.register(L.target,null),I.delete(B));return}let q=L?.target.item===E?L.target:i(E);I.set(B,{target:q,element:P}),C.register(q,P);},isRevealed:E=>C.isRevealed(i(E)),isActivated:E=>C.isActivated(i(E)),isSettledVisible:E=>C.isSettledVisible(i(E)),isScrolling:C.isScrolling,notifyScroll:C.notifyScroll,refresh:C.refresh,reset:y,dispose(){O||(y(),O=true,a.delete(p),b.delete(p));}}}}return {createFactory:_,refresh:C.refresh,dispose(){if(!c){for(let p of b.values())for(let S of p.values())C.register(S.target,null);for(let p of a.values())p.onSettledPreloadChange?.([]);b.clear(),a.clear(),C.dispose(),c=true;}}}}export{at as ImThreadBodySwitch,lt as ImThreadItems,Mn as ImThreadSurface,ut as ImThreadViewport,hn as createImThreadSurfaceContext,Rn as createMessageRendererRegistry,An as createThreadVisibilityTargetGroup,vt as createThreadVisibilityTargets,pn as provideImThreadSurfaceContext,Xt as useImText,ct as useImThreadSurfaceContext,Zt as useOptionalImThreadReadActions};
1
+ import {h,C,p,i,q,m,z,B,o,j,g}from'./chunk-XEAIJXWV.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-I5M7SVQU.js';import'./chunk-YP6KFYYU.js';import'./chunk-SVYZRVHS.js';import'./chunk-XNBJ3NXF.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive,shallowReactive}from'vue';function Xt(t){let a=0,b=0;for(let c of t)c.kind==="video"?b+=1:a+=1;return {imageCount:a,videoCount:b}}function Jt(t){return {systemMessage:a=>a.body.system!==void 0?g$1(a.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:a=>i$1(a.contentType,{locale:t.locale(),durationMs:a.body.voice?.durationMs,stickerImageType:a.body.sticker?.imageType,gameType:a.body.game?.gameType,callKind:a.body.call?.callKind,...a.body.filesAlbum===void 0?{}:{filesAlbum:{count:a.body.filesAlbum.items.length,caption:a.body.filesAlbum.caption}},...a.body.mediaAlbum===void 0?{}:{mediaAlbum:Xt(a.body.mediaAlbum.items)}}),lastMessage:a=>a.lastMessageSummary!==void 0?h$2(a.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):a.lastMessagePreview,failureText:a=>a.failure?.displayCode!==void 0?f(a.failure.displayCode,{locale:t.locale(),mediaKind:a.failure.mediaKind,params:a.failure.params}):a.failure?.message??""}}var Nt=Symbol("ImThreadReadActions");function kt(t){provide(Nt,t);}function en(){return inject(Nt,void 0)}var at=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:a,slots:b}){return kt(t.readActions),()=>{let c=h(t.message),g=t.rendererRegistry.resolve(c);return g!==void 0?h$1(g,{...a,message:t.message,presentation:t.presentation}):b["unsupported-body"]!==void 0?b["unsupported-body"]({kind:c,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":c,"aria-hidden":"true"})}}});var st=Symbol("ImThreadViewportRegistration");function Lt(){return inject(st,void 0)}var lt=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:a}){let b=Lt();function c(r,u){let v=Array.isArray(u)?u:[u];return v.length===1&&isVNode(v[0])?cloneVNode(v[0],{key:r}):h$1(Fragment,{key:r},v)}function g(r){return u=>{b?.registerMessageNode(r,u instanceof HTMLElement?u:null);}}function $(r,u){return v=>{b?.registerDateNode(r,u,v instanceof HTMLElement?v:null);}}function j(r){return a.encryption?.({item:r})??h$1("div",{"data-im-thread-encryption":r.key})}function A(r){let u=$(r.key,r.label);return a["date-separator"]?.({item:r,setElement:u})??h$1("div",{ref:u,"data-im-thread-date-separator":r.key},r.label)}function K(r){b?.registerEntryUnreadNode(r instanceof HTMLElement?r:null);}function P(r){return a["entry-unread"]?.({item:r,setElement:K})??h$1("div",{ref:K,"data-im-thread-entry-unread":r.key,...r.count===void 0?{}:{"data-count":String(r.count)}})}function q(r){let u=g(r.message.id);return a.item!==void 0?a.item({item:r,setElement:u}):a.message!==void 0?a.message({item:r,setElement:u}):r.message.deletedForEveryone!==void 0?a["deleted-message"]?.({item:r,setElement:u})??h$1("article",{ref:u,"data-im-thread-message-id":r.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):r.message.recalled!==void 0?a["recalled-message"]?.({item:r,setElement:u})??h$1("article",{ref:u,"data-im-thread-message-id":r.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):r.kind==="system"&&a.system!==void 0?a.system({item:r,setElement:u}):h$1("article",{ref:u,"data-im-thread-message-id":r.message.id,"data-first-of-run":r.kind==="message"?String(r.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(at,{message:r.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":a["unsupported-body"]===void 0?void 0:v=>a["unsupported-body"]?.(v)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(r=>{switch(r.kind){case "encryption":return a.item!==void 0?c(r.key,a.item({item:r})):c(r.key,j(r));case "date-separator":return a.item!==void 0?c(r.key,a.item({item:r,setElement:$(r.key,r.label)})):c(r.key,A(r));case "entry-unread":return a.item!==void 0?c(r.key,a.item({item:r,setElement:K})):c(r.key,P(r));case "system":case "message":return c(r.key,q(r))}return r}))}});var Bt=120,mn=500,Be=.5,gn=8;function dt(t){let a=t.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(a!==void 0&&Number.isFinite(a)&&a>0?a:1)}var ut=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:a,expose:b,slots:c}){let g$1=ref(null),$=ref(null),j$1=new Map,A,K=new Map,P=new Set,q$1=new Map,r=0,u=[],v,N,T,E,U=false,X,x=new Set,M=false,k,O="",J=1,L=false,Q=false,W=true,G=false,H=false,ne=false,Z=0,ce=-1,oe=-1,i,ee,ae,F,D,m$1=ref(true),w=ref(0),f=C(e=>{w.value=e,a("new-message-count",e);});function B$1(e){let o=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=o}function I(e=t.messageIds){return e.flatMap(o=>{let s=j$1.get(o);if(s===void 0)return [];let y=s.getBoundingClientRect(),R=s.querySelector("[data-im-thread-anchor-point]");return [{id:o,top:y.top,bottom:y.bottom,anchorTop:R?.getBoundingClientRect().top??y.top}]})}function re(e="",o=1){let s=Math.min(1,Math.max(0,o));O!==""&&O!==e&&q$1.get(O)?.element.style.removeProperty("opacity"),O=e,J=s,e!==""&&q$1.get(e)?.element.style.setProperty("opacity",String(s));}function V(){re();}function z$1(){let e=g$1.value;if(M||e===null||!t.activeDateEnabled)return;let o=[...q$1.entries()].filter(([,_])=>e.contains(_.element)).map(([_,C])=>{let fe=C.element.getBoundingClientRect();return {key:_,label:C.label,top:fe.top,height:fe.height}}).sort((_,C)=>_.top-C.top),s=e.getBoundingClientRect(),y=o.find(_=>_.height>0)?.height??28,R=g({markers:o,viewportTop:s.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:y});if(R===null){V(),a("active-date-change",null);return}re(R.inlineDateKey,R.inlineOpacity),a("active-date-change",R);}function ye(e){N={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight};}function Pe(e){let o=N;if(o===void 0)return false;let s=Math.max(0,e.scrollHeight-e.clientHeight);return s<o.scrollHeight-o.height&&o.scrollTop>s&&Math.abs(e.scrollTop-s)<=dt(e)}function Ue(e){return Pe(e)||k!==void 0&&(k.behavior==="smooth"||Math.abs(e.scrollTop-k.targetTop)<=dt(e))?0:e.scrollTop-r}function _e(e,o){o!==0&&(r=e.scrollTop-o,k=void 0,te());}function qe(e,o){let s=Ue(e);if(F!==void 0)return F.expectedOffset-=s,Ie(),_e(e,s),G||je(),false;let y=N;if(y===void 0)return false;let R=v,_=R===void 0?void 0:I([R.id])[0],C=e.scrollTop-y.scrollTop,fe=Pe(e)?0:C,Se=R===void 0||_===void 0?0:(_.anchorTop??_.top)-o.top-R.offset+C;return y.scrollHeight!==e.scrollHeight||y.width!==e.clientWidth||y.height!==e.clientHeight||Math.abs(Se)>Be?(N=void 0,!L&&!t.loadingNewer&&!t.hasNewer&&t.resizeFollowEnabled&&m$1.value&&Math.abs(fe)<=Be?(le(),true):(R!==void 0&&xe({...R,offset:R.offset-fe}),_e(e,s),false)):false}function ke(){let e=g$1.value;if(M||e===null)return;let o$1=e.getBoundingClientRect();if(qe(e,o$1))return;let s=E!==void 0&&U?t.messageIds.filter(C=>P.has(C)):t.messageIds,y=I(s);if(E!==void 0&&U&&y.length===0){m$1.value=B$1(e);return}let R=y.filter(C=>B({viewportTop:o$1.top,viewportBottom:o$1.bottom,messageTop:C.top,messageBottom:C.bottom,margin:t.visibleMargin})).map(C=>C.id),_=R.length!==u.length||R.some((C,fe)=>u[fe]!==C);u=Object.freeze(R),v=o(y,{top:o$1.top,bottom:o$1.bottom}),ye(e),f.acknowledgeVisible(R),m$1.value=B$1(e),_&&a("visible-range",u),a("settled",{visibleMessageIds:u,...u.length===0?{}:{newestVisibleMessageId:u[u.length-1]},isAtBottom:m$1.value,newMessageCount:w.value});}function Ae(e){if(x.add(e),X!==void 0)return;let o=()=>{X=void 0;let s=[...x];x.clear(),s.forEach(y=>y());};typeof globalThis.requestAnimationFrame=="function"?X=globalThis.requestAnimationFrame(o):X=globalThis.setTimeout(o,0);}function Ge(){X!==void 0&&(typeof X=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(X):globalThis.clearTimeout(X),X=void 0,x.clear());}function Te(){Ae(ke);}function He(){let e=g$1.value;if(e===null)return;let o$1=e.getBoundingClientRect(),s=o(I(),{top:o$1.top,bottom:o$1.bottom});s!==void 0&&(v=s,ye(e));}function Le(){return W&&F===void 0&&!Q&&!t.loadingOlder}function We(){He(),W=false,ce=Z,Q=true,a("reach-start"),Ae(()=>{t.loadingOlder||(Q=false);});}function ze(e){return t.hasNewer&&!L&&!t.loadingOlder&&!t.loadingNewer&&B$1(e)}function Ye(){L=true,m$1.value=false,oe=Z,a("reach-end"),Ae(()=>{t.loadingNewer||(L=false);});}function Ve(){let e=g$1.value;e===null||Z===oe||!ze(e)||Ye();}function te(){let e=g$1.value;if(M||e===null)return;let o=e.scrollTop,s=Pe(e),y=k,R=false;if(y!==void 0){let C=Math.abs(o-y.targetTop)<=dt(e);R=y.behavior==="smooth"||C,(y.behavior!=="smooth"||C)&&(k=void 0);}!R&&!s&&!G&&F===void 0&&o!==r&&(G=true,H=true,Z+=1);let _=G&&!R&&!s&&o!==r;if(_&&(a("user-scroll"),Ae(z$1)),G&&!ne&&ve(),!W&&H&&Z!==ce&&o<r&&o>Ke()&&(W=true),F!==void 0&&!R)if(G){let C=Ce();C!==void 0&&(F.expectedOffset=C);}else Ie(),je();Le()&&_&&o>=0&&m({previousScrollTop:r,currentScrollTop:o,topThreshold:t.olderPrefetchThreshold})&&We(),_&&ze(e)&&z({previousScrollTop:r,currentScrollTop:o,isAtBottom:B$1(e),isHistoryWindow:t.hasNewer,isPageSettling:R})&&Ye(),r=o,Te();}function De(e,o="auto"){k={targetTop:e,behavior:o};}function $e(e){let o=F,s=$.value;if(!(o===void 0||s===null)){if(o.visualOffset=Math.abs(e)<=Be?0:e,o.visualOffset===0){s.style.removeProperty("transform"),s.style.removeProperty("will-change");return}s.style.setProperty("transform",`translate3d(0, ${o.visualOffset}px, 0)`),s.style.setProperty("will-change","transform");}}function be(){D!==void 0&&(clearTimeout(D),D=void 0),F!==void 0&&F.visualOffset!==0&&(v=void 0,N=void 0);let e=$.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),F=void 0,k=void 0;}function Ce(){let e=g$1.value,o=F;if(e===null||o===void 0)return;let s=I().find(y=>y.id===o.anchor.id);if(s!==void 0)return (s.anchorTop??s.top)-e.getBoundingClientRect().top}function Ie(){let e=F,o=Ce();if(e===void 0||o===void 0)return;let s=e.expectedOffset-o;Math.abs(s)<=Be||($e(e.visualOffset+s),e.committed=false,e.attempts=0);}function Xe(){D!==void 0&&clearTimeout(D),D=setTimeout(()=>{D=void 0,!(G||F?.committed!==true)&&be();},mn);}function ue(){let e=g$1.value,o=F;if(M||e===null||o===void 0||G)return;let s=o.visualOffset;if(Math.abs(s)<=Be){o.committed=true,Xe();return}let y=Math.max(0,e.scrollHeight-e.clientHeight),R=Math.min(y,Math.max(0,e.scrollTop-s));if(De(R),e.scrollTop=R,Math.abs(e.scrollTop-R)>Be){k=void 0,o.committed=false,o.attempts+=1,o.attempts<gn?je():(be(),k=void 0,r=e.scrollTop);return}$e(0),r=e.scrollTop,o.expectedOffset=Ce()??o.expectedOffset,o.committed=true,o.attempts=0,Xe();}function je(){D!==void 0&&clearTimeout(D),D=setTimeout(()=>{D=void 0,ue();},Bt);}function we(e){e!==void 0&&(F===void 0&&(F={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),Ie(),!G&&ue());}function xe(e){let o=g$1.value;if(o===null||e===void 0)return;let s=o.getBoundingClientRect(),y=q(e,I(),{top:s.top,bottom:s.bottom});if(y!==void 0){let R=Math.max(0,o.scrollHeight-o.clientHeight),_=Math.min(R,Math.max(0,o.scrollTop+y));De(_),o.scrollTop=_,r=o.scrollTop,N=void 0;}}function Ke(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function Me(){k?.behavior==="smooth"&&(k=void 0),H=false,G||(G=true,Z+=1),i!==void 0&&(clearTimeout(i),i=void 0);}function se(){let e=g$1.value;e===null||Z===ce||(F!==void 0&&be(),W=true,e.scrollTop<=Ke()&&Le()&&We());}function Re(){v=void 0,N=void 0,i!==void 0&&(clearTimeout(i),i=void 0),be(),G=false,H=false,ne=false,ee=void 0,ae=void 0,Z+=1,ce=-1,oe=-1,W=true,Q=false,L=false,k=void 0;}function Je(){ne||(i!==void 0&&(clearTimeout(i),i=void 0),G=false,H=false,F!==void 0&&(F.attempts=0),ue());}function ve(){ne||(i!==void 0&&clearTimeout(i),i=setTimeout(()=>{i=void 0,Je();},Bt));}function n(){k=void 0,Je();}function d(e){ne=true,Me(),ee=e.touches?.[0]?.clientY;}function l(e){let o=e.touches?.[0]?.clientY;o!==void 0&&(ee!==void 0&&o>ee?se():ee!==void 0&&o<ee&&Ve(),ee=o);}function p$1(){ne=false,ee=void 0,ve();}function h(e){Me(),e.deltaY<0?se():e.deltaY>0&&Ve(),ve();}function S(e){e.pointerType!=="touch"&&(Me(),ae=e.clientY,ve());}function Y(e){e.pointerType==="touch"||!G||ae===void 0||(e.clientY<ae?se():e.clientY>ae&&Ve(),ae=e.clientY,ve());}function ie(e){e.pointerType!=="touch"&&(ae=void 0,ve());}function pe(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(Me(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?se():Ve(),ve());}function le(e="auto"){let o=g$1.value;if(o===null)return;N=void 0,be();let s=Math.max(0,o.scrollHeight-o.clientHeight);De(s,e),o.scrollTo?.({top:s,behavior:e}),o.scrollTop!==s&&(o.scrollTop=s),r=o.scrollTop,f.clear(),U=false,ke();}function Ne(){let e=g$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function nt(){let e=g$1.value;return Ne()&&e!==null&&e.scrollHeight>e.clientHeight+1}function jt(e,o={}){return pt(j$1.get(e),o)}function pt(e,o){let s=g$1.value;if(s===null||e===void 0||!s.contains(e)||s.clientHeight<=0)return false;be();let y=s.getBoundingClientRect(),R=e.getBoundingClientRect(),_=o.block??"center",C;_==="start"?C=s.scrollTop+R.top-y.top:_==="end"?C=s.scrollTop+R.bottom-y.bottom:_==="nearest"?R.top>=y.top&&R.bottom<=y.bottom?C=s.scrollTop:R.top<y.top?C=s.scrollTop+R.top-y.top:C=s.scrollTop+R.bottom-y.bottom:C=j({currentScrollTop:s.scrollTop,scrollHeight:s.scrollHeight,targetHeight:R.height,targetTop:R.top,viewportHeight:s.clientHeight,viewportTop:y.top});let fe=Math.max(0,s.scrollHeight-s.clientHeight),Se=Math.min(fe,Math.max(0,C));N=void 0;let Fe=o.behavior??"auto";return De(Se,Fe),s.scrollTo?.({top:Se,behavior:Fe}),s.scrollTop!==Se&&(s.scrollTop=Se),r=s.scrollTop,U=false,ke(),true}function Kt(){let e=g$1.value;if(e===null||A===void 0||!e.contains(A)||e.clientHeight<=0)return null;let o=A.getBoundingClientRect(),s=e.scrollTop+o.top-e.getBoundingClientRect().top+o.height/2,y=e.clientHeight/2;return {older:s<y-1,newer:e.scrollHeight-s<y-1}}function qt(){f.clear();}function Gt(){L=true,m$1.value=false;}function Wt(){L=false,Te();}function zt(e,o){let s=j$1.get(e);if(s!==void 0&&s!==o&&(E?.unobserve(s),T?.unobserve?.(s),K.delete(s),P.delete(e)),o===null){j$1.delete(e),P.delete(e);return}j$1.set(e,o),K.set(o,e),E?.observe(o),T?.observe(o),Te();}function Yt(e,o,s){let y=q$1.get(e);if(s===null){q$1.delete(e);return}q$1.set(e,{element:s,label:o}),O===e&&s.style.setProperty("opacity",String(J)),y?.element!==s&&(s.dataset.imThreadDateSeparator=e);}return provide(st,{registerMessageNode:zt,registerDateNode:Yt,registerEntryUnreadNode:e=>{A=e??void 0;}}),watch(()=>t.contentKey,(e,o)=>{if(e===o)return;Re();let s=g$1.value;s!==null&&(r=s.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,o)=>{let s=g$1.value;if(s===null)return;let y=new Set(o);o.length>0&&e.length>0&&!e.some(Oe=>y.has(Oe))&&Re();let _=s.getBoundingClientRect(),C=p(v,I(),{top:_.top,bottom:_.bottom}),fe=m$1.value,Se=o[o.length-1],Fe=Se===void 0?-1:e.indexOf(Se),rt=Fe<0?[]:e.slice(Fe+1).filter(Oe=>!y.has(Oe)),ht=L||t.loadingNewer,$t=e.length===o.length&&e.every(Oe=>y.has(Oe))&&e.some((Oe,ot)=>Oe!==o[ot]);if(await nextTick(),M)return;if($t&&fe&&t.followNewMessages&&t.resizeFollowEnabled&&!t.hasNewer&&!ht){le();return}let yt=o[0];if(yt!==void 0&&e.indexOf(yt)>0&&(Q=false,we(C)),rt.length>0){if(ht){L=false,F===void 0&&xe(C),m$1.value=false,Te();return}(fe||rt.some(ot=>t.shouldFollowAppendedMessage?.(ot)===true))&&t.followNewMessages?le():f.add(rt);}Te();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,o)=>{e||!o||!L||Ae(()=>{t.loadingNewer||(L=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,o)=>{e||!o||!Q||Ae(()=>{t.loadingOlder||(Q=false);});},{flush:"pre"}),onMounted(()=>{let e=g$1.value;if(e!==null){if(r=e.scrollTop,e.addEventListener("scroll",te,{passive:true}),e.addEventListener("scrollend",n,{passive:true}),e.addEventListener("touchstart",d,{passive:true}),e.addEventListener("touchmove",l,{passive:true}),e.addEventListener("touchend",p$1,{passive:true}),e.addEventListener("touchcancel",p$1,{passive:true}),e.addEventListener("wheel",h,{passive:true}),e.addEventListener("pointerdown",S,{passive:true}),e.addEventListener("pointermove",Y,{passive:true}),e.addEventListener("pointerup",ie,{passive:true}),e.addEventListener("pointercancel",ie,{passive:true}),e.addEventListener("keydown",pe),typeof globalThis.ResizeObserver=="function"){T=new globalThis.ResizeObserver(()=>{M||g$1.value===null||ke();}),T.observe(e),$.value!==null&&T.observe($.value);for(let o of j$1.values())T.observe(o);}if(typeof globalThis.IntersectionObserver=="function"){E=new globalThis.IntersectionObserver(o=>{for(let s of o){let y=K.get(s.target);y!==void 0&&(s.isIntersecting?P.add(y):P.delete(y));}U=true,Te();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let o of j$1.values())E.observe(o);}Te();}}),onBeforeUnmount(()=>{M=true;let e=g$1.value;e!==null&&e.removeEventListener("scroll",te),e!==null&&(e.removeEventListener("scrollend",n),e.removeEventListener("touchstart",d),e.removeEventListener("touchmove",l),e.removeEventListener("touchend",p$1),e.removeEventListener("touchcancel",p$1),e.removeEventListener("wheel",h),e.removeEventListener("pointerdown",S),e.removeEventListener("pointermove",Y),e.removeEventListener("pointerup",ie),e.removeEventListener("pointercancel",ie),e.removeEventListener("keydown",pe)),i!==void 0&&clearTimeout(i),be(),Ge(),T?.disconnect(),E?.disconnect(),V(),A=void 0,j$1.clear(),K.clear(),P.clear(),q$1.clear(),f.clear();}),b({getViewportElement:()=>g$1.value,clearNewMessageBadge:qt,clearActiveDate:V,isAtBottom:computed(()=>m$1.value),isMeasurable:Ne,isScrollable:nt,newMessageCount:computed(()=>w.value),prepareHistoryPageAppend:Gt,cancelHistoryPageAppend:Wt,trackRemoteMessageIds:(e,o)=>f.trackRemote(e,o),scrollToLatest:le,scrollToMessage:jt,scrollToEntryUnread:()=>pt(A,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:Kt,focusViewport:()=>g$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:g$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:$,"data-im-thread-viewport-content":""},c.default?.())])}});var Ut=Symbol("ImThreadSurfaceContext");function hn(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 yn(t){provide(Ut,t);}function ct(){let t=inject(Ut);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var ft=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),mt=Object.freeze({enabled:true,maxFillPages:8}),In=8,wn=160;function Mn(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var Rn=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:a,slots:b}){let c=t.context??ct(),g=ref(null),$=ref(0),j=ref(false),A=ref(false),K=ref(false),P,q,r=ref(false),u=ref(false),v=ref(false),N=false,T,E=ref(true),U=[],X,x=0,M=0,k,O=null,J="",L="",Q="",W=false,G=false,H=ref(false),ne=ref(""),Z=ref(false),ce,oe,i$1=computed(()=>c.getState()),ee=computed(()=>!!i$1.value.pendingLocationMessageId),ae=computed(()=>i$1.value.pageVisible??c.isPageVisible?.()??true),F=computed(()=>i$1.value.pageEngaged??c.isPageEngaged?.()??true),D=computed(()=>Mn(i$1.value.activeConversation,t.conversation)),m=computed(()=>({...ft,...t.viewportOptions})),w=computed(()=>{let n=t.initialViewportOptions.maxFillPages??mt.maxFillPages;return {enabled:t.initialViewportOptions.enabled??mt.enabled,maxFillPages:Number.isFinite(n)?Math.max(0,Math.floor(n)):mt.maxFillPages}}),f=computed(()=>!D.value||!i$1.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),B=computed(()=>D.value?i({messages:i$1.value.messages,entryUnread:i$1.value.entryUnread,formatDate:c.formatDate,leadingItems:c.leadingItems?.(),beforeMessageItems:c.beforeMessageItems}):[]),I=computed(()=>B.value.flatMap(n=>n.kind==="message"||n.kind==="system"?[n.message.id]:[]));function re(){ce!==void 0&&(clearTimeout(ce),ce=void 0),oe!==void 0&&(clearTimeout(oe),oe=void 0);}function V(n=false){if(re(),Z.value=false,n){g.value?.clearActiveDate(),ne.value="";return}oe=setTimeout(()=>{oe=void 0,!Z.value&&(g.value?.clearActiveDate(),ne.value="");},wn);}function z(n){if(n===null){V();return}re(),ne.value=n.label,Z.value=true;let d=m.value.activeDateIdleDelay,l=Number.isFinite(d)?Math.max(0,d):ft.activeDateIdleDelay;ce=setTimeout(()=>{ce=void 0,V();},l);}async function ye(n,d,l){t.hooks?.beforeAction?.(n);try{let p=await d();return l?.()!==!1&&t.hooks?.afterAction?.(n,p),p}catch(p){throw l?.()!==false&&t.hooks?.onError?.(n,p),p}}function Pe(n="automatic",d){return !D.value||i$1.value.loading||!i$1.value.hasOlder?Promise.resolve(0):ye({kind:"load-older",source:n},()=>c.actions.loadOlder(),d)}function Ue(){return _e()}function _e(n){let d=c.actions.loadNewer,l=i$1.value.loadingNewer??i$1.value.loading;return !D.value||l||!i$1.value.hasNewer||d===void 0?Promise.resolve(0):ye({kind:"load-newer"},()=>d(),n)}async function qe(n){for(let d=0;d<In;d+=1){if(!D.value||K.value||A.value||ee.value)return;let l=n==="older"?i$1.value.hasOlder:i$1.value.hasNewer,p=n==="older"?i$1.value.olderError:i$1.value.newerError;if(!l||p!==null||(n==="older"?await Pe("user-scroll"):await Ue())>0)return;let S=n==="older"?i$1.value.hasOlder:i$1.value.hasNewer,Y=n==="older"?i$1.value.olderError:i$1.value.newerError;if(!S||Y!==null)return}}async function ke(){return !D.value||c.actions.loadNewer===void 0?0:Ge({kind:"load-newer"},()=>c.actions.retryNewer?.()??c.actions.loadNewer?.({force:true})??Promise.resolve(0))}async function Ae(){return D.value?Ge({kind:"retry-older"},()=>c.actions.retryOlder?.()??c.actions.loadOlder({force:true})):0}async function Ge(n,d){let l=f.value,p=++x;O=null,Q="";let h;try{h=await ye(n,d);}catch(S){throw ue(l,p)&&(Q=l),S}return ue(l,p)&&!H.value&&(O=null,Me()),h}async function Te(){if(!D.value)return false;let n=f.value;Re();let d=++M;return K.value=false,se(true),W=true,J=n,L=xe(we()),!await ye({kind:"jump-to-latest"},()=>c.actions.jumpToLatest?.()??Promise.resolve(!i$1.value.isHistoryWindow),()=>te(n,d))||!te(n,d)||(await nextTick(),!te(n,d))?false:(g.value?.scrollToLatest(),j.value=true,v.value=false,Le(),true)}function He(n=false){let d=g.value,l=d?.getViewportElement();u.value=d?.isScrollable()===true;let p=i$1.value.entryUnreadNavigation;r.value=p?.state==="located"&&U.includes(p.firstMessageId),H.value&&r.value&&(j.value=true);let h=l==null?0:Math.max(0,l.scrollHeight-l.clientHeight-l.scrollTop);v.value=p!==void 0&&h>50,n&&p!==void 0&&l!==null&&l!==void 0&&l.clientHeight>0&&h>=l.clientHeight&&(j.value=true);}function Le(){let n=c.actions.markConversationRead;if(n===void 0||!F.value||!D.value||!H.value||A.value||N&&(!E.value||i$1.value.hasNewer)||T!==void 0||i$1.value.error!==null)return;let d=f.value,l=n().then(()=>{T===l&&d===f.value&&(N=true);}).catch(p=>{!G&&T===l&&d===f.value&&t.hooks?.onError?.({kind:"mark-conversation-read"},p);}).finally(()=>{T===l&&(T=void 0);});T=l;}async function We(){let n=c.actions.loadEntryUnread;if(!D.value||A.value||n===void 0)return "cancelled";let d=f.value,l=++M;K.value=false;let p=new AbortController;q=p,P=l,A.value=true,se(true),W=true;try{let h=await ye({kind:"jump-to-entry-unread"},()=>n({signal:p.signal}),()=>te(d,l));if(!te(d,l))return "cancelled";if(!h||i$1.value.entryUnread.state!=="located")return "unavailable";let Y=await ze(d,l);return Y&&(j.value=!0),Y?"located":te(d,l)?"unavailable":"cancelled"}catch(h){if(!te(d,l))return "cancelled";throw h}finally{P===l&&(P=void 0,q=void 0,A.value=false);}}async function ze(n,d){await nextTick();for(let l=0;l<60;l+=1){if(!te(n,d))return false;if(g.value?.scrollToEntryUnread())return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(p=>window.requestAnimationFrame(()=>p()));}return false}function Ye(n){E.value=n.isAtBottom,$.value=n.newMessageCount,He(),Me();}function Ve(n,d){return g.value?.scrollToMessage(n,d)??false}function te(n,d){return !G&&M===d&&f.value===n&&D.value}async function De(n,d,l,p){for(let h=0;h<60;h+=1){if(!te(n,d))return false;if(Ve(l,p))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(S=>window.requestAnimationFrame(()=>S()));}return false}async function $e(n,d){let l=g.value;if(l===null||!l.isMeasurable()||l.isScrollable())return true;let p=0,h=!i$1.value.hasOlder,S=!i$1.value.hasNewer||c.actions.loadNewer===void 0,Y=()=>te(n,d),ie=async le=>{if(!te(n,d)||p>=w.value.maxFillPages)return false;let Ne=0;if(le==="older"){if(h||!i$1.value.hasOlder)return false;Ne=await Pe("automatic",Y),h=!i$1.value.hasOlder;}else {if(S||!i$1.value.hasNewer)return false;l.prepareHistoryPageAppend();try{Ne=await _e(Y);}catch(nt){throw Y()&&l.cancelHistoryPageAppend(),nt}Y()&&Ne<=0&&!i$1.value.hasNewer&&l.cancelHistoryPageAppend(),S=!i$1.value.hasNewer;}return p+=1,await nextTick(),await nextTick(),te(n,d)&&(Ne>0||!(le==="older"?h:S))};!h&&!await ie("older")&&(h=true),!S&&!await ie("newer")&&(S=true);let pe="older";for(;te(n,d)&&p<w.value.maxFillPages&&l.isMeasurable()&&!l.isScrollable()&&(!h||!S);){let le=pe==="older"?h?"newer":"older":S?"older":"newer";pe=le==="older"?"newer":"older",await ie(le)||(le==="older"?h=true:S=true);}return te(n,d)}async function be(n,d={behavior:"auto",block:"center"}){if(!D.value||n==="")return false;let l=f.value;Re();let p=K.value||k!==void 0||(i$1.value.loadingOlder??i$1.value.loading)||(i$1.value.loadingNewer??i$1.value.loading),h=++M;K.value=true,se(true),W=true,J=l,L=xe(we());let S=()=>te(l,h);try{if(p||!I.value.includes(n)){let Y=c.actions.loadAround;if(Y===void 0)return !1;let ie={};k=ie;try{if(!await ye({kind:"locate-message",messageId:n},()=>Y(n),S)||!S())return !1}finally{k===ie&&(k=void 0);}}return await nextTick(),await nextTick(),!S()||!await $e(l,h)?!1:await De(l,h,n,d)}finally{M===h&&(K.value=false);}}function Ce(){X!==void 0&&(clearTimeout(X),X=void 0);}function Ie(){if(Ce(),!H.value)return;let n=t.readActions;if(n===void 0&&c.actions.markVisibleMessages===void 0)return;let d=Number.isFinite(m.value.visibleReadDelay)?Math.max(0,m.value.visibleReadDelay):ft.visibleReadDelay;X=setTimeout(()=>{if(X=void 0,!D.value||!F.value)return;Le();let l=c.actions.markVisibleMessages;if(l!==void 0){let S=U;l(S).catch(Y=>{t.hooks?.onError?.({kind:"visible-range",messageIds:S},Y);});return}if(n===void 0)return;let p=U[U.length-1];if(p===void 0)return;let h=n.resolveTarget===void 0?p:n.resolveTarget(p);h!=null&&Promise.resolve(n.markRead(h)).catch(S=>{t.hooks?.onError?.({kind:"visible-range",messageIds:U},S);});},d);}function Xe(n){U=Object.freeze([...n]),He();let d={kind:"visible-range",messageIds:U};t.hooks?.beforeAction?.(d);try{c.actions.onVisibleRange?.(U),t.hooks?.afterAction?.(d,void 0);}catch(l){throw t.hooks?.onError?.(d,l),l}H.value?Ie():Me();}function ue(n,d){return !G&&x===d&&f.value===n&&!W&&!ee.value}function je(n,d){ue(n,d)&&(J=n,L=xe(we()),H.value=true,He(),Le(),Ie());}function we(){return i$1.value.entryUnreadNavigation===void 0?i$1.value.entryUnread:{state:"none"}}function xe(n){return n.state!=="located"?n.state:`${n.state}:${n.firstMessageId}`}async function Ke(n,d,l){for(let p=0;p<60;p+=1){if(!ue(n,d))return false;if(g.value?.scrollToMessage(l,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(S=>window.requestAnimationFrame(()=>S()));}return false}function Me(){let n=f.value,d=xe(we());if(n===""||i$1.value.loading||K.value||ee.value||i$1.value.error!==null&&i$1.value.messages.length===0||J===n&&(L===d||L.startsWith("located:")||W)||Q===n||O!==null)return;if(!w.value.enabled){J=n,L=d,H.value=true,Ie();return}let l=++x;W=false,H.value=false;let p=(async()=>{if(await nextTick(),!ue(n,l))return;let h=g.value;if(h===null||!h.isMeasurable())return;let S=we();if(S.state==="located"&&!I.value.includes(S.firstMessageId))return;let Y=S.state==="located"?await Ke(n,l,S.firstMessageId):false;if(S.state==="located"&&!Y)return;Y||h.scrollToLatest();let ie=0;for(;ue(n,l)&&ie<w.value.maxFillPages&&i$1.value.error===null&&(i$1.value.hasOlder||i$1.value.hasNewer&&c.actions.loadNewer!==void 0)&&h.isMeasurable()&&!h.isScrollable();){if(i$1.value.hasNewer&&c.actions.loadNewer!==void 0&&(i$1.value.messages.length===0||!i$1.value.hasOlder)){let le=M;h.prepareHistoryPageAppend();try{await Ue(),await nextTick();}finally{f.value===n&&M===le&&(x===l||W)&&h.cancelHistoryPageAppend();}}else await Pe();if(!ue(n,l)||(ie+=1,await nextTick(),await nextTick(),!h.isMeasurable()))return}if(!ue(n,l)||!h.isMeasurable())return;let pe=we();if(pe.state==="located"){if(!I.value.includes(pe.firstMessageId)||!await Ke(n,l,pe.firstMessageId))return}else h.scrollToLatest();await nextTick(),je(n,l);})().catch(()=>{ue(n,l)&&(Q=n);}).finally(()=>{O===p&&(O=null);});O=p;}function se(n,d=false){x+=1,O=null,W=false,H.value=n,n||(J="",L="",d||(Q="")),Ce();}function Re(){q!==void 0&&(M+=1,q.abort(),q=void 0,P=void 0,A.value=false);}function Je(){if(He(true),Re(),W=true,H.value)return;let n=f.value;x+=1,O=null,J=n,H.value=true,Ie();}let ve=Object.freeze({getViewportElement:()=>g.value?.getViewportElement()??null,loadOlder:Pe,retryOlder:Ae,loadNewer:Ue,retryNewer:ke,jumpToLatest:Te,jumpToEntryUnread:We,scrollToMessage:Ve,locateMessage:be,focusViewport:()=>g.value?.focusViewport()});return a(ve),watch(F,n=>{n&&H.value?Ie():Ce();}),watch([()=>i$1.value.activeRemoteMessageRevision??0,g,f],()=>{let n=g.value;if(n===null||!D.value)return;let d=c.actions.drainActiveRemoteMessageIds?.()??[];n.trackRemoteMessageIds(d,{isAtBottom:E.value,isHistoryWindow:i$1.value.isHistoryWindow,isPageVisible:ae.value})&&(E.value=false);},{flush:"post"}),watch(()=>i$1.value.pendingLocationMessageId??"",n=>{(n!==""||K.value)&&(M+=1,K.value=false),n!==""&&(Re(),H.value||se(false));},{flush:"sync"}),watch([f,()=>i$1.value.loading,()=>i$1.value.error,()=>I.value.length,()=>i$1.value.hasOlder,()=>xe(we()),w,()=>i$1.value.hasNewer,ee],([n,d,l,p,,h],[S,,,Y,,ie])=>{if(n!==S&&(Re(),M+=1,K.value=false,k=void 0,se(false),V(true),g.value?.clearNewMessageBadge(),$.value=0,E.value=true,U=[],j.value=false,r.value=false,u.value=false,v.value=false,A.value=false,P=void 0,N=false,T=void 0),n!==""&&n===S&&Y!==void 0&&Y>0&&p===0&&(i$1.value.hasOlder||i$1.value.hasNewer)&&H.value&&se(false,true),n!==""&&n===S&&h!==ie&&!L.startsWith("located:")&&!W&&h.startsWith("located:")&&(J="",L="",H.value=false),n===""){se(false);return}if(l!==null&&i$1.value.messages.length===0){H.value||se(false,true);return}d||Me();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{G=true,Re(),M+=1,se(false),V(true);}),()=>{let n={conversation:t.conversation,state:i$1.value,items:B.value,actions:ve,initialViewportSettled:f.value!==""&&(i$1.value.messages.length===0?!i$1.value.loading&&i$1.value.error===null&&!i$1.value.hasOlder&&!i$1.value.hasNewer:H.value&&J===f.value)},d=[b.header?.(n),b["before-list"]?.(n)];if(!D.value)d.push(b.unsupported?.(n)??h$1("div",{"data-im-thread-unsupported":""}));else if(!i$1.value.ready&&i$1.value.loading)d.push(b.loading?.(n)??h$1("div",{"data-im-thread-loading":""}));else if(i$1.value.error!==null&&i$1.value.messages.length===0)d.push(b.error?.(n)??h$1("div",{"data-im-thread-error":""}));else if(i$1.value.ready&&i$1.value.messages.length===0&&!i$1.value.hasOlder&&!i$1.value.hasNewer)d.push(b.empty?.(n)??h$1("div",{"data-im-thread-empty":""}));else {let l=h$1(ut,{ref:g,messageIds:I.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:i$1.value.loadingOlder??i$1.value.loading,hasNewer:i$1.value.hasNewer,loadingNewer:i$1.value.loadingNewer??i$1.value.loading,followThreshold:m.value.followThreshold,olderPrefetchThreshold:m.value.olderPrefetchThreshold,visibleMargin:m.value.visibleMargin,activeDateOffset:m.value.activeDateOffset,activeDateEnabled:b["active-date"]!==void 0,resizeFollowEnabled:H.value&&!A.value&&!K.value&&!ee.value,followNewMessages:ae.value&&!A.value&&!K.value&&!ee.value,shouldFollowAppendedMessage:p=>{let h=i$1.value.messages.find(S=>S.id===p);return h===void 0?false:c.shouldFollowMessage?.(h)===true},onReachStart:()=>{qe("older").catch(()=>{});},onReachEnd:()=>{qe("newer").catch(()=>{});},onSettled:Ye,onUserScroll:Je,onActiveDateChange:z,onVisibleRange:Xe,onNewMessageCount:p=>{$.value=p;}},{default:()=>[b["viewport-before"]?.(n),h$1(lt,{items:B.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:b.item,"date-separator":b["date-separator"],"entry-unread":b["entry-unread"],encryption:b.encryption,system:b.system,message:b.message,"recalled-message":b["recalled-message"],"deleted-message":b["deleted-message"],"unsupported-body":b["unsupported-body"]}),b["viewport-after"]?.(n)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[b["active-date"]?.({label:ne.value,visible:Z.value&&ne.value!==""}),l,b["entry-unread-navigation"]?.({...n,count:i$1.value.entryUnreadNavigation?.state==="none"?0:i$1.value.entryUnreadNavigation?.count??0,loading:A.value,visible:n.initialViewportSettled&&!j.value&&!r.value&&!i$1.value.isHistoryWindow&&i$1.value.entryUnreadNavigation!==void 0&&i$1.value.entryUnreadNavigation.state!=="none"&&i$1.value.entryUnreadNavigation.count>0&&(u.value||i$1.value.hasOlder)})])),i$1.value.error!==null&&d.push(b.error?.(n)??h$1("div",{"data-im-thread-error":""}));}return d.push(b["after-list"]?.(n),b["jump-to-latest"]?.({...n,count:$.value,visible:v.value||!E.value||i$1.value.isHistoryWindow}),b["context-menu"]?.(n),b.composer?.(n)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function Sn(t){let a=new Map;for(let c of t){if(a.has(c.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${c.kind}`);a.set(c.kind,c.component);}let b=Object.freeze([...a.keys()]);return Object.freeze({kinds:b,resolve:c=>a.get(c)})}var Pn=140,An=120;function tt(t,a){if(t.width<=0||t.height<=0)return 0;let b=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),c=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,b*c/(t.width*t.height))}function gt(t,a){return {x:t.x,y:t.top-a,top:t.top-a,bottom:t.bottom+a,left:t.left,right:t.right,width:t.width,height:t.height+a*2,toJSON:()=>({})}}function vt(t){let a=Math.max(0,t.scrollIdleMs??Pn),b=Math.max(0,t.visibilityDwellMs??An),c=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),g=Math.max(0,t.revealMarginPx??0),$=Math.max(0,t.preloadMarginPx??0),j=Math.max(g,$),A=Math.max(0,t.maxPreloadTargets??Number.POSITIVE_INFINITY),K=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),P=new Map,q=new Map,r=reactive(new Set),u=new Set,v=new Set,N=[],T=null,E=null,U=null,X=false,x=false,M=false,k=false,O,J;function L(){O!==void 0&&clearTimeout(O),O=void 0;}function Q(){J!==void 0&&clearTimeout(J),J=void 0;}function W(m=false){if(!m&&E!==null||T===null)return;let w=T.getBoundingClientRect(),f=gt(w,j);for(let[B,I]of P){let re=B.getBoundingClientRect();I.ratio=tt(re,w),I.intersecting=I.ratio>0,I.revealIntersecting=j>0?tt(re,f)>0:I.intersecting&&I.ratio>=c;}}function G(m){return m.intersecting&&m.ratio>=c}function H(){for(let[m,w]of P)!w.revealIntersecting||r.has(w.key)||j>g&&(g===0&&!G(w)||g>0&&(T===null||tt(m.getBoundingClientRect(),gt(T.getBoundingClientRect(),g))<=0))||(r.add(w.key),t.onRevealed?.(w.item));}function ne(m,w=false){let f=new Set(m.map(I=>I.key));if(!(!(f.size!==v.size||[...f].some(I=>!v.has(I)))&&!w)){v.clear();for(let I of f)v.add(I);t.onSettledVisibleChange?.(m.map(I=>I.item));}}function Z(m,w=false){!w&&m.length===N.length&&m.every((f,B)=>f.key===N[B]?.key&&f.item===N[B]?.item)||(N=m,t.onSettledPreloadChange?.(m.map(f=>f.item)));}function ce(){if(M||X)return;let m=x;x=false,W(),H();let w=T?.getBoundingClientRect(),f=w===void 0?0:(w.top+w.bottom)/2,B=[...P.entries()].filter(([,I])=>G(I)).sort(([I],[re])=>{let V=I.getBoundingClientRect(),z=re.getBoundingClientRect();return Math.abs((V.top+V.bottom)/2-f)-Math.abs((z.top+z.bottom)/2-f)}).slice(0,K).map(([,I])=>I);if(ne(B,m),t.onSettledPreloadChange!==void 0&&w!==void 0){let I=gt(w,$),re=[...P.entries()].filter(([,V])=>V.revealIntersecting).map(([V,z])=>({target:z,rect:V.getBoundingClientRect()})).filter(({target:V,rect:z})=>G(V)||$>0&&tt(z,I)>0).sort((V,z)=>Number(G(z.target))-Number(G(V.target))||Math.abs((V.rect.top+V.rect.bottom)/2-f)-Math.abs((z.rect.top+z.rect.bottom)/2-f)).slice(0,A).map(({target:V})=>V);Z(re,m);}for(let I of B)u.has(I.key)||(u.add(I.key),t.onActivated?.(I.item));}function oe(){M||X||(Q(),J=setTimeout(()=>{J=void 0,ce();},b));}function i(){M||(x=true,ee(true),Z([]),W(),H(),ne([]),Q(),L(),O=setTimeout(()=>{O=void 0,ee(false),oe();},a));}function ee(m){X!==m&&(X=m,t.onScrollingChange?.(m));}function ae(){T?.removeEventListener("scroll",i),E?.disconnect(),U?.disconnect(),E=null,U=null,T=null;}function F(m=true){if(M)return;let w=t.getRoot();if(!(w===T&&T!==null)){if(Z([]),ae(),T=w,T===null){m&&!k&&(k=true,Promise.resolve().then(()=>{k=false,M||(F(false),oe());}));return}if(T.addEventListener("scroll",i,{passive:true}),typeof IntersectionObserver<"u"){E=new IntersectionObserver(f=>{for(let B of f){let I=P.get(B.target);I!==void 0&&(I.intersecting=B.isIntersecting,I.ratio=B.intersectionRatio,j===0&&(I.revealIntersecting=B.isIntersecting&&B.intersectionRatio>=c));}H(),oe();},{root:T,threshold:[0,c,1]}),j>0&&(U=new IntersectionObserver(f=>{for(let B of f){let I=P.get(B.target);I!==void 0&&(I.revealIntersecting=B.isIntersecting);}H(),oe();},{root:T,rootMargin:`${j}px 0px`,threshold:0}));for(let f of P.keys())E.observe(f);for(let f of P.keys())U?.observe(f);}else W(),H();}}function D(m){Z(N.filter(w=>w.key!==m)),r.delete(m),u.delete(m),v.delete(m);}return {register(m,w){if(M)return;let f=t.getKey(m),B=r.has(f),I=u.has(f),re=w===null?void 0:P.get(w);re!==void 0&&re.key!==f&&(q.delete(re.key),P.delete(w),D(re.key));let V=q.get(f);if(V!==void 0&&V!==w&&(E?.unobserve(V),U?.unobserve(V),P.delete(V),q.delete(f)),w===null){V!==void 0&&(E?.unobserve(V),U?.unobserve(V),P.delete(V),q.delete(f)),D(f);return}let z=P.get(w);if(z?.key===f&&z.item===m){F();return}P.set(w,{item:m,key:f,intersecting:z?.key===f?z.intersecting:false,ratio:z?.key===f?z.ratio:0,revealIntersecting:z?.key===f?z.revealIntersecting:false}),q.set(f,w),F(),E?.observe(w),U?.observe(w),W(true),H(),B&&t.onRevealed?.(m),I&&t.onActivated?.(m),oe();},isRevealed:m=>r.has(t.getKey(m)),isActivated:m=>u.has(t.getKey(m)),isSettledVisible:m=>v.has(t.getKey(m)),isScrolling:()=>X,notifyScroll:i,refresh(){F(),W(true),H(),oe();},reset(){L(),Q(),ee(false),x=false,ne([]),Z([]),ae(),P.clear(),q.clear(),r.clear(),u.clear();},dispose(){M||(L(),Q(),ee(false),x=false,ne([]),Z([]),ae(),P.clear(),q.clear(),r.clear(),u.clear(),M=true);}}}function xn(t){let a=new Map,b=new Map,c=shallowReactive(new Map),g=[],$=false,j=r=>{let u=a.get(r.channel);return u===void 0?r.channel:`${r.channel}\0${u.getKey(r.item)}`},A=vt({getRoot:t.getRoot,getKey:r=>r.key,revealMarginPx:t.revealMarginPx,preloadMarginPx:t.preloadMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:r=>{for(let u of a.values())u.onScrollingChange?.(r);},onRevealed:r=>r.targets.forEach(u=>a.get(u.channel)?.onRevealed?.(u.item)),onActivated:r=>r.targets.forEach(u=>a.get(u.channel)?.onActivated?.(u.item)),onSettledPreloadChange:r=>{let u=r.flatMap(v=>v.targets);for(let[v,N]of a){let T=u.filter(E=>E.channel===v).map(E=>E.item);N.onSettledPreloadChange?.(T.slice(0,Math.max(0,N.maxPreloadTargets??Number.POSITIVE_INFINITY)));}},onSettledVisibleChange:r=>{K(r.flatMap(u=>u.targets));}});function K(r){g=r;for(let[u,v]of a){let N=r.filter(E=>E.channel===u).map(E=>E.item),T=v.maxSettledVisible===void 0?N:N.slice(0,v.maxSettledVisible);v.onSettledVisibleChange?.(T);}}function P(r){let u=[...b.values()].flatMap(T=>[...T.values()].filter(E=>E.element===r).map(E=>E.target)),v=c.get(r);if(v!==void 0&&u.length===v.targets.length&&u.every((T,E)=>T===v.targets[E]))return;if(u.length===0)v!==void 0&&(c.delete(r),[...c.values()].some(T=>T.key===v.key)||A.register(v,null));else {let T={key:JSON.stringify(u.map(j)),targets:u};c.set(r,T),A.register(T,r);}let N=g.filter(T=>b.get(T.channel)?.get(a.get(T.channel).getKey(T.item))?.target===T);N.length!==g.length&&K(N);}function q(r){return u=>{if($)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(a.has(r))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${r}`);a.set(r,u);let v=shallowReactive(new Map);b.set(r,v);let N=false,T=x=>({channel:r,item:x});function E(){let x=[...v.values()].map(M=>M.element);v.clear();for(let M of x)P(M);u.onScrollingChange?.(false),u.onSettledVisibleChange?.([]),u.onSettledPreloadChange?.([]);}function U(x,M){let k=v.get(u.getKey(x)),O=k===void 0?void 0:c.get(k.element);return O!==void 0&&M(O)}return {register(x,M){if(N||$)return;let k=u.getKey(x),O=v.get(k);if(M===null){O!==void 0&&(v.delete(k),P(O.element));return}if(O?.target.item===x&&O.element===M){let L=c.get(M);L!==void 0&&A.register(L,M);return}let J=O?.target.item===x?O.target:T(x);for(let[L,Q]of v)L!==k&&Q.element===M&&v.delete(L);v.set(k,{target:J,element:M}),P(M),O!==void 0&&O.element!==M&&P(O.element);},isRevealed:x=>U(x,A.isRevealed),isActivated:x=>U(x,A.isActivated),isSettledVisible:x=>U(x,A.isSettledVisible),isScrolling:A.isScrolling,notifyScroll:A.notifyScroll,refresh:A.refresh,reset:E,dispose(){N||(E(),N=true,a.delete(r),b.delete(r));}}}}return {createFactory:q,refresh:A.refresh,dispose(){if(!$){for(let r of c.values())A.register(r,null);c.clear();for(let r of a.values())r.onSettledPreloadChange?.([]);b.clear(),a.clear(),A.dispose(),$=true;}}}}export{at as ImThreadBodySwitch,lt as ImThreadItems,Rn as ImThreadSurface,ut as ImThreadViewport,hn as createImThreadSurfaceContext,Sn as createMessageRendererRegistry,xn as createThreadVisibilityTargetGroup,vt as createThreadVisibilityTargets,yn as provideImThreadSurfaceContext,Jt as useImText,ct as useImThreadSurfaceContext,en as useOptionalImThreadReadActions};
@@ -39,8 +39,8 @@ interface ConversationDraft$1 {
39
39
  attachments: readonly [];
40
40
  updatedAt: number;
41
41
  }
42
- /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);未知 wire 正文统一归一为 unknown。 */
43
- type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'unknown';
42
+ /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire 正文统一归一为 unknown。 */
43
+ type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'unknown';
44
44
  /**
45
45
  * 发送态(客户端态):消息从本地创建到服务端确认的生命周期。
46
46
  * `uploading` 仅媒体消息使用:文件上传阶段(uploading→pending→sending→sent);
@@ -111,6 +111,8 @@ type LastMessageSummary = {
111
111
  kind: 'transfer';
112
112
  } | {
113
113
  kind: 'gift';
114
+ } | {
115
+ kind: 'liveRoom';
114
116
  } | {
115
117
  kind: 'call';
116
118
  callKind: ImCallKind;
@@ -609,6 +611,40 @@ interface ImMediaAlbumBody {
609
611
  /** 媒体项,顺序即用户选择顺序(决定宫格 index 与首项朝向)。 */
610
612
  items: readonly ImMediaAlbumItem[];
611
613
  }
614
+ /** 直播间分享的直播类型。wire `liveType`:1 视频、2 语音、3 双手机、4 单手机录屏、5 语聊房。 */
615
+ type ImLiveRoomType = 'video' | 'voice' | 'dual-phone' | 'screen-record' | 'voice-chat';
616
+ /** 直播间分享的房间状态。wire `liveRoomStatus`:1 预告、2 直播中、3 已结束。 */
617
+ type ImLiveRoomStatus = 'preview' | 'live' | 'ended';
618
+ /**
619
+ * 直播间分享卡片正文(contentType==='liveRoom',协议 BMessage.contentType=30,fields 98-112)。
620
+ *
621
+ * @remarks 调用方先拿到直播间快照再写入本结构。Core 不请求直播接口,也不把缺省枚举猜成某一种直播。
622
+ * `uid` 是声网 SDK 初始化用的 UID,不是 IM 用户 id。
623
+ */
624
+ interface ImLiveRoomBody {
625
+ /** 直播间 ID(BMessage.liveRoomId)。 */
626
+ liveRoomId: string;
627
+ liveType: ImLiveRoomType;
628
+ liveRoomStatus: ImLiveRoomStatus;
629
+ /** 当前账号是否已关注主播。协议 bool 无法区分未设置,false 也是有效状态。 */
630
+ isFocus: boolean;
631
+ /** 当前账号是否已预约这场直播。 */
632
+ isReservation: boolean;
633
+ liveRecordId?: string;
634
+ /** 画面比例原文,例如 `16:9`。 */
635
+ screenRatio?: string;
636
+ broadcasterUserId?: string;
637
+ broadcasterUserName?: string;
638
+ /** 声网 SDK 初始化 UID(BMessage.uid)。 */
639
+ uid?: string;
640
+ liveCover?: string;
641
+ liveRoomName?: string;
642
+ /** 预告时间,秒级时间戳的十进制字符串。 */
643
+ livePreviewTime?: string;
644
+ livePreviewId?: string;
645
+ /** 直播间人数字符串,保持协议原文,不在 Core 换算。 */
646
+ liveRoomViewers?: string;
647
+ }
612
648
  interface ImMessageBody {
613
649
  /** P0 文本内容(明文,解密后的结果)。 */
614
650
  text?: string;
@@ -644,6 +680,8 @@ interface ImMessageBody {
644
680
  filesAlbum?: ImFilesAlbumBody;
645
681
  /** contentType==='robot' 时的机器人卡片。 */
646
682
  robot?: ImRobotBody;
683
+ /** contentType==='liveRoom' 时的直播间分享卡片。 */
684
+ liveRoom?: ImLiveRoomBody;
647
685
  /** contentType==='unknown' 时的稳定未知正文,不含原始 wire type。 */
648
686
  unknown?: UnknownMessageBody;
649
687
  }
@@ -2719,7 +2757,7 @@ interface ResolvedChannelAccess {
2719
2757
  */
2720
2758
  declare function resolveChannelAccess(input: ResolveChannelAccessInput): ResolvedChannelAccess;
2721
2759
 
2722
- type EditFailReason = 'not-found' | 'not-own' | 'not-sent' | 'recalled' | 'deleted' | 'expired' | 'unsupported' | 'empty' | 'restricted' | 'unsupported-content' | 'no-key' | 'encrypt-failed' | 'timeout' | 'failed' | 'disconnected';
2760
+ type EditFailReason = 'not-found' | 'not-own' | 'pinned' | 'not-sent' | 'recalled' | 'deleted' | 'expired' | 'unsupported' | 'empty' | 'restricted' | 'unsupported-content' | 'no-key' | 'encrypt-failed' | 'timeout' | 'failed' | 'disconnected';
2723
2761
 
2724
2762
  /** UI 转发预检所需的最小稳定消息视图;不依赖 sortKey、raw 或协议扩展。 */
2725
2763
  type ForwardContentCandidate = Pick<ImMessage, 'contentType' | 'body'>;
@@ -2750,7 +2788,7 @@ declare function canTransmitContent(message: ForwardContentCandidate): boolean;
2750
2788
  */
2751
2789
  declare function canTransmit(message: ForwardCandidateMessage): boolean;
2752
2790
 
2753
- type RecallFailReason = 'not-found' | 'not-own' | 'not-sent' | 'expired' | 'unsupported' | 'timeout' | 'server-expired' | 'failed' | 'disconnected';
2791
+ type RecallFailReason = 'not-found' | 'not-own' | 'pinned' | 'not-sent' | 'expired' | 'unsupported' | 'timeout' | 'server-expired' | 'failed' | 'disconnected';
2754
2792
 
2755
2793
  /** 浏览器 PushSubscription.toJSON() 的可移植数据;不依赖 DOM 或浏览器全局。 */
2756
2794
  interface ImWebPushSubscription {
@@ -3303,6 +3341,10 @@ interface TransferMessageOptions {
3303
3341
  interface GiftMessageOptions {
3304
3342
  replyToMessageId?: string;
3305
3343
  }
3344
+ /** 直播间分享卡发送选项;正文由调用方提供,Core 不补默认直播类型。 */
3345
+ interface LiveRoomMessageOptions {
3346
+ replyToMessageId?: string;
3347
+ }
3306
3348
  /**
3307
3349
  * 媒体合集里的一项:一张图片或一个视频。
3308
3350
  *
@@ -3516,6 +3558,36 @@ interface ImDirectorySearchApi {
3516
3558
  search: (keyword: string) => Promise<ImDirectorySearchResult>;
3517
3559
  }
3518
3560
 
3561
+ /** 回源失败的原因与能否重试。 */
3562
+ interface MessagesByIdFailure {
3563
+ /**
3564
+ * 能否稍后重试。
3565
+ *
3566
+ * 服务端错误、网络异常和登录过期都算可以重试;无权限(已退群或已退出频道)和参数错误是终态,
3567
+ * 再试多少次结果都一样,调用方应该停下来而不是反复打接口。
3568
+ */
3569
+ retryable: boolean;
3570
+ /** 原始错误,供诊断与上报。 */
3571
+ error: unknown;
3572
+ }
3573
+ /** 回源的汇总结果。三组 id 互不重叠,合起来覆盖调用方传入的全部有效 id。 */
3574
+ interface ImMessagesByIdResult<TMessage> {
3575
+ /** 成功取回的消息。已经进了本地历史,后续本地查询就能命中。 */
3576
+ readonly messages: readonly TMessage[];
3577
+ /**
3578
+ * 服务端确认没有这些消息:已被删除、超出保留期被清理,或对当前用户不可见。
3579
+ * 这是终态,调用方应记下来并停止重试。
3580
+ */
3581
+ readonly missingMessageIds: readonly string[];
3582
+ /**
3583
+ * 这次没取到、但不代表不存在的消息 id(请求失败了)。
3584
+ * 是否值得再试看 `failure.retryable`。
3585
+ */
3586
+ readonly unresolvedMessageIds: readonly string[];
3587
+ /** `unresolvedMessageIds` 非空时的失败原因;全部取到或全部确认缺失时不存在。 */
3588
+ readonly failure?: MessagesByIdFailure;
3589
+ }
3590
+
3519
3591
  /**
3520
3592
  * SDK 内部 CHANNEL sibling:装配资料、成员、申请、置顶、历史限制与通知修复能力。
3521
3593
  *
@@ -3668,6 +3740,15 @@ interface ImContactSearchResult {
3668
3740
  age?: number;
3669
3741
  relationship: ImContactRelationship;
3670
3742
  }
3743
+ /** 当前账号黑名单中的一名用户;不暴露关系记录 id、status 等后端字段。 */
3744
+ interface ImBlockedContact {
3745
+ userId: string;
3746
+ /** 优先当前账号设置的备注,没有备注时为对方昵称。 */
3747
+ displayName: string;
3748
+ nickname: string;
3749
+ remark?: string;
3750
+ avatarUrl?: string;
3751
+ }
3671
3752
  /** 好友申请提交结果;调用成功不等于一定需要对端审核。 */
3672
3753
  interface ImFriendshipRequestResult {
3673
3754
  status: 'sent' | 'added' | 'already-friend';
@@ -3707,6 +3788,15 @@ interface ImContactApi extends ImDirectoryApi<'individual'> {
3707
3788
  }) => Promise<ImFriendshipRequestResult>;
3708
3789
  /** 远端确认后加入黑名单,并清理该用户的本机 direct 会话和聊天数据。 */
3709
3790
  blockUser: (userId: string) => Promise<void>;
3791
+ /** 读取当前账号的黑名单;结果直接来自服务端,空数组表示名单为空。 */
3792
+ listBlocked: () => Promise<readonly ImBlockedContact[]>;
3793
+ /**
3794
+ * 远端确认后把用户移出黑名单。
3795
+ *
3796
+ * @remarks 移出后双方是否恢复为好友由服务端决定,SDK 不猜:本地关系先改为 `unknown`,
3797
+ * 再强制查询服务端关系并刷新资料。拉黑时已删除的 direct 会话和聊天记录不会恢复。
3798
+ */
3799
+ unblockUser: (userId: string) => Promise<void>;
3710
3800
  /** 提交联系人举报;该操作不修改好友关系、会话或本地资料。 */
3711
3801
  reportUser: (userId: string, problem: string) => Promise<void>;
3712
3802
  /**
@@ -4423,6 +4513,8 @@ type ConversationLastMessageSummary = {
4423
4513
  kind: 'transfer';
4424
4514
  } | {
4425
4515
  kind: 'gift';
4516
+ } | {
4517
+ kind: 'liveRoom';
4426
4518
  } | {
4427
4519
  kind: 'redPacket';
4428
4520
  } | {
@@ -4809,36 +4901,6 @@ interface ImExpressionsApi {
4809
4901
  };
4810
4902
  }
4811
4903
 
4812
- /** 回源失败的原因与能否重试。 */
4813
- interface MessagesByIdFailure {
4814
- /**
4815
- * 能否稍后重试。
4816
- *
4817
- * 服务端错误、网络异常和登录过期都算可以重试;无权限(已退群或已退出频道)和参数错误是终态,
4818
- * 再试多少次结果都一样,调用方应该停下来而不是反复打接口。
4819
- */
4820
- retryable: boolean;
4821
- /** 原始错误,供诊断与上报。 */
4822
- error: unknown;
4823
- }
4824
- /** 回源的汇总结果。三组 id 互不重叠,合起来覆盖调用方传入的全部有效 id。 */
4825
- interface ImMessagesByIdResult<TMessage> {
4826
- /** 成功取回的消息。已经进了本地历史,后续本地查询就能命中。 */
4827
- readonly messages: readonly TMessage[];
4828
- /**
4829
- * 服务端确认没有这些消息:已被删除、超出保留期被清理,或对当前用户不可见。
4830
- * 这是终态,调用方应记下来并停止重试。
4831
- */
4832
- readonly missingMessageIds: readonly string[];
4833
- /**
4834
- * 这次没取到、但不代表不存在的消息 id(请求失败了)。
4835
- * 是否值得再试看 `failure.retryable`。
4836
- */
4837
- readonly unresolvedMessageIds: readonly string[];
4838
- /** `unresolvedMessageIds` 非空时的失败原因;全部取到或全部确认缺失时不存在。 */
4839
- readonly failure?: MessagesByIdFailure;
4840
- }
4841
-
4842
4904
  /**
4843
4905
  * 绑定单个精确会话的产品句柄与独立连续消息窗口。
4844
4906
  * 句柄提供历史、消息、草稿、已读和免打扰动作;SDK/DomainState 仍拥有消息真相,关闭只释放窗口和订阅。
@@ -4996,6 +5058,12 @@ interface ConversationMessageApi {
4996
5058
  * @remarks CHANNEL 当前产品入口不发送礼物,会返回 unsupported。消息固定明文。
4997
5059
  */
4998
5060
  sendGift: (gift: ImGiftBody, options?: GiftMessageOptions) => Promise<SendMessageResult>;
5061
+ /**
5062
+ * 分享直播间卡片。调用方必须先拿到直播间快照。
5063
+ *
5064
+ * @remarks Core 不请求直播接口,也不补默认直播类型或房间状态。群和频道按会话加密发送。
5065
+ */
5066
+ sendLiveRoom: (liveRoom: ImLiveRoomBody, options?: LiveRoomMessageOptions) => Promise<SendMessageResult>;
4999
5067
  /** 当前用户已选相同 emoji 时移除,否则添加或替换。emoji 必须是协议 token,例如 `[Great]`。 */
5000
5068
  toggleReaction: (messageId: string, emoji: string) => Promise<ImReactionChangeResult>;
5001
5069
  /** 显式添加/替换或移除,供参与者详情等不能用 toggle 猜动作的产品交互。 */
@@ -5023,7 +5091,7 @@ interface ConversationMessageApi {
5023
5091
  */
5024
5092
  replaceInterruptedFile: (messageId: string, file: File | Blob, options?: FileMessageOptions) => Promise<SendMessageResult>;
5025
5093
  /**
5026
- * 编辑当前会话的一条文本消息;所有权、正文类型、时间窗、加密与 CHANNEL 权限由对应 core sibling 校验。
5094
+ * 编辑当前会话的一条非置顶文本消息;所有权、正文类型、时间窗、加密与 CHANNEL 权限由对应 core sibling 校验。
5027
5095
  * @throws 消息不属于当前 handle,或 core 返回稳定业务失败时抛出 `ImSdkErrorShape`;不暴露协议 errcode。
5028
5096
  * @example
5029
5097
  * ```ts
@@ -5034,10 +5102,10 @@ interface ConversationMessageApi {
5034
5102
  * ```
5035
5103
  */
5036
5104
  editText: (messageId: string, text: string, options?: EditTextOptions) => Promise<ImProductMessage>;
5037
- /** 撤回当前会话消息;成功后由同一 DomainState 更新窗口,失败抛稳定产品错误。 */
5105
+ /** 撤回当前会话非置顶消息;成功后由同一 DomainState 更新窗口,失败抛稳定产品错误。 */
5038
5106
  recall: (messageId: string) => Promise<void>;
5039
5107
  /**
5040
- * 仅从当前账号本机删除一条已落地消息。
5108
+ * 仅从当前账号本机删除一条已落地且未置顶的消息。
5041
5109
  *
5042
5110
  * @remarks 不清理已读、置顶、草稿、宿主下载文件、独立媒体缓存或远端历史。仍由 Outbox 持有或正在上传的消息会被拒绝;
5043
5111
  * queued 消息只有在 `client.outbox.cancel` 成功移除账本后,才能删除其本地失败气泡,避免把删除气泡误当作取消发送。
@@ -5159,7 +5227,7 @@ interface ChannelConversationMessageApi extends ConversationMessageApi {
5159
5227
  *
5160
5228
  * @remarks 不受本人撤回时间窗限制;权限由 CHANNEL profile 预检并由服务端最终校验。成功后消息进入
5161
5229
  * `deletedForEveryone` 终态;Chat Kit 时间线仅向社群群主和管理员显示删除提示,普通成员隐藏该项。
5162
- * 该方法不用于本机删除,也不适用于普通群。
5230
+ * 置顶原消息即使由管理员或群主操作也会拒绝;该方法不用于本机删除,也不适用于普通群。
5163
5231
  * @example
5164
5232
  * ```ts
5165
5233
  * const channel = await client.openConversation({ conversationType: 'channel', conversationId: '9001' })
@@ -6389,6 +6457,25 @@ interface ImContactsApi extends ImDirectoryApi<'individual'> {
6389
6457
  * ```
6390
6458
  */
6391
6459
  blockUser: (userId: string) => Promise<void>;
6460
+ /**
6461
+ * 读取当前账号的黑名单;每次都查询服务端,空数组表示名单为空。
6462
+ *
6463
+ * @example
6464
+ * ```ts
6465
+ * const blocked = await client.contacts.listBlocked()
6466
+ * ```
6467
+ */
6468
+ listBlocked: () => Promise<readonly ImBlockedContact[]>;
6469
+ /**
6470
+ * 把用户移出黑名单。
6471
+ *
6472
+ * @remarks 远端成功后 SDK 重新向服务端查询双方关系,不假设恢复为好友;拉黑时已删除的会话和聊天记录不会恢复。
6473
+ * @example
6474
+ * ```ts
6475
+ * await client.contacts.unblockUser('user-7')
6476
+ * ```
6477
+ */
6478
+ unblockUser: (userId: string) => Promise<void>;
6392
6479
  /**
6393
6480
  * 举报联系人;成功只表示服务端已接收,不改变好友关系或本地会话。
6394
6481
  *
@@ -6521,6 +6608,8 @@ interface AdvancedContactsApi extends ImDirectoryApi<'individual'> {
6521
6608
  searchUser: ImContactApi['searchUser'];
6522
6609
  requestFriendship: ImContactApi['requestFriendship'];
6523
6610
  blockUser: ImContactApi['blockUser'];
6611
+ listBlocked: ImContactApi['listBlocked'];
6612
+ unblockUser: ImContactApi['unblockUser'];
6524
6613
  reportUser: ImContactApi['reportUser'];
6525
6614
  deleteFriendship: ImContactApi['deleteFriendship'];
6526
6615
  }
@@ -6806,7 +6895,7 @@ type ImLocale = 'en-US' | 'th-TH' | 'vi-VN' | 'zh-CN' | 'zh-TW';
6806
6895
  * 二期收敛:kit 框架无关层不再直接产中文,改产本联合里的码 + 参数(如 {reason}/{label}/{size}),由宿主经 im-i18n 渲染。
6807
6896
  * 动态原始报错(error.message)作为 `{reason}` 参数拼接,不入 catalog(属诊断,不翻译)。
6808
6897
  */
6809
- type ImServiceTextKey = 'common.notConnected' | 'common.selectOrOpenConversation' | 'common.conversationTypeNotReady' | 'common.conversationNotReady' | `recall.${RecallFailReason}` | `edit.${EditFailReason}` | 'localDelete.done' | 'localDelete.notFound' | 'localDelete.inFlight' | 'localDelete.failed' | 'channelDelete.notFound' | 'channelDelete.unsupported' | 'channelDelete.notSent' | 'channelDelete.unavailable' | 'channelDelete.forbidden' | 'channelDelete.timeout' | 'channelDelete.failed' | 'channelDelete.disconnected' | 'directBlock.contactRequired' | 'groupBlock.left' | 'groupBlock.removed' | 'groupBlock.dismissed' | 'groupBlock.unknownRestricted' | 'channelBlock.guest' | 'channelBlock.left' | 'channelBlock.removed' | 'channelBlock.dismissed' | 'channelBlock.muted' | 'channelBlock.allMembersMuted' | 'channelBlock.currentUserMuted' | 'channelBlock.blacklisted' | 'channelBlock.unknownRestricted' | 'channelProfile.loadFailed' | 'channelProfile.notFound' | 'channelProfile.retryAction' | 'channelMembers.title' | 'channelMembers.searchPlaceholder' | 'channelMembers.loading' | 'channelMembers.loadFailed' | 'channelMembers.retryAction' | 'channelMembers.empty' | 'channelMembers.loadingMore' | 'channelMembers.loadMoreFailed' | 'channelMembers.exhausted' | 'channelMembers.loadMoreAction' | 'label.image' | 'label.video' | 'label.file' | 'label.sticker' | 'send.failed' | 'send.retryFailed' | 'send.cancelFailed' | 'send.mediaFailed' | 'send.mediaEmpty' | 'send.mediaCancelled' | 'send.mediaCountLimit' | 'send.mediaTooLarge' | 'send.mediaFormatMismatch' | 'send.imageFormatUnsupported' | 'send.videoTooLong' | 'send.videoDurationUnavailable' | 'send.voiceEmpty' | 'send.voiceStorageNotConfigured' | 'send.voiceCancelled' | 'send.voiceFailed' | 'media.uploadWaiting' | 'media.voiceNotReady' | 'media.voiceLoadEmpty' | 'media.voiceLoadFailed' | 'media.videoOpenEmpty' | 'media.videoLoadFailed' | 'media.imageInvalid' | 'media.imageLoadFailed' | 'media.fileDownloadEmpty' | 'media.fileDownloadFailed' | 'conversation.muteEnableFailed' | 'conversation.muteDisableFailed' | 'conversation.backgroundLoadFailed' | 'read.markReadFailed' | 'storage.failed' | 'sync.failed' | 'draft.saveFailed' | 'history.returnLatestFailed' | 'pinned.forbidden' | 'pinned.network' | 'pinned.contract' | 'pinned.unsupported' | 'pinned.failed' | 'pinned.previewUnavailable' | 'pinned.locateFailed' | 'pinned.recalled' | 'pinned.deleted' | 'pinned.protected' | 'pinned.pinAction' | 'pinned.unpinAction' | 'pinned.unpinConfirm' | 'pinned.cancelAction' | 'lifecycle.missingLoginState' | 'lifecycle.prepareFailed' | 'lifecycle.missingConnectParams' | 'lifecycle.connectFailed' | 'lifecycle.disposed' | 'lifecycle.connectionOccupied' | 'lifecycle.connectionCoordinationUnavailable' | 'forward.emptyInput' | 'forward.allSkipped' | 'forward.partialSkipped' | 'forward.done' | 'forward.failed';
6898
+ type ImServiceTextKey = 'common.notConnected' | 'common.selectOrOpenConversation' | 'common.conversationTypeNotReady' | 'common.conversationNotReady' | `recall.${RecallFailReason}` | `edit.${EditFailReason}` | 'localDelete.done' | 'localDelete.notFound' | 'localDelete.inFlight' | 'localDelete.failed' | 'channelDelete.notFound' | 'channelDelete.unsupported' | 'channelDelete.notSent' | 'channelDelete.unavailable' | 'channelDelete.forbidden' | 'channelDelete.timeout' | 'channelDelete.failed' | 'channelDelete.disconnected' | 'directBlock.contactRequired' | 'groupBlock.left' | 'groupBlock.removed' | 'groupBlock.dismissed' | 'groupBlock.unknownRestricted' | 'channelBlock.guest' | 'channelBlock.left' | 'channelBlock.removed' | 'channelBlock.dismissed' | 'channelBlock.muted' | 'channelBlock.allMembersMuted' | 'channelBlock.currentUserMuted' | 'channelBlock.blacklisted' | 'channelBlock.unknownRestricted' | 'channelProfile.loadFailed' | 'channelProfile.notFound' | 'channelProfile.retryAction' | 'channelMembers.title' | 'channelMembers.searchPlaceholder' | 'channelMembers.loading' | 'channelMembers.loadFailed' | 'channelMembers.retryAction' | 'channelMembers.empty' | 'channelMembers.loadingMore' | 'channelMembers.loadMoreFailed' | 'channelMembers.exhausted' | 'channelMembers.loadMoreAction' | 'label.image' | 'label.video' | 'label.file' | 'label.sticker' | 'send.failed' | 'send.retryFailed' | 'send.cancelFailed' | 'send.mediaFailed' | 'send.mediaEmpty' | 'send.mediaCancelled' | 'send.mediaCountLimit' | 'send.mediaTooLarge' | 'send.mediaFormatMismatch' | 'send.imageFormatUnsupported' | 'send.videoTooLong' | 'send.videoDurationUnavailable' | 'send.voiceEmpty' | 'send.voiceStorageNotConfigured' | 'send.voiceCancelled' | 'send.voiceFailed' | 'media.uploadWaiting' | 'media.voiceNotReady' | 'media.voiceLoadEmpty' | 'media.voiceLoadFailed' | 'media.videoOpenEmpty' | 'media.videoLoadFailed' | 'media.imageInvalid' | 'media.imageLoadFailed' | 'media.fileDownloadEmpty' | 'media.fileDownloadFailed' | 'conversation.muteEnableFailed' | 'conversation.muteDisableFailed' | 'conversation.backgroundLoadFailed' | 'read.markReadFailed' | 'storage.failed' | 'sync.failed' | 'draft.saveFailed' | 'history.returnLatestFailed' | 'pinned.forbidden' | 'pinned.network' | 'pinned.contract' | 'pinned.unsupported' | 'pinned.failed' | 'pinned.previewUnavailable' | 'pinned.locateFailed' | 'pinned.messageNotFound' | 'pinned.recalled' | 'pinned.deleted' | 'pinned.protected' | 'pinned.pinAction' | 'pinned.unpinAction' | 'pinned.unpinConfirm' | 'pinned.cancelAction' | 'lifecycle.missingLoginState' | 'lifecycle.prepareFailed' | 'lifecycle.missingConnectParams' | 'lifecycle.connectFailed' | 'lifecycle.disposed' | 'lifecycle.connectionOccupied' | 'lifecycle.connectionCoordinationUnavailable' | 'forward.emptyInput' | 'forward.allSkipped' | 'forward.partialSkipped' | 'forward.done' | 'forward.failed';
6810
6899
 
6811
6900
  /** 会话列表摘要的框架无关分段;宿主可自行决定表情使用图片、文本或其它组件呈现。 */
6812
6901
  type ConversationListPreviewSegment = {