summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/basic-tool.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-18 06:31:26 -0600
committerAdam <[email protected]>2026-02-18 06:32:35 -0600
commit3394402aefecbaa7f7f469344811b4089a2ddb01 (patch)
treed139c7ba725e0f3081b98acfb38ac2f9e0578a77 /packages/ui/src/components/basic-tool.tsx
parent6cd3a5902260764899a566b33d7f76123b9c9800 (diff)
downloadopencode-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.tsx40
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>
)