silphius/app/routes/_main-menu.play.$/route.jsx

87 lines
2.1 KiB
React
Raw Normal View History

2024-06-13 02:47:28 -05:00
import {useEffect, useState} from 'react';
import {useParams} from 'react-router-dom';
import ClientContext from '@/context/client.js';
import LocalClient from '@/net/client/local.js';
import RemoteClient from '@/net/client/remote.js';
import {decode, encode} from '@/packets/index.js';
2024-06-10 23:55:06 -05:00
import Ui from '@/react-components/ui.jsx';
2024-06-10 22:42:30 -05:00
2024-06-13 02:47:28 -05:00
import styles from './play.module.css';
2024-06-10 22:42:30 -05:00
export default function Index() {
2024-06-13 02:47:28 -05:00
const [client, setClient] = useState();
2024-06-13 12:24:32 -05:00
const [disconnected, setDisconnected] = useState(false);
2024-06-13 02:47:28 -05:00
const params = useParams();
const [type, url] = params['*'].split('/');
useEffect(() => {
let Client;
switch (type) {
case 'local':
Client = LocalClient;
break;
case 'remote':
Client = RemoteClient;
break;
}
class SilphiusClient extends Client {
accept(packed) {
super.accept(decode(packed));
}
transmit(packet) {
super.transmit(encode(packet));
}
}
const client = new SilphiusClient();
async function connect() {
await client.connect(url);
setClient(client);
}
connect();
return () => {
client.disconnect();
};
}, [type, url]);
useEffect(() => {
if (!client) {
return;
}
2024-06-13 12:24:32 -05:00
function onConnectionStatus(status) {
switch (status) {
case 'aborted': {
setDisconnected(true);
break;
}
case 'connected': {
setDisconnected(false);
break;
}
}
2024-06-13 02:47:28 -05:00
}
2024-06-13 12:24:32 -05:00
client.addPacketListener('ConnectionStatus', onConnectionStatus);
2024-06-13 02:47:28 -05:00
return () => {
2024-06-13 12:24:32 -05:00
client.removePacketListener('ConnectionStatus', onConnectionStatus);
2024-06-13 02:47:28 -05:00
};
}, [client]);
2024-06-13 12:24:32 -05:00
useEffect(() => {
if (!disconnected) {
return;
}
async function reconnect() {
await client.connect(url);
}
reconnect();
const handle = setInterval(reconnect, 1000);
return () => {
clearInterval(handle);
};
}, [client, disconnected, url]);
2024-06-10 22:42:30 -05:00
return (
2024-06-13 02:47:28 -05:00
<div className={styles.play}>
2024-06-13 12:24:32 -05:00
<ClientContext.Provider value={client}>
<Ui disconnected={disconnected} />
</ClientContext.Provider>
2024-06-13 02:47:28 -05:00
</div>
2024-06-10 22:42:30 -05:00
);
}