k2-im 0.1.21 → 0.1.23
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.
- package/dist/browser-YLMJKRLM.js +2 -0
- package/dist/browser.d.ts +21 -0
- package/dist/browser.js +1 -1
- package/dist/chat-kit-pinia.d.ts +241 -86
- package/dist/chat-kit-pinia.js +1 -1
- package/dist/chat-kit-vue.d.ts +58 -0
- package/dist/chat-kit-vue.js +1 -1
- package/dist/chat-kit.d.ts +71 -0
- package/dist/chat-kit.js +1 -1
- package/dist/chunk-EM4YNWX4.js +2 -0
- package/dist/chunk-FUEAUHMC.js +1 -0
- package/dist/{chunk-5I7S6LWE.js → chunk-HNSTHP6F.js} +1 -1
- package/dist/{chunk-P4HOR4XO.js → chunk-HQ7FTY2C.js} +1 -1
- package/dist/{chunk-YAM4YHKF.js → chunk-MO2EU56Q.js} +2 -2
- package/dist/chunk-W5SQGPRQ.js +2 -0
- package/dist/{chunk-2GZMQCIP.js → chunk-YQSRQ25X.js} +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +72 -1
- package/dist/index.js +1 -1
- package/dist/sdk.d.ts +47 -1
- package/dist/sdk.js +1 -1
- package/package.json +1 -1
- package/dist/browser-BKCNJDKR.js +0 -2
- package/dist/chunk-4X7RCGEV.js +0 -1
- package/dist/chunk-A2BLOVZ5.js +0 -2
- package/dist/chunk-DN4H5C7G.js +0 -2
package/dist/chat-kit-vue.d.ts
CHANGED
|
@@ -915,6 +915,20 @@ interface ApiProtocolUploadProgress {
|
|
|
915
915
|
/** 底层 transport 的原始进度事件,供调试或特殊场景读取。 */
|
|
916
916
|
event?: unknown;
|
|
917
917
|
}
|
|
918
|
+
/**
|
|
919
|
+
* 单次请求完成后的安全状态信息,供调用方识别 HTTP 与业务失败。
|
|
920
|
+
*
|
|
921
|
+
* 不包含请求头、URL、凭据或响应正文;HTTP 状态与后端业务码分别保留,避免把网络
|
|
922
|
+
* 失败合成的 502 或纯 HTTP 403 当成服务端业务码。原始响应仍通过请求返回值交付。
|
|
923
|
+
*/
|
|
924
|
+
interface ApiProtocolResponseObservation {
|
|
925
|
+
/** 请求结果所属层;成功收到业务错误信封仍属于 `success`。 */
|
|
926
|
+
transportStatus: 'success' | 'http_error' | 'network_error' | 'invalid_response';
|
|
927
|
+
/** 服务端真实 HTTP 状态;未收到响应时不存在。 */
|
|
928
|
+
httpStatus?: number;
|
|
929
|
+
/** 仅在真实响应正文是协议信封时提供其 code;不包含客户端合成的错误码。 */
|
|
930
|
+
businessCode?: number;
|
|
931
|
+
}
|
|
918
932
|
/**
|
|
919
933
|
* 单次协议请求的可覆盖项。
|
|
920
934
|
*
|
|
@@ -957,6 +971,13 @@ interface ApiProtocolRequestOptions {
|
|
|
957
971
|
signal?: AbortSignal;
|
|
958
972
|
/** 上传进度回调;默认浏览器客户端的 axios transport 支持该能力。 */
|
|
959
973
|
onUploadProgress?: (progress: ApiProtocolUploadProgress) => void;
|
|
974
|
+
/**
|
|
975
|
+
* 请求完成后调用一次,只提供安全状态字段。回调异常会使请求显式失败,不会转换成网络错误。
|
|
976
|
+
* 调用方如需检查当前账号是否仍有效,可先保存这些字段,在请求返回后决定是否处理。
|
|
977
|
+
*/
|
|
978
|
+
onResponse?: (observation: ApiProtocolResponseObservation) => void | Promise<void>;
|
|
979
|
+
/** 跳过客户端注入的全局业务处理器,默认 false;由调用方接管当前请求的业务副作用。 */
|
|
980
|
+
skipBusinessResponseHandler?: boolean;
|
|
960
981
|
/**
|
|
961
982
|
* 响应解析模式。
|
|
962
983
|
* - `'json'`(默认):按 content-type 走 JSON / 文本 / AES-JSON 解析,返回业务响应对象。
|
|
@@ -1212,6 +1233,39 @@ interface ImDebugOptions {
|
|
|
1212
1233
|
sink?: ImDiagnosticSink;
|
|
1213
1234
|
}
|
|
1214
1235
|
|
|
1236
|
+
/**
|
|
1237
|
+
* SDK 自管 Core JSON / CM HTTP 请求的失败事实,交由宿主决定是否触发全局处理。
|
|
1238
|
+
*
|
|
1239
|
+
* 不包含 URL、响应正文、服务端文案或凭据。`httpStatus` 与 `businessCode` 分别来自 HTTP
|
|
1240
|
+
* 响应和真实业务响应体;网络失败没有 HTTP 状态,合成的 502 不会冒充业务码。
|
|
1241
|
+
* S3、Giphy 和宿主自己发出的请求不属于这两个服务,不会被当作账号认证失败上报。
|
|
1242
|
+
*/
|
|
1243
|
+
interface ImRequestError {
|
|
1244
|
+
/** 返回错误的服务;宿主不能把 CM 成员权限错误等同于 Core 账号失效。 */
|
|
1245
|
+
readonly service: 'core' | 'cm';
|
|
1246
|
+
/** 失败发生在哪一层;同时有 HTTP 和业务失败时,优先标为 `http`。 */
|
|
1247
|
+
readonly kind: 'http' | 'business' | 'network' | 'invalid-response';
|
|
1248
|
+
/** 实际 HTTP 状态;没有收到响应时不存在。 */
|
|
1249
|
+
readonly httpStatus?: number;
|
|
1250
|
+
/** Core 返回的真实业务码;CM protobuf 请求不提供该字段。 */
|
|
1251
|
+
readonly businessCode?: number;
|
|
1252
|
+
}
|
|
1253
|
+
/**
|
|
1254
|
+
* 宿主的全局请求错误入口;SDK 不依据返回值重试、登出或改变原调用的结果。
|
|
1255
|
+
*
|
|
1256
|
+
* 每个失败请求通知一次,重复提示策略由宿主现有全局处理器负责。调用前 SDK 会核对账号、
|
|
1257
|
+
* 实际发送凭据及运行时是否仍有效;异步处理器应在第一次 await 前完成需要当前登录态的决策。
|
|
1258
|
+
* 回调抛错或拒绝只进入 SDK 诊断,不会替换请求本身的失败。不会等待回调中的登录/退出操作,
|
|
1259
|
+
* 避免宿主退出流程等待当前请求时互相阻塞。
|
|
1260
|
+
*
|
|
1261
|
+
* @example
|
|
1262
|
+
* ```ts
|
|
1263
|
+
* const onRequestError: ImRequestErrorHandler = issue => appErrors.handleImRequest(issue)
|
|
1264
|
+
* const client = createImClient({ authProvider, endpointProvider, cache, onRequestError })
|
|
1265
|
+
* ```
|
|
1266
|
+
*/
|
|
1267
|
+
type ImRequestErrorHandler = (issue: ImRequestError) => void | Promise<void>;
|
|
1268
|
+
|
|
1215
1269
|
/**
|
|
1216
1270
|
* 媒体对象存储(S3)配置:由宿主注入的**部署基建配置**,SDK 不硬编码逻辑桶名,也不硬编码取凭证的接口路径。
|
|
1217
1271
|
*
|
|
@@ -1343,6 +1397,8 @@ interface ImHostEnvironment {
|
|
|
1343
1397
|
getCoreClient: () => ApiProtocolClient | undefined;
|
|
1344
1398
|
/** 返回 core JSON 部署配置;没有宿主 HTTP Client 时由 SDK 内部创建协议 client。 */
|
|
1345
1399
|
getCoreApi?: () => ImCoreApiOptions | undefined;
|
|
1400
|
+
/** SDK HTTP/业务失败通知;账号与请求有效性由 SDK 检查,提示和登录决策交给宿主。 */
|
|
1401
|
+
onRequestError?: ImRequestErrorHandler;
|
|
1346
1402
|
/** 后端识别客户端与加密密钥范围所需的类型值;PC Web 和 H5 当前使用 `2`。 */
|
|
1347
1403
|
clientType: number;
|
|
1348
1404
|
/** IM 鉴权过期、被踢或被封禁时通知宿主;宿主据此跳转登录页或展示产品弹窗。 */
|
|
@@ -1528,6 +1584,8 @@ interface ImThreadReadActions {
|
|
|
1528
1584
|
/** Managed Headless Surface 首批会向 typed hooks 暴露的用户意图。 */
|
|
1529
1585
|
type ImThreadIntent = Readonly<{
|
|
1530
1586
|
kind: 'load-older';
|
|
1587
|
+
/** 用户滚动触顶或程序自动补页;旧调用方未提供时,不应推断为用户触发。 */
|
|
1588
|
+
source?: 'user-scroll' | 'automatic';
|
|
1531
1589
|
}> | Readonly<{
|
|
1532
1590
|
kind: 'retry-older';
|
|
1533
1591
|
}> | Readonly<{
|
package/dist/chat-kit-vue.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-2GZMQCIP.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-P4HOR4XO.js';import'./chunk-DN4H5C7G.js';import'./chunk-YAM4YHKF.js';import'./chunk-A2BLOVZ5.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,p=0;for(let u of t)u.kind==="video"?p+=1:i+=1;return {imageCount:i,videoCount:p}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:p}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):p["unsupported-body"]!==void 0?p["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let p=wt();function u(o,l){let T=Array.isArray(l)?l:[l];return T.length===1&&isVNode(T[0])?cloneVNode(T[0],{key:o}):h$1(Fragment,{key:o},T)}function m(o){return l=>{p?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{p?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let l=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:l}):i.message!==void 0?i.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:l}):h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:T=>i["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:p$1,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,l=[],T,L,S,D=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,N=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==l.length||A.some((K,Z)=>l[Z]!==K);l=Object.freeze(A),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",l),i("settled",{visibleMessageIds:l,...l.length===0?{}:{newestVisibleMessageId:l[l.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ie(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function ne(){ie(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(T=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,i("reach-start"),ie(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=N,i("reach-end"),ie(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||N===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ie(he)),O&&!Y&&de(),!J&&q$1&&N!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else d(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,ne();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function oe(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function h(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&oe();},Zt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,h();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(oe(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,h();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,y();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),d(),!O&&y());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function te(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,N+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||N===ee||(f!==void 0&&oe(),J=true,e.scrollTop<=ge()&&Oe()&&ae());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),oe(),O=false,q$1=false,Y=false,c=void 0,R=void 0,N+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),y());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,te(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(te(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(te(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;oe();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),ne();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(T,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,ne();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}ne();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ie(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ie(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=T;ie(()=>{m$1.value!==null&&(f!==void 0?(d(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}D=true,ne();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}ne();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),oe(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),p$1({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:p}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,l=null,T="",L="",S="",D=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),N=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,h=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},h);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let h=await d();return t.hooks?.afterAction?.(r,h),h}catch(h){throw t.hooks?.onError?.(r,h),h}}function v(){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older"},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,d=s.value.loadingNewer??s.value.loading;return !O.value||d||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let d=0;d<sr;d+=1){if(!O.value)return;let h=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!h||y!==null||(r==="older"?await v():await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=N.value;S="";let d;try{d=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(h){throw N.value===r&&(S=r),h}return V.value||(l=null,be()),d}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,d){return m.value?.scrollToMessage(r,d)??false}function he(r,d){return !H&&o===d&&N.value===r&&O.value}async function me(r,d,h,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(h,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ie(r,d,h){let y=m.value;if(y===null||!y.isMeasurable()||y.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,d,h,{behavior:"auto",block:"center"})),te=async le=>{if(!he(r,d)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;y.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw y.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&y.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await te("older")&&(C=true),!j&&!await te("newer")&&(j=true);let ve="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await te(le)||(le==="older"?C=true:j=true);}return he(r,d)}async function Be(r,d={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let h=N.value,y=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(h,y))return false}return !await me(h,y,r,{...d,behavior:"auto"})||!await ie(h,y,r)?false:me(h,y,r,d)}function ne(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(ne(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let d=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let h=g[g.length-1];if(h===void 0)return;let y=r.resolveTarget===void 0?h:r.resolveTarget(h);y!=null&&Promise.resolve(r.markRead(y)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},d);}function Oe(r){g=Object.freeze([...r]);let d={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(d);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(d,void 0);}catch(h){throw t.hooks?.onError?.(d,h),h}V.value?Te():be();}function ae(r,d){return !H&&M===d&&N.value===r&&!D}function xe(r,d){ae(r,d)&&(T=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,d,h){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(h,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=N.value,d=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null||T===r&&(L===d||D)||S===r||l!==null)return;if(!Y.value.enabled){T=r,L=d,V.value=true,Te();return}let h=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,h))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,h,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,h)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!ae(r,h)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,h)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,h,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,h);})().catch(()=>{N.value===r&&(S=r);}).finally(()=>{l===y&&(l=null);});l=y;}function se(r){M+=1,l=null,D=false,V.value=r,(T="",L="",S=""),ne();}function Ve(){if(V.value)return;let r=N.value;D=true,M+=1,l=null,T=r,V.value=true,Te();}let oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(oe),watch(J,r=>{r&&V.value?Te():ne();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,N],()=>{let r=m.value;if(r===null||!O.value)return;let d=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(d,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([N,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,d,h,,,y],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&y!==C&&!D&&y.startsWith("located:")&&(T="",L="",V.value=false),r===""){se(false);return}if(h!==null){V.value||se(false);return}d||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:oe},d=[p.header?.(r),p["before-list"]?.(r)];if(!O.value)d.push(p.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(p.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(p.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let h=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:p["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:y=>{let x=s.value.messages.find(C=>C.id===y);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{default:()=>[p["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:p.item,"date-separator":p["date-separator"],"entry-unread":p["entry-unread"],encryption:p.encryption,system:p.system,message:p.message,"recalled-message":p["recalled-message"],"deleted-message":p["deleted-message"],"unsupported-body":p["unsupported-body"]}),p["viewport-after"]?.(r)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[p["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),h])),s.value.error!==null&&d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.push(p["after-list"]?.(r),p["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),p["context-menu"]?.(r),p.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let p=Object.freeze([...i.keys()]);return Object.freeze({kinds:p,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let p=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,p*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),p=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,l=null,T=null,L=null,S=false,D=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&T!==null||l===null)return;let R=l.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(D||S)return;X(),G();let c=l?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},p));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},i));}function N(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){l?.removeEventListener("scroll",Y),T?.disconnect(),L?.disconnect(),T=null,L=null,l=null;}function Q(c=true){if(D)return;let R=t.getRoot();if(!(R===l&&l!==null)){if(ee(),l=R,l===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,D||(Q(false),q());}));return}if(l.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){T=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:l,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())T.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(D)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),T?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){D||(U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),D=true);}}}function pr(t){let i=new Map,p=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(T=>T.channel===I).map(T=>T.item),l=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(l);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;p.set(g,M);let o=false,l=S=>({channel:g,item:S});function T(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,D){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(D===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=l(S);M.set(H,{target:B,element:D}),k.register(B,D);},isRevealed:S=>k.isRevealed(l(S)),isActivated:S=>k.isActivated(l(S)),isSettledVisible:S=>k.isSettledVisible(l(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:T,dispose(){o||(T(),o=true,i.delete(g),p.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of p.values())for(let I of g.values())k.register(I.target,null);p.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
|
|
1
|
+
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-YQSRQ25X.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-HQ7FTY2C.js';import'./chunk-EM4YNWX4.js';import'./chunk-MO2EU56Q.js';import'./chunk-W5SQGPRQ.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,h=0;for(let u of t)u.kind==="video"?h+=1:i+=1;return {imageCount:i,videoCount:h}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:h$2}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):h$2["unsupported-body"]!==void 0?h$2["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let h=wt();function u(o,d){let y=Array.isArray(d)?d:[d];return y.length===1&&isVNode(y[0])?cloneVNode(y[0],{key:o}):h$1(Fragment,{key:o},y)}function m(o){return d=>{h?.registerMessageNode(o,d instanceof HTMLElement?d:null);}}function k(o,d){return y=>{h?.registerDateNode(o,d,y instanceof HTMLElement?y:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let d=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:d})??h$1("div",{ref:d,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let d=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:d}):i.message!==void 0?i.message({item:o,setElement:d}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:d})??h$1("article",{ref:d,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:d})??h$1("article",{ref:d,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:d}):h$1("article",{ref:d,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:y=>i["unsupported-body"]?.(y)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:h,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,d=[],y,L,S,N=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,D=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&N?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&N&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==d.length||A.some((K,Z)=>d[Z]!==K);d=Object.freeze(A),y=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",d),i("settled",{visibleMessageIds:d,...d.length===0?{}:{newestVisibleMessageId:d[d.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ae(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function oe(){ae(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(y=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function te(){Te(),J=false,ee=D,G=true,i("reach-start"),ae(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=D,i("reach-end"),ae(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||D===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,D+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ae(he)),O&&!Y&&de(),!J&&q$1&&D!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else l(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&te(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,oe();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function ie(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function l(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function p$1(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&ie();},Zt);}function T(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,p$1();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(ie(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,p$1();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,T();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),l(),!O&&T());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function re(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,D+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||D===ee||(f!==void 0&&ie(),J=true,e.scrollTop<=ge()&&Oe()&&te());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),ie(),O=false,q$1=false,Y=false,c=void 0,R=void 0,D+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),T());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,re(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){re(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(re(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(re(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;ie();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;ie();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,oe();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),oe();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(y,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,oe();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}oe();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ae(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ae(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=y;ae(()=>{m$1.value!==null&&(f!==void 0?(l(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}N=true,oe();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}oe();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),ie(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),h({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:h}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,d=null,y="",L="",S="",N=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),D=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let l=q.value.activeDateIdleDelay,p=Number.isFinite(l)?Math.max(0,l):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},p);}async function f(r,l){t.hooks?.beforeAction?.(r);try{let p=await l();return t.hooks?.afterAction?.(r,p),p}catch(p){throw t.hooks?.onError?.(r,p),p}}function v(r="automatic"){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older",source:r},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,l=s.value.loadingNewer??s.value.loading;return !O.value||l||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let l=0;l<sr;l+=1){if(!O.value)return;let p=r==="older"?s.value.hasOlder:s.value.hasNewer,T=r==="older"?s.value.olderError:s.value.newerError;if(!p||T!==null||(r==="older"?await v("user-scroll"):await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=D.value,l=++M;d=null,S="";let p;try{p=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(T){throw te(r,l)&&(S=r),T}return te(r,l)&&!V.value&&(d=null,be()),p}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,l){return m.value?.scrollToMessage(r,l)??false}function he(r,l){return !H&&o===l&&D.value===r&&O.value}async function me(r,l,p,T){for(let x=0;x<60;x+=1){if(!he(r,l))return false;if(Me(p,T))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ae(r,l,p){let T=m.value;if(T===null||!T.isMeasurable()||T.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,l,p,{behavior:"auto",block:"center"})),re=async le=>{if(!he(r,l)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;T.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw T.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&T.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await re("older")&&(C=true),!j&&!await re("newer")&&(j=true);let ve="older";for(;he(r,l)&&x<Y.value.maxFillPages&&T.isMeasurable()&&!T.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await re(le)||(le==="older"?C=true:j=true);}return he(r,l)}async function Be(r,l={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let p=D.value,T=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(p,T))return false}return !await me(p,T,r,{...l,behavior:"auto"})||!await ae(p,T,r)?false:me(p,T,r,l)}function oe(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(oe(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let l=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let p=g[g.length-1];if(p===void 0)return;let T=r.resolveTarget===void 0?p:r.resolveTarget(p);T!=null&&Promise.resolve(r.markRead(T)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},l);}function Oe(r){g=Object.freeze([...r]);let l={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(l);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(l,void 0);}catch(p){throw t.hooks?.onError?.(l,p),p}V.value?Te():be();}function te(r,l){return !H&&M===l&&D.value===r&&!N}function xe(r,l){te(r,l)&&(y=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,l,p){for(let T=0;T<60;T+=1){if(!te(r,l))return false;if(m.value?.scrollToMessage(p,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=D.value,l=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null&&s.value.messages.length===0||y===r&&(L===l||N)||S===r||d!==null)return;if(!Y.value.enabled){y=r,L=l,V.value=true,Te();return}let p=++M;N=false,V.value=false;let T=(async()=>{if(await nextTick(),!te(r,p))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,p,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;te(r,p)&&ge<Y.value.maxFillPages&&s.value.error===null&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!te(r,p)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!te(r,p)||!x.isMeasurable())return;let re=s.value.entryUnread;if(re.state==="located"){if(!Q.value.includes(re.firstMessageId)||!await ye(r,p,re.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,p);})().catch(()=>{te(r,p)&&(S=r);}).finally(()=>{d===T&&(d=null);});d=T;}function se(r,l=false){M+=1,d=null,N=false,V.value=r,(y="",L="",l||(S="")),oe();}function Ve(){if(V.value)return;let r=D.value;N=true,M+=1,d=null,y=r,V.value=true,Te();}let ie=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(ie),watch(J,r=>{r&&V.value?Te():oe();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,D],()=>{let r=m.value;if(r===null||!O.value)return;let l=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(l,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([D,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,l,p,,,T],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&T!==C&&!N&&T.startsWith("located:")&&(y="",L="",V.value=false),r===""){se(false);return}if(p!==null&&s.value.messages.length===0){V.value||se(false,true);return}l||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:ie},l=[h.header?.(r),h["before-list"]?.(r)];if(!O.value)l.push(h.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)l.push(h.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)l.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)l.push(h.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let p=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:h["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:T=>{let x=s.value.messages.find(C=>C.id===T);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:T=>{k.value=T;}},{default:()=>[h["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:h.item,"date-separator":h["date-separator"],"entry-unread":h["entry-unread"],encryption:h.encryption,system:h.system,message:h.message,"recalled-message":h["recalled-message"],"deleted-message":h["deleted-message"],"unsupported-body":h["unsupported-body"]}),h["viewport-after"]?.(r)]});l.push(h$1("div",{"data-im-thread-viewport-shell":""},[h["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),p])),s.value.error!==null&&l.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return l.push(h["after-list"]?.(r),h["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),h["context-menu"]?.(r),h.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},l)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let h=Object.freeze([...i.keys()]);return Object.freeze({kinds:h,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let h=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,h*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),h=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,d=null,y=null,L=null,S=false,N=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&y!==null||d===null)return;let R=d.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(N||S)return;X(),G();let c=d?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){N||S||(W(),B=setTimeout(()=>{B=void 0,O();},h));}function Y(){N||(D(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,D(false),q();},i));}function D(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){d?.removeEventListener("scroll",Y),y?.disconnect(),L?.disconnect(),y=null,L=null,d=null;}function Q(c=true){if(N)return;let R=t.getRoot();if(!(R===d&&d!==null)){if(ee(),d=R,d===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,N||(Q(false),q());}));return}if(d.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){y=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:d,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:d,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())y.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(N)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(y?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(y?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),y?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),D(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){N||(U(),W(),D(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),N=true);}}}function pr(t){let i=new Map,h=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(y=>y.channel===I).map(y=>y.item),d=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(d);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;h.set(g,M);let o=false,d=S=>({channel:g,item:S});function y(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,N){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(N===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=d(S);M.set(H,{target:B,element:N}),k.register(B,N);},isRevealed:S=>k.isRevealed(d(S)),isActivated:S=>k.isActivated(d(S)),isSettledVisible:S=>k.isSettledVisible(d(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:y,dispose(){o||(y(),o=true,i.delete(g),h.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of h.values())for(let I of g.values())k.register(I.target,null);h.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
|
package/dist/chat-kit.d.ts
CHANGED
|
@@ -2579,6 +2579,20 @@ interface ApiProtocolUploadProgress {
|
|
|
2579
2579
|
/** 底层 transport 的原始进度事件,供调试或特殊场景读取。 */
|
|
2580
2580
|
event?: unknown;
|
|
2581
2581
|
}
|
|
2582
|
+
/**
|
|
2583
|
+
* 单次请求完成后的安全状态信息,供调用方识别 HTTP 与业务失败。
|
|
2584
|
+
*
|
|
2585
|
+
* 不包含请求头、URL、凭据或响应正文;HTTP 状态与后端业务码分别保留,避免把网络
|
|
2586
|
+
* 失败合成的 502 或纯 HTTP 403 当成服务端业务码。原始响应仍通过请求返回值交付。
|
|
2587
|
+
*/
|
|
2588
|
+
interface ApiProtocolResponseObservation {
|
|
2589
|
+
/** 请求结果所属层;成功收到业务错误信封仍属于 `success`。 */
|
|
2590
|
+
transportStatus: 'success' | 'http_error' | 'network_error' | 'invalid_response';
|
|
2591
|
+
/** 服务端真实 HTTP 状态;未收到响应时不存在。 */
|
|
2592
|
+
httpStatus?: number;
|
|
2593
|
+
/** 仅在真实响应正文是协议信封时提供其 code;不包含客户端合成的错误码。 */
|
|
2594
|
+
businessCode?: number;
|
|
2595
|
+
}
|
|
2582
2596
|
/**
|
|
2583
2597
|
* 单次协议请求的可覆盖项。
|
|
2584
2598
|
*
|
|
@@ -2621,6 +2635,13 @@ interface ApiProtocolRequestOptions {
|
|
|
2621
2635
|
signal?: AbortSignal;
|
|
2622
2636
|
/** 上传进度回调;默认浏览器客户端的 axios transport 支持该能力。 */
|
|
2623
2637
|
onUploadProgress?: (progress: ApiProtocolUploadProgress) => void;
|
|
2638
|
+
/**
|
|
2639
|
+
* 请求完成后调用一次,只提供安全状态字段。回调异常会使请求显式失败,不会转换成网络错误。
|
|
2640
|
+
* 调用方如需检查当前账号是否仍有效,可先保存这些字段,在请求返回后决定是否处理。
|
|
2641
|
+
*/
|
|
2642
|
+
onResponse?: (observation: ApiProtocolResponseObservation) => void | Promise<void>;
|
|
2643
|
+
/** 跳过客户端注入的全局业务处理器,默认 false;由调用方接管当前请求的业务副作用。 */
|
|
2644
|
+
skipBusinessResponseHandler?: boolean;
|
|
2624
2645
|
/**
|
|
2625
2646
|
* 响应解析模式。
|
|
2626
2647
|
* - `'json'`(默认):按 content-type 走 JSON / 文本 / AES-JSON 解析,返回业务响应对象。
|
|
@@ -4527,6 +4548,17 @@ interface ConversationOpenOptions {
|
|
|
4527
4548
|
* 后续 read 事件或新消息不会移动分隔线。
|
|
4528
4549
|
*/
|
|
4529
4550
|
initialPosition?: ConversationInitialPosition;
|
|
4551
|
+
/**
|
|
4552
|
+
* 初始历史加载方式,默认 `blocking`。
|
|
4553
|
+
*
|
|
4554
|
+
* @remarks 两种模式都在句柄交付前把初始窗口和 `entryUnread` 定稿,交付后不会再因本次初始化替换窗口或补填未读锚点,
|
|
4555
|
+
* 因此交付的快照 `loading` 已经结束。区别只在失败处理:`blocking` 下初始历史失败会拒绝 `openConversation`;
|
|
4556
|
+
* `local-first` 先读出本地最新页,之后的远端补齐失败不再拒绝打开,而是保留失败时的当前连续窗口、把失败写入
|
|
4557
|
+
* `error`(`operation` 为 `history.initial`),并把 `first-unread` 的 `entryUnread` 降级为 `unavailable`,
|
|
4558
|
+
* 由调用方用 `history` 动作重试。窗口可能已经定位在历史锚点,`hasNewer` 仍按实际边界返回。
|
|
4559
|
+
* 两种模式下首屏窗口的本地读取失败都拒绝打开,并保留原始异常。
|
|
4560
|
+
*/
|
|
4561
|
+
initialLoad?: 'blocking' | 'local-first';
|
|
4530
4562
|
}
|
|
4531
4563
|
/**
|
|
4532
4564
|
* 产品会话的连续窗口快照;协议 cursor、窗口 id 与 generation 始终保持在 SDK 内部。
|
|
@@ -5419,6 +5451,39 @@ interface ImMembershipJoinResult {
|
|
|
5419
5451
|
outcome: 'joined' | 'waiting';
|
|
5420
5452
|
}
|
|
5421
5453
|
|
|
5454
|
+
/**
|
|
5455
|
+
* SDK 自管 Core JSON / CM HTTP 请求的失败事实,交由宿主决定是否触发全局处理。
|
|
5456
|
+
*
|
|
5457
|
+
* 不包含 URL、响应正文、服务端文案或凭据。`httpStatus` 与 `businessCode` 分别来自 HTTP
|
|
5458
|
+
* 响应和真实业务响应体;网络失败没有 HTTP 状态,合成的 502 不会冒充业务码。
|
|
5459
|
+
* S3、Giphy 和宿主自己发出的请求不属于这两个服务,不会被当作账号认证失败上报。
|
|
5460
|
+
*/
|
|
5461
|
+
interface ImRequestError {
|
|
5462
|
+
/** 返回错误的服务;宿主不能把 CM 成员权限错误等同于 Core 账号失效。 */
|
|
5463
|
+
readonly service: 'core' | 'cm';
|
|
5464
|
+
/** 失败发生在哪一层;同时有 HTTP 和业务失败时,优先标为 `http`。 */
|
|
5465
|
+
readonly kind: 'http' | 'business' | 'network' | 'invalid-response';
|
|
5466
|
+
/** 实际 HTTP 状态;没有收到响应时不存在。 */
|
|
5467
|
+
readonly httpStatus?: number;
|
|
5468
|
+
/** Core 返回的真实业务码;CM protobuf 请求不提供该字段。 */
|
|
5469
|
+
readonly businessCode?: number;
|
|
5470
|
+
}
|
|
5471
|
+
/**
|
|
5472
|
+
* 宿主的全局请求错误入口;SDK 不依据返回值重试、登出或改变原调用的结果。
|
|
5473
|
+
*
|
|
5474
|
+
* 每个失败请求通知一次,重复提示策略由宿主现有全局处理器负责。调用前 SDK 会核对账号、
|
|
5475
|
+
* 实际发送凭据及运行时是否仍有效;异步处理器应在第一次 await 前完成需要当前登录态的决策。
|
|
5476
|
+
* 回调抛错或拒绝只进入 SDK 诊断,不会替换请求本身的失败。不会等待回调中的登录/退出操作,
|
|
5477
|
+
* 避免宿主退出流程等待当前请求时互相阻塞。
|
|
5478
|
+
*
|
|
5479
|
+
* @example
|
|
5480
|
+
* ```ts
|
|
5481
|
+
* const onRequestError: ImRequestErrorHandler = issue => appErrors.handleImRequest(issue)
|
|
5482
|
+
* const client = createImClient({ authProvider, endpointProvider, cache, onRequestError })
|
|
5483
|
+
* ```
|
|
5484
|
+
*/
|
|
5485
|
+
type ImRequestErrorHandler = (issue: ImRequestError) => void | Promise<void>;
|
|
5486
|
+
|
|
5422
5487
|
/**
|
|
5423
5488
|
* 当前账号本地会话与消息的分场景产品搜索运行时。
|
|
5424
5489
|
*
|
|
@@ -5694,6 +5759,8 @@ interface ImClientAdapters {
|
|
|
5694
5759
|
* ```
|
|
5695
5760
|
*/
|
|
5696
5761
|
interface ImClientOptions {
|
|
5762
|
+
/** HTTP/业务失败交给宿主全局处理;SDK 不自动登出,详见 ImRequestErrorHandler。 */
|
|
5763
|
+
onRequestError?: ImRequestErrorHandler;
|
|
5697
5764
|
authProvider: ImAuthProvider;
|
|
5698
5765
|
endpointProvider: ImEndpointProvider;
|
|
5699
5766
|
/** 所有 SDK 自管本地数据与协调名称的宿主前缀;创建 client 时同步校验。 */
|
|
@@ -6401,6 +6468,8 @@ interface ChatRuntimeHostDeps {
|
|
|
6401
6468
|
} | null;
|
|
6402
6469
|
/** 返回 core JSON 部署配置;未提供 core client 时由 SDK 内部协议工厂创建等价 client。 */
|
|
6403
6470
|
getCoreApi?: () => ImCoreApiOptions | undefined;
|
|
6471
|
+
/** HTTP/业务错误交回宿主的全局处理器;Chat Kit 不依据状态码作登录决策。 */
|
|
6472
|
+
onRequestError?: ImRequestErrorHandler;
|
|
6404
6473
|
/** 当前宿主的客户端类型编号,随登录请求上报,PC Web 默认使用自己的固定类型。 */
|
|
6405
6474
|
clientType: number;
|
|
6406
6475
|
/** 获取当前环境的媒体上传下载配置;未启用媒体能力时返回 `undefined`。 */
|
|
@@ -7844,6 +7913,8 @@ interface ImThreadReadActions {
|
|
|
7844
7913
|
/** Managed Headless Surface 首批会向 typed hooks 暴露的用户意图。 */
|
|
7845
7914
|
type ImThreadIntent = Readonly<{
|
|
7846
7915
|
kind: 'load-older';
|
|
7916
|
+
/** 用户滚动触顶或程序自动补页;旧调用方未提供时,不应推断为用户触发。 */
|
|
7917
|
+
source?: 'user-scroll' | 'automatic';
|
|
7847
7918
|
}> | Readonly<{
|
|
7848
7919
|
kind: 'retry-older';
|
|
7849
7920
|
}> | Readonly<{
|
package/dist/chat-kit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-
|
|
1
|
+
export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-HNSTHP6F.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,L as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,K as blockReasonForChannelSession,J as blockReasonForChannelState,Q as blockReasonForGroupState,T as blockReasonForSession,E as canEditMessage,u as canPinChannelMessage,t as canPinGroupMessage,v as canPinMessage,D as canRecallMessage,aa as cancelMediaUpload,O as classifyGifFile,s as createChatRuntime,p as createEmojiMatcher,G as decideConversationAction,I as decideMemberTargetAction,H as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Aa as fetchConversationFileBatch,Ba as fetchConversationImageBatch,ya as fetchConversationMessageBatch,Ca as fetchConversationVideoBatch,Da as fetchConversationVoiceBatch,Ea as fetchNextConversationSearchBatch,da as forwardService,o as hasEmojiCandidate,P as isGifFile,w as isPinnedMessageProtected,X as isVoiceStorageConfigured,M as mediaBatchBudgetBytes,ia as messageService,e as parseUnicodeEmojiCode,na as pinnedMessageService,d as prependRecentEmoji,xa as profileService,W as replaceInterruptedMediaFile,R as requiresConversationEncryption,z as resolveChannelMemberAvatarUrl,y as resolveChannelMemberDisplayName,k as resolveEmojiToken,C as resolveFriendDisplayName,oa as resolveImProfileAccessDestination,x as resolveMemberDisplayName,r as resolveMessageNotificationDecision,B as resolvePublicNickname,A as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ba as retryMessage,N as runMediaSendBatch,$ as sendAsFilesBatch,F as sendBlockReasonForDecision,Z as sendMediaAlbum,V as sendMediaFile,_ as sendMediaFilesBatch,U as sendText,Y as sendVoice,S as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-FUEAUHMC.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-YQSRQ25X.js';import'./chunk-HQ7FTY2C.js';import'./chunk-EM4YNWX4.js';import'./chunk-MO2EU56Q.js';export{pa as canTransmit,na as canTransmitByType,oa as canTransmitContent,ma as requiresForwardTypeConfirmation}from'./chunk-W5SQGPRQ.js';import'./chunk-WOT6VMZA.js';
|