client-web/src/pages/Signon/UsernameSignInForm.tsx
import * as React from "react";
import TextField from "@mui/material/TextField";
import Button from "@mui/material/Button";
import Input from "@mui/material/Input";
import InputAdornment from "@mui/material/InputAdornment";
import IconButton from "@mui/material/IconButton";
import Box from "@mui/material/Box";
import Visibility from "@mui/icons-material/Visibility";
import VisibilityOff from "@mui/icons-material/VisibilityOff";
import FormControl from "@mui/material/FormControl";
import InputLabel from "@mui/material/InputLabel";
import FormHelperText from "@mui/material/FormHelperText";
import { useFormik } from "formik";
import { loginUsername } from "../../http";
import { Typography } from "@mui/material";
import { useHistory } from "react-router-dom";
import { useStoreState } from "../../store";
const validate = (values: Record<string, string>) => {
const errors: Record<string, string> = {};
if (!values.username) {
errors.username = "Required";
}
if (!values.password) {
errors.password = "Required";
} else if (values.password.length <= 2) {
errors.password = "Must be 2 characters or more";
}
return errors;
};
type TProps = {
closeModal: () => void;
};
export function UsernameSignInForm(props: TProps) {
const setUser = useStoreState((state) => state.setUser);
const history = useHistory();
const formik = useFormik({
initialValues: {
username: "",
password: "",
},
validate,
onSubmit: (values) => {
setDisableSubmit(true);
loginUsername(values.username, values.password)
.then((result) => {
setUser({
firstName: result.data.user.firstName,
lastName: result.data.user.lastName,
description: result.data.user.description,
xmppPassword: result.data.user.xmppPassword,
_id: result.data.user._id,
walletAddress: result.data.user.defaultWallet.walletAddress,
token: result.data.token,
refreshToken: result.data.refreshToken,
profileImage: result.data.user.profileImage,
isProfileOpen: result.data.user.isProfileOpen,
isAssetsOpen: result.data.user.isAssetsOpen,
ACL: result.data.user.ACL,
appId: result.data.user.appId,
referrerId: result.data.user.referrerId || ''
});
props.closeModal();
history.push(
`/profile/${result.data.user.defaultWallet.walletAddress}`
);
})
.catch((error) => {
console.log(error);
setHttpError("http Error");
if (error.response) {
if (
error.response.status === 404 ||
error.response.status === 401
) {
setHttpError("Wrong credentials");
}
}
})
.finally(() => {
setDisableSubmit(false);
});
},
});
const [showPassword, setShowPassword] = React.useState(false);
const [disableSubmit, setDisableSubmit] = React.useState(false);
const [httpError, setHttpError] = React.useState("");
return (
<form onSubmit={formik.handleSubmit}>
<TextField
inputProps={{
autoComplete: "off",
}}
error={formik.touched.username && formik.errors.username ? true : false}
helperText={
formik.touched.username && formik.errors.username
? formik.errors.username
: ""
}
margin="dense"
label="Username"
name="username"
fullWidth
variant="standard"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.username}
/>
<FormControl
error={formik.touched.password && formik.errors.password ? true : false}
fullWidth
variant="standard"
>
<InputLabel htmlFor="standard-adornment-password">Password</InputLabel>
<Input
type={showPassword ? "text" : "password"}
fullWidth
name="password"
value={formik.values.password}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
endAdornment={
<InputAdornment position="end">
<IconButton
aria-label="toggle password visibility"
onClick={() => setShowPassword((show) => !show)}
>
{showPassword ? <VisibilityOff /> : <Visibility />}
</IconButton>
</InputAdornment>
}
/>
{formik.touched.password && formik.errors.password && (
<FormHelperText>{formik.errors.password}</FormHelperText>
)}
</FormControl>
{!!httpError && (
<Typography sx={{ color: "error.main" }} component="p">
{httpError}
</Typography>
)}
<Box sx={{ margin: 2, display: "flex", justifyContent: "center" }}>
<Button disabled={disableSubmit} type="submit" variant="contained">
Continue
</Button>
</Box>
</form>
);
}