From 59aa904c5a081678701b47cc2f07f4cf707902c5 Mon Sep 17 00:00:00 2001 From: gavin Date: Mon, 16 Jun 2025 20:11:26 -0400 Subject: [PATCH] useSocket (#2) Co-authored-by: Gavin McDonald Reviewed-on: https://gitea.mcmorgans.us/gavin/Tarokka/pulls/2 --- app/[gameID]/page.tsx | 61 ++++------------------------------- hooks/useSocket.ts | 75 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 54 deletions(-) create mode 100644 hooks/useSocket.ts diff --git a/app/[gameID]/page.tsx b/app/[gameID]/page.tsx index 10daa07..32152b0 100644 --- a/app/[gameID]/page.tsx +++ b/app/[gameID]/page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { useParams } from 'next/navigation'; -import { socket } from '@/socket'; +import useSocket from '@/hooks/useSocket'; import { Eye } from 'lucide-react'; import Card from '@/components/Card'; @@ -39,65 +39,18 @@ export default function GamePage() { const isDM = !!dmID; const selectDeck: Deck | null = selectCard >= 0 ? cards[selectCard].deck : null; + const socket = useSocket({ gameID, setGameData, setNoGame }); + useEffect(() => { if (gameIDParam) { setGameID(Array.isArray(gameIDParam) ? gameIDParam[0] : gameIDParam); } }, [gameIDParam]); - useEffect(() => { - if (gameID) { - socket.emit('join', gameID); - - socket.on('init', (data: GameUpdate) => { - setGameData(data); - }); - - socket.on('game-update', (data: GameUpdate) => { - setGameData(data); - }); - - socket.on('join-error', (error) => { - console.error('Error:', error); - setNoGame(true); - }); - - socket.on('flip-error', (error) => { - console.error('Error:', error); - }); - } - - return () => { - socket.removeAllListeners(); - }; - }, [gameID]); - - const flipCard = (cardIndex: number) => { - socket.emit('flip-card', { - gameID, - cardIndex, - }); - }; - - const redraw = (cardIndex: number) => { - socket.emit('redraw', { - gameID, - cardIndex, - }); - }; - const select = (cardIndex: number, cardID: string) => { setSelectCard(-1); - socket.emit('select', { - gameID, - cardIndex, - cardID, - }); - }; - - const handleSettings = (gameData: GameUpdate) => { - socket.emit('settings', { gameID, gameData }); + socket.select(cardIndex, cardID); }; // map our five Tarokka cards to their proper locations in a 3x3 grid @@ -119,7 +72,7 @@ export default function GamePage() { /> )} - {isDM && } + {isDM && }
{Array.from({ length: 9 }) .map(arrangeCards) @@ -131,8 +84,8 @@ export default function GamePage() { card={card} position={layout[cardMap[index]]} settings={settings} - flipAction={() => flipCard(cardMap[index])} - redrawAction={() => redraw(cardMap[index])} + flipAction={() => socket.flipCard(cardMap[index])} + redrawAction={() => socket.redraw(cardMap[index])} selectAction={() => setSelectCard(cardMap[index])} /> )} diff --git a/hooks/useSocket.ts b/hooks/useSocket.ts new file mode 100644 index 0000000..794c8fe --- /dev/null +++ b/hooks/useSocket.ts @@ -0,0 +1,75 @@ +import { useEffect } from 'react'; +import { socket } from '@/socket'; + +import type { GameUpdate } from '@/types'; + +interface UseSocketProps { + gameID: string; + setGameData: (gameUpdate: GameUpdate) => void; + setNoGame: (noGame: boolean) => void; +} + +export default function useSocket({ gameID, setGameData, setNoGame }: UseSocketProps) { + useEffect(() => { + if (gameID) { + socket.emit('join', gameID); + + socket.on('init', (data: GameUpdate) => { + setGameData(data); + }); + + socket.on('game-update', (data: GameUpdate) => { + setGameData(data); + }); + + socket.on('join-error', (error) => { + console.error('Error:', error); + setNoGame(true); + }); + + socket.on('flip-error', (error) => { + console.error('Error:', error); + }); + } + + return () => { + socket.removeAllListeners(); + }; + }, [gameID]); + + const flipCard = (cardIndex: number) => { + socket.emit('flip-card', { + gameID, + cardIndex, + }); + }; + + const redraw = (cardIndex: number) => { + socket.emit('redraw', { + gameID, + cardIndex, + }); + }; + + const select = (cardIndex: number, cardID: string) => { + socket.emit('select', { + gameID, + cardIndex, + cardID, + }); + }; + + const handleSettings = (gameData: GameUpdate) => { + socket.emit('settings', { + gameID, + gameData, + }); + }; + + return { + flipCard, + redraw, + select, + handleSettings, + }; +}