diff --git a/client/package-lock.json b/client/package-lock.json index 659891b..37d4256 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -16,6 +16,7 @@ "babel-plugin-prismjs": "^2.1.0", "chart.js": "^3.0.0", "classnames": "^2.3.1", + "prism-react-renderer": "^1.3.1", "prismjs": "^1.27.0", "react": "^18.0.0", "react-chartjs-2": "^4.1.0", @@ -12780,6 +12781,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/prism-react-renderer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz", + "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, "node_modules/prismjs": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", @@ -24912,7 +24921,8 @@ "prism-react-renderer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz", - "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==" + "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==", + "requires": {} }, "prismjs": { "version": "1.27.0", diff --git a/client/src/components/Multiplayer/Multiplayer.jsx b/client/src/components/Multiplayer/Multiplayer.jsx index 5d7e061..4a3b368 100644 --- a/client/src/components/Multiplayer/Multiplayer.jsx +++ b/client/src/components/Multiplayer/Multiplayer.jsx @@ -1,16 +1,45 @@ import React from 'react'; import './Multiplayer.scss' -import useSocket from '../../hooks/useSocket'; -import MultiDisplay from './MultiDisplay'; -import { useEffect, useState } from "react"; +import Prompt from './Prompt'; +import VSDisplay from './VSDisplay'; +import { useEffect, useState, useRef } from "react"; + +// Websocket functions +const { io } = require("socket.io-client"); +const {sendMessage, updateProgress} = require('./api') export default function Multiplayer() { - useSocket(); + const NEW_SERVER_MESSAGE_EVENT = "newServerMessage"; + const socketRef = useRef(); + + useEffect(() => { + socketRef.current = io(); + + socketRef.current.on(NEW_SERVER_MESSAGE_EVENT, (message) => { + console.log(message); + }); + + }); + + // TEST VARIABLES + const player1 = { + connected: true, + progress: 50, + } + + const player2 = { + connected: true, + progress: 50, + } return (
- + + sendMessage(socketRef.current, 'Prompt Complete')} + onProgress={(counter) => updateProgress(socketRef.current, counter)} + />
) diff --git a/client/src/components/Multiplayer/MultiDisplay.jsx b/client/src/components/Multiplayer/Prompt.jsx similarity index 81% rename from client/src/components/Multiplayer/MultiDisplay.jsx rename to client/src/components/Multiplayer/Prompt.jsx index fdfd128..89d0645 100644 --- a/client/src/components/Multiplayer/MultiDisplay.jsx +++ b/client/src/components/Multiplayer/Prompt.jsx @@ -4,7 +4,9 @@ import useTimer from "../../hooks/useTimer"; import "../Main/Display.scss"; import Lines from "../Main/Lines"; -export default function MultiDisplay() { +export default function Prompt(props) { + + const { onComplete, onProgress } = props; const { prompt, input, lengths, fetchPrompt, resetInput, handleKeypress, setFocus, endInput } = useKeyPress(); const { time, running, toggleTimer, resetTimer } = useTimer(); @@ -34,7 +36,7 @@ export default function MultiDisplay() { setFocus(true); }, []); - // Set / Stop Timer + // On click useEffect(() => { if (!input.end) { if (!running && (input.keys[0].length > 0 || input.queue !== null)) { @@ -48,9 +50,10 @@ export default function MultiDisplay() { } }, [input]); - // THIS USE EFFECT SHOULD SEND TO THE WEBSOCKET THAT USER FINISHED PROMPT + // On prompt complete useEffect(() => { if (input.end) { + onComplete(); // send complete message to websocket alert('PROMPT COMPLETE!!!') // This is where websocket should send } }, [input.end]); @@ -63,6 +66,13 @@ export default function MultiDisplay() { }; }, [handleKeypress]); + useEffect(() => { + if (counter !== 0) { + onProgress(counter); + // Can send a websocket message here to update % progress + } + }, [counter]) + return (

Time: {time}

@@ -77,8 +87,11 @@ export default function MultiDisplay() { lengths={lengths} indexes={wrongIndexes} counter={counter} + line={input.line} />
+

Counter: {counter}

+

Errors: {wrongIndexes.length}

); diff --git a/client/src/components/Multiplayer/VSDisplay.jsx b/client/src/components/Multiplayer/VSDisplay.jsx new file mode 100644 index 0000000..10a7881 --- /dev/null +++ b/client/src/components/Multiplayer/VSDisplay.jsx @@ -0,0 +1,14 @@ + + +export default function VSDisplay(props) { + + const {player1, player2} = props; + + return ( +
+

Player 1: {player1.connected}, Progress: {player1.progress}

+

Player 2: {player2.connected}, Progress: {player2.progress}

+
+ ) + +} \ No newline at end of file diff --git a/client/src/components/Multiplayer/api.js b/client/src/components/Multiplayer/api.js new file mode 100644 index 0000000..16e184f --- /dev/null +++ b/client/src/components/Multiplayer/api.js @@ -0,0 +1,9 @@ +const sendMessage = (socket, message) => { + socket.emit('newClientMessage', message); +}; + +const updateProgress = (socket, percentComplete) => { + socket.emit('progressUpdate', percentComplete); +} + +module.exports = {sendMessage, updateProgress} \ No newline at end of file diff --git a/client/src/hooks/useSocket.js b/client/src/hooks/useSocket.js deleted file mode 100644 index 3a5385b..0000000 --- a/client/src/hooks/useSocket.js +++ /dev/null @@ -1,21 +0,0 @@ -import { useEffect, useRef } from "react"; -const { io } = require("socket.io-client"); - -const NEW_SERVER_MESSAGE_EVENT = "newServerMessage"; - -export default function useSocket(gameID) { - const socketRef = useRef(); - - useEffect(() => { - socketRef.current = io(); - - socketRef.current.on(NEW_SERVER_MESSAGE_EVENT, (message) => { - console.log(message); - }); - - socketRef.current.emit('newClientMessage', 'hello'); - - }); - - return socketRef.current; -}; diff --git a/server/server.js b/server/server.js index d21afbc..6a8676e 100644 --- a/server/server.js +++ b/server/server.js @@ -42,6 +42,10 @@ io.on("connection", (socket) => { socket.on("newClientMessage", (arg) => { console.log(`user ${socket.id} replied with ${arg}`); }); + + socket.on('progressUpdate', (arg) => { + console.log(`user ${socket.id} progressed and ${arg}`) + }); }); // Initialize Routes