File size: 2,394 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
'use client';

import { useEffect, useRef, useState } from 'react';
import MessageInput from './MessageInput';
import { Message } from './ChatWindow';
import MessageBox from './MessageBox';
import MessageBoxLoading from './MessageBoxLoading';

const Chat = ({

  loading,

  messages,

  sendMessage,

  messageAppeared,

  rewrite,

}: {

  messages: Message[];

  sendMessage: (message: string) => void;

  loading: boolean;

  messageAppeared: boolean;

  rewrite: (messageId: string) => void;

}) => {
  const [dividerWidth, setDividerWidth] = useState(0);
  const dividerRef = useRef<HTMLDivElement | null>(null);
  const messageEnd = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    const updateDividerWidth = () => {
      if (dividerRef.current) {
        setDividerWidth(dividerRef.current.scrollWidth);
      }
    };

    updateDividerWidth();

    window.addEventListener('resize', updateDividerWidth);

    return () => {
      window.removeEventListener('resize', updateDividerWidth);
    };
  });

  useEffect(() => {
    messageEnd.current?.scrollIntoView({ behavior: 'smooth' });

    if (messages.length === 1) {
      document.title = `${messages[0].content.substring(0, 30)} - Perplexica`;
    }
  }, [messages]);

  return (
    <div className="flex flex-col space-y-6 pt-8 pb-44 lg:pb-32 sm:mx-4 md:mx-8">

      {messages.map((msg, i) => {

        const isLast = i === messages.length - 1;



        return (

          <>

            <MessageBox

              key={i}

              message={msg}

              messageIndex={i}

              history={messages}

              loading={loading}

              dividerRef={isLast ? dividerRef : undefined}

              isLast={isLast}

              rewrite={rewrite}

            />

            {!isLast && msg.role === 'assistant' && (

              <div className="h-px w-full bg-[#1C1C1C]" />

            )}

          </>
        );
      })}
      {loading && !messageAppeared && <MessageBoxLoading />}
      <div ref={messageEnd} className="h-0" />
      {dividerWidth > 0 && (
        <div

          className="bottom-24 lg:bottom-10 fixed z-40"

          style={{ width: dividerWidth }}

        >

          <MessageInput loading={loading} sendMessage={sendMessage} />

        </div>
      )}
    </div>
  );
};

export default Chat;