@assistant-ui/react-native 0.1.40 → 0.1.42

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.
@@ -100,96 +100,111 @@ const useComposedFlatListRef = (forwardedRef) => {
100
100
  return t1;
101
101
  };
102
102
  const useThreadMessagesFlatListAutoScroll = (t0) => {
103
- const $ = c(25);
104
- const { flatListRef, hasMessages, autoScroll: t1, scrollToBottomOnRunStart: t2, scrollToBottomOnInitialize: t3, scrollToBottomOnThreadSwitch: t4 } = t0;
105
- const autoScroll = t1 === void 0 ? true : t1;
106
- const scrollToBottomOnRunStart = t2 === void 0 ? true : t2;
107
- const scrollToBottomOnInitialize = t3 === void 0 ? true : t3;
108
- const scrollToBottomOnThreadSwitch = t4 === void 0 ? true : t4;
109
- let t5;
103
+ const $ = c(29);
104
+ const { flatListRef, hasMessages, horizontal: t1, autoScroll: t2, scrollToBottomOnRunStart: t3, scrollToBottomOnInitialize: t4, scrollToBottomOnThreadSwitch: t5 } = t0;
105
+ const horizontal = t1 === void 0 ? false : t1;
106
+ const autoScroll = t2 === void 0 ? true : t2;
107
+ const scrollToBottomOnRunStart = t3 === void 0 ? true : t3;
108
+ const scrollToBottomOnInitialize = t4 === void 0 ? true : t4;
109
+ const scrollToBottomOnThreadSwitch = t5 === void 0 ? true : t5;
110
+ let t6;
110
111
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
111
- t5 = {
112
+ t6 = {
112
113
  contentHeight: 0,
113
114
  viewportHeight: 0,
114
115
  scrollY: 0
115
116
  };
116
- $[0] = t5;
117
- } else t5 = $[0];
118
- const metricsRef = useRef(t5);
117
+ $[0] = t6;
118
+ } else t6 = $[0];
119
+ const metricsRef = useRef(t6);
119
120
  const isAtBottomRef = useRef(true);
120
- const lastScrollEventYRef = useRef(0);
121
+ const lastScrollEventOffsetRef = useRef(0);
121
122
  const initializeScrollRequestedRef = useRef(false);
123
+ const contentSizeVersionRef = useRef(0);
122
124
  const pendingScrollToBottomRef = useRef(false);
123
- let t6;
125
+ let t7;
124
126
  if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
