Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

RegisterForm.tsx 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import {
  2. Box,
  3. Button,
  4. Container,
  5. Grid,
  6. IconButton,
  7. InputAdornment,
  8. TextField,
  9. Typography,
  10. } from '@mui/material';
  11. import { useFormik } from 'formik';
  12. import { useTranslation } from 'next-i18next';
  13. import Link from 'next/link';
  14. import { useRouter } from 'next/router';
  15. import { useState } from 'react';
  16. import { FORGOT_PASSWORD_PAGE, LOGIN_PAGE } from '../../../constants/pages';
  17. import { createUser } from '../../../requests/accounts/accountRequests';
  18. import { registerSchema } from '../../../schemas/registerSchema';
  19. import ErrorMessageComponent from '../../mui/ErrorMessageComponent';
  20. interface Values {
  21. fullName: string;
  22. username: string;
  23. email: string;
  24. password: string;
  25. address: string;
  26. address2: string;
  27. city: string;
  28. country: string;
  29. postcode: string;
  30. }
  31. const RegisterForm = () => {
  32. const { t } = useTranslation(['forms', 'register']);
  33. const router = useRouter();
  34. const [showPassword, setShowPassword] = useState(false);
  35. const handleClickShowPassword = () => setShowPassword(!showPassword);
  36. const handleMouseDownPassword = () => setShowPassword(!showPassword);
  37. const [showConfirmPassword, setShowConfirmPassword] = useState(false);
  38. const handleClickShowConfirmPassword = () =>
  39. setShowConfirmPassword(!showConfirmPassword);
  40. const handleMouseDownConfirmPassword = () =>
  41. setShowConfirmPassword(!showConfirmPassword);
  42. const [error, setError] = useState({ hasError: false, errorMessage: '' });
  43. const submitHandler = async (values: Values) => {
  44. try {
  45. const result = await createUser(
  46. values.fullName,
  47. values.username,
  48. values.email,
  49. values.password,
  50. values.address,
  51. values.address2,
  52. values.city,
  53. values.country,
  54. values.postcode
  55. );
  56. router.push(LOGIN_PAGE);
  57. } catch (error) {
  58. if (error instanceof Error) {
  59. setError({ hasError: true, errorMessage: error?.message });
  60. }
  61. }
  62. };
  63. const formik = useFormik({
  64. initialValues: {
  65. fullName: '',
  66. username: '',
  67. email: '',
  68. password: '',
  69. confirmPassword: '',
  70. address: '',
  71. address2: '',
  72. city: '',
  73. country: '',
  74. postcode: '',
  75. },
  76. validationSchema: registerSchema,
  77. onSubmit: submitHandler,
  78. validateOnBlur: true,
  79. enableReinitialize: true,
  80. });
  81. return (
  82. <Container component="main" maxWidth="md">
  83. <Box
  84. sx={{
  85. marginTop: 10,
  86. display: 'flex',
  87. flexDirection: 'column',
  88. alignItems: 'center',
  89. }}
  90. >
  91. <Typography component="h1" variant="h5">
  92. {t('register:Title')}
  93. </Typography>
  94. {error.hasError && <ErrorMessageComponent error={error.errorMessage} />}
  95. <Box
  96. component="form"
  97. onSubmit={formik.handleSubmit}
  98. sx={{ position: 'relative', mt: 1, p: 1 }}
  99. >
  100. <TextField
  101. name="fullName"
  102. label={t('forms:FullName')}
  103. margin="normal"
  104. value={formik.values.fullName}
  105. onChange={formik.handleChange}
  106. error={formik.touched.fullName && Boolean(formik.errors.fullName)}
  107. helperText={formik.touched.fullName && formik.errors.fullName}
  108. autoFocus
  109. fullWidth
  110. />
  111. <TextField
  112. name="username"
  113. label={t('forms:Username')}
  114. margin="normal"
  115. value={formik.values.username}
  116. onChange={formik.handleChange}
  117. error={formik.touched.username && Boolean(formik.errors.username)}
  118. helperText={formik.touched.username && formik.errors.username}
  119. fullWidth
  120. />
  121. <TextField
  122. name="email"
  123. label={t('forms:Email')}
  124. margin="normal"
  125. value={formik.values.email}
  126. onChange={formik.handleChange}
  127. error={formik.touched.email && Boolean(formik.errors.email)}
  128. helperText={formik.touched.email && formik.errors.email}
  129. fullWidth
  130. />
  131. <TextField
  132. name="password"
  133. label={t('forms:Password')}
  134. margin="normal"
  135. type={showPassword ? 'text' : 'password'}
  136. value={formik.values.password}
  137. onChange={formik.handleChange}
  138. error={formik.touched.password && Boolean(formik.errors.password)}
  139. helperText={formik.touched.password && formik.errors.password}
  140. fullWidth
  141. InputProps={{
  142. endAdornment: (
  143. <InputAdornment position="end">
  144. <IconButton
  145. onClick={handleClickShowPassword}
  146. onMouseDown={handleMouseDownPassword}
  147. ></IconButton>
  148. </InputAdornment>
  149. ),
  150. }}
  151. />
  152. <TextField
  153. name="confirmPassword"
  154. label={t('forms:ConfirmPassword')}
  155. margin="normal"
  156. type={showPassword ? 'text' : 'password'}
  157. value={formik.values.confirmPassword}
  158. onChange={formik.handleChange}
  159. error={
  160. formik.touched.confirmPassword &&
  161. Boolean(formik.errors.confirmPassword)
  162. }
  163. helperText={
  164. formik.touched.confirmPassword && formik.errors.confirmPassword
  165. }
  166. fullWidth
  167. InputProps={{
  168. endAdornment: (
  169. <InputAdornment position="end">
  170. <IconButton
  171. onClick={handleClickShowConfirmPassword}
  172. onMouseDown={handleMouseDownConfirmPassword}
  173. ></IconButton>
  174. </InputAdornment>
  175. ),
  176. }}
  177. />
  178. <TextField
  179. name="address"
  180. label="Address"
  181. margin="normal"
  182. value={formik.values.address}
  183. onChange={formik.handleChange}
  184. error={formik.touched.address && Boolean(formik.errors.address)}
  185. helperText={formik.touched.address && formik.errors.address}
  186. fullWidth
  187. />
  188. <TextField
  189. name="address"
  190. label="Address2"
  191. margin="normal"
  192. value={formik.values.address2}
  193. onChange={formik.handleChange}
  194. error={formik.touched.address2 && Boolean(formik.errors.address2)}
  195. helperText={formik.touched.address2 && formik.errors.address2}
  196. fullWidth
  197. />
  198. <TextField
  199. name="city"
  200. label="City"
  201. margin="normal"
  202. value={formik.values.city}
  203. onChange={formik.handleChange}
  204. error={formik.touched.city && Boolean(formik.errors.city)}
  205. helperText={formik.touched.city && formik.errors.city}
  206. fullWidth
  207. />
  208. <TextField
  209. name="country"
  210. label="Country"
  211. margin="normal"
  212. value={formik.values.country}
  213. onChange={formik.handleChange}
  214. error={formik.touched.country && Boolean(formik.errors.country)}
  215. helperText={formik.touched.country && formik.errors.country}
  216. fullWidth
  217. />
  218. <TextField
  219. name="postcode"
  220. label="Postal Code"
  221. margin="normal"
  222. value={formik.values.postcode}
  223. onChange={formik.handleChange}
  224. error={formik.touched.postcode && Boolean(formik.errors.postcode)}
  225. helperText={formik.touched.postcode && formik.errors.postcode}
  226. fullWidth
  227. />
  228. <Button
  229. type="submit"
  230. variant="contained"
  231. sx={{ mt: 3, mb: 2 }}
  232. fullWidth
  233. >
  234. {t('register:RegisterBtn')}
  235. </Button>
  236. <Grid container>
  237. <Grid
  238. item
  239. xs={12}
  240. md={6}
  241. sx={{ textAlign: { xs: 'center', md: 'left' }, mt: 1 }}
  242. >
  243. <Link href={FORGOT_PASSWORD_PAGE}>
  244. <Typography sx={{ cursor: 'pointer' }}>
  245. {t('register:ForgotPassword')}
  246. </Typography>
  247. </Link>
  248. </Grid>
  249. <Grid
  250. item
  251. xs={12}
  252. md={6}
  253. sx={{ textAlign: { xs: 'center', md: 'right' }, mt: 1 }}
  254. >
  255. <Link href={LOGIN_PAGE}>
  256. <Typography sx={{ cursor: 'pointer' }}>
  257. {t('register:HaveAccount')}
  258. </Typography>
  259. </Link>
  260. </Grid>
  261. </Grid>
  262. </Box>
  263. </Box>
  264. </Container>
  265. );
  266. };
  267. export default RegisterForm;