2020-05-23 21:51:11 +00:00
|
|
|
import { Button, ButtonGroup, createStyles, makeStyles, TextField, Theme } from '@material-ui/core';
|
|
|
|
import * as React from 'react';
|
|
|
|
import { Controller, useForm } from 'react-hook-form';
|
|
|
|
|
2020-05-25 19:32:53 +00:00
|
|
|
import { nameofFactory, noComplete } from '../common';
|
2020-05-23 21:51:11 +00:00
|
|
|
|
|
|
|
export interface LoginFormData {
|
|
|
|
nickname: string;
|
|
|
|
roomName: string;
|
|
|
|
roomPass: string;
|
|
|
|
create: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
const formName = nameofFactory<LoginFormData>();
|
|
|
|
|
|
|
|
const useStyles = makeStyles((theme: Theme) =>
|
|
|
|
createStyles({
|
|
|
|
padBottom: {
|
|
|
|
marginBottom: theme.spacing(2),
|
|
|
|
},
|
2020-05-25 19:32:53 +00:00
|
|
|
label: {
|
|
|
|
color: theme.palette.text.secondary + ' !important',
|
|
|
|
},
|
2020-05-23 21:51:11 +00:00
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
export interface LoginFormProps {
|
|
|
|
existingRoom: boolean;
|
|
|
|
onSubmit: (data: LoginFormData) => Promise<void>;
|
|
|
|
errorMessage?: string;
|
|
|
|
}
|
|
|
|
|
2020-05-25 18:51:25 +00:00
|
|
|
// Sync rules with protocol.go.
|
2020-05-23 21:51:11 +00:00
|
|
|
export function LoginForm(props: LoginFormProps) {
|
|
|
|
const classes = useStyles();
|
|
|
|
const { control, handleSubmit, errors, setValue, register } = useForm<LoginFormData>({});
|
|
|
|
React.useEffect(() => register({ name: formName('create') }), [register]);
|
|
|
|
const doSubmit = handleSubmit(props.onSubmit);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<form onSubmit={(e) => e.preventDefault()}>
|
|
|
|
{props.existingRoom ? (
|
|
|
|
<div>
|
|
|
|
<em>Joining existing game; please choose a nickname.</em>
|
|
|
|
</div>
|
|
|
|
) : null}
|
|
|
|
|
|
|
|
<div className={props.existingRoom ? classes.padBottom : undefined}>
|
|
|
|
<Controller
|
|
|
|
control={control}
|
|
|
|
as={TextField}
|
|
|
|
name={formName('nickname')}
|
|
|
|
label="Nickname"
|
|
|
|
defaultValue=""
|
|
|
|
error={!!errors.nickname}
|
2020-05-25 18:51:25 +00:00
|
|
|
rules={{ required: true, minLength: 1, maxLength: 16 }}
|
2020-05-23 21:51:11 +00:00
|
|
|
fullWidth={true}
|
|
|
|
inputProps={noComplete}
|
|
|
|
autoFocus
|
2020-05-25 19:32:53 +00:00
|
|
|
InputLabelProps={{ classes: { focused: classes.label } }}
|
2020-05-23 21:51:11 +00:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
{props.existingRoom ? null : (
|
|
|
|
<>
|
|
|
|
<div>
|
|
|
|
<Controller
|
|
|
|
control={control}
|
|
|
|
as={TextField}
|
|
|
|
name={formName('roomName')}
|
|
|
|
label="Room name"
|
|
|
|
defaultValue=""
|
|
|
|
error={!!errors.roomName}
|
2020-05-25 18:51:25 +00:00
|
|
|
rules={{ required: true, minLength: 1, maxLength: 20 }}
|
2020-05-23 21:51:11 +00:00
|
|
|
fullWidth={true}
|
|
|
|
inputProps={noComplete}
|
2020-05-25 19:32:53 +00:00
|
|
|
InputLabelProps={{ classes: { focused: classes.label } }}
|
2020-05-23 21:51:11 +00:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={classes.padBottom}>
|
|
|
|
<Controller
|
|
|
|
control={control}
|
|
|
|
as={TextField}
|
|
|
|
name={formName('roomPass')}
|
|
|
|
label="Password"
|
|
|
|
defaultValue=""
|
|
|
|
type="password"
|
|
|
|
error={!!errors.roomPass}
|
|
|
|
rules={{ required: true, minLength: 1 }}
|
|
|
|
fullWidth={true}
|
|
|
|
inputProps={noComplete}
|
2020-05-25 19:32:53 +00:00
|
|
|
InputLabelProps={{ classes: { focused: classes.label } }}
|
2020-05-23 21:51:11 +00:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{props.errorMessage && (
|
|
|
|
<div className={classes.padBottom}>
|
|
|
|
<em>{props.errorMessage}</em>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
|
|
|
|
<div>
|
|
|
|
<ButtonGroup variant="contained">
|
|
|
|
<Button
|
|
|
|
type="submit"
|
|
|
|
onClick={() => {
|
|
|
|
setValue(formName('create'), false);
|
|
|
|
doSubmit();
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
Join game
|
|
|
|
</Button>
|
|
|
|
|
|
|
|
{props.existingRoom ? null : (
|
|
|
|
<Button
|
|
|
|
type="button"
|
|
|
|
onClick={() => {
|
|
|
|
setValue(formName('create'), true);
|
|
|
|
doSubmit();
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
Create new game
|
|
|
|
</Button>
|
|
|
|
)}
|
|
|
|
</ButtonGroup>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
);
|
|
|
|
}
|