From 48b2d7c5eec0379493f61d067b21dbab822e40a5 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Sun, 1 Mar 2026 20:14:21 +0000 Subject: [PATCH] refactor(ui): extract virtual-follow-list for message stream --- packages/ui/src/components/message-anchors.ts | 9 + .../ui/src/components/message-block-list.tsx | 75 --- .../ui/src/components/message-section.tsx | 621 ++++-------------- .../ui/src/components/virtual-follow-list.tsx | 573 ++++++++++++++++ packages/ui/src/styles/messaging.css | 2 +- ...block-list.css => virtual-follow-list.css} | 0 6 files changed, 704 insertions(+), 576 deletions(-) create mode 100644 packages/ui/src/components/message-anchors.ts delete mode 100644 packages/ui/src/components/message-block-list.tsx create mode 100644 packages/ui/src/components/virtual-follow-list.tsx rename packages/ui/src/styles/messaging/{message-block-list.css => virtual-follow-list.css} (100%) diff --git a/packages/ui/src/components/message-anchors.ts b/packages/ui/src/components/message-anchors.ts new file mode 100644 index 00000000..266ce5ff --- /dev/null +++ b/packages/ui/src/components/message-anchors.ts @@ -0,0 +1,9 @@ +export const MESSAGE_ANCHOR_PREFIX = "message-anchor-" + +export function getMessageAnchorId(messageId: string) { + return `${MESSAGE_ANCHOR_PREFIX}${messageId}` +} + +export function getMessageIdFromAnchorId(anchorId: string) { + return anchorId.startsWith(MESSAGE_ANCHOR_PREFIX) ? anchorId.slice(MESSAGE_ANCHOR_PREFIX.length) : anchorId +} diff --git a/packages/ui/src/components/message-block-list.tsx b/packages/ui/src/components/message-block-list.tsx deleted file mode 100644 index de5b8890..00000000 --- a/packages/ui/src/components/message-block-list.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { Index, type Accessor } from "solid-js" -import VirtualItem from "./virtual-item" -import MessageBlock from "./message-block" -import type { InstanceMessageStore } from "../stores/message-v2/instance-store" -import type { DeleteHoverState } from "../types/delete-hover" - -export function getMessageAnchorId(messageId: string) { - return `message-anchor-${messageId}` -} - -const VIRTUAL_ITEM_MARGIN_PX = 800 - -interface MessageBlockListProps { - instanceId: string - sessionId: string - store: () => InstanceMessageStore - messageIds: () => string[] - lastAssistantIndex: () => number - showThinking: () => boolean - thinkingDefaultExpanded: () => boolean - showUsageMetrics: () => boolean - scrollContainer: Accessor - loading?: boolean - onRevert?: (messageId: string) => void - onDeleteMessagesUpTo?: (messageId: string) => void | Promise - onFork?: (messageId?: string) => void - onContentRendered?: () => void - deleteHover?: Accessor - onDeleteHoverChange?: (state: DeleteHoverState) => void - selectedMessageIds?: Accessor> - onToggleSelectedMessage?: (messageId: string, selected: boolean) => void - setBottomSentinel: (element: HTMLDivElement | null) => void - suspendMeasurements?: () => boolean -} - -export default function MessageBlockList(props: MessageBlockListProps) { - return ( - <> - - {(messageId, index) => ( - !props.loading} - suspendMeasurements={props.suspendMeasurements} - > - - - )} - -