diff options
| author | Adam <[email protected]> | 2026-02-18 06:31:26 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-18 06:32:35 -0600 |
| commit | 3394402aefecbaa7f7f469344811b4089a2ddb01 (patch) | |
| tree | d139c7ba725e0f3081b98acfb38ac2f9e0578a77 /packages/ui/src/components/basic-tool.tsx | |
| parent | 6cd3a5902260764899a566b33d7f76123b9c9800 (diff) | |
| download | opencode-3394402aefecbaa7f7f469344811b4089a2ddb01.tar.gz opencode-3394402aefecbaa7f7f469344811b4089a2ddb01.zip | |
chore: cleanup
Diffstat (limited to 'packages/ui/src/components/basic-tool.tsx')
| -rw-r--r-- | packages/ui/src/components/basic-tool.tsx | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/packages/ui/src/components/basic-tool.tsx b/packages/ui/src/components/basic-tool.tsx index 5cc4367a6..53bdc9ce1 100644 --- a/packages/ui/src/components/basic-tool.tsx +++ b/packages/ui/src/components/basic-tool.tsx @@ -1,4 +1,4 @@ -import { createEffect, createSignal, For, Match, Show, Switch, type JSX } from "solid-js" +import { createEffect, createSignal, For, Match, on, onCleanup, Show, Switch, type JSX } from "solid-js" import { Collapsible } from "./collapsible" import type { IconProps } from "./icon" import { TextShimmer } from "./text-shimmer" @@ -27,18 +27,52 @@ export interface BasicToolProps { hideDetails?: boolean defaultOpen?: boolean forceOpen?: boolean + defer?: boolean locked?: boolean onSubtitleClick?: () => void } export function BasicTool(props: BasicToolProps) { const [open, setOpen] = createSignal(props.defaultOpen ?? false) + const [ready, setReady] = createSignal(open()) const pending = () => props.status === "pending" || props.status === "running" + let frame: number | undefined + + const cancel = () => { + if (frame === undefined) return + cancelAnimationFrame(frame) + frame = undefined + } + + onCleanup(cancel) + createEffect(() => { if (props.forceOpen) setOpen(true) }) + createEffect( + on( + open, + (value) => { + if (!props.defer) return + if (!value) { + cancel() + setReady(false) + return + } + + cancel() + frame = requestAnimationFrame(() => { + frame = undefined + if (!open()) return + setReady(true) + }) + }, + { defer: true }, + ), + ) + const handleOpenChange = (value: boolean) => { if (pending()) return if (props.locked && !value) return @@ -114,7 +148,9 @@ export function BasicTool(props: BasicToolProps) { </div> </Collapsible.Trigger> <Show when={props.children && !props.hideDetails}> - <Collapsible.Content>{props.children}</Collapsible.Content> + <Collapsible.Content> + <Show when={!props.defer || ready()}>{props.children}</Show> + </Collapsible.Content> </Show> </Collapsible> ) |
