|
|
@@ -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>
|