inventory / frontend / src / features / auth / LoginForm.js
LoginForm.js
Raw
import React, { useEffect } from "react";
import { Form, Field } from "react-final-form";
import { useSelector, useDispatch } from "react-redux";
import { selectBranch, addAlert } from "../core/mainSlice";
import { login } from "./authSlice";
import { Grid } from "@material-ui/core";
import { unwrapResult } from "@reduxjs/toolkit";
import {
  Container,
  TextField,
  Button,
  Avatar,
  Typography,
  RadioGroup,
  Radio,
  FormControlLabel,
} from "@material-ui/core";
import Messages from "../core/Messages";
import { useTranslation } from "react-i18next";

const LoginForm = () => {
  const { t } = useTranslation();
  const branches = useSelector((state) => state.main.branches);
  const alerts = useSelector((state) => state.main.alerts);
  const dispatch = useDispatch();

  // useEffect(() => {
  //   dispatch(getBranches());
  // }, []);

  const renderBranches = () => {
    if (branches.length > 0) {
      return branches.map((branch) => {
        return (
          <FormControlLabel
            key={branch.id}
            value={branch.name}
            control={<Radio required={true} />}
            required
            onClick={() => {
              dispatch(selectBranch(branch));
            }}
            label={branch.name}
          />
        );
      });
    } else return null;
  };
  return (
    <Grid
      container
      spacing={0}
      direction="column"
      alignItems="center"
      justify="center"
      style={{ minHeight: "100vh" }}
    >
      <Grid item xs={3}>
        <Container component="main" maxWidth="xs">
          {alerts.length > 0 ? <Messages /> : null}
          <Avatar></Avatar>
          <Typography component="h1" variant="h5">
            {process.env.REACT_APP_NAME} {t("auth.LoginForm.Login")}
          </Typography>
          <Form
            onSubmit={(values) => {
              dispatch(login(values))
                .then(unwrapResult)
                .then((originalPromiseResult) => {
                  dispatch(
                    addAlert({
                      name: "info",
                      message: t("messages.SuccessfullyLogedIn"),
                    })
                  );
                })
                .catch((rejectedValueOrSerializedError) => {
                  dispatch(addAlert(rejectedValueOrSerializedError));
                });
            }}
            render={({ handleSubmit, submitting, pristine, values }) => (
              <form onSubmit={handleSubmit} className="ui form error">
                <Field name="username">
                  {({ input, meta }) => (
                    <TextField
                      variant="outlined"
                      margin="normal"
                      required
                      fullWidth
                      label={t("auth.LoginForm.Username")}
                      autoFocus
                      {...input}
                      type="text"
                    />
                  )}
                </Field>
                <Field name="password">
                  {({ input, meta }) => (
                    <TextField
                      variant="outlined"
                      margin="normal"
                      required
                      fullWidth
                      autocomplet="current-password"
                      label={t("auth.LoginForm.Password")}
                      autoFocus
                      {...input}
                      type="password"
                    />
                  )}
                </Field>

                <RadioGroup aria-label="branch" name="branch" required row>
                  {renderBranches()}
                </RadioGroup>

                <Button
                  type="submit"
                  fullWidth
                  variant="contained"
                  color="primary"
                >
                  {t("auth.LoginForm.SignIn")}
                </Button>
              </form>
            )}
          />
        </Container>
      </Grid>
    </Grid>
  );
};

export default LoginForm;