diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 338b04ba65ab..fcd937d67a87 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -25,6 +25,7 @@ import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { IconButton } from "@opencode-ai/ui/icon-button" import { Select } from "@opencode-ai/ui/select" +import { Spinner } from "@opencode-ai/ui/spinner" import { useDialog } from "@opencode-ai/ui/context/dialog" import { ModelSelectorPopover } from "@/components/dialog-select-model" import { useProviders } from "@/hooks/use-providers" @@ -59,6 +60,7 @@ import { ImagePreview } from "@opencode-ai/ui/image-preview" interface PromptInputProps { class?: string ref?: (el: HTMLDivElement) => void + reverting: boolean newSessionWorktree?: string onNewSessionWorktreeReset?: () => void edit?: { id: string; prompt: Prompt; context: FollowupDraft["context"] } @@ -244,6 +246,17 @@ export const PromptInput: Component = (props) => { ) const working = createMemo(() => status()?.type !== "idle") const tip = () => { + if (props.reverting) { + return ( +
+ + {language.t("common.loading")} + {language.t("common.loading.ellipsis")} + +
+ ) + } + if (working()) { return (
@@ -1080,6 +1093,7 @@ export const PromptInput: Component = (props) => { commentCount, autoAccept: () => accepting(), mode: () => store.mode, + reverting: () => props.reverting, working, editor: () => editorRef, queueScroll, @@ -1244,6 +1258,7 @@ export const PromptInput: Component = (props) => { if (event.key === "Enter" && !event.shiftKey) { event.preventDefault() if (event.repeat) return + if (props.reverting) return if ( working() && prompt @@ -1398,18 +1413,38 @@ export const PromptInput: Component = (props) => { />
- - + + + } + > + +
diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts index b0166c43a80f..278a79f5805d 100644 --- a/packages/app/src/components/prompt-input/submit.test.ts +++ b/packages/app/src/components/prompt-input/submit.test.ts @@ -224,6 +224,7 @@ describe("prompt submit worktree selection", () => { commentCount: () => 0, autoAccept: () => false, mode: () => "shell", + reverting: () => false, working: () => false, editor: () => undefined, queueScroll: () => undefined, @@ -261,6 +262,7 @@ describe("prompt submit worktree selection", () => { commentCount: () => 0, autoAccept: () => true, mode: () => "shell", + reverting: () => false, working: () => false, editor: () => undefined, queueScroll: () => undefined, @@ -291,6 +293,7 @@ describe("prompt submit worktree selection", () => { commentCount: () => 0, autoAccept: () => false, mode: () => "normal", + reverting: () => false, working: () => false, editor: () => undefined, queueScroll: () => undefined, @@ -323,6 +326,7 @@ describe("prompt submit worktree selection", () => { commentCount: () => 0, autoAccept: () => false, mode: () => "normal", + reverting: () => false, working: () => false, editor: () => undefined, queueScroll: () => undefined, diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index ba299fe3650d..858dbb79bedd 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -171,6 +171,7 @@ type PromptSubmitInput = { commentCount: Accessor autoAccept: Accessor mode: Accessor<"normal" | "shell"> + reverting: Accessor working: Accessor editor: () => HTMLDivElement | undefined queueScroll: () => void @@ -283,6 +284,7 @@ export function createPromptSubmit(input: PromptSubmitInput) { const handleSubmit = async (event: Event) => { event.preventDefault() + if (input.reverting()) return const currentPrompt = prompt.current() const text = currentPrompt.map((part) => ("content" in part ? part.content : "")).join("") diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 18bae6e2d0da..e445ccc73a2a 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -1800,6 +1800,7 @@ export default function Page() { state={composer} ready={!store.deferRender && messagesReady()} centered={centered()} + reverting={reverting()} inputRef={(el) => { inputRef = el }} diff --git a/packages/app/src/pages/session/composer/session-composer-region.tsx b/packages/app/src/pages/session/composer/session-composer-region.tsx index a5263cd743ec..7d450aa51a33 100644 --- a/packages/app/src/pages/session/composer/session-composer-region.tsx +++ b/packages/app/src/pages/session/composer/session-composer-region.tsx @@ -18,6 +18,7 @@ export function SessionComposerRegion(props: { state: SessionComposerState ready: boolean centered: boolean + reverting: boolean inputRef: (el: HTMLDivElement) => void newSessionWorktree: string onNewSessionWorktreeReset: () => void @@ -237,6 +238,7 @@ export function SessionComposerRegion(props: {