in source/app/pages/index.js [31:156]
export default function Login() {
const [credentials, setCredentials] = useState({
username: "",
password: "",
passwordChangeRequired: false,
newPassword: "",
userInit: undefined
});
const [error, setError] = useState("");
const [isLoading, setIsLoading] = useState(false);
const {
username,
password,
passwordChangeRequired,
newPassword,
userInit
} = credentials;
let userInputForm;
const handleLoginSubmit = useCallback(
async e => {
e.preventDefault();
setIsLoading(true);
try {
const userInit = await Auth.signIn(username, password);
if (userInit && userInit.challengeName === "NEW_PASSWORD_REQUIRED") {
setCredentials({
passwordChangeRequired: true,
userInit: userInit
});
setIsLoading(false);
} else {
userInit.signInUserSession && Router.push("/home");
}
} catch ({ message }) {
setError(message);
setIsLoading(false);
}
},
[username, password, passwordChangeRequired, userInit]
);
const handlePasswordResetSubmit = useCallback(
async e => {
e.preventDefault();
setIsLoading(true);
try {
const user = await Auth.completeNewPassword(userInit, newPassword);
user.signInUserSession && Router.push("/home");
} catch ({ message }) {
setError(message);
setIsLoading(false);
}
},
[userInit, newPassword]
);
const handleFormChange = useCallback(
e => {
const { name, value } = e.target;
setCredentials(credentials => ({ ...credentials, [name]: value }));
},
[username, password, passwordChangeRequired, newPassword, userInit]
);
const loginForm = () => {
return (
<form onSubmit={handleLoginSubmit}>
<p>
<FormInput
autoComplete="username"
type="text"
name="username"
label="Username"
value={username}
onChange={handleFormChange}
/>
</p>
<p>
<FormInput
autoComplete="current-password"
type="password"
name="password"
label="Password"
value={password}
onChange={handleFormChange}
/>
</p>
<Button disabled={isLoading}>Login</Button>
{error && <p className={css.error}>{error}</p>}
</form>
);
};
const passwordResetForm = () => {
return (
<form onSubmit={handlePasswordResetSubmit}>
<p>
<FormInput
autoComplete="new-password"
type="password"
name="newPassword"
label="New Password"
value={newPassword}
onChange={handleFormChange}
/>
</p>
<Button disabled={isLoading}>Login</Button>
{error && <p className={css.error}>{error}</p>}
</form>
);
};
userInputForm = passwordChangeRequired ? passwordResetForm() : loginForm();
return (
<article>
<div className={css.form}>
<h2>Login</h2>
{userInputForm}
{isLoading && <Loading />}
</div>
</article>
);
}