File size: 2,179 Bytes
f18b03d
30cd0c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f18b03d
 
30cd0c9
 
 
 
 
 
 
 
 
 
 
 
 
f18b03d
30cd0c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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>
  );
}