Development/Front

로딩창 만들기

westcold 2024. 5. 26. 16:22

opeanai api에게 내 정보를 물어보면 답이 돌아오는데 시간이 조금 걸려 사용자가 지루할 수 있다.
이를 해결하기 위해 로딩창을 만들어보기로 했다.  


React Spinners (davidhu.io)

 

React Spinners

 

www.davidhu.io

 
 우선 아래 코드로 설치해주고 위에 사이트에서 마음에 드는 로딩창을 가져오면 된다
npm i react-spinners --save
add react-spinners
 
-loading.js

npm i react-spinners --save
add react-spinners
 
 
mport React from 'react';
import {Oval} from "react-loader-spinner"; //수많은 스피너 중 저는 Oval 스피너 import하겠습니다


function Loading () {
   
    return ( //import 한 스피너는 컴포넌트 형태로 사용가능
        <Oval className="image" color='black' secondaryColor="black"/>
       
    ) ;

};

export default Loading;

 .Loading.css

.Loading{

    display: flex;
    align-items: center;
    justify-content: center;
    color : "black";
    height : 100px;
    width : 100px;

}

 
-채팅창 전체 코드

import React, { useState, useRef, useEffect } from 'react';
import axios from 'axios';
import Loading from './loading'; // 파일 경로 및 대소문자 확인

const ChatGPT = () => {
    const [inputValue, setInputValue] = useState('');
    const [chatHistory, setChatHistory] = useState([]);
    const [responseMessage, setResponseMessage] = useState('');
    const [isTyping, setIsTyping] = useState(false);
    const [isLoading, setIsLoading] = useState(false); // isLoading 상태를 정의합니다.
    const chatHistoryRef = useRef(null); // 채팅 히스토리 엘리먼트에 대한 참조를 생성합니다.

    const scrollToBottom = () => {
        if (chatHistoryRef.current) {
            chatHistoryRef.current.scrollTop = chatHistoryRef.current.scrollHeight;
        }
    };

    useEffect(() => {
        scrollToBottom(); // 컴포넌트가 마운트될 때마다 스크롤을 가장 아래로 이동합니다.
    }, [chatHistory]);

    const sendMessage = async () => {
        setIsLoading(true); // 메시지 전송 시작 시 로딩 상태를 true로 설정합니다.
        try {
            const response = await axios.post('http://127.0.0.1:5000/sendMessage', {
                user_input: inputValue
            });
            setResponseMessage(response.data.description);

            setChatHistory(prevChat => [...prevChat, { text: inputValue, sender: 'user' }]);
            setChatHistory(prevChat => [...prevChat, { text: response.data.description, sender: 'bot' }]);
            console.log('Responsemessage:', response.data.description);
        } catch (error) {
            console.error('Error sending message:', error);
        }
        setInputValue('');
        setIsTyping(false);
        setIsLoading(false); // 메시지 전송 완료 시 로딩 상태를 false로 설정합니다.
        scrollToBottom(); // 새로운 메시지가 추가될 때마다 스크롤을 가장 아래로 이동합니다.
    };

    const handleInputChange = (event) => {
        setInputValue(event.target.value);
        setIsTyping(true);
    };

    const handleKeyPress = (event) => {
        if (event.key === 'Enter') {
            sendMessage();
        }
    };

 

    return (
        <div className="chat-container">
            {isLoading && (
                <div className="loading-overlay">
                    <Loading />
                    <div className='ment'>AI에게 물어보는 중이랑께~</div>
                </div>
            )}
            <div className="chat-history" ref={chatHistoryRef}>
                {chatHistory.map((message, index) => (
                    <div key={index} className={`message ${message.sender}`}>
                        {message.text}
                    </div>
                ))}
                {(chatHistory.length === 0) && (
                    <div className="messagebot">서찬에 대해 궁금한 것을 입력하세요<br />(질문은 최대 10개까지 가능합니다)</div>
                )}
            </div>
            <div className="chat-input">
                <input
                    type="text"
                    value={inputValue}
                    onChange={handleInputChange}
                    onKeyPress={handleKeyPress}
                    placeholder="메시지를 입력하세요..."
                />
                <button onClick={sendMessage}>전송</button>
               
            </div>
        </div>
    );
};

export default ChatGPT;

 

-로딩창