Skip to content

Commit

Permalink
introduce enum for user data fields and utilize it
Browse files Browse the repository at this point in the history
  • Loading branch information
SimeJadrijev committed Jan 29, 2025
1 parent 95a7a05 commit 4ee1ea7
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ 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';

type UserData = {
firstName: string;
Expand Down Expand Up @@ -63,36 +64,36 @@ export const FirstStepRegistrationForm = ({
<>
<div className={c.inputFieldsWrapper}>
<Input
name='firstName'
name={UserDataFields.FirstName}
value={userData.firstName}
placeholder='Ime'
onChange={handleInputChange}
error={errors.firstName}
/>
<Input
name='lastName'
name={UserDataFields.LastName}
value={userData.lastName}
placeholder='Prezime'
onChange={handleInputChange}
error={errors.lastName}
/>
<Input
name='email'
name={UserDataFields.Email}
value={userData.email}
placeholder='Email'
onChange={handleInputChange}
error={errors.email}
/>
<Input
name='password'
name={UserDataFields.Password}
value={userData.password}
placeholder='Lozinka'
onChange={handleInputChange}
error={errors.password}
type='password'
/>
<Input
name='repeatedPassword'
name={UserDataFields.RepeatedPassword}
value={userData.repeatedPassword}
placeholder='Potvrdite lozinku'
onChange={handleInputChange}
Expand All @@ -105,23 +106,23 @@ export const FirstStepRegistrationForm = ({
<Checkbox
label='Želim primati novosti o DUMP Days konferenciji.'
checked={userData.newsletterEnabled}
name='newsletterEnabled'
name={UserDataFields.NewsletterEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
key={1}
/>
<Checkbox
label='Želim primati novosti o tvrtkama i otvorenim radnim pozicijama.'
checked={userData.companiesNewsEnabled}
name='companiesNewsEnabled'
name={UserDataFields.CompaniesNewsEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
key={2}
/>
<Checkbox
label='Slažem se s uvjetima i odredbama.'
checked={userData.termsAndConditionsEnabled}
name='termsAndConditionsEnabled'
name={UserDataFields.TermsAndConditionsEnabled}
onChange={handleCheckboxChange}
error={errors.termsAndConditionsEnabled}
key={3}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ 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';

type UserData = {
phoneNumber: string;
Expand Down Expand Up @@ -86,15 +87,15 @@ export const SecondStepRegistrationForm = ({
<>
<div className={c.inputFieldsWrapper}>
<Input
name='phoneNumber'
name={UserDataFields.PhoneNumber}
value={userData.phoneNumber}
placeholder='Broj mobitela'
onChange={handleInputChange}
error={errors.phoneNumber}
/>

<Input
name='birthYear'
name={UserDataFields.BirthYear}
value={userData.birthYear?.toString() || ''}
placeholder='Godina rođenja'
onChange={handleInputChange}
Expand All @@ -106,7 +107,7 @@ export const SecondStepRegistrationForm = ({
placeholder='Izaberi'
options={educationDegreeOptions}
setOption={(selectedOption) =>
handleDropdownChange('educationDegree', selectedOption)
handleDropdownChange(UserDataFields.EducationDegree, selectedOption)
}
selectedOption={educationDegreeOptions.find(
(option) => option.value === userData.educationDegree,
Expand All @@ -119,7 +120,7 @@ export const SecondStepRegistrationForm = ({
placeholder='Izaberi'
options={occupationOptions}
setOption={(selectedOption) =>
handleDropdownChange('occupation', selectedOption)
handleDropdownChange(UserDataFields.Occupation, selectedOption)
}
selectedOption={occupationOptions.find(
(option) => option.value === userData.occupation,
Expand Down
52 changes: 30 additions & 22 deletions apps/app/src/helpers/validateInput.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserData } from '../types/user/user.dto';
import { UserData, UserDataFields } from '../types/user/user.dto';

export const validations = {
isNotEmpty: (value: string) => value.trim().length > 0,
Expand All @@ -18,6 +18,7 @@ export const validations = {
},

isValidPhoneNumber: (value: string): boolean => {
//TODO ovo mora bolje, npr trenutno prolazi 976480111
const cleanNumber = value.replace(/\s/g, '');
const phoneRegex = /^(?:\+?\d{11,13}|\d{9,10})$/;
return phoneRegex.test(cleanNumber);
Expand Down Expand Up @@ -48,56 +49,63 @@ export const validations = {

export const validateField = (
name: keyof UserData,
value: any,
value: string | number | boolean | null | undefined,
userData: Partial<UserData>,
): string | undefined => {
switch (name) {
case 'firstName':
if (!validations.isNotEmpty(value)) return 'Ovo polje je obavezno';
if (!validations.isValidName(value)) return 'Unesite ispravno ime';
case UserDataFields.FirstName:
if (!validations.isNotEmpty(value as string))
return 'Ovo polje je obavezno';
if (!validations.isValidName(value as string))
return 'Unesite ispravno ime';
break;

case 'lastName':
if (!validations.isNotEmpty(value)) return 'Ovo polje je obavezno';
if (!validations.isValidName(value)) return 'Unesite ispravno prezime';
case UserDataFields.LastName:
if (!validations.isNotEmpty(value as string))
return 'Ovo polje je obavezno';
if (!validations.isValidName(value as string))
return 'Unesite ispravno prezime';
break;

case 'email':
if (!validations.isNotEmpty(value)) return 'Email je obavezan';
if (!validations.isValidEmail(value)) return 'Unesite ispravan email';
case UserDataFields.Email:
if (!validations.isNotEmpty(value as string)) return 'Email je obavezan';
if (!validations.isValidEmail(value as string))
return 'Unesite ispravan email';
break;

case 'password':
if (!validations.isNotEmpty(value)) return 'Lozinka je obavezna';
if (!validations.isValidPassword(value))
case UserDataFields.Password:
if (!validations.isNotEmpty(value as string))
return 'Lozinka je obavezna';
if (!validations.isValidPassword(value as string))
return 'Lozinka mora imati najmanje 8 znakova i broj';
break;

case 'repeatedPassword':
case UserDataFields.RepeatedPassword:
if (value !== userData.password) return 'Lozinke se ne podudaraju';
break;

case 'phoneNumber':
if (!validations.isNotEmpty(value)) return 'Broj telefona je obavezan';
if (!validations.isValidPhoneNumber(value))
case UserDataFields.PhoneNumber:
if (!validations.isNotEmpty(value as string))
return 'Broj telefona je obavezan';
if (!validations.isValidPhoneNumber(value as string))
return 'Unesite ispravan broj telefona';
break;

case 'birthYear':
case UserDataFields.BirthYear:
if (!value) return 'Godina rođenja je obavezna';
if (!validations.isValidBirthYear(value.toString()))
return 'Unesite ispravnu godinu rođenja';
break;

case 'educationDegree':
case UserDataFields.EducationDegree:
if (!value) return 'Ovo polje je obavezno!';
break;

case 'occupation':
case UserDataFields.Occupation:
if (!value) return 'Ovo polje je obavezno';
break;

case 'termsAndConditionsEnabled':
case UserDataFields.TermsAndConditionsEnabled:
if (!value) return 'Morate prihvatiti uvjete korištenja';
break;

Expand Down
15 changes: 15 additions & 0 deletions apps/app/src/types/user/user.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,18 @@ export type UserData = {
companiesNewsEnabled: boolean;
termsAndConditionsEnabled: boolean;
};

export enum UserDataFields {
FirstName = 'firstName',
LastName = 'lastName',
Email = 'email',
Password = 'password',
RepeatedPassword = 'repeatedPassword',
PhoneNumber = 'phoneNumber',
BirthYear = 'birthYear',
EducationDegree = 'educationDegree',
Occupation = 'occupation',
NewsletterEnabled = 'newsletterEnabled',
CompaniesNewsEnabled = 'companiesNewsEnabled',
TermsAndConditionsEnabled = 'termsAndConditionsEnabled',
}

0 comments on commit 4ee1ea7

Please sign in to comment.