import type { Accessor, JSXElement } from "solid-js" import type { ToolState } from "@opencode-ai/sdk" import type { TextPart } from "../../types/message" import { Markdown } from "../markdown" import type { MarkdownRenderOptions, ToolScrollHelpers } from "./types" export function createMarkdownContentRenderer(params: { toolState: Accessor partId: Accessor partVersion?: Accessor instanceId: string sessionId: string isDark: Accessor scrollHelpers: ToolScrollHelpers handleScrollRendered: () => void onContentRendered?: () => void }) { function renderMarkdownContent(options: MarkdownRenderOptions): JSXElement | null { if (!options.content) { return null } const size = options.size || "default" const disableHighlight = options.disableHighlight || false const messageClass = `message-text tool-call-markdown${size === "large" ? " tool-call-markdown-large" : ""}` const disableScrollTracking = options.disableScrollTracking || false const state = params.toolState() const shouldDeferMarkdown = Boolean(state && (state.status === "running" || state.status === "pending") && disableHighlight) if (shouldDeferMarkdown) { return (
params.scrollHelpers.registerContainer(element, { disableTracking: disableScrollTracking })} onScroll={disableScrollTracking ? undefined : params.scrollHelpers.handleScroll} >
{options.content}
{params.scrollHelpers.renderSentinel({ disableTracking: disableScrollTracking })}
) } const cacheKey = typeof options.cacheKey === "string" && options.cacheKey.length > 0 ? options.cacheKey : undefined const markdownPart: TextPart = { id: cacheKey ? `${params.partId()}:${cacheKey}` : params.partId(), type: "text", text: options.content, version: params.partVersion?.(), } const handleMarkdownRendered = () => { params.handleScrollRendered() params.onContentRendered?.() } return (
params.scrollHelpers.registerContainer(element, { disableTracking: disableScrollTracking })} onScroll={disableScrollTracking ? undefined : params.scrollHelpers.handleScroll} > {params.scrollHelpers.renderSentinel({ disableTracking: disableScrollTracking })}
) } return { renderMarkdownContent } }