jefer94/choco

View on GitHub
services/algorithm/src/containers/RegisterContainer.tsx

Summary

Maintainability
D
3 days
Test Coverage
import { ReactElement, useEffect, useState } from 'react'
import Button from '@material-ui/core/Button'
import Typography from '@material-ui/core/Typography'
import { makeStyles } from '@material-ui/core'
import { ServerError } from '@apollo/client'
import Router from 'next/router'
import Link from '../components/Link'
import Field from '../components/Field'
import Backdrop from '../components/Backdrop'
import Snackbar from '../components/Snackbar'
import { useRegisterUser } from '../hooks/useRegisterUser'

const useStyles = makeStyles((theme) => ({
  root: {
    display: 'inline-flex',
    width: 667,
    height: '100vh',
    position: 'absolute',
    justifyContent: 'center'
  },
  container: {
    textAlign: 'center',
    marginTop: 120,
    width: 400,
    position: 'absolute',
    display: 'inline-block'
  },
  form: {
    textAlign: 'center'
  },
  description: {
    fontWeight: 300,
    marginTop: 15,
    marginBottom: 15
  },
  button: {
    width: '100%'
  },
  alternative: {
    marginTop: 30,
    marginBottom: 30
  },
  alternativeText: {
    fontWeight: 300
  },
  alternativeLink: {
    fontWeight: 700
  }
}))

export default function Register(): ReactElement {
  const classes = useStyles()
  // const [register, { loading, data }] = useRegister()
  const [register, request] = useRegisterUser()
  const [username, setUsername] = useState('')
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  const [newPassword, setNewPassword] = useState('')
  const [error, setError] = useState<Record<string, string>>({})

  async function submit(): Promise<void> {
    const newError: Record<string, string> = {}
    setError(newError)
    if (username && email && password && password === newPassword) {
      register({ variables: { input: { username, email, password } } })
      // const response = await axios.post(`${process.env.NEXT_PUBLIC_API
      // .replace(/\/$/, '')}/users`, { username, email, password })
      // const { token } = response.data

      // if (!token) {
      //   const [error] = response.data.errors
      //   if (error === 'dup key: username') setError('Nombre de usuario duplicado')
      //   else if (error === 'dup key: email') setError('Email duplicado')
      //   else setError('Error desconocido')
      //   return
      // }

      // setToken(token)
    }
    else {
      if (!username) newError.username = 'Nombre de usuario vacio'
      if (!email) newError.email = 'Correo vacio'
      if (!password) newError.password = 'Contraseña vacia'
      if (password !== newPassword) newError.newPassword = 'Contraseñas no coinciden'
      setError(newError)
    }
  }

  function getError(): string {
    if (request.error?.networkError) {
      const networkError = request.error.networkError as ServerError
      return networkError.result.errors[0]?.message
    }
    return null
  }

  useEffect(() => {
    const token = request.data?.register?.token
    localStorage.setItem('T__T__T', token)
    Router.push('/')
  }, [request.data])

  return (
    <div className={classes.root}>
      <div className={classes.container}>
        <Backdrop open={request.loading} />
        {request.error?.networkError ?
          <Snackbar open={!!request.error} message={getError()} severity="error" /> : <></>}
        <Typography variant="h5" className={classes.alternativeText}>
          Login in Violet Blog
        </Typography>
        <Typography variant="body2" className={classes.description}>
          Get access to our awesome blog comunity
        </Typography>
        <form className={classes.form}>
          <Field
            id="username"
            label="Username"
            value={username}
            autoComplete="username"
            type="text"
            placeholder="Konan"
            onChange={(v) => setUsername(v.target.value)}
            error={error.username}
          />
          <Field
            id="email"
            label="Email"
            value={email}
            type="email"
            placeholder="Konan@gmail.com"
            onChange={(v) => setEmail(v.target.value)}
            error={error.email}
          />
          <Field
            id="current-password"
            label="Password"
            value={password}
            autoComplete="current-password"
            type="password"
            placeholder="P4ssw0rd!"
            onChange={(v) => setPassword(v.target.value)}
            error={error.password}
          />
          <Field
            id="new-password"
            label="Repeat password"
            value={newPassword}
            autoComplete="new-password"
            type="password"
            placeholder="P4ssw0rd!"
            onChange={(v) => setNewPassword(v.target.value)}
            error={error.newPassword}
          />

          <div className={classes.alternative}>
            <Typography variant="body1" className={classes.alternativeText}>
              Ya tienes una cuenta?
            </Typography>
            <Link href="/register" className={classes.alternativeLink}>acceder</Link>
          </div>

        </form>
        <Button onClick={submit} variant="contained" color="primary" className={classes.button}>Ingresar</Button>
      </div>
    </div>
  )
}