125
- t6 = () => {
127
+ t7 = () => {
126
128
  const { contentHeight, scrollY, viewportHeight } = metricsRef.current;
127
129
  isAtBottomRef.current = contentHeight <= viewportHeight || contentHeight - scrollY - viewportHeight <= AT_BOTTOM_THRESHOLD;
128
130
  };
129
- $[1] = t6;
130
- } else t6 = $[1];
131
- const updateIsAtBottom = t6;
132
- let t7;
131
+ $[1] = t7;
132
+ } else t7 = $[1];
133
+ const updateIsAtBottom = t7;
134
+ let t8;
133
135
  if ($[2] !== flatListRef) {
134
- t7 = (animated) => {
136
+ t8 = (animated) => {
135
137
  const { contentHeight: contentHeight_0, viewportHeight: viewportHeight_0 } = metricsRef.current;
136
- metricsRef.current.scrollY = Math.max(0, contentHeight_0 - viewportHeight_0);
138
+ const offset = Math.max(0, contentHeight_0 - viewportHeight_0);
139
+ metricsRef.current.scrollY = offset;
137
140
  isAtBottomRef.current = true;
138
- flatListRef.current?.scrollToEnd({ animated });
141
+ flatListRef.current?.scrollToOffset({
142
+ offset,
143
+ animated
144
+ });
139
145
  };
140
146
  $[2] = flatListRef;
141
- $[3] = t7;
142
- } else t7 = $[3];
143
- const scrollToBottom = t7;
144
- let t8;
145
- if ($[4] !== autoScroll || $[5] !== scrollToBottom) {
146
- t8 = (event) => {
147
+ $[3] = t8;
148
+ } else t8 = $[3];
149
+ const scrollToBottom = t8;
150
+ let t9;
151
+ if ($[4] !== autoScroll || $[5] !== horizontal || $[6] !== scrollToBottom) {
152
+ t9 = (event) => {
147
153
  const wasAtBottom = isAtBottomRef.current;
148
154
  const previousViewportHeight = metricsRef.current.viewportHeight;
149
- const viewportHeight_1 = event.nativeEvent.layout.height;
155
+ const viewportHeight_1 = horizontal ? event.nativeEvent.layout.width : event.nativeEvent.layout.height;
150
156
  metricsRef.current.viewportHeight = viewportHeight_1;
151
157
  updateIsAtBottom();
158
+ const pending = pendingScrollToBottomRef.current;
159
+ if (pending && contentSizeVersionRef.current >= pending.minimumContentSizeVersion && viewportHeight_1 > 0) {
160
+ pendingScrollToBottomRef.current = false;
161
+ scrollToBottom(pending.animated);
162
+ return;
163
+ }
152
164
  if (!wasAtBottom) return;
153
- if (autoScroll && previousViewportHeight !== 0 && viewportHeight_1 !== previousViewportHeight) {
154
- const pending = pendingScrollToBottomRef.current;
155
- scrollToBottom(pending ? pending.animated : false);
156
- } else isAtBottomRef.current = true;
165
+ if (autoScroll && previousViewportHeight !== 0 && viewportHeight_1 !== previousViewportHeight) scrollToBottom(pending ? pending.animated : false);
166
+ else isAtBottomRef.current = true;
157
167
  };
158
168
  $[4] = autoScroll;
159
- $[5] = scrollToBottom;
160
- $[6] = t8;
161
- } else t8 = $[6];
162
- const handleLayout = t8;
163
- let t9;
164
- if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
165
- t9 = (event_0) => {
169
+ $[5] = horizontal;
170
+ $[6] = scrollToBottom;
171
+ $[7] = t9;
172
+ } else t9 = $[7];
173
+ const handleLayout = t9;
174
+ let t10;
175
+ if ($[8] !== horizontal) {
176
+ t10 = (event_0) => {
166
177
  const { contentOffset, contentSize, layoutMeasurement } = event_0.nativeEvent;
167
- const previousEventY = lastScrollEventYRef.current;
178
+ const scrollOffset = horizontal ? contentOffset.x : contentOffset.y;
179
+ const previousEventOffset = lastScrollEventOffsetRef.current;
168
180
  const wasPinnedToBottom = isAtBottomRef.current;
169
- lastScrollEventYRef.current = contentOffset.y;
181
+ lastScrollEventOffsetRef.current = scrollOffset;
170
182
  metricsRef.current = {
171
- contentHeight: contentSize.height,
172
- viewportHeight: layoutMeasurement.height,
173
- scrollY: contentOffset.y
183
+ contentHeight: horizontal ? contentSize.width : contentSize.height,
184
+ viewportHeight: horizontal ? layoutMeasurement.width : layoutMeasurement.height,
185
+ scrollY: scrollOffset
174
186
  };
175
187
  updateIsAtBottom();
176
- const upwardMove = contentOffset.y < previousEventY;
188
+ const upwardMove = scrollOffset < previousEventOffset;
177
189
  if (wasPinnedToBottom && !upwardMove) isAtBottomRef.current = true;
178
190
  if (!isAtBottomRef.current && upwardMove) pendingScrollToBottomRef.current = false;
179
191
  };
180
- $[7] = t9;
181
- } else t9 = $[7];
182
- const handleScroll = t9;
183
- let t10;
184
- if ($[8] !== autoScroll || $[9] !== scrollToBottom) {
185
- t10 = (_width, height) => {
192
+ $[8] = horizontal;
193
+ $[9] = t10;
194
+ } else t10 = $[9];
195
+ const handleScroll = t10;
196
+ let t11;
197
+ if ($[10] !== autoScroll || $[11] !== horizontal || $[12] !== scrollToBottom) {
198
+ t11 = (width, height) => {
186
199
  const metrics = metricsRef.current;
200
+ const contentHeight_1 = horizontal ? width : height;
187
201
  const previousContentHeight = metrics.contentHeight;
188
202
  const wasAtBottom_0 = isAtBottomRef.current;
189
- metrics.contentHeight = height;
203
+ if (contentHeight_1 > 0) contentSizeVersionRef.current = contentSizeVersionRef.current + 1;
204
+ metrics.contentHeight = contentHeight_1;
190
205
  updateIsAtBottom();
191
206
  const pendingScroll = pendingScrollToBottomRef.current;
192
- if (pendingScroll) {
207
+ if (pendingScroll && contentSizeVersionRef.current >= pendingScroll.minimumContentSizeVersion && metrics.viewportHeight > 0) {
193
208
  pendingScrollToBottomRef.current = false;
194
209
  scrollToBottom(pendingScroll.animated);
195
210
  return;
@@ -197,18 +212,19 @@ const useThreadMessagesFlatListAutoScroll = (t0) => {
197
212
  if (!autoScroll) return;
198
213
  if (!wasAtBottom_0) return;
199
214
  if (previousContentHeight === 0) return;
200
- if (height <= previousContentHeight) return;
215
+ if (contentHeight_1 <= previousContentHeight) return;
201
216
  scrollToBottom(false);
202
217
  };
203
- $[8] = autoScroll;
204
- $[9] = scrollToBottom;
205
- $[10] = t10;
206
- } else t10 = $[10];
207
- const handleContentSizeChange = t10;
208
- let t11;
218
+ $[10] = autoScroll;
219
+ $[11] = horizontal;
220
+ $[12] = scrollToBottom;
221
+ $[13] = t11;
222
+ } else t11 = $[13];
223
+ const handleContentSizeChange = t11;
209
224
  let t12;
210
- if ($[11] !== hasMessages || $[12] !== scrollToBottom || $[13] !== scrollToBottomOnInitialize) {
211
- t11 = () => {
225
+ let t13;
226
+ if ($[14] !== hasMessages || $[15] !== scrollToBottom || $[16] !== scrollToBottomOnInitialize) {
227
+ t12 = () => {
212
228
  if (!scrollToBottomOnInitialize) return;
213
229
  if (!hasMessages) {
214
230
  initializeScrollRequestedRef.current = false;
@@ -216,65 +232,75 @@ const useThreadMessagesFlatListAutoScroll = (t0) => {
216
232
  }
217
233
  if (initializeScrollRequestedRef.current) return;
218
234
  initializeScrollRequestedRef.current = true;
219
- pendingScrollToBottomRef.current = { animated: false };
235
+ pendingScrollToBottomRef.current = {
236
+ animated: false,
237
+ minimumContentSizeVersion: Math.max(1, contentSizeVersionRef.current)
238
+ };
220
239
  scrollToBottom(false);
221
240
  };
222
- t12 = [
241
+ t13 = [
223
242
  hasMessages,
224
243
  scrollToBottom,
225
244
  scrollToBottomOnInitialize
226
245
  ];
227
- $[11] = hasMessages;
228
- $[12] = scrollToBottom;
229
- $[13] = scrollToBottomOnInitialize;
230
- $[14] = t11;
231
- $[15] = t12;
246
+ $[14] = hasMessages;
247
+ $[15] = scrollToBottom;
248
+ $[16] = scrollToBottomOnInitialize;
249
+ $[17] = t12;
250
+ $[18] = t13;
232
251
  } else {
233
- t11 = $[14];
234
- t12 = $[15];
252
+ t12 = $[17];
253
+ t13 = $[18];
235
254
  }
236
- useEffect(t11, t12);
237
- let t13;
238
- if ($[16] !== scrollToBottom || $[17] !== scrollToBottomOnRunStart) {
239
- t13 = () => {
240
- if (!scrollToBottomOnRunStart) return;
241
- pendingScrollToBottomRef.current = { animated: true };
242
- scrollToBottom(true);
243
- };
244
- $[16] = scrollToBottom;
245
- $[17] = scrollToBottomOnRunStart;
246
- $[18] = t13;
247
- } else t13 = $[18];
248
- useAuiEvent("thread.runStart", t13);
255
+ useEffect(t12, t13);
249
256
  let t14;
250
- if ($[19] !== scrollToBottom || $[20] !== scrollToBottomOnThreadSwitch) {
257
+ if ($[19] !== scrollToBottom || $[20] !== scrollToBottomOnRunStart) {
251
258
  t14 = () => {
252
- if (!scrollToBottomOnThreadSwitch) return;
253
- initializeScrollRequestedRef.current = false;
254
- lastScrollEventYRef.current = 0;
255
- pendingScrollToBottomRef.current = { animated: false };
256
- scrollToBottom(false);
259
+ if (!scrollToBottomOnRunStart) return;
260
+ pendingScrollToBottomRef.current = {
261
+ animated: true,
262
+ minimumContentSizeVersion: contentSizeVersionRef.current + 1
263
+ };
264
+ scrollToBottom(true);
257
265
  };
258
266
  $[19] = scrollToBottom;
259
- $[20] = scrollToBottomOnThreadSwitch;
267
+ $[20] = scrollToBottomOnRunStart;
260
268
  $[21] = t14;
261
269
  } else t14 = $[21];
262
- useAuiEvent("threads.selectionChanged", t14);
270
+ useAuiEvent("thread.runStart", t14);
263
271
  let t15;
264
- if ($[22] !== handleContentSizeChange || $[23] !== handleLayout) {
265
- t15 = {
272
+ if ($[22] !== scrollToBottom || $[23] !== scrollToBottomOnThreadSwitch) {
273
+ t15 = () => {
274
+ if (!scrollToBottomOnThreadSwitch) return;
275
+ initializeScrollRequestedRef.current = false;
276
+ lastScrollEventOffsetRef.current = 0;
277
+ pendingScrollToBottomRef.current = {
278
+ animated: false,
279
+ minimumContentSizeVersion: contentSizeVersionRef.current + 1
280
+ };
281
+ scrollToBottom(false);
282
+ };
283
+ $[22] = scrollToBottom;
284
+ $[23] = scrollToBottomOnThreadSwitch;
285
+ $[24] = t15;
286
+ } else t15 = $[24];
287
+ useAuiEvent("threads.selectionChanged", t15);
288
+ let t16;
289
+ if ($[25] !== handleContentSizeChange || $[26] !== handleLayout || $[27] !== handleScroll) {
290
+ t16 = {
266
291
  handleLayout,
267
292
  handleScroll,
268
293
  handleContentSizeChange
269
294
  };
270
- $[22] = handleContentSizeChange;
271
- $[23] = handleLayout;
272
- $[24] = t15;
273
- } else t15 = $[24];
274
- return t15;
295
+ $[25] = handleContentSizeChange;
296
+ $[26] = handleLayout;
297
+ $[27] = handleScroll;
298
+ $[28] = t16;
299
+ } else t16 = $[28];
300
+ return t16;
275
301
  };
276
302
  const ThreadMessagesFlatList = forwardRef((t0, forwardedRef) => {
277
- const $ = c(46);
303
+ const $ = c(48);
278
304
  let autoScroll;
279
305
  let children;
280
306
  let components;
@@ -317,26 +343,28 @@ const ThreadMessagesFlatList = forwardRef((t0, forwardedRef) => {
317
343
  const [flatListRef, setFlatListRef] = useComposedFlatListRef(forwardedRef);
318
344
  const t1 = messages.length > 0;
319
345
  let t2;
320
- if ($[12] !== autoScroll || $[13] !== flatListRef || $[14] !== scrollToBottomOnInitialize || $[15] !== scrollToBottomOnRunStart || $[16] !== scrollToBottomOnThreadSwitch || $[17] !== t1) {
346
+ if ($[12] !== autoScroll || $[13] !== flatListProps.horizontal || $[14] !== flatListRef || $[15] !== scrollToBottomOnInitialize || $[16] !== scrollToBottomOnRunStart || $[17] !== scrollToBottomOnThreadSwitch || $[18] !== t1) {
321
347
  t2 = {
322
348
  flatListRef,
323
349
  hasMessages: t1,
350
+ horizontal: flatListProps.horizontal,
324
351
  autoScroll,
325
352
  scrollToBottomOnInitialize,
326
353
  scrollToBottomOnRunStart,
327
354
  scrollToBottomOnThreadSwitch
328
355
  };
329
356
  $[12] = autoScroll;
330
- $[13] = flatListRef;
331
- $[14] = scrollToBottomOnInitialize;
332
- $[15] = scrollToBottomOnRunStart;
333
- $[16] = scrollToBottomOnThreadSwitch;
334
- $[17] = t1;
335
- $[18] = t2;
336
- } else t2 = $[18];
357
+ $[13] = flatListProps.horizontal;
358
+ $[14] = flatListRef;
359
+ $[15] = scrollToBottomOnInitialize;
360
+ $[16] = scrollToBottomOnRunStart;
361
+ $[17] = scrollToBottomOnThreadSwitch;
362
+ $[18] = t1;
363
+ $[19] = t2;
364
+ } else t2 = $[19];
337
365
  const { handleContentSizeChange: handleAutoScrollContentSizeChange, handleLayout: handleAutoScrollLayout, handleScroll: handleAutoScrollScroll } = useThreadMessagesFlatListAutoScroll(t2);
338
366
  let t3;
339
- if ($[19] !== children || $[20] !== components) {
367
+ if ($[20] !== children || $[21] !== components) {
340
368
  t3 = (t4) => {
341
369
  const { index } = t4;
342
370
  if (children) return /* @__PURE__ */ jsx(ThreadMessageByChildren, {
@@ -348,50 +376,55 @@ const ThreadMessagesFlatList = forwardRef((t0, forwardedRef) => {
348
376
  components
349
377
  });
350
378
  };
351
- $[19] = children;
352
- $[20] = components;
353
- $[21] = t3;
354
- } else t3 = $[21];
379
+ $[20] = children;
380
+ $[21] = components;
381
+ $[22] = t3;
382
+ } else t3 = $[22];
355
383
  const renderItem = t3;
356
384
  const keyExtractor = _temp4;
357
385
  const scrollTracking = (autoScroll ?? true) || (scrollToBottomOnInitialize ?? true) || (scrollToBottomOnRunStart ?? true) || (scrollToBottomOnThreadSwitch ?? true);
358
386
  let t4;
359
- if ($[22] !== handleAutoScrollLayout || $[23] !== onLayout) {
387
+ if ($[23] !== handleAutoScrollLayout || $[24] !== onLayout) {
360
388
  t4 = (event) => {
361
389
  handleAutoScrollLayout(event);
362
390
  onLayout?.(event);
363
391
  };
364
- $[22] = handleAutoScrollLayout;
365
- $[23] = onLayout;
366
- $[24] = t4;
367
- } else t4 = $[24];
392
+ $[23] = handleAutoScrollLayout;
393
+ $[24] = onLayout;
394
+ $[25] = t4;
395
+ } else t4 = $[25];
368
396
  const handleLayout = t4;
369
397
  let t5;
370
- if ($[25] !== handleAutoScrollScroll || $[26] !== onScroll) {
398
+ if ($[26] !== handleAutoScrollScroll || $[27] !== onScroll) {
371
399
  t5 = (event_0) => {
372
400
  handleAutoScrollScroll(event_0);
373
401
  onScroll?.(event_0);
374
402
  };
375
- $[25] = handleAutoScrollScroll;
376
- $[26] = onScroll;
377
- $[27] = t5;
378
- } else t5 = $[27];
403
+ $[26] = handleAutoScrollScroll;
404
+ $[27] = onScroll;
405
+ $[28] = t5;
406
+ } else t5 = $[28];
379
407
  const handleScroll = t5;
380
408
  let t6;
381
- if ($[28] !== handleAutoScrollContentSizeChange || $[29] !== onContentSizeChange) {
409
+ if ($[29] !== handleAutoScrollContentSizeChange || $[30] !== onContentSizeChange) {
382
410
  t6 = (width, height) => {
383
411
  handleAutoScrollContentSizeChange(width, height);
384
412
  onContentSizeChange?.(width, height);
385
413
  };
386
- $[28] = handleAutoScrollContentSizeChange;
387
- $[29] = onContentSizeChange;
388
- $[30] = t6;
389
- } else t6 = $[30];
414
+ $[29] = handleAutoScrollContentSizeChange;
415
+ $[30] = onContentSizeChange;
416
+ $[31] = t6;
417
+ } else t6 = $[31];
390
418
  const handleContentSizeChange = t6;
391
419
  const t7 = messages;
392
420
  let t8;
393
- if ($[31] !== handleContentSizeChange || $[32] !== handleLayout || $[33] !== handleScroll || $[34] !== onContentSizeChange || $[35] !== onLayout || $[36] !== onScroll || $[37] !== scrollEventThrottle || $[38] !== scrollTracking) {
394
- t8 = scrollTracking ? {
421
+ if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
422
+ t8 = { minIndexForVisible: 0 };
423
+ $[32] = t8;
424
+ } else t8 = $[32];
425
+ let t9;
426
+ if ($[33] !== handleContentSizeChange || $[34] !== handleLayout || $[35] !== handleScroll || $[36] !== onContentSizeChange || $[37] !== onLayout || $[38] !== onScroll || $[39] !== scrollEventThrottle || $[40] !== scrollTracking) {
427
+ t9 = scrollTracking ? {
395
428
  onContentSizeChange: handleContentSizeChange,
396
429
  onLayout: handleLayout,
397
430
  onScroll: handleScroll,
@@ -402,34 +435,35 @@ const ThreadMessagesFlatList = forwardRef((t0, forwardedRef) => {
402
435
  ...onScroll && { onScroll },
403
436
  ...scrollEventThrottle !== void 0 && { scrollEventThrottle }
404
437
  };
405
- $[31] = handleContentSizeChange;
406
- $[32] = handleLayout;
407
- $[33] = handleScroll;
408
- $[34] = onContentSizeChange;
409
- $[35] = onLayout;
410
- $[36] = onScroll;
411
- $[37] = scrollEventThrottle;
412
- $[38] = scrollTracking;
413
- $[39] = t8;
414
- } else t8 = $[39];
415
- let t9;
416
- if ($[40] !== flatListProps || $[41] !== renderItem || $[42] !== setFlatListRef || $[43] !== t7 || $[44] !== t8) {
417
- t9 = /* @__PURE__ */ jsx(FlatList, {
438
+ $[33] = handleContentSizeChange;
439
+ $[34] = handleLayout;
440
+ $[35] = handleScroll;
441
+ $[36] = onContentSizeChange;
442
+ $[37] = onLayout;
443
+ $[38] = onScroll;
444
+ $[39] = scrollEventThrottle;
445
+ $[40] = scrollTracking;
446
+ $[41] = t9;
447
+ } else t9 = $[41];
448
+ let t10;
449
+ if ($[42] !== flatListProps || $[43] !== renderItem || $[44] !== setFlatListRef || $[45] !== t7 || $[46] !== t9) {
450
+ t10 = /* @__PURE__ */ jsx(FlatList, {
418
451
  ref: setFlatListRef,
419
452
  data: t7,
420
453
  renderItem,
421
454
  keyExtractor,
422
- ...t8,
455
+ maintainVisibleContentPosition: t8,
456
+ ...t9,
423
457
  ...flatListProps
424
458
  });
425
- $[40] = flatListProps;
426
- $[41] = renderItem;
427
- $[42] = setFlatListRef;
428
- $[43] = t7;
429
- $[44] = t8;
430
- $[45] = t9;
431
- } else t9 = $[45];
432
- return t9;
459
+ $[42] = flatListProps;
460
+ $[43] = renderItem;
461
+ $[44] = setFlatListRef;
462
+ $[45] = t7;
463
+ $[46] = t9;
464
+ $[47] = t10;
465
+ } else t10 = $[47];
466
+ return t10;
433
467
  });
434
468
  ThreadMessagesFlatList.displayName = "ThreadPrimitive.MessagesFlatList";
435
469
  /** @deprecated Use ThreadPrimitive.MessagesFlatList instead. */
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadMessages.js","names":["ComponentType","FC","ForwardedRef","ReactNode","RefObject","forwardRef","memo","useCallback","useEffect","useRef","FlatList","FlatListProps","LayoutChangeEvent","NativeScrollEvent","NativeSyntheticEvent","MessageState","ThreadMessage","RenderChildrenWithAccessor","useAuiEvent","useAuiState","MessageByIndexProvider","MessageComponents","Message","EditComposer","UserEditComposer","AssistantEditComposer","SystemEditComposer","UserMessage","AssistantMessage","SystemMessage","MessagesContent","components","children","value","message","ThreadMessagesFlatListProps","Omit","autoScroll","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","ThreadMessagesProps","DEFAULT_SYSTEM_MESSAGE","AT_BOTTOM_THRESHOLD","getComponent","role","isEditing","_exhaustiveCheck","Error","ThreadMessageComponent","t0","$","_c","_temp","_temp2","t1","Component","t2","ThreadMessageByIndex","index","prev","next","displayName","ThreadMessageByChildren","aui","thread","getState","getItem","setForwardedRef","ref","T","current","useComposedFlatListRef","forwardedRef","flatListRef","node","setFlatListRef","const","useThreadMessagesFlatListAutoScroll","hasMessages","t3","t4","undefined","t5","Symbol","for","contentHeight","viewportHeight","scrollY","metricsRef","isAtBottomRef","lastScrollEventYRef","initializeScrollRequestedRef","pendingScrollToBottomRef","t6","updateIsAtBottom","t7","animated","contentHeight_0","viewportHeight_0","Math","max","scrollToEnd","scrollToBottom","t8","event","wasAtBottom","previousViewportHeight","viewportHeight_1","nativeEvent","layout","height","pending","handleLayout","t9","event_0","contentOffset","contentSize","layoutMeasurement","previousEventY","wasPinnedToBottom","y","upwardMove","handleScroll","t10","_width","metrics","previousContentHeight","wasAtBottom_0","pendingScroll","handleContentSizeChange","t11","t12","t13","t14","t15","ThreadMessagesFlatList","flatListProps","onContentSizeChange","onLayout","onScroll","scrollEventThrottle","messages","_temp3","length","handleAutoScrollContentSizeChange","handleAutoScrollLayout","handleAutoScrollScroll","renderItem","keyExtractor","_temp4","scrollTracking","width","ThreadMessages","props","s","s_0","composer","item","id"],"sources":["../../../src/primitives/thread/ThreadMessages.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ForwardedRef,\n type ReactNode,\n type RefObject,\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport {\n FlatList,\n type FlatListProps,\n type LayoutChangeEvent,\n type NativeScrollEvent,\n type NativeSyntheticEvent,\n} from \"react-native\";\nimport type { MessageState, ThreadMessage } from \"@assistant-ui/core\";\nimport {\n RenderChildrenWithAccessor,\n useAuiEvent,\n useAuiState,\n} from \"@assistant-ui/store\";\nimport { MessageByIndexProvider } from \"@assistant-ui/core/react\";\n\ntype MessageComponents =\n | {\n Message: ComponentType;\n EditComposer?: ComponentType | undefined;\n UserEditComposer?: ComponentType | undefined;\n AssistantEditComposer?: ComponentType | undefined;\n SystemEditComposer?: ComponentType | undefined;\n UserMessage?: ComponentType | undefined;\n AssistantMessage?: ComponentType | undefined;\n SystemMessage?: ComponentType | undefined;\n }\n | {\n Message?: ComponentType | undefined;\n EditComposer?: ComponentType | undefined;\n UserEditComposer?: ComponentType | undefined;\n AssistantEditComposer?: ComponentType | undefined;\n SystemEditComposer?: ComponentType | undefined;\n UserMessage: ComponentType;\n AssistantMessage: ComponentType;\n SystemMessage?: ComponentType | undefined;\n };\n\ntype MessagesContent =\n | {\n /** @deprecated Use the children render function instead. */\n components: MessageComponents;\n children?: never;\n }\n | {\n children: (value: { message: MessageState }) => ReactNode;\n components?: never;\n };\n\nexport type ThreadMessagesFlatListProps = Omit<\n FlatListProps<ThreadMessage>,\n \"data\" | \"renderItem\" | \"children\"\n> &\n MessagesContent & {\n autoScroll?: boolean | undefined;\n scrollToBottomOnRunStart?: boolean | undefined;\n scrollToBottomOnInitialize?: boolean | undefined;\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n\n/** @deprecated Use ThreadMessagesFlatListProps instead. */\nexport type ThreadMessagesProps = ThreadMessagesFlatListProps;\n\nconst DEFAULT_SYSTEM_MESSAGE = () => null;\nconst AT_BOTTOM_THRESHOLD = 4;\n\nconst getComponent = (\n components: MessageComponents,\n role: ThreadMessage[\"role\"],\n isEditing: boolean,\n) => {\n switch (role) {\n case \"user\":\n if (isEditing) {\n return (\n components.UserEditComposer ??\n components.EditComposer ??\n components.UserMessage ??\n (components.Message as ComponentType)\n );\n } else {\n return components.UserMessage ?? (components.Message as ComponentType);\n }\n case \"assistant\":\n if (isEditing) {\n return (\n components.AssistantEditComposer ??\n components.EditComposer ??\n components.AssistantMessage ??\n (components.Message as ComponentType)\n );\n } else {\n return (\n components.AssistantMessage ?? (components.Message as ComponentType)\n );\n }\n case \"system\":\n if (isEditing) {\n return (\n components.SystemEditComposer ??\n components.EditComposer ??\n components.SystemMessage ??\n (components.Message as ComponentType) ??\n DEFAULT_SYSTEM_MESSAGE\n );\n } else {\n return (\n components.SystemMessage ??\n (components.Message as ComponentType) ??\n DEFAULT_SYSTEM_MESSAGE\n );\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unknown message role: ${_exhaustiveCheck}`);\n }\n }\n};\n\nconst ThreadMessageComponent: FC<{ components: MessageComponents }> = ({\n components,\n}) => {\n const role = useAuiState((s) => s.message.role);\n const isEditing = useAuiState((s) => s.message.composer.isEditing);\n const Component = getComponent(components, role, isEditing);\n\n return <Component />;\n};\n\nconst ThreadMessageByIndex = memo(\n ({ index, components }: { index: number; components: MessageComponents }) => {\n return (\n <MessageByIndexProvider index={index}>\n <ThreadMessageComponent components={components} />\n </MessageByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index && prev.components === next.components,\n);\nThreadMessageByIndex.displayName = \"ThreadPrimitive.MessageByIndex\";\n\nconst ThreadMessageByChildren = memo(\n ({\n index,\n children,\n }: {\n index: number;\n children: (value: { message: MessageState }) => ReactNode;\n }) => {\n return (\n <MessageByIndexProvider index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) => aui.thread.message({ index }).getState()}\n >\n {(getItem) =>\n children({\n get message() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </MessageByIndexProvider>\n );\n },\n (prev, next) => prev.index === next.index && prev.children === next.children,\n);\nThreadMessageByChildren.displayName = \"ThreadPrimitive.MessageByChildren\";\n\nconst setForwardedRef = <T,>(ref: ForwardedRef<T>, value: T | null) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst useComposedFlatListRef = (\n forwardedRef: ForwardedRef<FlatList<ThreadMessage>>,\n) => {\n const flatListRef = useRef<FlatList<ThreadMessage> | null>(null);\n\n const setFlatListRef = useCallback(\n (node: FlatList<ThreadMessage> | null) => {\n flatListRef.current = node;\n setForwardedRef(forwardedRef, node);\n },\n [forwardedRef],\n );\n\n return [flatListRef, setFlatListRef] as const;\n};\n\nconst useThreadMessagesFlatListAutoScroll = ({\n flatListRef,\n hasMessages,\n autoScroll = true,\n scrollToBottomOnRunStart = true,\n scrollToBottomOnInitialize = true,\n scrollToBottomOnThreadSwitch = true,\n}: {\n flatListRef: RefObject<FlatList<ThreadMessage> | null>;\n hasMessages: boolean;\n autoScroll?: boolean | undefined;\n scrollToBottomOnRunStart?: boolean | undefined;\n scrollToBottomOnInitialize?: boolean | undefined;\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n}) => {\n const metricsRef = useRef({\n contentHeight: 0,\n viewportHeight: 0,\n scrollY: 0,\n });\n const isAtBottomRef = useRef(true);\n const lastScrollEventYRef = useRef(0);\n const initializeScrollRequestedRef = useRef(false);\n const pendingScrollToBottomRef = useRef<false | { animated: boolean }>(false);\n\n const updateIsAtBottom = useCallback(() => {\n const { contentHeight, scrollY, viewportHeight } = metricsRef.current;\n isAtBottomRef.current =\n contentHeight <= viewportHeight ||\n contentHeight - scrollY - viewportHeight <= AT_BOTTOM_THRESHOLD;\n }, []);\n\n // Commanding a scroll records the intended position immediately; the\n // native scroll echo is bridged and throttled, so waiting for it lets a\n // fast stream observe stale metrics and drop out of following.\n const scrollToBottom = useCallback(\n (animated: boolean) => {\n const { contentHeight, viewportHeight } = metricsRef.current;\n metricsRef.current.scrollY = Math.max(0, contentHeight - viewportHeight);\n isAtBottomRef.current = true;\n flatListRef.current?.scrollToEnd({ animated });\n },\n [flatListRef],\n );\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const wasAtBottom = isAtBottomRef.current;\n const previousViewportHeight = metricsRef.current.viewportHeight;\n const viewportHeight = event.nativeEvent.layout.height;\n metricsRef.current.viewportHeight = viewportHeight;\n updateIsAtBottom();\n if (!wasAtBottom) return;\n // Layout changes are never user gestures, so they must not unpin. Past\n // the first measurement, a viewport change while pinned re-commands the\n // bottom position, since no content-size event follows a bare keyboard\n // open or close.\n if (\n autoScroll &&\n previousViewportHeight !== 0 &&\n viewportHeight !== previousViewportHeight\n ) {\n const pending = pendingScrollToBottomRef.current;\n scrollToBottom(pending ? pending.animated : false);\n } else {\n isAtBottomRef.current = true;\n }\n },\n [autoScroll, scrollToBottom, updateIsAtBottom],\n );\n\n const handleScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const { contentOffset, contentSize, layoutMeasurement } =\n event.nativeEvent;\n const previousEventY = lastScrollEventYRef.current;\n const wasPinnedToBottom = isAtBottomRef.current;\n lastScrollEventYRef.current = contentOffset.y;\n metricsRef.current = {\n contentHeight: contentSize.height,\n viewportHeight: layoutMeasurement.height,\n scrollY: contentOffset.y,\n };\n updateIsAtBottom();\n const upwardMove = contentOffset.y < previousEventY;\n // Only a deliberate upward move unpins or cancels a pending scroll.\n // Gestures are detected echo-to-echo because a commanded scroll\n // optimistically moves the tracked position ahead of its ascending\n // animation echoes, and those echoes must not unpin mid-flight.\n if (wasPinnedToBottom && !upwardMove) {\n isAtBottomRef.current = true;\n }\n if (!isAtBottomRef.current && upwardMove) {\n pendingScrollToBottomRef.current = false;\n }\n },\n [updateIsAtBottom],\n );\n\n const handleContentSizeChange = useCallback(\n (_width: number, height: number) => {\n const metrics = metricsRef.current;\n const previousContentHeight = metrics.contentHeight;\n const wasAtBottom = isAtBottomRef.current;\n metrics.contentHeight = height;\n updateIsAtBottom();\n\n // FlatList.scrollToEnd is a no-op before the list has measured, so the\n // initialize and thread-switch scrolls land on the next content-size\n // event, once real metrics exist.\n const pendingScroll = pendingScrollToBottomRef.current;\n if (pendingScroll) {\n pendingScrollToBottomRef.current = false;\n scrollToBottom(pendingScroll.animated);\n return;\n }\n\n if (!autoScroll) return;\n if (!wasAtBottom) return;\n if (previousContentHeight === 0) return;\n if (height <= previousContentHeight) return;\n\n scrollToBottom(false);\n },\n [autoScroll, scrollToBottom, updateIsAtBottom],\n );\n\n useEffect(() => {\n if (!scrollToBottomOnInitialize) return;\n if (!hasMessages) {\n initializeScrollRequestedRef.current = false;\n return;\n }\n if (initializeScrollRequestedRef.current) return;\n\n initializeScrollRequestedRef.current = true;\n pendingScrollToBottomRef.current = { animated: false };\n scrollToBottom(false);\n }, [hasMessages, scrollToBottom, scrollToBottomOnInitialize]);\n\n useAuiEvent(\"thread.runStart\", () => {\n if (!scrollToBottomOnRunStart) return;\n pendingScrollToBottomRef.current = { animated: true };\n scrollToBottom(true);\n });\n\n useAuiEvent(\"threads.selectionChanged\", () => {\n if (!scrollToBottomOnThreadSwitch) return;\n initializeScrollRequestedRef.current = false;\n lastScrollEventYRef.current = 0;\n pendingScrollToBottomRef.current = { animated: false };\n scrollToBottom(false);\n });\n\n return {\n handleLayout,\n handleScroll,\n handleContentSizeChange,\n };\n};\n\nexport const ThreadMessagesFlatList = forwardRef<\n FlatList<ThreadMessage>,\n ThreadMessagesFlatListProps\n>(\n (\n {\n autoScroll,\n components,\n children,\n onContentSizeChange,\n onLayout,\n onScroll,\n scrollEventThrottle,\n scrollToBottomOnInitialize,\n scrollToBottomOnRunStart,\n scrollToBottomOnThreadSwitch,\n ...flatListProps\n },\n forwardedRef,\n ) => {\n const messages = useAuiState((s) => s.thread.messages);\n const [flatListRef, setFlatListRef] = useComposedFlatListRef(forwardedRef);\n const {\n handleContentSizeChange: handleAutoScrollContentSizeChange,\n handleLayout: handleAutoScrollLayout,\n handleScroll: handleAutoScrollScroll,\n } = useThreadMessagesFlatListAutoScroll({\n flatListRef,\n hasMessages: messages.length > 0,\n autoScroll,\n scrollToBottomOnInitialize,\n scrollToBottomOnRunStart,\n scrollToBottomOnThreadSwitch,\n });\n\n const renderItem = useCallback(\n ({ index }: { item: ThreadMessage; index: number }) => {\n if (children) {\n return (\n <ThreadMessageByChildren index={index}>\n {children}\n </ThreadMessageByChildren>\n );\n }\n return <ThreadMessageByIndex index={index} components={components!} />;\n },\n [components, children],\n );\n\n const keyExtractor = useCallback((item: ThreadMessage) => item.id, []);\n\n const scrollTracking =\n (autoScroll ?? true) ||\n (scrollToBottomOnInitialize ?? true) ||\n (scrollToBottomOnRunStart ?? true) ||\n (scrollToBottomOnThreadSwitch ?? true);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n handleAutoScrollLayout(event);\n onLayout?.(event);\n },\n [handleAutoScrollLayout, onLayout],\n );\n\n const handleScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n handleAutoScrollScroll(event);\n onScroll?.(event);\n },\n [handleAutoScrollScroll, onScroll],\n );\n\n const handleContentSizeChange = useCallback(\n (width: number, height: number) => {\n handleAutoScrollContentSizeChange(width, height);\n onContentSizeChange?.(width, height);\n },\n [handleAutoScrollContentSizeChange, onContentSizeChange],\n );\n\n return (\n <FlatList\n ref={setFlatListRef}\n data={messages as unknown as ThreadMessage[]}\n renderItem={renderItem}\n keyExtractor={keyExtractor}\n {...(scrollTracking\n ? {\n onContentSizeChange: handleContentSizeChange,\n onLayout: handleLayout,\n onScroll: handleScroll,\n scrollEventThrottle: scrollEventThrottle ?? 16,\n }\n : {\n ...(onContentSizeChange && { onContentSizeChange }),\n ...(onLayout && { onLayout }),\n ...(onScroll && { onScroll }),\n ...(scrollEventThrottle !== undefined && { scrollEventThrottle }),\n })}\n {...flatListProps}\n />\n );\n },\n);\nThreadMessagesFlatList.displayName = \"ThreadPrimitive.MessagesFlatList\";\n\n/** @deprecated Use ThreadPrimitive.MessagesFlatList instead. */\nexport const ThreadMessages = forwardRef<\n FlatList<ThreadMessage>,\n ThreadMessagesProps\n>(\n (\n {\n autoScroll = false,\n scrollToBottomOnInitialize = false,\n scrollToBottomOnRunStart = false,\n scrollToBottomOnThreadSwitch = false,\n ...props\n },\n ref,\n ) => (\n <ThreadMessagesFlatList\n ref={ref}\n autoScroll={autoScroll}\n scrollToBottomOnInitialize={scrollToBottomOnInitialize}\n scrollToBottomOnRunStart={scrollToBottomOnRunStart}\n scrollToBottomOnThreadSwitch={scrollToBottomOnThreadSwitch}\n {...props}\n />\n ),\n);\nThreadMessages.displayName = \"ThreadPrimitive.Messages\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadMessages.js","names":["ComponentType","FC","ForwardedRef","ReactNode","RefObject","forwardRef","memo","useCallback","useEffect","useRef","FlatList","FlatListProps","LayoutChangeEvent","NativeScrollEvent","NativeSyntheticEvent","MessageState","ThreadMessage","RenderChildrenWithAccessor","useAuiEvent","useAuiState","MessageByIndexProvider","MessageComponents","Message","EditComposer","UserEditComposer","AssistantEditComposer","SystemEditComposer","UserMessage","AssistantMessage","SystemMessage","MessagesContent","components","children","value","message","ThreadMessagesFlatListProps","Omit","autoScroll","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","ThreadMessagesProps","DEFAULT_SYSTEM_MESSAGE","AT_BOTTOM_THRESHOLD","getComponent","role","isEditing","_exhaustiveCheck","Error","ThreadMessageComponent","t0","$","_c","_temp","_temp2","t1","Component","t2","ThreadMessageByIndex","index","prev","next","displayName","ThreadMessageByChildren","aui","thread","getState","getItem","setForwardedRef","ref","T","current","useComposedFlatListRef","forwardedRef","flatListRef","node","setFlatListRef","const","useThreadMessagesFlatListAutoScroll","hasMessages","horizontal","t3","t4","t5","undefined","t6","Symbol","for","contentHeight","viewportHeight","scrollY","metricsRef","isAtBottomRef","lastScrollEventOffsetRef","initializeScrollRequestedRef","contentSizeVersionRef","pendingScrollToBottomRef","t7","updateIsAtBottom","t8","animated","contentHeight_0","viewportHeight_0","offset","Math","max","scrollToOffset","scrollToBottom","t9","event","wasAtBottom","previousViewportHeight","viewportHeight_1","nativeEvent","layout","width","height","pending","minimumContentSizeVersion","handleLayout","t10","event_0","contentOffset","contentSize","layoutMeasurement","scrollOffset","x","y","previousEventOffset","wasPinnedToBottom","upwardMove","handleScroll","t11","metrics","contentHeight_1","previousContentHeight","wasAtBottom_0","pendingScroll","handleContentSizeChange","t12","t13","t14","t15","t16","ThreadMessagesFlatList","flatListProps","onContentSizeChange","onLayout","onScroll","scrollEventThrottle","messages","_temp3","length","handleAutoScrollContentSizeChange","handleAutoScrollLayout","handleAutoScrollScroll","renderItem","keyExtractor","_temp4","scrollTracking","minIndexForVisible","ThreadMessages","props","s","s_0","composer","item","id"],"sources":["../../../src/primitives/thread/ThreadMessages.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ForwardedRef,\n type ReactNode,\n type RefObject,\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport {\n FlatList,\n type FlatListProps,\n type LayoutChangeEvent,\n type NativeScrollEvent,\n type NativeSyntheticEvent,\n} from \"react-native\";\nimport type { MessageState, ThreadMessage } from \"@assistant-ui/core\";\nimport {\n RenderChildrenWithAccessor,\n useAuiEvent,\n useAuiState,\n} from \"@assistant-ui/store\";\nimport { MessageByIndexProvider } from \"@assistant-ui/core/react\";\n\ntype MessageComponents =\n | {\n Message: ComponentType;\n EditComposer?: ComponentType | undefined;\n UserEditComposer?: ComponentType | undefined;\n AssistantEditComposer?: ComponentType | undefined;\n SystemEditComposer?: ComponentType | undefined;\n UserMessage?: ComponentType | undefined;\n AssistantMessage?: ComponentType | undefined;\n SystemMessage?: ComponentType | undefined;\n }\n | {\n Message?: ComponentType | undefined;\n EditComposer?: ComponentType | undefined;\n UserEditComposer?: ComponentType | undefined;\n AssistantEditComposer?: ComponentType | undefined;\n SystemEditComposer?: ComponentType | undefined;\n UserMessage: ComponentType;\n AssistantMessage: ComponentType;\n SystemMessage?: ComponentType | undefined;\n };\n\ntype MessagesContent =\n | {\n /** @deprecated Use the children render function instead. */\n components: MessageComponents;\n children?: never;\n }\n | {\n children: (value: { message: MessageState }) => ReactNode;\n components?: never;\n };\n\nexport type ThreadMessagesFlatListProps = Omit<\n FlatListProps<ThreadMessage>,\n \"data\" | \"renderItem\" | \"children\"\n> &\n MessagesContent & {\n autoScroll?: boolean | undefined;\n scrollToBottomOnRunStart?: boolean | undefined;\n scrollToBottomOnInitialize?: boolean | undefined;\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n\n/** @deprecated Use ThreadMessagesFlatListProps instead. */\nexport type ThreadMessagesProps = ThreadMessagesFlatListProps;\n\nconst DEFAULT_SYSTEM_MESSAGE = () => null;\nconst AT_BOTTOM_THRESHOLD = 4;\n\nconst getComponent = (\n components: MessageComponents,\n role: ThreadMessage[\"role\"],\n isEditing: boolean,\n) => {\n switch (role) {\n case \"user\":\n if (isEditing) {\n return (\n components.UserEditComposer ??\n components.EditComposer ??\n components.UserMessage ??\n (components.Message as ComponentType)\n );\n } else {\n return components.UserMessage ?? (components.Message as ComponentType);\n }\n case \"assistant\":\n if (isEditing) {\n return (\n components.AssistantEditComposer ??\n components.EditComposer ??\n components.AssistantMessage ??\n (components.Message as ComponentType)\n );\n } else {\n return (\n components.AssistantMessage ?? (components.Message as ComponentType)\n );\n }\n case \"system\":\n if (isEditing) {\n return (\n components.SystemEditComposer ??\n components.EditComposer ??\n components.SystemMessage ??\n (components.Message as ComponentType) ??\n DEFAULT_SYSTEM_MESSAGE\n );\n } else {\n return (\n components.SystemMessage ??\n (components.Message as ComponentType) ??\n DEFAULT_SYSTEM_MESSAGE\n );\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unknown message role: ${_exhaustiveCheck}`);\n }\n }\n};\n\nconst ThreadMessageComponent: FC<{ components: MessageComponents }> = ({\n components,\n}) => {\n const role = useAuiState((s) => s.message.role);\n const isEditing = useAuiState((s) => s.message.composer.isEditing);\n const Component = getComponent(components, role, isEditing);\n\n return <Component />;\n};\n\nconst ThreadMessageByIndex = memo(\n ({ index, components }: { index: number; components: MessageComponents }) => {\n return (\n <MessageByIndexProvider index={index}>\n <ThreadMessageComponent components={components} />\n </MessageByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index && prev.components === next.components,\n);\nThreadMessageByIndex.displayName = \"ThreadPrimitive.MessageByIndex\";\n\nconst ThreadMessageByChildren = memo(\n ({\n index,\n children,\n }: {\n index: number;\n children: (value: { message: MessageState }) => ReactNode;\n }) => {\n return (\n <MessageByIndexProvider index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) => aui.thread.message({ index }).getState()}\n >\n {(getItem) =>\n children({\n get message() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </MessageByIndexProvider>\n );\n },\n (prev, next) => prev.index === next.index && prev.children === next.children,\n);\nThreadMessageByChildren.displayName = \"ThreadPrimitive.MessageByChildren\";\n\nconst setForwardedRef = <T,>(ref: ForwardedRef<T>, value: T | null) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n};\n\nconst useComposedFlatListRef = (\n forwardedRef: ForwardedRef<FlatList<ThreadMessage>>,\n) => {\n const flatListRef = useRef<FlatList<ThreadMessage> | null>(null);\n\n const setFlatListRef = useCallback(\n (node: FlatList<ThreadMessage> | null) => {\n flatListRef.current = node;\n setForwardedRef(forwardedRef, node);\n },\n [forwardedRef],\n );\n\n return [flatListRef, setFlatListRef] as const;\n};\n\nconst useThreadMessagesFlatListAutoScroll = ({\n flatListRef,\n hasMessages,\n horizontal = false,\n autoScroll = true,\n scrollToBottomOnRunStart = true,\n scrollToBottomOnInitialize = true,\n scrollToBottomOnThreadSwitch = true,\n}: {\n flatListRef: RefObject<FlatList<ThreadMessage> | null>;\n hasMessages: boolean;\n horizontal?: boolean | null | undefined;\n autoScroll?: boolean | undefined;\n scrollToBottomOnRunStart?: boolean | undefined;\n scrollToBottomOnInitialize?: boolean | undefined;\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n}) => {\n const metricsRef = useRef({\n contentHeight: 0,\n viewportHeight: 0,\n scrollY: 0,\n });\n const isAtBottomRef = useRef(true);\n const lastScrollEventOffsetRef = useRef(0);\n const initializeScrollRequestedRef = useRef(false);\n const contentSizeVersionRef = useRef(0);\n const pendingScrollToBottomRef = useRef<\n | false\n | {\n animated: boolean;\n minimumContentSizeVersion: number;\n }\n >(false);\n\n const updateIsAtBottom = useCallback(() => {\n const { contentHeight, scrollY, viewportHeight } = metricsRef.current;\n isAtBottomRef.current =\n contentHeight <= viewportHeight ||\n contentHeight - scrollY - viewportHeight <= AT_BOTTOM_THRESHOLD;\n }, []);\n\n // Commanding a scroll records the intended position immediately; the\n // native scroll echo is bridged and throttled, so waiting for it lets a\n // fast stream observe stale metrics and drop out of following.\n const scrollToBottom = useCallback(\n (animated: boolean) => {\n const { contentHeight, viewportHeight } = metricsRef.current;\n const offset = Math.max(0, contentHeight - viewportHeight);\n metricsRef.current.scrollY = offset;\n isAtBottomRef.current = true;\n flatListRef.current?.scrollToOffset({ offset, animated });\n },\n [flatListRef],\n );\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const wasAtBottom = isAtBottomRef.current;\n const previousViewportHeight = metricsRef.current.viewportHeight;\n const viewportHeight = horizontal\n ? event.nativeEvent.layout.width\n : event.nativeEvent.layout.height;\n metricsRef.current.viewportHeight = viewportHeight;\n updateIsAtBottom();\n const pending = pendingScrollToBottomRef.current;\n if (\n pending &&\n contentSizeVersionRef.current >= pending.minimumContentSizeVersion &&\n viewportHeight > 0\n ) {\n pendingScrollToBottomRef.current = false;\n scrollToBottom(pending.animated);\n return;\n }\n if (!wasAtBottom) return;\n // Layout changes are never user gestures, so they must not unpin. Past\n // the first measurement, a viewport change while pinned re-commands the\n // bottom position, since no content-size event follows a bare keyboard\n // open or close.\n if (\n autoScroll &&\n previousViewportHeight !== 0 &&\n viewportHeight !== previousViewportHeight\n ) {\n scrollToBottom(pending ? pending.animated : false);\n } else {\n isAtBottomRef.current = true;\n }\n },\n [autoScroll, horizontal, scrollToBottom, updateIsAtBottom],\n );\n\n const handleScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const { contentOffset, contentSize, layoutMeasurement } =\n event.nativeEvent;\n const scrollOffset = horizontal ? contentOffset.x : contentOffset.y;\n const previousEventOffset = lastScrollEventOffsetRef.current;\n const wasPinnedToBottom = isAtBottomRef.current;\n lastScrollEventOffsetRef.current = scrollOffset;\n metricsRef.current = {\n contentHeight: horizontal ? contentSize.width : contentSize.height,\n viewportHeight: horizontal\n ? layoutMeasurement.width\n : layoutMeasurement.height,\n scrollY: scrollOffset,\n };\n updateIsAtBottom();\n const upwardMove = scrollOffset < previousEventOffset;\n // Only a deliberate upward move unpins or cancels a pending scroll.\n // Gestures are detected echo-to-echo because a commanded scroll\n // optimistically moves the tracked position ahead of its ascending\n // animation echoes, and those echoes must not unpin mid-flight.\n if (wasPinnedToBottom && !upwardMove) {\n isAtBottomRef.current = true;\n }\n if (!isAtBottomRef.current && upwardMove) {\n pendingScrollToBottomRef.current = false;\n }\n },\n [horizontal, updateIsAtBottom],\n );\n\n const handleContentSizeChange = useCallback(\n (width: number, height: number) => {\n const metrics = metricsRef.current;\n const contentHeight = horizontal ? width : height;\n const previousContentHeight = metrics.contentHeight;\n const wasAtBottom = isAtBottomRef.current;\n if (contentHeight > 0) contentSizeVersionRef.current += 1;\n metrics.contentHeight = contentHeight;\n updateIsAtBottom();\n\n // Initialize and thread-switch requests are repeated after the list has\n // measured so the explicit bottom offset uses real content metrics.\n const pendingScroll = pendingScrollToBottomRef.current;\n if (\n pendingScroll &&\n contentSizeVersionRef.current >=\n pendingScroll.minimumContentSizeVersion &&\n metrics.viewportHeight > 0\n ) {\n pendingScrollToBottomRef.current = false;\n scrollToBottom(pendingScroll.animated);\n return;\n }\n\n if (!autoScroll) return;\n if (!wasAtBottom) return;\n if (previousContentHeight === 0) return;\n if (contentHeight <= previousContentHeight) return;\n\n scrollToBottom(false);\n },\n [autoScroll, horizontal, scrollToBottom, updateIsAtBottom],\n );\n\n useEffect(() => {\n if (!scrollToBottomOnInitialize) return;\n if (!hasMessages) {\n initializeScrollRequestedRef.current = false;\n return;\n }\n if (initializeScrollRequestedRef.current) return;\n\n initializeScrollRequestedRef.current = true;\n pendingScrollToBottomRef.current = {\n animated: false,\n minimumContentSizeVersion: Math.max(1, contentSizeVersionRef.current),\n };\n scrollToBottom(false);\n }, [hasMessages, scrollToBottom, scrollToBottomOnInitialize]);\n\n useAuiEvent(\"thread.runStart\", () => {\n if (!scrollToBottomOnRunStart) return;\n pendingScrollToBottomRef.current = {\n animated: true,\n minimumContentSizeVersion: contentSizeVersionRef.current + 1,\n };\n scrollToBottom(true);\n });\n\n useAuiEvent(\"threads.selectionChanged\", () => {\n if (!scrollToBottomOnThreadSwitch) return;\n initializeScrollRequestedRef.current = false;\n lastScrollEventOffsetRef.current = 0;\n pendingScrollToBottomRef.current = {\n animated: false,\n minimumContentSizeVersion: contentSizeVersionRef.current + 1,\n };\n scrollToBottom(false);\n });\n\n return {\n handleLayout,\n handleScroll,\n handleContentSizeChange,\n };\n};\n\nexport const ThreadMessagesFlatList = forwardRef<\n FlatList<ThreadMessage>,\n ThreadMessagesFlatListProps\n>(\n (\n {\n autoScroll,\n components,\n children,\n onContentSizeChange,\n onLayout,\n onScroll,\n scrollEventThrottle,\n scrollToBottomOnInitialize,\n scrollToBottomOnRunStart,\n scrollToBottomOnThreadSwitch,\n ...flatListProps\n },\n forwardedRef,\n ) => {\n const messages = useAuiState((s) => s.thread.messages);\n const [flatListRef, setFlatListRef] = useComposedFlatListRef(forwardedRef);\n const {\n handleContentSizeChange: handleAutoScrollContentSizeChange,\n handleLayout: handleAutoScrollLayout,\n handleScroll: handleAutoScrollScroll,\n } = useThreadMessagesFlatListAutoScroll({\n flatListRef,\n hasMessages: messages.length > 0,\n horizontal: flatListProps.horizontal,\n autoScroll,\n scrollToBottomOnInitialize,\n scrollToBottomOnRunStart,\n scrollToBottomOnThreadSwitch,\n });\n\n const renderItem = useCallback(\n ({ index }: { item: ThreadMessage; index: number }) => {\n if (children) {\n return (\n <ThreadMessageByChildren index={index}>\n {children}\n </ThreadMessageByChildren>\n );\n }\n return <ThreadMessageByIndex index={index} components={components!} />;\n },\n [components, children],\n );\n\n const keyExtractor = useCallback((item: ThreadMessage) => item.id, []);\n\n const scrollTracking =\n (autoScroll ?? true) ||\n (scrollToBottomOnInitialize ?? true) ||\n (scrollToBottomOnRunStart ?? true) ||\n (scrollToBottomOnThreadSwitch ?? true);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n handleAutoScrollLayout(event);\n onLayout?.(event);\n },\n [handleAutoScrollLayout, onLayout],\n );\n\n const handleScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n handleAutoScrollScroll(event);\n onScroll?.(event);\n },\n [handleAutoScrollScroll, onScroll],\n );\n\n const handleContentSizeChange = useCallback(\n (width: number, height: number) => {\n handleAutoScrollContentSizeChange(width, height);\n onContentSizeChange?.(width, height);\n },\n [handleAutoScrollContentSizeChange, onContentSizeChange],\n );\n\n return (\n <FlatList\n ref={setFlatListRef}\n data={messages as unknown as ThreadMessage[]}\n renderItem={renderItem}\n keyExtractor={keyExtractor}\n maintainVisibleContentPosition={{ minIndexForVisible: 0 }}\n {...(scrollTracking\n ? {\n onContentSizeChange: handleContentSizeChange,\n onLayout: handleLayout,\n onScroll: handleScroll,\n scrollEventThrottle: scrollEventThrottle ?? 16,\n }\n : {\n ...(onContentSizeChange && { onContentSizeChange }),\n ...(onLayout && { onLayout }),\n ...(onScroll && { onScroll }),\n ...(scrollEventThrottle !== undefined && { scrollEventThrottle }),\n })}\n {...flatListProps}\n />\n );\n },\n);\nThreadMessagesFlatList.displayName = \"ThreadPrimitive.MessagesFlatList\";\n\n/** @deprecated Use ThreadPrimitive.MessagesFlatList instead. */\nexport const ThreadMessages = forwardRef<\n FlatList<ThreadMessage>,\n ThreadMessagesProps\n>(\n (\n {\n autoScroll = false,\n scrollToBottomOnInitialize = false,\n scrollToBottomOnRunStart = false,\n scrollToBottomOnThreadSwitch = false,\n ...props\n },\n ref,\n ) => (\n <ThreadMessagesFlatList\n ref={ref}\n autoScroll={autoScroll}\n scrollToBottomOnInitialize={scrollToBottomOnInitialize}\n scrollToBottomOnRunStart={scrollToBottomOnRunStart}\n scrollToBottomOnThreadSwitch={scrollToBottomOnThreadSwitch}\n {...props}\n />\n ),\n);\nThreadMessages.displayName = \"ThreadPrimitive.Messages\";\n"],"mappings":"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"}