diff --git a/tank-frontend/src/JoinForm.css b/tank-frontend/src/JoinForm.css index a4bad2b..d7bef0d 100644 --- a/tank-frontend/src/JoinForm.css +++ b/tank-frontend/src/JoinForm.css @@ -13,5 +13,4 @@ .JoinElems { padding: 8px 8px; margin: 8px 8px; - color: rgb(255, 255, 255); } \ No newline at end of file diff --git a/tank-frontend/src/JoinForm.tsx b/tank-frontend/src/JoinForm.tsx index be88789..a62533c 100644 --- a/tank-frontend/src/JoinForm.tsx +++ b/tank-frontend/src/JoinForm.tsx @@ -1,22 +1,6 @@ import { useEffect, useState } from 'react'; import './JoinForm.css'; - -type PlayerResponse = { - readonly name: string; - readonly id: string; -}; - -export async function fetchPlayer(name: string, options: RequestInit) { - const url = new URL(import.meta.env.VITE_TANK_PLAYER_URL); - url.searchParams.set('name', name); - - const response = await fetch(url, options); - if (!response.ok) - return null; - - const json = await response.json() as PlayerResponse; - return json.id; -} +import { PlayerResponse, postPlayer } from './serverCalls'; export default function JoinForm({ onDone }: { onDone: (id: string) => void }) { const [name, setName] = useState(''); @@ -28,12 +12,13 @@ export default function JoinForm({ onDone }: { onDone: (id: string) => void }) { return; try { - fetchPlayer(name, {}).then((value: string | null) => { - if (value) - onDone(value); - else - setClicked(false); - }); + postPlayer(name) + .then((value: PlayerResponse | null) => { + if (value) + onDone(value.id); + else + setClicked(false); + }); } catch (e) { console.log(e); alert(e); @@ -47,7 +32,7 @@ export default function JoinForm({ onDone }: { onDone: (id: string) => void }) {

Welcome and have fun!

-

+

Enter your name to join the game!

(); + + const refresh = () => { + getPlayer(playerId).then(setPlayer); + }; + + useEffect(() => { + const timer = setInterval(refresh, 5000); + return () => clearInterval(timer); + }); + + return
+

+ Tanks +

+
+
+

+ name +

+

+ {player?.name} +

+
+
+

+ {JSON.stringify(player)} +

+ + +
+
; +} diff --git a/tank-frontend/src/index.tsx b/tank-frontend/src/index.tsx index 3f3a217..d6b278e 100644 --- a/tank-frontend/src/index.tsx +++ b/tank-frontend/src/index.tsx @@ -1,22 +1,24 @@ -import React, {useState} from 'react'; +import React, { useState } from 'react'; import './index.css'; import ClientScreen from './ClientScreen'; import Controls from './Controls.tsx'; import JoinForm from './JoinForm.tsx'; -import {createRoot} from 'react-dom/client'; +import { createRoot } from 'react-dom/client'; +import PlayerInfo from './PlayerInfo.tsx'; function App() { const [id, setId] = useState(null); return <> - {id === null && setId(name)}/>} - - {id == null || } + {id === null && setId(name)} />} + {id == null || } + + {id == null || } ; } createRoot(document.getElementById('root')!).render( - + ); diff --git a/tank-frontend/src/serverCalls.tsx b/tank-frontend/src/serverCalls.tsx new file mode 100644 index 0000000..6640b47 --- /dev/null +++ b/tank-frontend/src/serverCalls.tsx @@ -0,0 +1,23 @@ +export type PlayerResponse = { + readonly name: string; + readonly id: string; +}; + +export async function fetchTyped({ url, method }: { url: URL; method: string; }) { + const response = await fetch(url, { method }); + if (!response.ok) + return null; + return await response.json() as T; +} + +export function postPlayer(name: string) { + const url = new URL(import.meta.env.VITE_TANK_PLAYER_URL); + url.searchParams.set('name', name); + return fetchTyped({ url, method: 'POST' }); +} + +export function getPlayer(id: string) { + const url = new URL(import.meta.env.VITE_TANK_PLAYER_URL); + url.searchParams.set('id', id); + return fetchTyped({ url, method: 'GET' }); +}