diff options
| author | Adam <[email protected]> | 2026-04-03 10:51:07 -0500 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-04-03 10:51:07 -0500 |
| commit | a32ffaba35386f46487eb78705636174bbdbdee7 (patch) | |
| tree | 0882d9e1a513b47530d7d43ee0a7cacd518271e7 | |
| parent | a4e75a07945b8760a93b256b798e9af38aa7f8b5 (diff) | |
| download | opencode-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.tsx | 50 |
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> |
