Skip to content
Snippets Groups Projects
Login.tsx 3.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • Albin Henriksson's avatar
    Albin Henriksson committed
    import { Button, TextField } from '@material-ui/core'
    import { withStyles } from '@material-ui/core/styles'
    import { Alert, AlertTitle } from '@material-ui/lab'
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
    import axios from 'axios'
    
    Albin Henriksson's avatar
    Albin Henriksson committed
    import { Formik, FormikHelpers } from 'formik'
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
    import React, { useState } from 'react'
    import * as Yup from 'yup'
    import { LoginModel } from '../interfaces/models'
    
    Albin Henriksson's avatar
    Albin Henriksson committed
    import './Login.css'
    
    const styles = {}
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
    
    interface LoginState {
      status: number
      message: string
    }
    
    interface LoginFormModel {
      model: LoginModel
      error?: string
    }
    
    
    Albin Henriksson's avatar
    Albin Henriksson committed
    interface ServerResponse {
      code: number
      message: string
    }
    
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
    const schema: Yup.SchemaOf<LoginFormModel> = Yup.object({
      model: Yup.object()
        .shape({
    
          email: Yup.string().email('Email inte giltig').required('Email krävs'),
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
          password: Yup.string()
    
            .required('Lösenord krävs')
            .min(6, 'Lösenord måste vara minst 6 karaktärer')
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
        })
        .required(),
      error: Yup.string().optional()
    })
    
    
    Albin Henriksson's avatar
    Albin Henriksson committed
    const handleSubmit = async (
      values: LoginFormModel,
      actions: FormikHelpers<LoginFormModel>
    ) => {
      await axios
        .post<ServerResponse>(`users/login`, values.model)
        .then((res) => {
          actions.resetForm()
        })
        .catch(({ response }) => {
          actions.setFieldError('error', response.data.message)
        })
        .finally(() => {
          actions.setSubmitting(false)
        })
    }
    
    const LoginForm: React.FC = (props) => {
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
      const [serverState, setServerState] = useState<LoginFormModel>()
      const initialValues: LoginFormModel = { model: { email: '', password: '' } }
      return (
    
    Albin Henriksson's avatar
    Albin Henriksson committed
        <div className="login-page">
          <Formik
            initialValues={initialValues}
            validationSchema={schema}
            onSubmit={handleSubmit}
          >
            {(formik) => (
              <form onSubmit={formik.handleSubmit} className="login-form">
                <TextField
    
                  label="Email Adress"
    
    Albin Henriksson's avatar
    Albin Henriksson committed
                  name="model.email"
                  helperText={
                    formik.touched.model?.email ? formik.errors.model?.email : ''
                  }
                  error={Boolean(formik.errors.model?.email)}
                  onChange={formik.handleChange}
                  onBlur={formik.handleBlur}
                  margin="normal"
                />
                <TextField
    
                  label="Lösenord"
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
                  name="model.password"
                  type="password"
    
    Albin Henriksson's avatar
    Albin Henriksson committed
                  helperText={
                    formik.touched.model?.password
                      ? formik.errors.model?.password
                      : ''
                  }
                  error={Boolean(formik.errors.model?.password)}
                  onChange={formik.handleChange}
                  onBlur={formik.handleBlur}
                  margin="normal"
    
    Carl Schönfelder's avatar
    Carl Schönfelder committed
                />
    
    Albin Henriksson's avatar
    Albin Henriksson committed
                <Button
                  type="submit"
                  fullWidth
                  variant="contained"
                  color="primary"
                  disabled={!formik.isValid}
                >
                  Submit
                </Button>
                {formik.errors.error ? (
                  <Alert severity="error">
                    <AlertTitle>Error</AlertTitle>
                    {formik.errors.error}
                  </Alert>
                ) : (
                  <div />
                )}
              </form>
            )}
          </Formik>
        </div>
    
    Albin Henriksson's avatar
    Albin Henriksson committed
    export default withStyles(styles)(LoginForm)