mirror of
https://github.com/sst/opencode.git
synced 2025-12-23 10:11:41 +00:00
exit
This commit is contained in:
parent
99d5724b06
commit
5bcd9bd3cb
4 changed files with 50 additions and 28 deletions
|
|
@ -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(() => {
|
||||
|
|
|
|||
|
|
@ -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: [],
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
14
packages/opencode/src/cli/cmd/tui/context/exit.tsx
Normal file
14
packages/opencode/src/cli/cmd/tui/context/exit.tsx
Normal 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)
|
||||
}
|
||||
},
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue