Skip to content

Commit

Permalink
utilize error handling from registration provider
Browse files Browse the repository at this point in the history
  • Loading branch information
SimeJadrijev committed Jan 31, 2025
1 parent e6d5170 commit 2b9cdae
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 53 deletions.
9 changes: 4 additions & 5 deletions apps/app/src/components/ProgressBar/ProgressBar.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useRegistration } from '../../providers/RegistrationContext';
import c from './ProgressBar.module.scss';
import { ProgressBarTab } from './ProgressBarTab';
import React from 'react';
Expand All @@ -11,17 +12,15 @@ export const ProgressBar = ({
currentStep,
setCurrentStep,
}: ProgressBarProps) => {
const isAllowedForNextStep = () => {
return true;
};
const { isStepValid } = useRegistration();

const handleStepClick = (clickedStep: number) => {
const isGoingBackwards = clickedStep <= currentStep;
const isGoingForward = clickedStep === currentStep + 1;

console.log(isStepValid(currentStep));
if (isGoingBackwards) {
setCurrentStep(clickedStep);
} else if (isGoingForward && isAllowedForNextStep()) {
} else if (isGoingForward && isStepValid(currentStep)) {
setCurrentStep(clickedStep);
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { ChangeEvent, useEffect, useState } from 'react';
import { ChangeEvent, useEffect } from 'react';
import { Input } from '../../Input';
import c from './FirstStepRegistrationForm.module.scss';
import { Checkbox } from '../../Checkbox';
import { RegistrationFormErrors } from '../../../types/errors/errors.dto';
import { validateField } from '../../../helpers/validateInput';
import { UserDataFields } from '../../../types/user/user.dto';
import { useRegistration } from '../../../providers/RegistrationContext';

type UserData = {
firstName: string;
Expand All @@ -28,7 +29,16 @@ export const FirstStepRegistrationForm = ({
updateUserData,
isSubmitted,
}: Props) => {
const [errors, setErrors] = useState<RegistrationFormErrors>({});
const { errors, clearStepErrors, setStepErrors } = useRegistration();

const firstStepFields: (keyof UserData)[] = [
UserDataFields.FirstName,
UserDataFields.LastName,
UserDataFields.Email,
UserDataFields.Password,
UserDataFields.RepeatedPassword,
UserDataFields.TermsAndConditionsEnabled,
];

const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
Expand All @@ -40,26 +50,52 @@ export const FirstStepRegistrationForm = ({
updateUserData({ [name]: checked });
};

useEffect(() => {
if (isSubmitted) {
const newErrors: RegistrationFormErrors = {};
const validateFirstStep = () => {
const newErrors: Partial<RegistrationFormErrors> = {};

Object.keys(userData).forEach((key) => {
const error = validateField(
key as keyof UserData,
userData[key as keyof UserData],
userData,
);
firstStepFields.forEach((key) => {
const error = validateField(key, userData[key], userData);

if (error) {
newErrors[key as keyof RegistrationFormErrors] = error;
}
});
if (error) {
newErrors[key] = error;
} else {
newErrors[key] = '';
}
});

if (Object.keys(newErrors).length > 0) {
setStepErrors(1, newErrors);
} else {
clearStepErrors(1);
}
};

setErrors(newErrors);
useEffect(() => {
if (isSubmitted) {
validateFirstStep();
}
}, [isSubmitted, userData]);

Check warning on line 77 in apps/app/src/components/RegistrationForms/FirstStepRegistrationForm/FirstStepRegistrationForm.tsx

View workflow job for this annotation

GitHub Actions / Run ESLint (app)

React Hook useEffect has a missing dependency: 'validateFirstStep'. Either include it or remove the dependency array

// useEffect(() => {
// if (isSubmitted) {
// const newErrors: Partial<RegistrationFormErrors> = {};

// firstStepFields.forEach((key) => {
// const error = validateField(key, userData[key], userData);

// if (error) {
// newErrors[key] = error;
// }
// });

// if (Object.keys(newErrors).length > 0) {
// setStepErrors(1, newErrors);
// } else {
// clearStepErrors(1);
// }
// }
// }, [isSubmitted, userData, setStepErrors, clearStepErrors]);

return (
<>
<div className={c.inputFieldsWrapper}>
Expand All @@ -68,36 +104,36 @@ export const FirstStepRegistrationForm = ({
value={userData.firstName}
placeholder='Ime'
onChange={handleInputChange}
error={errors.firstName}
error={errors[1]?.firstName}
/>
<Input
name={UserDataFields.LastName}
value={userData.lastName}
placeholder='Prezime'
onChange={handleInputChange}
error={errors.lastName}
error={errors[1]?.lastName}
/>
<Input
name={UserDataFields.Email}
value={userData.email}
placeholder='Email'
onChange={handleInputChange}
error={errors.email}
error={errors[1]?.email}
/>
<Input
name={UserDataFields.Password}
value={userData.password}
placeholder='Lozinka'
onChange={handleInputChange}
error={errors.password}
error={errors[1]?.password}
type='password'
/>
<Input
name={UserDataFields.RepeatedPassword}
value={userData.repeatedPassword}
placeholder='Potvrdite lozinku'
onChange={handleInputChange}
error={errors.repeatedPassword}
error={errors[1]?.repeatedPassword}
type='password'
/>
</div>
Expand All @@ -108,23 +144,23 @@ export const FirstStepRegistrationForm = ({
checked={userData.newsletterEnabled}
name={UserDataFields.NewsletterEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
error={errors[1]?.termsAndConditionsEnabled}
key={1}
/>
<Checkbox
label='Želim primati novosti o tvrtkama i otvorenim radnim pozicijama.'
checked={userData.companiesNewsEnabled}
name={UserDataFields.CompaniesNewsEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
error={errors[1]?.termsAndConditionsEnabled}
key={2}
/>
<Checkbox
label='Slažem se s uvjetima i odredbama.'
checked={userData.termsAndConditionsEnabled}
name={UserDataFields.TermsAndConditionsEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
error={errors[1]?.termsAndConditionsEnabled}
key={3}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { ChangeEvent, useEffect, useState } from 'react';
import { ChangeEvent, useEffect } from 'react';
import c from './SecondStepRegistrationForm.module.scss';
import { Input } from '../../Input/Input';
import Dropdown from '../../Dropdown/Dropdown';
import { DropdownOption } from '../../Dropdown/DropdownOption';
import { validateField, validations } from '../../../helpers/validateInput';
import { RegistrationFormErrors } from '../../../types/errors/errors.dto';
import { UserDataFields } from '../../../types/user/user.dto';
import { useRegistration } from '../../../providers/RegistrationContext';

type UserData = {
phoneNumber: string;
Expand All @@ -25,7 +26,14 @@ export const SecondStepRegistrationForm = ({
updateUserData,
isSubmitted,
}: Props) => {
const [errors, setErrors] = useState<RegistrationFormErrors>({});
const { errors, clearStepErrors, setStepErrors } = useRegistration();

const secondStepFields: (keyof UserData)[] = [
UserDataFields.PhoneNumber,
UserDataFields.BirthYear,
UserDataFields.EducationDegree,
UserDataFields.Occupation,
];

const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
Expand All @@ -49,28 +57,54 @@ export const SecondStepRegistrationForm = ({
});
};

const validateFirstStep = () => {
const newErrors: Partial<RegistrationFormErrors> = {};

secondStepFields.forEach((key) => {
const error = validateField(key, userData[key], userData);

if (error) {
newErrors[key] = error;
} else {
newErrors[key] = '';
}
});

if (Object.keys(newErrors).length > 0) {
setStepErrors(2, newErrors);
} else {
clearStepErrors(2);
}
};

useEffect(() => {
if (isSubmitted) {
const newErrors: RegistrationFormErrors = {};

const fieldsToValidate: (keyof UserData)[] = [
'phoneNumber',
'birthYear',
'educationDegree',
'occupation',
];

fieldsToValidate.forEach((field) => {
const error = validateField(field, userData[field], userData);
if (error) {
newErrors[field] = error;
}
});

setErrors(newErrors);
validateFirstStep();
}
}, [isSubmitted, userData]);

Check warning on line 84 in apps/app/src/components/RegistrationForms/SecondStepRegistrationForm/SecondStepRegistrationForm.module.tsx

View workflow job for this annotation

GitHub Actions / Run ESLint (app)

React Hook useEffect has a missing dependency: 'validateFirstStep'. Either include it or remove the dependency array

// useEffect(() => {
// if (isSubmitted) {
// const newErrors: RegistrationFormErrors = {};

// const fieldsToValidate: (keyof UserData)[] = [
// 'phoneNumber',
// 'birthYear',
// 'educationDegree',
// 'occupation',
// ];

// fieldsToValidate.forEach((field) => {
// const error = validateField(field, userData[field], userData);
// if (error) {
// newErrors[field] = error;
// }
// });

// setStepErrors(2, newErrors);
// }
// }, [isSubmitted, userData, setStepErrors]);

const educationDegreeOptions: DropdownOption[] = [
{ value: 'A', label: 'A' },
{ value: 'B', label: 'B' },
Expand All @@ -91,15 +125,15 @@ export const SecondStepRegistrationForm = ({
value={userData.phoneNumber}
placeholder='Broj mobitela'
onChange={handleInputChange}
error={errors.phoneNumber}
error={errors[2]?.phoneNumber}
/>

<Input
name={UserDataFields.BirthYear}
value={userData.birthYear?.toString() || ''}
placeholder='Godina rođenja'
onChange={handleInputChange}
error={errors.birthYear}
error={errors[2]?.birthYear}
/>

<Dropdown
Expand All @@ -112,7 +146,7 @@ export const SecondStepRegistrationForm = ({
selectedOption={educationDegreeOptions.find(
(option) => option.value === userData.educationDegree,
)}
errorLabel={errors.educationDegree}
errorLabel={errors[2]?.educationDegree}
/>

<Dropdown
Expand All @@ -125,7 +159,7 @@ export const SecondStepRegistrationForm = ({
selectedOption={occupationOptions.find(
(option) => option.value === userData.occupation,
)}
errorLabel={errors.occupation}
errorLabel={errors[2]?.occupation}
/>
</div>
</>
Expand Down
5 changes: 4 additions & 1 deletion apps/app/src/pages/RegisterPage/RegisterPage.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { GeneralRegistrationForm } from '../../components/RegistrationForms/GeneralRegistrationForm/GeneralRegistrationForm';
import { RegistrationProvider } from '../../providers/RegistrationContext';

export const RegisterPage = () => {
return (
<div>
<GeneralRegistrationForm />
<RegistrationProvider>
<GeneralRegistrationForm />
</RegistrationProvider>
</div>
);
};

0 comments on commit 2b9cdae

Please sign in to comment.