servicepoint-tanks/tank-frontend/src/ClientScreen.tsx

45 lines
1.3 KiB
TypeScript
Raw Normal View History

import {useEffect, useState} from 'react';
import {Theme} from './theme.ts';
import {makeApiUrl, useMyWebSocket} from './serverCalls.tsx';
2024-05-04 14:25:37 +02:00
import {ReadyState} from 'react-use-websocket';
import PixelGridCanvas from './components/PixelGridCanvas.tsx';
2024-04-11 20:48:21 +02:00
export default function ClientScreen({theme, player}: {
theme: Theme,
player: string | null
}) {
2024-05-04 14:25:37 +02:00
const [shouldSendMessage, setShouldSendMessage] = useState(false);
2024-04-21 14:34:45 +02:00
const url = makeApiUrl('/screen', 'ws');
if (player && player !== '')
url.searchParams.set('playerName', player);
const {
lastMessage,
sendMessage,
2024-05-04 14:25:37 +02:00
getWebSocket,
readyState
} = useMyWebSocket(url.toString(), {
onOpen: _ => setShouldSendMessage(true),
onMessage: _ => setShouldSendMessage(true)
2024-05-04 14:25:37 +02:00
});
const socket = getWebSocket();
if (socket)
(socket as WebSocket).binaryType = 'arraybuffer';
2024-05-04 14:25:37 +02:00
useEffect(() => {
if (!shouldSendMessage || readyState !== ReadyState.OPEN)
return;
setShouldSendMessage(false);
sendMessage('');
}, [readyState, shouldSendMessage]);
if (!lastMessage)
return <></>;
2024-05-04 14:25:37 +02:00
const pixels = new Uint8ClampedArray(lastMessage.data);
return <PixelGridCanvas pixels={pixels} theme={theme}/>;
}