diff --git a/frontend/src/pages/Character.tsx b/frontend/src/pages/Character.tsx index 24769ff..b2a64ff 100644 --- a/frontend/src/pages/Character.tsx +++ b/frontend/src/pages/Character.tsx @@ -3,6 +3,7 @@ import { Icon } from '@iconify/react'; import CharacterBadge from '../components/CharacterBadge'; import { useState, useEffect, useRef, useCallback } from 'react'; import { speechToText, characterChatMessage, getAudio } from '../logic/sdk'; +import { SyncLoader } from 'react-spinners'; export default function Character() { const location = useLocation(); @@ -12,6 +13,8 @@ export default function Character() { type Message = { text: string, sender: string }; const [messages, setMessages] = useState([]); const [isRecording, setIsRecording] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [isOtherLoading, setIsOtherLoading] = useState(false); let chunks = [] as any; const mediaRecorder = useRef(null); @@ -24,7 +27,7 @@ export default function Character() { useEffect(() => { scrollToBottom() - }, [messages]); + }, [messages, isLoading]); useEffect(() => { navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { @@ -35,12 +38,17 @@ export default function Character() { mediaRecorder.current.onstop = async (e) => { setIsRecording(false); + setIsLoading(true); const blob = new Blob(chunks, { type: 'audio/wav' }); chunks = []; const audioFile = new File([blob], "audio.wav", { type: 'audio/wav' }); const text = await speechToText(audioFile); + setMessages(prevMessages => [...prevMessages, { text: text, sender: 'me' }]); + setIsLoading(false); + + setIsOtherLoading(true); const response = await characterChatMessage(sessionId, text); const { msg, audio_id } = response; const audioBlob = await getAudio(audio_id); @@ -48,7 +56,8 @@ export default function Character() { const audioUrl = URL.createObjectURL(audioFileResponse); const audio = new Audio(audioUrl); audio.play(); - setMessages(prevMessages => [...prevMessages, { text: text, sender: 'me' }, { text: msg, sender: 'other' }]); + setMessages(prevMessages => [...prevMessages, { text: msg, sender: 'other' }]); + setIsOtherLoading(false); } }); }, []); @@ -74,8 +83,8 @@ export default function Character() {

Talk With...

{}}/>
- {messages.length === 0 ? ( -

Please record a message to start the conversation.

+ {messages.length === 0 && !isLoading ? ( +

Please record a message to start the conversation.

) : ( messages.map((message, index) => (
@@ -83,6 +92,28 @@ export default function Character() {
)) )} + {isLoading && ( +
+ +
+ )} + {isOtherLoading && ( +
+ +
+ )}
diff --git a/frontend/src/pages/UserChat.tsx b/frontend/src/pages/UserChat.tsx index 19ac848..1130052 100644 --- a/frontend/src/pages/UserChat.tsx +++ b/frontend/src/pages/UserChat.tsx @@ -2,6 +2,7 @@ import { useLocation, useNavigate } from 'react-router-dom'; import { Icon } from '@iconify/react'; import { useState, useRef, useEffect } from 'react'; import { humanChatMessage } from '../logic/sdk'; +import { SyncLoader } from 'react-spinners'; export default function Character() { const location = useLocation(); @@ -11,6 +12,7 @@ export default function Character() { type Message = { text: string, sender: string }; const [messages, setMessages] = useState([]); const [message, setMessage] = useState(''); + const [isOtherLoading, setIsOtherLoading] = useState(false); const messageEndRef = useRef(null); @@ -22,13 +24,16 @@ export default function Character() { scrollToBottom() }, [messages]); - const handleSendClick = () => { + const handleSendClick = async () => { if (message !== '') { setMessages(prevMessages => [...prevMessages, { text: message, sender: 'me' }]); setMessage(''); - humanChatMessage(sessionId, message).then((response) => { - setMessages(prevMessages => [...prevMessages, { text: response.msg, sender: 'other' }]); - }) + + setIsOtherLoading(true); + const response = await humanChatMessage(sessionId, message); + const { msg } = response; + setMessages(prevMessages => [...prevMessages, { text: msg, sender: 'other' }]); + setIsOtherLoading(false); } } @@ -55,6 +60,17 @@ export default function Character() { )) )} + {isOtherLoading && ( +
+ +
+ )}