summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-04-03 10:51:07 -0500
committerAdam <[email protected]>2026-04-03 10:51:07 -0500
commita32ffaba35386f46487eb78705636174bbdbdee7 (patch)
tree0882d9e1a513b47530d7d43ee0a7cacd518271e7
parenta4e75a07945b8760a93b256b798e9af38aa7f8b5 (diff)
downloadopencode-a32ffaba35386f46487eb78705636174bbdbdee7.tar.gz
opencode-a32ffaba35386f46487eb78705636174bbdbdee7.zip
fix(app): show correct submit icon when typing follow up
-rw-r--r--packages/app/src/components/prompt-input.tsx50
1 files changed, 29 insertions, 21 deletions
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index ff31c8c2d..e9049ae7e 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -243,23 +243,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
},
)
const working = createMemo(() => status()?.type !== "idle")
- const tip = () => {
- if (working()) {
- return (
- <div class="flex items-center gap-2">
- <span>{language.t("prompt.action.stop")}</span>
- <span class="text-icon-base text-12-medium text-[10px]!">{language.t("common.key.esc")}</span>
- </div>
- )
- }
-
- return (
- <div class="flex items-center gap-2">
- <span>{language.t("prompt.action.send")}</span>
- <Icon name="enter" size="small" class="text-icon-base" />
- </div>
- )
- }
const imageAttachments = createMemo(() =>
prompt.current().filter((part): part is ImageAttachmentPart => part.type === "image"),
)
@@ -297,6 +280,31 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
if (store.mode === "shell") return 0
return prompt.context.items().filter((item) => !!item.comment?.trim()).length
})
+ const blank = createMemo(() => {
+ const text = prompt
+ .current()
+ .map((part) => ("content" in part ? part.content : ""))
+ .join("")
+ return text.trim().length === 0 && imageAttachments().length === 0 && commentCount() === 0
+ })
+ const stopping = createMemo(() => working() && blank())
+ const tip = () => {
+ if (stopping()) {
+ return (
+ <div class="flex items-center gap-2">
+ <span>{language.t("prompt.action.stop")}</span>
+ <span class="text-icon-base text-12-medium text-[10px]!">{language.t("common.key.esc")}</span>
+ </div>
+ )
+ }
+
+ return (
+ <div class="flex items-center gap-2">
+ <span>{language.t("prompt.action.send")}</span>
+ <Icon name="enter" size="small" class="text-icon-base" />
+ </div>
+ )
+ }
const contextItems = createMemo(() => {
const items = prompt.context.items()
@@ -1407,17 +1415,17 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
/>
<div class="flex items-center gap-1 pointer-events-auto">
- <Tooltip placement="top" inactive={!prompt.dirty() && !working()} value={tip()}>
+ <Tooltip placement="top" inactive={!working() && blank()} value={tip()}>
<IconButton
data-action="prompt-submit"
type="submit"
- disabled={store.mode !== "normal" || (!prompt.dirty() && !working() && commentCount() === 0)}
+ disabled={store.mode !== "normal" || (!working() && blank())}
tabIndex={store.mode === "normal" ? undefined : -1}
- icon={working() ? "stop" : "arrow-up"}
+ icon={stopping() ? "stop" : "arrow-up"}
variant="primary"
class="size-8"
style={buttons()}
- aria-label={working() ? language.t("prompt.action.stop") : language.t("prompt.action.send")}
+ aria-label={stopping() ? language.t("prompt.action.stop") : language.t("prompt.action.send")}
/>
</Tooltip>
</div>