k2-im 0.1.35 → 0.1.37

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.
@@ -24,6 +24,8 @@ interface ConversationRef<TType extends ConversationType = ConversationType> {
24
24
  conversationType: TType;
25
25
  conversationId: string;
26
26
  }
27
+ /** 当前支持持久化草稿的会话类型;`supergroup` 必须继续 fail-fast。 */
28
+ type DraftConversationType = Exclude<ConversationType, 'supergroup'>;
27
29
  /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);未知 wire 正文统一归一为 unknown。 */
28
30
  type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'unknown';
29
31
  /**
@@ -184,6 +186,8 @@ interface ImVideoBody {
184
186
  width: number;
185
187
  /** 视频像素高(BMessage.height)。 */
186
188
  height: number;
189
+ /** 发送方显式选择了 HD 原视频(BMessage.hd);不按分辨率猜测。 */
190
+ hd?: boolean;
187
191
  /** 时长(秒,可含小数);移动端旧消息的毫秒值由 SDK 转换,宿主不得猜单位。 */
188
192
  duration?: number;
189
193
  /** SDK 已确认时长为秒的标记;兼容旧缓存时防止重复转换。缺省仍按公开 API 的秒约定传入。 */
@@ -705,6 +709,8 @@ interface ImMessage {
705
709
  serverTime?: number;
706
710
  /** P0 默认 'unread'。 */
707
711
  receipt: MessageReceipt;
712
+ /** 离线单聊服务端标记当前账号已在其它端读过;仅用于本地未读投影,不改变对端回执 receipt。 */
713
+ readBySelf?: boolean;
708
714
  encryption: ImMessageEncryption;
709
715
  /** 群消息 @ 提及(仅群 @ 消息有;解析自 MESGrpChat 明文字段 + extend)。展示走 resolveMentionSegments。 */
710
716
  mention?: ImMessageMention;
@@ -722,7 +728,7 @@ interface ImMessage {
722
728
  };
723
729
  /**
724
730
  * CHANNEL 管理员/社群主全员删除终态。它与发送者本人撤回、`deleteLocal` 完全不同:服务端通过
725
- * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空,产品统一展示“管理员删除了一条消息”。
731
+ * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空;线程与会话摘要仅向群主、管理员展示删除提示,普通成员及未知角色隐藏。
726
732
  */
727
733
  deletedForEveryone?: {
728
734
  by: string;
@@ -902,6 +908,15 @@ interface ImSession {
902
908
  * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 落盘时剔除)。
903
909
  */
904
910
  lastMessageSendState?: 'sending' | 'failed';
911
+ /**
912
+ * 最新一条己方已发送消息的回执态。
913
+ *
914
+ * 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
915
+ * `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
916
+ * 该字段随最新消息变化,并随会话落盘,避免冷启动后
917
+ * 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
918
+ */
919
+ lastMessageReceipt?: 'unread' | 'read';
905
920
  /** P0 我方已读游标(见 §4.3)。 */
906
921
  readCursor?: string;
907
922
  /** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
@@ -1237,6 +1252,22 @@ interface MediaTransferAdapterConfig {
1237
1252
  * 未知正文显式投影为 `unknown`,不能猜成文本。这里也集中生成稳定 SDK 错误,供所有产品域统一暴露。
1238
1253
  */
1239
1254
 
1255
+ /** 产品错误的大类;宿主按稳定 code/category 决策,不解析底层异常文案。 */
1256
+ type ImSdkErrorCategory = 'auth' | 'network' | 'protocol' | 'permission' | 'validation' | 'state' | 'unsupported' | 'contract';
1257
+ /**
1258
+ * 产品层稳定错误形状。
1259
+ *
1260
+ * @remarks `cause` 只用于诊断,不是 UI 决策合同;协议 command、HTTP path 与服务端原始 payload 不进入该结构。
1261
+ */
1262
+ interface ImSdkErrorShape {
1263
+ code: string;
1264
+ category: ImSdkErrorCategory;
1265
+ operation: string;
1266
+ retryable: boolean;
1267
+ conversation?: ConversationRef;
1268
+ details?: Readonly<Record<string, unknown>>;
1269
+ cause?: unknown;
1270
+ }
1240
1271
  /** 一种表情回应的稳定聚合;不包含内部事件 ID 或协议字段。 */
1241
1272
  interface ImMessageReactionAggregate {
1242
1273
  emoji: string;
@@ -1276,10 +1307,30 @@ interface ImMessageViewBody extends Omit<ImMessageBody, 'image' | 'video' | 'voi
1276
1307
  * `sortKey`、原始协议 `raw`、包含 history cursor 的 `extensions` 以及媒体 key。定位和下载必须继续
1277
1308
  * 通过绑定精确 `ConversationRef` 的 SDK handle/capability 完成,UI 不得从 DTO 恢复内部字段。
1278
1309
  */
1279
- type ImMessageView = Readonly<Omit<ImMessage, 'sortKey' | 'raw' | 'extensions' | 'body' | 'reactions'> & {
1310
+ type ImMessageView = Readonly<Omit<ImMessage, 'sortKey' | 'raw' | 'extensions' | 'body' | 'reactions' | 'readBySelf'> & {
1280
1311
  body: ImMessageViewBody;
1281
1312
  reactions?: ImMessageReactions;
1282
1313
  }>;
1314
+ /** 结构化 mention 输入;direct handle 接收该形状但在 GROUP sibling 接入前显式返回 unsupported。 */
1315
+ interface MentionInput {
1316
+ userId: string;
1317
+ displayName: string;
1318
+ }
1319
+
1320
+ /**
1321
+ * 当前账号草稿的产品 DTO、跨组件 API 与 handle 绑定门面。
1322
+ * 草稿按复合会话身份串行持久化,SDK DomainState 是唯一真相;附件尚未闭合时非空输入明确拒绝。
1323
+ */
1324
+
1325
+ /** 当前产品草稿实体;只包含可持久化的 text/mention/reply,附件集合固定为空。 */
1326
+ interface ConversationDraft {
1327
+ ref: ConversationRef<DraftConversationType>;
1328
+ text: string;
1329
+ mentions: readonly MentionInput[];
1330
+ replyToMessageId?: string;
1331
+ attachments: readonly [];
1332
+ updatedAt: number;
1333
+ }
1283
1334
 
1284
1335
  /**
1285
1336
  * 将 Core 会话列表投影成 default 产品 DTO 和可订阅原子快照。
@@ -1300,6 +1351,55 @@ type ConversationEntryUnreadSnapshot = Readonly<{
1300
1351
  }> | Readonly<{
1301
1352
  state: 'unavailable';
1302
1353
  }>;
1354
+ /** 进入时冻结的导航提示;数量独立于会话已读,不暴露内部历史排序边界。 */
1355
+ type ConversationEntryUnreadNavigation = Readonly<{
1356
+ state: 'none';
1357
+ }> | Readonly<{
1358
+ state: 'pending' | 'unavailable';
1359
+ count: number;
1360
+ }> | Readonly<{
1361
+ state: 'located';
1362
+ count: number;
1363
+ firstMessageId: string;
1364
+ }> | Readonly<{
1365
+ state: 'failed';
1366
+ count: number;
1367
+ error: ImSdkErrorShape;
1368
+ }>;
1369
+
1370
+ /**
1371
+ * 绑定单个精确会话的产品句柄与独立连续消息窗口。
1372
+ * 句柄提供历史、消息、草稿、已读和免打扰动作;SDK/DomainState 仍拥有消息真相,关闭只释放窗口和订阅。
1373
+ * direct、GROUP、CHANNEL 使用 sibling 工厂,`supergroup` 不会 fallback。
1374
+ */
1375
+
1376
+ /** 当前已接线的产品 handle 会话类型;三者只在无会话语义原子层复用。 */
1377
+ type ProductHandleConversationType = 'direct' | 'group' | 'channel' | 'robot';
1378
+ /**
1379
+ * 产品会话的连续窗口快照;协议 cursor、窗口 id 与 generation 始终保持在 SDK 内部。
1380
+ *
1381
+ * @template TType 已注册 handle 的精确会话类型。
1382
+ */
1383
+ interface ConversationHandleSnapshot<TType extends ProductHandleConversationType = ProductHandleConversationType> {
1384
+ ref: ConversationRef<TType>;
1385
+ /** 已校验的聊天标题与头像;即使尚无会话列表项,宿主也可正常展示聊天头部。 */
1386
+ display?: Readonly<{
1387
+ title: string;
1388
+ avatar?: string;
1389
+ }>;
1390
+ messages: readonly ImMessageView[];
1391
+ /** 本次打开时冻结的未读入口;只用于产品 UI 分隔线,不作为 SDK 已读真相。 */
1392
+ entryUnread: ConversationEntryUnreadSnapshot;
1393
+ /** 显式请求的进入导航快照;旧消费者不请求时省略。 */
1394
+ entryUnreadNavigation?: ConversationEntryUnreadNavigation;
1395
+ /** 当前账号本机草稿;不承诺跨端同步。 */
1396
+ draft: ConversationDraft | null;
1397
+ loading: boolean;
1398
+ stale: boolean;
1399
+ hasOlder: boolean;
1400
+ hasNewer: boolean;
1401
+ error?: ImSdkErrorShape;
1402
+ }
1303
1403
 
1304
1404
  /**
1305
1405
  * SDK 对外的结构化诊断投影、过滤与 sink 装配。
@@ -1606,6 +1706,8 @@ interface ImThreadInitialViewportOptions {
1606
1706
  maxFillPages?: number;
1607
1707
  }
1608
1708
  /** 结构 slots 可调用的稳定 Surface actions。 */
1709
+ /** 区分定位完成、目标不可显示与用户取消,避免把正常中断误报为失败。 */
1710
+ type ImThreadEntryUnreadNavigationResult = 'located' | 'unavailable' | 'cancelled';
1609
1711
  interface ImThreadSurfaceSlotActions {
1610
1712
  /** 返回 Surface 唯一滚动根,供宿主媒体观察等平台能力复用;宿主不得建立第二套滚动控制器。 */
1611
1713
  getViewportElement: () => HTMLElement | null;
@@ -1614,6 +1716,8 @@ interface ImThreadSurfaceSlotActions {
1614
1716
  loadNewer: () => Promise<number>;
1615
1717
  retryNewer: () => Promise<number>;
1616
1718
  jumpToLatest: () => Promise<boolean>;
1719
+ /** 返回本次进入前的未读边界,与实时已读数量无关。 */
1720
+ jumpToEntryUnread: () => Promise<ImThreadEntryUnreadNavigationResult>;
1617
1721
  /** 在当前已加载窗口内定位消息;找不到或布局不可测时返回 false。 */
1618
1722
  scrollToMessage: (messageId: string, options?: ScrollIntoViewOptions) => boolean;
1619
1723
  /** 必要时先替换为目标附近窗口,再等待真实消息节点登记并完成定位。 */
@@ -1633,6 +1737,13 @@ interface ImThreadViewportSettledSnapshot {
1633
1737
  }
1634
1738
  /** Surface initial controller 可调用的无产品语义滚动能力。 */
1635
1739
  interface ImThreadViewportExposed {
1740
+ /** 将已登记的未读分割线居中;历史边缘按真实内容范围限制滚动,不补空白。 */
1741
+ scrollToEntryUnread: () => boolean;
1742
+ /** 测量分割线两侧是否各有半屏内容,供 Surface 决定是否继续加载对应历史。节点尚未注册时返回 null。 */
1743
+ getEntryUnreadCenteringNeeds: () => {
1744
+ older: boolean;
1745
+ newer: boolean;
1746
+ } | null;
1636
1747
  /** 返回 Surface 自己持有的唯一滚动根,供宿主媒体观察等平台能力复用;调用方不得修改其所有权。 */
1637
1748
  getViewportElement: () => HTMLElement | null;
1638
1749
  /** 清空当前视口维护的未见消息集合。 */
@@ -1730,6 +1841,10 @@ type ImThreadIntent = Readonly<{
1730
1841
  kind: 'load-newer';
1731
1842
  }> | Readonly<{
1732
1843
  kind: 'jump-to-latest';
1844
+ }> | Readonly<{
1845
+ kind: 'jump-to-entry-unread';
1846
+ }> | Readonly<{
1847
+ kind: 'mark-conversation-read';
1733
1848
  }> | Readonly<{
1734
1849
  kind: 'locate-message';
1735
1850
  messageId: string;
@@ -1752,6 +1867,8 @@ interface ImThreadSurfaceState {
1752
1867
  messages: readonly ImMessageView[];
1753
1868
  /** 打开会话时冻结的首条未读入口。 */
1754
1869
  entryUnread: ConversationEntryUnreadSnapshot;
1870
+ /** 存在时使用最新首屏与独立历史未读胶囊。 */
1871
+ entryUnreadNavigation?: ConversationHandleSnapshot['entryUnreadNavigation'];
1755
1872
  /** handle 首次快照是否已经可用。 */
1756
1873
  ready: boolean;
1757
1874
  /** 当前是否正在执行窗口操作。 */
@@ -1781,6 +1898,12 @@ interface ImThreadSurfaceState {
1781
1898
  }
1782
1899
  /** Surface 可以调用的共享 Thread actions;网络、窗口和 Outbox 真相仍由上游 Store/SDK 持有。 */
1783
1900
  interface ImThreadSurfaceActions {
1901
+ /** 按 SDK 本次进入前的冻结边界读取首未读窗口。 */
1902
+ loadEntryUnread?: () => Promise<boolean>;
1903
+ /** 可阅读页面的整会话结算,与实际可见回执独立。 */
1904
+ markConversationRead?: () => Promise<void>;
1905
+ /** 已确认可见的全部消息 ID,不代表整个游标区间。 */
1906
+ markVisibleMessages?: (messageIds: readonly string[]) => Promise<void>;
1784
1907
  /** 请求一页更早历史;返回实际新增消息数。 */
1785
1908
  loadOlder: (options?: {
1786
1909
  force?: boolean;
@@ -1915,4 +2038,4 @@ interface ThreadVisibilityTargetGroup<TItem> {
1915
2038
  declare function createThreadVisibilityTargetGroup<TItem>(groupOptions: ThreadVisibilityTargetGroupOptions): ThreadVisibilityTargetGroup<TItem>;
1916
2039
 
1917
2040
  export { ImThreadBodySwitch, ImThreadItems, ImThreadSurface, ImThreadViewport, createImThreadSurfaceContext, createMessageRendererRegistry, createThreadVisibilityTargetGroup, createThreadVisibilityTargets, provideImThreadSurfaceContext, useImText, useImThreadSurfaceContext, useOptionalImThreadReadActions };
1918
- export type { ImHostEnvironment, ImHostSession, ImMessageRendererRegistration, ImMessageRendererRegistry, ImTextContext, ImThreadActiveDateSlotState, ImThreadInitialViewportOptions, ImThreadSurfaceActions, ImThreadSurfaceContext, ImThreadSurfaceHooks, ImThreadSurfaceSlotActions, ImThreadSurfaceState, ImThreadViewportExposed, ImThreadViewportOptions, ImThreadViewportSettledSnapshot, ThreadVisibilityTargetGroup, ThreadVisibilityTargetGroupOptions, ThreadVisibilityTargets, ThreadVisibilityTargetsFactory, ThreadVisibilityTargetsOptions };
2041
+ export type { ImHostEnvironment, ImHostSession, ImMessageRendererRegistration, ImMessageRendererRegistry, ImTextContext, ImThreadActiveDateSlotState, ImThreadEntryUnreadNavigationResult, ImThreadInitialViewportOptions, ImThreadSurfaceActions, ImThreadSurfaceContext, ImThreadSurfaceHooks, ImThreadSurfaceSlotActions, ImThreadSurfaceState, ImThreadViewportExposed, ImThreadViewportOptions, ImThreadViewportSettledSnapshot, ThreadVisibilityTargetGroup, ThreadVisibilityTargetGroupOptions, ThreadVisibilityTargets, ThreadVisibilityTargetsFactory, ThreadVisibilityTargetsOptions };
@@ -1 +1 @@
1
- import {h,C,p,i,q,m,z,B,o,j,g}from'./chunk-BIE4T7BJ.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-PEI5RIM7.js';import'./chunk-DHHXLOOH.js';import'./chunk-EBZORU2A.js';import'./chunk-6OC4FEH7.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 Gt(t){let o=0,g=0;for(let u of t)u.kind==="video"?g+=1:o+=1;return {imageCount:o,videoCount:g}}function zt(t){return {systemMessage:o=>o.body.system!==void 0?g$1(o.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:o=>i$1(o.contentType,{locale:t.locale(),durationMs:o.body.voice?.durationMs,stickerImageType:o.body.sticker?.imageType,gameType:o.body.game?.gameType,callKind:o.body.call?.callKind,...o.body.filesAlbum===void 0?{}:{filesAlbum:{count:o.body.filesAlbum.items.length,caption:o.body.filesAlbum.caption}},...o.body.mediaAlbum===void 0?{}:{mediaAlbum:Gt(o.body.mediaAlbum.items)}}),lastMessage:o=>o.lastMessageSummary!==void 0?h$2(o.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):o.lastMessagePreview,failureText:o=>o.failure?.displayCode!==void 0?f(o.failure.displayCode,{locale:t.locale(),mediaKind:o.failure.mediaKind,params:o.failure.params}):o.failure?.message??""}}var Ot=Symbol("ImThreadReadActions");function Vt(t){provide(Ot,t);}function Xt(){return inject(Ot,void 0)}var ze=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:o,slots:g}){return Vt(t.readActions),()=>{let u=h(t.message),f=t.rendererRegistry.resolve(u);return f!==void 0?h$1(f,{...o,message:t.message,presentation:t.presentation}):g["unsupported-body"]!==void 0?g["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ye=Symbol("ImThreadViewportRegistration");function Nt(){return inject(Ye,void 0)}var $e=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:o}){let g=Nt();function u(i,d){let w=Array.isArray(d)?d:[d];return w.length===1&&isVNode(w[0])?cloneVNode(w[0],{key:i}):h$1(Fragment,{key:i},w)}function f(i){return d=>{g?.registerMessageNode(i,d instanceof HTMLElement?d:null);}}function C(i,d){return w=>{g?.registerDateNode(i,d,w instanceof HTMLElement?w:null);}}function U(i){return o.encryption?.({item:i})??h$1("div",{"data-im-thread-encryption":i.key})}function h(i){let d=C(i.key,i.label);return o["date-separator"]?.({item:i,setElement:d})??h$1("div",{ref:d,"data-im-thread-date-separator":i.key},i.label)}function A(i){return o["entry-unread"]?.({item:i})??h$1("div",{"data-im-thread-entry-unread":i.key,...i.count===void 0?{}:{"data-count":String(i.count)}})}function m(i){let d=f(i.message.id);return o.item!==void 0?o.item({item:i,setElement:d}):o.message!==void 0?o.message({item:i,setElement:d}):i.message.deletedForEveryone!==void 0?o["deleted-message"]?.({item:i,setElement:d})??h$1("article",{ref:d,"data-im-thread-message-id":i.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):i.message.recalled!==void 0?o["recalled-message"]?.({item:i,setElement:d})??h$1("article",{ref:d,"data-im-thread-message-id":i.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):i.kind==="system"&&o.system!==void 0?o.system({item:i,setElement:d}):h$1("article",{ref:d,"data-im-thread-message-id":i.message.id,"data-first-of-run":i.kind==="message"?String(i.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(ze,{message:i.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":o["unsupported-body"]===void 0?void 0:w=>o["unsupported-body"]?.(w)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(i=>{switch(i.kind){case "encryption":return o.item!==void 0?u(i.key,o.item({item:i})):u(i.key,U(i));case "date-separator":return o.item!==void 0?u(i.key,o.item({item:i,setElement:C(i.key,i.label)})):u(i.key,h(i));case "entry-unread":return o.item!==void 0?u(i.key,o.item({item:i})):u(i.key,A(i));case "system":case "message":return u(i.key,m(i))}return i}))}});var Lt=120,lr=500,Ae=.5,dr=8;function Xe(t){let o=t.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(o!==void 0&&Number.isFinite(o)&&o>0?o:1)}var Je=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:o$1,expose:g$1,slots:u}){let f=ref(null),C$1=ref(null),U=new Map,h=new Map,A=new Set,m$1=new Map,i=0,d=[],w,_,x,P,G=false,S,Y=new Set,$=false,N,ne="",s=1,z$1=false,ie=false,K=true,L=false,Z=false,B$1=false,ee=0,te=-1,he=-1,F,ae,X,k,W,oe=ref(true),p$1=ref(0),T=C(e=>{p$1.value=e,o$1("new-message-count",e);});function v(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function H(e=t.messageIds){return e.flatMap(n=>{let a=U.get(n);if(a===void 0)return [];let y=a.getBoundingClientRect(),I=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:y.top,bottom:y.bottom,anchorTop:I?.getBoundingClientRect().top??y.top}]})}function b(e="",n=1){let a=Math.min(1,Math.max(0,n));ne!==""&&ne!==e&&m$1.get(ne)?.element.style.removeProperty("opacity"),ne=e,s=a,e!==""&&m$1.get(e)?.element.style.setProperty("opacity",String(a));}function J(){b();}function E(){let e=f.value;if($||e===null||!t.activeDateEnabled)return;let n=[...m$1.entries()].filter(([,V])=>e.contains(V.element)).map(([V,D])=>{let Q=D.element.getBoundingClientRect();return {key:V,label:D.label,top:Q.top,height:Q.height}}).sort((V,D)=>V.top-D.top),a=e.getBoundingClientRect(),y=n.find(V=>V.height>0)?.height??28,I=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:y});if(I===null){J(),o$1("active-date-change",null);return}b(I.inlineDateKey,I.inlineOpacity),o$1("active-date-change",I);}function j$1(e){_={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight};}function Oe(e){let n=_;if(n===void 0)return false;let a=Math.max(0,e.scrollHeight-e.clientHeight);return a<n.scrollHeight-n.height&&n.scrollTop>a&&Math.abs(e.scrollTop-a)<=Xe(e)}function Ke(e){return Oe(e)||N!==void 0&&(N.behavior==="smooth"||Math.abs(e.scrollTop-N.targetTop)<=Xe(e))?0:e.scrollTop-i}function Se(e,n){n!==0&&(i=e.scrollTop-n,N=void 0,l());}function be(e,n){let a=Ke(e);if(k!==void 0)return k.expectedOffset-=a,q$1(),Se(e,a),L||me(),false;let y=_;if(y===void 0)return false;let I=w,V=I===void 0?void 0:H([I.id])[0],D=e.scrollTop-y.scrollTop,Q=Oe(e)?0:D,Pe=I===void 0||V===void 0?0:(V.anchorTop??V.top)-n.top-I.offset+D;return y.scrollHeight!==e.scrollHeight||y.width!==e.clientWidth||y.height!==e.clientHeight||Math.abs(Pe)>Ae?(_=void 0,!z$1&&!t.loadingNewer&&t.resizeFollowEnabled&&oe.value&&Math.abs(Q)<=Ae?(Fe(),true):(I!==void 0&&we({...I,offset:I.offset-Q}),Se(e,a),false)):false}function Re(){let e=f.value;if($||e===null)return;let n=e.getBoundingClientRect();if(be(e,n))return;let a=P!==void 0&&G?t.messageIds.filter(D=>A.has(D)):t.messageIds,y=H(a);if(P!==void 0&&G&&y.length===0){oe.value=v(e);return}let I=y.filter(D=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:D.top,messageBottom:D.bottom,margin:t.visibleMargin})).map(D=>D.id),V=I.length!==d.length||I.some((D,Q)=>d[Q]!==D);d=Object.freeze(I),w=o(y,{top:n.top,bottom:n.bottom}),j$1(e),T.acknowledgeVisible(I),oe.value=v(e),V&&o$1("visible-range",d),o$1("settled",{visibleMessageIds:d,...d.length===0?{}:{newestVisibleMessageId:d[d.length-1]},isAtBottom:oe.value,newMessageCount:p$1.value});}function re(e){if(Y.add(e),S!==void 0)return;let n=()=>{S=void 0;let a=[...Y];Y.clear(),a.forEach(y=>y());};typeof globalThis.requestAnimationFrame=="function"?S=globalThis.requestAnimationFrame(n):S=globalThis.setTimeout(n,0);}function qe(){S!==void 0&&(typeof S=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(S):globalThis.clearTimeout(S),S=void 0,Y.clear());}function se(){re(Re);}function Ce(){let e=f.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(H(),{top:n.top,bottom:n.bottom});a!==void 0&&(w=a,j$1(e));}function Ie(){return K&&k===void 0&&!ie&&!t.loadingOlder}function fe(){Ce(),K=false,te=ee,ie=true,o$1("reach-start"),re(()=>{t.loadingOlder||(ie=false);});}function Ne(e){return t.hasNewer&&!z$1&&!t.loadingOlder&&!t.loadingNewer&&v(e)}function Ve(){z$1=true,oe.value=false,he=ee,o$1("reach-end"),re(()=>{t.loadingNewer||(z$1=false);});}function r(){let e=f.value;e===null||ee===he||!Ne(e)||Ve();}function l(){let e=f.value;if($||e===null)return;let n=e.scrollTop,a=Oe(e),y=N,I=false;if(y!==void 0){let D=Math.abs(n-y.targetTop)<=Xe(e);I=y.behavior==="smooth"||D,(y.behavior!=="smooth"||D)&&(N=void 0);}!I&&!a&&!L&&k===void 0&&n!==i&&(L=true,Z=true,ee+=1);let V=L&&!I&&!a&&n!==i;if(V&&(o$1("user-scroll"),re(E)),L&&!B$1&&Me(),!K&&Z&&ee!==te&&n<i&&n>ke()&&(K=true),k!==void 0&&!I)if(L){let D=O();D!==void 0&&(k.expectedOffset=D);}else q$1(),me();Ie()&&V&&n>=0&&m({previousScrollTop:i,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&fe(),V&&Ne(e)&&z({previousScrollTop:i,currentScrollTop:n,isAtBottom:v(e),isHistoryWindow:t.hasNewer,isPageSettling:I})&&Ve(),i=n,se();}function c(e,n="auto"){N={targetTop:e,behavior:n};}function R(e){let n=k,a=C$1.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 M(){W!==void 0&&(clearTimeout(W),W=void 0),k!==void 0&&k.visualOffset!==0&&(w=void 0,_=void 0);let e=C$1.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),k=void 0,N=void 0;}function O(){let e=f.value,n=k;if(e===null||n===void 0)return;let a=H().find(y=>y.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function q$1(){let e=k,n=O();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(R(e.visualOffset+a),e.committed=false,e.attempts=0);}function ue(){W!==void 0&&clearTimeout(W),W=setTimeout(()=>{W=void 0,!(L||k?.committed!==true)&&M();},lr);}function de(){let e=f.value,n=k;if($||e===null||n===void 0||L)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,ue();return}let y=Math.max(0,e.scrollHeight-e.clientHeight),I=Math.min(y,Math.max(0,e.scrollTop-a));if(c(I),e.scrollTop=I,Math.abs(e.scrollTop-I)>Ae){N=void 0,n.committed=false,n.attempts+=1,n.attempts<dr?me():(M(),N=void 0,i=e.scrollTop);return}R(0),i=e.scrollTop,n.expectedOffset=O()??n.expectedOffset,n.committed=true,n.attempts=0,ue();}function me(){W!==void 0&&clearTimeout(W),W=setTimeout(()=>{W=void 0,de();},Lt);}function ve(e){e!==void 0&&(k===void 0&&(k={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),q$1(),!L&&de());}function we(e){let n=f.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),y=q(e,H(),{top:a.top,bottom:a.bottom});if(y!==void 0){let I=Math.max(0,n.scrollHeight-n.clientHeight),V=Math.min(I,Math.max(0,n.scrollTop+y));c(V),n.scrollTop=V,i=n.scrollTop,_=void 0;}}function ke(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function De(){N?.behavior==="smooth"&&(N=void 0),Z=false,L||(L=true,ee+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function Le(){let e=f.value;e===null||ee===te||(k!==void 0&&M(),K=true,e.scrollTop<=ke()&&Ie()&&fe());}function ot(){w=void 0,_=void 0,F!==void 0&&(clearTimeout(F),F=void 0),M(),L=false,Z=false,B$1=false,ae=void 0,X=void 0,ee+=1,te=-1,he=-1,K=true,ie=false,z$1=false,N=void 0;}function it(){B$1||(F!==void 0&&(clearTimeout(F),F=void 0),L=false,Z=false,k!==void 0&&(k.attempts=0),de());}function Me(){B$1||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,it();},Lt));}function at(){N=void 0,it();}function st(e){B$1=true,De(),ae=e.touches?.[0]?.clientY;}function lt(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(ae!==void 0&&n>ae?Le():ae!==void 0&&n<ae&&r(),ae=n);}function He(){B$1=false,ae=void 0,Me();}function dt(e){De(),e.deltaY<0?Le():e.deltaY>0&&r(),Me();}function ut(e){e.pointerType!=="touch"&&(De(),X=e.clientY,Me());}function ct(e){e.pointerType==="touch"||!L||X===void 0||(e.clientY<X?Le():e.clientY>X&&r(),X=e.clientY,Me());}function Be(e){e.pointerType!=="touch"&&(X=void 0,Me());}function ft(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(De(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?Le():r(),Me());}function Fe(e="auto"){let n=f.value;if(n===null)return;_=void 0,M();let a=Math.max(0,n.scrollHeight-n.clientHeight);c(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),i=n.scrollTop,T.clear(),Re();}function mt(){let e=f.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Bt(){let e=f.value;return mt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ft(e,n={}){let a=f.value,y=U.get(e);if(a===null||y===void 0||!a.contains(y)||a.clientHeight<=0)return false;M();let I=a.getBoundingClientRect(),V=y.getBoundingClientRect(),D=n.block??"center",Q;D==="start"?Q=a.scrollTop+V.top-I.top:D==="end"?Q=a.scrollTop+V.bottom-I.bottom:D==="nearest"?V.top>=I.top&&V.bottom<=I.bottom?Q=a.scrollTop:V.top<I.top?Q=a.scrollTop+V.top-I.top:Q=a.scrollTop+V.bottom-I.bottom:Q=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:V.height,targetTop:V.top,viewportHeight:a.clientHeight,viewportTop:I.top});let Pe=Math.max(0,a.scrollHeight-a.clientHeight),Te=Math.min(Pe,Math.max(0,Q));_=void 0;let Ee=n.behavior??"auto";return c(Te,Ee),a.scrollTo?.({top:Te,behavior:Ee}),a.scrollTop!==Te&&(a.scrollTop=Te),i=a.scrollTop,Re(),true}function _t(){T.clear();}function jt(){z$1=true,oe.value=false;}function Ut(){z$1=false,se();}function Kt(e,n){let a=U.get(e);if(a!==void 0&&a!==n&&(P?.unobserve(a),x?.unobserve?.(a),h.delete(a),A.delete(e)),n===null){U.delete(e),A.delete(e);return}U.set(e,n),h.set(n,e),P?.observe(n),x?.observe(n),se();}function qt(e,n,a){let y=m$1.get(e);if(a===null){m$1.delete(e);return}m$1.set(e,{element:a,label:n}),ne===e&&a.style.setProperty("opacity",String(s)),y?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ye,{registerMessageNode:Kt,registerDateNode:qt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;ot();let a=f.value;a!==null&&(i=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=f.value;if(a===null)return;let y=new Set(n);n.length>0&&e.length>0&&!e.some(ye=>y.has(ye))&&ot();let V=a.getBoundingClientRect(),D=p(w,H(),{top:V.top,bottom:V.bottom}),Q=oe.value,Pe=n[n.length-1],Te=Pe===void 0?-1:e.indexOf(Pe),Ee=Te<0?[]:e.slice(Te+1).filter(ye=>!y.has(ye)),gt=z$1||t.loadingNewer,Wt=e.length===n.length&&e.every(ye=>y.has(ye))&&e.some((ye,We)=>ye!==n[We]);if(await nextTick(),$)return;if(Wt&&Q&&t.followNewMessages&&t.resizeFollowEnabled&&!t.hasNewer&&!gt){Fe();return}let pt=n[0];if(pt!==void 0&&e.indexOf(pt)>0&&(ie=false,ve(D)),Ee.length>0){if(gt){z$1=false,k===void 0&&we(D),oe.value=false,se();return}(Q||Ee.some(We=>t.shouldFollowAppendedMessage?.(We)===true))&&t.followNewMessages?Fe():T.add(Ee);}se();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!z$1||re(()=>{t.loadingNewer||(z$1=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!ie||re(()=>{t.loadingOlder||(ie=false);});},{flush:"pre"}),onMounted(()=>{let e=f.value;if(e!==null){if(i=e.scrollTop,e.addEventListener("scroll",l,{passive:true}),e.addEventListener("scrollend",at,{passive:true}),e.addEventListener("touchstart",st,{passive:true}),e.addEventListener("touchmove",lt,{passive:true}),e.addEventListener("touchend",He,{passive:true}),e.addEventListener("touchcancel",He,{passive:true}),e.addEventListener("wheel",dt,{passive:true}),e.addEventListener("pointerdown",ut,{passive:true}),e.addEventListener("pointermove",ct,{passive:true}),e.addEventListener("pointerup",Be,{passive:true}),e.addEventListener("pointercancel",Be,{passive:true}),e.addEventListener("keydown",ft),typeof globalThis.ResizeObserver=="function"){x=new globalThis.ResizeObserver(()=>{$||f.value===null||Re();}),x.observe(e),C$1.value!==null&&x.observe(C$1.value);for(let n of U.values())x.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){P=new globalThis.IntersectionObserver(n=>{for(let a of n){let y=h.get(a.target);y!==void 0&&(a.isIntersecting?A.add(y):A.delete(y));}G=true,se();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of U.values())P.observe(n);}se();}}),onBeforeUnmount(()=>{$=true;let e=f.value;e!==null&&e.removeEventListener("scroll",l),e!==null&&(e.removeEventListener("scrollend",at),e.removeEventListener("touchstart",st),e.removeEventListener("touchmove",lt),e.removeEventListener("touchend",He),e.removeEventListener("touchcancel",He),e.removeEventListener("wheel",dt),e.removeEventListener("pointerdown",ut),e.removeEventListener("pointermove",ct),e.removeEventListener("pointerup",Be),e.removeEventListener("pointercancel",Be),e.removeEventListener("keydown",ft)),F!==void 0&&clearTimeout(F),M(),qe(),x?.disconnect(),P?.disconnect(),J(),U.clear(),h.clear(),A.clear(),m$1.clear(),T.clear();}),g$1({getViewportElement:()=>f.value,clearNewMessageBadge:_t,clearActiveDate:J,isAtBottom:computed(()=>oe.value),isMeasurable:mt,isScrollable:Bt,newMessageCount:computed(()=>p$1.value),prepareHistoryPageAppend:jt,cancelHistoryPageAppend:Ut,trackRemoteMessageIds:(e,n)=>T.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ft,focusViewport:()=>f.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:f,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:C$1,"data-im-thread-viewport-content":""},u.default?.())])}});var Ht=Symbol("ImThreadSurfaceContext");function fr(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 mr(t){provide(Ht,t);}function Qe(){let t=inject(Ht);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var et=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),tt=Object.freeze({enabled:true,maxFillPages:8}),hr=8,vr=160;function Tr(t,o){return t?.conversationType===o.conversationType&&t.conversationId===o.conversationId}var yr=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:o,slots:g}){let u=t.context??Qe(),f=ref(null),C=ref(0),U=ref(true),h=[],A,m=0,i$1=0,d=null,w="",_="",x="",P=false,G=false,S=ref(false),Y=ref(""),$=ref(false),N,ne,s=computed(()=>u.getState()),z=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),ie=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),K=computed(()=>Tr(s.value.activeConversation,t.conversation)),L=computed(()=>({...et,...t.viewportOptions})),Z=computed(()=>{let r=t.initialViewportOptions.maxFillPages??tt.maxFillPages;return {enabled:t.initialViewportOptions.enabled??tt.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):tt.maxFillPages}}),B=computed(()=>!K.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>K.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),te=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function he(){N!==void 0&&(clearTimeout(N),N=void 0),ne!==void 0&&(clearTimeout(ne),ne=void 0);}function F(r=false){if(he(),$.value=false,r){f.value?.clearActiveDate(),Y.value="";return}ne=setTimeout(()=>{ne=void 0,!$.value&&(f.value?.clearActiveDate(),Y.value="");},vr);}function ae(r){if(r===null){F();return}he(),Y.value=r.label,$.value=true;let l=L.value.activeDateIdleDelay,c=Number.isFinite(l)?Math.max(0,l):et.activeDateIdleDelay;N=setTimeout(()=>{N=void 0,F();},c);}async function X(r,l){t.hooks?.beforeAction?.(r);try{let c=await l();return t.hooks?.afterAction?.(r,c),c}catch(c){throw t.hooks?.onError?.(r,c),c}}function k(r="automatic"){return !K.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):X({kind:"load-older",source:r},()=>u.actions.loadOlder())}function W(){let r=u.actions.loadNewer,l=s.value.loadingNewer??s.value.loading;return !K.value||l||!s.value.hasNewer||r===void 0?Promise.resolve(0):X({kind:"load-newer"},()=>r())}async function oe(r){for(let l=0;l<hr;l+=1){if(!K.value)return;let c=r==="older"?s.value.hasOlder:s.value.hasNewer,R=r==="older"?s.value.olderError:s.value.newerError;if(!c||R!==null||(r==="older"?await k("user-scroll"):await W())>0)return;let O=r==="older"?s.value.hasOlder:s.value.hasNewer,q=r==="older"?s.value.olderError:s.value.newerError;if(!O||q!==null)return}}async function p(){return !K.value||u.actions.loadNewer===void 0?0:v({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:true})??Promise.resolve(0))}async function T(){return K.value?v({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:true})):0}async function v(r,l){let c=B.value,R=++m;d=null,x="";let M;try{M=await X(r,l);}catch(O){throw re(c,R)&&(x=c),O}return re(c,R)&&!S.value&&(d=null,Ie()),M}async function H(){if(!K.value)return false;let r=B.value,l=++i$1;return fe(true),P=true,w=r,_=se(s.value.entryUnread),!await X({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow))||!E(r,l)||(await nextTick(),!E(r,l))?false:(f.value?.scrollToLatest(),true)}function b(r){U.value=r.isAtBottom,C.value=r.newMessageCount,Ie();}function J(r,l){return f.value?.scrollToMessage(r,l)??false}function E(r,l){return !G&&i$1===l&&B.value===r&&K.value}async function j(r,l,c,R){for(let M=0;M<60;M+=1){if(!E(r,l))return false;if(J(c,R))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(O=>window.requestAnimationFrame(()=>O()));}return false}async function Oe(r,l,c){let R=f.value;if(R===null||!R.isMeasurable()||R.isScrollable())return true;let M=0,O=!s.value.hasOlder,q=!s.value.hasNewer||u.actions.loadNewer===void 0,ue=async()=>(await nextTick(),await nextTick(),j(r,l,c,{behavior:"auto",block:"center"})),de=async ve=>{if(!E(r,l)||M>=Z.value.maxFillPages)return false;let we=0;if(ve==="older"){if(O||!s.value.hasOlder)return false;we=await k(),O=!s.value.hasOlder;}else {if(q||!s.value.hasNewer)return false;R.prepareHistoryPageAppend();try{we=await W();}catch(ke){throw R.cancelHistoryPageAppend(),ke}we<=0&&!s.value.hasNewer&&R.cancelHistoryPageAppend(),q=!s.value.hasNewer;}return M+=1,we>0?ue():!(ve==="older"?O:q)};!O&&!await de("older")&&(O=true),!q&&!await de("newer")&&(q=true);let me="older";for(;E(r,l)&&M<Z.value.maxFillPages&&R.isMeasurable()&&!R.isScrollable()&&(!O||!q);){let ve=me==="older"?O?"newer":"older":q?"older":"newer";me=ve==="older"?"newer":"older",await de(ve)||(ve==="older"?O=true:q=true);}return E(r,l)}async function Ke(r,l={behavior:"auto",block:"center"}){if(!K.value||r==="")return false;let c=B.value,R=++i$1;if(!te.value.includes(r)){let q=u.actions.loadAround;if(q===void 0||!await X({kind:"locate-message",messageId:r},()=>q(r))||!E(c,R))return false}return !await j(c,R,r,{...l,behavior:"auto"})||!await Oe(c,R,r)?false:j(c,R,r,l)}function Se(){A!==void 0&&(clearTimeout(A),A=void 0);}function be(){if(Se(),!S.value)return;let r=t.readActions;if(r===void 0||h.length===0)return;let l=Number.isFinite(L.value.visibleReadDelay)?Math.max(0,L.value.visibleReadDelay):et.visibleReadDelay;A=setTimeout(()=>{if(A=void 0,!K.value||!ie.value)return;let c=h[h.length-1];if(c===void 0)return;let R=r.resolveTarget===void 0?c:r.resolveTarget(c);R!=null&&Promise.resolve(r.markRead(R)).catch(M=>{t.hooks?.onError?.({kind:"visible-range",messageIds:h},M);});},l);}function Re(r){h=Object.freeze([...r]);let l={kind:"visible-range",messageIds:h};t.hooks?.beforeAction?.(l);try{u.actions.onVisibleRange?.(h),t.hooks?.afterAction?.(l,void 0);}catch(c){throw t.hooks?.onError?.(l,c),c}S.value?be():Ie();}function re(r,l){return !G&&m===l&&B.value===r&&!P}function qe(r,l){re(r,l)&&(w=r,_=se(s.value.entryUnread),S.value=true,be());}function se(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function Ce(r,l,c){for(let R=0;R<60;R+=1){if(!re(r,l))return false;if(f.value?.scrollToMessage(c,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(O=>window.requestAnimationFrame(()=>O()));}return false}function Ie(){let r=B.value,l=se(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null&&s.value.messages.length===0||w===r&&(_===l||_.startsWith("located:")||P)||x===r||d!==null)return;if(!Z.value.enabled){w=r,_=l,S.value=true,be();return}let c=++m;P=false,S.value=false;let R=(async()=>{if(await nextTick(),!re(r,c))return;let M=f.value;if(M===null||!M.isMeasurable())return;let O=s.value.entryUnread;if(O.state==="located"&&!te.value.includes(O.firstMessageId))return;let q=O.state==="located"?await Ce(r,c,O.firstMessageId):false;if(O.state==="located"&&!q)return;q||M.scrollToLatest();let ue=0;for(;re(r,c)&&ue<Z.value.maxFillPages&&s.value.error===null&&(s.value.hasOlder||s.value.hasNewer&&u.actions.loadNewer!==void 0)&&M.isMeasurable()&&!M.isScrollable();){if(s.value.hasNewer&&u.actions.loadNewer!==void 0&&(s.value.messages.length===0||!s.value.hasOlder)){let me=i$1;M.prepareHistoryPageAppend();try{await W(),await nextTick();}finally{B.value===r&&i$1===me&&(m===c||P)&&M.cancelHistoryPageAppend();}}else await k();if(!re(r,c)||(ue+=1,await nextTick(),await nextTick(),!M.isMeasurable()))return}if(!re(r,c)||!M.isMeasurable())return;let de=s.value.entryUnread;if(de.state==="located"){if(!te.value.includes(de.firstMessageId)||!await Ce(r,c,de.firstMessageId))return}else M.scrollToLatest();await nextTick(),qe(r,c);})().catch(()=>{re(r,c)&&(x=r);}).finally(()=>{d===R&&(d=null);});d=R;}function fe(r,l=false){m+=1,d=null,P=false,S.value=r,r||(w="",_="",l||(x="")),Se();}function Ne(){if(P=true,S.value)return;let r=B.value;m+=1,d=null,w=r,S.value=true,be();}let Ve=Object.freeze({getViewportElement:()=>f.value?.getViewportElement()??null,loadOlder:k,retryOlder:T,loadNewer:W,retryNewer:p,jumpToLatest:H,scrollToMessage:J,locateMessage:Ke,focusViewport:()=>f.value?.focusViewport()});return o(Ve),watch(ie,r=>{r&&S.value?be():Se();}),watch([()=>s.value.activeRemoteMessageRevision??0,f,B],()=>{let r=f.value;if(r===null||!K.value)return;let l=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(l,{isAtBottom:U.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:z.value})&&(U.value=false);},{flush:"post"}),watch([B,()=>s.value.loading,()=>s.value.error,()=>te.value.length,()=>s.value.hasOlder,()=>se(s.value.entryUnread),Z,()=>s.value.hasNewer],([r,l,c,R,,M],[O,,,q,,ue])=>{if(r!==O&&(i$1+=1,fe(false),F(true),f.value?.clearNewMessageBadge(),C.value=0,U.value=true),r!==""&&r===O&&q!==void 0&&q>0&&R===0&&(s.value.hasOlder||s.value.hasNewer)&&S.value&&fe(false,true),r!==""&&r===O&&M!==ue&&!_.startsWith("located:")&&!P&&M.startsWith("located:")&&(w="",_="",S.value=false),r===""){fe(false);return}if(c!==null&&s.value.messages.length===0){S.value||fe(false,true);return}l||Ie();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{G=true,i$1+=1,fe(false),F(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:Ve,initialViewportSettled:B.value!==""&&(s.value.messages.length===0?!s.value.loading&&s.value.error===null&&!s.value.hasOlder&&!s.value.hasNewer:S.value&&w===B.value)},l=[g.header?.(r),g["before-list"]?.(r)];if(!K.value)l.push(g.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)l.push(g.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)l.push(g.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder&&!s.value.hasNewer)l.push(g.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let c=h$1(Je,{ref:f,messageIds:te.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:L.value.followThreshold,olderPrefetchThreshold:L.value.olderPrefetchThreshold,visibleMargin:L.value.visibleMargin,activeDateOffset:L.value.activeDateOffset,activeDateEnabled:g["active-date"]!==void 0,resizeFollowEnabled:S.value,followNewMessages:z.value,shouldFollowAppendedMessage:R=>{let M=s.value.messages.find(O=>O.id===R);return M===void 0?false:u.shouldFollowMessage?.(M)===true},onReachStart:()=>{oe("older").catch(()=>{});},onReachEnd:()=>{oe("newer").catch(()=>{});},onSettled:b,onUserScroll:Ne,onActiveDateChange:ae,onVisibleRange:Re,onNewMessageCount:R=>{C.value=R;}},{default:()=>[g["viewport-before"]?.(r),h$1($e,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:g.item,"date-separator":g["date-separator"],"entry-unread":g["entry-unread"],encryption:g.encryption,system:g.system,message:g.message,"recalled-message":g["recalled-message"],"deleted-message":g["deleted-message"],"unsupported-body":g["unsupported-body"]}),g["viewport-after"]?.(r)]});l.push(h$1("div",{"data-im-thread-viewport-shell":""},[g["active-date"]?.({label:Y.value,visible:$.value&&Y.value!==""}),c])),s.value.error!==null&&l.push(g.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return l.push(g["after-list"]?.(r),g["jump-to-latest"]?.({...r,count:C.value,visible:!U.value||s.value.isHistoryWindow}),g["context-menu"]?.(r),g.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},l)}}});function br(t){let o=new Map;for(let u of t){if(o.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);o.set(u.kind,u.component);}let g=Object.freeze([...o.keys()]);return Object.freeze({kinds:g,resolve:u=>o.get(u)})}var wr=140,Mr=120;function Ue(t,o){if(t.width<=0||t.height<=0)return 0;let g=Math.max(0,Math.min(t.right,o.right)-Math.max(t.left,o.left)),u=Math.max(0,Math.min(t.bottom,o.bottom)-Math.max(t.top,o.top));return Math.min(1,g*u/(t.width*t.height))}function rt(t,o){return {x:t.x,y:t.top-o,top:t.top-o,bottom:t.bottom+o,left:t.left,right:t.right,width:t.width,height:t.height+o*2,toJSON:()=>({})}}function nt(t){let o=Math.max(0,t.scrollIdleMs??wr),g=Math.max(0,t.visibilityDwellMs??Mr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),f=Math.max(0,t.revealMarginPx??0),C=Math.max(0,t.preloadMarginPx??0),U=Math.max(f,C),h=Math.max(0,t.maxPreloadTargets??Number.POSITIVE_INFINITY),A=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),m=new Map,i=new Map,d=reactive(new Set),w=new Set,_=new Set,x=[],P=null,G=null,S=null,Y=false,$=false,N=false,ne=false,s,z;function ie(){s!==void 0&&clearTimeout(s),s=void 0;}function K(){z!==void 0&&clearTimeout(z),z=void 0;}function L(p=false){if(!p&&G!==null||P===null)return;let T=P.getBoundingClientRect(),v=rt(T,U);for(let[H,b]of m){let J=H.getBoundingClientRect();b.ratio=Ue(J,T),b.intersecting=b.ratio>0,b.revealIntersecting=U>0?Ue(J,v)>0:b.intersecting&&b.ratio>=u;}}function Z(p){return p.intersecting&&p.ratio>=u}function B(){for(let[p,T]of m)!T.revealIntersecting||d.has(T.key)||U>f&&(f===0&&!Z(T)||f>0&&(P===null||Ue(p.getBoundingClientRect(),rt(P.getBoundingClientRect(),f))<=0))||(d.add(T.key),t.onRevealed?.(T.item));}function ee(p,T=false){let v=new Set(p.map(b=>b.key));if(!(!(v.size!==_.size||[...v].some(b=>!_.has(b)))&&!T)){_.clear();for(let b of v)_.add(b);t.onSettledVisibleChange?.(p.map(b=>b.item));}}function te(p,T=false){!T&&p.length===x.length&&p.every((v,H)=>v.key===x[H]?.key&&v.item===x[H]?.item)||(x=p,t.onSettledPreloadChange?.(p.map(v=>v.item)));}function he(){if(N||Y)return;let p=$;$=false,L(),B();let T=P?.getBoundingClientRect(),v=T===void 0?0:(T.top+T.bottom)/2,H=[...m.entries()].filter(([,b])=>Z(b)).sort(([b],[J])=>{let E=b.getBoundingClientRect(),j=J.getBoundingClientRect();return Math.abs((E.top+E.bottom)/2-v)-Math.abs((j.top+j.bottom)/2-v)}).slice(0,A).map(([,b])=>b);if(ee(H,p),t.onSettledPreloadChange!==void 0&&T!==void 0){let b=rt(T,C),J=[...m.entries()].filter(([,E])=>E.revealIntersecting).map(([E,j])=>({target:j,rect:E.getBoundingClientRect()})).filter(({target:E,rect:j})=>Z(E)||C>0&&Ue(j,b)>0).sort((E,j)=>Number(Z(j.target))-Number(Z(E.target))||Math.abs((E.rect.top+E.rect.bottom)/2-v)-Math.abs((j.rect.top+j.rect.bottom)/2-v)).slice(0,h).map(({target:E})=>E);te(J,p);}for(let b of H)w.has(b.key)||(w.add(b.key),t.onActivated?.(b.item));}function F(){N||Y||(K(),z=setTimeout(()=>{z=void 0,he();},g));}function ae(){N||($=true,X(true),te([]),L(),B(),ee([]),K(),ie(),s=setTimeout(()=>{s=void 0,X(false),F();},o));}function X(p){Y!==p&&(Y=p,t.onScrollingChange?.(p));}function k(){P?.removeEventListener("scroll",ae),G?.disconnect(),S?.disconnect(),G=null,S=null,P=null;}function W(p=true){if(N)return;let T=t.getRoot();if(!(T===P&&P!==null)){if(te([]),k(),P=T,P===null){p&&!ne&&(ne=true,Promise.resolve().then(()=>{ne=false,N||(W(false),F());}));return}if(P.addEventListener("scroll",ae,{passive:true}),typeof IntersectionObserver<"u"){G=new IntersectionObserver(v=>{for(let H of v){let b=m.get(H.target);b!==void 0&&(b.intersecting=H.isIntersecting,b.ratio=H.intersectionRatio,U===0&&(b.revealIntersecting=H.isIntersecting&&H.intersectionRatio>=u));}B(),F();},{root:P,threshold:[0,u,1]}),U>0&&(S=new IntersectionObserver(v=>{for(let H of v){let b=m.get(H.target);b!==void 0&&(b.revealIntersecting=H.isIntersecting);}B(),F();},{root:P,rootMargin:`${U}px 0px`,threshold:0}));for(let v of m.keys())G.observe(v);for(let v of m.keys())S?.observe(v);}else L(),B();}}function oe(p){te(x.filter(T=>T.key!==p)),d.delete(p),w.delete(p),_.delete(p);}return {register(p,T){if(N)return;let v=t.getKey(p),H=d.has(v),b=w.has(v),J=T===null?void 0:m.get(T);J!==void 0&&J.key!==v&&(i.delete(J.key),m.delete(T),oe(J.key));let E=i.get(v);if(E!==void 0&&E!==T&&(G?.unobserve(E),S?.unobserve(E),m.delete(E),i.delete(v)),T===null){E!==void 0&&(G?.unobserve(E),S?.unobserve(E),m.delete(E),i.delete(v)),oe(v);return}let j=m.get(T);if(j?.key===v&&j.item===p){W();return}m.set(T,{item:p,key:v,intersecting:j?.key===v?j.intersecting:false,ratio:j?.key===v?j.ratio:0,revealIntersecting:j?.key===v?j.revealIntersecting:false}),i.set(v,T),W(),G?.observe(T),S?.observe(T),L(true),B(),H&&t.onRevealed?.(p),b&&t.onActivated?.(p),F();},isRevealed:p=>d.has(t.getKey(p)),isActivated:p=>w.has(t.getKey(p)),isSettledVisible:p=>_.has(t.getKey(p)),isScrolling:()=>Y,notifyScroll:ae,refresh(){W(),L(true),B(),F();},reset(){ie(),K(),X(false),$=false,ee([]),te([]),k(),m.clear(),i.clear(),d.clear(),w.clear();},dispose(){N||(ie(),K(),X(false),$=false,ee([]),te([]),k(),m.clear(),i.clear(),d.clear(),w.clear(),N=true);}}}function Sr(t){let o=new Map,g=new Map,u=false,f=h=>{let A=o.get(h.channel);return A===void 0?h.channel:`${h.channel}\0${A.getKey(h.item)}`},C=nt({getRoot:t.getRoot,getKey:f,revealMarginPx:t.revealMarginPx,preloadMarginPx:t.preloadMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:h=>{for(let A of o.values())A.onScrollingChange?.(h);},onRevealed:h=>o.get(h.channel)?.onRevealed?.(h.item),onActivated:h=>o.get(h.channel)?.onActivated?.(h.item),onSettledPreloadChange:h=>{for(let[A,m]of o){let i=h.filter(d=>d.channel===A).map(d=>d.item);m.onSettledPreloadChange?.(i.slice(0,Math.max(0,m.maxPreloadTargets??Number.POSITIVE_INFINITY)));}},onSettledVisibleChange:h=>{for(let[A,m]of o){let i=h.filter(w=>w.channel===A).map(w=>w.item),d=m.maxSettledVisible===void 0?i:i.slice(0,m.maxSettledVisible);m.onSettledVisibleChange?.(d);}}});function U(h){return A=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(o.has(h))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${h}`);o.set(h,A);let m=new Map;g.set(h,m);let i=false,d=x=>({channel:h,item:x});function w(){for(let x of m.values())C.register(x.target,null);m.clear(),A.onScrollingChange?.(false),A.onSettledVisibleChange?.([]),A.onSettledPreloadChange?.([]);}return {register(x,P){if(i||u)return;let G=A.getKey(x),S=m.get(G);if(P===null){S!==void 0&&(C.register(S.target,null),m.delete(G));return}let Y=S?.target.item===x?S.target:d(x);m.set(G,{target:Y,element:P}),C.register(Y,P);},isRevealed:x=>C.isRevealed(d(x)),isActivated:x=>C.isActivated(d(x)),isSettledVisible:x=>C.isSettledVisible(d(x)),isScrolling:C.isScrolling,notifyScroll:C.notifyScroll,refresh:C.refresh,reset:w,dispose(){i||(w(),i=true,o.delete(h),g.delete(h));}}}}return {createFactory:U,refresh:C.refresh,dispose(){if(!u){for(let h of g.values())for(let A of h.values())C.register(A.target,null);for(let h of o.values())h.onSettledPreloadChange?.([]);g.clear(),o.clear(),C.dispose(),u=true;}}}}export{ze as ImThreadBodySwitch,$e as ImThreadItems,yr as ImThreadSurface,Je as ImThreadViewport,fr as createImThreadSurfaceContext,br as createMessageRendererRegistry,Sr as createThreadVisibilityTargetGroup,nt as createThreadVisibilityTargets,mr as provideImThreadSurfaceContext,zt as useImText,Qe as useImThreadSurfaceContext,Xt as useOptionalImThreadReadActions};
1
+ import {h,C,p,i,q,m,z,B,o,j,g}from'./chunk-NWBEXP2C.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-32UUIS7N.js';import'./chunk-QT3PJWLT.js';import'./chunk-HUSCO5JM.js';import'./chunk-75GNCLQQ.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function $t(t){let a=0,y=0;for(let c of t)c.kind==="video"?y+=1:a+=1;return {imageCount:a,videoCount:y}}function Xt(t){return {systemMessage:a=>a.body.system!==void 0?g$1(a.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:a=>i$1(a.contentType,{locale:t.locale(),durationMs:a.body.voice?.durationMs,stickerImageType:a.body.sticker?.imageType,gameType:a.body.game?.gameType,callKind:a.body.call?.callKind,...a.body.filesAlbum===void 0?{}:{filesAlbum:{count:a.body.filesAlbum.items.length,caption:a.body.filesAlbum.caption}},...a.body.mediaAlbum===void 0?{}:{mediaAlbum:$t(a.body.mediaAlbum.items)}}),lastMessage:a=>a.lastMessageSummary!==void 0?h$2(a.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):a.lastMessagePreview,failureText:a=>a.failure?.displayCode!==void 0?f(a.failure.displayCode,{locale:t.locale(),mediaKind:a.failure.mediaKind,params:a.failure.params}):a.failure?.message??""}}var Ct=Symbol("ImThreadReadActions");function Nt(t){provide(Ct,t);}function Zt(){return inject(Ct,void 0)}var rt=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:y}){return Nt(t.readActions),()=>{let c=h(t.message),m=t.rendererRegistry.resolve(c);return m!==void 0?h$1(m,{...a,message:t.message,presentation:t.presentation}):y["unsupported-body"]!==void 0?y["unsupported-body"]({kind:c,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":c,"aria-hidden":"true"})}}});var ot=Symbol("ImThreadViewportRegistration");function Ht(){return inject(ot,void 0)}var it=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 y=Ht();function c(o,h){let C=Array.isArray(h)?h:[h];return C.length===1&&isVNode(C[0])?cloneVNode(C[0],{key:o}):h$1(Fragment,{key:o},C)}function m(o){return h=>{y?.registerMessageNode(o,h instanceof HTMLElement?h:null);}}function N(o,h){return C=>{y?.registerDateNode(o,h,C instanceof HTMLElement?C:null);}}function U(o){return a.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function T(o){let h=N(o.key,o.label);return a["date-separator"]?.({item:o,setElement:h})??h$1("div",{ref:h,"data-im-thread-date-separator":o.key},o.label)}function V(o){y?.registerEntryUnreadNode(o instanceof HTMLElement?o:null);}function w(o){return a["entry-unread"]?.({item:o,setElement:V})??h$1("div",{ref:V,"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function k(o){let h=m(o.message.id);return a.item!==void 0?a.item({item:o,setElement:h}):a.message!==void 0?a.message({item:o,setElement:h}):o.message.deletedForEveryone!==void 0?a["deleted-message"]?.({item:o,setElement:h})??h$1("article",{ref:h,"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:h})??h$1("article",{ref:h,"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:h}):h$1("article",{ref:h,"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(rt,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":a["unsupported-body"]===void 0?void 0:C=>a["unsupported-body"]?.(C)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return a.item!==void 0?c(o.key,a.item({item:o})):c(o.key,U(o));case "date-separator":return a.item!==void 0?c(o.key,a.item({item:o,setElement:N(o.key,o.label)})):c(o.key,T(o));case "entry-unread":return a.item!==void 0?c(o.key,a.item({item:o,setElement:V})):c(o.key,w(o));case "system":case "message":return c(o.key,k(o))}return o}))}});var Ft=120,fn=500,Le=.5,mn=8;function at(t){let a=t.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(a!==void 0&&Number.isFinite(a)&&a>0?a:1)}var st=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:y,slots:c}){let m$1=ref(null),N=ref(null),U=new Map,T,V=new Map,w=new Set,k=new Map,o$1=0,h=[],C$1,S,E,_,G=false,L,J=new Set,K=false,D,re="",Z=1,Y=false,H=false,ee=true,q$1=false,Q=false,oe=false,i=0,he=-1,ie=-1,A,z$1,te,M,ne,f=ref(true),P=ref(0),p$1=C(e=>{P.value=e,a("new-message-count",e);});function j$1(e){let r=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=r}function v(e=t.messageIds){return e.flatMap(r=>{let s=U.get(r);if(s===void 0)return [];let g=s.getBoundingClientRect(),R=s.querySelector("[data-im-thread-anchor-point]");return [{id:r,top:g.top,bottom:g.bottom,anchorTop:R?.getBoundingClientRect().top??g.top}]})}function $(e="",r=1){let s=Math.min(1,Math.max(0,r));re!==""&&re!==e&&k.get(re)?.element.style.removeProperty("opacity"),re=e,Z=s,e!==""&&k.get(e)?.element.style.setProperty("opacity",String(s));}function x(){$();}function W(){let e=m$1.value;if(K||e===null||!t.activeDateEnabled)return;let r=[...k.entries()].filter(([,B])=>e.contains(B.element)).map(([B,O])=>{let de=O.element.getBoundingClientRect();return {key:B,label:O.label,top:de.top,height:de.height}}).sort((B,O)=>B.top-O.top),s=e.getBoundingClientRect(),g$1=r.find(B=>B.height>0)?.height??28,R=g({markers:r,viewportTop:s.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:g$1});if(R===null){x(),a("active-date-change",null);return}$(R.inlineDateKey,R.inlineOpacity),a("active-date-change",R);}function De(e){S={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight};}function Fe(e){let r=S;if(r===void 0)return false;let s=Math.max(0,e.scrollHeight-e.clientHeight);return s<r.scrollHeight-r.height&&r.scrollTop>s&&Math.abs(e.scrollTop-s)<=at(e)}function Xe(e){return Fe(e)||D!==void 0&&(D.behavior==="smooth"||Math.abs(e.scrollTop-D.targetTop)<=at(e))?0:e.scrollTop-o$1}function Be(e,r){r!==0&&(o$1=e.scrollTop-r,D=void 0,_e());}function Je(e,r){let s=Xe(e);if(M!==void 0)return M.expectedOffset-=s,je(),Be(e,s),q$1||Ne(),false;let g=S;if(g===void 0)return false;let R=C$1,B=R===void 0?void 0:v([R.id])[0],O=e.scrollTop-g.scrollTop,de=Fe(e)?0:O,Ie=R===void 0||B===void 0?0:(B.anchorTop??B.top)-r.top-R.offset+O;return g.scrollHeight!==e.scrollHeight||g.width!==e.clientWidth||g.height!==e.clientHeight||Math.abs(Ie)>Le?(S=void 0,!Y&&!t.loadingNewer&&t.resizeFollowEnabled&&f.value&&Math.abs(de)<=Le?(Ge(),true):(R!==void 0&&ge({...R,offset:R.offset-de}),Be(e,s),false)):false}function pe(){let e=m$1.value;if(K||e===null)return;let r=e.getBoundingClientRect();if(Je(e,r))return;let s=_!==void 0&&G?t.messageIds.filter(O=>w.has(O)):t.messageIds,g=v(s);if(_!==void 0&&G&&g.length===0){f.value=j$1(e);return}let R=g.filter(O=>B({viewportTop:r.top,viewportBottom:r.bottom,messageTop:O.top,messageBottom:O.bottom,margin:t.visibleMargin})).map(O=>O.id),B$1=R.length!==h.length||R.some((O,de)=>h[de]!==O);h=Object.freeze(R),C$1=o(g,{top:r.top,bottom:r.bottom}),De(e),p$1.acknowledgeVisible(R),f.value=j$1(e),B$1&&a("visible-range",h),a("settled",{visibleMessageIds:h,...h.length===0?{}:{newestVisibleMessageId:h[h.length-1]},isAtBottom:f.value,newMessageCount:P.value});}function fe(e){if(J.add(e),L!==void 0)return;let r=()=>{L=void 0;let s=[...J];J.clear(),s.forEach(g=>g());};typeof globalThis.requestAnimationFrame=="function"?L=globalThis.requestAnimationFrame(r):L=globalThis.setTimeout(r,0);}function Qe(){L!==void 0&&(typeof L=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(L):globalThis.clearTimeout(L),L=void 0,J.clear());}function me(){fe(pe);}function Ze(){let e=m$1.value;if(e===null)return;let r=e.getBoundingClientRect(),s=o(v(),{top:r.top,bottom:r.bottom});s!==void 0&&(C$1=s,De(e));}function Ke(){return ee&&M===void 0&&!H&&!t.loadingOlder}function Ue(){Ze(),ee=false,he=i,H=true,a("reach-start"),fe(()=>{t.loadingOlder||(H=false);});}function X(e){return t.hasNewer&&!Y&&!t.loadingOlder&&!t.loadingNewer&&j$1(e)}function Ve(){Y=true,f.value=false,ie=i,a("reach-end"),fe(()=>{t.loadingNewer||(Y=false);});}function Ce(){let e=m$1.value;e===null||i===ie||!X(e)||Ve();}function _e(){let e=m$1.value;if(K||e===null)return;let r=e.scrollTop,s=Fe(e),g=D,R=false;if(g!==void 0){let O=Math.abs(r-g.targetTop)<=at(e);R=g.behavior==="smooth"||O,(g.behavior!=="smooth"||O)&&(D=void 0);}!R&&!s&&!q$1&&M===void 0&&r!==o$1&&(q$1=true,Q=true,i+=1);let B=q$1&&!R&&!s&&r!==o$1;if(B&&(a("user-scroll"),fe(W)),q$1&&!oe&&u(),!ee&&Q&&i!==he&&r<o$1&&r>qe()&&(ee=true),M!==void 0&&!R)if(q$1){let O=ae();O!==void 0&&(M.expectedOffset=O);}else je(),Ne();Ke()&&B&&r>=0&&m({previousScrollTop:o$1,currentScrollTop:r,topThreshold:t.olderPrefetchThreshold})&&Ue(),B&&X(e)&&z({previousScrollTop:o$1,currentScrollTop:r,isAtBottom:j$1(e),isHistoryWindow:t.hasNewer,isPageSettling:R})&&Ve(),o$1=r,me();}function Pe(e,r="auto"){D={targetTop:e,behavior:r};}function Se(e){let r=M,s=N.value;if(!(r===void 0||s===null)){if(r.visualOffset=Math.abs(e)<=Le?0:e,r.visualOffset===0){s.style.removeProperty("transform"),s.style.removeProperty("will-change");return}s.style.setProperty("transform",`translate3d(0, ${r.visualOffset}px, 0)`),s.style.setProperty("will-change","transform");}}function ye(){ne!==void 0&&(clearTimeout(ne),ne=void 0),M!==void 0&&M.visualOffset!==0&&(C$1=void 0,S=void 0);let e=N.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),M=void 0,D=void 0;}function ae(){let e=m$1.value,r=M;if(e===null||r===void 0)return;let s=v().find(g=>g.id===r.anchor.id);if(s!==void 0)return (s.anchorTop??s.top)-e.getBoundingClientRect().top}function je(){let e=M,r=ae();if(e===void 0||r===void 0)return;let s=e.expectedOffset-r;Math.abs(s)<=Le||(Se(e.visualOffset+s),e.committed=false,e.attempts=0);}function Te(){ne!==void 0&&clearTimeout(ne),ne=setTimeout(()=>{ne=void 0,!(q$1||M?.committed!==true)&&ye();},fn);}function Ee(){let e=m$1.value,r=M;if(K||e===null||r===void 0||q$1)return;let s=r.visualOffset;if(Math.abs(s)<=Le){r.committed=true,Te();return}let g=Math.max(0,e.scrollHeight-e.clientHeight),R=Math.min(g,Math.max(0,e.scrollTop-s));if(Pe(R),e.scrollTop=R,Math.abs(e.scrollTop-R)>Le){D=void 0,r.committed=false,r.attempts+=1,r.attempts<mn?Ne():(ye(),D=void 0,o$1=e.scrollTop);return}Se(0),o$1=e.scrollTop,r.expectedOffset=ae()??r.expectedOffset,r.committed=true,r.attempts=0,Te();}function Ne(){ne!==void 0&&clearTimeout(ne),ne=setTimeout(()=>{ne=void 0,Ee();},Ft);}function ke(e){e!==void 0&&(M===void 0&&(M={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),je(),!q$1&&Ee());}function ge(e){let r=m$1.value;if(r===null||e===void 0)return;let s=r.getBoundingClientRect(),g=q(e,v(),{top:s.top,bottom:s.bottom});if(g!==void 0){let R=Math.max(0,r.scrollHeight-r.clientHeight),B=Math.min(R,Math.max(0,r.scrollTop+g));Pe(B),r.scrollTop=B,o$1=r.scrollTop,S=void 0;}}function qe(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function Oe(){D?.behavior==="smooth"&&(D=void 0),Q=false,q$1||(q$1=true,i+=1),A!==void 0&&(clearTimeout(A),A=void 0);}function n(){let e=m$1.value;e===null||i===he||(M!==void 0&&ye(),ee=true,e.scrollTop<=qe()&&Ke()&&Ue());}function l(){C$1=void 0,S=void 0,A!==void 0&&(clearTimeout(A),A=void 0),ye(),q$1=false,Q=false,oe=false,z$1=void 0,te=void 0,i+=1,he=-1,ie=-1,ee=true,H=false,Y=false,D=void 0;}function d(){oe||(A!==void 0&&(clearTimeout(A),A=void 0),q$1=false,Q=false,M!==void 0&&(M.attempts=0),Ee());}function u(){oe||(A!==void 0&&clearTimeout(A),A=setTimeout(()=>{A=void 0,d();},Ft));}function b(){D=void 0,d();}function I(e){oe=true,Oe(),z$1=e.touches?.[0]?.clientY;}function F(e){let r=e.touches?.[0]?.clientY;r!==void 0&&(z$1!==void 0&&r>z$1?n():z$1!==void 0&&r<z$1&&Ce(),z$1=r);}function le(){oe=false,z$1=void 0,u();}function ve(e){Oe(),e.deltaY<0?n():e.deltaY>0&&Ce(),u();}function Ae(e){e.pointerType!=="touch"&&(Oe(),te=e.clientY,u());}function be(e){e.pointerType==="touch"||!q$1||te===void 0||(e.clientY<te?n():e.clientY>te&&Ce(),te=e.clientY,u());}function we(e){e.pointerType!=="touch"&&(te=void 0,u());}function We(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(Oe(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?n():Ce(),u());}function Ge(e="auto"){let r=m$1.value;if(r===null)return;S=void 0,ye();let s=Math.max(0,r.scrollHeight-r.clientHeight);Pe(s,e),r.scrollTo?.({top:s,behavior:e}),r.scrollTop!==s&&(r.scrollTop=s),o$1=r.scrollTop,p$1.clear(),pe();}function gt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Ut(){let e=m$1.value;return gt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function _t(e,r={}){return vt(U.get(e),r)}function vt(e,r){let s=m$1.value;if(s===null||e===void 0||!s.contains(e)||s.clientHeight<=0)return false;ye();let g=s.getBoundingClientRect(),R=e.getBoundingClientRect(),B=r.block??"center",O;B==="start"?O=s.scrollTop+R.top-g.top:B==="end"?O=s.scrollTop+R.bottom-g.bottom:B==="nearest"?R.top>=g.top&&R.bottom<=g.bottom?O=s.scrollTop:R.top<g.top?O=s.scrollTop+R.top-g.top:O=s.scrollTop+R.bottom-g.bottom:O=j({currentScrollTop:s.scrollTop,scrollHeight:s.scrollHeight,targetHeight:R.height,targetTop:R.top,viewportHeight:s.clientHeight,viewportTop:g.top});let de=Math.max(0,s.scrollHeight-s.clientHeight),Ie=Math.min(de,Math.max(0,O));S=void 0;let He=r.behavior??"auto";return Pe(Ie,He),s.scrollTo?.({top:Ie,behavior:He}),s.scrollTop!==Ie&&(s.scrollTop=Ie),o$1=s.scrollTop,pe(),true}function jt(){let e=m$1.value;if(e===null||T===void 0||!e.contains(T)||e.clientHeight<=0)return null;let r=T.getBoundingClientRect(),s=e.scrollTop+r.top-e.getBoundingClientRect().top+r.height/2,g=e.clientHeight/2;return {older:s<g-1,newer:e.scrollHeight-s<g-1}}function Kt(){p$1.clear();}function qt(){Y=true,f.value=false;}function Wt(){Y=false,me();}function Gt(e,r){let s=U.get(e);if(s!==void 0&&s!==r&&(_?.unobserve(s),E?.unobserve?.(s),V.delete(s),w.delete(e)),r===null){U.delete(e),w.delete(e);return}U.set(e,r),V.set(r,e),_?.observe(r),E?.observe(r),me();}function zt(e,r,s){let g=k.get(e);if(s===null){k.delete(e);return}k.set(e,{element:s,label:r}),re===e&&s.style.setProperty("opacity",String(Z)),g?.element!==s&&(s.dataset.imThreadDateSeparator=e);}return provide(ot,{registerMessageNode:Gt,registerDateNode:zt,registerEntryUnreadNode:e=>{T=e??void 0;}}),watch(()=>t.contentKey,(e,r)=>{if(e===r)return;l();let s=m$1.value;s!==null&&(o$1=s.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,r)=>{let s=m$1.value;if(s===null)return;let g=new Set(r);r.length>0&&e.length>0&&!e.some(xe=>g.has(xe))&&l();let B=s.getBoundingClientRect(),O=p(C$1,v(),{top:B.top,bottom:B.bottom}),de=f.value,Ie=r[r.length-1],He=Ie===void 0?-1:e.indexOf(Ie),et=He<0?[]:e.slice(He+1).filter(xe=>!g.has(xe)),ht=Y||t.loadingNewer,Yt=e.length===r.length&&e.every(xe=>g.has(xe))&&e.some((xe,tt)=>xe!==r[tt]);if(await nextTick(),K)return;if(Yt&&de&&t.followNewMessages&&t.resizeFollowEnabled&&!t.hasNewer&&!ht){Ge();return}let pt=r[0];if(pt!==void 0&&e.indexOf(pt)>0&&(H=false,ke(O)),et.length>0){if(ht){Y=false,M===void 0&&ge(O),f.value=false,me();return}(de||et.some(tt=>t.shouldFollowAppendedMessage?.(tt)===true))&&t.followNewMessages?Ge():p$1.add(et);}me();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,r)=>{e||!r||!Y||fe(()=>{t.loadingNewer||(Y=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,r)=>{e||!r||!H||fe(()=>{t.loadingOlder||(H=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",_e,{passive:true}),e.addEventListener("scrollend",b,{passive:true}),e.addEventListener("touchstart",I,{passive:true}),e.addEventListener("touchmove",F,{passive:true}),e.addEventListener("touchend",le,{passive:true}),e.addEventListener("touchcancel",le,{passive:true}),e.addEventListener("wheel",ve,{passive:true}),e.addEventListener("pointerdown",Ae,{passive:true}),e.addEventListener("pointermove",be,{passive:true}),e.addEventListener("pointerup",we,{passive:true}),e.addEventListener("pointercancel",we,{passive:true}),e.addEventListener("keydown",We),typeof globalThis.ResizeObserver=="function"){E=new globalThis.ResizeObserver(()=>{K||m$1.value===null||pe();}),E.observe(e),N.value!==null&&E.observe(N.value);for(let r of U.values())E.observe(r);}if(typeof globalThis.IntersectionObserver=="function"){_=new globalThis.IntersectionObserver(r=>{for(let s of r){let g=V.get(s.target);g!==void 0&&(s.isIntersecting?w.add(g):w.delete(g));}G=true,me();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let r of U.values())_.observe(r);}me();}}),onBeforeUnmount(()=>{K=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",_e),e!==null&&(e.removeEventListener("scrollend",b),e.removeEventListener("touchstart",I),e.removeEventListener("touchmove",F),e.removeEventListener("touchend",le),e.removeEventListener("touchcancel",le),e.removeEventListener("wheel",ve),e.removeEventListener("pointerdown",Ae),e.removeEventListener("pointermove",be),e.removeEventListener("pointerup",we),e.removeEventListener("pointercancel",we),e.removeEventListener("keydown",We)),A!==void 0&&clearTimeout(A),ye(),Qe(),E?.disconnect(),_?.disconnect(),x(),T=void 0,U.clear(),V.clear(),w.clear(),k.clear(),p$1.clear();}),y({getViewportElement:()=>m$1.value,clearNewMessageBadge:Kt,clearActiveDate:x,isAtBottom:computed(()=>f.value),isMeasurable:gt,isScrollable:Ut,newMessageCount:computed(()=>P.value),prepareHistoryPageAppend:qt,cancelHistoryPageAppend:Wt,trackRemoteMessageIds:(e,r)=>p$1.trackRemote(e,r),scrollToLatest:Ge,scrollToMessage:_t,scrollToEntryUnread:()=>vt(T,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:jt,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:N,"data-im-thread-viewport-content":""},c.default?.())])}});var Bt=Symbol("ImThreadSurfaceContext");function hn(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function pn(t){provide(Bt,t);}function lt(){let t=inject(Bt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var ut=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),ct=Object.freeze({enabled:true,maxFillPages:8}),bn=8,wn=160;function In(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var Mn=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:a,slots:y}){let c=t.context??lt(),m=ref(null),N=ref(0),U=ref(false),T=ref(false),V,w=ref(false),k=ref(false),o=ref(false),h=false,C,S=ref(true),E=[],_,G=0,L=0,J=null,K="",D="",re="",Z=false,Y=false,H=ref(false),ee=ref(""),q=ref(false),Q,oe,i$1=computed(()=>c.getState()),he=computed(()=>i$1.value.pageVisible??c.isPageVisible?.()??true),ie=computed(()=>i$1.value.pageEngaged??c.isPageEngaged?.()??true),A=computed(()=>In(i$1.value.activeConversation,t.conversation)),z=computed(()=>({...ut,...t.viewportOptions})),te=computed(()=>{let n=t.initialViewportOptions.maxFillPages??ct.maxFillPages;return {enabled:t.initialViewportOptions.enabled??ct.enabled,maxFillPages:Number.isFinite(n)?Math.max(0,Math.floor(n)):ct.maxFillPages}}),M=computed(()=>!A.value||!i$1.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ne=computed(()=>A.value?i({messages:i$1.value.messages,entryUnread:i$1.value.entryUnread,formatDate:c.formatDate,leadingItems:c.leadingItems?.(),beforeMessageItems:c.beforeMessageItems}):[]),f=computed(()=>ne.value.flatMap(n=>n.kind==="message"||n.kind==="system"?[n.message.id]:[]));function P(){Q!==void 0&&(clearTimeout(Q),Q=void 0),oe!==void 0&&(clearTimeout(oe),oe=void 0);}function p(n=false){if(P(),q.value=false,n){m.value?.clearActiveDate(),ee.value="";return}oe=setTimeout(()=>{oe=void 0,!q.value&&(m.value?.clearActiveDate(),ee.value="");},wn);}function j(n){if(n===null){p();return}P(),ee.value=n.label,q.value=true;let l=z.value.activeDateIdleDelay,d=Number.isFinite(l)?Math.max(0,l):ut.activeDateIdleDelay;Q=setTimeout(()=>{Q=void 0,p();},d);}async function v(n,l,d){t.hooks?.beforeAction?.(n);try{let u=await l();return d?.()!==!1&&t.hooks?.afterAction?.(n,u),u}catch(u){throw d?.()!==false&&t.hooks?.onError?.(n,u),u}}function $(n="automatic",l){return !A.value||i$1.value.loading||!i$1.value.hasOlder?Promise.resolve(0):v({kind:"load-older",source:n},()=>c.actions.loadOlder(),l)}function x(){return W()}function W(n){let l=c.actions.loadNewer,d=i$1.value.loadingNewer??i$1.value.loading;return !A.value||d||!i$1.value.hasNewer||l===void 0?Promise.resolve(0):v({kind:"load-newer"},()=>l(),n)}async function De(n){for(let l=0;l<bn;l+=1){if(!A.value)return;let d=n==="older"?i$1.value.hasOlder:i$1.value.hasNewer,u=n==="older"?i$1.value.olderError:i$1.value.newerError;if(!d||u!==null||(n==="older"?await $("user-scroll"):await x())>0)return;let I=n==="older"?i$1.value.hasOlder:i$1.value.hasNewer,F=n==="older"?i$1.value.olderError:i$1.value.newerError;if(!I||F!==null)return}}async function Fe(){return !A.value||c.actions.loadNewer===void 0?0:Be({kind:"load-newer"},()=>c.actions.retryNewer?.()??c.actions.loadNewer?.({force:true})??Promise.resolve(0))}async function Xe(){return A.value?Be({kind:"retry-older"},()=>c.actions.retryOlder?.()??c.actions.loadOlder({force:true})):0}async function Be(n,l){let d=M.value,u=++G;J=null,re="";let b;try{b=await v(n,l);}catch(I){throw ae(d,u)&&(re=d),I}return ae(d,u)&&!H.value&&(J=null,ke()),b}async function Je(){if(!A.value)return false;let n=M.value,l=++L;return ge(true),Z=true,K=n,D=Ee(Te()),!await v({kind:"jump-to-latest"},()=>c.actions.jumpToLatest?.()??Promise.resolve(!i$1.value.isHistoryWindow))||!X(n,l)||(await nextTick(),!X(n,l))?false:(m.value?.scrollToLatest(),U.value=true,o.value=false,fe(),true)}function pe(n=false){let l=m.value,d=l?.getViewportElement();k.value=l?.isScrollable()===true;let u=i$1.value.entryUnreadNavigation;w.value=u?.state==="located"&&E.includes(u.firstMessageId),H.value&&w.value&&(U.value=true);let b=d==null?0:Math.max(0,d.scrollHeight-d.clientHeight-d.scrollTop);o.value=u!==void 0&&b>50,n&&u!==void 0&&d!==null&&d!==void 0&&d.clientHeight>0&&b>=d.clientHeight&&(U.value=true);}function fe(){let n=c.actions.markConversationRead;if(n===void 0||!ie.value||!A.value||!H.value||T.value||h&&(!S.value||i$1.value.hasNewer)||C!==void 0||i$1.value.error!==null)return;let l=M.value,d=n().then(()=>{C===d&&l===M.value&&(h=true);}).catch(u=>{!Y&&C===d&&l===M.value&&t.hooks?.onError?.({kind:"mark-conversation-read"},u);}).finally(()=>{C===d&&(C=void 0);});C=d;}async function Qe(){let n=c.actions.loadEntryUnread;if(!A.value||T.value||n===void 0)return "cancelled";let l=M.value,d=++L;V=d,T.value=true,ge(true),Z=true;try{let u=await v({kind:"jump-to-entry-unread"},n,()=>X(l,d));if(!X(l,d))return "cancelled";if(!u||i$1.value.entryUnread.state!=="located")return "unavailable";let I=await Ze(l,d);return I&&(U.value=!0),I?"located":X(l,d)?"unavailable":"cancelled"}catch(u){if(!X(l,d))return "cancelled";throw u}finally{V===d&&(V=void 0,T.value=false);}}async function me(n,l){for(let d=0;d<60;d+=1){if(!X(n,l))return false;if(m.value?.scrollToEntryUnread())return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(u=>window.requestAnimationFrame(()=>u()));}return false}async function Ze(n,l){let d=()=>X(n,l);if(!await me(n,l))return false;for(let u=0;u<te.value.maxFillPages;u+=1){if(!X(n,l))return false;let b=m.value,I=b?.getEntryUnreadCenteringNeeds();if(b===null||!I)return false;if(I.older&&i$1.value.hasOlder)await $("automatic",d);else if(I.newer&&i$1.value.hasNewer&&c.actions.loadNewer!==void 0){b.prepareHistoryPageAppend();try{await W(d)<=0&&X(n,l)&&b.cancelHistoryPageAppend();}catch(F){throw X(n,l)&&b.cancelHistoryPageAppend(),F}}else return true;if(await nextTick(),await nextTick(),!await me(n,l))return false}return X(n,l)}function Ke(n){S.value=n.isAtBottom,N.value=n.newMessageCount,pe(),ke();}function Ue(n,l){return m.value?.scrollToMessage(n,l)??false}function X(n,l){return !Y&&L===l&&M.value===n&&A.value}async function Ve(n,l,d,u){for(let b=0;b<60;b+=1){if(!X(n,l))return false;if(Ue(d,u))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(I=>window.requestAnimationFrame(()=>I()));}return false}async function Ce(n,l,d){let u=m.value;if(u===null||!u.isMeasurable()||u.isScrollable())return true;let b=0,I=!i$1.value.hasOlder,F=!i$1.value.hasNewer||c.actions.loadNewer===void 0,le=async()=>(await nextTick(),await nextTick(),Ve(n,l,d,{behavior:"auto",block:"center"})),ve=async be=>{if(!X(n,l)||b>=te.value.maxFillPages)return false;let we=0;if(be==="older"){if(I||!i$1.value.hasOlder)return false;we=await $(),I=!i$1.value.hasOlder;}else {if(F||!i$1.value.hasNewer)return false;u.prepareHistoryPageAppend();try{we=await x();}catch(We){throw u.cancelHistoryPageAppend(),We}we<=0&&!i$1.value.hasNewer&&u.cancelHistoryPageAppend(),F=!i$1.value.hasNewer;}return b+=1,we>0?le():!(be==="older"?I:F)};!I&&!await ve("older")&&(I=true),!F&&!await ve("newer")&&(F=true);let Ae="older";for(;X(n,l)&&b<te.value.maxFillPages&&u.isMeasurable()&&!u.isScrollable()&&(!I||!F);){let be=Ae==="older"?I?"newer":"older":F?"older":"newer";Ae=be==="older"?"newer":"older",await ve(be)||(be==="older"?I=true:F=true);}return X(n,l)}async function _e(n,l={behavior:"auto",block:"center"}){if(!A.value||n==="")return false;let d=M.value,u=++L;if(!f.value.includes(n)){let F=c.actions.loadAround;if(F===void 0||!await v({kind:"locate-message",messageId:n},()=>F(n))||!X(d,u))return false}return !await Ve(d,u,n,{...l,behavior:"auto"})||!await Ce(d,u,n)?false:Ve(d,u,n,l)}function Pe(){_!==void 0&&(clearTimeout(_),_=void 0);}function Se(){if(Pe(),!H.value)return;let n=t.readActions;if(n===void 0&&c.actions.markVisibleMessages===void 0)return;let l=Number.isFinite(z.value.visibleReadDelay)?Math.max(0,z.value.visibleReadDelay):ut.visibleReadDelay;_=setTimeout(()=>{if(_=void 0,!A.value||!ie.value)return;fe();let d=c.actions.markVisibleMessages;if(d!==void 0){let I=E;d(I).catch(F=>{t.hooks?.onError?.({kind:"visible-range",messageIds:I},F);});return}if(n===void 0)return;let u=E[E.length-1];if(u===void 0)return;let b=n.resolveTarget===void 0?u:n.resolveTarget(u);b!=null&&Promise.resolve(n.markRead(b)).catch(I=>{t.hooks?.onError?.({kind:"visible-range",messageIds:E},I);});},l);}function ye(n){E=Object.freeze([...n]),pe();let l={kind:"visible-range",messageIds:E};t.hooks?.beforeAction?.(l);try{c.actions.onVisibleRange?.(E),t.hooks?.afterAction?.(l,void 0);}catch(d){throw t.hooks?.onError?.(l,d),d}H.value?Se():ke();}function ae(n,l){return !Y&&G===l&&M.value===n&&!Z}function je(n,l){ae(n,l)&&(K=n,D=Ee(Te()),H.value=true,pe(),fe(),Se());}function Te(){return i$1.value.entryUnreadNavigation===void 0?i$1.value.entryUnread:{state:"none"}}function Ee(n){return n.state!=="located"?n.state:`${n.state}:${n.firstMessageId}`}async function Ne(n,l,d){for(let u=0;u<60;u+=1){if(!ae(n,l))return false;if(m.value?.scrollToMessage(d,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(I=>window.requestAnimationFrame(()=>I()));}return false}function ke(){let n=M.value,l=Ee(Te());if(n===""||i$1.value.loading||i$1.value.error!==null&&i$1.value.messages.length===0||K===n&&(D===l||D.startsWith("located:")||Z)||re===n||J!==null)return;if(!te.value.enabled){K=n,D=l,H.value=true,Se();return}let d=++G;Z=false,H.value=false;let u=(async()=>{if(await nextTick(),!ae(n,d))return;let b=m.value;if(b===null||!b.isMeasurable())return;let I=Te();if(I.state==="located"&&!f.value.includes(I.firstMessageId))return;let F=I.state==="located"?await Ne(n,d,I.firstMessageId):false;if(I.state==="located"&&!F)return;F||b.scrollToLatest();let le=0;for(;ae(n,d)&&le<te.value.maxFillPages&&i$1.value.error===null&&(i$1.value.hasOlder||i$1.value.hasNewer&&c.actions.loadNewer!==void 0)&&b.isMeasurable()&&!b.isScrollable();){if(i$1.value.hasNewer&&c.actions.loadNewer!==void 0&&(i$1.value.messages.length===0||!i$1.value.hasOlder)){let Ae=L;b.prepareHistoryPageAppend();try{await x(),await nextTick();}finally{M.value===n&&L===Ae&&(G===d||Z)&&b.cancelHistoryPageAppend();}}else await $();if(!ae(n,d)||(le+=1,await nextTick(),await nextTick(),!b.isMeasurable()))return}if(!ae(n,d)||!b.isMeasurable())return;let ve=Te();if(ve.state==="located"){if(!f.value.includes(ve.firstMessageId)||!await Ne(n,d,ve.firstMessageId))return}else b.scrollToLatest();await nextTick(),je(n,d);})().catch(()=>{ae(n,d)&&(re=n);}).finally(()=>{J===u&&(J=null);});J=u;}function ge(n,l=false){G+=1,J=null,Z=false,H.value=n,n||(K="",D="",l||(re="")),Pe();}function qe(){if(pe(true),T.value&&(L+=1),Z=true,H.value)return;let n=M.value;G+=1,J=null,K=n,H.value=true,Se();}let Oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:$,retryOlder:Xe,loadNewer:x,retryNewer:Fe,jumpToLatest:Je,jumpToEntryUnread:Qe,scrollToMessage:Ue,locateMessage:_e,focusViewport:()=>m.value?.focusViewport()});return a(Oe),watch(ie,n=>{n&&H.value?Se():Pe();}),watch([()=>i$1.value.activeRemoteMessageRevision??0,m,M],()=>{let n=m.value;if(n===null||!A.value)return;let l=c.actions.drainActiveRemoteMessageIds?.()??[];n.trackRemoteMessageIds(l,{isAtBottom:S.value,isHistoryWindow:i$1.value.isHistoryWindow,isPageVisible:he.value})&&(S.value=false);},{flush:"post"}),watch([M,()=>i$1.value.loading,()=>i$1.value.error,()=>f.value.length,()=>i$1.value.hasOlder,()=>Ee(Te()),te,()=>i$1.value.hasNewer],([n,l,d,u,,b],[I,,,F,,le])=>{if(n!==I&&(L+=1,ge(false),p(true),m.value?.clearNewMessageBadge(),N.value=0,S.value=true,E=[],U.value=false,w.value=false,k.value=false,o.value=false,T.value=false,V=void 0,h=false,C=void 0),n!==""&&n===I&&F!==void 0&&F>0&&u===0&&(i$1.value.hasOlder||i$1.value.hasNewer)&&H.value&&ge(false,true),n!==""&&n===I&&b!==le&&!D.startsWith("located:")&&!Z&&b.startsWith("located:")&&(K="",D="",H.value=false),n===""){ge(false);return}if(d!==null&&i$1.value.messages.length===0){H.value||ge(false,true);return}l||ke();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{Y=true,L+=1,ge(false),p(true);}),()=>{let n={conversation:t.conversation,state:i$1.value,items:ne.value,actions:Oe,initialViewportSettled:M.value!==""&&(i$1.value.messages.length===0?!i$1.value.loading&&i$1.value.error===null&&!i$1.value.hasOlder&&!i$1.value.hasNewer:H.value&&K===M.value)},l=[y.header?.(n),y["before-list"]?.(n)];if(!A.value)l.push(y.unsupported?.(n)??h$1("div",{"data-im-thread-unsupported":""}));else if(!i$1.value.ready&&i$1.value.loading)l.push(y.loading?.(n)??h$1("div",{"data-im-thread-loading":""}));else if(i$1.value.error!==null&&i$1.value.messages.length===0)l.push(y.error?.(n)??h$1("div",{"data-im-thread-error":""}));else if(i$1.value.ready&&i$1.value.messages.length===0&&!i$1.value.hasOlder&&!i$1.value.hasNewer)l.push(y.empty?.(n)??h$1("div",{"data-im-thread-empty":""}));else {let d=h$1(st,{ref:m,messageIds:f.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:i$1.value.loadingOlder??i$1.value.loading,hasNewer:i$1.value.hasNewer,loadingNewer:i$1.value.loadingNewer??i$1.value.loading,followThreshold:z.value.followThreshold,olderPrefetchThreshold:z.value.olderPrefetchThreshold,visibleMargin:z.value.visibleMargin,activeDateOffset:z.value.activeDateOffset,activeDateEnabled:y["active-date"]!==void 0,resizeFollowEnabled:H.value,followNewMessages:he.value,shouldFollowAppendedMessage:u=>{let b=i$1.value.messages.find(I=>I.id===u);return b===void 0?false:c.shouldFollowMessage?.(b)===true},onReachStart:()=>{De("older").catch(()=>{});},onReachEnd:()=>{De("newer").catch(()=>{});},onSettled:Ke,onUserScroll:qe,onActiveDateChange:j,onVisibleRange:ye,onNewMessageCount:u=>{N.value=u;}},{default:()=>[y["viewport-before"]?.(n),h$1(it,{items:ne.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:y.item,"date-separator":y["date-separator"],"entry-unread":y["entry-unread"],encryption:y.encryption,system:y.system,message:y.message,"recalled-message":y["recalled-message"],"deleted-message":y["deleted-message"],"unsupported-body":y["unsupported-body"]}),y["viewport-after"]?.(n)]});l.push(h$1("div",{"data-im-thread-viewport-shell":""},[y["active-date"]?.({label:ee.value,visible:q.value&&ee.value!==""}),d,y["entry-unread-navigation"]?.({...n,count:i$1.value.entryUnreadNavigation?.state==="none"?0:i$1.value.entryUnreadNavigation?.count??0,loading:T.value,visible:n.initialViewportSettled&&!U.value&&!w.value&&!i$1.value.isHistoryWindow&&i$1.value.entryUnreadNavigation!==void 0&&i$1.value.entryUnreadNavigation.state!=="none"&&i$1.value.entryUnreadNavigation.count>0&&(k.value||i$1.value.hasOlder)})])),i$1.value.error!==null&&l.push(y.error?.(n)??h$1("div",{"data-im-thread-error":""}));}return l.push(y["after-list"]?.(n),y["jump-to-latest"]?.({...n,count:N.value,visible:o.value||!S.value||i$1.value.isHistoryWindow}),y["context-menu"]?.(n),y.composer?.(n)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},l)}}});function Rn(t){let a=new Map;for(let c of t){if(a.has(c.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${c.kind}`);a.set(c.kind,c.component);}let y=Object.freeze([...a.keys()]);return Object.freeze({kinds:y,resolve:c=>a.get(c)})}var Sn=140,En=120;function $e(t,a){if(t.width<=0||t.height<=0)return 0;let y=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),c=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,y*c/(t.width*t.height))}function ft(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 mt(t){let a=Math.max(0,t.scrollIdleMs??Sn),y=Math.max(0,t.visibilityDwellMs??En),c=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),N=Math.max(0,t.preloadMarginPx??0),U=Math.max(m,N),T=Math.max(0,t.maxPreloadTargets??Number.POSITIVE_INFINITY),V=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,k=new Map,o=reactive(new Set),h=new Set,C=new Set,S=[],E=null,_=null,G=null,L=false,J=false,K=false,D=false,re,Z;function Y(){re!==void 0&&clearTimeout(re),re=void 0;}function H(){Z!==void 0&&clearTimeout(Z),Z=void 0;}function ee(f=false){if(!f&&_!==null||E===null)return;let P=E.getBoundingClientRect(),p=ft(P,U);for(let[j,v]of w){let $=j.getBoundingClientRect();v.ratio=$e($,P),v.intersecting=v.ratio>0,v.revealIntersecting=U>0?$e($,p)>0:v.intersecting&&v.ratio>=c;}}function q(f){return f.intersecting&&f.ratio>=c}function Q(){for(let[f,P]of w)!P.revealIntersecting||o.has(P.key)||U>m&&(m===0&&!q(P)||m>0&&(E===null||$e(f.getBoundingClientRect(),ft(E.getBoundingClientRect(),m))<=0))||(o.add(P.key),t.onRevealed?.(P.item));}function oe(f,P=false){let p=new Set(f.map(v=>v.key));if(!(!(p.size!==C.size||[...p].some(v=>!C.has(v)))&&!P)){C.clear();for(let v of p)C.add(v);t.onSettledVisibleChange?.(f.map(v=>v.item));}}function i(f,P=false){!P&&f.length===S.length&&f.every((p,j)=>p.key===S[j]?.key&&p.item===S[j]?.item)||(S=f,t.onSettledPreloadChange?.(f.map(p=>p.item)));}function he(){if(K||L)return;let f=J;J=false,ee(),Q();let P=E?.getBoundingClientRect(),p=P===void 0?0:(P.top+P.bottom)/2,j=[...w.entries()].filter(([,v])=>q(v)).sort(([v],[$])=>{let x=v.getBoundingClientRect(),W=$.getBoundingClientRect();return Math.abs((x.top+x.bottom)/2-p)-Math.abs((W.top+W.bottom)/2-p)}).slice(0,V).map(([,v])=>v);if(oe(j,f),t.onSettledPreloadChange!==void 0&&P!==void 0){let v=ft(P,N),$=[...w.entries()].filter(([,x])=>x.revealIntersecting).map(([x,W])=>({target:W,rect:x.getBoundingClientRect()})).filter(({target:x,rect:W})=>q(x)||N>0&&$e(W,v)>0).sort((x,W)=>Number(q(W.target))-Number(q(x.target))||Math.abs((x.rect.top+x.rect.bottom)/2-p)-Math.abs((W.rect.top+W.rect.bottom)/2-p)).slice(0,T).map(({target:x})=>x);i($,f);}for(let v of j)h.has(v.key)||(h.add(v.key),t.onActivated?.(v.item));}function ie(){K||L||(H(),Z=setTimeout(()=>{Z=void 0,he();},y));}function A(){K||(J=true,z(true),i([]),ee(),Q(),oe([]),H(),Y(),re=setTimeout(()=>{re=void 0,z(false),ie();},a));}function z(f){L!==f&&(L=f,t.onScrollingChange?.(f));}function te(){E?.removeEventListener("scroll",A),_?.disconnect(),G?.disconnect(),_=null,G=null,E=null;}function M(f=true){if(K)return;let P=t.getRoot();if(!(P===E&&E!==null)){if(i([]),te(),E=P,E===null){f&&!D&&(D=true,Promise.resolve().then(()=>{D=false,K||(M(false),ie());}));return}if(E.addEventListener("scroll",A,{passive:true}),typeof IntersectionObserver<"u"){_=new IntersectionObserver(p=>{for(let j of p){let v=w.get(j.target);v!==void 0&&(v.intersecting=j.isIntersecting,v.ratio=j.intersectionRatio,U===0&&(v.revealIntersecting=j.isIntersecting&&j.intersectionRatio>=c));}Q(),ie();},{root:E,threshold:[0,c,1]}),U>0&&(G=new IntersectionObserver(p=>{for(let j of p){let v=w.get(j.target);v!==void 0&&(v.revealIntersecting=j.isIntersecting);}Q(),ie();},{root:E,rootMargin:`${U}px 0px`,threshold:0}));for(let p of w.keys())_.observe(p);for(let p of w.keys())G?.observe(p);}else ee(),Q();}}function ne(f){i(S.filter(P=>P.key!==f)),o.delete(f),h.delete(f),C.delete(f);}return {register(f,P){if(K)return;let p=t.getKey(f),j=o.has(p),v=h.has(p),$=P===null?void 0:w.get(P);$!==void 0&&$.key!==p&&(k.delete($.key),w.delete(P),ne($.key));let x=k.get(p);if(x!==void 0&&x!==P&&(_?.unobserve(x),G?.unobserve(x),w.delete(x),k.delete(p)),P===null){x!==void 0&&(_?.unobserve(x),G?.unobserve(x),w.delete(x),k.delete(p)),ne(p);return}let W=w.get(P);if(W?.key===p&&W.item===f){M();return}w.set(P,{item:f,key:p,intersecting:W?.key===p?W.intersecting:false,ratio:W?.key===p?W.ratio:0,revealIntersecting:W?.key===p?W.revealIntersecting:false}),k.set(p,P),M(),_?.observe(P),G?.observe(P),ee(true),Q(),j&&t.onRevealed?.(f),v&&t.onActivated?.(f),ie();},isRevealed:f=>o.has(t.getKey(f)),isActivated:f=>h.has(t.getKey(f)),isSettledVisible:f=>C.has(t.getKey(f)),isScrolling:()=>L,notifyScroll:A,refresh(){M(),ee(true),Q(),ie();},reset(){Y(),H(),z(false),J=false,oe([]),i([]),te(),w.clear(),k.clear(),o.clear(),h.clear();},dispose(){K||(Y(),H(),z(false),J=false,oe([]),i([]),te(),w.clear(),k.clear(),o.clear(),h.clear(),K=true);}}}function An(t){let a=new Map,y=new Map,c=false,m=T=>{let V=a.get(T.channel);return V===void 0?T.channel:`${T.channel}\0${V.getKey(T.item)}`},N=mt({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,preloadMarginPx:t.preloadMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:T=>{for(let V of a.values())V.onScrollingChange?.(T);},onRevealed:T=>a.get(T.channel)?.onRevealed?.(T.item),onActivated:T=>a.get(T.channel)?.onActivated?.(T.item),onSettledPreloadChange:T=>{for(let[V,w]of a){let k=T.filter(o=>o.channel===V).map(o=>o.item);w.onSettledPreloadChange?.(k.slice(0,Math.max(0,w.maxPreloadTargets??Number.POSITIVE_INFINITY)));}},onSettledVisibleChange:T=>{for(let[V,w]of a){let k=T.filter(h=>h.channel===V).map(h=>h.item),o=w.maxSettledVisible===void 0?k:k.slice(0,w.maxSettledVisible);w.onSettledVisibleChange?.(o);}}});function U(T){return V=>{if(c)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(a.has(T))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${T}`);a.set(T,V);let w=new Map;y.set(T,w);let k=false,o=S=>({channel:T,item:S});function h(){for(let S of w.values())N.register(S.target,null);w.clear(),V.onScrollingChange?.(false),V.onSettledVisibleChange?.([]),V.onSettledPreloadChange?.([]);}return {register(S,E){if(k||c)return;let _=V.getKey(S),G=w.get(_);if(E===null){G!==void 0&&(N.register(G.target,null),w.delete(_));return}let L=G?.target.item===S?G.target:o(S);w.set(_,{target:L,element:E}),N.register(L,E);},isRevealed:S=>N.isRevealed(o(S)),isActivated:S=>N.isActivated(o(S)),isSettledVisible:S=>N.isSettledVisible(o(S)),isScrolling:N.isScrolling,notifyScroll:N.notifyScroll,refresh:N.refresh,reset:h,dispose(){k||(h(),k=true,a.delete(T),y.delete(T));}}}}return {createFactory:U,refresh:N.refresh,dispose(){if(!c){for(let T of y.values())for(let V of T.values())N.register(V.target,null);for(let T of a.values())T.onSettledPreloadChange?.([]);y.clear(),a.clear(),N.dispose(),c=true;}}}}export{rt as ImThreadBodySwitch,it as ImThreadItems,Mn as ImThreadSurface,st as ImThreadViewport,hn as createImThreadSurfaceContext,Rn as createMessageRendererRegistry,An as createThreadVisibilityTargetGroup,mt as createThreadVisibilityTargets,pn as provideImThreadSurfaceContext,Xt as useImText,lt as useImThreadSurfaceContext,Zt as useOptionalImThreadReadActions};
@@ -199,6 +199,8 @@ interface ImVideoBody {
199
199
  width: number;
200
200
  /** 视频像素高(BMessage.height)。 */
201
201
  height: number;
202
+ /** 发送方显式选择了 HD 原视频(BMessage.hd);不按分辨率猜测。 */
203
+ hd?: boolean;
202
204
  /** 时长(秒,可含小数);移动端旧消息的毫秒值由 SDK 转换,宿主不得猜单位。 */
203
205
  duration?: number;
204
206
  /** SDK 已确认时长为秒的标记;兼容旧缓存时防止重复转换。缺省仍按公开 API 的秒约定传入。 */
@@ -752,6 +754,8 @@ interface ImMessage {
752
754
  serverTime?: number;
753
755
  /** P0 默认 'unread'。 */
754
756
  receipt: MessageReceipt;
757
+ /** 离线单聊服务端标记当前账号已在其它端读过;仅用于本地未读投影,不改变对端回执 receipt。 */
758
+ readBySelf?: boolean;
755
759
  encryption: ImMessageEncryption;
756
760
  /** 群消息 @ 提及(仅群 @ 消息有;解析自 MESGrpChat 明文字段 + extend)。展示走 resolveMentionSegments。 */
757
761
  mention?: ImMessageMention;
@@ -769,7 +773,7 @@ interface ImMessage {
769
773
  };
770
774
  /**
771
775
  * CHANNEL 管理员/社群主全员删除终态。它与发送者本人撤回、`deleteLocal` 完全不同:服务端通过
772
- * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空,产品统一展示“管理员删除了一条消息”。
776
+ * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空;线程与会话摘要仅向群主、管理员展示删除提示,普通成员及未知角色隐藏。
773
777
  */
774
778
  deletedForEveryone?: {
775
779
  by: string;
@@ -951,6 +955,15 @@ interface ImSession {
951
955
  * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 落盘时剔除)。
952
956
  */
953
957
  lastMessageSendState?: 'sending' | 'failed';
958
+ /**
959
+ * 最新一条己方已发送消息的回执态。
960
+ *
961
+ * 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
962
+ * `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
963
+ * 该字段随最新消息变化,并随会话落盘,避免冷启动后
964
+ * 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
965
+ */
966
+ lastMessageReceipt?: 'unread' | 'read';
954
967
  /** P0 我方已读游标(见 §4.3)。 */
955
968
  readCursor?: string;
956
969
  /** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
@@ -1052,8 +1065,8 @@ interface UserProfile {
1052
1065
  /** 用户自设昵称(后端 `nick_name`)。 */
1053
1066
  nickname: string;
1054
1067
  /**
1055
- * 好友备注名(后端 `/user/info/friend` 的 `remark_name`,仅好友关系有)。
1056
- * 与 `nickname` 并存:展示名优先级 = 备注名 > 昵称(安卓 SessionUtils.getShowUserName 实证)。
1068
+ * 好友展示备注(后端 `/user/info/friend` 的 `remark_name`,无备注时回退 `contact_name`,仅好友关系有)。
1069
+ * 与 `nickname` 并存:展示名优先级 = 备注名/通讯录名 > 昵称(安卓 SessionUtils.getShowUserName 实证)。
1057
1070
  */
1058
1071
  remark?: string;
1059
1072
  avatar?: string;
@@ -2104,6 +2117,11 @@ type StoredConversationBackground = {
2104
2117
  * 失败经 `error` 事件(scope:'storage')暴露、不静默吞、不阻塞内存主流程。
2105
2118
  */
2106
2119
  interface ImStoragePort {
2120
+ /**
2121
+ * 显式支持 CHANNEL 持久同步位置。声明 true 的 adapter 必须在删除会话正文/清历史事务中
2122
+ * 同时删除 channelSyncCheckpointKey 对应 meta;旧 adapter 缺省不启用跨运行续传。
2123
+ */
2124
+ readonly supportsChannelSyncCheckpoint?: true;
2107
2125
  /** 可选的最近页持久缓存;缺少该能力时 SDK 必须明确跳过持久预取。 */
2108
2126
  recentHistoryCache?: ImRecentHistoryCachePort;
2109
2127
  /** 打开/创建账号库并跑迁移(幂等)。open 前的读写应视为未就绪并抛错(不静默兜底)。 */
@@ -2169,12 +2187,13 @@ interface ImStoragePort {
2169
2187
  deleteSession: (conversation: ImStorageConversation) => Promise<void>;
2170
2188
  /** 删除单会话已读态(删除会话用)。 */
2171
2189
  deleteReadState: (conversation: ImStorageConversation) => Promise<void>;
2172
- /** 删除某会话全部本地消息(删除会话用)。 */
2190
+ /** 删除某会话全部本地消息及对应 CHANNEL 同步位置,二者须在同一事务内清理。 */
2173
2191
  deleteConversationMessages: (conversation: ImStorageConversation) => Promise<void>;
2174
2192
  /**
2175
2193
  * 原子清空精确会话的本机历史,并同步写入清空后的会话摘要与本机读态。
2176
2194
  *
2177
2195
  * @remarks 这是可选 capability,供产品 `history.clearLocal()` 使用;自定义 adapter 未实现时必须显式拒绝,不能退化为多次写入制造半清理状态。
2196
+ * 同一事务还须删除 channelSyncCheckpointKey(conversation) 对应同步位置,避免正文已清而继续跳过旧页。
2178
2197
  * 不删除会话行、草稿、Outbox、置顶消息或任何远端数据。
2179
2198
  */
2180
2199
  clearConversationHistory?: (conversation: ConversationRef, nextSession?: ImSession, nextReadState?: ReadState) => Promise<void>;
@@ -3175,7 +3194,7 @@ interface ImMessageViewBody extends Omit<ImMessageBody, 'image' | 'video' | 'voi
3175
3194
  * `sortKey`、原始协议 `raw`、包含 history cursor 的 `extensions` 以及媒体 key。定位和下载必须继续
3176
3195
  * 通过绑定精确 `ConversationRef` 的 SDK handle/capability 完成,UI 不得从 DTO 恢复内部字段。
3177
3196
  */
3178
- type ImMessageView = Readonly<Omit<ImMessage, 'sortKey' | 'raw' | 'extensions' | 'body' | 'reactions'> & {
3197
+ type ImMessageView = Readonly<Omit<ImMessage, 'sortKey' | 'raw' | 'extensions' | 'body' | 'reactions' | 'readBySelf'> & {
3179
3198
  body: ImMessageViewBody;
3180
3199
  reactions?: ImMessageReactions;
3181
3200
  }>;
@@ -4436,6 +4455,13 @@ interface ConversationListItem {
4436
4455
  by: string;
4437
4456
  }>;
4438
4457
  lastMessageSendState?: 'sending' | 'failed';
4458
+ /**
4459
+ * 最新一条己方已发送消息的对端已读态。
4460
+ *
4461
+ * 只在自己发出且已发送成功时出现;发送中/失败、对端消息、撤回和系统提示都不给。
4462
+ * 单聊会话列表用它在摘要前画灰色单勾/绿色双勾;群组与社群即使有该字段也不展示。
4463
+ */
4464
+ lastMessageReceipt?: 'unread' | 'read';
4439
4465
  timestamp: number;
4440
4466
  unreadCount: number;
4441
4467
  /** 是否为用户手工添加的本地未读提醒;此时 `unreadCount` 至少投影为 1。 */
@@ -4624,6 +4650,21 @@ type ConversationEntryUnreadSnapshot = Readonly<{
4624
4650
  }> | Readonly<{
4625
4651
  state: 'unavailable';
4626
4652
  }>;
4653
+ /** 进入时冻结的导航提示;数量独立于会话已读,不暴露内部历史排序边界。 */
4654
+ type ConversationEntryUnreadNavigation = Readonly<{
4655
+ state: 'none';
4656
+ }> | Readonly<{
4657
+ state: 'pending' | 'unavailable';
4658
+ count: number;
4659
+ }> | Readonly<{
4660
+ state: 'located';
4661
+ count: number;
4662
+ firstMessageId: string;
4663
+ }> | Readonly<{
4664
+ state: 'failed';
4665
+ count: number;
4666
+ error: ImSdkErrorShape;
4667
+ }>;
4627
4668
 
4628
4669
  /**
4629
4670
  * Emoji、GIF 与贴图稳定产品门面。
@@ -4787,6 +4828,8 @@ interface ConversationOpenOptions {
4787
4828
  * 后续 read 事件或新消息不会移动分隔线。
4788
4829
  */
4789
4830
  initialPosition?: ConversationInitialPosition;
4831
+ /** 冻结进入时未读导航,独立于初始位置;清会话未读后仍可定位原边界。 */
4832
+ captureEntryUnread?: boolean;
4790
4833
  /**
4791
4834
  * 初始历史加载方式,默认 `blocking`。
4792
4835
  *
@@ -4814,6 +4857,8 @@ interface ConversationHandleSnapshot<TType extends ProductHandleConversationType
4814
4857
  messages: readonly ImMessageView[];
4815
4858
  /** 本次打开时冻结的未读入口;只用于产品 UI 分隔线,不作为 SDK 已读真相。 */
4816
4859
  entryUnread: ConversationEntryUnreadSnapshot;
4860
+ /** 显式请求的进入导航快照;旧消费者不请求时省略。 */
4861
+ entryUnreadNavigation?: ConversationEntryUnreadNavigation;
4817
4862
  /** 当前账号本机草稿;不承诺跨端同步。 */
4818
4863
  draft: ConversationDraft | null;
4819
4864
  loading: boolean;
@@ -5114,6 +5159,8 @@ interface ConversationHandle<TType extends ProductHandleConversationType = Produ
5114
5159
  resolveMessage: (messageId: string) => Promise<ImMessageView | null>;
5115
5160
  history: {
5116
5161
  loadLatest: () => Promise<void>;
5162
+ /** 有限加载进入时冻结边界;成功才替换窗口,不可定位返回 false,网络失败抛错并保留数量。 */
5163
+ loadEntryUnread: () => Promise<boolean>;
5117
5164
  loadOlder: () => Promise<void>;
5118
5165
  /** 历史定位窗口向更新方向连续翻页;接回最新端后 `hasNewer` 变为 false。 */
5119
5166
  loadNewer: () => Promise<void>;
@@ -5144,6 +5191,10 @@ interface ConversationHandle<TType extends ProductHandleConversationType = Produ
5144
5191
  draft: ConversationDraftApi;
5145
5192
  /** 标记窗口最新消息或显式可见消息为已读;SDK 按精确 sibling 解析真实 read cursor。 */
5146
5193
  markRead: (messageId?: string) => Promise<void>;
5194
+ /** 结算最新可信边界的会话未读;不会将整个范围登记为对端可见回执。 */
5195
+ markConversationRead: () => Promise<void>;
5196
+ /** 只登记实际可见的消息 ID;历史消息也可补报,媒体消费继续使用独立动作。 */
5197
+ markVisibleMessages: (messageIds: readonly string[]) => Promise<void>;
5147
5198
  setMuted: (muted: boolean) => Promise<void>;
5148
5199
  close: () => void;
5149
5200
  }
@@ -6731,6 +6782,13 @@ interface ConversationListPresentation {
6731
6782
  * 名片等没有产品 glyph 的类型同样不给,它们的文案自带方括号来和真实文本区分。
6732
6783
  */
6733
6784
  previewMediaKind?: ConversationListPreviewMediaKind;
6785
+ /**
6786
+ * 单聊自己发出的已发送消息在摘要前显示的回执态;未读(尚无已读回执)灰单勾、已读绿双勾。
6787
+ *
6788
+ * 群组/社群、对端消息、草稿、发送中/失败、撤回、系统提示都不给。可与 `previewMediaKind` 同时存在,
6789
+ * 宿主必须把已读图标画在类型图标前面。
6790
+ */
6791
+ previewReceipt?: 'unread' | 'read';
6734
6792
  /** 群聊或社群普通消息的发送者前缀;其它摘要为空串。 */
6735
6793
  senderPrefix: string;
6736
6794
  /** 未读 @ 提示;草稿、系统、撤回和管理员删除摘要为空串。 */
@@ -8555,6 +8613,10 @@ type ImThreadIntent = Readonly<{
8555
8613
  kind: 'load-newer';
8556
8614
  }> | Readonly<{
8557
8615
  kind: 'jump-to-latest';
8616
+ }> | Readonly<{
8617
+ kind: 'jump-to-entry-unread';
8618
+ }> | Readonly<{
8619
+ kind: 'mark-conversation-read';
8558
8620
  }> | Readonly<{
8559
8621
  kind: 'locate-message';
8560
8622
  messageId: string;