This commit is contained in:
Dax Raad 2025-10-14 15:55:18 -04:00
parent 99d5724b06
commit 5bcd9bd3cb
4 changed files with 50 additions and 28 deletions

View file

@ -20,33 +20,31 @@ import { Home } from "@tui/routes/home"
import { Session } from "@tui/routes/session"
import { PromptHistoryProvider } from "./component/prompt/history"
import { DialogAlert } from "./ui/dialog-alert"
import { ExitProvider } from "./context/exit"
export async function tui(input: { url: string; onExit?: () => Promise<void> }) {
await render(
() => {
return (
<RouteProvider>
<SDKProvider url={input.url}>
<SyncProvider>
<LocalProvider>
<KeybindProvider>
<DialogProvider>
<CommandProvider>
<PromptHistoryProvider>
<App
onExit={async () => {
await input.onExit?.()
process.exit(0)
}}
/>
</PromptHistoryProvider>
</CommandProvider>
</DialogProvider>
</KeybindProvider>
</LocalProvider>
</SyncProvider>
</SDKProvider>
</RouteProvider>
<ExitProvider onExit={input.onExit}>
<RouteProvider>
<SDKProvider url={input.url}>
<SyncProvider>
<LocalProvider>
<KeybindProvider>
<DialogProvider>
<CommandProvider>
<PromptHistoryProvider>
<App />
</PromptHistoryProvider>
</CommandProvider>
</DialogProvider>
</KeybindProvider>
</LocalProvider>
</SyncProvider>
</SDKProvider>
</RouteProvider>
</ExitProvider>
)
},
{
@ -58,7 +56,7 @@ export async function tui(input: { url: string; onExit?: () => Promise<void> })
)
}
function App(props: { onExit: () => void }) {
function App() {
const route = useRoute()
const dimensions = useTerminalDimensions()
const renderer = useRenderer()
@ -86,10 +84,6 @@ function App(props: { onExit: () => void }) {
renderer.console.toggle()
return
}
if (keybind.match("app_exit", evt)) {
renderer.destroy()
props.onExit()
}
})
createEffect(() => {

View file

@ -32,6 +32,7 @@ export const { use: usePromptHistory, provider: PromptHistoryProvider } = create
return {
move(direction: 1 | -1) {
const prev = store.index
setStore(
produce((draft) => {
const next = store.index + direction
@ -40,7 +41,7 @@ export const { use: usePromptHistory, provider: PromptHistoryProvider } = create
draft.index = next
}),
)
if (store.index === 0)
if (prev !== 0 && store.index === 0)
return {
input: "",
parts: [],

View file

@ -15,6 +15,7 @@ import { iife } from "@/util/iife"
import { useCommandDialog } from "../dialog-command"
import { useRenderer } from "@opentui/solid"
import { Editor } from "@tui/util/editor"
import { useExit } from "../../context/exit"
export type PromptProps = {
sessionID?: string
@ -197,6 +198,7 @@ export function Prompt(props: PromptProps) {
})
}, 50)
}
const exit = useExit()
return (
<>
@ -260,6 +262,17 @@ export function Prompt(props: PromptProps) {
e.preventDefault()
return
}
if (keybind.match("input_clear", e) && store.prompt.input !== "") {
setStore("prompt", {
input: "",
parts: [],
})
return
}
if (keybind.match("app_exit", e)) {
await exit()
return
}
if (e.name === "!" && input.cursorPosition === 0) {
setStore("mode", "shell")
e.preventDefault()

View file

@ -0,0 +1,14 @@
import { useRenderer } from "@opentui/solid"
import { createSimpleContext } from "./helper"
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
name: "Exit",
init: (input: { onExit?: () => Promise<void> }) => {
const renderer = useRenderer()
return async () => {
renderer.destroy()
await input.onExit?.()
process.exit(0)
}
},
})