k2-im 0.1.36 → 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 的秒约定传入。 */
@@ -724,7 +728,7 @@ interface ImMessage {
724
728
  };
725
729
  /**
726
730
  * CHANNEL 管理员/社群主全员删除终态。它与发送者本人撤回、`deleteLocal` 完全不同:服务端通过
727
- * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空,产品统一展示“管理员删除了一条消息”。
731
+ * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空;线程与会话摘要仅向群主、管理员展示删除提示,普通成员及未知角色隐藏。
728
732
  */
729
733
  deletedForEveryone?: {
730
734
  by: string;
@@ -904,6 +908,15 @@ interface ImSession {
904
908
  * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 落盘时剔除)。
905
909
  */
906
910
  lastMessageSendState?: 'sending' | 'failed';
911
+ /**
912
+ * 最新一条己方已发送消息的回执态。
913
+ *
914
+ * 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
915
+ * `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
916
+ * 该字段随最新消息变化,并随会话落盘,避免冷启动后
917
+ * 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
918
+ */
919
+ lastMessageReceipt?: 'unread' | 'read';
907
920
  /** P0 我方已读游标(见 §4.3)。 */
908
921
  readCursor?: string;
909
922
  /** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
@@ -1239,6 +1252,22 @@ interface MediaTransferAdapterConfig {
1239
1252
  * 未知正文显式投影为 `unknown`,不能猜成文本。这里也集中生成稳定 SDK 错误,供所有产品域统一暴露。
1240
1253
  */
1241
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
+ }
1242
1271
  /** 一种表情回应的稳定聚合;不包含内部事件 ID 或协议字段。 */
1243
1272
  interface ImMessageReactionAggregate {
1244
1273
  emoji: string;
@@ -1282,6 +1311,26 @@ type ImMessageView = Readonly<Omit<ImMessage, 'sortKey' | 'raw' | 'extensions' |
1282
1311
  body: ImMessageViewBody;
1283
1312
  reactions?: ImMessageReactions;
1284
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
+ }
1285
1334
 
1286
1335
  /**
1287
1336
  * 将 Core 会话列表投影成 default 产品 DTO 和可订阅原子快照。
@@ -1302,6 +1351,55 @@ type ConversationEntryUnreadSnapshot = Readonly<{
1302
1351
  }> | Readonly<{
1303
1352
  state: 'unavailable';
1304
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
+ }
1305
1403
 
1306
1404
  /**
1307
1405
  * SDK 对外的结构化诊断投影、过滤与 sink 装配。
@@ -1608,6 +1706,8 @@ interface ImThreadInitialViewportOptions {
1608
1706
  maxFillPages?: number;
1609
1707
  }
1610
1708
  /** 结构 slots 可调用的稳定 Surface actions。 */
