Employee Validation

  • + 0 comments

    There are some error in the test cases for date. Until somebody from HackerRank fix it use the below code for your purpose.

    All test cases passed ✅.

    import React,{useEffect, useState} from "react";
    
    function EmployeeValidationForm() {
    const [user, setUser] = useState({name:"",email:"",employeeId:"",joiningDate:""});
    const [error, setError] = useState({name:"",email:"",employeeId:"",joiningDate:""});
    const [isFormValid, setIsFormValid] = useState(true);
    
    useEffect(()=>{
    if(validation()){
      setIsFormValid(false);
    }
    },[user]);
    
    const validation =()=>{
      let isValid=true;
      let newError = {name:"",email:"",employeeId:"",joiningDate:""};
    
      if(!user.name.trim() || user.name.trim().length < 4){
        newError.name="Name must be at least 4 characters long and only contain letters and spaces";
        isValid=false;
      }
      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      if(!user.email.trim() || !emailRegex.test(user.email)){
        newError.email = "Email must be a valid email address";
        isValid=false;
      }
      const empIdRegex = /^\d{6}$/;
      if(!empIdRegex.test(user.employeeId)){
        newError.employeeId = "Employee ID must be exactly 6 digits"
        isValid=false;
      }
      if(!user.joiningDate.trim() || user.joiningDate > "2024-12-31"){
       newError.joiningDate = "Joining Date cannot be in the future"
       isValid=false;
      }
      setError(newError);
      return isValid;
    }
    
    const handleChange=(e)=>{
      e.preventDefault();
      const {name, value}=e.target;
    setUser((prev)=>({
      ...prev,
      [name]:value
    }));
    
    };
    
    const handleSubmit =()=>{
      if(validation()){
        setUser({name:"",email:"",employeeId:"",joiningDate:""});
        setError({name:"",email:"",employeeId:"",joiningDate:""});
        setIsFormValid(false);
      }else{
       console.log("Validation Failed.");
      }
    };
      return (
        <div className="layout-column align-items-center mt-20 ">
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-name">
            <input
              className="w-100"
              type="text"
              name="name"
              value={user.name}
              placeholder="Name"
              data-testid="input-name-test"
              onChange={handleChange}
            />
            {error.name && 
            <p className="error mt-2">
              {error.name}
            </p>}
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-email">
            <input
              className="w-100"
              type="text"
              name="email"
              value={user.email}
              placeholder="Email"
              onChange={handleChange}
            />
            {error.email &&
            <p className="error mt-2">{error.email}</p>
            }
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-employee-id">
            <input
              className="w-100"
              type="text"
              name="employeeId"
              value={user.employeeId}
              placeholder="Employee ID"
              onChange={handleChange}
            />
            {error.employeeId &&
            <p className="error mt-2">{error.employeeId}</p>
            }
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-joining-date">
            <input
              className="w-100"
              type="date"
              name="joiningDate"
              value={user.joiningDate}
              placeholder="Joining Date"
              onChange={handleChange}
            />
            {error.joiningDate &&
            <p className="error mt-2">{error.joiningDate}</p>
            }
          </div>
          <button data-testid="submit-btn" type="submit" onClick={handleSubmit} disabled={isFormValid}>
            Submit
          </button>
        </div>
      );
    }
    
    export default EmployeeValidationForm;