tui: show exit message banner (#11733)
This commit is contained in:
@@ -1,23 +1,52 @@
|
|||||||
import { useRenderer } from "@opentui/solid"
|
import { useRenderer } from "@opentui/solid"
|
||||||
import { createSimpleContext } from "./helper"
|
import { createSimpleContext } from "./helper"
|
||||||
import { FormatError, FormatUnknownError } from "@/cli/error"
|
import { FormatError, FormatUnknownError } from "@/cli/error"
|
||||||
|
type Exit = ((reason?: unknown) => Promise<void>) & {
|
||||||
|
message: {
|
||||||
|
set: (value?: string) => () => void
|
||||||
|
clear: () => void
|
||||||
|
get: () => string | undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
|
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
|
||||||
name: "Exit",
|
name: "Exit",
|
||||||
init: (input: { onExit?: () => Promise<void> }) => {
|
init: (input: { onExit?: () => Promise<void> }) => {
|
||||||
const renderer = useRenderer()
|
const renderer = useRenderer()
|
||||||
return async (reason?: any) => {
|
let message: string | undefined
|
||||||
// Reset window title before destroying renderer
|
const store = {
|
||||||
renderer.setTerminalTitle("")
|
set: (value?: string) => {
|
||||||
renderer.destroy()
|
const prev = message
|
||||||
await input.onExit?.()
|
message = value
|
||||||
if (reason) {
|
return () => {
|
||||||
const formatted = FormatError(reason) ?? FormatUnknownError(reason)
|
message = prev
|
||||||
if (formatted) {
|
|
||||||
process.stderr.write(formatted + "\n")
|
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
process.exit(0)
|
clear: () => {
|
||||||
|
message = undefined
|
||||||
|
},
|
||||||
|
get: () => message,
|
||||||
}
|
}
|
||||||
|
const exit: Exit = Object.assign(
|
||||||
|
async (reason?: unknown) => {
|
||||||
|
// Reset window title before destroying renderer
|
||||||
|
renderer.setTerminalTitle("")
|
||||||
|
renderer.destroy()
|
||||||
|
await input.onExit?.()
|
||||||
|
if (reason) {
|
||||||
|
const formatted = FormatError(reason) ?? FormatUnknownError(reason)
|
||||||
|
if (formatted) {
|
||||||
|
process.stderr.write(formatted + "\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const text = store.get()
|
||||||
|
if (text) process.stdout.write(text + "\n")
|
||||||
|
process.exit(0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
message: store,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return exit
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ import { PermissionPrompt } from "./permission"
|
|||||||
import { QuestionPrompt } from "./question"
|
import { QuestionPrompt } from "./question"
|
||||||
import { DialogExportOptions } from "../../ui/dialog-export-options"
|
import { DialogExportOptions } from "../../ui/dialog-export-options"
|
||||||
import { formatTranscript } from "../../util/transcript"
|
import { formatTranscript } from "../../util/transcript"
|
||||||
|
import { UI } from "@/cli/ui.ts"
|
||||||
|
|
||||||
addDefaultParsers(parsers.parsers)
|
addDefaultParsers(parsers.parsers)
|
||||||
|
|
||||||
@@ -222,6 +223,18 @@ export function Session() {
|
|||||||
|
|
||||||
// Allow exit when in child session (prompt is hidden)
|
// Allow exit when in child session (prompt is hidden)
|
||||||
const exit = useExit()
|
const exit = useExit()
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
return exit.message.set(
|
||||||
|
[
|
||||||
|
``,
|
||||||
|
` █▀▀█ ${UI.Style.TEXT_DIM}${session()?.title}${UI.Style.TEXT_NORMAL}`,
|
||||||
|
` █ █ ${UI.Style.TEXT_DIM}opencode -s ${session()?.id}${UI.Style.TEXT_NORMAL}`,
|
||||||
|
` ▀▀▀▀ `,
|
||||||
|
].join("\n"),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
useKeyboard((evt) => {
|
useKeyboard((evt) => {
|
||||||
if (!session()?.parentID) return
|
if (!session()?.parentID) return
|
||||||
if (keybind.match("app_exit", evt)) {
|
if (keybind.match("app_exit", evt)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user