harryagasi
fix: stabilize analysis chat rendering and traceability
f18b03d
Raw
History Blame Contribute Delete
2.18 kB
import { useState } from "react";
import { Loader2, Send } from "lucide-react";
import { HelpSkillButton } from "./HelpSkillButton";
interface ChatInputProps {
disabled?: boolean;
streaming?: boolean;
onSend: (message: string) => void;
onHelp: () => void;
}
export function ChatInput({ disabled, streaming, onSend, onHelp }: ChatInputProps) {
const [message, setMessage] = useState("");
const canSend = message.trim().length > 0 && !disabled && !streaming;
const submit = (event: React.FormEvent) => {
event.preventDefault();
if (!canSend) return;
onSend(message.trim());
setMessage("");
};
return (
<form onSubmit={submit} className="flex-shrink-0 border-t border-slate-200 bg-white p-4">
<div className="mx-auto flex max-w-5xl flex-col gap-2 sm:flex-row sm:items-end">
<textarea
aria-label="Chat message"
value={message}
onChange={(event) => setMessage(event.target.value)}
onKeyDown={(event) => {
if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault();
submit(event);
}
}}
disabled={disabled || streaming}
rows={2}
placeholder="Ask the agent about this analysis"
className="min-h-10 min-w-0 flex-1 resize-none rounded-md border border-slate-200 bg-white px-3 py-2 text-sm leading-6 text-slate-900 outline-none transition placeholder:text-slate-400 focus:border-emerald-500 focus:ring-2 focus:ring-emerald-100 disabled:bg-slate-50"
/>
<div className="flex gap-2">
<HelpSkillButton disabled={disabled || streaming} onClick={onHelp} />
<button
type="submit"
aria-label="Send message"
disabled={!canSend}
className="inline-flex h-10 items-center gap-2 rounded-md bg-emerald-600 px-4 text-sm font-medium text-white hover:bg-emerald-700 disabled:cursor-not-allowed disabled:opacity-50"
>
{streaming ? <Loader2 className="h-4 w-4 animate-spin" /> : <Send className="h-4 w-4" />}
Send
</button>
</div>
</div>
</form>
);
}