@uipath/apollo-wind 2.66.1 → 2.67.0
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/components/ui/attachment.cjs +174 -0
- package/dist/components/ui/attachment.d.ts +39 -0
- package/dist/components/ui/attachment.js +113 -0
- package/dist/components/ui/bubble.cjs +123 -0
- package/dist/components/ui/bubble.d.ts +28 -0
- package/dist/components/ui/bubble.js +77 -0
- package/dist/components/ui/index.cjs +268 -213
- package/dist/components/ui/index.d.ts +6 -1
- package/dist/components/ui/index.js +6 -1
- package/dist/components/ui/marker.cjs +89 -0
- package/dist/components/ui/marker.d.ts +16 -0
- package/dist/components/ui/marker.js +46 -0
- package/dist/components/ui/message-scroller/index.cjs +58 -0
- package/dist/components/ui/message-scroller/index.d.ts +1 -0
- package/dist/components/ui/message-scroller/index.js +1 -0
- package/dist/components/ui/message-scroller/message-scroller.cjs +137 -0
- package/dist/components/ui/message-scroller/message-scroller.d.ts +60 -0
- package/dist/components/ui/message-scroller/message-scroller.js +73 -0
- package/dist/components/ui/message-scroller/primitive/components.cjs +357 -0
- package/dist/components/ui/message-scroller/primitive/components.d.ts +28 -0
- package/dist/components/ui/message-scroller/primitive/components.js +299 -0
- package/dist/components/ui/message-scroller/primitive/geometry.cjs +232 -0
- package/dist/components/ui/message-scroller/primitive/geometry.d.ts +54 -0
- package/dist/components/ui/message-scroller/primitive/geometry.js +153 -0
- package/dist/components/ui/message-scroller/primitive/index.cjs +53 -0
- package/dist/components/ui/message-scroller/primitive/index.d.ts +23 -0
- package/dist/components/ui/message-scroller/primitive/index.js +10 -0
- package/dist/components/ui/message-scroller/primitive/stores.cjs +81 -0
- package/dist/components/ui/message-scroller/primitive/stores.d.ts +6 -0
- package/dist/components/ui/message-scroller/primitive/stores.js +38 -0
- package/dist/components/ui/message-scroller/primitive/types.cjs +82 -0
- package/dist/components/ui/message-scroller/primitive/types.d.ts +89 -0
- package/dist/components/ui/message-scroller/primitive/types.js +24 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-commands.cjs +213 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-commands.d.ts +18 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-commands.js +179 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-controller.cjs +474 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-controller.d.ts +6 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-controller.js +440 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-refs.cjs +124 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-refs.d.ts +52 -0
- package/dist/components/ui/message-scroller/primitive/use-message-scroller-refs.js +84 -0
- package/dist/components/ui/message-scroller/primitive/use-render.cjs +116 -0
- package/dist/components/ui/message-scroller/primitive/use-render.d.ts +21 -0
- package/dist/components/ui/message-scroller/primitive/use-render.js +76 -0
- package/dist/components/ui/message-scroller/primitive/utils.cjs +41 -0
- package/dist/components/ui/message-scroller/primitive/utils.d.ts +3 -0
- package/dist/components/ui/message-scroller/primitive/utils.js +7 -0
- package/dist/components/ui/message.cjs +96 -0
- package/dist/components/ui/message.d.ts +17 -0
- package/dist/components/ui/message.js +47 -0
- package/dist/index.cjs +164 -51
- package/dist/index.d.ts +10 -0
- package/dist/index.js +6 -1
- package/dist/styles.css +720 -0
- package/dist/tailwind.utilities.css +223 -0
- package/package.json +1 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
hasMultipleNewScrollAnchors: ()=>hasMultipleNewScrollAnchors,
|
|
28
|
+
getMessageScrollerVisibilityState: ()=>getMessageScrollerVisibilityState,
|
|
29
|
+
getUnanchoredScrollAnchor: ()=>getUnanchoredScrollAnchor,
|
|
30
|
+
getContentBottom: ()=>getContentBottom,
|
|
31
|
+
getFirstVisibleMessageItem: ()=>getFirstVisibleMessageItem,
|
|
32
|
+
getMessageScrollerItems: ()=>getMessageScrollerItems,
|
|
33
|
+
getElementScrollTop: ()=>getElementScrollTop,
|
|
34
|
+
getFlexGap: ()=>getFlexGap,
|
|
35
|
+
getElementTop: ()=>getElementTop,
|
|
36
|
+
getLastScrollAnchor: ()=>getLastScrollAnchor,
|
|
37
|
+
getTailSpacerHeight: ()=>getTailSpacerHeight,
|
|
38
|
+
getElementViewportTop: ()=>getElementViewportTop,
|
|
39
|
+
getContentBlockPadding: ()=>getContentBlockPadding,
|
|
40
|
+
getMaxScrollTop: ()=>getMaxScrollTop,
|
|
41
|
+
getMessageScrollerScrollable: ()=>getMessageScrollerScrollable,
|
|
42
|
+
getNewScrollAnchor: ()=>getNewScrollAnchor
|
|
43
|
+
});
|
|
44
|
+
const external_types_cjs_namespaceObject = require("./types.cjs");
|
|
45
|
+
function getMessageScrollerScrollable({ content, scrollEdgeThreshold, spacer, viewport }) {
|
|
46
|
+
if (!viewport || !content) return external_types_cjs_namespaceObject.EMPTY_MESSAGE_SCROLLER_SCROLLABLE;
|
|
47
|
+
const contentBottom = getContentBottom({
|
|
48
|
+
content,
|
|
49
|
+
spacer,
|
|
50
|
+
viewport
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
start: viewport.scrollTop > scrollEdgeThreshold,
|
|
54
|
+
end: contentBottom - viewport.scrollTop - viewport.clientHeight > scrollEdgeThreshold
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function getMessageScrollerVisibilityState({ content, scrollMargin, scrollPreviousItemPeek, spacer, viewport, visibleMessageIds }) {
|
|
58
|
+
if (!content || !viewport) return external_types_cjs_namespaceObject.EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
|
|
59
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
60
|
+
const lineTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;
|
|
61
|
+
const trackByLayout = "u" < typeof IntersectionObserver;
|
|
62
|
+
const visible = [];
|
|
63
|
+
let currentAnchorId = null;
|
|
64
|
+
for (const item of getMessageScrollerItems(content, spacer)){
|
|
65
|
+
const messageId = item.dataset.messageId;
|
|
66
|
+
if (!messageId) continue;
|
|
67
|
+
const isAnchor = 'true' === item.dataset.scrollAnchor;
|
|
68
|
+
const rect = isAnchor || trackByLayout ? item.getBoundingClientRect() : null;
|
|
69
|
+
const isVisible = trackByLayout && rect ? rect.bottom > lineTop && rect.top < viewportRect.bottom : visibleMessageIds.has(messageId);
|
|
70
|
+
if (isVisible) visible.push(messageId);
|
|
71
|
+
if (isAnchor && rect && rect.top <= lineTop + external_types_cjs_namespaceObject.SCROLL_POSITION_EPSILON) currentAnchorId = messageId;
|
|
72
|
+
}
|
|
73
|
+
if (0 === visible.length && null === currentAnchorId) return external_types_cjs_namespaceObject.EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
|
|
74
|
+
return {
|
|
75
|
+
currentAnchorId,
|
|
76
|
+
visibleMessageIds: visible
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function getMessageScrollerItems(content, spacer) {
|
|
80
|
+
return Array.from(content.children).filter((child)=>child instanceof HTMLElement && child !== spacer);
|
|
81
|
+
}
|
|
82
|
+
function getNewScrollAnchor(items, previousItemCount) {
|
|
83
|
+
for(let index = previousItemCount; index < items.length; index++){
|
|
84
|
+
const item = items[index];
|
|
85
|
+
if (item?.dataset.scrollAnchor === 'true') return item;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
function getUnanchoredScrollAnchor(items, handledAnchors) {
|
|
90
|
+
for (const item of items)if ('true' === item.dataset.scrollAnchor && !handledAnchors.has(item)) return item;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function hasMultipleNewScrollAnchors(items, previousItemCount) {
|
|
94
|
+
let count = 0;
|
|
95
|
+
for(let index = previousItemCount; index < items.length; index++){
|
|
96
|
+
const item = items[index];
|
|
97
|
+
if (item?.dataset.scrollAnchor === 'true') {
|
|
98
|
+
count += 1;
|
|
99
|
+
if (count > 1) return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
function getLastScrollAnchor(items) {
|
|
105
|
+
for(let index = items.length - 1; index >= 0; index--){
|
|
106
|
+
const item = items[index];
|
|
107
|
+
if (item?.dataset.scrollAnchor === 'true') return item;
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function getFirstVisibleMessageItem({ content, spacer, viewport }) {
|
|
112
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
113
|
+
for (const item of getMessageScrollerItems(content, spacer)){
|
|
114
|
+
if (!item.dataset.messageId) continue;
|
|
115
|
+
const rect = item.getBoundingClientRect();
|
|
116
|
+
if (rect.bottom > viewportRect.top && rect.top < viewportRect.bottom) return item;
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
function getElementScrollTop({ align, element, scrollMargin, spacer, viewport }) {
|
|
121
|
+
const elementTop = getElementTop(element, viewport);
|
|
122
|
+
const elementHeight = element.getBoundingClientRect().height;
|
|
123
|
+
const contentPadding = getContentBlockPadding(spacer);
|
|
124
|
+
if ('center' === align) {
|
|
125
|
+
const insetHeight = Math.max(0, viewport.clientHeight - contentPadding.start - contentPadding.end);
|
|
126
|
+
return elementTop - contentPadding.start - (insetHeight - elementHeight) / 2 - scrollMargin;
|
|
127
|
+
}
|
|
128
|
+
if ('end' === align) return elementTop - viewport.clientHeight + elementHeight + contentPadding.end + scrollMargin;
|
|
129
|
+
if ('nearest' === align) {
|
|
130
|
+
const elementBottom = elementTop + elementHeight;
|
|
131
|
+
const viewportTop = viewport.scrollTop + contentPadding.start;
|
|
132
|
+
const viewportBottom = viewport.scrollTop + viewport.clientHeight - contentPadding.end;
|
|
133
|
+
if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewport.scrollTop;
|
|
134
|
+
if (elementTop < viewportTop) return elementTop - contentPadding.start - scrollMargin;
|
|
135
|
+
return elementBottom - viewport.clientHeight + contentPadding.end + scrollMargin;
|
|
136
|
+
}
|
|
137
|
+
return elementTop - contentPadding.start - scrollMargin;
|
|
138
|
+
}
|
|
139
|
+
function getElementTop(element, viewport) {
|
|
140
|
+
const elementRect = element.getBoundingClientRect();
|
|
141
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
142
|
+
return elementRect.top - viewportRect.top + viewport.scrollTop;
|
|
143
|
+
}
|
|
144
|
+
function getElementViewportTop(element, viewport) {
|
|
145
|
+
return element.getBoundingClientRect().top - viewport.getBoundingClientRect().top;
|
|
146
|
+
}
|
|
147
|
+
function getTailSpacerHeight({ content, scrollTop, spacer, viewport }) {
|
|
148
|
+
const contentBottom = getContentBottom({
|
|
149
|
+
content,
|
|
150
|
+
spacer,
|
|
151
|
+
viewport
|
|
152
|
+
});
|
|
153
|
+
return scrollTop + viewport.clientHeight - contentBottom;
|
|
154
|
+
}
|
|
155
|
+
function getContentBottom({ content, spacer, viewport }) {
|
|
156
|
+
const items = getMessageScrollerItems(content, spacer);
|
|
157
|
+
const padding = getBlockPadding(content);
|
|
158
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
159
|
+
const scrollTop = viewport.scrollTop;
|
|
160
|
+
let contentBottom = padding.start + padding.end;
|
|
161
|
+
for (const item of items){
|
|
162
|
+
const rect = item.getBoundingClientRect();
|
|
163
|
+
contentBottom = Math.max(contentBottom, rect.bottom - viewportRect.top + scrollTop + padding.end);
|
|
164
|
+
}
|
|
165
|
+
return contentBottom;
|
|
166
|
+
}
|
|
167
|
+
function getMaxScrollTop(viewport) {
|
|
168
|
+
return Math.max(0, viewport.scrollHeight - viewport.clientHeight);
|
|
169
|
+
}
|
|
170
|
+
function getBlockPadding(element) {
|
|
171
|
+
const style = window.getComputedStyle(element);
|
|
172
|
+
return {
|
|
173
|
+
end: readCssPixel(style.paddingBlockEnd || style.paddingBottom),
|
|
174
|
+
start: readCssPixel(style.paddingBlockStart || style.paddingTop)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function getContentBlockPadding(spacer) {
|
|
178
|
+
const content = spacer?.parentElement;
|
|
179
|
+
if (!content) return {
|
|
180
|
+
end: 0,
|
|
181
|
+
start: 0
|
|
182
|
+
};
|
|
183
|
+
return getBlockPadding(content);
|
|
184
|
+
}
|
|
185
|
+
function getFlexGap(element) {
|
|
186
|
+
if (!element) return 0;
|
|
187
|
+
const style = window.getComputedStyle(element);
|
|
188
|
+
const gap = 'normal' === style.rowGap ? style.gap : style.rowGap;
|
|
189
|
+
return readCssPixel(gap);
|
|
190
|
+
}
|
|
191
|
+
function readCssPixel(value) {
|
|
192
|
+
if (!value) return 0;
|
|
193
|
+
const number = Number.parseFloat(value);
|
|
194
|
+
return Number.isFinite(number) ? number : 0;
|
|
195
|
+
}
|
|
196
|
+
exports.getContentBlockPadding = __webpack_exports__.getContentBlockPadding;
|
|
197
|
+
exports.getContentBottom = __webpack_exports__.getContentBottom;
|
|
198
|
+
exports.getElementScrollTop = __webpack_exports__.getElementScrollTop;
|
|
199
|
+
exports.getElementTop = __webpack_exports__.getElementTop;
|
|
200
|
+
exports.getElementViewportTop = __webpack_exports__.getElementViewportTop;
|
|
201
|
+
exports.getFirstVisibleMessageItem = __webpack_exports__.getFirstVisibleMessageItem;
|
|
202
|
+
exports.getFlexGap = __webpack_exports__.getFlexGap;
|
|
203
|
+
exports.getLastScrollAnchor = __webpack_exports__.getLastScrollAnchor;
|
|
204
|
+
exports.getMaxScrollTop = __webpack_exports__.getMaxScrollTop;
|
|
205
|
+
exports.getMessageScrollerItems = __webpack_exports__.getMessageScrollerItems;
|
|
206
|
+
exports.getMessageScrollerScrollable = __webpack_exports__.getMessageScrollerScrollable;
|
|
207
|
+
exports.getMessageScrollerVisibilityState = __webpack_exports__.getMessageScrollerVisibilityState;
|
|
208
|
+
exports.getNewScrollAnchor = __webpack_exports__.getNewScrollAnchor;
|
|
209
|
+
exports.getTailSpacerHeight = __webpack_exports__.getTailSpacerHeight;
|
|
210
|
+
exports.getUnanchoredScrollAnchor = __webpack_exports__.getUnanchoredScrollAnchor;
|
|
211
|
+
exports.hasMultipleNewScrollAnchors = __webpack_exports__.hasMultipleNewScrollAnchors;
|
|
212
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
213
|
+
"getContentBlockPadding",
|
|
214
|
+
"getContentBottom",
|
|
215
|
+
"getElementScrollTop",
|
|
216
|
+
"getElementTop",
|
|
217
|
+
"getElementViewportTop",
|
|
218
|
+
"getFirstVisibleMessageItem",
|
|
219
|
+
"getFlexGap",
|
|
220
|
+
"getLastScrollAnchor",
|
|
221
|
+
"getMaxScrollTop",
|
|
222
|
+
"getMessageScrollerItems",
|
|
223
|
+
"getMessageScrollerScrollable",
|
|
224
|
+
"getMessageScrollerVisibilityState",
|
|
225
|
+
"getNewScrollAnchor",
|
|
226
|
+
"getTailSpacerHeight",
|
|
227
|
+
"getUnanchoredScrollAnchor",
|
|
228
|
+
"hasMultipleNewScrollAnchors"
|
|
229
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
230
|
+
Object.defineProperty(exports, '__esModule', {
|
|
231
|
+
value: true
|
|
232
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerVisibilityState } from './types';
|
|
2
|
+
declare function getMessageScrollerScrollable({ content, scrollEdgeThreshold, spacer, viewport, }: {
|
|
3
|
+
content: HTMLElement | null;
|
|
4
|
+
scrollEdgeThreshold: number;
|
|
5
|
+
spacer: HTMLElement | null;
|
|
6
|
+
viewport: HTMLElement | null;
|
|
7
|
+
}): MessageScrollerScrollable;
|
|
8
|
+
declare function getMessageScrollerVisibilityState({ content, scrollMargin, scrollPreviousItemPeek, spacer, viewport, visibleMessageIds, }: {
|
|
9
|
+
content: HTMLElement | null;
|
|
10
|
+
scrollMargin: number;
|
|
11
|
+
scrollPreviousItemPeek: number;
|
|
12
|
+
spacer: HTMLElement | null;
|
|
13
|
+
viewport: HTMLElement | null;
|
|
14
|
+
visibleMessageIds: Set<string>;
|
|
15
|
+
}): MessageScrollerVisibilityState;
|
|
16
|
+
declare function getMessageScrollerItems(content: HTMLElement, spacer: HTMLElement | null): HTMLElement[];
|
|
17
|
+
declare function getNewScrollAnchor(items: HTMLElement[], previousItemCount: number): HTMLElement | null;
|
|
18
|
+
declare function getUnanchoredScrollAnchor(items: HTMLElement[], handledAnchors: {
|
|
19
|
+
has(element: HTMLElement): boolean;
|
|
20
|
+
}): HTMLElement | null;
|
|
21
|
+
declare function hasMultipleNewScrollAnchors(items: HTMLElement[], previousItemCount: number): boolean;
|
|
22
|
+
declare function getLastScrollAnchor(items: HTMLElement[]): HTMLElement | null;
|
|
23
|
+
declare function getFirstVisibleMessageItem({ content, spacer, viewport, }: {
|
|
24
|
+
content: HTMLElement;
|
|
25
|
+
spacer: HTMLElement | null;
|
|
26
|
+
viewport: HTMLElement;
|
|
27
|
+
}): HTMLElement | null;
|
|
28
|
+
declare function getElementScrollTop({ align, element, scrollMargin, spacer, viewport, }: {
|
|
29
|
+
align: MessageScrollerScrollAlign;
|
|
30
|
+
element: HTMLElement;
|
|
31
|
+
scrollMargin: number;
|
|
32
|
+
spacer: HTMLElement | null;
|
|
33
|
+
viewport: HTMLElement;
|
|
34
|
+
}): number;
|
|
35
|
+
declare function getElementTop(element: HTMLElement, viewport: HTMLElement): number;
|
|
36
|
+
declare function getElementViewportTop(element: HTMLElement, viewport: HTMLElement): number;
|
|
37
|
+
declare function getTailSpacerHeight({ content, scrollTop, spacer, viewport, }: {
|
|
38
|
+
content: HTMLElement;
|
|
39
|
+
scrollTop: number;
|
|
40
|
+
spacer: HTMLElement | null;
|
|
41
|
+
viewport: HTMLElement;
|
|
42
|
+
}): number;
|
|
43
|
+
declare function getContentBottom({ content, spacer, viewport, }: {
|
|
44
|
+
content: HTMLElement;
|
|
45
|
+
spacer: HTMLElement | null;
|
|
46
|
+
viewport: HTMLElement;
|
|
47
|
+
}): number;
|
|
48
|
+
declare function getMaxScrollTop(viewport: HTMLElement): number;
|
|
49
|
+
declare function getContentBlockPadding(spacer: HTMLElement | null): {
|
|
50
|
+
end: number;
|
|
51
|
+
start: number;
|
|
52
|
+
};
|
|
53
|
+
declare function getFlexGap(element: HTMLElement | null): number;
|
|
54
|
+
export { getContentBlockPadding, getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors, };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { EMPTY_MESSAGE_SCROLLER_SCROLLABLE, EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, SCROLL_POSITION_EPSILON } from "./types.js";
|
|
2
|
+
function getMessageScrollerScrollable({ content, scrollEdgeThreshold, spacer, viewport }) {
|
|
3
|
+
if (!viewport || !content) return EMPTY_MESSAGE_SCROLLER_SCROLLABLE;
|
|
4
|
+
const contentBottom = getContentBottom({
|
|
5
|
+
content,
|
|
6
|
+
spacer,
|
|
7
|
+
viewport
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
start: viewport.scrollTop > scrollEdgeThreshold,
|
|
11
|
+
end: contentBottom - viewport.scrollTop - viewport.clientHeight > scrollEdgeThreshold
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function getMessageScrollerVisibilityState({ content, scrollMargin, scrollPreviousItemPeek, spacer, viewport, visibleMessageIds }) {
|
|
15
|
+
if (!content || !viewport) return EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
|
|
16
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
17
|
+
const lineTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;
|
|
18
|
+
const trackByLayout = "u" < typeof IntersectionObserver;
|
|
19
|
+
const visible = [];
|
|
20
|
+
let currentAnchorId = null;
|
|
21
|
+
for (const item of getMessageScrollerItems(content, spacer)){
|
|
22
|
+
const messageId = item.dataset.messageId;
|
|
23
|
+
if (!messageId) continue;
|
|
24
|
+
const isAnchor = 'true' === item.dataset.scrollAnchor;
|
|
25
|
+
const rect = isAnchor || trackByLayout ? item.getBoundingClientRect() : null;
|
|
26
|
+
const isVisible = trackByLayout && rect ? rect.bottom > lineTop && rect.top < viewportRect.bottom : visibleMessageIds.has(messageId);
|
|
27
|
+
if (isVisible) visible.push(messageId);
|
|
28
|
+
if (isAnchor && rect && rect.top <= lineTop + SCROLL_POSITION_EPSILON) currentAnchorId = messageId;
|
|
29
|
+
}
|
|
30
|
+
if (0 === visible.length && null === currentAnchorId) return EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
|
|
31
|
+
return {
|
|
32
|
+
currentAnchorId,
|
|
33
|
+
visibleMessageIds: visible
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getMessageScrollerItems(content, spacer) {
|
|
37
|
+
return Array.from(content.children).filter((child)=>child instanceof HTMLElement && child !== spacer);
|
|
38
|
+
}
|
|
39
|
+
function getNewScrollAnchor(items, previousItemCount) {
|
|
40
|
+
for(let index = previousItemCount; index < items.length; index++){
|
|
41
|
+
const item = items[index];
|
|
42
|
+
if (item?.dataset.scrollAnchor === 'true') return item;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
function getUnanchoredScrollAnchor(items, handledAnchors) {
|
|
47
|
+
for (const item of items)if ('true' === item.dataset.scrollAnchor && !handledAnchors.has(item)) return item;
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function hasMultipleNewScrollAnchors(items, previousItemCount) {
|
|
51
|
+
let count = 0;
|
|
52
|
+
for(let index = previousItemCount; index < items.length; index++){
|
|
53
|
+
const item = items[index];
|
|
54
|
+
if (item?.dataset.scrollAnchor === 'true') {
|
|
55
|
+
count += 1;
|
|
56
|
+
if (count > 1) return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function getLastScrollAnchor(items) {
|
|
62
|
+
for(let index = items.length - 1; index >= 0; index--){
|
|
63
|
+
const item = items[index];
|
|
64
|
+
if (item?.dataset.scrollAnchor === 'true') return item;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function getFirstVisibleMessageItem({ content, spacer, viewport }) {
|
|
69
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
70
|
+
for (const item of getMessageScrollerItems(content, spacer)){
|
|
71
|
+
if (!item.dataset.messageId) continue;
|
|
72
|
+
const rect = item.getBoundingClientRect();
|
|
73
|
+
if (rect.bottom > viewportRect.top && rect.top < viewportRect.bottom) return item;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
function getElementScrollTop({ align, element, scrollMargin, spacer, viewport }) {
|
|
78
|
+
const elementTop = getElementTop(element, viewport);
|
|
79
|
+
const elementHeight = element.getBoundingClientRect().height;
|
|
80
|
+
const contentPadding = getContentBlockPadding(spacer);
|
|
81
|
+
if ('center' === align) {
|
|
82
|
+
const insetHeight = Math.max(0, viewport.clientHeight - contentPadding.start - contentPadding.end);
|
|
83
|
+
return elementTop - contentPadding.start - (insetHeight - elementHeight) / 2 - scrollMargin;
|
|
84
|
+
}
|
|
85
|
+
if ('end' === align) return elementTop - viewport.clientHeight + elementHeight + contentPadding.end + scrollMargin;
|
|
86
|
+
if ('nearest' === align) {
|
|
87
|
+
const elementBottom = elementTop + elementHeight;
|
|
88
|
+
const viewportTop = viewport.scrollTop + contentPadding.start;
|
|
89
|
+
const viewportBottom = viewport.scrollTop + viewport.clientHeight - contentPadding.end;
|
|
90
|
+
if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewport.scrollTop;
|
|
91
|
+
if (elementTop < viewportTop) return elementTop - contentPadding.start - scrollMargin;
|
|
92
|
+
return elementBottom - viewport.clientHeight + contentPadding.end + scrollMargin;
|
|
93
|
+
}
|
|
94
|
+
return elementTop - contentPadding.start - scrollMargin;
|
|
95
|
+
}
|
|
96
|
+
function getElementTop(element, viewport) {
|
|
97
|
+
const elementRect = element.getBoundingClientRect();
|
|
98
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
99
|
+
return elementRect.top - viewportRect.top + viewport.scrollTop;
|
|
100
|
+
}
|
|
101
|
+
function getElementViewportTop(element, viewport) {
|
|
102
|
+
return element.getBoundingClientRect().top - viewport.getBoundingClientRect().top;
|
|
103
|
+
}
|
|
104
|
+
function getTailSpacerHeight({ content, scrollTop, spacer, viewport }) {
|
|
105
|
+
const contentBottom = getContentBottom({
|
|
106
|
+
content,
|
|
107
|
+
spacer,
|
|
108
|
+
viewport
|
|
109
|
+
});
|
|
110
|
+
return scrollTop + viewport.clientHeight - contentBottom;
|
|
111
|
+
}
|
|
112
|
+
function getContentBottom({ content, spacer, viewport }) {
|
|
113
|
+
const items = getMessageScrollerItems(content, spacer);
|
|
114
|
+
const padding = getBlockPadding(content);
|
|
115
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
116
|
+
const scrollTop = viewport.scrollTop;
|
|
117
|
+
let contentBottom = padding.start + padding.end;
|
|
118
|
+
for (const item of items){
|
|
119
|
+
const rect = item.getBoundingClientRect();
|
|
120
|
+
contentBottom = Math.max(contentBottom, rect.bottom - viewportRect.top + scrollTop + padding.end);
|
|
121
|
+
}
|
|
122
|
+
return contentBottom;
|
|
123
|
+
}
|
|
124
|
+
function getMaxScrollTop(viewport) {
|
|
125
|
+
return Math.max(0, viewport.scrollHeight - viewport.clientHeight);
|
|
126
|
+
}
|
|
127
|
+
function getBlockPadding(element) {
|
|
128
|
+
const style = window.getComputedStyle(element);
|
|
129
|
+
return {
|
|
130
|
+
end: readCssPixel(style.paddingBlockEnd || style.paddingBottom),
|
|
131
|
+
start: readCssPixel(style.paddingBlockStart || style.paddingTop)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function getContentBlockPadding(spacer) {
|
|
135
|
+
const content = spacer?.parentElement;
|
|
136
|
+
if (!content) return {
|
|
137
|
+
end: 0,
|
|
138
|
+
start: 0
|
|
139
|
+
};
|
|
140
|
+
return getBlockPadding(content);
|
|
141
|
+
}
|
|
142
|
+
function getFlexGap(element) {
|
|
143
|
+
if (!element) return 0;
|
|
144
|
+
const style = window.getComputedStyle(element);
|
|
145
|
+
const gap = 'normal' === style.rowGap ? style.gap : style.rowGap;
|
|
146
|
+
return readCssPixel(gap);
|
|
147
|
+
}
|
|
148
|
+
function readCssPixel(value) {
|
|
149
|
+
if (!value) return 0;
|
|
150
|
+
const number = Number.parseFloat(value);
|
|
151
|
+
return Number.isFinite(number) ? number : 0;
|
|
152
|
+
}
|
|
153
|
+
export { getContentBlockPadding, getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
useMessageScrollerVisibility: ()=>external_components_cjs_namespaceObject.useMessageScrollerVisibility,
|
|
28
|
+
MessageScroller: ()=>MessageScroller,
|
|
29
|
+
useMessageScroller: ()=>external_components_cjs_namespaceObject.useMessageScroller,
|
|
30
|
+
useMessageScrollerScrollable: ()=>external_components_cjs_namespaceObject.useMessageScrollerScrollable
|
|
31
|
+
});
|
|
32
|
+
const external_components_cjs_namespaceObject = require("./components.cjs");
|
|
33
|
+
const MessageScroller = {
|
|
34
|
+
Provider: external_components_cjs_namespaceObject.MessageScrollerProvider,
|
|
35
|
+
Root: external_components_cjs_namespaceObject.MessageScroller,
|
|
36
|
+
Viewport: external_components_cjs_namespaceObject.MessageScrollerViewport,
|
|
37
|
+
Content: external_components_cjs_namespaceObject.MessageScrollerContent,
|
|
38
|
+
Item: external_components_cjs_namespaceObject.MessageScrollerItem,
|
|
39
|
+
Button: external_components_cjs_namespaceObject.MessageScrollerButton
|
|
40
|
+
};
|
|
41
|
+
exports.MessageScroller = __webpack_exports__.MessageScroller;
|
|
42
|
+
exports.useMessageScroller = __webpack_exports__.useMessageScroller;
|
|
43
|
+
exports.useMessageScrollerScrollable = __webpack_exports__.useMessageScrollerScrollable;
|
|
44
|
+
exports.useMessageScrollerVisibility = __webpack_exports__.useMessageScrollerVisibility;
|
|
45
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
46
|
+
"MessageScroller",
|
|
47
|
+
"useMessageScroller",
|
|
48
|
+
"useMessageScrollerScrollable",
|
|
49
|
+
"useMessageScrollerVisibility"
|
|
50
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
51
|
+
Object.defineProperty(exports, '__esModule', {
|
|
52
|
+
value: true
|
|
53
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { MessageScrollerProvider as Provider } from './components';
|
|
2
|
+
export declare const MessageScroller: {
|
|
3
|
+
Provider: typeof Provider;
|
|
4
|
+
Root: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
5
|
+
Viewport: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
6
|
+
preserveScrollOnPrepend?: boolean;
|
|
7
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
8
|
+
Content: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
9
|
+
spacerClassName?: string;
|
|
10
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
11
|
+
Item: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
12
|
+
messageId?: string;
|
|
13
|
+
scrollAnchor?: boolean;
|
|
14
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
15
|
+
Button: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
|
|
16
|
+
render?: (import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | ((props: Record<string, unknown>, state: import("./types").MessageScrollerButtonRenderState) => React.ReactElement | null)) | undefined;
|
|
17
|
+
} & {
|
|
18
|
+
behavior?: ScrollBehavior;
|
|
19
|
+
direction?: import("./types").MessageScrollerButtonDirection;
|
|
20
|
+
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
21
|
+
};
|
|
22
|
+
export { useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, } from './components';
|
|
23
|
+
export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerScrollOptions, MessageScrollerVisibilityState, } from './types';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility } from "./components.js";
|
|
2
|
+
const primitive_MessageScroller = {
|
|
3
|
+
Provider: MessageScrollerProvider,
|
|
4
|
+
Root: MessageScroller,
|
|
5
|
+
Viewport: MessageScrollerViewport,
|
|
6
|
+
Content: MessageScrollerContent,
|
|
7
|
+
Item: MessageScrollerItem,
|
|
8
|
+
Button: MessageScrollerButton
|
|
9
|
+
};
|
|
10
|
+
export { primitive_MessageScroller as MessageScroller, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
createMessageScrollerVisibilityStore: ()=>createMessageScrollerVisibilityStore,
|
|
28
|
+
areVisibilityStatesEqual: ()=>areVisibilityStatesEqual,
|
|
29
|
+
areScrollStatesEqual: ()=>areScrollStatesEqual,
|
|
30
|
+
createMessageScrollerStore: ()=>createMessageScrollerStore
|
|
31
|
+
});
|
|
32
|
+
const external_types_cjs_namespaceObject = require("./types.cjs");
|
|
33
|
+
function createExternalStore(initialSnapshot, isEqual) {
|
|
34
|
+
let snapshot = initialSnapshot;
|
|
35
|
+
const listeners = new Set();
|
|
36
|
+
return {
|
|
37
|
+
getSnapshot: ()=>snapshot,
|
|
38
|
+
hasListeners: ()=>listeners.size > 0,
|
|
39
|
+
setSnapshot: (nextSnapshot)=>{
|
|
40
|
+
if (isEqual(snapshot, nextSnapshot)) return;
|
|
41
|
+
snapshot = nextSnapshot;
|
|
42
|
+
for (const listener of listeners)listener();
|
|
43
|
+
},
|
|
44
|
+
subscribe: (listener, onFirstSubscribe, onLastUnsubscribe)=>{
|
|
45
|
+
const wasEmpty = 0 === listeners.size;
|
|
46
|
+
listeners.add(listener);
|
|
47
|
+
if (wasEmpty) onFirstSubscribe?.();
|
|
48
|
+
return ()=>{
|
|
49
|
+
listeners.delete(listener);
|
|
50
|
+
if (0 === listeners.size) onLastUnsubscribe?.();
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function createMessageScrollerStore(initialSnapshot, isEqual) {
|
|
56
|
+
return createExternalStore(initialSnapshot, isEqual);
|
|
57
|
+
}
|
|
58
|
+
function createMessageScrollerVisibilityStore() {
|
|
59
|
+
return createExternalStore(external_types_cjs_namespaceObject.EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, areVisibilityStatesEqual);
|
|
60
|
+
}
|
|
61
|
+
function areScrollStatesEqual(current, next) {
|
|
62
|
+
return current.start === next.start && current.end === next.end;
|
|
63
|
+
}
|
|
64
|
+
function areVisibilityStatesEqual(current, next) {
|
|
65
|
+
if (current.currentAnchorId !== next.currentAnchorId) return false;
|
|
66
|
+
if (current.visibleMessageIds.length !== next.visibleMessageIds.length) return false;
|
|
67
|
+
return current.visibleMessageIds.every((messageId, index)=>messageId === next.visibleMessageIds[index]);
|
|
68
|
+
}
|
|
69
|
+
exports.areScrollStatesEqual = __webpack_exports__.areScrollStatesEqual;
|
|
70
|
+
exports.areVisibilityStatesEqual = __webpack_exports__.areVisibilityStatesEqual;
|
|
71
|
+
exports.createMessageScrollerStore = __webpack_exports__.createMessageScrollerStore;
|
|
72
|
+
exports.createMessageScrollerVisibilityStore = __webpack_exports__.createMessageScrollerVisibilityStore;
|
|
73
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
74
|
+
"areScrollStatesEqual",
|
|
75
|
+
"areVisibilityStatesEqual",
|
|
76
|
+
"createMessageScrollerStore",
|
|
77
|
+
"createMessageScrollerVisibilityStore"
|
|
78
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
79
|
+
Object.defineProperty(exports, '__esModule', {
|
|
80
|
+
value: true
|
|
81
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MessageScrollerScrollable, MessageScrollerStore, MessageScrollerVisibilityState, MessageScrollerVisibilityStore } from './types';
|
|
2
|
+
declare function createMessageScrollerStore<T>(initialSnapshot: T, isEqual: (a: T, b: T) => boolean): MessageScrollerStore<T>;
|
|
3
|
+
declare function createMessageScrollerVisibilityStore(): MessageScrollerVisibilityStore;
|
|
4
|
+
declare function areScrollStatesEqual(current: MessageScrollerScrollable, next: MessageScrollerScrollable): boolean;
|
|
5
|
+
declare function areVisibilityStatesEqual(current: MessageScrollerVisibilityState, next: MessageScrollerVisibilityState): boolean;
|
|
6
|
+
export { areScrollStatesEqual, areVisibilityStatesEqual, createMessageScrollerStore, createMessageScrollerVisibilityStore, };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE } from "./types.js";
|
|
2
|
+
function createExternalStore(initialSnapshot, isEqual) {
|
|
3
|
+
let snapshot = initialSnapshot;
|
|
4
|
+
const listeners = new Set();
|
|
5
|
+
return {
|
|
6
|
+
getSnapshot: ()=>snapshot,
|
|
7
|
+
hasListeners: ()=>listeners.size > 0,
|
|
8
|
+
setSnapshot: (nextSnapshot)=>{
|
|
9
|
+
if (isEqual(snapshot, nextSnapshot)) return;
|
|
10
|
+
snapshot = nextSnapshot;
|
|
11
|
+
for (const listener of listeners)listener();
|
|
12
|
+
},
|
|
13
|
+
subscribe: (listener, onFirstSubscribe, onLastUnsubscribe)=>{
|
|
14
|
+
const wasEmpty = 0 === listeners.size;
|
|
15
|
+
listeners.add(listener);
|
|
16
|
+
if (wasEmpty) onFirstSubscribe?.();
|
|
17
|
+
return ()=>{
|
|
18
|
+
listeners.delete(listener);
|
|
19
|
+
if (0 === listeners.size) onLastUnsubscribe?.();
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function createMessageScrollerStore(initialSnapshot, isEqual) {
|
|
25
|
+
return createExternalStore(initialSnapshot, isEqual);
|
|
26
|
+
}
|
|
27
|
+
function createMessageScrollerVisibilityStore() {
|
|
28
|
+
return createExternalStore(EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, areVisibilityStatesEqual);
|
|
29
|
+
}
|
|
30
|
+
function areScrollStatesEqual(current, next) {
|
|
31
|
+
return current.start === next.start && current.end === next.end;
|
|
32
|
+
}
|
|
33
|
+
function areVisibilityStatesEqual(current, next) {
|
|
34
|
+
if (current.currentAnchorId !== next.currentAnchorId) return false;
|
|
35
|
+
if (current.visibleMessageIds.length !== next.visibleMessageIds.length) return false;
|
|
36
|
+
return current.visibleMessageIds.every((messageId, index)=>messageId === next.visibleMessageIds[index]);
|
|
37
|
+
}
|
|
38
|
+
export { areScrollStatesEqual, areVisibilityStatesEqual, createMessageScrollerStore, createMessageScrollerVisibilityStore };
|