k2-im 0.2.8 → 0.2.9
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,n,i)=>((t,n,i)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[n]=i)(t,"symbol"!=typeof n?n+"":n,i);import{getApplicationPage as n,ignoreApplication as i,acceptApplication as r}from"./requests/applications.js";class a extends Error{constructor(e,n){super(`application HTTP 失败(${e}):${n||"unknown error"}`),t(this,"code"),this.code=e,this.name="ApplicationHttpError"}}class o extends Error{constructor(e){super(`application 映射失败:${e}`),this.name="ApplicationMappingError"}}function s(e){return"string"==typeof e||"number"==typeof e?String(e).trim():""}function u(e){const t=s(e);if(""===t)return;if(/^\d+$/.test(t)){const e=Number(t);if(!Number.isSafeInteger(e)||e<=0)return;return t.length>=13?e:1e3*e}const n=Date.parse(t);return Number.isFinite(n)?n:void 0}function c(e){const t=s(e.status);if(void 0===e.status||""===t)return!0;const n=function(e){switch(e){case 0:case 1:case 2:return e;default:return}}(Number(t));if(void 0===n)throw new o(`未知申请状态:${t}`);return 0===n}function p(e){const t=s(e.type);if(""===t)return!0;if(1!==Number(t))throw new o(`联系人申请页出现未知 type:${t}`);return!0}function l(e){const t=Number(s(e.type));if(2!==t&&3!==t&&4!==t&&5!==t)throw new o(`GROUP/CHANNEL 混合页出现未知 type:${s(e.type)||"<empty>"}`);return t}function f(e){if(!Number.isInteger(e.limit)||e.limit<=0||e.limit>50)throw new o("limit 必须为 1-50");if(void 0===e.cursor)return{page:1,pageSize:e.limit};if(!/^[1-9]\d*$/.test(e.cursor))throw new o("page cursor 必须为正十进制整数");const t=Number(e.cursor);if(!Number.isSafeInteger(t))throw new o("page cursor 超出安全整数范围");return{page:t,pageSize:e.limit}}function m(e){if(null!=e&&Array.isArray(e.list))return e.list;const t=e?.count??e?.total,n=0===t||"string"==typeof t&&/^0+$/.test(t.trim());if(null===e?.list&&n)return[];throw new o("data.list 必须是数组,或在 count=0 时为 null")}function d(e){const t=e.trim();if(""===t)throw new o("申请记录 id 不能为空");return t}function g(e){const t=d(s(e.id)||s(e.aid)),n=s(e.user_id)||s(e.user_info?.user_id),i=s(e.nick_name
|
|
1
|
+
var e=Object.defineProperty,t=(t,n,i)=>((t,n,i)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[n]=i)(t,"symbol"!=typeof n?n+"":n,i);import{getApplicationPage as n,ignoreApplication as i,acceptApplication as r}from"./requests/applications.js";class a extends Error{constructor(e,n){super(`application HTTP 失败(${e}):${n||"unknown error"}`),t(this,"code"),this.code=e,this.name="ApplicationHttpError"}}class o extends Error{constructor(e){super(`application 映射失败:${e}`),this.name="ApplicationMappingError"}}function s(e){return"string"==typeof e||"number"==typeof e?String(e).trim():""}function u(e){const t=s(e);if(""===t)return;if(/^\d+$/.test(t)){const e=Number(t);if(!Number.isSafeInteger(e)||e<=0)return;return t.length>=13?e:1e3*e}const n=Date.parse(t);return Number.isFinite(n)?n:void 0}function c(e){const t=s(e.status);if(void 0===e.status||""===t)return!0;const n=function(e){switch(e){case 0:case 1:case 2:return e;default:return}}(Number(t));if(void 0===n)throw new o(`未知申请状态:${t}`);return 0===n}function p(e){const t=s(e.type);if(""===t)return!0;if(1!==Number(t))throw new o(`联系人申请页出现未知 type:${t}`);return!0}function l(e){const t=Number(s(e.type));if(2!==t&&3!==t&&4!==t&&5!==t)throw new o(`GROUP/CHANNEL 混合页出现未知 type:${s(e.type)||"<empty>"}`);return t}function f(e){if(!Number.isInteger(e.limit)||e.limit<=0||e.limit>50)throw new o("limit 必须为 1-50");if(void 0===e.cursor)return{page:1,pageSize:e.limit};if(!/^[1-9]\d*$/.test(e.cursor))throw new o("page cursor 必须为正十进制整数");const t=Number(e.cursor);if(!Number.isSafeInteger(t))throw new o("page cursor 超出安全整数范围");return{page:t,pageSize:e.limit}}function m(e){if(null!=e&&Array.isArray(e.list))return e.list;const t=e?.count??e?.total,n=0===t||"string"==typeof t&&/^0+$/.test(t.trim());if(null===e?.list&&n)return[];throw new o("data.list 必须是数组,或在 count=0 时为 null")}function d(e){const t=e.trim();if(""===t)throw new o("申请记录 id 不能为空");return t}function g(e){const t=d(s(e.id)||s(e.aid)),n=s(e.user_id)||s(e.user_info?.user_id),i=s(e.nick_name)||s(e.nickname)||s(e.name)||s(e.user_info?.nick_name)||s(e.user_info?.nickname)||s(e.user_info?.name);if(""===n||""===i)throw new o(`联系人申请人身份不能为空(applicationId=${t})`);const r=s(e.head_img_url)||s(e.avatar)||s(e.user_info?.head_img_url)||s(e.user_info?.avatar),a=s(e.user_info?.mid),c=u(e.create_time??e.createTime??e.update_version);return{applicationId:t,applicantId:n,applicantName:i,...""===r?{}:{applicantAvatar:r},...""===a?{}:{applicantDisplayId:a},message:s(e.remarks)||s(e.introduce_self),...void 0===c?{}:{createdAt:c}}}function _(e){const t=d(s(e.id)||s(e.aid)),n=s(e.group_id)||s(e.group_info?.group_id);if(""===n)throw new o(`GROUP id 不能为空(applicationId=${t})`);const i=s(e.user_id)||s(e.user_info?.user_id),r=s(e.nick_name)||s(e.nickname)||s(e.name)||s(e.user_info?.nick_name)||s(e.user_info?.nickname)||s(e.user_info?.name);if(""===i||""===r)throw new o(`GROUP 申请人或邀请人身份不能为空(applicationId=${t})`);const a=s(e.head_img_url)||s(e.avatar)||s(e.user_info?.head_img_url)||s(e.user_info?.avatar),c=s(e.user_info?.mid),p=s(e.group_info?.name)||s(e.group_info?.group_name);if(""===p)throw new o(`GROUP 名称不能为空(applicationId=${t})`);const l=s(e.group_info?.head_img_url)||s(e.group_info?.avatar),f=u(e.create_time??e.createTime??e.update_version);return{applicationId:t,groupId:n,kind:3===Number(e.type)?"invite":"request",actor:{id:i,name:r,...""===a?{}:{avatarUrl:a},...""===c?{}:{displayId:c}},target:{id:n,name:p,...""===l?{}:{avatarUrl:l}},message:s(e.remarks)||s(e.introduce_self),...void 0===f?{}:{createdAt:f}}}async function w(e,t,n){const i=await n(e.client,{applicationId:d(t),clientType:e.clientType});if(!i.ok)throw new a(i.code,i.message)}function h(e){return{listPendingApplications:async function(t){const{pageSize:i}=f(t);let{page:r}=f(t);for(let t=0;t<20;t+=1){const t=await n(e.client,{listType:1,page:r,pageSize:i,clientType:e.clientType});if(!t.ok)throw new a(t.code,t.message);const o=m(t.data),s=o.filter(e=>p(e)&&c(e)).map(g),u=o.length<i,l=r+1;if(s.length>0||u)return{items:s,exhausted:u,...u?{}:{nextCursor:String(l)}};r=l}return{items:[],exhausted:!1,nextCursor:String(r)}},acceptApplication:t=>w(e,t,r),ignoreApplication:t=>w(e,t,i)}}function y(e){return{listPendingApplications:async function(t){const{pageSize:i}=f(t);let{page:r}=f(t);for(let t=0;t<20;t+=1){const t=await n(e.client,{listType:2,page:r,pageSize:i,clientType:e.clientType});if(!t.ok)throw new a(t.code,t.message);const o=m(t.data),s=o.filter(e=>{const t=l(e);return(2===t||3===t)&&c(e)}).map(_),u=o.length<i,p=r+1;if(s.length>0||u)return{items:s,exhausted:u,...u?{}:{nextCursor:String(p)}};r=p}return{items:[],exhausted:!1,nextCursor:String(r)}},acceptApplication:t=>w(e,t,r),ignoreApplication:t=>w(e,t,i)}}export{a as ApplicationHttpError,o as ApplicationMappingError,h as createContactApplicationHttpAdapter,y as createGroupApplicationHttpAdapter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineStore as e}from"pinia";import{ref as t,shallowRef as
|
|
1
|
+
import{defineStore as e}from"pinia";import{ref as t,shallowRef as n,computed as o}from"vue";import{getImChatKitContext as a,registerImChatKitStoreDisposer as r,resolveImChatKitPinia as i}from"./context.js";function c(e){return`${e.domain}:${e.applicationId}`}function l(e,t){const n="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==n&&"string"==typeof n.code?n.code:"IM_CHAT_KIT_APPLICATIONS_ACTION_FAILED",category:null!==n&&(o=n.category,"auth"===o||"network"===o||"protocol"===o||"permission"===o||"validation"===o||"state"===o||"unsupported"===o||"contract"===o)?n.category:"state",operation:null!==n&&"string"==typeof n.operation?n.operation:`applications.${t}`,retryable:null!==n&&"boolean"==typeof n.retryable?n.retryable:"reload"===t});var o}function u(r){return e("k2-im-applications",()=>{const e=a(r).runtime,i=t([]),u=t(!1),p=n(null),s=t({}),f=n({}),d=o(()=>i.value.length),v=o(()=>{let e=0,t=0,n=0;for(const o of i.value)"contact"===o.ref.domain?e+=1:"group"===o.ref.domain?t+=1:n+=1;return Object.freeze({contact:e,group:t,channel:n})});let g=!1,b=0,O=0,j=0,y=0,z=0,I=!1;const m=/* @__PURE__ */new Map;function k(){b+=1,O+=1,j+=1,y+=1,z=0,I=!1,m.clear(),i.value=[],u.value=!1,p.value=null,s.value={},f.value={}}function h(t){return{client:t,generation:e.getGeneration(),stateEpoch:b}}function A(t){return!g&&t.client===e.getProductClient()&&t.generation===e.getGeneration()&&t.stateEpoch===b}async function _(){if(g)return Object.freeze({ok:!1,operation:"reload",reason:"stale"});z+=1;const t=++O;let n;try{n=h(e.ensureProductClient())}catch(e){const t=l(e,"reload");return p.value=t,u.value=!1,Object.freeze({ok:!1,operation:"reload",reason:"failed",error:t})}u.value=!0,p.value=null;try{const e=await n.client.applications.listPending();return t===O&&A(n)?(i.value=Object.freeze([...e]),Object.freeze({ok:!0,operation:"reload"})):Object.freeze({ok:!1,operation:"reload",reason:"stale"})}catch(e){if(t!==O||!A(n))return Object.freeze({ok:!1,operation:"reload",reason:"stale"});const o=l(e,"reload");return p.value=o,Object.freeze({ok:!1,operation:"reload",reason:"failed",error:o})}finally{t===O&&A(n)&&(u.value=!1)}}function P(){if(g)return;const t=b,n=e.getGeneration(),o=e.getProductClient(),a=z,r=++y;queueMicrotask(()=>{r===y&&(g||t!==b||n!==e.getGeneration()||o!==e.getProductClient()||a!==z||_())})}const C=e.subscribeProductEvents(function(e){if("connection:changed"===e.type){const t="authenticated"===e.snapshot.connectionState;return t&&!I&&z>0&&P(),void(I=t)}"contact-application:received"!==e.type&&"channel-join-application:received"!==e.type&&"application:updated"!==e.type||P()});async function E(t,n){const o="contact"===(a=t).domain?Object.freeze({domain:"contact",applicationId:a.applicationId}):"group"===a.domain?Object.freeze({domain:"group",applicationId:a.applicationId,conversation:Object.freeze({conversationType:"group",conversationId:a.conversation.conversationId})}):Object.freeze({domain:"channel",applicationId:a.applicationId,conversation:Object.freeze({conversationType:"channel",conversationId:a.conversation.conversationId})});var a;const r=c(o);if(g)return Object.freeze({ok:!1,operation:n,reason:"stale",application:o});const p=++j;m.set(r,p),s.value={...s.value,[r]:n};const{[r]:d,...v}=f.value;let b;f.value=v;try{b=h(e.ensureProductClient())}catch(e){const t=l(e,n);f.value={...f.value,[r]:t};const{[r]:a,...i}=s.value;return s.value=i,m.delete(r),Object.freeze({ok:!1,operation:n,reason:"failed",application:o,error:t})}const y=()=>A(b)&&m.get(r)===p;try{return await b.client.applications[n](o),y()?(O+=1,u.value=!1,i.value=Object.freeze(i.value.filter(e=>c(e.ref)!==r)),Object.freeze({ok:!0,operation:n,application:o})):Object.freeze({ok:!1,operation:n,reason:"stale",application:o})}catch(e){if(!y())return Object.freeze({ok:!1,operation:n,reason:"stale",application:o});const t=l(e,n);return function(e){return"IM_SDK_APPLICATION_REQUEST_ALREADY_HANDLED"===e.code||"IM_SDK_APPLICATION_ALREADY_HANDLED"===e.code}(t)?(O+=1,u.value=!1,i.value=Object.freeze(i.value.filter(e=>c(e.ref)!==r)),Object.freeze({ok:!1,operation:n,reason:"failed",application:o,error:t})):(f.value={...f.value,[r]:t},Object.freeze({ok:!1,operation:n,reason:"failed",application:o,error:t}))}finally{if(y()){m.delete(r);const{[r]:e,...t}=s.value;s.value=t}}}return{items:i,loading:u,error:p,processingKeys:s,itemErrors:f,pendingCount:d,domainCounts:v,reload:_,accept:function(e){return E(e,"accept")},ignore:function(e){return E(e,"ignore")},reset:function(){g||k()},dispose:function(){g||(g=!0,C(),k())}}})}const p=/* @__PURE__ */new WeakMap,s=/* @__PURE__ */new WeakMap;function f(e=i()){a(e);let t=p.get(e);void 0===t&&(t=u(e),p.set(e,t));const n=t(e);return s.get(e)!==n&&(s.set(e,n),r(e,()=>{n.dispose(),n.$dispose(),s.get(e)===n&&s.delete(e)})),n}export{c as applicationKey,f as useImApplicationsStore};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as e,ref as t,provide as o,watch as n,nextTick as i,onMounted as l,onBeforeUnmount as r,computed as s,h as a}from"vue";import{resolveImThreadActiveDate as c}from"../../thread/active-date.js";import{createNewMessageBadgeController as d}from"../../thread/new-message-badge.js";import{refreshPrependMessageAnchorPosition as u,isMessageVisibleForNewMessageBadge as v,resolvePrependMessageAnchorPosition as f,resolveCenteredMessageScrollTop as p,shouldPrefetchOlderHistory as h,shouldLoadNewerHistoryPage as g,resolvePrependMessageAnchorAdjustment as m}from"../../thread/viewport-rules.js";import{createThreadIdleTask as b}from"./thread-idle-task.js";import{createThreadLayoutMeasurements as y}from"./thread-layout-measurements.js";import{THREAD_VIEWPORT_REGISTRATION_KEY as T}from"./thread-viewport-context.js";const w=.5;function M(e){const t=e.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(void 0!==t&&Number.isFinite(t)&&t>0?t:1)}const O=e({name:"ImThreadViewport",props:{messageIds:{type:Array,required:!0},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:!1},hasNewer:{type:Boolean,default:!1},loadingNewer:{type:Boolean,default:!1},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:!0},shouldFollowAppendedMessage:{type:Function,default:void 0},pendingSendMessageIds:{type:Array,default:()=>[]},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:!0},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:!1}},emits:{"reach-start":()=>!0,"reach-end":()=>!0,"visible-range":e=>!0,settled:e=>!0,"new-message-count":e=>!0,"user-scroll":()=>!0,"active-date-change":e=>!0},setup(e,{emit:O,expose:H,slots:x}){const E=t(null),N=t(null),L=/* @__PURE__ */new Map;let B;const P=/* @__PURE__ */new Map,A=/* @__PURE__ */new Set,R=/* @__PURE__ */new Map;let S,C,F,I,k=0,D=[];const Y=y({requestFrame:xe,observe:e=>F?.observe(e),unobserve:e=>{e===E.value||e===N.value||P.has(e)||F?.unobserve(e)}});let j,z,U=!1;const V=/* @__PURE__ */new Set;let q,K=!1,W=0,$="",G=1,J=!1,Q=!1,X=!0,Z=!1,_=!1,ee=!0,te=!1,oe=0,ne=-1,ie=-1;const le=b();let re,se,ae,ce;const de=t(!0),ue=t(0),ve=d(e=>{ue.value=e,O("new-message-count",e)});function fe(t){const o=Number.isFinite(e.followThreshold)?Math.max(0,e.followThreshold):0;return t.scrollHeight-t.clientHeight-t.scrollTop<=o}function pe(t=e.messageIds){return t.flatMap(e=>{const t=L.get(e);if(void 0===t)return[];const o=t.getBoundingClientRect(),n=t.querySelector("[data-im-thread-anchor-point]");return[{id:e,top:o.top,bottom:o.bottom,anchorTop:n?.getBoundingClientRect().top??o.top}]})}function he(e="",t=1){const o=Math.min(1,Math.max(0,t));""!==$&&$!==e&&R.get($)?.element.style.removeProperty("opacity"),$=e,G=o,""!==e&&R.get(e)?.element.style.setProperty("opacity",String(o))}function ge(){he()}function me(){const t=E.value;if(K||null===t||!e.activeDateEnabled)return;const o=[...R.entries()].filter(([,e])=>t.contains(e.element)).map(([e,t])=>{const o=t.element.getBoundingClientRect();return{key:e,label:t.label,top:o.top,height:o.height}}).sort((e,t)=>e.top-t.top),n=t.getBoundingClientRect(),i=o.find(e=>e.height>0)?.height??28,l=c({markers:o,viewportTop:n.top,overlayTop:Number.isFinite(e.activeDateOffset)?Math.max(0,e.activeDateOffset):0,overlayHeight:i});if(null===l)return ge(),void O("active-date-change",null);he(l.inlineDateKey,l.inlineOpacity),O("active-date-change",l)}function be(e){C={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight}}function ye(e){const t=C;if(void 0===t)return!1;const o=Math.max(0,e.scrollHeight-e.clientHeight);return o<t.scrollHeight-t.height&&t.scrollTop>o&&Math.abs(e.scrollTop-o)<=M(e)}function Te(e){return e.scrollTop<0||e.scrollTop>Math.max(0,e.scrollHeight-e.clientHeight)+M(e)}function we(e){return ye(e)||void 0!==q&&("smooth"===q.behavior||Math.abs(e.scrollTop-q.targetTop)<=M(e))?0:e.scrollTop-k}function Me(e,t){0!==t&&(k=e.scrollTop-t,q=void 0,Se(!0))}function Oe(t,o){const n=we(t);if(void 0!==ae)return ae.expectedOffset-=n,Ye(),Me(t,n),Z||Ue(),!1;const i=C;if(void 0===i)return!1;const l=S,r=void 0===l?void 0:pe([l.id])[0],s=t.scrollTop-i.scrollTop,a=ye(t)?0:s,c=void 0===l||void 0===r?0:(r.anchorTop??r.top)-o.top-l.offset+s;return(i.scrollHeight!==t.scrollHeight||i.width!==t.clientWidth||i.height!==t.clientHeight||Math.abs(c)>w)&&(C=void 0,!(J||Q||e.loadingOlder||e.loadingNewer||e.hasNewer||!e.resizeFollowEnabled||Te(t))&&de.value&&Math.abs(a)<=w?(lt(),!0):(void 0!==l&&function(e){const t=E.value;if(null===t||void 0===e)return;if(Te(t))return void Ve(e);const o=t.getBoundingClientRect(),n=m(e,pe([e.id]),{top:o.top,bottom:o.bottom});if(void 0!==n){const e=Math.max(0,t.scrollHeight-t.clientHeight),o=Math.min(e,Math.max(0,t.scrollTop+n));Fe(o),t.scrollTop=o,k=t.scrollTop,C=void 0}}({...l,offset:l.offset-a}),Me(t,n),!1))}function He(){const t=E.value;if(K||null===t)return;const o=t.getBoundingClientRect();if(Oe(t,o))return;const n=pe(void 0!==j&&U?e.messageIds.filter(e=>A.has(e)):e.messageIds);if(void 0!==j&&U&&0===n.length)return void(de.value=fe(t));const i=n.filter(t=>v({viewportTop:o.top,viewportBottom:o.bottom,messageTop:t.top,messageBottom:t.bottom,margin:e.visibleMargin})).map(e=>e.id),l=i.length!==D.length||i.some((e,t)=>D[t]!==e);D=Object.freeze(i),S=f(n,{top:o.top,bottom:o.bottom}),be(t),ve.acknowledgeVisible(i),de.value=fe(t),l&&O("visible-range",D),O("settled",{visibleMessageIds:D,...0===D.length?{}:{newestVisibleMessageId:D[D.length-1]},isAtBottom:de.value,newMessageCount:ue.value})}function xe(e){if(V.add(e),void 0!==z)return;const t=()=>{z=void 0;const e=[...V];V.clear(),e.forEach(e=>e())};z="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame(t):globalThis.setTimeout(t,0)}function Ee(){xe(He)}function Ne(){const e=E.value;if(null===e)return;const t=e.getBoundingClientRect(),o=f(pe(),{top:t.top,bottom:t.bottom});void 0!==o&&(S=o,be(e))}function Le(){return X&&void 0===ae&&!Q&&!e.loadingOlder}function Be(){Ne(),X=!1,ne=oe,Q=!0,de.value=!1,O("reach-start"),xe(()=>{e.loadingOlder||(Q=!1)})}function Pe(t){return e.hasNewer&&!J&&!e.loadingOlder&&!e.loadingNewer&&fe(t)}function Ae(){Ne(),J=!0,de.value=!1,ie=oe,O("reach-end"),xe(()=>{e.loadingNewer||(J=!1)})}function Re(){const e=E.value;null!==e&&oe!==ie&&Pe(e)&&Ae()}function Se(t=!1){const o=E.value;if(K||null===o)return;const n=o.scrollTop,i=Math.max(0,o.scrollHeight-o.clientHeight),l=Math.min(i,Math.max(0,k)),r=Math.min(i,Math.max(0,n)),s=ye(o),a=q;let c=!1;if(void 0!==a){const e=Math.abs(n-a.targetTop)<=M(o);c="smooth"===a.behavior||e,("smooth"!==a.behavior||e)&&(q=void 0)}c||s||Z||!ee||void 0!==ae||n===k||(Z=!0,_=!0,oe+=1);const d=Z&&!c&&!s&&n!==k;d&&(W+=1,O("user-scroll"),xe(me)),Z&&!te&&Je(),!X&&_&&oe!==ne&&n<k&&n>qe()&&We(),void 0===ae||c||(Z?s||t||(ae.expectedOffset-=n-k):(Ye(),Ue())),Le()&&d&&h({previousScrollTop:l,currentScrollTop:r,topThreshold:e.olderPrefetchThreshold})&&Be(),d&&Pe(o)&&g({previousScrollTop:l,currentScrollTop:r,isAtBottom:fe(o),isHistoryWindow:e.hasNewer,isPageSettling:c})&&Ae(),k=n,Ee()}function Ce(){Se()}function Fe(e,t="auto"){q={targetTop:e,behavior:t}}function Ie(e){const t=ae,o=N.value;if(void 0!==t&&null!==o){if(t.visualOffset=Math.abs(e)<=w?0:e,0===t.visualOffset)return o.style.removeProperty("transform"),void o.style.removeProperty("will-change");o.style.setProperty("transform",`translate3d(0, ${t.visualOffset}px, 0)`),o.style.setProperty("will-change","transform")}}function ke(){void 0!==ce&&(clearTimeout(ce),ce=void 0),void 0!==ae&&0!==ae.visualOffset&&(S=void 0,C=void 0);const e=N.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),ae=void 0,q=void 0}function De(){const e=E.value,t=ae;if(null===e||void 0===t)return;const o=L.get(t.anchor.id);if(void 0===o)return;return(o.querySelector("[data-im-thread-anchor-point]")??o).getBoundingClientRect().top-e.getBoundingClientRect().top}function Ye(){const e=ae,t=De();if(void 0===e||void 0===t)return;const o=e.expectedOffset-t;if(Math.abs(o)<=w)return;const n=E.value;null!==n&&ye(n)&&(k=n.scrollTop),Ie(e.visualOffset+o),e.committed=!1,e.attempts=0}function je(){void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,Z||!0!==ae?.committed||ke()},500)}function ze(e,t=!1){const o=E.value,n=ae;if(K||null===o||void 0===n||Te(o)||Z&&!t)return;if(t){const e=we(o);n.expectedOffset-=e,Ye(),Me(o,e)}const i=e?.visualOffset??n.visualOffset;if(Math.abs(i)<=w)return n.committed=!0,void je();const l=Math.max(0,o.scrollHeight-o.clientHeight),r=o.scrollTop,s=Math.min(l,Math.max(0,r-i));Fe(s),o.scrollTop=s;const a=o.scrollTop,c=i+a-r,d=M(o),u=(r-i<0||r-i>l)&&Math.abs(a-s)<=d;if(k=a,Math.abs(c)>d&&!u)return Ie(c),Fe(a),n.committed=!1,n.attempts+=1,void(n.attempts<8&&!Z&&Ue());0!==n.visualOffset&&Ie(0),k=a,n.expectedOffset=void 0===e?De()??n.expectedOffset:e.currentOffset-(a-r),S={...n.anchor,offset:n.expectedOffset},be(o),n.committed=!0,n.attempts=0,je()}function Ue(){void 0===ae||ae.attempts>=8||(void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,ze()},120))}function Ve(e){if(void 0===e)return;void 0===ae&&(ae={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:!1,attempts:0});const t=E.value;if(!Z&&null!==t&&!Te(t)&&0===ae.visualOffset){const e=De();if(void 0!==e)return void ze({visualOffset:ae.expectedOffset-e,currentOffset:e})}Ye(),Z||ze()}function qe(){return Number.isFinite(e.olderPrefetchThreshold)?Math.max(0,e.olderPrefetchThreshold):0}function Ke(e=!1){W+=1,"smooth"===q?.behavior&&(q=void 0),_=!1,Z&&!e||(Z=!0,oe+=1),te&&le.cancel()}function We(){const t=E.value;if(null!==t&&oe!==ne&&!Q&&!e.loadingOlder){if(void 0!==ae){if(ze(void 0,!0),!ae.committed)return;ke()}X=!0,Le()&&t.scrollTop<=qe()&&Be()}}function $e(){W+=1,S=void 0,C=void 0,le.cancel(),ke(),Z=!1,_=!1,te=!1,re=void 0,se=void 0,oe+=1,ne=-1,ie=-1,X=!0,Q=!1,J=!1,q=void 0}function Ge(){te||null!==E.value&&Te(E.value)||(le.cancel(),Z=!1,_=!1,void 0!==ae&&(ae.attempts=0),ze())}function Je(){te||le.schedule(Ge,120)}function Qe(){q=void 0,Ge()}function Xe(e){ee=!1;const t=!te;te=!0,Ke(t),re=e.touches?.[0]?.clientY}function Ze(e){const t=e.touches?.[0]?.clientY;void 0!==t&&(void 0!==re&&t!==re&&(W+=1),void 0!==re&&t>re?We():void 0!==re&&t<re&&Re(),re=t)}function _e(){te=!1,re=void 0,Je()}function et(e){ee=!0,Ke(),e.deltaY<0?We():e.deltaY>0&&Re(),Je()}function tt(e){"touch"!==e.pointerType&&(ee=!0,Ke(),se=e.clientY,Je())}function ot(e){"touch"!==e.pointerType&&Z&&void 0!==se&&(e.clientY!==se&&(W+=1),e.clientY<se?We():e.clientY>se&&Re(),se=e.clientY,Je())}function nt(e){"touch"!==e.pointerType&&(se=void 0,Je())}function it(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(ee=!0,Ke(),"ArrowUp"===e.key||"PageUp"===e.key||"Home"===e.key||" "===e.key&&e.shiftKey?We():Re(),Je())}function lt(e="auto"){const t=E.value;if(null===t)return;W+=1,C=void 0,ke();const o=Math.max(0,t.scrollHeight-t.clientHeight);Fe(o,e),t.scrollTo?.({top:o,behavior:e}),t.scrollTop!==o&&(t.scrollTop=o),k=t.scrollTop,ve.clear(),U=!1,He()}function rt(){const e=E.value;return null!==e&&e.clientWidth>0&&e.clientHeight>0}function st(e,t){const o=E.value;if(null===o||void 0===e||!o.contains(e)||o.clientHeight<=0)return!1;W+=1,ke();const n=o.getBoundingClientRect(),i=e.getBoundingClientRect(),l=t.block??"center";let r;r="start"===l?o.scrollTop+i.top-n.top:"end"===l?o.scrollTop+i.bottom-n.bottom:"nearest"===l?i.top>=n.top&&i.bottom<=n.bottom?o.scrollTop:i.top<n.top?o.scrollTop+i.top-n.top:o.scrollTop+i.bottom-n.bottom:p({currentScrollTop:o.scrollTop,scrollHeight:o.scrollHeight,targetHeight:i.height,targetTop:i.top,viewportHeight:o.clientHeight,viewportTop:n.top});const s=Math.max(0,o.scrollHeight-o.clientHeight),a=Math.min(s,Math.max(0,r));C=void 0;const c=t.behavior??"auto";return Fe(a,c),o.scrollTo?.({top:a,behavior:c}),o.scrollTop!==a&&(o.scrollTop=a),k=o.scrollTop,U=!1,He(),!0}function at(e){const t=E.value;if(null===t||void 0===e||!t.contains(e)||t.clientHeight<=0)return null;const o=e.getBoundingClientRect(),n=t.scrollTop+o.top-t.getBoundingClientRect().top+o.height/2,i=t.clientHeight/2;return{older:n<i-1,newer:t.scrollHeight-n<i-1}}return o(T,{registerLayoutMeasurement:Y.register,registerMessageNode:function(e,t){const o=L.get(e);if(o!==t){if(void 0!==o&&(j?.unobserve(o),o.style.removeProperty("--im-thread-placeholder-play-state"),Y.hasTarget(o)||F?.unobserve?.(o),P.delete(o),A.delete(e)),null===t)return L.delete(e),void A.delete(e);L.set(e,t),P.set(t,e),"function"==typeof globalThis.IntersectionObserver&&t.style.setProperty("--im-thread-placeholder-play-state","paused"),j?.observe(t),F?.observe(t),Ee()}},registerDateNode:function(e,t,o){const n=R.get(e);null!==o?(R.set(e,{element:o,label:t}),$===e&&o.style.setProperty("opacity",String(G)),n?.element!==o&&(o.dataset.imThreadDateSeparator=e)):R.delete(e)},registerEntryUnreadNode:e=>{B=e??void 0}}),n(()=>e.contentKey,(e,t)=>{if(e===t)return;$e();const o=E.value;null!==o&&(k=o.scrollTop)},{flush:"sync"}),n(()=>e.messageIds,async(t,o)=>{if(t.length===o.length&&t.every((e,t)=>e===o[t]))return;const n=E.value;if(null===n)return;const l=new Set(o);o.length>0&&t.length>0&&!t.some(e=>l.has(e))&&$e();const r=e.contentKey,s=de.value,a=o[o.length-1],c=void 0===a?-1:t.indexOf(a),d=c<0?[]:t.slice(c+1).filter(e=>!l.has(e)),v=d.some(t=>e.pendingSendMessageIds.includes(t)),f=J||e.loadingNewer||Q||e.loadingOlder,p=t.length===o.length&&t.every(e=>l.has(e))&&t.some((e,t)=>e!==o[t]),h=o[0],g=void 0!==h&&t.indexOf(h)>0;let m;if(void 0!==S&&(g||d.length>0&&f)){Z&&0!==we(n)&&Se();const e=n.getBoundingClientRect(),o=t.includes(S.id)?pe([S.id]):[],i=o[0],r=void 0!==i&&i.bottom>e.top&&i.top<e.bottom?o:pe(t.filter(e=>l.has(e)));m=u(S,r,{top:e.top,bottom:e.bottom}),void 0===m||void 0===ae||t.includes(ae.anchor.id)||(ae.anchor=m,ae.expectedOffset=m.offset)}const b=W;if(await i(),!K&&e.contentKey===r&&W===b)if(v&&e.followNewMessages)lt();else if(p&&s&&e.followNewMessages&&e.resizeFollowEnabled&&!e.hasNewer&&!f)lt();else{if(g&&(Q=!1,Ve(m)),d.length>0){if(f)return J=!1,Ve(m),de.value=!1,void Ee();(s||d.some(t=>!0===e.shouldFollowAppendedMessage?.(t)))&&e.followNewMessages?lt():ve.add(d)}Ee()}},{flush:"pre"}),n(()=>e.loadingNewer,(t,o)=>{!t&&o&&J&&xe(()=>{e.loadingNewer||(J=!1)})},{flush:"pre"}),n(()=>e.loadingOlder,(e,t)=>{e?Q=!0:t&&Q&&(Q=!1)},{flush:"post"}),l(()=>{const t=E.value;if(null!==t){if(k=t.scrollTop,t.addEventListener("scroll",Ce,{passive:!0}),t.addEventListener("scrollend",Qe,{passive:!0}),t.addEventListener("touchstart",Xe,{passive:!0}),t.addEventListener("touchmove",Ze,{passive:!0}),t.addEventListener("touchend",_e,{passive:!0}),t.addEventListener("touchcancel",_e,{passive:!0}),t.addEventListener("wheel",et,{passive:!0}),t.addEventListener("pointerdown",tt,{passive:!0}),t.addEventListener("pointermove",ot,{passive:!0}),t.addEventListener("pointerup",nt,{passive:!0}),t.addEventListener("pointercancel",nt,{passive:!0}),t.addEventListener("keydown",it),"function"==typeof globalThis.ResizeObserver){F=new globalThis.ResizeObserver(e=>{if(K||null===E.value)return;Y.resized(e.map(e=>e.target));e.some(({target:e})=>e===t||e===N.value||P.has(e))&&He()}),F.observe(t),null!==N.value&&F.observe(N.value);for(const e of L.values())F.observe(e);Y.observeTargets()}if(I=t.ownerDocument.fonts,I?.addEventListener("loadingdone",Y.invalidateAll),"function"==typeof globalThis.IntersectionObserver){j=new globalThis.IntersectionObserver(e=>{for(const t of e){const e=P.get(t.target);if(void 0===e)continue;const o=t.target,n=t.isIntersecting?"running":"paused";o.style.getPropertyValue("--im-thread-placeholder-play-state")!==n&&o.style.setProperty("--im-thread-placeholder-play-state",n),t.isIntersecting?A.add(e):A.delete(e)}U=!0,Ee()},{root:t,rootMargin:`${Number.isFinite(e.visibleMargin)?Math.max(0,e.visibleMargin):0}px 0px`});for(const e of L.values())j.observe(e)}Ee()}}),r(()=>{K=!0;const e=E.value;null!==e&&e.removeEventListener("scroll",Ce),null!==e&&(e.removeEventListener("scrollend",Qe),e.removeEventListener("touchstart",Xe),e.removeEventListener("touchmove",Ze),e.removeEventListener("touchend",_e),e.removeEventListener("touchcancel",_e),e.removeEventListener("wheel",et),e.removeEventListener("pointerdown",tt),e.removeEventListener("pointermove",ot),e.removeEventListener("pointerup",nt),e.removeEventListener("pointercancel",nt),e.removeEventListener("keydown",it)),le.cancel(),ke(),void 0!==z&&("number"==typeof z&&"function"==typeof globalThis.cancelAnimationFrame?globalThis.cancelAnimationFrame(z):globalThis.clearTimeout(z),z=void 0,V.clear()),I?.removeEventListener("loadingdone",Y.invalidateAll),Y.dispose(),F?.disconnect(),j?.disconnect(),ge(),B=void 0;for(const e of L.values())e.style.removeProperty("--im-thread-placeholder-play-state");L.clear(),P.clear(),A.clear(),R.clear(),ve.clear()}),H({getViewportElement:()=>E.value,clearNewMessageBadge:function(){ve.clear()},clearActiveDate:ge,isAtBottom:s(()=>de.value),isMeasurable:rt,isScrollable:function(){const e=E.value;return rt()&&null!==e&&e.scrollHeight>e.clientHeight+1},getMessageCenteringNeeds:function(e){return at(L.get(e))},newMessageCount:s(()=>ue.value),prepareHistoryPageAppend:function(){J=!0,de.value=!1},cancelHistoryPageAppend:function(){J=!1,Ee()},trackRemoteMessageIds:(e,t)=>ve.trackRemote(e,t),scrollToLatest:lt,scrollToMessage:function(e,t={}){return st(L.get(e),t)},scrollToEntryUnread:()=>st(B,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:function(){return at(B)},focusViewport:()=>E.value?.focus({preventScroll:!0})}),()=>a("div",{ref:E,"data-im-thread-viewport":"",role:"log",tabindex:-1},[a("div",{ref:N,"data-im-thread-viewport-content":""},x.default?.())])}});export{O as ImThreadViewport};
|
|
1
|
+
import{defineComponent as e,ref as t,provide as o,watch as n,nextTick as i,onMounted as l,onBeforeUnmount as r,computed as s,h as a}from"vue";import{resolveImThreadActiveDate as c}from"../../thread/active-date.js";import{createNewMessageBadgeController as d}from"../../thread/new-message-badge.js";import{refreshPrependMessageAnchorPosition as u,isMessageVisibleForNewMessageBadge as v,resolvePrependMessageAnchorPosition as f,resolveCenteredMessageScrollTop as p,shouldPrefetchOlderHistory as h,shouldLoadNewerHistoryPage as g,resolvePrependMessageAnchorAdjustment as m}from"../../thread/viewport-rules.js";import{createThreadIdleTask as b}from"./thread-idle-task.js";import{createThreadLayoutMeasurements as y}from"./thread-layout-measurements.js";import{THREAD_VIEWPORT_REGISTRATION_KEY as T}from"./thread-viewport-context.js";const w=.5;function M(e){const t=e.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(void 0!==t&&Number.isFinite(t)&&t>0?t:1)}const O=e({name:"ImThreadViewport",props:{messageIds:{type:Array,required:!0},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:!1},hasNewer:{type:Boolean,default:!1},loadingNewer:{type:Boolean,default:!1},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:!0},shouldFollowAppendedMessage:{type:Function,default:void 0},pendingSendMessageIds:{type:Array,default:()=>[]},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:!0},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:!1}},emits:{"reach-start":()=>!0,"reach-end":()=>!0,"visible-range":e=>!0,settled:e=>!0,"new-message-count":e=>!0,"user-scroll":()=>!0,"active-date-change":e=>!0},setup(e,{emit:O,expose:H,slots:x}){const E=t(null),N=t(null),L=/* @__PURE__ */new Map;let B;const P=/* @__PURE__ */new Map,A=/* @__PURE__ */new Set,R=/* @__PURE__ */new Map;let S,C,F,I,k=0,D=[];const Y=y({requestFrame:xe,observe:e=>F?.observe(e),unobserve:e=>{e===E.value||e===N.value||P.has(e)||F?.unobserve(e)}});let j,z,U=!1;const V=/* @__PURE__ */new Set;let q,K=!1,W=0,$="",G=1,J=!1,Q=!1,X=!0,Z=!1,_=!1,ee=!0,te=!1,oe=0,ne=-1,ie=-1;const le=b();let re,se,ae,ce;const de=t(!0),ue=t(0),ve=d(e=>{ue.value=e,O("new-message-count",e)});function fe(t){const o=Number.isFinite(e.followThreshold)?Math.max(0,e.followThreshold):0;return t.scrollHeight-t.clientHeight-t.scrollTop<=o}function pe(t=e.messageIds){return t.flatMap(e=>{const t=L.get(e);if(void 0===t)return[];const o=t.getBoundingClientRect(),n=t.querySelector("[data-im-thread-anchor-point]");return[{id:e,top:o.top,bottom:o.bottom,anchorTop:n?.getBoundingClientRect().top??o.top}]})}function he(e="",t=1){const o=Math.min(1,Math.max(0,t));""!==$&&$!==e&&R.get($)?.element.style.removeProperty("opacity"),$=e,G=o,""!==e&&R.get(e)?.element.style.setProperty("opacity",String(o))}function ge(){he()}function me(){const t=E.value;if(K||null===t||!e.activeDateEnabled)return;const o=[...R.entries()].filter(([,e])=>t.contains(e.element)).map(([e,t])=>{const o=t.element.getBoundingClientRect();return{key:e,label:t.label,top:o.top,height:o.height}}).sort((e,t)=>e.top-t.top),n=t.getBoundingClientRect(),i=o.find(e=>e.height>0)?.height??28,l=c({markers:o,viewportTop:n.top,overlayTop:Number.isFinite(e.activeDateOffset)?Math.max(0,e.activeDateOffset):0,overlayHeight:i});if(null===l)return ge(),void O("active-date-change",null);he(l.inlineDateKey,l.inlineOpacity),O("active-date-change",l)}function be(e){C={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight}}function ye(e){const t=C;if(void 0===t)return!1;const o=Math.max(0,e.scrollHeight-e.clientHeight);return o<t.scrollHeight-t.height&&t.scrollTop>o&&Math.abs(e.scrollTop-o)<=M(e)}function Te(e){return e.scrollTop<0||e.scrollTop>Math.max(0,e.scrollHeight-e.clientHeight)+M(e)}function we(e){return ye(e)||void 0!==q&&("smooth"===q.behavior||Math.abs(e.scrollTop-q.targetTop)<=M(e))?0:e.scrollTop-k}function Me(e,t){0!==t&&(k=e.scrollTop-t,q=void 0,Se(!0))}function Oe(t,o){const n=we(t);if(void 0!==ae)return ae.expectedOffset-=n,Ye(),Me(t,n),Z||Ue(),!1;const i=C;if(void 0===i)return!1;const l=S,r=void 0===l?void 0:pe([l.id])[0],s=t.scrollTop-i.scrollTop,a=ye(t)?0:s,c=void 0===l||void 0===r?0:(r.anchorTop??r.top)-o.top-l.offset+s;return(i.scrollHeight!==t.scrollHeight||i.width!==t.clientWidth||i.height!==t.clientHeight||Math.abs(c)>w)&&(C=void 0,!(J||Q||e.loadingOlder||e.loadingNewer||e.hasNewer||!e.resizeFollowEnabled||Te(t))&&de.value&&Math.abs(a)<=w?(lt(),!0):(void 0!==l&&function(e){const t=E.value;if(null===t||void 0===e)return;if(Te(t))return void Ve(e);const o=t.getBoundingClientRect(),n=m(e,pe([e.id]),{top:o.top,bottom:o.bottom});if(void 0!==n){const e=Math.max(0,t.scrollHeight-t.clientHeight),o=Math.min(e,Math.max(0,t.scrollTop+n));Fe(o),t.scrollTop=o,k=t.scrollTop,C=void 0}}({...l,offset:l.offset-a}),Me(t,n),!1))}function He(){const t=E.value;if(K||null===t)return;const o=t.getBoundingClientRect();if(Oe(t,o))return;const n=pe(void 0!==j&&U?e.messageIds.filter(e=>A.has(e)):e.messageIds);if(void 0!==j&&U&&0===n.length)return void(de.value=fe(t));const i=n.filter(t=>v({viewportTop:o.top,viewportBottom:o.bottom,messageTop:t.top,messageBottom:t.bottom,margin:e.visibleMargin})).map(e=>e.id),l=i.length!==D.length||i.some((e,t)=>D[t]!==e);D=Object.freeze(i),S=f(n,{top:o.top,bottom:o.bottom}),be(t),ve.acknowledgeVisible(i),de.value=fe(t),l&&O("visible-range",D),O("settled",{visibleMessageIds:D,...0===D.length?{}:{newestVisibleMessageId:D[D.length-1]},isAtBottom:de.value,newMessageCount:ue.value})}function xe(e){if(V.add(e),void 0!==z)return;const t=()=>{z=void 0;const e=[...V];V.clear(),e.forEach(e=>e())};z="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame(t):globalThis.setTimeout(t,0)}function Ee(){xe(He)}function Ne(){const e=E.value;if(null===e)return;const t=e.getBoundingClientRect(),o=f(pe(),{top:t.top,bottom:t.bottom});void 0!==o&&(S=o,be(e))}function Le(){return X&&void 0===ae&&!Q&&!e.loadingOlder}function Be(){Ne(),X=!1,ne=oe,Q=!0,de.value=!1,O("reach-start"),xe(()=>{e.loadingOlder||(Q=!1)})}function Pe(t){return e.hasNewer&&!J&&!e.loadingOlder&&!e.loadingNewer&&fe(t)}function Ae(){Ne(),J=!0,de.value=!1,ie=oe,O("reach-end"),xe(()=>{e.loadingNewer||(J=!1)})}function Re(){const e=E.value;null!==e&&oe!==ie&&Pe(e)&&Ae()}function Se(t=!1){const o=E.value;if(K||null===o)return;const n=o.scrollTop,i=Math.max(0,o.scrollHeight-o.clientHeight),l=Math.min(i,Math.max(0,k)),r=Math.min(i,Math.max(0,n)),s=ye(o),a=q;let c=!1;if(void 0!==a){const e=Math.abs(n-a.targetTop)<=M(o);c="smooth"===a.behavior||e,("smooth"!==a.behavior||e)&&(q=void 0)}c||s||Z||!ee||void 0!==ae||n===k||(Z=!0,_=!0,oe+=1);const d=Z&&!c&&!s&&n!==k;d&&(W+=1,O("user-scroll"),xe(me)),Z&&!te&&Je(),!X&&_&&oe!==ne&&n<k&&n>qe()&&We(),void 0===ae||c||(Z?s||t||(ae.expectedOffset-=n-k):(Ye(),Ue())),Le()&&d&&h({previousScrollTop:l,currentScrollTop:r,topThreshold:e.olderPrefetchThreshold})&&Be(),d&&Pe(o)&&g({previousScrollTop:l,currentScrollTop:r,isAtBottom:fe(o),isHistoryWindow:e.hasNewer,isPageSettling:c})&&Ae(),k=n,s?He():Ee()}function Ce(){Se()}function Fe(e,t="auto"){q={targetTop:e,behavior:t}}function Ie(e){const t=ae,o=N.value;if(void 0!==t&&null!==o){if(t.visualOffset=Math.abs(e)<=w?0:e,0===t.visualOffset)return o.style.removeProperty("transform"),void o.style.removeProperty("will-change");o.style.setProperty("transform",`translate3d(0, ${t.visualOffset}px, 0)`),o.style.setProperty("will-change","transform")}}function ke(){void 0!==ce&&(clearTimeout(ce),ce=void 0),void 0!==ae&&0!==ae.visualOffset&&(S=void 0,C=void 0);const e=N.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),ae=void 0,q=void 0}function De(){const e=E.value,t=ae;if(null===e||void 0===t)return;const o=L.get(t.anchor.id);if(void 0===o)return;return(o.querySelector("[data-im-thread-anchor-point]")??o).getBoundingClientRect().top-e.getBoundingClientRect().top}function Ye(){const e=ae,t=De();if(void 0===e||void 0===t)return;const o=e.expectedOffset-t;if(Math.abs(o)<=w)return;const n=E.value;null!==n&&ye(n)&&(k=n.scrollTop),Ie(e.visualOffset+o),e.committed=!1,e.attempts=0}function je(){void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,Z||!0!==ae?.committed||ke()},500)}function ze(e,t=!1){const o=E.value,n=ae;if(K||null===o||void 0===n||Te(o)||Z&&!t)return;if(t){const e=we(o);n.expectedOffset-=e,Ye(),Me(o,e)}const i=e?.visualOffset??n.visualOffset;if(Math.abs(i)<=w)return n.committed=!0,void je();const l=Math.max(0,o.scrollHeight-o.clientHeight),r=o.scrollTop,s=Math.min(l,Math.max(0,r-i));Fe(s),o.scrollTop=s;const a=o.scrollTop,c=i+a-r,d=M(o),u=(r-i<0||r-i>l)&&Math.abs(a-s)<=d;if(k=a,Math.abs(c)>d&&!u)return Ie(c),Fe(a),n.committed=!1,n.attempts+=1,void(n.attempts<8&&!Z&&Ue());0!==n.visualOffset&&Ie(0),k=a,n.expectedOffset=void 0===e?De()??n.expectedOffset:e.currentOffset-(a-r),S={...n.anchor,offset:n.expectedOffset},be(o),n.committed=!0,n.attempts=0,je()}function Ue(){void 0===ae||ae.attempts>=8||(void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,ze()},120))}function Ve(e){if(void 0===e)return;void 0===ae&&(ae={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:!1,attempts:0});const t=E.value;if(!Z&&null!==t&&!Te(t)&&0===ae.visualOffset){const e=De();if(void 0!==e)return void ze({visualOffset:ae.expectedOffset-e,currentOffset:e})}Ye(),Z||ze()}function qe(){return Number.isFinite(e.olderPrefetchThreshold)?Math.max(0,e.olderPrefetchThreshold):0}function Ke(e=!1){W+=1,"smooth"===q?.behavior&&(q=void 0),_=!1,Z&&!e||(Z=!0,oe+=1),te&&le.cancel()}function We(){const t=E.value;if(null!==t&&oe!==ne&&!Q&&!e.loadingOlder){if(void 0!==ae){if(ze(void 0,!0),!ae.committed)return;ke()}X=!0,Le()&&t.scrollTop<=qe()&&Be()}}function $e(){W+=1,S=void 0,C=void 0,le.cancel(),ke(),Z=!1,_=!1,te=!1,re=void 0,se=void 0,oe+=1,ne=-1,ie=-1,X=!0,Q=!1,J=!1,q=void 0}function Ge(){te||null!==E.value&&Te(E.value)||(le.cancel(),Z=!1,_=!1,void 0!==ae&&(ae.attempts=0),ze())}function Je(){te||le.schedule(Ge,120)}function Qe(){q=void 0,Ge()}function Xe(e){ee=!1;const t=!te;te=!0,Ke(t),re=e.touches?.[0]?.clientY}function Ze(e){const t=e.touches?.[0]?.clientY;void 0!==t&&(void 0!==re&&t!==re&&(W+=1),void 0!==re&&t>re?We():void 0!==re&&t<re&&Re(),re=t)}function _e(){te=!1,re=void 0,Je()}function et(e){ee=!0,Ke(),e.deltaY<0?We():e.deltaY>0&&Re(),Je()}function tt(e){"touch"!==e.pointerType&&(ee=!0,Ke(),se=e.clientY,Je())}function ot(e){"touch"!==e.pointerType&&Z&&void 0!==se&&(e.clientY!==se&&(W+=1),e.clientY<se?We():e.clientY>se&&Re(),se=e.clientY,Je())}function nt(e){"touch"!==e.pointerType&&(se=void 0,Je())}function it(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(ee=!0,Ke(),"ArrowUp"===e.key||"PageUp"===e.key||"Home"===e.key||" "===e.key&&e.shiftKey?We():Re(),Je())}function lt(e="auto"){const t=E.value;if(null===t)return;W+=1,C=void 0,ke();const o=Math.max(0,t.scrollHeight-t.clientHeight);Fe(o,e),t.scrollTo?.({top:o,behavior:e}),t.scrollTop!==o&&(t.scrollTop=o),k=t.scrollTop,ve.clear(),U=!1,He()}function rt(){const e=E.value;return null!==e&&e.clientWidth>0&&e.clientHeight>0}function st(e,t){const o=E.value;if(null===o||void 0===e||!o.contains(e)||o.clientHeight<=0)return!1;W+=1,ke();const n=o.getBoundingClientRect(),i=e.getBoundingClientRect(),l=t.block??"center";let r;r="start"===l?o.scrollTop+i.top-n.top:"end"===l?o.scrollTop+i.bottom-n.bottom:"nearest"===l?i.top>=n.top&&i.bottom<=n.bottom?o.scrollTop:i.top<n.top?o.scrollTop+i.top-n.top:o.scrollTop+i.bottom-n.bottom:p({currentScrollTop:o.scrollTop,scrollHeight:o.scrollHeight,targetHeight:i.height,targetTop:i.top,viewportHeight:o.clientHeight,viewportTop:n.top});const s=Math.max(0,o.scrollHeight-o.clientHeight),a=Math.min(s,Math.max(0,r));C=void 0;const c=t.behavior??"auto";return Fe(a,c),o.scrollTo?.({top:a,behavior:c}),o.scrollTop!==a&&(o.scrollTop=a),k=o.scrollTop,U=!1,He(),!0}function at(e){const t=E.value;if(null===t||void 0===e||!t.contains(e)||t.clientHeight<=0)return null;const o=e.getBoundingClientRect(),n=t.scrollTop+o.top-t.getBoundingClientRect().top+o.height/2,i=t.clientHeight/2;return{older:n<i-1,newer:t.scrollHeight-n<i-1}}return o(T,{registerLayoutMeasurement:Y.register,registerMessageNode:function(e,t){const o=L.get(e);if(o!==t){if(void 0!==o&&(j?.unobserve(o),o.style.removeProperty("--im-thread-placeholder-play-state"),Y.hasTarget(o)||F?.unobserve?.(o),P.delete(o),A.delete(e)),null===t)return L.delete(e),void A.delete(e);L.set(e,t),P.set(t,e),"function"==typeof globalThis.IntersectionObserver&&t.style.setProperty("--im-thread-placeholder-play-state","paused"),j?.observe(t),F?.observe(t),Ee()}},registerDateNode:function(e,t,o){const n=R.get(e);null!==o?(R.set(e,{element:o,label:t}),$===e&&o.style.setProperty("opacity",String(G)),n?.element!==o&&(o.dataset.imThreadDateSeparator=e)):R.delete(e)},registerEntryUnreadNode:e=>{B=e??void 0}}),n(()=>e.contentKey,(e,t)=>{if(e===t)return;$e();const o=E.value;null!==o&&(k=o.scrollTop)},{flush:"sync"}),n(()=>e.messageIds,async(t,o)=>{if(t.length===o.length&&t.every((e,t)=>e===o[t]))return;const n=E.value;if(null===n)return;const l=new Set(o);o.length>0&&t.length>0&&!t.some(e=>l.has(e))&&$e();const r=e.contentKey,s=de.value,a=o[o.length-1],c=void 0===a?-1:t.indexOf(a),d=c<0?[]:t.slice(c+1).filter(e=>!l.has(e)),v=d.some(t=>e.pendingSendMessageIds.includes(t)),f=J||e.loadingNewer||Q||e.loadingOlder,p=t.length===o.length&&t.every(e=>l.has(e))&&t.some((e,t)=>e!==o[t]),h=o[0],g=void 0!==h&&t.indexOf(h)>0;let m;if(void 0!==S&&(g||d.length>0&&f)){Z&&0!==we(n)&&Se();const e=n.getBoundingClientRect(),o=t.includes(S.id)?pe([S.id]):[],i=o[0],r=void 0!==i&&i.bottom>e.top&&i.top<e.bottom?o:pe(t.filter(e=>l.has(e)));m=u(S,r,{top:e.top,bottom:e.bottom}),void 0===m||void 0===ae||t.includes(ae.anchor.id)||(ae.anchor=m,ae.expectedOffset=m.offset)}const b=W;if(await i(),!K&&e.contentKey===r&&W===b)if(v&&e.followNewMessages)lt();else if(p&&s&&e.followNewMessages&&e.resizeFollowEnabled&&!e.hasNewer&&!f)lt();else{if(g&&(Q=!1,Ve(m)),d.length>0){if(f)return J=!1,Ve(m),de.value=!1,void Ee();(s||d.some(t=>!0===e.shouldFollowAppendedMessage?.(t)))&&e.followNewMessages?lt():ve.add(d)}Ee()}},{flush:"pre"}),n(()=>e.loadingNewer,(t,o)=>{!t&&o&&J&&xe(()=>{e.loadingNewer||(J=!1)})},{flush:"pre"}),n(()=>e.loadingOlder,(e,t)=>{e?Q=!0:t&&Q&&(Q=!1)},{flush:"post"}),l(()=>{const t=E.value;if(null!==t){if(k=t.scrollTop,t.addEventListener("scroll",Ce,{passive:!0}),t.addEventListener("scrollend",Qe,{passive:!0}),t.addEventListener("touchstart",Xe,{passive:!0}),t.addEventListener("touchmove",Ze,{passive:!0}),t.addEventListener("touchend",_e,{passive:!0}),t.addEventListener("touchcancel",_e,{passive:!0}),t.addEventListener("wheel",et,{passive:!0}),t.addEventListener("pointerdown",tt,{passive:!0}),t.addEventListener("pointermove",ot,{passive:!0}),t.addEventListener("pointerup",nt,{passive:!0}),t.addEventListener("pointercancel",nt,{passive:!0}),t.addEventListener("keydown",it),"function"==typeof globalThis.ResizeObserver){F=new globalThis.ResizeObserver(e=>{if(K||null===E.value)return;Y.resized(e.map(e=>e.target));e.some(({target:e})=>e===t||e===N.value||P.has(e))&&He()}),F.observe(t),null!==N.value&&F.observe(N.value);for(const e of L.values())F.observe(e);Y.observeTargets()}if(I=t.ownerDocument.fonts,I?.addEventListener("loadingdone",Y.invalidateAll),"function"==typeof globalThis.IntersectionObserver){j=new globalThis.IntersectionObserver(e=>{for(const t of e){const e=P.get(t.target);if(void 0===e)continue;const o=t.target,n=t.isIntersecting?"running":"paused";o.style.getPropertyValue("--im-thread-placeholder-play-state")!==n&&o.style.setProperty("--im-thread-placeholder-play-state",n),t.isIntersecting?A.add(e):A.delete(e)}U=!0,Ee()},{root:t,rootMargin:`${Number.isFinite(e.visibleMargin)?Math.max(0,e.visibleMargin):0}px 0px`});for(const e of L.values())j.observe(e)}Ee()}}),r(()=>{K=!0;const e=E.value;null!==e&&e.removeEventListener("scroll",Ce),null!==e&&(e.removeEventListener("scrollend",Qe),e.removeEventListener("touchstart",Xe),e.removeEventListener("touchmove",Ze),e.removeEventListener("touchend",_e),e.removeEventListener("touchcancel",_e),e.removeEventListener("wheel",et),e.removeEventListener("pointerdown",tt),e.removeEventListener("pointermove",ot),e.removeEventListener("pointerup",nt),e.removeEventListener("pointercancel",nt),e.removeEventListener("keydown",it)),le.cancel(),ke(),void 0!==z&&("number"==typeof z&&"function"==typeof globalThis.cancelAnimationFrame?globalThis.cancelAnimationFrame(z):globalThis.clearTimeout(z),z=void 0,V.clear()),I?.removeEventListener("loadingdone",Y.invalidateAll),Y.dispose(),F?.disconnect(),j?.disconnect(),ge(),B=void 0;for(const e of L.values())e.style.removeProperty("--im-thread-placeholder-play-state");L.clear(),P.clear(),A.clear(),R.clear(),ve.clear()}),H({getViewportElement:()=>E.value,clearNewMessageBadge:function(){ve.clear()},clearActiveDate:ge,isAtBottom:s(()=>de.value),isMeasurable:rt,isScrollable:function(){const e=E.value;return rt()&&null!==e&&e.scrollHeight>e.clientHeight+1},getMessageCenteringNeeds:function(e){return at(L.get(e))},newMessageCount:s(()=>ue.value),prepareHistoryPageAppend:function(){J=!0,de.value=!1},cancelHistoryPageAppend:function(){J=!1,Ee()},trackRemoteMessageIds:(e,t)=>ve.trackRemote(e,t),scrollToLatest:lt,scrollToMessage:function(e,t={}){return st(L.get(e),t)},scrollToEntryUnread:()=>st(B,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:function(){return at(B)},focusViewport:()=>E.value?.focus({preventScroll:!0})}),()=>a("div",{ref:E,"data-im-thread-viewport":"",role:"log",tabindex:-1},[a("div",{ref:N,"data-im-thread-viewport-content":""},x.default?.())])}});export{O as ImThreadViewport};
|