191 lines
7.6 KiB
TypeScript
191 lines
7.6 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { useDispatch } from 'react-redux';
|
|
import { pair } from '../redux/actions';
|
|
|
|
import { useShallowEqualSelector } from '../utils';
|
|
|
|
import { makeStyles } from '@material-ui/core/styles';
|
|
import Button from '@material-ui/core/Button';
|
|
import Typography from '@material-ui/core/Typography';
|
|
import FormControl from '@material-ui/core/FormControl';
|
|
import FormHelperText from '@material-ui/core/FormHelperText';
|
|
import Box from '@material-ui/core/Box';
|
|
import Link from '@material-ui/core/Link';
|
|
|
|
import { AboutDialog } from './about-dialog';
|
|
import { TopMenu } from './topmenu';
|
|
import ChromeIconPath from '../images/chrome-icon.svg';
|
|
import { W95Welcome } from './win95/welcome';
|
|
import OpenInNewIcon from '@material-ui/icons/OpenInNew';
|
|
import Snackbar from '@material-ui/core/Snackbar';
|
|
import Alert from '@material-ui/lab/Alert';
|
|
|
|
const useStyles = makeStyles(theme => ({
|
|
main: {
|
|
position: 'relative',
|
|
flex: '1 1 auto',
|
|
display: 'flex',
|
|
justifyContent: 'center',
|
|
flexDirection: 'column',
|
|
alignItems: 'center',
|
|
},
|
|
button: {
|
|
marginTop: theme.spacing(3),
|
|
minWidth: 150,
|
|
},
|
|
spacing: {
|
|
marginTop: theme.spacing(1),
|
|
},
|
|
spacing2: {
|
|
marginTop: theme.spacing(2),
|
|
},
|
|
chromeLogo: {
|
|
marginTop: theme.spacing(1),
|
|
width: 96,
|
|
height: 96,
|
|
},
|
|
why: {
|
|
alignSelf: 'flex-start',
|
|
marginTop: theme.spacing(3),
|
|
},
|
|
headBox: {
|
|
display: 'flex',
|
|
justifyContent: 'space-between',
|
|
},
|
|
connectContainer: {
|
|
flex: '1 1 auto',
|
|
display: 'flex',
|
|
justifyContent: 'center',
|
|
flexDirection: 'column',
|
|
alignItems: 'center',
|
|
},
|
|
supportContainer: {
|
|
flex: '1 1 auto',
|
|
display: 'flex',
|
|
justifyContent: 'center',
|
|
flexDirection: 'column',
|
|
alignItems: 'center',
|
|
},
|
|
}));
|
|
|
|
export const Welcome = (props: {}) => {
|
|
const classes = useStyles();
|
|
const dispatch = useDispatch();
|
|
const { browserSupported, pairingFailed, pairingMessage, vintageMode } = useShallowEqualSelector(state => state.appState);
|
|
if (pairingMessage.toLowerCase().match(/denied/)) {
|
|
// show linux instructions
|
|
}
|
|
// Access denied.
|
|
|
|
const [showWhyUnsupported, setWhyUnsupported] = useState(false);
|
|
const handleLearnWhy = (event: React.SyntheticEvent) => {
|
|
event.preventDefault();
|
|
setWhyUnsupported(true);
|
|
};
|
|
|
|
if (vintageMode) {
|
|
const p = {
|
|
dispatch,
|
|
pairingFailed,
|
|
pairingMessage,
|
|
};
|
|
return <W95Welcome {...p}></W95Welcome>;
|
|
}
|
|
|
|
return (
|
|
<React.Fragment>
|
|
<Box className={classes.headBox}>
|
|
<Typography component="h1" variant="h4">
|
|
Web MiniDisc
|
|
</Typography>
|
|
<TopMenu />
|
|
</Box>
|
|
<Typography component="h2" variant="body2">
|
|
Brings NetMD Devices to the Web
|
|
</Typography>
|
|
<Box className={classes.main}>
|
|
{browserSupported ? (
|
|
<React.Fragment>
|
|
<div className={classes.connectContainer}>
|
|
<Typography component="h2" variant="subtitle1" align="center" className={classes.spacing}>
|
|
Press the button to connect to a NetMD device
|
|
</Typography>
|
|
|
|
<Button variant="contained" color="primary" onClick={() => dispatch(pair())} className={classes.button}>
|
|
Connect
|
|
</Button>
|
|
|
|
<FormControl
|
|
error={true}
|
|
className={classes.spacing}
|
|
style={{ visibility: pairingFailed ? 'visible' : 'hidden' }}
|
|
>
|
|
<FormHelperText>{pairingMessage}</FormHelperText>
|
|
</FormControl>
|
|
|
|
<Alert severity="warning" className={classes.spacing2}>
|
|
Want an updated version of Web Minidisc? Try{' '}
|
|
<Link href="https://web.minidisc.wiki/">Web MiniDisc Pro.</Link>
|
|
</Alert>
|
|
</div>
|
|
<div>
|
|
<Typography component="h2" variant="subtitle1" align="center" className={classes.spacing}>
|
|
<Link
|
|
rel="noopener noreferrer"
|
|
target="_blank"
|
|
href="https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ"
|
|
>
|
|
<span style={{ verticalAlign: 'middle' }}>Support and FAQ</span>{' '}
|
|
<OpenInNewIcon style={{ verticalAlign: 'middle' }} fontSize="inherit" />
|
|
</Link>
|
|
</Typography>
|
|
</div>
|
|
</React.Fragment>
|
|
) : (
|
|
<React.Fragment>
|
|
<Typography component="h2" variant="subtitle1" align="center" className={classes.spacing}>
|
|
This Web browser is not supported.
|
|
<Link rel="noopener noreferrer" href="#" onClick={handleLearnWhy}>
|
|
Learn Why
|
|
</Link>
|
|
</Typography>
|
|
|
|
<Link rel="noopener noreferrer" target="_blank" href="https://www.google.com/chrome/">
|
|
<img alt="Chrome Logo" src={ChromeIconPath} className={classes.chromeLogo} />
|
|
</Link>
|
|
|
|
<Typography component="h2" variant="subtitle1" align="center" className={classes.spacing}>
|
|
Try using{' '}
|
|
<Link rel="noopener noreferrer" target="_blank" href="https://www.google.com/chrome/">
|
|
Chrome
|
|
</Link>{' '}
|
|
instead
|
|
</Typography>
|
|
|
|
{showWhyUnsupported ? (
|
|
<>
|
|
<Typography component="p" variant="body2" className={classes.why}>
|
|
Web MiniDisc requires a browser that supports both{' '}
|
|
<Link rel="noopener noreferrer" target="_blank" href="https://wicg.github.io/webusb/">
|
|
WebUSB
|
|
</Link>{' '}
|
|
and{' '}
|
|
<Link rel="noopener noreferrer" target="_blank" href="https://webassembly.org/">
|
|
WebAssembly
|
|
</Link>
|
|
.
|
|
</Typography>
|
|
<ul>
|
|
<li>WebUSB is needed to control the NetMD device via the USB connection to your computer.</li>
|
|
<li>WebAssembly is used to convert the music to a MiniDisc compatible format</li>
|
|
</ul>
|
|
</>
|
|
) : null}
|
|
</React.Fragment>
|
|
)}
|
|
</Box>
|
|
<AboutDialog />
|
|
</React.Fragment>
|
|
);
|
|
};
|