Home > front end >  how to avoid execute two button click functions from one button click?
how to avoid execute two button click functions from one button click?

Time:07-23

I'm trying to implement a toggle function to users sign in and sign up with two buttons (button 1, button 2). Problem is that regardless of which button I click it executes the toggle function. It seems one button click executes both onclick functions.

import React, { useEffect, useState } from "react";
import LockIcon from "@mui/icons-material/Lock";
import VisibilityIcon from "@mui/icons-material/Visibility";
import { GoogleLogin } from "@react-oauth/google";
import jwt_decode from "jwt-decode";
import { useDispatch } from "react-redux";
import { useNavigate } from "react-router-dom";
import "./authStyles.css";
import { signUp, signIn } from "../../action/auth/authAction";

const initialStateForm = {
    fName: "",
    lName: "",
    email: "",
    password: "",
    confirmPassword: "",
};

const Auth = () => {
    const [showPassword, setShowPassword] = useState(true);
    const [isSignup, setIsSignup] = useState(false);
    const [formData, setFormData] = useState(initialStateForm);
    const dispatch = useDispatch();
    const navigate = useNavigate();
    const switchMode = () => {
        setIsSignup((prevIsSignup) => !prevIsSignup);
        setShowPassword(false);
        console.log("switchMode "   isSignup);
    };

    const handleSubmit = (e) => {
        e.preventDefault();
        console.log("handleSubmit "   isSignup);
        // if (isSignup) {
        //  dispatch(signUp(formData));
        // } else {
        //  dispatch(signIn(formData));
        // }
    };

    const handleChnage = (e) => {
        e.preventDefault();
        setFormData({ ...formData, [e.target.name]: e.target.value });
    };

    const handleShowPassword = () => {
        setShowPassword((prevShowPassword) => !prevShowPassword);
    };

    const googleSuccess = async (res) => {
        const decodeUser = jwt_decode(res.credential);
        dispatch({ type: "AUTH", payload: decodeUser });
        navigate("/");
    };
    const googleFailure = (error) => {
        console.log(error);
        console.log("Google sign in is unsuccessfull");
    };

    return (
        <div>
            <div className="sign-form-container">
                <LockIcon></LockIcon>
                <span>{isSignup ? `Sign Up` : `Sign In`}</span>
                {isSignup && (
                    <>
                        <input
                            type="text"
                            id="fName"
                            name="fName"
                            placeholder="First Name"
                            onChange={handleChnage}
                        />
                        <input
                            type="text"
                            id="lName"
                            name="lName"
                            placeholder="Last Name"
                            onChange={handleChnage}
                        />
                    </>
                )}
                <input
                    type="email"
                    id="email"
                    name="email"
                    placeholder="Email"
                    onChange={handleChnage}
                />
                <input
                    type={showPassword ? `password` : `text`}
                    id="password"
                    name="password"
                    placeholder="Password"
                    onChange={handleChnage}
                />
                <VisibilityIcon onClick={handleShowPassword} />
                {isSignup && (
                    <>
                        <input
                            type="password"
                            id="confirmPassword"
                            name="confirmPassword"
                            placeholder="Confirm password"
                            onChange={handleChnage}
                        />
                    </>
                )}
                <GoogleLogin
                    onSuccess={googleSuccess}
                    onFailure={googleFailure}
                    cookiePolicy="single_host_origin"
                ></GoogleLogin>
                <button type="button" onClick={handleSubmit}> //button 1
                    {isSignup ? `Sign Up` : `Sign In`}
                </button>
                <button type="button" onClick={switchMode}> // button 2
                    {isSignup
                        ? "Already have an account ? Sign In"
                        : "Don't have and account? Sign Up"}
                </button>
            </div>
        </div>
    );
};

export default Auth;

One button needs to execute the respective function only. Not both functions. How to avoid this problem?

CodePudding user response:

Try to nest the elements into a form and declare the first button as type=submit:

return (
  <div>
    <form className='sign-form-container' onSubmit={handleSubmit}>
      ...
      <button type='submit'>
        {isSignup ? `Sign Up` : `Sign In`}
      </button>
      <button type='button' onClick={switchMode}>
        {isSignup
          ? 'Already have an account ? Sign In'
          : "Don't have and account? Sign Up"}
      </button>
    </form>
  </div>
);
  • Related