@deepwaterexploration/dwe-controls
Version:
Web Based UVC Control Driver for the DeepWater Exploration exploreHD and HDCam
159 lines (150 loc) • 6.42 kB
JavaScript
import MenuItem from '@mui/material/MenuItem';
import Menu from '@mui/material/Menu';
import IconButton from '@mui/material/IconButton';
import WifiIcon from '@mui/icons-material/Wifi';
import WifiLockIcon from '@mui/icons-material/WifiLock';
import SignalWifi4Bar from '@mui/icons-material/SignalWifi4Bar';
import CheckIcon from '@mui/icons-material/Check';
import React, { useLayoutEffect, useState } from 'react';
import { Button, Grid, Modal, TextField, Typography } from '@mui/material';
import { Box } from '@mui/system';
import { LineBreak, networkConnect } from '../utils/utils';
const modalStyle = {
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: 500,
bgcolor: 'background.paper',
boxShadow: 24,
p: 4,
};
function WifiConnection(props) {
let Icon = SignalWifi4Bar;
if (props.locked) {
Icon = WifiLockIcon;
}
return (
<IconButton>
{props.isConnected ? <CheckIcon></CheckIcon> : undefined}
<Icon sx={{ marginRight: 1 }} />
{props.ssid}
</IconButton>
)
}
export default function WifiMenu(props) {
const [anchorEl, setAnchorEl] = useState(null);
const [wifiModalOpen, setWifiModalOpen] = useState(false);
const [selectedWifi, setSelectedWifi] = useState(null);
const [passwordField, setPasswordField] = useState(null);
const [requiresPassword, setRequiresPassword] = useState(false);
const [connectedNetwork, setConnectedNetwork] = useState(null);
const updateConnectedNetwork = () => {
fetch('/connectedNetwork')
.then((response) => response.json())
.then((network) => {
setConnectedNetwork(network.network);
});
}
useLayoutEffect(() => {
updateConnectedNetwork();
}, []);
const open = Boolean(anchorEl);
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const [connectedWifiNetworks, setConnectedWifiNetworks] = useState([]);
const [availableWifiNetworks, setAvailableWifiNetworks] = useState([]);
useLayoutEffect(() => {
fetch('/networks')
.then((response) => response.json())
.then((networks) => {
setConnectedNetwork(networks.find((network) => network.ssid == connectedNetwork));
setConnectedWifiNetworks(<>
<MenuItem onClick={function() {
setSelectedWifi(connectedNetwork.ssid);
setRequiresPassword(connectedNetwork.requiresPasskey);
setWifiModalOpen(true);
handleClose();
}}>
<WifiConnection ssid={connectedNetwork?.ssid} locked={connectedNetwork?.requiresPasskey} />
</MenuItem>
</>);
setAvailableWifiNetworks(networks.map((network) => {
if (connectedNetwork == network.ssid) return undefined;
return <>
<MenuItem onClick={function() {
setSelectedWifi(network.ssid);
setRequiresPassword(network.requiresPasskey);
setWifiModalOpen(true);
handleClose();
}}>
<WifiConnection ssid={network.ssid} locked={network.requiresPasskey} isConnected={connectedNetwork == network.ssid} />
</MenuItem>
</>
}));
});
}, [connectedNetwork]);
return (
<div>
{/* <Typography>Connected Network: {connectedNetwork}</Typography> */}
<IconButton id="wifi-menu-button" aria-controls={open ? 'basic-menu' : undefined}
aria-haspopup="true"
aria-expanded={open ? 'true' : undefined}
onClick={handleClick}
>
<WifiIcon />
</IconButton>
<Menu id="wifi-menu"
anchorEl={anchorEl}
open={open}
onClose={handleClose}
MenuListProps={{
'aria-labelledby': 'wifi-menu-button',
}}>
<Typography sx={{marginLeft: 2}}>Active Connections</Typography>
{ connectedWifiNetworks }
<Typography sx={{marginLeft: 2}}>Available Connections</Typography>
{ availableWifiNetworks }
</Menu>
<Modal
open={wifiModalOpen}
onClose={() => { setWifiModalOpen(false) }}
>
<Box sx={modalStyle}>
<Typography variant="h6" component="h2">
Enter a password for the network: "{selectedWifi}"
</Typography>
{
requiresPassword ? <TextField type="password" label="Password" variant="standard" onChange={function(e) {
setPasswordField(e.target.value);
}} /> : null
}
<LineBreak />
<Grid sx={{marginTop: 1}} container alignItems="center" justifyContent="center">
<Button sx={{width: '40%', margin: 1}} variant="contained" onClick={function() {
setWifiModalOpen(false);
}}>Cancel</Button>
<Button sx={{width: '40%', margin: 1}} variant="contained" onClick={function() {
networkConnect(selectedWifi, passwordField);
setPasswordField(null);
setWifiModalOpen(false);
// TODO: Switch to websocket for wifi
let numTries = 5;
let interval = setInterval(() => {
updateConnectedNetwork();
numTries--;
if (connectedNetwork === selectedWifi || numTries === 0) {
clearInterval(interval);
}
}, 2000);
}}>Connect</Button>
</Grid>
</Box>
</Modal>
</div>
);
}