login.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { NextPage } from "next";
  2. import { useEffect } from "react";
  3. import Layout from "../components/Layout";
  4. import { useAuth } from "../context/UserContext";
  5. import useForm from "../hooks/useForm";
  6. import { useRouter } from "next/router";
  7. import Spinner from "../components/Spinner";
  8. import api from "../utils/api";
  9. const Login: NextPage = () => {
  10. const { login } = useAuth();
  11. const router = useRouter();
  12. const { error, submitHandler, success, loading } = useForm(api.login);
  13. useEffect(() => {
  14. if (success) {
  15. login(success.result);
  16. router.push("/");
  17. }
  18. }, [success, login, router]);
  19. return (
  20. <Layout>
  21. <form className="form" onSubmit={submitHandler} autoComplete="true">
  22. <div className="form-group">
  23. <label htmlFor="email" className="form-label">
  24. Email
  25. </label>
  26. <input
  27. type="email"
  28. name="email"
  29. id="email"
  30. className="form-input"
  31. placeholder="monkey@gmail.com"
  32. required
  33. />
  34. </div>
  35. <div className="form-group">
  36. <label htmlFor="password" className="form-label">
  37. Password
  38. </label>
  39. <input
  40. type="password"
  41. name="password"
  42. id="password"
  43. minLength={6}
  44. className="form-input"
  45. placeholder="••••••"
  46. required
  47. />
  48. </div>
  49. <button
  50. type="submit"
  51. className="default-button col-start-2 w-max"
  52. disabled={loading}
  53. >
  54. {loading ? <Spinner /> : "Log in"}
  55. </button>
  56. {error && !success && (
  57. <div role="alert" className="form-alert-msg">
  58. {error.message}
  59. </div>
  60. )}
  61. </form>
  62. </Layout>
  63. );
  64. };
  65. export default Login;