1709
+ /** 区分定位完成、目标不可显示与用户取消,避免把正常中断误报为失败。 */
1710
+ type ImThreadEntryUnreadNavigationResult = 'located' | 'unavailable' | 'cancelled';
1611
1711
  interface ImThreadSurfaceSlotActions {
1612
1712
  /** 返回 Surface 唯一滚动根,供宿主媒体观察等平台能力复用;宿主不得建立第二套滚动控制器。 */
1613
1713
  getViewportElement: () => HTMLElement | null;
@@ -1616,6 +1716,8 @@ interface ImThreadSurfaceSlotActions {
1616
1716
  loadNewer: () => Promise<number>;
1617
1717
  retryNewer: () => Promise<number>;
1618
1718
  jumpToLatest: () => Promise<boolean>;
1719
+ /** 返回本次进入前的未读边界,与实时已读数量无关。 */
1720
+ jumpToEntryUnread: () => Promise<ImThreadEntryUnreadNavigationResult>;
1619
1721
  /** 在当前已加载窗口内定位消息;找不到或布局不可测时返回 false。 */
1620
1722
  scrollToMessage: (messageId: string, options?: ScrollIntoViewOptions) => boolean;
1621
1723
  /** 必要时先替换为目标附近窗口,再等待真实消息节点登记并完成定位。 */
@@ -1635,6 +1737,13 @@ interface ImThreadViewportSettledSnapshot {
1635
1737
  }
1636
1738
  /** Surface initial controller 可调用的无产品语义滚动能力。 */
1637
1739
  interface ImThreadViewportExposed {
1740
+ /** 将已登记的未读分割线居中;历史边缘按真实内容范围限制滚动,不补空白。 */
1741
+ scrollToEntryUnread: () => boolean;
1742
+ /** 测量分割线两侧是否各有半屏内容,供 Surface 决定是否继续加载对应历史。节点尚未注册时返回 null。 */
1743
+ getEntryUnreadCenteringNeeds: () => {
1744
+ older: boolean;
1745
+ newer: boolean;
1746
+ } | null;
1638
1747
  /** 返回 Surface 自己持有的唯一滚动根,供宿主媒体观察等平台能力复用;调用方不得修改其所有权。 */
1639
1748
  getViewportElement: () => HTMLElement | null;
1640
1749
  /** 清空当前视口维护的未见消息集合。 */
@@ -1732,6 +1841,10 @@ type ImThreadIntent = Readonly<{
1732
1841
  kind: 'load-newer';
1733
1842
  }> | Readonly<{
1734
1843
  kind: 'jump-to-latest';
1844
+ }> | Readonly<{
1845
+ kind: 'jump-to-entry-unread';
1846
+ }> | Readonly<{
1847
+ kind: 'mark-conversation-read';
1735
1848
  }> | Readonly<{
1736
1849
  kind: 'locate-message';
1737
1850
  messageId: string;
@@ -1754,6 +1867,8 @@ interface ImThreadSurfaceState {
1754
1867
  messages: readonly ImMessageView[];
1755
1868
  /** 打开会话时冻结的首条未读入口。 */
1756
1869
  entryUnread: ConversationEntryUnreadSnapshot;
1870
+ /** 存在时使用最新首屏与独立历史未读胶囊。 */
1871
+ entryUnreadNavigation?: ConversationHandleSnapshot['entryUnreadNavigation'];
1757
1872
  /** handle 首次快照是否已经可用。 */
1758
1873
  ready: boolean;
1759
1874
  /** 当前是否正在执行窗口操作。 */
@@ -1783,6 +1898,12 @@ interface ImThreadSurfaceState {
1783
1898
  }
1784
1899
  /** Surface 可以调用的共享 Thread actions;网络、窗口和 Outbox 真相仍由上游 Store/SDK 持有。 */
1785
1900
  interface ImThreadSurfaceActions {
1901
+ /** 按 SDK 本次进入前的冻结边界读取首未读窗口。 */
1902
+ loadEntryUnread?: () => Promise<boolean>;
1903
+ /** 可阅读页面的整会话结算,与实际可见回执独立。 */
1904
+ markConversationRead?: () => Promise<void>;
1905
+ /** 已确认可见的全部消息 ID,不代表整个游标区间。 */
1906
+ markVisibleMessages?: (messageIds: readonly string[]) => Promise<void>;
1786
1907
  /** 请求一页更早历史;返回实际新增消息数。 */
1787
1908
  loadOlder: (options?: {
1788
1909
  force?: boolean;
@@ -1917,4 +2038,4 @@ interface ThreadVisibilityTargetGroup<TItem> {
1917
2038
  declare function createThreadVisibilityTargetGroup<TItem>(groupOptions: ThreadVisibilityTargetGroupOptions): ThreadVisibilityTargetGroup<TItem>;
1918
2039
 
1919
2040
  export { ImThreadBodySwitch, ImThreadItems, ImThreadSurface, ImThreadViewport, createImThreadSurfaceContext, createMessageRendererRegistry, createThreadVisibilityTargetGroup, createThreadVisibilityTargets, provideImThreadSurfaceContext, useImText, useImThreadSurfaceContext, useOptionalImThreadReadActions };
1920
- 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-SWQXHZDF.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-4WMIGRG4.js';import'./chunk-NB6MXFCH.js';import'./chunk-4CH72T6I.js';import'./chunk-ANHUDX3C.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 的秒约定传入。 */
@@ -771,7 +773,7 @@ interface ImMessage {
771
773
  };
772
774
  /**
773
775
  * CHANNEL 管理员/社群主全员删除终态。它与发送者本人撤回、`deleteLocal` 完全不同:服务端通过
774
- * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空,产品统一展示“管理员删除了一条消息”。
776
+ * `RADIO_ADMIN_CANCEL_*` 同步给全员,正文不可逆清空;线程与会话摘要仅向群主、管理员展示删除提示,普通成员及未知角色隐藏。
775
777
  */
776
778
  deletedForEveryone?: {
777
779
  by: string;
@@ -953,6 +955,15 @@ interface ImSession {
953
955
  * 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 落盘时剔除)。
954
956
  */
955
957
  lastMessageSendState?: 'sending' | 'failed';
958
+ /**
959
+ * 最新一条己方已发送消息的回执态。
960
+ *
961
+ * 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
962
+ * `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
963
+ * 该字段随最新消息变化,并随会话落盘,避免冷启动后
964
+ * 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
965
+ */
966
+ lastMessageReceipt?: 'unread' | 'read';
956
967
  /** P0 我方已读游标(见 §4.3)。 */
957
968
  readCursor?: string;
958
969
  /** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
@@ -1054,8 +1065,8 @@ interface UserProfile {
1054
1065
  /** 用户自设昵称(后端 `nick_name`)。 */
1055
1066
  nickname: string;
1056
1067
  /**
1057
- * 好友备注名(后端 `/user/info/friend` 的 `remark_name`,仅好友关系有)。
1058
- * 与 `nickname` 并存:展示名优先级 = 备注名 > 昵称(安卓 SessionUtils.getShowUserName 实证)。
1068
+ * 好友展示备注(后端 `/user/info/friend` 的 `remark_name`,无备注时回退 `contact_name`,仅好友关系有)。
1069
+ * 与 `nickname` 并存:展示名优先级 = 备注名/通讯录名 > 昵称(安卓 SessionUtils.getShowUserName 实证)。
1059
1070
  */
1060
1071
  remark?: string;
1061
1072
  avatar?: string;
@@ -2106,6 +2117,11 @@ type StoredConversationBackground = {
2106
2117
  * 失败经 `error` 事件(scope:'storage')暴露、不静默吞、不阻塞内存主流程。
2107
2118
  */
2108
2119
  interface ImStoragePort {
2120
+ /**
2121
+ * 显式支持 CHANNEL 持久同步位置。声明 true 的 adapter 必须在删除会话正文/清历史事务中
2122
+ * 同时删除 channelSyncCheckpointKey 对应 meta;旧 adapter 缺省不启用跨运行续传。
2123
+ */
2124
+ readonly supportsChannelSyncCheckpoint?: true;
2109
2125
  /** 可选的最近页持久缓存;缺少该能力时 SDK 必须明确跳过持久预取。 */
2110
2126
  recentHistoryCache?: ImRecentHistoryCachePort;
2111
2127
  /** 打开/创建账号库并跑迁移(幂等)。open 前的读写应视为未就绪并抛错(不静默兜底)。 */
@@ -2171,12 +2187,13 @@ interface ImStoragePort {
2171
2187
  deleteSession: (conversation: ImStorageConversation) => Promise<void>;
2172
2188
  /** 删除单会话已读态(删除会话用)。 */
2173
2189
  deleteReadState: (conversation: ImStorageConversation) => Promise<void>;
2174
- /** 删除某会话全部本地消息(删除会话用)。 */
2190
+ /** 删除某会话全部本地消息及对应 CHANNEL 同步位置,二者须在同一事务内清理。 */
2175
2191
  deleteConversationMessages: (conversation: ImStorageConversation) => Promise<void>;
2176
2192
  /**
2177
2193
  * 原子清空精确会话的本机历史,并同步写入清空后的会话摘要与本机读态。
2178
2194
  *
2179
2195
  * @remarks 这是可选 capability,供产品 `history.clearLocal()` 使用;自定义 adapter 未实现时必须显式拒绝,不能退化为多次写入制造半清理状态。
2196
+ * 同一事务还须删除 channelSyncCheckpointKey(conversation) 对应同步位置,避免正文已清而继续跳过旧页。
2180
2197
  * 不删除会话行、草稿、Outbox、置顶消息或任何远端数据。
2181
2198
  */
2182
2199
  clearConversationHistory?: (conversation: ConversationRef, nextSession?: ImSession, nextReadState?: ReadState) => Promise<void>;
@@ -4438,6 +4455,13 @@ interface ConversationListItem {
4438
4455
  by: string;
4439
4456
  }>;
4440
4457
  lastMessageSendState?: 'sending' | 'failed';
4458
+ /**
4459
+ * 最新一条己方已发送消息的对端已读态。
4460
+ *
4461
+ * 只在自己发出且已发送成功时出现;发送中/失败、对端消息、撤回和系统提示都不给。
4462
+ * 单聊会话列表用它在摘要前画灰色单勾/绿色双勾;群组与社群即使有该字段也不展示。
4463
+ */
4464
+ lastMessageReceipt?: 'unread' | 'read';
4441
4465
  timestamp: number;
4442
4466
  unreadCount: number;
4443
4467
  /** 是否为用户手工添加的本地未读提醒;此时 `unreadCount` 至少投影为 1。 */
@@ -4626,6 +4650,21 @@ type ConversationEntryUnreadSnapshot = Readonly<{
4626
4650
  }> | Readonly<{
4627
4651
  state: 'unavailable';
4628
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
+ }>;
4629
4668
 
4630
4669
  /**
4631
4670
  * Emoji、GIF 与贴图稳定产品门面。
@@ -4789,6 +4828,8 @@ interface ConversationOpenOptions {
4789
4828
  * 后续 read 事件或新消息不会移动分隔线。
4790
4829
  */
4791
4830
  initialPosition?: ConversationInitialPosition;
4831
+ /** 冻结进入时未读导航,独立于初始位置;清会话未读后仍可定位原边界。 */
4832
+ captureEntryUnread?: boolean;
4792
4833
  /**
4793
4834
  * 初始历史加载方式,默认 `blocking`。
4794
4835
  *
@@ -4816,6 +4857,8 @@ interface ConversationHandleSnapshot<TType extends ProductHandleConversationType
4816
4857
  messages: readonly ImMessageView[];
4817
4858
  /** 本次打开时冻结的未读入口;只用于产品 UI 分隔线,不作为 SDK 已读真相。 */
4818
4859
  entryUnread: ConversationEntryUnreadSnapshot;
4860
+ /** 显式请求的进入导航快照;旧消费者不请求时省略。 */
4861
+ entryUnreadNavigation?: ConversationEntryUnreadNavigation;
4819
4862
  /** 当前账号本机草稿;不承诺跨端同步。 */
4820
4863
  draft: ConversationDraft | null;
4821
4864
  loading: boolean;
@@ -5116,6 +5159,8 @@ interface ConversationHandle<TType extends ProductHandleConversationType = Produ
5116
5159
  resolveMessage: (messageId: string) => Promise<ImMessageView | null>;
5117
5160
  history: {
5118
5161
  loadLatest: () => Promise<void>;
5162
+ /** 有限加载进入时冻结边界;成功才替换窗口,不可定位返回 false,网络失败抛错并保留数量。 */
5163
+ loadEntryUnread: () => Promise<boolean>;
5119
5164
  loadOlder: () => Promise<void>;
5120
5165
  /** 历史定位窗口向更新方向连续翻页;接回最新端后 `hasNewer` 变为 false。 */
5121
5166
  loadNewer: () => Promise<void>;
@@ -5146,6 +5191,10 @@ interface ConversationHandle<TType extends ProductHandleConversationType = Produ
5146
5191
  draft: ConversationDraftApi;
5147
5192
  /** 标记窗口最新消息或显式可见消息为已读;SDK 按精确 sibling 解析真实 read cursor。 */
5148
5193
  markRead: (messageId?: string) => Promise<void>;
5194
+ /** 结算最新可信边界的会话未读;不会将整个范围登记为对端可见回执。 */
5195
+ markConversationRead: () => Promise<void>;
5196
+ /** 只登记实际可见的消息 ID;历史消息也可补报,媒体消费继续使用独立动作。 */
5197
+ markVisibleMessages: (messageIds: readonly string[]) => Promise<void>;
5149
5198
  setMuted: (muted: boolean) => Promise<void>;
5150
5199
  close: () => void;
5151
5200
  }
@@ -6733,6 +6782,13 @@ interface ConversationListPresentation {
6733
6782
  * 名片等没有产品 glyph 的类型同样不给,它们的文案自带方括号来和真实文本区分。
6734
6783
  */
6735
6784
  previewMediaKind?: ConversationListPreviewMediaKind;
6785
+ /**
6786
+ * 单聊自己发出的已发送消息在摘要前显示的回执态;未读(尚无已读回执)灰单勾、已读绿双勾。
6787
+ *
6788
+ * 群组/社群、对端消息、草稿、发送中/失败、撤回、系统提示都不给。可与 `previewMediaKind` 同时存在,
6789
+ * 宿主必须把已读图标画在类型图标前面。
6790
+ */
6791
+ previewReceipt?: 'unread' | 'read';
6736
6792
  /** 群聊或社群普通消息的发送者前缀;其它摘要为空串。 */
6737
6793
  senderPrefix: string;
6738
6794
  /** 未读 @ 提示;草稿、系统、撤回和管理员删除摘要为空串。 */
@@ -8557,6 +8613,10 @@ type ImThreadIntent = Readonly<{
8557
8613
  kind: 'load-newer';
8558
8614
  }> | Readonly<{
8559
8615
  kind: 'jump-to-latest';
8616
+ }> | Readonly<{
8617
+ kind: 'jump-to-entry-unread';
8618
+ }> | Readonly<{
8619
+ kind: 'mark-conversation-read';
8560
8620
  }> | Readonly<{
8561
8621
  kind: 'locate-message';
8562
8622
  messageId: string;
package/dist/chat-kit.js CHANGED
@@ -1 +1 @@
1
- export{q as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,p as DEFAULT_LOADING_SHOW_DELAY_MS,v as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_HEIGHT,u as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_WIDTH,e as MINI_PROGRAM_LANG_NUMBERS,Q as SPIKE_STEP,M as calculateMediaBox,C as canCopyMessageImage,t as canPromoteMediaPresentationSource,z as captureRuntimeClientOperation,y as captureRuntimeOperation,n as channelMiniProgramRelKey,x as createConversationPrefetchController,r as createDelayedLoadingIndicator,K as createLinkMatcher,D as createMessageImageCopySource,f as csvIncludes,d as decideChannelMiniProgramRelOpen,O as formatFileSize,N as formatMediaDuration,P as getFileExtension,B as getMessageCopyImageUrl,A as getMessageCopyText,J as hasLinkCandidate,H as highlightSegments,a as isMiniProgramShowTypeOpenable,E as mediaService,I as normalizeLinkHref,T as placeholderWaveform,F as readService,S as resampleWaveform,s as resolveBestMediaPresentationSource,h as resolveChannelMiniProgramRelIcon,g as resolveChannelMiniProgramRelName,j as resolveChannelMiniProgramRelOpenSurface,i as resolveChannelMiniProgramRelUrl,k as resolveChannelPinnedGameCopy,o as resolveConversationListPresentation,L as resolveMediaPresentation,c as resolveMiniProgramFloatLinkUrl,w as resolveMiniProgramGamePreviewLayout,b as resolveMiniProgramOpenUrl,G as resolveQuotedMessagePresentation,m as resolveVisibleChannelMiniProgramRels,l as sortChannelMiniProgramFloatingItems,R as spikeCountForDuration}from'./chunk-R3FWUQK4.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,N as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,M as blockReasonForChannelSession,L as blockReasonForChannelState,T as blockReasonForGroupState,W as blockReasonForSession,G as canEditMessage,w as canPinChannelMessage,v as canPinGroupMessage,x as canPinMessage,F as canRecallMessage,da as cancelMediaUpload,R as classifyGifFile,Q as classifyMediaFile,s as countUnreadConversations,u as createChatRuntime,p as createEmojiMatcher,I as decideConversationAction,K as decideMemberTargetAction,J as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Da as fetchConversationFileBatch,Ea as fetchConversationImageBatch,Ba as fetchConversationMessageBatch,Fa as fetchConversationVideoBatch,Ga as fetchConversationVoiceBatch,Ha as fetchNextConversationSearchBatch,r as formatConversationUnreadBadge,ga as forwardService,o as hasEmojiCandidate,S as isGifFile,y as isPinnedMessageProtected,_ as isVoiceStorageConfigured,O as mediaBatchBudgetBytes,la as messageService,e as parseUnicodeEmojiCode,qa as pinnedMessageService,d as prependRecentEmoji,Aa as profileService,Z as replaceInterruptedMediaFile,U as requiresConversationEncryption,B as resolveChannelMemberAvatarUrl,A as resolveChannelMemberDisplayName,k as resolveEmojiToken,E as resolveFriendDisplayName,ra as resolveImProfileAccessDestination,z as resolveMemberDisplayName,t as resolveMessageNotificationDecision,D as resolvePublicNickname,C as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ea as retryMessage,P as runMediaSendBatch,ca as sendAsFilesBatch,H as sendBlockReasonForDecision,aa as sendMediaAlbum,Y as sendMediaFile,ba as sendMediaFilesBatch,X as sendText,$ as sendVoice,V as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-UKL2AULH.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-SWQXHZDF.js';import'./chunk-4WMIGRG4.js';import'./chunk-NB6MXFCH.js';import'./chunk-4CH72T6I.js';export{va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,sa as requiresForwardTypeConfirmation}from'./chunk-ANHUDX3C.js';import'./chunk-WOT6VMZA.js';
1
+ export{q as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,p as DEFAULT_LOADING_SHOW_DELAY_MS,v as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_HEIGHT,u as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_WIDTH,e as MINI_PROGRAM_LANG_NUMBERS,Q as SPIKE_STEP,M as calculateMediaBox,C as canCopyMessageImage,t as canPromoteMediaPresentationSource,z as captureRuntimeClientOperation,y as captureRuntimeOperation,n as channelMiniProgramRelKey,x as createConversationPrefetchController,r as createDelayedLoadingIndicator,K as createLinkMatcher,D as createMessageImageCopySource,f as csvIncludes,d as decideChannelMiniProgramRelOpen,O as formatFileSize,N as formatMediaDuration,P as getFileExtension,B as getMessageCopyImageUrl,A as getMessageCopyText,J as hasLinkCandidate,H as highlightSegments,a as isMiniProgramShowTypeOpenable,E as mediaService,I as normalizeLinkHref,T as placeholderWaveform,F as readService,S as resampleWaveform,s as resolveBestMediaPresentationSource,h as resolveChannelMiniProgramRelIcon,g as resolveChannelMiniProgramRelName,j as resolveChannelMiniProgramRelOpenSurface,i as resolveChannelMiniProgramRelUrl,k as resolveChannelPinnedGameCopy,o as resolveConversationListPresentation,L as resolveMediaPresentation,c as resolveMiniProgramFloatLinkUrl,w as resolveMiniProgramGamePreviewLayout,b as resolveMiniProgramOpenUrl,G as resolveQuotedMessagePresentation,m as resolveVisibleChannelMiniProgramRels,l as sortChannelMiniProgramFloatingItems,R as spikeCountForDuration}from'./chunk-MSYNU72L.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,N as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,M as blockReasonForChannelSession,L as blockReasonForChannelState,T as blockReasonForGroupState,W as blockReasonForSession,G as canEditMessage,w as canPinChannelMessage,v as canPinGroupMessage,x as canPinMessage,F as canRecallMessage,da as cancelMediaUpload,R as classifyGifFile,Q as classifyMediaFile,s as countUnreadConversations,u as createChatRuntime,p as createEmojiMatcher,I as decideConversationAction,K as decideMemberTargetAction,J as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Da as fetchConversationFileBatch,Ea as fetchConversationImageBatch,Ba as fetchConversationMessageBatch,Fa as fetchConversationVideoBatch,Ga as fetchConversationVoiceBatch,Ha as fetchNextConversationSearchBatch,r as formatConversationUnreadBadge,ga as forwardService,o as hasEmojiCandidate,S as isGifFile,y as isPinnedMessageProtected,_ as isVoiceStorageConfigured,O as mediaBatchBudgetBytes,la as messageService,e as parseUnicodeEmojiCode,qa as pinnedMessageService,d as prependRecentEmoji,Aa as profileService,Z as replaceInterruptedMediaFile,U as requiresConversationEncryption,B as resolveChannelMemberAvatarUrl,A as resolveChannelMemberDisplayName,k as resolveEmojiToken,E as resolveFriendDisplayName,ra as resolveImProfileAccessDestination,z as resolveMemberDisplayName,t as resolveMessageNotificationDecision,D as resolvePublicNickname,C as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ea as retryMessage,P as runMediaSendBatch,ca as sendAsFilesBatch,H as sendBlockReasonForDecision,aa as sendMediaAlbum,Y as sendMediaFile,ba as sendMediaFilesBatch,X as sendText,$ as sendVoice,V as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-CLO7E7BU.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-NWBEXP2C.js';import'./chunk-32UUIS7N.js';import'./chunk-QT3PJWLT.js';import'./chunk-HUSCO5JM.js';export{va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,sa as requiresForwardTypeConfirmation}from'./chunk-75GNCLQQ.js';import'./chunk-WOT6VMZA.js';