k2-im 0.1.20 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +1 -1
- package/dist/chat-kit-pinia.d.ts +38 -7
- package/dist/chat-kit-pinia.js +1 -1
- package/dist/chat-kit-vue.d.ts +5 -0
- package/dist/chat-kit-vue.js +1 -1
- package/dist/chat-kit.d.ts +78 -8
- package/dist/chat-kit.js +1 -1
- package/dist/{chunk-EEICKR6L.js → chunk-2GZMQCIP.js} +1 -1
- package/dist/{chunk-BKZ3VNAT.js → chunk-4X7RCGEV.js} +1 -1
- package/dist/chunk-5I7S6LWE.js +2 -0
- package/dist/chunk-A2BLOVZ5.js +2 -0
- package/dist/chunk-DN4H5C7G.js +2 -0
- package/dist/chunk-P4HOR4XO.js +1 -0
- package/dist/chunk-YAM4YHKF.js +7 -0
- package/dist/i18n.d.ts +23 -7
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +129 -17
- package/dist/index.js +1 -1
- package/dist/sdk.d.ts +69 -10
- package/dist/sdk.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-4RG5NHIL.js +0 -7
- package/dist/chunk-67E52PC5.js +0 -2
- package/dist/chunk-IYDCZ2PY.js +0 -1
- package/dist/chunk-LNCHWSAT.js +0 -2
- package/dist/chunk-ZDD7A2BS.js +0 -1
package/dist/chat-kit-vue.d.ts
CHANGED
|
@@ -108,12 +108,17 @@ type LastMessageSummary = {
|
|
|
108
108
|
*
|
|
109
109
|
* 只给结构化计数与配文,**不在这里拼「2 张照片, 1 个视频」这种文案**——中英文的量词、复数与
|
|
110
110
|
* 连接符各不相同,必须由 im-i18n 按 locale 组装。`caption` 非空时宿主优先显示配文(对齐三端)。
|
|
111
|
+
*
|
|
112
|
+
* `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数无法决定该配
|
|
113
|
+
* 照片图标还是视频图标,三端统一按第一项取(对齐 iOS `IMMediaAlbumMessageBody`)。
|
|
114
|
+
* 入站解析后所有项都被丢弃时缺省,宿主据此不显示类型图标。
|
|
111
115
|
*/
|
|
112
116
|
| {
|
|
113
117
|
kind: 'mediaAlbum';
|
|
114
118
|
imageCount: number;
|
|
115
119
|
videoCount: number;
|
|
116
120
|
caption?: string;
|
|
121
|
+
firstItemKind?: 'image' | 'video';
|
|
117
122
|
} | {
|
|
118
123
|
kind: 'encrypted';
|
|
119
124
|
} | {
|
package/dist/chat-kit-vue.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-EEICKR6L.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-IYDCZ2PY.js';import'./chunk-67E52PC5.js';import'./chunk-4RG5NHIL.js';import'./chunk-ZDD7A2BS.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,p=0;for(let u of t)u.kind==="video"?p+=1:i+=1;return {imageCount:i,videoCount:p}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:p}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):p["unsupported-body"]!==void 0?p["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let p=wt();function u(o,l){let T=Array.isArray(l)?l:[l];return T.length===1&&isVNode(T[0])?cloneVNode(T[0],{key:o}):h$1(Fragment,{key:o},T)}function m(o){return l=>{p?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{p?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let l=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:l}):i.message!==void 0?i.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:l}):h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:T=>i["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:p$1,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,l=[],T,L,S,D=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,N=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==l.length||A.some((K,Z)=>l[Z]!==K);l=Object.freeze(A),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",l),i("settled",{visibleMessageIds:l,...l.length===0?{}:{newestVisibleMessageId:l[l.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ie(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function ne(){ie(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(T=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,i("reach-start"),ie(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=N,i("reach-end"),ie(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||N===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ie(he)),O&&!Y&&de(),!J&&q$1&&N!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else d(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,ne();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function oe(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function h(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&oe();},Zt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,h();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(oe(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,h();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,y();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),d(),!O&&y());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function te(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,N+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||N===ee||(f!==void 0&&oe(),J=true,e.scrollTop<=ge()&&Oe()&&ae());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),oe(),O=false,q$1=false,Y=false,c=void 0,R=void 0,N+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),y());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,te(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(te(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(te(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;oe();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),ne();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(T,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,ne();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}ne();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ie(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ie(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=T;ie(()=>{m$1.value!==null&&(f!==void 0?(d(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}D=true,ne();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}ne();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),oe(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),p$1({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:p}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,l=null,T="",L="",S="",D=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),N=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,h=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},h);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let h=await d();return t.hooks?.afterAction?.(r,h),h}catch(h){throw t.hooks?.onError?.(r,h),h}}function v(){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older"},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,d=s.value.loadingNewer??s.value.loading;return !O.value||d||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let d=0;d<sr;d+=1){if(!O.value)return;let h=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!h||y!==null||(r==="older"?await v():await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=N.value;S="";let d;try{d=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(h){throw N.value===r&&(S=r),h}return V.value||(l=null,be()),d}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,d){return m.value?.scrollToMessage(r,d)??false}function he(r,d){return !H&&o===d&&N.value===r&&O.value}async function me(r,d,h,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(h,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ie(r,d,h){let y=m.value;if(y===null||!y.isMeasurable()||y.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,d,h,{behavior:"auto",block:"center"})),te=async le=>{if(!he(r,d)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;y.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw y.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&y.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await te("older")&&(C=true),!j&&!await te("newer")&&(j=true);let ve="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await te(le)||(le==="older"?C=true:j=true);}return he(r,d)}async function Be(r,d={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let h=N.value,y=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(h,y))return false}return !await me(h,y,r,{...d,behavior:"auto"})||!await ie(h,y,r)?false:me(h,y,r,d)}function ne(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(ne(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let d=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let h=g[g.length-1];if(h===void 0)return;let y=r.resolveTarget===void 0?h:r.resolveTarget(h);y!=null&&Promise.resolve(r.markRead(y)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},d);}function Oe(r){g=Object.freeze([...r]);let d={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(d);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(d,void 0);}catch(h){throw t.hooks?.onError?.(d,h),h}V.value?Te():be();}function ae(r,d){return !H&&M===d&&N.value===r&&!D}function xe(r,d){ae(r,d)&&(T=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,d,h){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(h,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=N.value,d=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null||T===r&&(L===d||D)||S===r||l!==null)return;if(!Y.value.enabled){T=r,L=d,V.value=true,Te();return}let h=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,h))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,h,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,h)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!ae(r,h)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,h)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,h,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,h);})().catch(()=>{N.value===r&&(S=r);}).finally(()=>{l===y&&(l=null);});l=y;}function se(r){M+=1,l=null,D=false,V.value=r,(T="",L="",S=""),ne();}function Ve(){if(V.value)return;let r=N.value;D=true,M+=1,l=null,T=r,V.value=true,Te();}let oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(oe),watch(J,r=>{r&&V.value?Te():ne();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,N],()=>{let r=m.value;if(r===null||!O.value)return;let d=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(d,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([N,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,d,h,,,y],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&y!==C&&!D&&y.startsWith("located:")&&(T="",L="",V.value=false),r===""){se(false);return}if(h!==null){V.value||se(false);return}d||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:oe},d=[p.header?.(r),p["before-list"]?.(r)];if(!O.value)d.push(p.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(p.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(p.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let h=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:p["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:y=>{let x=s.value.messages.find(C=>C.id===y);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{default:()=>[p["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:p.item,"date-separator":p["date-separator"],"entry-unread":p["entry-unread"],encryption:p.encryption,system:p.system,message:p.message,"recalled-message":p["recalled-message"],"deleted-message":p["deleted-message"],"unsupported-body":p["unsupported-body"]}),p["viewport-after"]?.(r)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[p["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),h])),s.value.error!==null&&d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.push(p["after-list"]?.(r),p["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),p["context-menu"]?.(r),p.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let p=Object.freeze([...i.keys()]);return Object.freeze({kinds:p,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let p=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,p*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),p=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,l=null,T=null,L=null,S=false,D=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&T!==null||l===null)return;let R=l.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(D||S)return;X(),G();let c=l?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},p));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},i));}function N(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){l?.removeEventListener("scroll",Y),T?.disconnect(),L?.disconnect(),T=null,L=null,l=null;}function Q(c=true){if(D)return;let R=t.getRoot();if(!(R===l&&l!==null)){if(ee(),l=R,l===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,D||(Q(false),q());}));return}if(l.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){T=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:l,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())T.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(D)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),T?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){D||(U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),D=true);}}}function pr(t){let i=new Map,p=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(T=>T.channel===I).map(T=>T.item),l=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(l);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;p.set(g,M);let o=false,l=S=>({channel:g,item:S});function T(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,D){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(D===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=l(S);M.set(H,{target:B,element:D}),k.register(B,D);},isRevealed:S=>k.isRevealed(l(S)),isActivated:S=>k.isActivated(l(S)),isSettledVisible:S=>k.isSettledVisible(l(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:T,dispose(){o||(T(),o=true,i.delete(g),p.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of p.values())for(let I of g.values())k.register(I.target,null);p.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
|
|
1
|
+
import {h,C,p,i,q,m,z,j,g,B,o}from'./chunk-2GZMQCIP.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-P4HOR4XO.js';import'./chunk-DN4H5C7G.js';import'./chunk-YAM4YHKF.js';import'./chunk-A2BLOVZ5.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive}from'vue';function Ht(t){let i=0,p=0;for(let u of t)u.kind==="video"?p+=1:i+=1;return {imageCount:i,videoCount:p}}function Bt(t){return {systemMessage:i=>i.body.system!==void 0?g$1(i.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:i=>i$1(i.contentType,{locale:t.locale(),durationMs:i.body.voice?.durationMs,stickerImageType:i.body.sticker?.imageType,gameType:i.body.game?.gameType,callKind:i.body.call?.callKind,...i.body.mediaAlbum===void 0?{}:{mediaAlbum:Ht(i.body.mediaAlbum.items)}}),lastMessage:i=>i.lastMessageSummary!==void 0?h$2(i.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):i.lastMessagePreview,failureText:i=>i.failure?.displayCode!==void 0?f(i.failure.displayCode,{locale:t.locale(),mediaKind:i.failure.mediaKind,params:i.failure.params}):i.failure?.message??""}}var yt=Symbol("ImThreadReadActions");function bt(t){provide(yt,t);}function jt(){return inject(yt,void 0)}var je=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:i,slots:p}){return bt(t.readActions),()=>{let u=h(t.message),m=t.rendererRegistry.resolve(u);return m!==void 0?h$1(m,{...i,message:t.message,presentation:t.presentation}):p["unsupported-body"]!==void 0?p["unsupported-body"]({kind:u,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":u,"aria-hidden":"true"})}}});var Ke=Symbol("ImThreadViewportRegistration");function wt(){return inject(Ke,void 0)}var Ue=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:i}){let p=wt();function u(o,l){let T=Array.isArray(l)?l:[l];return T.length===1&&isVNode(T[0])?cloneVNode(T[0],{key:o}):h$1(Fragment,{key:o},T)}function m(o){return l=>{p?.registerMessageNode(o,l instanceof HTMLElement?l:null);}}function k(o,l){return T=>{p?.registerDateNode(o,l,T instanceof HTMLElement?T:null);}}function w(o){return i.encryption?.({item:o})??h$1("div",{"data-im-thread-encryption":o.key})}function g(o){let l=k(o.key,o.label);return i["date-separator"]?.({item:o,setElement:l})??h$1("div",{ref:l,"data-im-thread-date-separator":o.key},o.label)}function I(o){return i["entry-unread"]?.({item:o})??h$1("div",{"data-im-thread-entry-unread":o.key,...o.count===void 0?{}:{"data-count":String(o.count)}})}function M(o){let l=m(o.message.id);return i.item!==void 0?i.item({item:o,setElement:l}):i.message!==void 0?i.message({item:o,setElement:l}):o.message.deletedForEveryone!==void 0?i["deleted-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.message.recalled!==void 0?i["recalled-message"]?.({item:o,setElement:l})??h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):o.kind==="system"&&i.system!==void 0?i.system({item:o,setElement:l}):h$1("article",{ref:l,"data-im-thread-message-id":o.message.id,"data-first-of-run":o.kind==="message"?String(o.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(je,{message:o.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":i["unsupported-body"]===void 0?void 0:T=>i["unsupported-body"]?.(T)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(o=>{switch(o.kind){case "encryption":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,w(o));case "date-separator":return i.item!==void 0?u(o.key,i.item({item:o,setElement:k(o.key,o.label)})):u(o.key,g(o));case "entry-unread":return i.item!==void 0?u(o.key,i.item({item:o})):u(o.key,I(o));case "system":case "message":return u(o.key,M(o))}return o}))}});var St=120,Zt=500,Ae=.5,er=8,qe=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:i,expose:p$1,slots:u}){let m$1=ref(null),k=ref(null),w=new Map,g$1=new Map,I=new Set,M=new Map,o$1=0,l=[],T,L,S,D=false,H,V=new Set,B$1=false,U,W="",X=1,s=false,G=false,J=true,O=false,q$1=false,Y=false,N=0,ee=-1,Q=-1,F,c,R,f,v,P=ref(true),z$1=ref(0),_=C(e=>{z$1.value=e,i("new-message-count",e);});function $(e){let n=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=n}function pe(e=t.messageIds){return e.flatMap(n=>{let a=w.get(n);if(a===void 0)return [];let b=a.getBoundingClientRect(),A=a.querySelector("[data-im-thread-anchor-point]");return [{id:n,top:b.top,bottom:b.bottom,anchorTop:A?.getBoundingClientRect().top??b.top}]})}function Ee(e="",n=1){let a=Math.min(1,Math.max(0,n));W!==""&&W!==e&&M.get(W)?.element.style.removeProperty("opacity"),W=e,X=a,e!==""&&M.get(e)?.element.style.setProperty("opacity",String(a));}function Me(){Ee();}function he(){let e=m$1.value;if(B$1||e===null||!t.activeDateEnabled)return;let n=[...M.entries()].filter(([,E])=>e.contains(E.element)).map(([E,K])=>{let Z=K.element.getBoundingClientRect();return {key:E,label:K.label,top:Z.top,height:Z.height}}).sort((E,K)=>E.top-K.top),a=e.getBoundingClientRect(),b=n.find(E=>E.height>0)?.height??28,A=g({markers:n,viewportTop:a.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:b});if(A===null){Me(),i("active-date-change",null);return}Ee(A.inlineDateKey,A.inlineOpacity),i("active-date-change",A);}function me(){let e=m$1.value;if(B$1||e===null)return;let n=e.getBoundingClientRect(),a=S!==void 0&&D?t.messageIds.filter(K=>I.has(K)):t.messageIds,b=pe(a);if(S!==void 0&&D&&b.length===0){P.value=$(e);return}let A=b.filter(K=>B({viewportTop:n.top,viewportBottom:n.bottom,messageTop:K.top,messageBottom:K.bottom,margin:t.visibleMargin})).map(K=>K.id),E=A.length!==l.length||A.some((K,Z)=>l[Z]!==K);l=Object.freeze(A),T=o(b,{top:n.top,bottom:n.bottom}),_.acknowledgeVisible(A),P.value=$(e),E&&i("visible-range",l),i("settled",{visibleMessageIds:l,...l.length===0?{}:{newestVisibleMessageId:l[l.length-1]},isAtBottom:P.value,newMessageCount:z$1.value});}function ie(e){if(V.add(e),H!==void 0)return;let n=()=>{H=void 0;let a=[...V];V.clear(),a.forEach(b=>b());};typeof globalThis.requestAnimationFrame=="function"?H=globalThis.requestAnimationFrame(n):H=globalThis.setTimeout(n,0);}function Be(){H!==void 0&&(typeof H=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(H):globalThis.clearTimeout(H),H=void 0,V.clear());}function ne(){ie(me);}function Te(){let e=m$1.value;if(e===null)return;let n=e.getBoundingClientRect(),a=o(pe(),{top:n.top,bottom:n.bottom});a!==void 0&&(T=a);}function Oe(){return J&&f===void 0&&!G&&!t.loadingOlder}function ae(){Te(),J=false,ee=N,G=true,i("reach-start"),ie(()=>{t.loadingOlder||(G=false);});}function xe(e){return t.hasNewer&&!s&&!t.loadingOlder&&!t.loadingNewer&&$(e)}function Re(){s=true,P.value=false,Q=N,i("reach-end"),ie(()=>{t.loadingNewer||(s=false);});}function ye(){let e=m$1.value;e===null||N===Q||!xe(e)||Re();}function be(){let e=m$1.value;if(B$1||e===null)return;let n=e.scrollTop,a=U,b=false;if(a!==void 0){let E=Math.abs(n-a.targetTop)<=Ae;b=a.behavior==="smooth"||E,(a.behavior!=="smooth"||E)&&(U=void 0);}!b&&!O&&f===void 0&&n!==o$1&&(O=true,q$1=true,N+=1);let A=O&&!b&&n!==o$1;if(A&&(i("user-scroll"),ie(he)),O&&!Y&&de(),!J&&q$1&&N!==ee&&n<o$1&&n>ge()&&(J=true),f!==void 0&&!b)if(O){let E=r();E!==void 0&&(f.expectedOffset=E);}else d(),x();Oe()&&A&&n>=0&&m({previousScrollTop:o$1,currentScrollTop:n,topThreshold:t.olderPrefetchThreshold})&&ae(),A&&xe(e)&&z({previousScrollTop:o$1,currentScrollTop:n,isAtBottom:$(e),isHistoryWindow:t.hasNewer,isPageSettling:b})&&Re(),o$1=n,ne();}function se(e,n="auto"){U={targetTop:e,behavior:n};}function Ve(e){let n=f,a=k.value;if(!(n===void 0||a===null)){if(n.visualOffset=Math.abs(e)<=Ae?0:e,n.visualOffset===0){a.style.removeProperty("transform"),a.style.removeProperty("will-change");return}a.style.setProperty("transform",`translate3d(0, ${n.visualOffset}px, 0)`),a.style.setProperty("will-change","transform");}}function oe(){v!==void 0&&(clearTimeout(v),v=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),f=void 0,U=void 0;}function r(){let e=m$1.value,n=f;if(e===null||n===void 0)return;let a=pe().find(b=>b.id===n.anchor.id);if(a!==void 0)return (a.anchorTop??a.top)-e.getBoundingClientRect().top}function d(){let e=f,n=r();if(e===void 0||n===void 0)return;let a=e.expectedOffset-n;Math.abs(a)<=Ae||(Ve(e.visualOffset+a),e.committed=false,e.attempts=0);}function h(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,!(O||f?.committed!==true)&&oe();},Zt);}function y(){let e=m$1.value,n=f;if(B$1||e===null||n===void 0||O)return;let a=n.visualOffset;if(Math.abs(a)<=Ae){n.committed=true,h();return}let b=Math.max(0,e.scrollHeight-e.clientHeight),A=Math.min(b,Math.max(0,e.scrollTop-a));if(se(A),e.scrollTop=A,Math.abs(e.scrollTop-A)>Ae){U=void 0,n.committed=false,n.attempts+=1,n.attempts<er?x():(oe(),U=void 0,o$1=e.scrollTop);return}Ve(0),o$1=e.scrollTop,n.expectedOffset=r()??n.expectedOffset,n.committed=true,n.attempts=0,h();}function x(){v!==void 0&&clearTimeout(v),v=setTimeout(()=>{v=void 0,y();},St);}function C$1(e){e!==void 0&&(f===void 0&&(f={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0}),d(),!O&&y());}function j$1(e){let n=m$1.value;if(n===null||e===void 0)return;let a=n.getBoundingClientRect(),b=q(e,pe(),{top:a.top,bottom:a.bottom});if(b!==void 0){let A=Math.max(0,n.scrollHeight-n.clientHeight),E=Math.min(A,Math.max(0,n.scrollTop+b));se(E),n.scrollTop=E,o$1=n.scrollTop;}}function ge(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function te(){U?.behavior==="smooth"&&(U=void 0),q$1=false,O||(O=true,N+=1),F!==void 0&&(clearTimeout(F),F=void 0);}function ve(){let e=m$1.value;e===null||N===ee||(f!==void 0&&oe(),J=true,e.scrollTop<=ge()&&Oe()&&ae());}function le(){F!==void 0&&(clearTimeout(F),F=void 0),oe(),O=false,q$1=false,Y=false,c=void 0,R=void 0,N+=1,ee=-1,Q=-1,J=true,G=false,s=false,U=void 0;}function Ie(){Y||(F!==void 0&&(clearTimeout(F),F=void 0),O=false,q$1=false,f!==void 0&&(f.attempts=0),y());}function de(){Y||(F!==void 0&&clearTimeout(F),F=setTimeout(()=>{F=void 0,Ie();},St));}function Xe(){U=void 0,Ie();}function Je(e){Y=true,te(),c=e.touches?.[0]?.clientY;}function Qe(e){let n=e.touches?.[0]?.clientY;n!==void 0&&(c!==void 0&&n>c?ve():c!==void 0&&n<c&&ye(),c=n);}function Ce(){Y=false,c=void 0,de();}function Ze(e){te(),e.deltaY<0?ve():e.deltaY>0&&ye(),de();}function et(e){e.pointerType!=="touch"&&(te(),R=e.clientY,de());}function tt(e){e.pointerType==="touch"||!O||R===void 0||(e.clientY<R?ve():e.clientY>R&&ye(),R=e.clientY,de());}function ke(e){e.pointerType!=="touch"&&(R=void 0,de());}function rt(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(te(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?ve():ye(),de());}function Fe(e="auto"){let n=m$1.value;if(n===null)return;oe();let a=Math.max(0,n.scrollHeight-n.clientHeight);se(a,e),n.scrollTo?.({top:a,behavior:e}),n.scrollTop!==a&&(n.scrollTop=a),o$1=n.scrollTop,_.clear(),me();}function nt(){let e=m$1.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function Et(){let e=m$1.value;return nt()&&e!==null&&e.scrollHeight>e.clientHeight+1}function Ot(e,n={}){let a=m$1.value,b=w.get(e);if(a===null||b===void 0||!a.contains(b)||a.clientHeight<=0)return false;oe();let A=a.getBoundingClientRect(),E=b.getBoundingClientRect(),K=n.block??"center",Z;K==="start"?Z=a.scrollTop+E.top-A.top:K==="end"?Z=a.scrollTop+E.bottom-A.bottom:K==="nearest"?E.top>=A.top&&E.bottom<=A.bottom?Z=a.scrollTop:E.top<A.top?Z=a.scrollTop+E.top-A.top:Z=a.scrollTop+E.bottom-A.bottom:Z=j({currentScrollTop:a.scrollTop,scrollHeight:a.scrollHeight,targetHeight:E.height,targetTop:E.top,viewportHeight:a.clientHeight,viewportTop:A.top});let Ne=Math.max(0,a.scrollHeight-a.clientHeight),we=Math.min(Ne,Math.max(0,Z)),Se=n.behavior??"auto";return se(we,Se),a.scrollTo?.({top:we,behavior:Se}),a.scrollTop!==we&&(a.scrollTop=we),o$1=a.scrollTop,me(),true}function xt(){_.clear();}function Vt(){s=true,P.value=false;}function Ct(){s=false,ne();}function kt(e,n){let a=w.get(e);if(a!==void 0&&a!==n&&(S?.unobserve(a),L?.unobserve?.(a),g$1.delete(a),I.delete(e)),n===null){w.delete(e),I.delete(e);return}w.set(e,n),g$1.set(n,e),S?.observe(n),L?.observe(n),ne();}function Nt(e,n,a){let b=M.get(e);if(a===null){M.delete(e);return}M.set(e,{element:a,label:n}),W===e&&a.style.setProperty("opacity",String(X)),b?.element!==a&&(a.dataset.imThreadDateSeparator=e);}return provide(Ke,{registerMessageNode:kt,registerDateNode:Nt}),watch(()=>t.contentKey,(e,n)=>{if(e===n)return;le();let a=m$1.value;a!==null&&(o$1=a.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,n)=>{let a=m$1.value;if(a===null)return;let b=new Set(n);n.length>0&&e.length>0&&!e.some(De=>b.has(De))&&le();let E=a.getBoundingClientRect(),K=p(T,pe(),{top:E.top,bottom:E.bottom}),Z=P.value,Ne=n[n.length-1],we=Ne===void 0?-1:e.indexOf(Ne),Se=we<0?[]:e.slice(we+1).filter(De=>!b.has(De)),Dt=s||t.loadingNewer;if(await nextTick(),B$1)return;let ot=n[0];if(ot!==void 0&&e.indexOf(ot)>0&&(G=false,C$1(K)),Se.length>0){if(Dt){s=false,f===void 0&&j$1(K),P.value=false,ne();return}(Z||Se.some(Lt=>t.shouldFollowAppendedMessage?.(Lt)===true))&&t.followNewMessages?Fe():_.add(Se);}ne();},{flush:"pre"}),watch(()=>t.loadingNewer,(e,n)=>{e||!n||!s||ie(()=>{t.loadingNewer||(s=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,n)=>{e||!n||!G||ie(()=>{t.loadingOlder||(G=false);});},{flush:"pre"}),onMounted(()=>{let e=m$1.value;if(e!==null){if(o$1=e.scrollTop,e.addEventListener("scroll",be,{passive:true}),e.addEventListener("scrollend",Xe,{passive:true}),e.addEventListener("touchstart",Je,{passive:true}),e.addEventListener("touchmove",Qe,{passive:true}),e.addEventListener("touchend",Ce,{passive:true}),e.addEventListener("touchcancel",Ce,{passive:true}),e.addEventListener("wheel",Ze,{passive:true}),e.addEventListener("pointerdown",et,{passive:true}),e.addEventListener("pointermove",tt,{passive:true}),e.addEventListener("pointerup",ke,{passive:true}),e.addEventListener("pointercancel",ke,{passive:true}),e.addEventListener("keydown",rt),typeof globalThis.ResizeObserver=="function"){L=new globalThis.ResizeObserver(()=>{let n=T;ie(()=>{m$1.value!==null&&(f!==void 0?(d(),O||x()):s||t.loadingNewer?j$1(n):t.resizeFollowEnabled&&P.value?Fe():j$1(n),me());});}),L.observe(e);for(let n of w.values())L.observe(n);}if(typeof globalThis.IntersectionObserver=="function"){S=new globalThis.IntersectionObserver(n=>{for(let a of n){let b=g$1.get(a.target);b!==void 0&&(a.isIntersecting?I.add(b):I.delete(b));}D=true,ne();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let n of w.values())S.observe(n);}ne();}}),onBeforeUnmount(()=>{B$1=true;let e=m$1.value;e!==null&&e.removeEventListener("scroll",be),e!==null&&(e.removeEventListener("scrollend",Xe),e.removeEventListener("touchstart",Je),e.removeEventListener("touchmove",Qe),e.removeEventListener("touchend",Ce),e.removeEventListener("touchcancel",Ce),e.removeEventListener("wheel",Ze),e.removeEventListener("pointerdown",et),e.removeEventListener("pointermove",tt),e.removeEventListener("pointerup",ke),e.removeEventListener("pointercancel",ke),e.removeEventListener("keydown",rt)),F!==void 0&&clearTimeout(F),oe(),Be(),L?.disconnect(),S?.disconnect(),Me(),w.clear(),g$1.clear(),I.clear(),M.clear(),_.clear();}),p$1({getViewportElement:()=>m$1.value,clearNewMessageBadge:xt,clearActiveDate:Me,isAtBottom:computed(()=>P.value),isMeasurable:nt,isScrollable:Et,newMessageCount:computed(()=>z$1.value),prepareHistoryPageAppend:Vt,cancelHistoryPageAppend:Ct,trackRemoteMessageIds:(e,n)=>_.trackRemote(e,n),scrollToLatest:Fe,scrollToMessage:Ot,focusViewport:()=>m$1.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:m$1,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},u.default?.())])}});var Pt=Symbol("ImThreadSurfaceContext");function nr(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function or(t){provide(Pt,t);}function Ge(){let t=inject(Pt);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}var We=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Ye=Object.freeze({enabled:true,maxFillPages:8}),sr=8,lr=160;function dr(t,i){return t?.conversationType===i.conversationType&&t.conversationId===i.conversationId}var ur=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:i$1,slots:p}){let u=t.context??Ge(),m=ref(null),k=ref(0),w=ref(true),g=[],I,M=0,o=0,l=null,T="",L="",S="",D=false,H=false,V=ref(false),B=ref(""),U=ref(false),W,X,s=computed(()=>u.getState()),G=computed(()=>s.value.pageVisible??u.isPageVisible?.()??true),J=computed(()=>s.value.pageEngaged??u.isPageEngaged?.()??true),O=computed(()=>dr(s.value.activeConversation,t.conversation)),q=computed(()=>({...We,...t.viewportOptions})),Y=computed(()=>{let r=t.initialViewportOptions.maxFillPages??Ye.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Ye.enabled,maxFillPages:Number.isFinite(r)?Math.max(0,Math.floor(r)):Ye.maxFillPages}}),N=computed(()=>!O.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ee=computed(()=>O.value?i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:u.formatDate,leadingItems:u.leadingItems?.(),beforeMessageItems:u.beforeMessageItems}):[]),Q=computed(()=>ee.value.flatMap(r=>r.kind==="message"||r.kind==="system"?[r.message.id]:[]));function F(){W!==void 0&&(clearTimeout(W),W=void 0),X!==void 0&&(clearTimeout(X),X=void 0);}function c(r=false){if(F(),U.value=false,r){m.value?.clearActiveDate(),B.value="";return}X=setTimeout(()=>{X=void 0,!U.value&&(m.value?.clearActiveDate(),B.value="");},lr);}function R(r){if(r===null){c();return}F(),B.value=r.label,U.value=true;let d=q.value.activeDateIdleDelay,h=Number.isFinite(d)?Math.max(0,d):We.activeDateIdleDelay;W=setTimeout(()=>{W=void 0,c();},h);}async function f(r,d){t.hooks?.beforeAction?.(r);try{let h=await d();return t.hooks?.afterAction?.(r,h),h}catch(h){throw t.hooks?.onError?.(r,h),h}}function v(){return !O.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):f({kind:"load-older"},()=>u.actions.loadOlder())}function P(){let r=u.actions.loadNewer,d=s.value.loadingNewer??s.value.loading;return !O.value||d||!s.value.hasNewer||r===void 0?Promise.resolve(0):f({kind:"load-newer"},()=>r())}async function z(r){for(let d=0;d<sr;d+=1){if(!O.value)return;let h=r==="older"?s.value.hasOlder:s.value.hasNewer,y=r==="older"?s.value.olderError:s.value.newerError;if(!h||y!==null||(r==="older"?await v():await P())>0)return;let C=r==="older"?s.value.hasOlder:s.value.hasNewer,j=r==="older"?s.value.olderError:s.value.newerError;if(!C||j!==null)return}}async function _(){return !O.value||u.actions.loadNewer===void 0?0:f({kind:"load-newer"},()=>u.actions.retryNewer?.()??u.actions.loadNewer?.({force:!0})??Promise.resolve(0))}async function $(){if(!O.value)return 0;let r=N.value;S="";let d;try{d=await f({kind:"retry-older"},()=>u.actions.retryOlder?.()??u.actions.loadOlder({force:!0}));}catch(h){throw N.value===r&&(S=r),h}return V.value||(l=null,be()),d}async function pe(){if(!O.value)return false;let r=await f({kind:"jump-to-latest"},()=>u.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow));return r&&(await nextTick(),m.value?.scrollToLatest()),r}function Ee(r){w.value=r.isAtBottom,k.value=r.newMessageCount,be();}function Me(r,d){return m.value?.scrollToMessage(r,d)??false}function he(r,d){return !H&&o===d&&N.value===r&&O.value}async function me(r,d,h,y){for(let x=0;x<60;x+=1){if(!he(r,d))return false;if(Me(h,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}async function ie(r,d,h){let y=m.value;if(y===null||!y.isMeasurable()||y.isScrollable())return true;let x=0,C=!s.value.hasOlder,j=!s.value.hasNewer||u.actions.loadNewer===void 0,ge=async()=>(await nextTick(),await nextTick(),me(r,d,h,{behavior:"auto",block:"center"})),te=async le=>{if(!he(r,d)||x>=Y.value.maxFillPages)return false;let Ie=0;if(le==="older"){if(C||!s.value.hasOlder)return false;Ie=await v(),C=!s.value.hasOlder;}else {if(j||!s.value.hasNewer)return false;y.prepareHistoryPageAppend();try{Ie=await P();}catch(de){throw y.cancelHistoryPageAppend(),de}Ie<=0&&!s.value.hasNewer&&y.cancelHistoryPageAppend(),j=!s.value.hasNewer;}return x+=1,Ie>0?ge():!(le==="older"?C:j)};!C&&!await te("older")&&(C=true),!j&&!await te("newer")&&(j=true);let ve="older";for(;he(r,d)&&x<Y.value.maxFillPages&&y.isMeasurable()&&!y.isScrollable()&&(!C||!j);){let le=ve==="older"?C?"newer":"older":j?"older":"newer";ve=le==="older"?"newer":"older",await te(le)||(le==="older"?C=true:j=true);}return he(r,d)}async function Be(r,d={behavior:"auto",block:"center"}){if(!O.value||r==="")return false;let h=N.value,y=++o;if(!Q.value.includes(r)){let j=u.actions.loadAround;if(j===void 0||!await f({kind:"locate-message",messageId:r},()=>j(r))||!he(h,y))return false}return !await me(h,y,r,{...d,behavior:"auto"})||!await ie(h,y,r)?false:me(h,y,r,d)}function ne(){I!==void 0&&(clearTimeout(I),I=void 0);}function Te(){if(ne(),!V.value)return;let r=t.readActions;if(r===void 0||g.length===0)return;let d=Number.isFinite(q.value.visibleReadDelay)?Math.max(0,q.value.visibleReadDelay):We.visibleReadDelay;I=setTimeout(()=>{if(I=void 0,!O.value||!J.value)return;let h=g[g.length-1];if(h===void 0)return;let y=r.resolveTarget===void 0?h:r.resolveTarget(h);y!=null&&Promise.resolve(r.markRead(y)).catch(x=>{t.hooks?.onError?.({kind:"visible-range",messageIds:g},x);});},d);}function Oe(r){g=Object.freeze([...r]);let d={kind:"visible-range",messageIds:g};t.hooks?.beforeAction?.(d);try{u.actions.onVisibleRange?.(g),t.hooks?.afterAction?.(d,void 0);}catch(h){throw t.hooks?.onError?.(d,h),h}V.value?Te():be();}function ae(r,d){return !H&&M===d&&N.value===r&&!D}function xe(r,d){ae(r,d)&&(T=r,L=Re(s.value.entryUnread),V.value=true,Te());}function Re(r){return r.state!=="located"?r.state:`${r.state}:${r.firstMessageId}`}async function ye(r,d,h){for(let y=0;y<60;y+=1){if(!ae(r,d))return false;if(m.value?.scrollToMessage(h,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(C=>window.requestAnimationFrame(()=>C()));}return false}function be(){let r=N.value,d=Re(s.value.entryUnread);if(r===""||s.value.loading||s.value.error!==null||T===r&&(L===d||D)||S===r||l!==null)return;if(!Y.value.enabled){T=r,L=d,V.value=true,Te();return}let h=++M;D=false,V.value=false;let y=(async()=>{if(await nextTick(),!ae(r,h))return;let x=m.value;if(x===null||!x.isMeasurable())return;let C=s.value.entryUnread;if(C.state==="located"&&!Q.value.includes(C.firstMessageId))return;let j=C.state==="located"?await ye(r,h,C.firstMessageId):false;if(C.state==="located"&&!j)return;j||x.scrollToLatest();let ge=0;for(;ae(r,h)&&ge<Y.value.maxFillPages&&s.value.hasOlder&&x.isMeasurable()&&!x.isScrollable();)if(await v(),!ae(r,h)||(ge+=1,await nextTick(),await nextTick(),!x.isMeasurable()))return;if(!ae(r,h)||!x.isMeasurable())return;let te=s.value.entryUnread;if(te.state==="located"){if(!Q.value.includes(te.firstMessageId)||!await ye(r,h,te.firstMessageId))return}else x.scrollToLatest();await nextTick(),xe(r,h);})().catch(()=>{N.value===r&&(S=r);}).finally(()=>{l===y&&(l=null);});l=y;}function se(r){M+=1,l=null,D=false,V.value=r,(T="",L="",S=""),ne();}function Ve(){if(V.value)return;let r=N.value;D=true,M+=1,l=null,T=r,V.value=true,Te();}let oe=Object.freeze({getViewportElement:()=>m.value?.getViewportElement()??null,loadOlder:v,retryOlder:$,loadNewer:P,retryNewer:_,jumpToLatest:pe,scrollToMessage:Me,locateMessage:Be,focusViewport:()=>m.value?.focusViewport()});return i$1(oe),watch(J,r=>{r&&V.value?Te():ne();}),watch([()=>s.value.activeRemoteMessageRevision??0,m,N],()=>{let r=m.value;if(r===null||!O.value)return;let d=u.actions.drainActiveRemoteMessageIds?.()??[];r.trackRemoteMessageIds(d,{isAtBottom:w.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:G.value})&&(w.value=false);},{flush:"post"}),watch([N,()=>s.value.loading,()=>s.value.error,()=>Q.value.length,()=>s.value.hasOlder,()=>Re(s.value.entryUnread),Y],([r,d,h,,,y],[x,,,,,C])=>{if(r!==x&&(o+=1,se(false),c(true),m.value?.clearNewMessageBadge(),k.value=0,w.value=true),r!==""&&r===x&&y!==C&&!D&&y.startsWith("located:")&&(T="",L="",V.value=false),r===""){se(false);return}if(h!==null){V.value||se(false);return}d||be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{H=true,o+=1,se(false),c(true);}),()=>{let r={conversation:t.conversation,state:s.value,items:ee.value,actions:oe},d=[p.header?.(r),p["before-list"]?.(r)];if(!O.value)d.push(p.unsupported?.(r)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(p.loading?.(r)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder)d.push(p.empty?.(r)??h$1("div",{"data-im-thread-empty":""}));else {let h=h$1(qe,{ref:m,messageIds:Q.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:q.value.followThreshold,olderPrefetchThreshold:q.value.olderPrefetchThreshold,visibleMargin:q.value.visibleMargin,activeDateOffset:q.value.activeDateOffset,activeDateEnabled:p["active-date"]!==void 0,resizeFollowEnabled:V.value,followNewMessages:G.value,shouldFollowAppendedMessage:y=>{let x=s.value.messages.find(C=>C.id===y);return x===void 0?false:u.shouldFollowMessage?.(x)===true},onReachStart:()=>{z("older").catch(()=>{});},onReachEnd:()=>{z("newer").catch(()=>{});},onSettled:Ee,onUserScroll:Ve,onActiveDateChange:R,onVisibleRange:Oe,onNewMessageCount:y=>{k.value=y;}},{default:()=>[p["viewport-before"]?.(r),h$1(Ue,{items:ee.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:p.item,"date-separator":p["date-separator"],"entry-unread":p["entry-unread"],encryption:p.encryption,system:p.system,message:p.message,"recalled-message":p["recalled-message"],"deleted-message":p["deleted-message"],"unsupported-body":p["unsupported-body"]}),p["viewport-after"]?.(r)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[p["active-date"]?.({label:B.value,visible:U.value&&B.value!==""}),h])),s.value.error!==null&&d.push(p.error?.(r)??h$1("div",{"data-im-thread-error":""}));}return d.push(p["after-list"]?.(r),p["jump-to-latest"]?.({...r,count:k.value,visible:!w.value||s.value.isHistoryWindow}),p["context-menu"]?.(r),p.composer?.(r)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function cr(t){let i=new Map;for(let u of t){if(i.has(u.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${u.kind}`);i.set(u.kind,u.component);}let p=Object.freeze([...i.keys()]);return Object.freeze({kinds:p,resolve:u=>i.get(u)})}var mr=140,gr=120;function At(t,i){if(t.width<=0||t.height<=0)return 0;let p=Math.max(0,Math.min(t.right,i.right)-Math.max(t.left,i.left)),u=Math.max(0,Math.min(t.bottom,i.bottom)-Math.max(t.top,i.top));return Math.min(1,p*u/(t.width*t.height))}function vr(t,i){return {x:t.x,y:t.top-i,top:t.top-i,bottom:t.bottom+i,left:t.left,right:t.right,width:t.width,height:t.height+i*2,toJSON:()=>({})}}function $e(t){let i=Math.max(0,t.scrollIdleMs??mr),p=Math.max(0,t.visibilityDwellMs??gr),u=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),m=Math.max(0,t.revealMarginPx??0),k=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),w=new Map,g=new Map,I=reactive(new Set),M=new Set,o=new Set,l=null,T=null,L=null,S=false,D=false,H=false,V,B;function U(){V!==void 0&&clearTimeout(V),V=void 0;}function W(){B!==void 0&&clearTimeout(B),B=void 0;}function X(c=false){if(!c&&T!==null||l===null)return;let R=l.getBoundingClientRect(),f=vr(R,m);for(let[v,P]of w){let z=v.getBoundingClientRect();P.ratio=At(z,R),P.intersecting=P.ratio>0,P.revealIntersecting=m>0?At(z,f)>0:P.intersecting&&P.ratio>=u;}}function s(c){return c.intersecting&&c.ratio>=u}function G(){for(let c of w.values())!c.revealIntersecting||I.has(c.key)||(I.add(c.key),t.onRevealed?.(c.item));}function J(c){let R=new Set(c.map(v=>v.key));if(R.size!==o.size||[...R].some(v=>!o.has(v))){o.clear();for(let v of R)o.add(v);t.onSettledVisibleChange?.(c.map(v=>v.item));}}function O(){if(D||S)return;X(),G();let c=l?.getBoundingClientRect(),R=c===void 0?0:(c.top+c.bottom)/2,f=[...w.entries()].filter(([,v])=>s(v)).sort(([v],[P])=>{let z=v.getBoundingClientRect(),_=P.getBoundingClientRect();return Math.abs((z.top+z.bottom)/2-R)-Math.abs((_.top+_.bottom)/2-R)}).slice(0,k).map(([,v])=>v);J(f);for(let v of f)M.has(v.key)||(M.add(v.key),t.onActivated?.(v.item));}function q(){D||S||(W(),B=setTimeout(()=>{B=void 0,O();},p));}function Y(){D||(N(true),X(),G(),J([]),W(),U(),V=setTimeout(()=>{V=void 0,N(false),q();},i));}function N(c){S!==c&&(S=c,t.onScrollingChange?.(c));}function ee(){l?.removeEventListener("scroll",Y),T?.disconnect(),L?.disconnect(),T=null,L=null,l=null;}function Q(c=true){if(D)return;let R=t.getRoot();if(!(R===l&&l!==null)){if(ee(),l=R,l===null){c&&!H&&(H=true,Promise.resolve().then(()=>{H=false,D||(Q(false),q());}));return}if(l.addEventListener("scroll",Y,{passive:true}),typeof IntersectionObserver<"u"){T=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.intersecting=v.isIntersecting,P.ratio=v.intersectionRatio,m===0&&(P.revealIntersecting=v.isIntersecting&&v.intersectionRatio>=u));}G(),q();},{root:l,threshold:[0,u,1]}),m>0&&(L=new IntersectionObserver(f=>{for(let v of f){let P=w.get(v.target);P!==void 0&&(P.revealIntersecting=v.isIntersecting);}G();},{root:l,rootMargin:`${m}px 0px`,threshold:0}));for(let f of w.keys())T.observe(f);for(let f of w.keys())L?.observe(f);}else X(),G();}}function F(c){I.delete(c),M.delete(c),o.delete(c);}return {register(c,R){if(D)return;let f=t.getKey(c),v=I.has(f),P=M.has(f),z=R===null?void 0:w.get(R);z!==void 0&&z.key!==f&&(g.delete(z.key),w.delete(R),F(z.key));let _=g.get(f);if(_!==void 0&&_!==R&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),R===null){_!==void 0&&(T?.unobserve(_),L?.unobserve(_),w.delete(_),g.delete(f)),F(f);return}let $=w.get(R);if($?.key===f&&$.item===c){Q();return}w.set(R,{item:c,key:f,intersecting:$?.key===f?$.intersecting:false,ratio:$?.key===f?$.ratio:0,revealIntersecting:$?.key===f?$.revealIntersecting:false}),g.set(f,R),Q(),T?.observe(R),L?.observe(R),X(true),G(),v&&t.onRevealed?.(c),P?t.onActivated?.(c):q();},isRevealed:c=>I.has(t.getKey(c)),isActivated:c=>M.has(t.getKey(c)),isSettledVisible:c=>o.has(t.getKey(c)),isScrolling:()=>S,notifyScroll:Y,refresh(){Q(),X(true),G(),q();},reset(){U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear();},dispose(){D||(U(),W(),N(false),J([]),ee(),w.clear(),g.clear(),I.clear(),M.clear(),D=true);}}}function pr(t){let i=new Map,p=new Map,u=false,m=g=>{let I=i.get(g.channel);return I===void 0?g.channel:`${g.channel}\0${I.getKey(g.item)}`},k=$e({getRoot:t.getRoot,getKey:m,revealMarginPx:t.revealMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:g=>{for(let I of i.values())I.onScrollingChange?.(g);},onRevealed:g=>i.get(g.channel)?.onRevealed?.(g.item),onActivated:g=>i.get(g.channel)?.onActivated?.(g.item),onSettledVisibleChange:g=>{for(let[I,M]of i){let o=g.filter(T=>T.channel===I).map(T=>T.item),l=M.maxSettledVisible===void 0?o:o.slice(0,M.maxSettledVisible);M.onSettledVisibleChange?.(l);}}});function w(g){return I=>{if(u)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(i.has(g))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${g}`);i.set(g,I);let M=new Map;p.set(g,M);let o=false,l=S=>({channel:g,item:S});function T(){for(let S of M.values())k.register(S.target,null);M.clear(),I.onScrollingChange?.(false),I.onSettledVisibleChange?.([]);}return {register(S,D){if(o||u)return;let H=I.getKey(S),V=M.get(H);if(D===null){V!==void 0&&(k.register(V.target,null),M.delete(H));return}let B=l(S);M.set(H,{target:B,element:D}),k.register(B,D);},isRevealed:S=>k.isRevealed(l(S)),isActivated:S=>k.isActivated(l(S)),isSettledVisible:S=>k.isSettledVisible(l(S)),isScrolling:k.isScrolling,notifyScroll:k.notifyScroll,refresh:k.refresh,reset:T,dispose(){o||(T(),o=true,i.delete(g),p.delete(g));}}}}return {createFactory:w,refresh:k.refresh,dispose(){if(!u){for(let g of p.values())for(let I of g.values())k.register(I.target,null);p.clear(),i.clear(),k.dispose(),u=true;}}}}export{je as ImThreadBodySwitch,Ue as ImThreadItems,ur as ImThreadSurface,qe as ImThreadViewport,nr as createImThreadSurfaceContext,cr as createMessageRendererRegistry,pr as createThreadVisibilityTargetGroup,$e as createThreadVisibilityTargets,or as provideImThreadSurfaceContext,Bt as useImText,Ge as useImThreadSurfaceContext,jt as useOptionalImThreadReadActions};
|
package/dist/chat-kit.d.ts
CHANGED
|
@@ -126,12 +126,17 @@ type LastMessageSummary = {
|
|
|
126
126
|
*
|
|
127
127
|
* 只给结构化计数与配文,**不在这里拼「2 张照片, 1 个视频」这种文案**——中英文的量词、复数与
|
|
128
128
|
* 连接符各不相同,必须由 im-i18n 按 locale 组装。`caption` 非空时宿主优先显示配文(对齐三端)。
|
|
129
|
+
*
|
|
130
|
+
* `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数无法决定该配
|
|
131
|
+
* 照片图标还是视频图标,三端统一按第一项取(对齐 iOS `IMMediaAlbumMessageBody`)。
|
|
132
|
+
* 入站解析后所有项都被丢弃时缺省,宿主据此不显示类型图标。
|
|
129
133
|
*/
|
|
130
134
|
| {
|
|
131
135
|
kind: 'mediaAlbum';
|
|
132
136
|
imageCount: number;
|
|
133
137
|
videoCount: number;
|
|
134
138
|
caption?: string;
|
|
139
|
+
firstItemKind?: 'image' | 'video';
|
|
135
140
|
} | {
|
|
136
141
|
kind: 'encrypted';
|
|
137
142
|
} | {
|
|
@@ -4137,12 +4142,16 @@ type ConversationLastMessageSummary = {
|
|
|
4137
4142
|
*
|
|
4138
4143
|
* 只给计数与配文,数量文案由宿主经 im-i18n 按 locale 组装;有配文时优先显示配文。
|
|
4139
4144
|
* 两个计数都为 0 表示入站正文残缺(所有项都无法解析),宿主应按未知正文处理。
|
|
4145
|
+
*
|
|
4146
|
+
* `firstItemKind` 是第一项是照片还是视频。有配文时列表显示的是配文,光看计数决定不了该配
|
|
4147
|
+
* 照片图标还是视频图标,三端统一按第一项取;正文残缺时缺省,宿主据此不显示类型图标。
|
|
4140
4148
|
*/
|
|
4141
4149
|
| {
|
|
4142
4150
|
kind: 'mediaAlbum';
|
|
4143
4151
|
imageCount: number;
|
|
4144
4152
|
videoCount: number;
|
|
4145
4153
|
caption?: string;
|
|
4154
|
+
firstItemKind?: 'image' | 'video';
|
|
4146
4155
|
} | {
|
|
4147
4156
|
kind: 'encrypted';
|
|
4148
4157
|
} | {
|
|
@@ -5029,6 +5038,31 @@ interface ImMediaTasksApi {
|
|
|
5029
5038
|
* @throws 持久缓存读取失败时抛 `IM_SDK_MEDIA_CACHE_READ_FAILED`,不能把存储故障伪装成 cache miss。
|
|
5030
5039
|
*/
|
|
5031
5040
|
getCached: (message: ImMessageRef) => Promise<Blob | null>;
|
|
5041
|
+
/**
|
|
5042
|
+
* 为宿主手里的**本地**图片/视频文件预读展示元信息:尺寸、视频时长、视频首帧封面的 JPEG 字节。
|
|
5043
|
+
*
|
|
5044
|
+
* 给「发送前预览」这类场景用:宿主要在用户还没点发送时就把缩略图画出来,而浏览器读不出视频的
|
|
5045
|
+
* 首帧——`<video preload="metadata">` 在 iOS Safari 上只加载元信息、**不解码任何一帧**,
|
|
5046
|
+
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
5047
|
+
*
|
|
5048
|
+
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
5049
|
+
* `sendMediaAlbum`:发送链路会跳过重复解码,上传中的气泡也从第一帧就有封面。
|
|
5050
|
+
* 视频封面用的就是发送链路那套规格(长边 320、JPEG),所以弹层里看到的与最终发出去的是同一张。
|
|
5051
|
+
*
|
|
5052
|
+
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
5053
|
+
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
|
5054
|
+
* @param input.signal 宿主放弃时中止解码(例如预览弹层被关掉)。
|
|
5055
|
+
* @returns 解码成功返回元信息;**浏览器确实读不出这个文件**(格式不支持、解码超时)时返回 `null`,
|
|
5056
|
+
* 调用方应当显式呈现「这个文件读不出来」,不要拿空白格子糊过去。失败原因会记入 SDK 结构化诊断。
|
|
5057
|
+
* @throws 宿主通过 `signal` 中止时抛 `AbortError`——那是调用方自己的取消,不能和「读不出来」混为一谈。
|
|
5058
|
+
* @throws runtime 已 logout/dispose 时抛 `IM_SDK_MEDIA_RUNTIME_INACTIVE`;
|
|
5059
|
+
* 未装配预览端口时抛 `IM_SDK_MEDIA_PREVIEW_UNAVAILABLE`,不静默返回 `null`。
|
|
5060
|
+
*/
|
|
5061
|
+
prepareLocalPreview: <TKind extends 'image' | 'video'>(input: {
|
|
5062
|
+
kind: TKind;
|
|
5063
|
+
file: Blob;
|
|
5064
|
+
signal?: AbortSignal;
|
|
5065
|
+
}) => Promise<(TKind extends 'video' ? VideoPreviewMetadata : ImagePreviewMetadata) | null>;
|
|
5032
5066
|
}
|
|
5033
5067
|
|
|
5034
5068
|
/**
|
|
@@ -5477,14 +5511,8 @@ interface ImSearchApi {
|
|
|
5477
5511
|
readonly messages: ImMessageSearchApi;
|
|
5478
5512
|
}
|
|
5479
5513
|
|
|
5480
|
-
/**
|
|
5481
|
-
* 会话收藏稳定产品门面。
|
|
5482
|
-
*
|
|
5483
|
-
* 本模块不缓存服务端列表;每次 list/add/delete 都以当前账号 provider 为准。
|
|
5484
|
-
* 收藏快照与原聊天消息解耦:原消息删除、撤回或编辑不会回写收藏。
|
|
5485
|
-
*/
|
|
5486
|
-
|
|
5487
5514
|
type ImSessionFavoriteItem = Readonly<ImSessionFavoriteItem$1>;
|
|
5515
|
+
|
|
5488
5516
|
/** 产品层会话收藏 API。 */
|
|
5489
5517
|
interface ImSessionFavoritesApi {
|
|
5490
5518
|
list: () => Promise<readonly ImSessionFavoriteItem[]>;
|
|
@@ -6117,6 +6145,13 @@ type ConversationListPreviewSegment = {
|
|
|
6117
6145
|
kind: 'legacy-emoji-placeholder';
|
|
6118
6146
|
text: string;
|
|
6119
6147
|
};
|
|
6148
|
+
/**
|
|
6149
|
+
* 会话列表摘要文字前面那个类型图标的种类;宿主各自把它映射成自己的 SVG 组件。
|
|
6150
|
+
*
|
|
6151
|
+
* `mediaAlbum` 专指「照片和视频混装」的合集,产品用相机图标;只有照片或只有视频的合集归到
|
|
6152
|
+
* `image` / `video`,因为用户看到的文案也是「2张照片」「2个视频」。
|
|
6153
|
+
*/
|
|
6154
|
+
type ConversationListPreviewMediaKind = 'image' | 'video' | 'gif' | 'sticker' | 'mediaAlbum';
|
|
6120
6155
|
/** 由各宿主按当前产品语言注入的会话列表标签。 */
|
|
6121
6156
|
interface ConversationListPresentationLabels {
|
|
6122
6157
|
/** 没有草稿和最后消息时显示的占位文案。 */
|
|
@@ -6152,6 +6187,13 @@ interface ConversationListPresentation {
|
|
|
6152
6187
|
preview: string;
|
|
6153
6188
|
/** 不包含 @我提示与发送者前缀的摘要分段。 */
|
|
6154
6189
|
previewSegments: readonly ConversationListPreviewSegment[];
|
|
6190
|
+
/**
|
|
6191
|
+
* 摘要前面该显示哪个类型图标;不需要图标时缺省。
|
|
6192
|
+
*
|
|
6193
|
+
* 草稿、撤回、管理员删除、系统事件显示的是整句话而不是类型占位,一律不给图标;语音、文件、
|
|
6194
|
+
* 名片等没有产品 glyph 的类型同样不给,它们的文案自带方括号来和真实文本区分。
|
|
6195
|
+
*/
|
|
6196
|
+
previewMediaKind?: ConversationListPreviewMediaKind;
|
|
6155
6197
|
/** 群聊或社群普通消息的发送者前缀;其它摘要为空串。 */
|
|
6156
6198
|
senderPrefix: string;
|
|
6157
6199
|
/** 未读 @ 提示;草稿、系统、撤回和管理员删除摘要为空串。 */
|
|
@@ -6939,6 +6981,31 @@ declare namespace forward_service {
|
|
|
6939
6981
|
export type { forward_service_ForwardCommandHooks as ForwardCommandHooks, forward_service_ImForwardOperationResult as ImForwardOperationResult };
|
|
6940
6982
|
}
|
|
6941
6983
|
|
|
6984
|
+
/**
|
|
6985
|
+
* 为宿主手里的本地图片/视频文件预读展示元信息(尺寸、视频时长、视频首帧封面 JPEG 字节)。
|
|
6986
|
+
*
|
|
6987
|
+
* 给「发送前预览」用:宿主要在用户点发送之前就把缩略图画出来。**不要用 `<video>` 当缩略图**——
|
|
6988
|
+
* `preload="metadata"` 在 iOS Safari 上只加载元信息、不解码任何一帧,格子会是空白的,
|
|
6989
|
+
* 而且 N 个文件就是 N 路解码。
|
|
6990
|
+
*
|
|
6991
|
+
* 返回值可以**原样**作为 `localPreviewMetadata` 传给发送命令:发送链路会跳过重复解码,
|
|
6992
|
+
* 上传中的气泡也从第一帧就有封面。视频封面用的就是发送链路那套规格,弹层里看到的与发出去的是同一张。
|
|
6993
|
+
*
|
|
6994
|
+
* @param runtime 当前账号 runtime。
|
|
6995
|
+
* @param input 预读入参。
|
|
6996
|
+
* @param input.kind 文件类型;`'video'` 才会抽首帧与读时长。
|
|
6997
|
+
* @param input.file 本地文件;不上传、不进缓存。
|
|
6998
|
+
* @param input.signal 宿主放弃时中止解码(例如弹层被关掉)。
|
|
6999
|
+
* @returns 解码成功返回元信息;**浏览器确实读不出这个文件**时返回 `null`,
|
|
7000
|
+
* 调用方必须显式呈现「这个文件读不出来」,不要留一块空白让用户以为还在加载。
|
|
7001
|
+
* 账号切换、Client 未就绪同样返回 `null`(此时页面已经不该再画这一格)。
|
|
7002
|
+
* @throws 宿主自己通过 `signal` 中止时抛 `AbortError`;那是调用方的取消,不是文件读不出来。
|
|
7003
|
+
*/
|
|
7004
|
+
declare function prepareLocalMediaPreview<TKind extends 'image' | 'video'>(runtime: ChatRuntime, input: {
|
|
7005
|
+
kind: TKind;
|
|
7006
|
+
file: Blob;
|
|
7007
|
+
signal?: AbortSignal;
|
|
7008
|
+
}): Promise<(TKind extends 'video' ? VideoPreviewMetadata : ImagePreviewMetadata) | null>;
|
|
6942
7009
|
/** 根据文件头确认解密结果是否为 JPEG、PNG、GIF 或 WebP;不是已知图片时返回 `null`,避免页面显示裂图。 */
|
|
6943
7010
|
declare function detectImageMime(bytes: Uint8Array): string | null;
|
|
6944
7011
|
/** 根据文件头识别 WebM 或 MP4;无法识别时返回 `video/mp4`,由浏览器播放器继续判断是否能播放。 */
|
|
@@ -6977,6 +7044,7 @@ declare function loadCachedVideoObjectUrl(runtime: ChatRuntime, message: ImMessa
|
|
|
6977
7044
|
* 同一条门槛),不把无效二进制交给 `<img>`。
|
|
6978
7045
|
*
|
|
6979
7046
|
* 返回 `null` 表示下标越界、正文不是合集、内容非法或下载失败,失败原因经 `setNote` 反馈。
|
|
7047
|
+
* **唯一不反馈的失败是用户自己取消**(关预览浮层时取消这一项的在途下载):同样返回 `null`,但不提示。
|
|
6980
7048
|
* **调用方在不再使用地址时必须 `URL.revokeObjectURL`。**
|
|
6981
7049
|
*/
|
|
6982
7050
|
declare function loadMediaAlbumItemObjectUrl(runtime: ChatRuntime, message: ImMessageView, itemIndex: number, hooks: ServiceNoteHooks, onProgress?: (percent: number) => void): Promise<string | null>;
|
|
@@ -7020,6 +7088,7 @@ declare const media_service_loadImageObjectUrl: typeof loadImageObjectUrl;
|
|
|
7020
7088
|
declare const media_service_loadMediaAlbumItemObjectUrl: typeof loadMediaAlbumItemObjectUrl;
|
|
7021
7089
|
declare const media_service_loadVideoObjectUrl: typeof loadVideoObjectUrl;
|
|
7022
7090
|
declare const media_service_loadVoiceBytes: typeof loadVoiceBytes;
|
|
7091
|
+
declare const media_service_prepareLocalMediaPreview: typeof prepareLocalMediaPreview;
|
|
7023
7092
|
declare namespace media_service {
|
|
7024
7093
|
export {
|
|
7025
7094
|
media_service_acquireMediaBlob as acquireMediaBlob,
|
|
@@ -7033,6 +7102,7 @@ declare namespace media_service {
|
|
|
7033
7102
|
media_service_loadMediaAlbumItemObjectUrl as loadMediaAlbumItemObjectUrl,
|
|
7034
7103
|
media_service_loadVideoObjectUrl as loadVideoObjectUrl,
|
|
7035
7104
|
media_service_loadVoiceBytes as loadVoiceBytes,
|
|
7105
|
+
media_service_prepareLocalMediaPreview as prepareLocalMediaPreview,
|
|
7036
7106
|
};
|
|
7037
7107
|
}
|
|
7038
7108
|
|
|
@@ -8447,4 +8517,4 @@ declare function resampleWaveform(data: readonly number[], targetCount: number):
|
|
|
8447
8517
|
declare function placeholderWaveform(seed: string, count: number): number[];
|
|
8448
8518
|
|
|
8449
8519
|
export { DEFAULT_EMOJI_ASSET_BASE, DEFAULT_LOADING_MINIMUM_VISIBLE_MS, DEFAULT_LOADING_SHOW_DELAY_MS, EMOJI_CATALOG, EMOJI_GAME_DICE_STABLE_KEY, EMOJI_GAME_RPS_STABLE_KEY, EMOJI_TOKEN_RE, MAX_BATCH_FILES, MAX_RECENT_EMOJI_COUNT, SPIKE_STEP, UNICODE_EMOJI_CATALOG, blockReasonForChannelSession, blockReasonForChannelState, blockReasonForGroupState, blockReasonForSession, calculateMediaBox, canEditMessage, canPinChannelMessage, canPinGroupMessage, canPinMessage, canPromoteMediaPresentationSource, canRecallMessage, canTransmit, canTransmitByType, canTransmitContent, cancelMediaUpload, captureRuntimeClientOperation, captureRuntimeOperation, classifyGifFile, createChatRuntime, createDelayedLoadingIndicator, createEmojiMatcher, createLinkMatcher, createNewMessageBadgeController, createThreadItems, decideConversationAction, decideMemberTargetAction, decideMessageAction, emojiAssetUrl, emojiUrlByCode, fetchConversationFileBatch, fetchConversationImageBatch, fetchConversationMessageBatch, fetchConversationVideoBatch, fetchConversationVoiceBatch, fetchNextConversationSearchBatch, formatChatDateSeparator, formatConversationDisplayTime, formatFileSize, formatMediaDuration, forward_service as forwardService, getFileExtension, getLocalDayKey, hasEmojiCandidate, hasLinkCandidate, highlightSegments, isGifFile, isMessageLocateScrollProtected, isMessageTailChangeFromOlderWindowTrim, isMessageViewportMeasurable, isMessageVisibleForNewMessageBadge, isPinnedMessageProtected, isVoiceStorageConfigured, loadOlderUntilBoundary, mediaBatchBudgetBytes, media_service as mediaService, message_service as messageService, normalizeLinkHref, parseUnicodeEmojiCode, pinnedMessage_service as pinnedMessageService, placeholderWaveform, prependRecentEmoji, profile_service as profileService, read_service as readService, refreshPrependMessageAnchorPosition, replaceInterruptedMediaFile, requiresConversationEncryption, requiresForwardTypeConfirmation, resampleWaveform, resolveBestMediaPresentationSource, resolveCenteredMessageScrollTop, resolveChannelMemberAvatarUrl, resolveChannelMemberDisplayName, resolveConversationListPresentation, resolveDisplayTimestamp, resolveEmojiToken, resolveFriendDisplayName, resolveImProfileAccessDestination, resolveImThreadActiveDate, resolveMediaPresentation, resolveMemberDisplayName, resolveMessageBodyKind, resolveMessageNotificationDecision, resolveMessageTimelineTimestamp, resolvePrependMessageAnchor, resolvePrependMessageAnchorAdjustment, resolvePrependMessageAnchorPosition, resolvePublicNickname, resolveQuotedMessagePresentation, resolveSenderAvatarUrl, resolveStandaloneEmojiMessage, resolveSurvivingMessageAnchorAdjustment, resolveUnicodeEmoji, resolveVisibleMessageAnchorPositions, retryMessage, runMediaSendBatch, sendAsFilesBatch, sendBlockReasonForDecision, sendMediaAlbum, sendMediaFile, sendMediaFilesBatch, sendText, sendVoice, shouldCompleteInitialViewport, shouldFillInitialHistoryViewport, shouldFollowIncomingMessage, shouldLoadNewerHistoryPage, shouldPrefetchOlderHistory, shouldRestoreMessageViewportFocus, shouldShowChatDateSeparator, shouldTrackRemoteMessageForBadge, spikeCountForDuration, supportsConversationMention, unicodeEmojiTextFromCode };
|
|
8450
|
-
export type { ApplySessionResult, BrowseMessagesInput, CanPinMessageInput, CenteredMessageScrollInput, ChatMediaMessageRef, ChatProfileAdapter, ChatRuntime, ChatRuntimeCredentials, ChatRuntimeFactories, ChatRuntimeHostDeps, ChatRuntimeOpResult, ConversationCapabilityAction, ConversationListPresentation, ConversationListPresentationLabels, ConversationListPresentationOptions, ConversationListPreviewSegment, ConversationSearchCategory, CreateThreadItemsInput, DelayedLoadingIndicator, DelayedLoadingIndicatorOptions, EmojiEntry, EmojiRecentItem, EmojiSegment, FormatTimeDisplayContext, ForwardCommandHooks, GifFileClassification, HighlightSegment, ImChannelMemberPresentation, ImChannelMentionPresentation, ImChannelProfilePresentation, ImForwardOperationResult, ImGroupMemberPresentation, ImMediaBatchSendResult, ImMessageActionResult, ImMessageBodyKind, ImMessageView, ImPinnedMessageActionResult, ImPinnedMessageSnapshot, ImProfileAccessDestination, ImQuotedMessagePresentation, ImTextResolver, ImThreadActiveDateSnapshot, ImThreadDateMarkerMetric, ImThreadDecoration, ImThreadEncryptionItem, ImThreadIntent, ImThreadItem, ImThreadPresentationAdapter, ImThreadReadActions, ImThreadReadTargetResolver, ImThreadViewportMetrics, IncomingMessageFollowInput, InitialHistoryViewportFillInput, InitialViewportCompletionInput, LinkSegment, MediaBatchBudgetOptions, MediaBatchLimitInfo, MediaLimitItem, MediaObjectUrlLease, MediaPresentationFit, MediaPresentationPolicy, MediaPresentationRule, MediaPresentationSourceCandidate, MediaPresentationSourceQuality, MediaSendBatchResult, MemberTargetCapabilityAction, MemberTargetCapabilityInput, MessageCapabilityAction, MessageCapabilityInput, MessageLocateScrollProtectionInput, MessageNotificationDecision, MessageNotificationInput, NewMessageBadgeController, NewMessageBadgeCountListener, NewMessageBadgeVisibilityInput, NewerHistoryPageTriggerInput, OlderHistoryPrefetchInput, PrependAnchorCandidate, PrependAnchorViewport, PrependMessageAnchorPosition, RemoteMessageBadgeTrackingInput, ResolveMediaPresentationInput, ResolvedMediaPresentation, RichExtraSegment, RuntimeClientOperation, RuntimeOperation, SearchBatchResult, SearchFilesInput, SearchMessagesInput, SearchTextMessagesInput, SendCapabilityMode, SendCommandHooks, SendVoicePayload, SenderProfileEntry, ServiceNoteHooks, StandaloneEmojiMessage, UnicodeEmojiEntry };
|
|
8520
|
+
export type { ApplySessionResult, BrowseMessagesInput, CanPinMessageInput, CenteredMessageScrollInput, ChatMediaMessageRef, ChatProfileAdapter, ChatRuntime, ChatRuntimeCredentials, ChatRuntimeFactories, ChatRuntimeHostDeps, ChatRuntimeOpResult, ConversationCapabilityAction, ConversationListPresentation, ConversationListPresentationLabels, ConversationListPresentationOptions, ConversationListPreviewMediaKind, ConversationListPreviewSegment, ConversationSearchCategory, CreateThreadItemsInput, DelayedLoadingIndicator, DelayedLoadingIndicatorOptions, EmojiEntry, EmojiRecentItem, EmojiSegment, FormatTimeDisplayContext, ForwardCommandHooks, GifFileClassification, HighlightSegment, ImChannelMemberPresentation, ImChannelMentionPresentation, ImChannelProfilePresentation, ImForwardOperationResult, ImGroupMemberPresentation, ImMediaBatchSendResult, ImMessageActionResult, ImMessageBodyKind, ImMessageView, ImPinnedMessageActionResult, ImPinnedMessageSnapshot, ImProfileAccessDestination, ImQuotedMessagePresentation, ImTextResolver, ImThreadActiveDateSnapshot, ImThreadDateMarkerMetric, ImThreadDecoration, ImThreadEncryptionItem, ImThreadIntent, ImThreadItem, ImThreadPresentationAdapter, ImThreadReadActions, ImThreadReadTargetResolver, ImThreadViewportMetrics, IncomingMessageFollowInput, InitialHistoryViewportFillInput, InitialViewportCompletionInput, LinkSegment, MediaBatchBudgetOptions, MediaBatchLimitInfo, MediaLimitItem, MediaObjectUrlLease, MediaPresentationFit, MediaPresentationPolicy, MediaPresentationRule, MediaPresentationSourceCandidate, MediaPresentationSourceQuality, MediaSendBatchResult, MemberTargetCapabilityAction, MemberTargetCapabilityInput, MessageCapabilityAction, MessageCapabilityInput, MessageLocateScrollProtectionInput, MessageNotificationDecision, MessageNotificationInput, NewMessageBadgeController, NewMessageBadgeCountListener, NewMessageBadgeVisibilityInput, NewerHistoryPageTriggerInput, OlderHistoryPrefetchInput, PrependAnchorCandidate, PrependAnchorViewport, PrependMessageAnchorPosition, RemoteMessageBadgeTrackingInput, ResolveMediaPresentationInput, ResolvedMediaPresentation, RichExtraSegment, RuntimeClientOperation, RuntimeOperation, SearchBatchResult, SearchFilesInput, SearchMessagesInput, SearchTextMessagesInput, SendCapabilityMode, SendCommandHooks, SendVoicePayload, SenderProfileEntry, ServiceNoteHooks, StandaloneEmojiMessage, UnicodeEmojiEntry };
|
package/dist/chat-kit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-
|
|
1
|
+
export{c as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,b as DEFAULT_LOADING_SHOW_DELAY_MS,u as SPIKE_STEP,q as calculateMediaBox,f as canPromoteMediaPresentationSource,h as captureRuntimeClientOperation,g as captureRuntimeOperation,d as createDelayedLoadingIndicator,o as createLinkMatcher,s as formatFileSize,r as formatMediaDuration,t as getFileExtension,n as hasLinkCandidate,l as highlightSegments,i as mediaService,m as normalizeLinkHref,x as placeholderWaveform,j as readService,w as resampleWaveform,e as resolveBestMediaPresentationSource,a as resolveConversationListPresentation,p as resolveMediaPresentation,k as resolveQuotedMessagePresentation,v as spikeCountForDuration}from'./chunk-5I7S6LWE.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,L as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,K as blockReasonForChannelSession,J as blockReasonForChannelState,Q as blockReasonForGroupState,T as blockReasonForSession,E as canEditMessage,u as canPinChannelMessage,t as canPinGroupMessage,v as canPinMessage,D as canRecallMessage,aa as cancelMediaUpload,O as classifyGifFile,s as createChatRuntime,p as createEmojiMatcher,G as decideConversationAction,I as decideMemberTargetAction,H as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Aa as fetchConversationFileBatch,Ba as fetchConversationImageBatch,ya as fetchConversationMessageBatch,Ca as fetchConversationVideoBatch,Da as fetchConversationVoiceBatch,Ea as fetchNextConversationSearchBatch,da as forwardService,o as hasEmojiCandidate,P as isGifFile,w as isPinnedMessageProtected,X as isVoiceStorageConfigured,M as mediaBatchBudgetBytes,ia as messageService,e as parseUnicodeEmojiCode,na as pinnedMessageService,d as prependRecentEmoji,xa as profileService,W as replaceInterruptedMediaFile,R as requiresConversationEncryption,z as resolveChannelMemberAvatarUrl,y as resolveChannelMemberDisplayName,k as resolveEmojiToken,C as resolveFriendDisplayName,oa as resolveImProfileAccessDestination,x as resolveMemberDisplayName,r as resolveMessageNotificationDecision,B as resolvePublicNickname,A as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ba as retryMessage,N as runMediaSendBatch,$ as sendAsFilesBatch,F as sendBlockReasonForDecision,Z as sendMediaAlbum,V as sendMediaFile,_ as sendMediaFilesBatch,U as sendText,Y as sendVoice,S as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-4X7RCGEV.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-2GZMQCIP.js';import'./chunk-P4HOR4XO.js';import'./chunk-DN4H5C7G.js';import'./chunk-YAM4YHKF.js';export{pa as canTransmit,na as canTransmitByType,oa as canTransmitContent,ma as requiresForwardTypeConfirmation}from'./chunk-A2BLOVZ5.js';import'./chunk-WOT6VMZA.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {c as c$1}from'./chunk-
|
|
1
|
+
import {c as c$1}from'./chunk-P4HOR4XO.js';import {q as q$1}from'./chunk-A2BLOVZ5.js';var w=864e5,P=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];function u(e){return e!=null&&Number.isFinite(e)&&e>0&&!Number.isNaN(new Date(e).getTime())}function v(e,n){if(u(e))return e;if(u(n))return n}function b(e,n){return v(e,n)}function m(e){if(!u(e))return "";let n=new Date(e);return `${n.getFullYear()}-${n.getMonth()+1}-${n.getDate()}`}function h(e,n){return u(e)?u(n)?m(e)!==m(n):true:false}function F(e,n){return T(e,n,"conversation")}function L(e,n){return T(e,n,"separator")}function T(e,n,r){if(!u(e))return "";let t=n.now??new Date;if(Number.isNaN(t.getTime()))return "";let o=new Date(e),a=y(t)-y(o),i=c$1(n.locale);return o.getFullYear()!==t.getFullYear()?A(o):a===0?r==="conversation"?k(o):i.today:a===1?i.yesterday:a>=2&&a<=6?x(o,i):D(o)}function y(e){return Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())/w}function x(e,n){return n.weekdays[P[e.getDay()]]}function k(e){return `${c(e.getHours())}:${c(e.getMinutes())}`}function A(e){return `${e.getFullYear()}/${c(e.getMonth()+1)}/${c(e.getDate())}`}function D(e){return `${c(e.getMonth()+1)}/${c(e.getDate())}`}function c(e){return String(e).padStart(2,"0")}function O(e){if(e.markers.length===0)return null;let n=e.viewportTop+e.overlayTop;if(e.markers[0].top>n+1)return null;let r=0;for(let d=0;d<e.markers.length&&!(e.markers[d].top>n+1);d+=1)r=d;let t=e.markers[r],o=n+e.overlayHeight,a=e.markers.filter(d=>d.top<o+1&&d.top+d.height>n-1).at(-1),i=a===void 0?0:Math.max(0,Math.min(a.top+a.height,o)-Math.max(a.top,n)),s=a===void 0?1:Math.max(1,Math.min(a.height,e.overlayHeight)),l=Math.min(1,i/s);return {key:t.key,label:t.label,inlineOpacity:1-l,...a===void 0?{}:{inlineDateKey:a.key}}}var C={text:"text",image:"image",video:"video",voice:"voice",file:"file",sticker:"sticker",contact:"contact",miniProgram:"miniProgram",game:"game",transfer:"transfer",redPacket:"redPacket",call:"call",mediaAlbum:"mediaAlbum",system:"system",unknown:"unknown"};function S(e){switch(e.contentType){case "text":return typeof e.body.text=="string";case "image":return e.body.image!==void 0&&typeof e.body.image.url=="string";case "video":return e.body.video!==void 0&&typeof e.body.video.url=="string";case "voice":return e.body.voice!==void 0;case "file":return e.body.file!==void 0;case "sticker":return e.body.sticker!==void 0;case "contact":return e.body.contact!==void 0;case "miniProgram":return e.body.miniProgram!==void 0&&typeof e.body.miniProgram.appId=="string";case "transfer":return e.body.transfer!==void 0&&typeof e.body.transfer.serialNumber=="string";case "redPacket":{let n=e.body.redPacket;return n!==void 0&&n.packetId.trim()!==""&&(n.packetType===1||n.packetType===2||n.packetType===3||n.packetType===4)}case "call":return e.body.call!==void 0&&(e.body.call.callKind==="audio"||e.body.call.callKind==="video")&&typeof e.body.call.durationMs=="number";case "game":{let n=e.body.game;return n?.gameType==="dice"?Number.isInteger(n.value)&&n.value>=1&&n.value<=6:n?.gameType==="rock-paper-scissors"&&Number.isInteger(n.value)&&n.value>=1&&n.value<=3}case "mediaAlbum":{let n=e.body.mediaAlbum;return n!==void 0&&n.items.length>0&&n.items.every(r=>typeof r.url=="string"&&r.url!=="")}case "system":return e.body.system!==void 0;case "unknown":return e.body.unknown!==void 0}}function I(e){return e.encryption.decryptFailed===true?"decrypt-failed":S(e)?e.contentType==="sticker"?q$1(e.body.sticker.imageType):C[e.contentType]:"unknown"}function _(e){let n=[...e.leadingItems??[]],r=e.entryUnread.state==="located"?e.entryUnread:null,t,o=null,a=false;for(let i of e.messages){let s=b(i.createdAt,i.serverTime),l=s!==void 0&&h(s,t);s!==void 0&&l&&n.push({kind:"date-separator",key:`date-${m(s)}-${i.id}`,label:e.formatDate(s)}),t=s,!a&&r!==null&&i.id===r.firstMessageId&&(n.push({kind:"entry-unread",key:`entry-unread-${i.id}`,...r.count===void 0?{}:{count:r.count}}),a=true);let d=e.beforeMessageItems?.(i)??[];if(n.push(...d),I(i)==="system"){n.push({kind:"system",key:i.id,message:i}),o=null;continue}n.push({kind:"message",key:`message-${i.id}`,message:i,firstOfRun:l||i.senderId!==o}),o=i.senderId;}return n}function U(e){let n=e.targetTop-e.viewportTop,r=e.currentScrollTop+n-(e.viewportHeight-e.targetHeight)/2,t=Math.max(0,e.scrollHeight-e.viewportHeight);return Math.min(t,Math.max(0,r))}function j(e){return e!==null&&e.clientWidth>0&&e.clientHeight>0}function G(e){return e.locatedAt<=0||e.duration<0||e.now<e.locatedAt?false:e.now-e.locatedAt<=e.duration}function q(e){return !Number.isFinite(e.topThreshold)||e.topThreshold<0?false:e.currentScrollTop<e.previousScrollTop&&e.currentScrollTop<=e.topThreshold}function H(e,n){return e.find(r=>r.bottom>n.top&&r.top<n.bottom)??e[0]}function f(e){return e.anchorTop??e.top}function B(e,n){let r=H(e,n);return r===void 0?void 0:{id:r.id,offset:f(r)-n.top}}function J(e,n,r){if(e===void 0)return;let t=n.find(o=>o.id===e.id);return t!==void 0&&t.bottom>r.top&&t.top<r.bottom?{id:e.id,offset:f(t)-r.top}:B(n,r)??e}function V(e,n,r){if(e===void 0)return;let t=n.find(o=>o.id===e.id);return t===void 0?void 0:f(t)-r.top-e.offset}function Q(e,n,r=3){return !Number.isFinite(r)||r<=0?[]:e.filter(t=>t.bottom>n.top&&t.top<n.bottom).slice(0,Math.floor(r)).map(t=>({id:t.id,offset:f(t)-n.top}))}function X(e,n,r){for(let t of e){let o=V(t,n,r);if(o!==void 0)return o}}function Z(e){return e.sameConversation&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&e.userKeptLatestIntent}function ee(e){return e.isPageVisible&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&(e.isOwnMessage||e.isAtBottom)}function ne(e){return e.isLoadingOlder&&e.previousTailId!==void 0&&e.previousTailId!==e.currentTailId&&e.previousMessageIds.includes(e.currentTailId)}function re(e,n){return e!==void 0&&!n.has(e)}async function te(e,n){let r=0;for(;e()&&!(await n()<=0);)r+=1;return r}function oe(e){return e.hasMoreHistory&&Number.isFinite(e.scrollHeight)&&Number.isFinite(e.clientHeight)&&e.scrollHeight>0&&e.clientHeight>0&&e.scrollHeight<=e.clientHeight}function ie(e){return e.isHistoryWindow&&!e.isPageSettling&&e.isAtBottom&&(e.currentScrollTop>e.previousScrollTop||e.allowStationaryBoundary===true)}function M(e){return !e.isPageVisible||!e.isAtBottom||e.isHistoryWindow}function ae(e){let n=Math.max(0,e.margin);return e.messageTop<e.viewportBottom-n&&e.messageBottom>e.viewportTop+n}function le(e){let n=new Set;function r(s){return s===n.size?false:(e?.(n.size),true)}function t(s){let l=n.size;for(let d of s)d!==""&&n.add(d);return r(l)}function o(s,l){return M(l)&&t(s)}function a(s){let l=n.size;for(let d of s)n.delete(d);return r(l)}function i(){let s=n.size;return n.clear(),r(s)}return {get count(){return n.size},add:t,trackRemote:o,acknowledgeVisible:a,clear:i}}export{M as A,ae as B,le as C,v as a,b,m as c,h as d,F as e,L as f,O as g,I as h,_ as i,U as j,j as k,G as l,q as m,H as n,B as o,J as p,V as q,Q as r,X as s,Z as t,ee as u,ne as v,re as w,te as x,oe as y,ie as z};
|