k2-im 0.1.17 → 0.1.19
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.js +1 -1
- package/dist/chat-kit-pinia.d.ts +80 -17
- package/dist/chat-kit-pinia.js +1 -1
- package/dist/chat-kit-vue.d.ts +80 -17
- package/dist/chat-kit-vue.js +1 -1
- package/dist/chat-kit.d.ts +81 -18
- package/dist/chat-kit.js +1 -1
- package/dist/chunk-CD5SF7WI.js +1 -0
- package/dist/{chunk-VYHK4LIZ.js → chunk-KLEMN4CG.js} +1 -1
- package/dist/{chunk-RT3IRN3M.js → chunk-NBLASAT2.js} +1 -1
- package/dist/chunk-NVF5RDHB.js +2 -0
- package/dist/chunk-ULJD6ZA3.js +7 -0
- package/dist/chunk-W2FKET4Z.js +1 -0
- package/dist/{chunk-C6HKXQPW.js → chunk-YPS6Y5ZY.js} +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +133 -21
- package/dist/index.js +1 -1
- package/dist/sdk.d.ts +132 -20
- package/dist/sdk.js +1 -1
- package/package.json +1 -3
- package/dist/chunk-FA3RKHIR.js +0 -2
- package/dist/chunk-GBIHVXZP.js +0 -1
- package/dist/chunk-K6P5ZYHG.js +0 -7
- package/dist/chunk-KTWXKQ4J.js +0 -1
package/dist/chat-kit-vue.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Ref, Component } from 'vue';
|
|
|
3
3
|
/** IM 领域支持的 5 个展示 locale(与宿主规范 locale 一致)。 */
|
|
4
4
|
type ImLocale = 'en-US' | 'th-TH' | 'vi-VN' | 'zh-CN' | 'zh-TW';
|
|
5
5
|
|
|
6
|
-
/**
|
|
6
|
+
/** 媒体业务类型:实现据此选对象存储逻辑桶;sticker 对应 app-sticker。 */
|
|
7
7
|
type MediaKind = 'image' | 'video' | 'voice' | 'file' | 'sticker';
|
|
8
8
|
|
|
9
9
|
/** 会话类型。P0 只用 direct / group。 */
|
|
@@ -919,20 +919,75 @@ interface ApiProtocolResponse<T = unknown> {
|
|
|
919
919
|
*/
|
|
920
920
|
type ApiProtocolClient = <T = unknown>(path: string, options?: ApiProtocolRequestOptions) => Promise<ApiProtocolResponse<T>>;
|
|
921
921
|
|
|
922
|
-
/**
|
|
923
|
-
interface
|
|
922
|
+
/** 服务端按逻辑桶签发的 S3 临时上传凭证(已归一为 SDK 合同字段)。 */
|
|
923
|
+
interface MediaUploadCredentials {
|
|
924
|
+
/** STS access key id(服务端字段 `access_key_id`)。 */
|
|
925
|
+
accessKeyId: string;
|
|
926
|
+
/** STS secret access key(服务端字段 `secret_key`)。 */
|
|
927
|
+
secretAccessKey: string;
|
|
928
|
+
/** STS session token(服务端字段 `session_token`)。 */
|
|
929
|
+
sessionToken: string;
|
|
930
|
+
/** 服务端声明的过期时间(Unix 秒);缺省时该凭证只受 SDK 本地 TTL 约束。 */
|
|
931
|
+
expiresAtSeconds?: number;
|
|
932
|
+
/** 服务端解析出的**物理桶**名,可能与申请用的逻辑桶名不同;PutObject 必须用它。 */
|
|
924
933
|
bucket: string;
|
|
925
|
-
|
|
934
|
+
/** 物理桶所在区域,决定上传端点;不再从身份池 id 前缀推断。 */
|
|
935
|
+
region: string;
|
|
936
|
+
/** 对象 key 前缀;STS 策略只允许写该前缀下的对象,SDK 生成的 key 必须以它开头。 */
|
|
937
|
+
keyPrefix?: string;
|
|
938
|
+
/** 公开访问域名(已归一为带 scheme、无尾斜杠);写进消息体的媒体 URL 以它为准。 */
|
|
939
|
+
dnsPoint: string;
|
|
940
|
+
/** 服务端身份标识;SDK 不使用,仅原样透出供宿主排查。 */
|
|
941
|
+
identityId?: string;
|
|
942
|
+
}
|
|
943
|
+
/** SDK 向宿主申请凭证时给出的上下文。 */
|
|
944
|
+
interface MediaUploadCredentialsRequest {
|
|
945
|
+
/** 宿主 env 配置的**逻辑桶名**;宿主原样提交给自己的 BFF。 */
|
|
946
|
+
bucket: string;
|
|
947
|
+
/** true 表示 SDK 判定旧凭证不可用(上传被拒或已过期),宿主必须真的重新请求,不得返回自己的缓存。 */
|
|
948
|
+
forceRefresh: boolean;
|
|
926
949
|
}
|
|
950
|
+
/**
|
|
951
|
+
* 宿主注入的取凭证函数:按逻辑桶名向宿主自己的 BFF 申请一次 STS 临时凭证。
|
|
952
|
+
*
|
|
953
|
+
* @remarks 这里刻意不带 `AbortSignal`:同一逻辑桶的并发上传会共用同一次在途请求,
|
|
954
|
+
* 单个上传被取消不应连带中止其它上传正在等待的凭证。宿主实现应当是「打一次接口」的纯函数,
|
|
955
|
+
* 缓存、TTL、单飞与失败重签由 SDK 负责。
|
|
956
|
+
*/
|
|
957
|
+
type MediaUploadCredentialsProvider = (request: MediaUploadCredentialsRequest) => Promise<MediaUploadCredentials>;
|
|
958
|
+
|
|
927
959
|
interface MediaTransferAdapterConfig {
|
|
928
|
-
/**
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
960
|
+
/**
|
|
961
|
+
* 按**逻辑桶名**申请 S3 临时上传凭证;由宿主实现(打自己的 BFF),SDK 不硬编码接口路径与前缀。
|
|
962
|
+
* 缓存、TTL、同桶单飞与失败重签由本 adapter 负责,宿主实现应当是「打一次接口」的纯函数。
|
|
963
|
+
*/
|
|
964
|
+
getUploadCredentials: MediaUploadCredentialsProvider;
|
|
965
|
+
/** 各媒体类型的**逻辑桶名**(宿主 env 配置,如 image→app-image);物理桶以服务端回包为准。 */
|
|
966
|
+
buckets: Record<MediaKind, string>;
|
|
967
|
+
/**
|
|
968
|
+
* CHANNEL(社群)会话按媒体类型覆盖的逻辑桶名;未覆盖的类型继续使用 `buckets`。
|
|
969
|
+
* iOS 与 prod H5 都为社群媒体准备了独立桶,但对「社群文件是否也走社群桶」结论相反,
|
|
970
|
+
* 因此这里只提供按类型覆盖的机制,由部署配置决定覆盖哪些类型。
|
|
971
|
+
*/
|
|
972
|
+
channelBuckets?: Partial<Record<MediaKind, string>>;
|
|
973
|
+
/** 群、社群与用户头像使用的独立 app-header 逻辑桶名;不得复用聊天图片桶。 */
|
|
974
|
+
avatarBucket?: string;
|
|
975
|
+
/** 是否启用 S3 Transfer Acceleration(默认 true;`cn-` 分区没有加速端点,会强制关闭)。 */
|
|
935
976
|
useAccelerateEndpoint?: boolean;
|
|
977
|
+
/**
|
|
978
|
+
* 是否允许超过分片阈值(16MiB)的上传使用 S3 分片上传(默认 true)。
|
|
979
|
+
*
|
|
980
|
+
* 分片相比单次 PUT 需要各物理桶的 CORS 额外放行 POST(Create/CompleteMultipartUpload)、
|
|
981
|
+
* DELETE(AbortMultipartUpload)并 `ExposeHeaders: ETag`;未配齐时分片会直接失败。
|
|
982
|
+
* 部署可置 false 立即退回全量单次 PutObject(大文件回到单连接与整包内存的旧行为),无需发版。
|
|
983
|
+
*/
|
|
984
|
+
multipartUpload?: boolean;
|
|
985
|
+
/**
|
|
986
|
+
* 大于 16MiB 的明文/simple 文件是否尝试 Range 并发下载(默认 true)。
|
|
987
|
+
* 需要下载域名支持 Range,并暴露 Content-Range 与强 ETag;返回 200 时消费完整响应并记录诊断。
|
|
988
|
+
* 置 false 使用单次 GET。此开关不改变上传或整文件 TEA 的行为。
|
|
989
|
+
*/
|
|
990
|
+
rangeDownload?: boolean;
|
|
936
991
|
/**
|
|
937
992
|
* 媒体发送阶段的并发上限;由 im-core 消费,adapter 本身仍只负责单个上传任务。
|
|
938
993
|
* 缺省为 4,允许 1-6;高并发会提高吞吐,也会增加文件加密的内存峰值。
|
|
@@ -1072,12 +1127,20 @@ interface ImDebugOptions {
|
|
|
1072
1127
|
}
|
|
1073
1128
|
|
|
1074
1129
|
/**
|
|
1075
|
-
* 媒体对象存储(S3)配置:由宿主注入的**部署基建配置**,SDK
|
|
1076
|
-
*
|
|
1077
|
-
*
|
|
1078
|
-
*
|
|
1079
|
-
*
|
|
1080
|
-
*
|
|
1130
|
+
* 媒体对象存储(S3)配置:由宿主注入的**部署基建配置**,SDK 不硬编码逻辑桶名,也不硬编码取凭证的接口路径。
|
|
1131
|
+
*
|
|
1132
|
+
* 形状 = im-browser `MediaTransferAdapterConfig`:必填 `getUploadCredentials`(按逻辑桶名向宿主自己的 BFF 申请
|
|
1133
|
+
* STS 临时凭证)+ 各 `MediaKind`(image/video/voice/file/sticker)的**逻辑桶名** + 可选 `channelBuckets`(社群会话
|
|
1134
|
+
* 按类型覆盖)、`avatarBucket`、`useAccelerateEndpoint`、`multipartUpload`、`maxConcurrentUploads`。
|
|
1135
|
+
*
|
|
1136
|
+
* 上传凭证由业务后端按登录态签发(与 iOS、prod H5 同一个接口),回包同时给出**物理桶**、区域、`key_prefix` 和
|
|
1137
|
+
* 公开访问域名;SDK 据此拼 object key 与消息体 URL,宿主 env 里配的只是申请凭证用的逻辑桶名。凭证缓存(本地
|
|
1138
|
+
* 1 小时、按服务端过期时间提前 5 分钟失效)、同桶单飞与失败重签由 SDK 负责,宿主只需提供「打一次接口」的纯函数。
|
|
1139
|
+
*
|
|
1140
|
+
* ⚠ 各 bucket 需在对象存储侧配置 CORS 允许本站 origin 的 PUT + GET;超过 16MiB 的上传走 S3 分片,另需放行
|
|
1141
|
+
* POST(Create/CompleteMultipartUpload)、DELETE(AbortMultipartUpload)并 ExposeHeaders: ETag。CORS 未配齐时
|
|
1142
|
+
* 可用 `multipartUpload: false` 退回全量单次 PutObject。
|
|
1143
|
+
* ⚠ 并发字段只由 SDK core 的媒体编排消费;adapter 会忽略该字段。高内存设备可设置 5-6,低内存设备建议 2-3。
|
|
1081
1144
|
*/
|
|
1082
1145
|
type ImMediaConfig = MediaTransferAdapterConfig;
|
|
1083
1146
|
/**
|
package/dist/chat-kit-vue.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-VYHK4LIZ.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-C6HKXQPW.js';import'./chunk-FA3RKHIR.js';import'./chunk-K6P5ZYHG.js';import'./chunk-KTWXKQ4J.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){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}),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 yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function _t(){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:a,slots:h$2}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...a,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:a}){let h=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=>{h?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{h?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return a.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return a["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return a["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 a.item!==void 0?a.item({item:o,setElement:l}):a.message!==void 0?a.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?a["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?a["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"&&a.system!==void 0?a.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":a["unsupported-body"]===void 0?void 0:T=>a["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return a.item!==void 0?u(o.key,a.item({item:o})):u(o.key,w(o));case "date-separator":return a.item!==void 0?u(o.key,a.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return a.item!==void 0?u(o.key,a.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Qt=500,Ee=.5,Zt=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:a,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,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,p$1,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,a("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 ve(e=t.messageIds){return e.flatMap(n=>{let i=w.get(n);if(i===void 0)return [];let b=i.getBoundingClientRect(),E=i.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:E?.getBoundingClientRect().top??b.top}]})}function Ae(e="",n=1){let i=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=i,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(i));}function Me(){Ae();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,A])=>e.contains(A.element)).map(([A,K])=>{let Z=K.element.getBoundingClientRect();return {key:A,label:K.label,top:Z.top,height:Z.height}}).sort((A,K)=>A.top-K.top),i=e.getBoundingClientRect(),b=n.find(A=>A.height>0)?.height??28,E=g({markers:n,viewportTop:i.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(E===null){Me(),a("active-date-change",null);return}Ae(E.inlineDateKey,E.inlineOpacity),a("active-date-change",E);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),i=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=ve(i);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let E=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),A=E.length!==l.length||E.some((K,Z)=>l[Z]!==K);l=Object.freeze(E),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(E),P.value=$(e),A&&a("visible-range",l),a("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 i=[...V];V.clear(),i.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(),i=o(ve(),{top:n.top,bottom:n.bottom});i!==void 0&&(T=i);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,a("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,a("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,i=U,b=false;if(i!==void 0){let A=Math.abs(n-i.targetTop)<=Ee;b=i.behavior==="smooth"||A,(i.behavior!=="smooth"||A)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let E=O&&!b&&n!==o$1;if(E&&(a("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 A=r();A!==void 0&&(f.expectedOffset=A);}else d(),x();Oe()&&E&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),E&&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,i=k.value;if(!(n===void 0||i===null)){if(n.visualOffset=Math.abs(e)<=Ee?0:e,n.visualOffset===0){i.style.removeProperty("transform"),i.style.removeProperty("will-change");return}i.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),i.style.setProperty("will-change","transform");}}function oe(){p$1!==void 0&&(clearTimeout(p$1),p$1=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 i=ve().find(b=>b.id===n.anchor.id);if(i!==void 0)return (i.anchorTop??i.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let i=e.expectedOffset-n;Math.abs(i)<=Ee||(Ve(e.visualOffset+i),e.committed=false,e.attempts=0);}function v(){p$1!==void 0&&clearTimeout(p$1),p$1=setTimeout(()=>{p$1=void 0,!(O||f?.committed!==true)&&oe();},Qt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let i=n.visualOffset;if(Math.abs(i)<=Ee){n.committed=true,v();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),E=Math.min(b,Math.max(0,e.scrollTop-i));if(se(E),e.scrollTop=E,Math.abs(e.scrollTop-E)>Ee){U=void 0,n.committed=false,n.attempts+=1,n.attempts<Zt?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,v();}function x(){p$1!==void 0&&clearTimeout(p$1),p$1=setTimeout(()=>{p$1=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 i=n.getBoundingClientRect(),b=q(e,ve(),{top:i.top,bottom:i.bottom});if(b!==void 0){let E=Math.max(0,n.scrollHeight-n.clientHeight),A=Math.min(E,Math.max(0,n.scrollTop+b));se(A),n.scrollTop=A,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 pe(){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?pe():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?pe():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?pe():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?pe():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let i=Math.max(0,n.scrollHeight-n.clientHeight);se(i,e),n.scrollTo?.({top:i,behavior:e}),n.scrollTop!==i&&(n.scrollTop=i),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function At(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let i=m$1.value,b=w.get(e);if(i===null||b===void 0||!i.contains(b)||i.clientHeight<=0)return false;oe();let E=i.getBoundingClientRect(),A=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=i.scrollTop+A.top-E.top:K==="end"?Z=i.scrollTop+A.bottom-E.bottom:K==="nearest"?A.top>=E.top&&A.bottom<=E.bottom?Z=i.scrollTop:A.top<E.top?Z=i.scrollTop+A.top-E.top:Z=i.scrollTop+A.bottom-E.bottom:Z=j({currentScrollTop:i.scrollTop,scrollHeight:i.scrollHeight,targetHeight:A.height,targetTop:A.top,viewportHeight:i.clientHeight,viewportTop:E.top});let Ne=Math.max(0,i.scrollHeight-i.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),i.scrollTo?.({top:we,behavior:Se}),i.scrollTop!==we&&(i.scrollTop=we),o$1=i.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let i=w.get(e);if(i!==void 0&&i!==n&&(S?.unobserve(i),L?.unobserve?.(i),g$1.delete(i),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,i){let b=M.get(e);if(i===null){M.delete(e);return}M.set(e,{element:i,label:n}),W===e&&i.style.setProperty("opacity",String(X)),b?.element!==i&&(i.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let i=m$1.value;i!==null&&(o$1=i.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let i=m$1.value;if(i===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let A=i.getBoundingClientRect(),K=p(T,ve(),{top:A.top,bottom:A.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 i of n){let b=g$1.get(i.target);b!==void 0&&(i.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();}),h({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:At,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 rr(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 nr(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}),ar=8,sr=160;function lr(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var dr=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:h}){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(()=>lr(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="");},sr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,v=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},v);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let v=await d();return t.hooks?.afterAction?.(r,v),v}catch(v){throw t.hooks?.onError?.(r,v),v}}function p(){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<ar;d+=1){if(!O.value)return;let v=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!v||y!==null||(r==="older"?await p():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(v){throw N.value===r&&(S=r),v}return V.value||(l=null,be()),d}async function ve(){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 Ae(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,v,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(v,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,v){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,v,{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 p(),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 pe="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=pe==="older"?C?"newer":"older":j?"older":"newer";pe=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 v=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(v,y))return false}return !await me(v,y,r,{...d,behavior:"auto"})||!await ie(v,y,r)?false:me(v,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 v=g[g.length-1];if(v===void 0)return;let y=r.resolveTarget===void 0?v:r.resolveTarget(v);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(v){throw t.hooks?.onError?.(d,v),v}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,v){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(v,{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 v=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,v))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,v,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,v)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await p(),!ae(r,v)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,v)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,v,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,v);})().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:p,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:ve,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return a(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,v,,,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(v!==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=[h.header?.(r),h["before-list"]?.(r)];if(!O.value)d.push(h.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(h.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(h.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let v=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: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:Ae,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{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)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[h["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),v])),s.value.error!==null&&d.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.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},d)}}});function ur(t){let a=new Map;for(let u of t){if(a.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);a.set(u.kind,u.component);}let h=Object.freeze([...a.keys()]);return Object.freeze({kinds:h,resolve:u=>a.get(u)})}var fr=140,mr=120;function Et(t,a){if(t.width<=0||t.height<=0)return 0;let h=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),u=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,h*u/(t.width*t.height))}function gr(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 $e(t){let a=Math.max(0,t.scrollIdleMs??fr),h=Math.max(0,t.visibilityDwellMs??mr),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=gr(R,m);for(let[p,P]of w){let z=p.getBoundingClientRect();P.ratio=Et(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?Et(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(p=>p.key));if(R.size!==o.size||[...R].some(p=>!o.has(p))){o.clear();for(let p of R)o.add(p);t.onSettledVisibleChange?.(c.map(p=>p.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(([,p])=>s(p)).sort(([p],[P])=>{let z=p.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,p])=>p);J(f);for(let p of f)M.has(p.key)||(M.add(p.key),t.onActivated?.(p.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},h));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},a));}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 p of f){let P=w.get(p.target);P!==void 0&&(P.intersecting=p.isIntersecting,P.ratio=p.intersectionRatio,m===0&&(P.revealIntersecting=p.isIntersecting&&p.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let p of f){let P=w.get(p.target);P!==void 0&&(P.revealIntersecting=p.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),p=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(),p&&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 a=new Map,h=new Map,u=false,m=g=>{let I=a.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 a.values())I.onScrollingChange?.(g);},onRevealed:g=>a.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>a.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of a){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(a.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);a.set(g,I);let M=new Map;h.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,a.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(),a.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,dr as ImThreadSurface,qe as ImThreadViewport,rr as createImThreadSurfaceContext,ur as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,nr as provideImThreadSurfaceContext,Ht as useImText,Ge as useImThreadSurfaceContext,_t as useOptionalImThreadReadActions};
|
|
1
|
+
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-KLEMN4CG.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-YPS6Y5ZY.js';import'./chunk-NVF5RDHB.js';import'./chunk-ULJD6ZA3.js';import'./chunk-W2FKET4Z.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){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}),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 yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function _t(){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:a,slots:h$2}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...a,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:a}){let h=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=>{h?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{h?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return a.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return a["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return a["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 a.item!==void 0?a.item({item:o,setElement:l}):a.message!==void 0?a.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?a["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?a["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"&&a.system!==void 0?a.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":a["unsupported-body"]===void 0?void 0:T=>a["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return a.item!==void 0?u(o.key,a.item({item:o})):u(o.key,w(o));case "date-separator":return a.item!==void 0?u(o.key,a.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return a.item!==void 0?u(o.key,a.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Qt=500,Ee=.5,Zt=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:a,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,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,p$1,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,a("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 ve(e=t.messageIds){return e.flatMap(n=>{let i=w.get(n);if(i===void 0)return [];let b=i.getBoundingClientRect(),E=i.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:E?.getBoundingClientRect().top??b.top}]})}function Ae(e="",n=1){let i=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=i,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(i));}function Me(){Ae();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,A])=>e.contains(A.element)).map(([A,K])=>{let Z=K.element.getBoundingClientRect();return {key:A,label:K.label,top:Z.top,height:Z.height}}).sort((A,K)=>A.top-K.top),i=e.getBoundingClientRect(),b=n.find(A=>A.height>0)?.height??28,E=g({markers:n,viewportTop:i.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(E===null){Me(),a("active-date-change",null);return}Ae(E.inlineDateKey,E.inlineOpacity),a("active-date-change",E);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),i=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=ve(i);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let E=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),A=E.length!==l.length||E.some((K,Z)=>l[Z]!==K);l=Object.freeze(E),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(E),P.value=$(e),A&&a("visible-range",l),a("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 i=[...V];V.clear(),i.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(),i=o(ve(),{top:n.top,bottom:n.bottom});i!==void 0&&(T=i);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,a("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,a("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,i=U,b=false;if(i!==void 0){let A=Math.abs(n-i.targetTop)<=Ee;b=i.behavior==="smooth"||A,(i.behavior!=="smooth"||A)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let E=O&&!b&&n!==o$1;if(E&&(a("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 A=r();A!==void 0&&(f.expectedOffset=A);}else d(),x();Oe()&&E&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),E&&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,i=k.value;if(!(n===void 0||i===null)){if(n.visualOffset=Math.abs(e)<=Ee?0:e,n.visualOffset===0){i.style.removeProperty("transform"),i.style.removeProperty("will-change");return}i.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),i.style.setProperty("will-change","transform");}}function oe(){p$1!==void 0&&(clearTimeout(p$1),p$1=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 i=ve().find(b=>b.id===n.anchor.id);if(i!==void 0)return (i.anchorTop??i.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let i=e.expectedOffset-n;Math.abs(i)<=Ee||(Ve(e.visualOffset+i),e.committed=false,e.attempts=0);}function v(){p$1!==void 0&&clearTimeout(p$1),p$1=setTimeout(()=>{p$1=void 0,!(O||f?.committed!==true)&&oe();},Qt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let i=n.visualOffset;if(Math.abs(i)<=Ee){n.committed=true,v();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),E=Math.min(b,Math.max(0,e.scrollTop-i));if(se(E),e.scrollTop=E,Math.abs(e.scrollTop-E)>Ee){U=void 0,n.committed=false,n.attempts+=1,n.attempts<Zt?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,v();}function x(){p$1!==void 0&&clearTimeout(p$1),p$1=setTimeout(()=>{p$1=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 i=n.getBoundingClientRect(),b=q(e,ve(),{top:i.top,bottom:i.bottom});if(b!==void 0){let E=Math.max(0,n.scrollHeight-n.clientHeight),A=Math.min(E,Math.max(0,n.scrollTop+b));se(A),n.scrollTop=A,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 pe(){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?pe():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?pe():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?pe():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?pe():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let i=Math.max(0,n.scrollHeight-n.clientHeight);se(i,e),n.scrollTo?.({top:i,behavior:e}),n.scrollTop!==i&&(n.scrollTop=i),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function At(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let i=m$1.value,b=w.get(e);if(i===null||b===void 0||!i.contains(b)||i.clientHeight<=0)return false;oe();let E=i.getBoundingClientRect(),A=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=i.scrollTop+A.top-E.top:K==="end"?Z=i.scrollTop+A.bottom-E.bottom:K==="nearest"?A.top>=E.top&&A.bottom<=E.bottom?Z=i.scrollTop:A.top<E.top?Z=i.scrollTop+A.top-E.top:Z=i.scrollTop+A.bottom-E.bottom:Z=j({currentScrollTop:i.scrollTop,scrollHeight:i.scrollHeight,targetHeight:A.height,targetTop:A.top,viewportHeight:i.clientHeight,viewportTop:E.top});let Ne=Math.max(0,i.scrollHeight-i.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),i.scrollTo?.({top:we,behavior:Se}),i.scrollTop!==we&&(i.scrollTop=we),o$1=i.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let i=w.get(e);if(i!==void 0&&i!==n&&(S?.unobserve(i),L?.unobserve?.(i),g$1.delete(i),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,i){let b=M.get(e);if(i===null){M.delete(e);return}M.set(e,{element:i,label:n}),W===e&&i.style.setProperty("opacity",String(X)),b?.element!==i&&(i.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let i=m$1.value;i!==null&&(o$1=i.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let i=m$1.value;if(i===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let A=i.getBoundingClientRect(),K=p(T,ve(),{top:A.top,bottom:A.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 i of n){let b=g$1.get(i.target);b!==void 0&&(i.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();}),h({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:At,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 rr(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 nr(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}),ar=8,sr=160;function lr(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var dr=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:h}){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(()=>lr(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="");},sr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,v=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},v);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let v=await d();return t.hooks?.afterAction?.(r,v),v}catch(v){throw t.hooks?.onError?.(r,v),v}}function p(){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<ar;d+=1){if(!O.value)return;let v=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!v||y!==null||(r==="older"?await p():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(v){throw N.value===r&&(S=r),v}return V.value||(l=null,be()),d}async function ve(){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 Ae(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,v,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(v,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,v){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,v,{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 p(),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 pe="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=pe==="older"?C?"newer":"older":j?"older":"newer";pe=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 v=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(v,y))return false}return !await me(v,y,r,{...d,behavior:"auto"})||!await ie(v,y,r)?false:me(v,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 v=g[g.length-1];if(v===void 0)return;let y=r.resolveTarget===void 0?v:r.resolveTarget(v);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(v){throw t.hooks?.onError?.(d,v),v}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,v){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(v,{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 v=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,v))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,v,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,v)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await p(),!ae(r,v)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,v)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,v,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,v);})().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:p,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:ve,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return a(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,v,,,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(v!==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=[h.header?.(r),h["before-list"]?.(r)];if(!O.value)d.push(h.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(h.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(h.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let v=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: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:Ae,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{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)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[h["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),v])),s.value.error!==null&&d.push(h.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.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},d)}}});function ur(t){let a=new Map;for(let u of t){if(a.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);a.set(u.kind,u.component);}let h=Object.freeze([...a.keys()]);return Object.freeze({kinds:h,resolve:u=>a.get(u)})}var fr=140,mr=120;function Et(t,a){if(t.width<=0||t.height<=0)return 0;let h=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),u=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,h*u/(t.width*t.height))}function gr(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 $e(t){let a=Math.max(0,t.scrollIdleMs??fr),h=Math.max(0,t.visibilityDwellMs??mr),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=gr(R,m);for(let[p,P]of w){let z=p.getBoundingClientRect();P.ratio=Et(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?Et(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(p=>p.key));if(R.size!==o.size||[...R].some(p=>!o.has(p))){o.clear();for(let p of R)o.add(p);t.onSettledVisibleChange?.(c.map(p=>p.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(([,p])=>s(p)).sort(([p],[P])=>{let z=p.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,p])=>p);J(f);for(let p of f)M.has(p.key)||(M.add(p.key),t.onActivated?.(p.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},h));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},a));}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 p of f){let P=w.get(p.target);P!==void 0&&(P.intersecting=p.isIntersecting,P.ratio=p.intersectionRatio,m===0&&(P.revealIntersecting=p.isIntersecting&&p.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let p of f){let P=w.get(p.target);P!==void 0&&(P.revealIntersecting=p.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),p=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(),p&&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 a=new Map,h=new Map,u=false,m=g=>{let I=a.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 a.values())I.onScrollingChange?.(g);},onRevealed:g=>a.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>a.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of a){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(a.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);a.set(g,I);let M=new Map;h.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,a.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(),a.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,dr as ImThreadSurface,qe as ImThreadViewport,rr as createImThreadSurfaceContext,ur as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,nr as provideImThreadSurfaceContext,Ht as useImText,Ge as useImThreadSurfaceContext,_t as useOptionalImThreadReadActions};
|
package/dist/chat-kit.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** IM 领域支持的 5 个展示 locale(与宿主规范 locale 一致)。 */
|
|
2
2
|
type ImLocale = 'en-US' | 'th-TH' | 'vi-VN' | 'zh-CN' | 'zh-TW';
|
|
3
3
|
|
|
4
|
-
/**
|
|
4
|
+
/** 媒体业务类型:实现据此选对象存储逻辑桶;sticker 对应 app-sticker。 */
|
|
5
5
|
type MediaKind = 'image' | 'video' | 'voice' | 'file' | 'sticker';
|
|
6
6
|
|
|
7
7
|
/** 会话类型。P0 只用 direct / group。 */
|
|
@@ -2589,20 +2589,75 @@ interface MembershipJoinResult {
|
|
|
2589
2589
|
outcome: MembershipJoinOutcome;
|
|
2590
2590
|
}
|
|
2591
2591
|
|
|
2592
|
-
/**
|
|
2593
|
-
interface
|
|
2592
|
+
/** 服务端按逻辑桶签发的 S3 临时上传凭证(已归一为 SDK 合同字段)。 */
|
|
2593
|
+
interface MediaUploadCredentials {
|
|
2594
|
+
/** STS access key id(服务端字段 `access_key_id`)。 */
|
|
2595
|
+
accessKeyId: string;
|
|
2596
|
+
/** STS secret access key(服务端字段 `secret_key`)。 */
|
|
2597
|
+
secretAccessKey: string;
|
|
2598
|
+
/** STS session token(服务端字段 `session_token`)。 */
|
|
2599
|
+
sessionToken: string;
|
|
2600
|
+
/** 服务端声明的过期时间(Unix 秒);缺省时该凭证只受 SDK 本地 TTL 约束。 */
|
|
2601
|
+
expiresAtSeconds?: number;
|
|
2602
|
+
/** 服务端解析出的**物理桶**名,可能与申请用的逻辑桶名不同;PutObject 必须用它。 */
|
|
2594
2603
|
bucket: string;
|
|
2595
|
-
|
|
2604
|
+
/** 物理桶所在区域,决定上传端点;不再从身份池 id 前缀推断。 */
|
|
2605
|
+
region: string;
|
|
2606
|
+
/** 对象 key 前缀;STS 策略只允许写该前缀下的对象,SDK 生成的 key 必须以它开头。 */
|
|
2607
|
+
keyPrefix?: string;
|
|
2608
|
+
/** 公开访问域名(已归一为带 scheme、无尾斜杠);写进消息体的媒体 URL 以它为准。 */
|
|
2609
|
+
dnsPoint: string;
|
|
2610
|
+
/** 服务端身份标识;SDK 不使用,仅原样透出供宿主排查。 */
|
|
2611
|
+
identityId?: string;
|
|
2612
|
+
}
|
|
2613
|
+
/** SDK 向宿主申请凭证时给出的上下文。 */
|
|
2614
|
+
interface MediaUploadCredentialsRequest {
|
|
2615
|
+
/** 宿主 env 配置的**逻辑桶名**;宿主原样提交给自己的 BFF。 */
|
|
2616
|
+
bucket: string;
|
|
2617
|
+
/** true 表示 SDK 判定旧凭证不可用(上传被拒或已过期),宿主必须真的重新请求,不得返回自己的缓存。 */
|
|
2618
|
+
forceRefresh: boolean;
|
|
2596
2619
|
}
|
|
2620
|
+
/**
|
|
2621
|
+
* 宿主注入的取凭证函数:按逻辑桶名向宿主自己的 BFF 申请一次 STS 临时凭证。
|
|
2622
|
+
*
|
|
2623
|
+
* @remarks 这里刻意不带 `AbortSignal`:同一逻辑桶的并发上传会共用同一次在途请求,
|
|
2624
|
+
* 单个上传被取消不应连带中止其它上传正在等待的凭证。宿主实现应当是「打一次接口」的纯函数,
|
|
2625
|
+
* 缓存、TTL、单飞与失败重签由 SDK 负责。
|
|
2626
|
+
*/
|
|
2627
|
+
type MediaUploadCredentialsProvider = (request: MediaUploadCredentialsRequest) => Promise<MediaUploadCredentials>;
|
|
2628
|
+
|
|
2597
2629
|
interface MediaTransferAdapterConfig {
|
|
2598
|
-
/**
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2630
|
+
/**
|
|
2631
|
+
* 按**逻辑桶名**申请 S3 临时上传凭证;由宿主实现(打自己的 BFF),SDK 不硬编码接口路径与前缀。
|
|
2632
|
+
* 缓存、TTL、同桶单飞与失败重签由本 adapter 负责,宿主实现应当是「打一次接口」的纯函数。
|
|
2633
|
+
*/
|
|
2634
|
+
getUploadCredentials: MediaUploadCredentialsProvider;
|
|
2635
|
+
/** 各媒体类型的**逻辑桶名**(宿主 env 配置,如 image→app-image);物理桶以服务端回包为准。 */
|
|
2636
|
+
buckets: Record<MediaKind, string>;
|
|
2637
|
+
/**
|
|
2638
|
+
* CHANNEL(社群)会话按媒体类型覆盖的逻辑桶名;未覆盖的类型继续使用 `buckets`。
|
|
2639
|
+
* iOS 与 prod H5 都为社群媒体准备了独立桶,但对「社群文件是否也走社群桶」结论相反,
|
|
2640
|
+
* 因此这里只提供按类型覆盖的机制,由部署配置决定覆盖哪些类型。
|
|
2641
|
+
*/
|
|
2642
|
+
channelBuckets?: Partial<Record<MediaKind, string>>;
|
|
2643
|
+
/** 群、社群与用户头像使用的独立 app-header 逻辑桶名;不得复用聊天图片桶。 */
|
|
2644
|
+
avatarBucket?: string;
|
|
2645
|
+
/** 是否启用 S3 Transfer Acceleration(默认 true;`cn-` 分区没有加速端点,会强制关闭)。 */
|
|
2605
2646
|
useAccelerateEndpoint?: boolean;
|
|
2647
|
+
/**
|
|
2648
|
+
* 是否允许超过分片阈值(16MiB)的上传使用 S3 分片上传(默认 true)。
|
|
2649
|
+
*
|
|
2650
|
+
* 分片相比单次 PUT 需要各物理桶的 CORS 额外放行 POST(Create/CompleteMultipartUpload)、
|
|
2651
|
+
* DELETE(AbortMultipartUpload)并 `ExposeHeaders: ETag`;未配齐时分片会直接失败。
|
|
2652
|
+
* 部署可置 false 立即退回全量单次 PutObject(大文件回到单连接与整包内存的旧行为),无需发版。
|
|
2653
|
+
*/
|
|
2654
|
+
multipartUpload?: boolean;
|
|
2655
|
+
/**
|
|
2656
|
+
* 大于 16MiB 的明文/simple 文件是否尝试 Range 并发下载(默认 true)。
|
|
2657
|
+
* 需要下载域名支持 Range,并暴露 Content-Range 与强 ETag;返回 200 时消费完整响应并记录诊断。
|
|
2658
|
+
* 置 false 使用单次 GET。此开关不改变上传或整文件 TEA 的行为。
|
|
2659
|
+
*/
|
|
2660
|
+
rangeDownload?: boolean;
|
|
2606
2661
|
/**
|
|
2607
2662
|
* 媒体发送阶段的并发上限;由 im-core 消费,adapter 本身仍只负责单个上传任务。
|
|
2608
2663
|
* 缺省为 4,允许 1-6;高并发会提高吞吐,也会增加文件加密的内存峰值。
|
|
@@ -5241,12 +5296,20 @@ interface ImEmojiCatalogEntry {
|
|
|
5241
5296
|
}
|
|
5242
5297
|
|
|
5243
5298
|
/**
|
|
5244
|
-
* 媒体对象存储(S3)配置:由宿主注入的**部署基建配置**,SDK
|
|
5245
|
-
*
|
|
5246
|
-
*
|
|
5247
|
-
*
|
|
5248
|
-
*
|
|
5249
|
-
*
|
|
5299
|
+
* 媒体对象存储(S3)配置:由宿主注入的**部署基建配置**,SDK 不硬编码逻辑桶名,也不硬编码取凭证的接口路径。
|
|
5300
|
+
*
|
|
5301
|
+
* 形状 = im-browser `MediaTransferAdapterConfig`:必填 `getUploadCredentials`(按逻辑桶名向宿主自己的 BFF 申请
|
|
5302
|
+
* STS 临时凭证)+ 各 `MediaKind`(image/video/voice/file/sticker)的**逻辑桶名** + 可选 `channelBuckets`(社群会话
|
|
5303
|
+
* 按类型覆盖)、`avatarBucket`、`useAccelerateEndpoint`、`multipartUpload`、`maxConcurrentUploads`。
|
|
5304
|
+
*
|
|
5305
|
+
* 上传凭证由业务后端按登录态签发(与 iOS、prod H5 同一个接口),回包同时给出**物理桶**、区域、`key_prefix` 和
|
|
5306
|
+
* 公开访问域名;SDK 据此拼 object key 与消息体 URL,宿主 env 里配的只是申请凭证用的逻辑桶名。凭证缓存(本地
|
|
5307
|
+
* 1 小时、按服务端过期时间提前 5 分钟失效)、同桶单飞与失败重签由 SDK 负责,宿主只需提供「打一次接口」的纯函数。
|
|
5308
|
+
*
|
|
5309
|
+
* ⚠ 各 bucket 需在对象存储侧配置 CORS 允许本站 origin 的 PUT + GET;超过 16MiB 的上传走 S3 分片,另需放行
|
|
5310
|
+
* POST(Create/CompleteMultipartUpload)、DELETE(AbortMultipartUpload)并 ExposeHeaders: ETag。CORS 未配齐时
|
|
5311
|
+
* 可用 `multipartUpload: false` 退回全量单次 PutObject。
|
|
5312
|
+
* ⚠ 并发字段只由 SDK core 的媒体编排消费;adapter 会忽略该字段。高内存设备可设置 5-6,低内存设备建议 2-3。
|
|
5250
5313
|
*/
|
|
5251
5314
|
type ImMediaConfig = MediaTransferAdapterConfig;
|
|
5252
5315
|
/**
|
|
@@ -7239,7 +7302,7 @@ declare function replaceInterruptedMediaFile(runtime: ChatRuntime, input: {
|
|
|
7239
7302
|
conversationId: string;
|
|
7240
7303
|
conversationType: ConversationType;
|
|
7241
7304
|
}, hooks: SendCommandHooks): Promise<boolean>;
|
|
7242
|
-
/**
|
|
7305
|
+
/** 判断部署配置是否提供语音逻辑桶名;缺失时录音入口和最终发送都应明确禁用。 */
|
|
7243
7306
|
declare function isVoiceStorageConfigured(runtime: ChatRuntime): boolean;
|
|
7244
7307
|
/**
|
|
7245
7308
|
* 发送录音器产出的语音消息。
|
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-NBLASAT2.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,K as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,J as blockReasonForChannelSession,I as blockReasonForChannelState,O as blockReasonForGroupState,R as blockReasonForSession,D as canEditMessage,t as canPinChannelMessage,s as canPinGroupMessage,u as canPinMessage,C as canRecallMessage,Z as cancelMediaUpload,r as createChatRuntime,p as createEmojiMatcher,F as decideConversationAction,H as decideMemberTargetAction,G as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,xa as fetchConversationFileBatch,ya as fetchConversationImageBatch,va as fetchConversationMessageBatch,za as fetchConversationVideoBatch,Aa as fetchConversationVoiceBatch,Ba as fetchNextConversationSearchBatch,aa as forwardService,o as hasEmojiCandidate,N as isGifFile,v as isPinnedMessageProtected,V as isVoiceStorageConfigured,L as mediaBatchBudgetBytes,fa as messageService,e as parseUnicodeEmojiCode,ka as pinnedMessageService,d as prependRecentEmoji,ua as profileService,U as replaceInterruptedMediaFile,P as requiresConversationEncryption,y as resolveChannelMemberAvatarUrl,x as resolveChannelMemberDisplayName,k as resolveEmojiToken,B as resolveFriendDisplayName,la as resolveImProfileAccessDestination,w as resolveMemberDisplayName,A as resolvePublicNickname,z as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,_ as retryMessage,M as runMediaSendBatch,Y as sendAsFilesBatch,E as sendBlockReasonForDecision,T as sendMediaFile,X as sendMediaFilesBatch,S as sendText,W as sendVoice,Q as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-CD5SF7WI.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-KLEMN4CG.js';import'./chunk-YPS6Y5ZY.js';import'./chunk-NVF5RDHB.js';import'./chunk-ULJD6ZA3.js';export{ma as canTransmit,ka as canTransmitByType,la as canTransmitContent,ja as requiresForwardTypeConfirmation}from'./chunk-W2FKET4Z.js';import'./chunk-WOT6VMZA.js';
|