Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 112c58a

Browse files
committed
tui: refactor dialog system to use single active dialog instead of stack
1 parent 0dce517 commit 112c58a

11 files changed

Lines changed: 78 additions & 104 deletions

File tree

packages/desktop/src/components/dialog-connect-provider.tsx

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,18 @@ export function DialogConnectProvider(props: { provider: string }) {
108108

109109
async function complete() {
110110
await globalSDK.client.global.dispose()
111-
setTimeout(() => {
112-
showToast({
113-
variant: "success",
114-
icon: "circle-check",
115-
title: `${provider().name} connected`,
116-
description: `${provider().name} models are now available to use.`,
117-
})
118-
dialog.replace(() => <DialogSelectModel provider={props.provider} />)
119-
}, 1000)
111+
dialog.close()
112+
showToast({
113+
variant: "success",
114+
icon: "circle-check",
115+
title: `${provider().name} connected`,
116+
description: `${provider().name} models are now available to use.`,
117+
})
120118
}
121119

122120
function goBack() {
123121
if (methods().length === 1) {
124-
dialog.replace(() => <DialogSelectProvider />)
122+
dialog.show(() => <DialogSelectProvider />)
125123
return
126124
}
127125
if (store.authorization) {
@@ -133,7 +131,7 @@ export function DialogConnectProvider(props: { provider: string }) {
133131
setStore("methodIndex", undefined)
134132
return
135133
}
136-
dialog.replace(() => <DialogSelectProvider />)
134+
dialog.show(() => <DialogSelectProvider />)
137135
}
138136

139137
return (
@@ -352,7 +350,7 @@ export function DialogConnectProvider(props: { provider: string }) {
352350
})
353351
if (result.error) {
354352
// TODO: show error
355-
dialog.clear()
353+
dialog.close()
356354
return
357355
}
358356
await complete()

packages/desktop/src/components/dialog-select-file.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export function DialogSelectFile() {
2727
if (path) {
2828
tabs().open("file://" + path)
2929
}
30-
dialog.clear()
30+
dialog.close()
3131
}}
3232
>
3333
{(i) => (

packages/desktop/src/components/dialog-select-model-unpaid.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const DialogSelectModelUnpaid: Component = () => {
4242
local.model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined, {
4343
recent: true,
4444
})
45-
dialog.clear()
45+
dialog.close()
4646
}}
4747
>
4848
{(i) => (
@@ -75,7 +75,7 @@ export const DialogSelectModelUnpaid: Component = () => {
7575
}}
7676
onSelect={(x) => {
7777
if (!x) return
78-
dialog.replace(() => <DialogConnectProvider provider={x.id} />)
78+
dialog.show(() => <DialogConnectProvider provider={x.id} />)
7979
}}
8080
>
8181
{(i) => (
@@ -105,7 +105,7 @@ export const DialogSelectModelUnpaid: Component = () => {
105105
class="w-full justify-start px-[11px] py-3.5 gap-4.5 text-14-medium"
106106
icon="dot-grid"
107107
onClick={() => {
108-
dialog.replace(() => <DialogSelectProvider />)
108+
dialog.show(() => <DialogSelectProvider />)
109109
}}
110110
>
111111
View all providers

packages/desktop/src/components/dialog-select-model.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const DialogSelectModel: Component<{ provider?: string }> = (props) => {
2828
class="h-7 -my-1 text-14-medium"
2929
icon="plus-small"
3030
tabIndex={-1}
31-
onClick={() => dialog.replace(() => <DialogSelectProvider />)}
31+
onClick={() => dialog.show(() => <DialogSelectProvider />)}
3232
>
3333
Connect provider
3434
</Button>
@@ -57,7 +57,7 @@ export const DialogSelectModel: Component<{ provider?: string }> = (props) => {
5757
local.model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined, {
5858
recent: true,
5959
})
60-
dialog.clear()
60+
dialog.close()
6161
}}
6262
>
6363
{(i) => (
@@ -75,7 +75,7 @@ export const DialogSelectModel: Component<{ provider?: string }> = (props) => {
7575
<Button
7676
variant="ghost"
7777
class="ml-3 mt-5 mb-6 text-text-base self-start"
78-
onClick={() => dialog.replace(() => <DialogManageModels />)}
78+
onClick={() => dialog.show(() => <DialogManageModels />)}
7979
>
8080
Manage models
8181
</Button>

packages/desktop/src/components/dialog-select-provider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const DialogSelectProvider: Component = () => {
3434
}}
3535
onSelect={(x) => {
3636
if (!x) return
37-
dialog.replace(() => <DialogConnectProvider provider={x.id} />)
37+
dialog.show(() => <DialogConnectProvider provider={x.id} />)
3838
}}
3939
>
4040
{(i) => (

packages/desktop/src/components/prompt-input.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -864,9 +864,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
864864
as="div"
865865
variant="ghost"
866866
onClick={() =>
867-
dialog.replace(() =>
868-
providers.paid().length > 0 ? <DialogSelectModel /> : <DialogSelectModelUnpaid />,
869-
)
867+
dialog.show(() => (providers.paid().length > 0 ? <DialogSelectModel /> : <DialogSelectModelUnpaid />))
870868
}
871869
>
872870
{local.model.current()?.name ?? "Select model"}

packages/desktop/src/context/command.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function DialogCommand(props: { options: CommandOption[] }) {
128128
groupBy={(x) => x.category ?? ""}
129129
onSelect={(option) => {
130130
if (option) {
131-
dialog.clear()
131+
dialog.close()
132132
option.onSelect?.("palette")
133133
}
134134
}}
@@ -174,8 +174,8 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex
174174
const suspended = () => suspendCount() > 0
175175

176176
const showPalette = () => {
177-
if (dialog.stack.length === 0) {
178-
dialog.replace(() => <DialogCommand options={options().filter((x) => !x.disabled)} />)
177+
if (!dialog.active) {
178+
dialog.show(() => <DialogCommand options={options().filter((x) => !x.disabled)} />)
179179
}
180180
}
181181

packages/desktop/src/context/notification.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
5959
time: Date.now(),
6060
viewed: false,
6161
}
62-
switch (event?.type) {
62+
switch (event.type) {
6363
case "session.idle": {
6464
const sessionID = event.properties.sessionID
6565
const [syncStore] = globalSync.child(directory)

packages/desktop/src/pages/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export default function Layout(props: ParentProps) {
217217
])
218218

219219
function connectProvider() {
220-
dialog.replace(() => <DialogSelectProvider />)
220+
dialog.show(() => <DialogSelectProvider />)
221221
}
222222

223223
function navigateToProject(directory: string | undefined) {

packages/desktop/src/pages/session.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ export default function Page() {
176176
category: "File",
177177
keybind: "mod+p",
178178
slash: "open",
179-
onSelect: () => dialog.replace(() => <DialogSelectFile />),
179+
onSelect: () => dialog.show(() => <DialogSelectFile />),
180180
},
181181
// {
182182
// id: "theme.toggle",
@@ -245,7 +245,7 @@ export default function Page() {
245245
category: "Model",
246246
keybind: "mod+'",
247247
slash: "model",
248-
onSelect: () => dialog.replace(() => <DialogSelectModel />),
248+
onSelect: () => dialog.show(() => <DialogSelectModel />),
249249
},
250250
{
251251
id: "agent.cycle",
@@ -320,7 +320,7 @@ export default function Page() {
320320

321321
const handleKeyDown = (event: KeyboardEvent) => {
322322
if ((document.activeElement as HTMLElement)?.dataset?.component === "terminal") return
323-
if (dialog.stack.length > 0) return
323+
if (dialog.active) return
324324

325325
if (event.key === "PageUp" || event.key === "PageDown") {
326326
const scrollContainer = document.querySelector('[data-slot="session-turn-content"]') as HTMLElement
@@ -613,7 +613,7 @@ export default function Page() {
613613
icon="plus-small"
614614
variant="ghost"
615615
iconSize="large"
616-
onClick={() => dialog.replace(() => <DialogSelectFile />)}
616+
onClick={() => dialog.show(() => <DialogSelectFile />)}
617617
/>
618618
</Tooltip>
619619
</div>

0 commit comments

Comments
 (0)