Source

component/ChatBot/ChatBot.jsx

import  { useState } from "react";
import "./index.css";
import { Form, Input } from "antd";
import { useEffect } from "react";
import { useGetChats } from "../../apis/Chat";
/**
 * React component for a chatbot.
 * @interface Chatbot
 * @component
 *
 * @returns {JSX.Element}
 */
const ChatBot = () => {
  /**
   * State to manage whether the chat is open or closed.
   * @type {boolean}
   * @default false
   * @name openChat
   * @memberOf ChatBot
   */
  const [openChat, setOpenChat] = useState(false);
  /**
   * State to manage chat messages.
   * @type {Array.<{id: string, message: string}>}
   * @name messages
   * @memberOf ChatBot
   */
  const [messages, setMessages] = useState([
    { id: "bot", message: "Hi there 👋 Got a question? I'm here to help 😄" },
  ]);
  /**
   * Form instance for the chat input.
   * @type {Form}
   * @name form
   * @memberOf ChatBot
   */
  const [form] = Form.useForm();
  /**
   * Hook to fetch chat data when component mounts.
   * @function
   * @name useGetChats
   * @memberOf ChatBot
   */
  const { mutate } = useGetChats();
  /**
   * Effect to scroll to the bottom of the chat messages when messages change.
   * @function
   * @name useEffect
   * @memberOf ChatBot
   */
  useEffect(() => {
    let element = document.querySelector("#chat_messages");
    const scroll = (el) => {
      el.scroll({ top: el.scrollHeight });
    };
    scroll(element);
  }, [messages]);
  /**
   * Handler for form submission.
   * @function
   * @name onFinish
   * @param {Object} values - Form values.
   * @param {string} values.message - The user's message.
   * @memberOf ChatBot
   */
  const onFinish = (values) => {
    form.setFieldValue("message", "");
    setMessages((current) => [
      ...current,
      { id: "your", message: values.message },
    ]);
    mutate(
      { message: values.message },
      {
        onSuccess: (res) => {

          setMessages((current) => [
            ...current,
            { id: "bot", message: res?.data?.message },
          ]);
        },
      }
    );
  };
  return (
    <div className="chatbot_container ">
      <div
        className={
          openChat
            ? "chatbot_message_container  relative"
            : "close_chat_message"
        }
      >
        <div className="chatbot_heading">
          <div>
            <h4>AI BOT PSMS</h4>
            <p className="text-sm">I,m here to assist about PSMS. </p>
          </div>
          <div
            className="chat_close_btn" 
            onClick={() => setOpenChat(false)}
          >
            <ion-icon name="close-outline"></ion-icon>
          </div>
        </div>
        <div
          id="chat_messages"
          className="chat_messages"
        >
          {messages?.map((item, index) => {
            return (
              <div key={index}>
                <div
                  className={
                    item.id !== "bot" ? " your_message" : "bot_message"
                  }
                >
                  <div>{item.message}</div>
                </div>
              </div>
            );
          })}
        </div>
        <Form
          onFinish={onFinish}
          form={form}
        >
          <div className="message_sender flex m-1">
            <Form.Item
              name="message"
              style={{ width: "100%" }}
              rules={[
                {
                  required: true,
                  message: "",
                },
              ]}
            >
              <Input
                autoComplete="off"
                placeholder={"Type a message..."}
                addonAfter={
                  <div
                    onClick={() => form.submit()}
                    style={{ cursor: "pointer" }}
                  >
                    <ion-icon name="send"></ion-icon>
                  </div>
                }
              />
            </Form.Item>
          </div>
        </Form>
      </div>
      <div className="chatbot_button mt-1 flex justify-end ">
        <div
          className="popup_btn  flex justify-center align-items-center"
          onClick={() => setOpenChat(!openChat)}
          style={{
            height: 40,
            right: 30,
          }}
        >
          <ion-icon name="chatbubbles-outline"></ion-icon>
        </div>
      </div>
    </div>
  );
};

export default ChatBot;