-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathSignUp.tsx
111 lines (105 loc) · 4.49 KB
/
SignUp.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import * as React from 'react';
import {
createTheme,
/*TextField, FormControl,*/
FormHelperText,
Input
} from '@material-ui/core';
import { ThemeProvider } from '@material-ui/core/styles';
import { Async } from 'react-form-with-constraints';
import { checkUsernameAvailability } from '../../react-form-with-constraints/src/checkUsernameAvailability';
import { FieldFeedbacksEnzymeFix as FieldFeedbacks } from './FieldFeedbacksEnzymeFix';
import { FieldFeedback, FormControl, FormWithConstraints, TextField } from './Material';
const defaultTheme = createTheme();
export class SignUp extends React.Component {
form: FormWithConstraints | null = null;
username: HTMLInputElement | null = null;
password: HTMLInputElement | null = null;
passwordConfirm: HTMLInputElement | null = null;
render() {
return (
// Without MuiThemeProvider we get:
//
// Warning: Material-UI: you are providing a theme function property to the MuiThemeProvider component:
// <MuiThemeProvider theme={outerTheme => outerTheme} />
// However, no outer theme is present.
// Make sure a theme is already injected higher in the React tree or provide a theme object.
<ThemeProvider theme={defaultTheme}>
<FormWithConstraints ref={formWithConstraints => (this.form = formWithConstraints)}>
<TextField
name="username"
inputRef={username => (this.username = username)}
helperText={
<FieldFeedbacks for="username">
<FieldFeedback when={value => value.length === 0}>Cannot be empty</FieldFeedback>
<FieldFeedback when={value => value.length < 3}>
Should be at least 3 characters long
</FieldFeedback>
<Async
promise={checkUsernameAvailability}
pending={<span style={{ display: 'block' }}>...</span>}
then={availability =>
availability.available ? (
<FieldFeedback key="1" info>
Username '{availability.value}' available
</FieldFeedback>
) : (
<FieldFeedback key="2">
Username '{availability.value}' already taken, choose another
</FieldFeedback>
)
}
catch={e => <FieldFeedback>{e.message}</FieldFeedback>}
/>
<FieldFeedback when="valid">Looks good!</FieldFeedback>
</FieldFeedbacks>
}
/>
{/* Could be also written using <TextField> */}
<FormControl>
<Input
type="password"
id="password"
name="password"
inputRef={password => (this.password = password)}
/>
<FormHelperText>
<FieldFeedbacks for="password">
<FieldFeedback when={value => value.length === 0}>Cannot be empty</FieldFeedback>
<FieldFeedback when={value => value.length < 5}>
Should be at least 5 characters long
</FieldFeedback>
<FieldFeedback when={value => !/\d/.test(value)} warning>
Should contain numbers
</FieldFeedback>
<FieldFeedback when={value => !/[a-z]/.test(value)} warning>
Should contain small letters
</FieldFeedback>
<FieldFeedback when={value => !/[A-Z]/.test(value)} warning>
Should contain capital letters
</FieldFeedback>
<FieldFeedback when={value => !/\W/.test(value)} warning>
Should contain special characters
</FieldFeedback>
<FieldFeedback when="valid">Looks good!</FieldFeedback>
</FieldFeedbacks>
</FormHelperText>
</FormControl>
<TextField
type="password"
name="passwordConfirm"
inputRef={passwordConfirm => (this.passwordConfirm = passwordConfirm)}
helperText={
<FieldFeedbacks for="passwordConfirm">
<FieldFeedback when={value => value !== this.password!.value}>
Not the same password
</FieldFeedback>
<FieldFeedback when="valid">Looks good!</FieldFeedback>
</FieldFeedbacks>
}
/>
</FormWithConstraints>
</ThemeProvider>
);
}
}