Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AddRegion.tsx 3.36 KiB
import { Grid, TextField } from '@material-ui/core'
import FormControl from '@material-ui/core/FormControl'
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'
import AddIcon from '@material-ui/icons/Add'
import { Alert, AlertTitle } from '@material-ui/lab'
import axios from 'axios'
import { Formik, FormikHelpers } from 'formik'
import React from 'react'
import * as Yup from 'yup'
import { getCities } from '../../../actions/cities'
import { useAppDispatch } from '../../../hooks'
import { AddCityModel, FormModel } from '../../../interfaces/FormModels'
import { AddButton, AddForm } from '../styledComp'

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    table: {
      width: '100%',
    },
    margin: {
      margin: theme.spacing(1),
    },
    button: {
      width: '40px',
      height: '40px',
      marginTop: '20px',
    },
  })
)

type formType = FormModel<AddCityModel>

/** add a region form with some constraints. */
const schema: Yup.SchemaOf<formType> = Yup.object({
  model: Yup.object()
    .shape({
      name: Yup.string()
        .required('Minst två bokstäver krävs')
        .min(2)
        .matches(/[a-zA-Z]/, 'Namnet får enbart innehålla a-z, A-Z.'),
    })
    .required(),
  error: Yup.string().optional(),
})

const AddRegion: React.FC = (props: any) => {
  const classes = useStyles()
  const dispatch = useAppDispatch()

  const handleSubmit = async (values: formType, actions: FormikHelpers<formType>) => {
    const params = {
      name: values.model.name,
    }
    await axios
      .post('/api/misc/cities', params)
      .then(() => {
        actions.resetForm()
        dispatch(getCities())
      })
      .catch(({ response }) => {
        console.warn(response.data)
        if (response.data && response.data.message)
          actions.setFieldError('error', response.data && response.data.message)
        else actions.setFieldError('error', 'Something went wrong, please try again')
      })
      .finally(() => {
        actions.setSubmitting(false)
      })
  }

  const initValues: formType = {
    model: { name: '' },
  }

  return (
    <Formik initialValues={initValues} validationSchema={schema} onSubmit={handleSubmit}>
      {(formik) => (
        <AddForm onSubmit={formik.handleSubmit}>
          <FormControl className={classes.margin}>
            <Grid container={true}>
              <TextField
                className={classes.margin}
                helperText={formik.touched.model?.name ? formik.errors.model?.name : ''}
                error={Boolean(formik.touched.model?.name && formik.errors.model?.name)}
                onChange={formik.handleChange}
                onBlur={formik.handleBlur}
                name="model.name"
                label="Region"
              ></TextField>
              <AddButton
                style={{ backgroundColor: '#4caf50', color: '#fcfcfc' }}
                className={classes.button}
                color="default"
                variant="contained"
                type="submit"
              >
                <AddIcon></AddIcon>
              </AddButton>
            </Grid>
          </FormControl>
          {formik.errors.error && (
            <Alert severity="error">
              <AlertTitle>Error</AlertTitle>
              {formik.errors.error}
            </Alert>
          )}
        </AddForm>
      )}
    </Formik>
  )
}

export default AddRegion