You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 line
2.2 KiB

  1. import { useMutation } from "@tanstack/react-query";
  2. import React, { useState } from "react";
  3. import { Link, useNavigate } from "react-router-dom";
  4. import { signUpHelper } from "../utils/http";
  5. import { useDispatch } from "react-redux";
  6. import { signInSuccess } from "../redux/user/userSlice";
  7. const Signup = () => {
  8. const [user, setUser] = useState({ username: "", password: "", email: "" });
  9. const dispatch = useDispatch();
  10. const navigate = useNavigate();
  11. const { mutate, isPending, isError, error } = useMutation({
  12. mutationFn: signUpHelper,
  13. onSuccess: (data) => {
  14. dispatch(signInSuccess(data));
  15. navigate("/authcheck", { replace: true });
  16. },
  17. });
  18. const formSubmitHandler = (e) => {
  19. e.preventDefault();
  20. mutate({ formData: user });
  21. };
  22. const formInputChangeHandler = (event) => {
  23. setUser((prevUser) => ({
  24. ...prevUser,
  25. [event.target.id]: event.target.value,
  26. }));
  27. };
  28. return (
  29. <div className='max-w-lg mx-auto mt-32'>
  30. <h1 className='text-center text-3xl font-bold'>Sign Up</h1>
  31. <form
  32. onSubmit={formSubmitHandler}
  33. className='flex flex-col gap-3 mt-8'
  34. >
  35. <input
  36. id='username'
  37. onChange={formInputChangeHandler}
  38. type='text'
  39. className='p-3 rounded-lg border'
  40. placeholder='Username'
  41. />
  42. <input
  43. onChange={formInputChangeHandler}
  44. id='email'
  45. type='text'
  46. className='p-3 rounded-lg border'
  47. placeholder='Email'
  48. />
  49. <input
  50. onChange={formInputChangeHandler}
  51. id='password'
  52. type='password'
  53. className='p-3 rounded-lg border'
  54. placeholder='Password'
  55. />
  56. <button
  57. disabled={isPending}
  58. className='p-3 rounded-[32px] text-white uppercase font-bold transition duration-300 shadow hover:shadow-lg hover:opacity-95 bg-teal-600 hover:bg-teal-700'
  59. >
  60. {isPending ? "Submitting..." : `Submit`}
  61. </button>
  62. </form>
  63. <div className='flex gap-2 mt-2'>
  64. <p>Have an account?</p>
  65. <Link to={"/"}>
  66. <span className='text-blue-700'>Sign in</span>
  67. </Link>
  68. </div>
  69. </div>
  70. );
  71. };
  72. export default Signup;