fix(ui): resolve toast icon inside the toast component (#34874)

This commit is contained in:
Luke Parker
2026-07-02 15:53:47 +08:00
committed by GitHub
parent 4a42caef2c
commit f52424e05f
2 changed files with 65 additions and 37 deletions
@@ -0,0 +1,26 @@
import { describe, expect, test } from "bun:test"
import { createSignal, type JSX } from "solid-js"
import { showToastV2, toasterV2 } from "@opencode-ai/ui/v2/toast-v2"
describe("showToastV2", () => {
test("creates no reactive computations at call time", () => {
const [tick, setTick] = createSignal(0)
let reads = 0
const icon = (() => {
reads++
tick()
return undefined
}) as unknown as JSX.Element
const id = showToastV2({ description: "test", icon })
// Resolving the icon at call time creates an ownerless computation that is
// never disposed and tracks its dependencies forever; it must only resolve
// once the toast component renders.
expect(reads).toBe(0)
setTick(1)
expect(reads).toBe(0)
toasterV2.dismiss(id)
})
})
+4 -2
View File
@@ -97,8 +97,9 @@ export interface ToastV2Options {
export function showToastV2(options: ToastV2Options | string) { export function showToastV2(options: ToastV2Options | string) {
const opts = typeof options === "string" ? { description: options } : options const opts = typeof options === "string" ? { description: options } : options
return toaster.show((props) => {
const resolvedIcon = children(() => opts.icon) const resolvedIcon = children(() => opts.icon)
return toaster.show((props) => ( return (
<ToastV2 toastId={props.toastId} duration={opts.duration} persistent={opts.persistent}> <ToastV2 toastId={props.toastId} duration={opts.duration} persistent={opts.persistent}>
<div data-slot="toast-v2-header"> <div data-slot="toast-v2-header">
<Show when={resolvedIcon()}> <Show when={resolvedIcon()}>
@@ -134,7 +135,8 @@ export function showToastV2(options: ToastV2Options | string) {
</ToastV2.Actions> </ToastV2.Actions>
</Show> </Show>
</ToastV2> </ToastV2>
)) )
})
} }
export interface ToastV2PromiseOptions<T, U = unknown> { export interface ToastV2PromiseOptions<T, U = unknown> {