diff --git a/packages/desktop/src/components/prompt-input.tsx b/packages/desktop/src/components/prompt-input.tsx index 840710152..f2821c3c7 100644 --- a/packages/desktop/src/components/prompt-input.tsx +++ b/packages/desktop/src/components/prompt-input.tsx @@ -864,7 +864,9 @@ export const PromptInput: Component = (props) => { as="div" variant="ghost" onClick={() => - dialog.push(() => (providers.paid().length > 0 ? : )) + dialog.replace(() => + providers.paid().length > 0 ? : , + ) } > {local.model.current()?.name ?? "Select model"} diff --git a/packages/desktop/src/context/notification.tsx b/packages/desktop/src/context/notification.tsx index 9843066ea..839ebfad7 100644 --- a/packages/desktop/src/context/notification.tsx +++ b/packages/desktop/src/context/notification.tsx @@ -58,6 +58,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi time: Date.now(), viewed: false, } + console.log(event) switch (event.type) { case "session.idle": { const sessionID = event.properties.sessionID diff --git a/packages/ui/src/context/dialog.tsx b/packages/ui/src/context/dialog.tsx index fae0c57b4..50e41c596 100644 --- a/packages/ui/src/context/dialog.tsx +++ b/packages/ui/src/context/dialog.tsx @@ -1,7 +1,9 @@ import { createContext, + createEffect, createMemo, createSignal, + For, getOwner, Owner, ParentProps, @@ -11,6 +13,7 @@ import { type JSX, } from "solid-js" import { Dialog as Kobalte } from "@kobalte/core/dialog" +import { iife } from "@opencode-ai/util/iife" type DialogElement = () => JSX.Element @@ -25,23 +28,49 @@ function init() { }[] >([]) - return { + const result = { get stack() { return store() }, - push(element: DialogElement, owner: Owner, onClose?: () => void) { - setStore((s) => [...s, { element, onClose, owner }]) - }, pop() { const current = store().at(-1) + if (!current) return current?.onClose?.() - setStore((stack) => stack.slice(0, -1)) + setStore((stack) => { + stack.pop() + return [...stack] + }) }, replace(element: DialogElement, owner: Owner, onClose?: () => void) { for (const item of store()) { item.onClose?.() } - setStore([{ element, onClose, owner }]) + setStore([ + { + element: () => + runWithOwner(owner, () => ( + + { + if (!open) { + onClose?.() + result.pop() + } + }} + > + + + {element()} + + + + )), + onClose, + owner, + }, + ]) }, clear() { for (const item of store()) { @@ -50,38 +79,16 @@ function init() { setStore([]) }, } + return result } export function DialogProvider(props: ParentProps) { const ctx = init() - const last = createMemo(() => ctx.stack.at(-1)) return ( {props.children}
- - {(item) => - runWithOwner(item().owner, () => { - return ( - { - if (!open) { - item().onClose?.() - ctx.pop() - } - }} - > - - - {item().element()} - - - ) - }) - } - + {(item) => <>{item.element()}}
) @@ -103,9 +110,6 @@ export function useDialog() { replace(element: DialogElement, onClose?: () => void) { ctx.replace(element, owner, onClose) }, - push(element: DialogElement, onClose?: () => void) { - ctx.push(element, owner, onClose) - }, pop() { ctx.pop() },