k2-im 0.2.7 → 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.
- package/dist/chat-kit-pinia.d.ts +1 -0
- package/dist/chat-kit.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -1
- package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -1
- package/dist/sdk.d.ts +1 -0
- package/package.json +1 -1
package/dist/chat-kit-pinia.d.ts
CHANGED
|
@@ -1755,6 +1755,7 @@ interface ImDirectoryItem<TKind extends ImDirectoryKind = ImDirectoryKind> {
|
|
|
1755
1755
|
displayName: string;
|
|
1756
1756
|
cardDisplayName: string;
|
|
1757
1757
|
avatarUrl?: string;
|
|
1758
|
+
/** 面向用户展示的账号;HTTP 目录优先映射 mid(金刚号),与内部 id 分开。 */
|
|
1758
1759
|
username?: string;
|
|
1759
1760
|
}
|
|
1760
1761
|
/** HTTP adapter 返回的页;页码只在 port 内可见,不进入产品 API。 */
|
package/dist/chat-kit.d.ts
CHANGED
|
@@ -1752,6 +1752,7 @@ interface ImDirectoryItem<TKind extends ImDirectoryKind = ImDirectoryKind> {
|
|
|
1752
1752
|
displayName: string;
|
|
1753
1753
|
cardDisplayName: string;
|
|
1754
1754
|
avatarUrl?: string;
|
|
1755
|
+
/** 面向用户展示的账号;HTTP 目录优先映射 mid(金刚号),与内部 id 分开。 */
|
|
1755
1756
|
username?: string;
|
|
1756
1757
|
}
|
|
1757
1758
|
/** HTTP adapter 返回的页;页码只在 port 内可见,不进入产品 API。 */
|
package/dist/index.d.ts
CHANGED
|
@@ -1793,6 +1793,7 @@ interface ImDirectoryItem<TKind extends ImDirectoryKind = ImDirectoryKind> {
|
|
|
1793
1793
|
displayName: string;
|
|
1794
1794
|
cardDisplayName: string;
|
|
1795
1795
|
avatarUrl?: string;
|
|
1796
|
+
/** 面向用户展示的账号;HTTP 目录优先映射 mid(金刚号),与内部 id 分开。 */
|
|
1796
1797
|
username?: string;
|
|
1797
1798
|
}
|
|
1798
1799
|
/** HTTP adapter 返回的页;页码只在 port 内可见,不进入产品 API。 */
|
|
@@ -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{requestCoreJson as e}from"./requests/core-json-request.js";class i extends Error{constructor(e){super(e),this.name="DirectoryMappingError"}}function r(e,r){if(null===e||"object"!=typeof e||Array.isArray(e))throw new i(`${r} 必须是对象`);return e}function n(e){return"string"==typeof e||"number"==typeof e?String(e).trim():""}function t(e){const i=n(e);return""===i?void 0:i}function a(e){const a=r(e,"联系人目录项"),o=void 0===a.user_info?a:r(a.user_info,"联系人 user_info"),d=n(o.user_id??a.friend_user_id??a.user_id);if(""===d)throw new i("联系人目录项缺少稳定 user_id");const s=n(a.remark_name)||n(a.contact_name)||n(o.nick_name)||n(o.username)||n(o.mid)||d,u=n(o.nick_name)||n(o.username)||n(o.mid)||d,c=t(o.head_img_url),p=t(o.
|
|
1
|
+
import{requestCoreJson as e}from"./requests/core-json-request.js";class i extends Error{constructor(e){super(e),this.name="DirectoryMappingError"}}function r(e,r){if(null===e||"object"!=typeof e||Array.isArray(e))throw new i(`${r} 必须是对象`);return e}function n(e){return"string"==typeof e||"number"==typeof e?String(e).trim():""}function t(e){const i=n(e);return""===i?void 0:i}function a(e){const a=r(e,"联系人目录项"),o=void 0===a.user_info?a:r(a.user_info,"联系人 user_info"),d=n(o.user_id??a.friend_user_id??a.user_id);if(""===d)throw new i("联系人目录项缺少稳定 user_id");const s=n(a.remark_name)||n(a.contact_name)||n(o.nick_name)||n(o.username)||n(o.mid)||d,u=n(o.nick_name)||n(o.username)||n(o.mid)||d,c=t(o.head_img_url),p=t(o.mid)??t(o.username);return{id:d,kind:"individual",displayName:s,cardDisplayName:u,...void 0===c?{}:{avatarUrl:c},...void 0===p?{}:{username:p}}}function o(e){const a=r(e,"群组目录项"),o=n(a.group_id);if(""===o)throw new i("群组目录项缺少稳定 group_id");const d=t(a.head_img_url),s=n(a.name)||o;return{id:o,kind:"group",displayName:s,cardDisplayName:s,...void 0===d?{}:{avatarUrl:d}}}function d(e){const a=r(e,"社群目录项"),o=n(a.radio_id??a.id);if(""===o)throw new i("社群目录项缺少稳定 radio_id/id");const d=t(a.head_img_url),s=n(a.name)||o;return{id:o,kind:"channel",displayName:s,cardDisplayName:s,...void 0===d?{}:{avatarUrl:d}}}function s(r){return{async list(n){!function(e,r){if(!Number.isSafeInteger(e)||e<1)throw new i("目录 page 必须是正整数");if(!Number.isSafeInteger(r)||r<1||r>100)throw new i("目录 pageSize 必须是 1-100 的整数")}(n.page,n.pageSize);const t="individual"===n.kind?"/friend/list":"group"===n.kind?"/user_group/list":"/user_radio/list",s="channel"===n.kind&&void 0!==r.getUserId?String(await r.getUserId()).trim():"",u=(await e(r.client,t,{...""===s?{}:{user_id:s},update_version:0,page:n.page,page_size:n.pageSize},{responseMode:"strict",method:"GET",...void 0===r.clientType?{}:{headers:{"Client-type":String(r.clientType)}}})).data??[];if(!Array.isArray(u))throw new i(`${n.kind} 目录 data 必须是数组`);const c="individual"===n.kind?a:"group"===n.kind?o:d,p=/* @__PURE__ */new Map;for(const e of u){const i=c(e);p.set(i.id,i)}const m=u.length<n.pageSize;return{items:[...p.values()],...m?{}:{nextPage:n.page+1},exhausted:m}}}}export{i as DirectoryMappingError,s as createDirectoryHttpAdapter};
|
|
@@ -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};
|
package/dist/sdk.d.ts
CHANGED
|
@@ -1597,6 +1597,7 @@ interface ImDirectoryItem<TKind extends ImDirectoryKind = ImDirectoryKind> {
|
|
|
1597
1597
|
displayName: string;
|
|
1598
1598
|
cardDisplayName: string;
|
|
1599
1599
|
avatarUrl?: string;
|
|
1600
|
+
/** 面向用户展示的账号;HTTP 目录优先映射 mid(金刚号),与内部 id 分开。 */
|
|
1600
1601
|
username?: string;
|
|
1601
1602
|
}
|
|
1602
1603
|
|