Spaces:
Build error
Build error
| /** | |
| * src/components/TextView/index.jsx | |
| * show chat log. User can send message and switch to CallView. | |
| * | |
| * created by Lynchee on 7/16/23 | |
| */ | |
| import React, { useEffect, useRef } from 'react'; | |
| import './style.css'; | |
| import { TbPower, TbMicrophone } from 'react-icons/tb'; | |
| import IconButton from '../Common/IconButton'; | |
| const TextView = ({ send, isPlaying, stopAudioPlayback, textAreaValue, setTextAreaValue, messageInput, setMessageInput, handleDisconnect, setIsCallView }) => { | |
| const chatWindowRef = useRef(null); | |
| // always show the latest chat log | |
| useEffect(() => { | |
| if (chatWindowRef.current) { | |
| chatWindowRef.current.scrollTop = chatWindowRef.current.scrollHeight; | |
| } | |
| }, [textAreaValue]); | |
| // send message to server. stop audio if it's playing to interrupt character. | |
| const sendMessage = () => { | |
| setTextAreaValue(prevState => prevState + `\nYou> ${messageInput}\n`); | |
| send(messageInput); | |
| setMessageInput(''); | |
| if (isPlaying) { | |
| stopAudioPlayback(); | |
| } | |
| } | |
| const handleSendClick = () => { | |
| if (messageInput.trim() !== '') { | |
| sendMessage(); | |
| } | |
| } | |
| const handleKeyDown = (event) => { | |
| if (event.key === 'Enter') { | |
| handleSendClick(); | |
| } | |
| }; | |
| const handleInputChange = (event) => { | |
| setMessageInput(event.target.value); | |
| }; | |
| return ( | |
| <> | |
| <textarea | |
| className="chat-window" | |
| readOnly | |
| draggable="false" | |
| ref={chatWindowRef} | |
| value={textAreaValue} | |
| ></textarea> | |
| <div className="message-input-container"> | |
| <input | |
| className="message-input" | |
| type="text" | |
| placeholder="Type your message" | |
| value={messageInput} | |
| onChange={handleInputChange} | |
| onKeyDown={handleKeyDown} | |
| /> | |
| <span className="focus-border"><i></i></span> | |
| </div> | |
| <button className="send-btn" onClick={handleSendClick}>Send Message</button> | |
| <div className="options-container"> | |
| <IconButton Icon={TbPower} className="icon-red" onClick={handleDisconnect} /> | |
| <IconButton Icon={TbMicrophone} className="icon-blue" onClick={() => setIsCallView(true)} /> | |
| </div> | |
| </> | |
| ) | |
| } | |
| export default TextView |