MCPcopy Index your code
hub / github.com/codeaashu/claude-code / VirtualMessageList

Function VirtualMessageList

src/components/VirtualMessageList.tsx:289–870  ·  view source on GitHub ↗
({
  messages,
  scrollRef,
  columns,
  itemKey,
  renderItem,
  onItemClick,
  isItemClickable,
  isItemExpanded,
  extractSearchText = defaultExtractSearchText,
  trackStickyPrompt,
  selectedIndex,
  cursorNavRef,
  setCursor,
  jumpRef,
  onSearchMatchesChange,
  scanElement,
  setPositions
}: Props)

Source from the content-addressed store, hash-verified

287 return t10;
288}
289export function VirtualMessageList({
290 messages,
291 scrollRef,
292 columns,
293 itemKey,
294 renderItem,
295 onItemClick,
296 isItemClickable,
297 isItemExpanded,
298 extractSearchText = defaultExtractSearchText,
299 trackStickyPrompt,
300 selectedIndex,
301 cursorNavRef,
302 setCursor,
303 jumpRef,
304 onSearchMatchesChange,
305 scanElement,
306 setPositions
307}: Props): React.ReactNode {
308 // Incremental key array. Streaming appends one message at a time; rebuilding
309 // the full string array on every commit allocates O(n) per message (~1MB
310 // churn at 27k messages). Append-only delta push when the prefix matches;
311 // fall back to full rebuild on compaction, /clear, or itemKey change.
312 const keysRef = useRef<string[]>([]);
313 const prevMessagesRef = useRef<typeof messages>(messages);
314 const prevItemKeyRef = useRef(itemKey);
315 if (prevItemKeyRef.current !== itemKey || messages.length < keysRef.current.length || messages[0] !== prevMessagesRef.current[0]) {
316 keysRef.current = messages.map(m => itemKey(m));
317 } else {
318 for (let i = keysRef.current.length; i < messages.length; i++) {
319 keysRef.current.push(itemKey(messages[i]!));
320 }
321 }
322 prevMessagesRef.current = messages;
323 prevItemKeyRef.current = itemKey;
324 const keys = keysRef.current;
325 const {
326 range,
327 topSpacer,
328 bottomSpacer,
329 measureRef,
330 spacerRef,
331 offsets,
332 getItemTop,
333 getItemElement,
334 getItemHeight,
335 scrollToIndex
336 } = useVirtualScroll(scrollRef, keys, columns);
337 const [start, end] = range;
338
339 // Unmeasured (undefined height) falls through — assume visible.
340 const isVisible = useCallback((i: number) => {
341 const h = getItemHeight(i);
342 if (h === 0) return false;
343 return isNavigableMessage(messages[i]!);
344 }, [getItemHeight, messages]);
345 useImperativeHandle(cursorNavRef, (): MessageActionsNav => {
346 const select = (m: NavigableMessage) => setCursor?.({

Callers

nothing calls this directly

Calls 13

useVirtualScrollFunction · 0.85
isNavigableMessageFunction · 0.85
logForDebuggingFunction · 0.85
targetForFunction · 0.85
jumpFunction · 0.85
maxMethod · 0.80
scanFunction · 0.70
stepFunction · 0.70
extractSearchTextFunction · 0.50
sleepFunction · 0.50
pushMethod · 0.45
scrollToBottomMethod · 0.45

Tested by

no test coverage detected