We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
A much simpler implementation without useEffect. This is using useReducer which is much preferred in cases like creating forms.
importReactfrom"react";constACTIONS={UPDATE_FIELD:'updateField',RESET_FORM:'resetForm',}constFORM_FIELDS={USERNAME:'username',EMAIL:'email',EMPLOYEE_ID:'employeeId',JOINED_DATE:'joinedDate',}constinitialArgs={username:'',email:'',employeeId:'',joinedDate:'',errors:{username:'initial',email:'initial',employeeId:'initial',joinedDate:'initial',},}// getting current yearconstgetCurrentDate=()=>{constdate=newDate()returndate.getFullYear()}constvalidateInput=(formField,value)=>{switch(formField){caseFORM_FIELDS.USERNAME:{constalphabetSpacesRegex=/^[A-Za-z\s]*$/if(alphabetSpacesRegex.test(value)&&value.length>3){return''}else{return'Namemustbeatleast4characterslongandonlycontainlettersandspaces.'}}caseFORM_FIELDS.EMAIL:{constemailRegex=/^[^\s@]+@[^\s@]+\.[^\s@]+$/if(emailRegex.test(value)){return''}else{return'Emailmustbeavalidemailaddress'}}caseFORM_FIELDS.EMPLOYEE_ID:{if(typeofvalue==="number"&&`${value}`.length===6){return''}else{return'EmployeeIDmustbeexactly6digits.'}}caseFORM_FIELDS.JOINED_DATE:{constcurrentYear=getCurrentDate()const[yearValue,_m,_d]=value.split("-")if(parseInt(yearValue)<parseInt(currentYear,10)){return''}else{return'JoiningDatecannotbeinthefuture'}}default:{return''}}}constreducer=(state,action)=>{try{if(!Object.hasOwn(action,'type')){throwError('"type"notfound');}switch(action.type){caseACTIONS.UPDATE_FIELD:{// Expecting action to have field and value propif(!Object.hasOwn(action,'field')){throwError('"field"isrequiredtoupdateaformfield')}consterror=validateInput(action.field,action.value)return{...state,[action.field]:action?.value||"",errors:{...state.errors,[action.field]:error},formStates:{...state.formStates,isDirty:true}}}caseACTIONS.RESET_FORM:{returninitialArgs}default:{throwError('Unknownaction.');}}}catch(e){console.log(`ERROR:${e}`)returnstate}}constisAllInputValid=(state)=>{try{constinputFieldsErrors=Object.values(state.errors)returninputFieldsErrors.every(value=>!value)}catch(e){console.log("Validation: Type ERROR")}}functionEmployeeValidationForm(){const[employeeForm,dispatch]=React.useReducer(reducer,initialArgs)constisFormValid=isAllInputValid(employeeForm)constupdateInput=(formField,event,transformInput)=>{letinputValue=event.target.valueif(transformInput){inputValue=transformInput(inputValue)}dispatch({type:ACTIONS.UPDATE_FIELD,field:formField,value:inputValue})}return(<divclassName="layout-column align-items-center mt-20 "><divclassName="layout-column align-items-start mb-10 w-50"data-testid="input-name"><inputclassName="w-100"type="text"name="name"value={employeeForm.username}onChange={(e)=>updateInput(FORM_FIELDS.USERNAME,e)}placeholder="Name"data-testid="input-name-test"/>{employeeForm.errors.username?<pclassName="error mt-2">Namemustbeatleast4characterslongandonlycontainlettersandspaces</p>:null}</div><divclassName="layout-column align-items-start mb-10 w-50"data-testid="input-email"><inputclassName="w-100"type="text"name="email"value={employeeForm.email}onChange={(e)=>updateInput(FORM_FIELDS.EMAIL,e)}placeholder="Email"/>{employeeForm.errors.email?<pclassName="error mt-2">Emailmustbeavalidemailaddress</p>:null}</div><divclassName="layout-column align-items-start mb-10 w-50"data-testid="input-employee-id"><inputclassName="w-100"type="text"name="employeeId"value={employeeForm.employeeId}onChange={(e)=>updateInput(FORM_FIELDS.EMPLOYEE_ID,e,(v)=>parseInt(v,10))}placeholder="Employee ID"/>{employeeForm.errors.employeeId?<pclassName="error mt-2">EmployeeIDmustbeexactly6digits</p>:null}</div><divclassName="layout-column align-items-start mb-10 w-50"data-testid="input-joining-date"><inputclassName="w-100"type="date"name="joiningDate"value={employeeForm.joinedDate}onChange={(e)=>updateInput(FORM_FIELDS.JOINED_DATE,e)}placeholder="Joining Date"/>{employeeForm.errors.joinedDate?<pclassName="error mt-2">JoiningDatecannotbeinthefuture</p>:null}</div><buttondata-testid="submit-btn"type="button"onClick={()=>dispatch({type:ACTIONS.RESET_FORM})}disabled={!isFormValid}>Submit</button></div>);}exportdefaultEmployeeValidationForm;
Cookie support is required to access HackerRank
Seems like cookies are disabled on this browser, please enable them to open this website
Employee Validation
You are viewing a single comment's thread. Return to all comments →
A much simpler implementation without useEffect. This is using useReducer which is much preferred in cases like creating forms.