diff --git a/chatter/src/components/Messages/components/Footer.js b/chatter/src/components/Messages/components/Footer.js index a0f36e352..0c393a2a2 100644 --- a/chatter/src/components/Messages/components/Footer.js +++ b/chatter/src/components/Messages/components/Footer.js @@ -15,6 +15,7 @@ export default function Footer({ sendMessage, onChangeMessage, message }) { onKeyDown={onKeyDown} placeholder="Write a message..." id="user-message-input" + value={message} onChange={onChangeMessage} />
diff --git a/chatter/src/components/Messages/components/Messages.js b/chatter/src/components/Messages/components/Messages.js index 4d388a8b0..b720fa436 100644 --- a/chatter/src/components/Messages/components/Messages.js +++ b/chatter/src/components/Messages/components/Messages.js @@ -1,30 +1,92 @@ -import React, { useContext } from 'react'; -import io from 'socket.io-client'; -import useSound from 'use-sound'; -import config from '../../../config'; -import LatestMessagesContext from '../../../contexts/LatestMessages/LatestMessages'; -import TypingMessage from './TypingMessage'; -import Header from './Header'; -import Footer from './Footer'; -import Message from './Message'; -import '../styles/_messages.scss'; - -const socket = io( - config.BOT_SERVER_ENDPOINT, - { transports: ['websocket', 'polling', 'flashsocket'] } -); +import React, { useContext, useEffect, useState } from "react"; +import io from "socket.io-client"; +import useSound from "use-sound"; +import config from "../../../config"; +import LatestMessagesContext from "../../../contexts/LatestMessages/LatestMessages"; +import Header from "./Header"; +import Footer from "./Footer"; +import "../styles/_messages.scss"; + +const socket = io(config.BOT_SERVER_ENDPOINT, { + transports: ["websocket", "polling", "flashsocket"], +}); function Messages() { + // Warning: CORS is rejecting the below sounds const [playSend] = useSound(config.SEND_AUDIO_URL); const [playReceive] = useSound(config.RECEIVE_AUDIO_URL); - const { setLatestMessage } = useContext(LatestMessagesContext); + const { messages, setLatestMessage } = useContext(LatestMessagesContext); + const [message, setMessage] = useState(""); + const [messageHistory, setMessageHistory] = useState([messages["bot"]]); + const [myMessages, setMyMessages] = useState([]); + const [typing, setTyping] = useState(false); + + // TODO: replace useEffect's "bot-message" & "bot-typing" by useCallback + // TODO: scroll to bottom of message list when sending/receiving a message + // by attaching a ref to the last message + + useEffect(() => { + socket.on("connect", () => { + console.log("connected to socket server"); + }); + + socket.on("disconnect", () => { + console.log("disconnected from socket server"); + // we can do reconnect if needed + }); + + socket.on("bot-message", (msg) => { + setTyping(false); + setMessageHistory([...messageHistory, msg]); + setLatestMessage("bot", msg); + }); + + socket.on("bot-typing", () => { + setTyping(true); + }); + }); + + const sendMessage = () => { + setMessageHistory([...messageHistory, message]); + setMyMessages([...myMessages, message]); + setLatestMessage("bot", message); + setMessage(""); + + socket.emit("user-message", message); + }; + + const onChangeMessage = (event) => { + setMessage(event.target.value); + }; return (
+ {messageHistory.map((msg, index) => ( +
+ {msg} +
+ ))} + {typing && ( +
+ Botty is typing... +
+ )}
-
); }