File size: 3,326 Bytes
f5ed9bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { cn } from '@/lib/utils';
import { ArrowUp } from 'lucide-react';
import { useEffect, useState } from 'react';
import TextareaAutosize from 'react-textarea-autosize';
import { Attach, CopilotToggle } from './MessageInputActions';

const MessageInput = ({

  sendMessage,

  loading,

}: {

  sendMessage: (message: string) => void;

  loading: boolean;

}) => {
  const [copilotEnabled, setCopilotEnabled] = useState(false);
  const [message, setMessage] = useState('');
  const [textareaRows, setTextareaRows] = useState(1);
  const [mode, setMode] = useState<'multi' | 'single'>('single');

  useEffect(() => {
    if (textareaRows >= 2 && message && mode === 'single') {
      setMode('multi');
    } else if (!message && mode === 'multi') {
      setMode('single');
    }
  }, [textareaRows, mode, message]);

  return (
    <form

      onSubmit={(e) => {

        if (loading) return;

        e.preventDefault();

        sendMessage(message);

        setMessage('');

      }}

      onKeyDown={(e) => {

        if (e.key === 'Enter' && !e.shiftKey && !loading) {

          e.preventDefault();

          sendMessage(message);

          setMessage('');

        }

      }}

      className={cn(

        'bg-[#111111] p-4 flex items-center overflow-hidden border border-[#1C1C1C]',

        mode === 'multi' ? 'flex-col rounded-lg' : 'flex-row rounded-full',

      )}

    >

      {mode === 'single' && <Attach />}

      <TextareaAutosize

        value={message}

        onChange={(e) => setMessage(e.target.value)}

        onHeightChange={(height, props) => {

          setTextareaRows(Math.ceil(height / props.rowHeight));

        }}

        className="transition bg-transparent placeholder:text-white/50 placeholder:text-sm text-sm text-white resize-none focus:outline-none w-full px-2 max-h-24 lg:max-h-36 xl:max-h-48 flex-grow flex-shrink"

        placeholder="Ask a follow-up"

      />

      {mode === 'single' && (

        <div className="flex flex-row items-center space-x-4">

          <CopilotToggle

            copilotEnabled={copilotEnabled}

            setCopilotEnabled={setCopilotEnabled}

          />

          <button

            disabled={message.trim().length === 0 || loading}

            className="bg-[#24A0ED] text-white disabled:text-white/50 hover:bg-opacity-85 transition duration-100 disabled:bg-[#ececec21] rounded-full p-2"

          >

            <ArrowUp className="bg-background" size={17} />

          </button>

        </div>

      )}

      {mode === 'multi' && (

        <div className="flex flex-row items-center justify-between w-full pt-2">

          <Attach />

          <div className="flex flex-row items-center space-x-4">

            <CopilotToggle

              copilotEnabled={copilotEnabled}

              setCopilotEnabled={setCopilotEnabled}

            />

            <button

              disabled={message.trim().length === 0 || loading}

              className="bg-[#24A0ED] text-white disabled:text-white/50 hover:bg-opacity-85 transition duration-100 disabled:bg-[#ececec21] rounded-full p-2"

            >

              <ArrowUp className="bg-background" size={17} />

            </button>

          </div>

        </div>

      )}

    </form>
  );
};

export default MessageInput;