Skip to content

Commit eade988

Browse files
authored
Merge pull request #23 from skni-kod/refactor/phone
Refactor/phone
2 parents babcde0 + c664b45 commit eade988

File tree

10 files changed

+348
-156
lines changed

10 files changed

+348
-156
lines changed

package-lock.json

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"class-variance-authority": "^0.7.0",
3232
"clsx": "^2.1.1",
3333
"date-fns": "^3.6.0",
34+
"google-libphonenumber": "^3.2.40",
3435
"iron-session": "^8.0.4",
3536
"lucide-react": "^0.454.0",
3637
"moment": "^2.30.1",
@@ -41,6 +42,7 @@
4142
"react-dom": "19.0.0-rc-02c0e824-20241028",
4243
"react-hook-form": "^7.54.2",
4344
"react-icons": "^5.3.0",
45+
"react-international-phone": "^4.5.0",
4446
"react-toastify": "^10.0.6",
4547
"tailwind-merge": "^2.5.4",
4648
"tailwindcss-animate": "^1.0.7",
@@ -52,6 +54,7 @@
5254
"@testing-library/jest-dom": "^6.6.3",
5355
"@testing-library/react": "^16.0.1",
5456
"@testing-library/user-event": "^14.5.2",
57+
"@types/google-libphonenumber": "^7.4.30",
5558
"@types/node": "^20",
5659
"@types/react": "^18",
5760
"@types/react-big-calendar": "^1.16.0",
Lines changed: 82 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
'use client';
22

33
import { FormField } from '@/components/shared/FormField';
4+
import { PhoneInput } from '@/components/shared/PhoneInput/PhoneInput';
45
import { Button } from '@/components/ui/button';
56
import { Checkbox } from '@/components/ui/checkbox';
67
import { Label } from '@/components/ui/label';
78
import { axiosInstance } from '@/lib/axiosInstance';
89
import { CourseRegistrationSchema } from '@/validators/courseRegistration';
910
import { zodResolver } from '@hookform/resolvers/zod';
1011
import { useState } from 'react';
11-
import { useForm } from 'react-hook-form';
12+
import { FormProvider, useForm } from 'react-hook-form';
1213
import { toast } from 'react-toastify';
1314
import 'react-toastify/dist/ReactToastify.css';
1415

1516
interface CourseRegistrationFormProps {
1617
courseID: string;
17-
onSuccess?: () => void; // callback do zamkniecia modala w RegistrationDialog
18+
onSuccess?: () => void;
1819
buttonClassName?: string;
1920
buttonSize?: 'default' | 'sm' | 'lg' | 'icon' | null;
2021
}
@@ -24,6 +25,7 @@ interface FormValues {
2425
last_name: string;
2526
email: string;
2627
phone: string;
28+
phone_country: string;
2729
}
2830

2931
export default function CourseRegistrationForm({
@@ -32,93 +34,105 @@ export default function CourseRegistrationForm({
3234
buttonClassName,
3335
buttonSize = 'sm',
3436
}: CourseRegistrationFormProps) {
37+
const methods = useForm<FormValues>({
38+
resolver: zodResolver(CourseRegistrationSchema),
39+
defaultValues: {
40+
phone_country: 'pl',
41+
},
42+
});
43+
3544
const {
3645
register,
3746
handleSubmit,
3847
formState: { errors },
3948
reset,
40-
} = useForm<FormValues>({
41-
resolver: zodResolver(CourseRegistrationSchema),
42-
});
49+
} = methods;
4350

4451
const [isChecked, setIsChecked] = useState(false);
4552

46-
const onSubmit = async (data: FormValues) => {
53+
const handleFormSubmit = async (data: FormValues) => {
4754
if (!isChecked) {
4855
toast.error('Musisz wyrazić zgodę na przetwarzanie danych.');
4956
return;
5057
}
5158

5259
try {
60+
console.log(data);
61+
5362
await axiosInstance.post(`/api/courses/${courseID}/registrations`, data);
63+
5464
toast.success('Wysłano zgłoszenie na kurs!');
5565
reset();
5666
setIsChecked(false);
57-
if (onSuccess) onSuccess();
58-
} catch (err) {
59-
console.log(err);
60-
toast.error('Wystąpił błąd podczas wysyłania zgłoszenia.');
67+
onSuccess?.();
68+
} catch (error) {
69+
console.error('Błąd podczas wysyłania zgłoszenia:', error);
70+
toast.error('Wystąpił błąd podczas wysyłania zgłoszenia.');
6171
}
6272
};
6373

6474
return (
65-
<form
66-
onSubmit={handleSubmit(onSubmit)}
67-
className='mt-3 flex flex-col items-stretch space-y-6'
68-
>
69-
<div className='mb-5 grid grid-cols-1 gap-4 sm:grid-cols-2'>
70-
<FormField
71-
id='name'
72-
label='Imię'
73-
register={register}
74-
error={errors.name?.message}
75-
/>
76-
<FormField
77-
id='last_name'
78-
label='Nazwisko'
79-
register={register}
80-
error={errors.last_name?.message}
81-
/>
82-
<FormField
83-
id='email'
84-
label='Adres e-mail'
85-
register={register}
86-
error={errors.email?.message}
87-
/>
88-
<FormField
89-
id='phone'
90-
label='Numer telefonu'
91-
register={register}
92-
error={errors.phone?.message}
93-
/>
94-
</div>
95-
<div className='flex items-start gap-2'>
96-
<Checkbox
97-
id='agreement'
98-
checked={isChecked}
99-
onCheckedChange={(checked) => setIsChecked(!!checked)}
100-
/>
101-
<Label htmlFor='agreement' className='text-xs'>
102-
Wyrażam zgodę na przetwarzenie moich danych przez Ośrodek Szkolenia
103-
Kierowców “Nazwa szkoły” w następujących celach: nawiązania kontaktu
104-
podczas realizacji kursu / szkolenia / kwalifikacji; zapisu na egzamin
105-
państwowy do wybranego Wojewódzkiego Ośrodka Ruchu Drogowego; zapisu
106-
na jazdy w warunkach specjalnych; wyrobieniu Profilu Kandydata na
107-
Kierowcą w wybranym Wydziale Komunikacji; zapisu na jazdy próbne przed
108-
egzaminem państwowym w wybranym Wojewódzkim Ośrodku Ruchu Drogowego;
109-
zgłoszenia do ubezpieczenia wynikającego ze skierowania na szkolenie
110-
oraz innych wynikających z prawidłowego wykonania usługi. Dane osobowe
111-
podaję dobrowolnie i oświadczam, że są one zgodne z prawdą.
112-
Zapoznałem/am się z treścią klauzuli informacyjnej, w tym z informacją
113-
o celu i sposobach przetwarzania danych osobowych oraz prawie dostępu
114-
do treści swoich danych i prawie ich poprawiania.
115-
</Label>
116-
</div>
117-
<div className='flex flex-row justify-center gap-2 md:justify-start'>
118-
<Button type='submit' size={buttonSize} className={buttonClassName}>
119-
ZAPISUJĘ SIĘ!
120-
</Button>
121-
</div>
122-
</form>
75+
<FormProvider {...methods}>
76+
<form
77+
onSubmit={handleSubmit(handleFormSubmit)}
78+
className='mt-3 flex flex-col items-stretch space-y-6'
79+
>
80+
<div className='mb-5 grid grid-cols-1 gap-4 sm:grid-cols-2'>
81+
<FormField
82+
id='name'
83+
label='Imię'
84+
register={register}
85+
error={errors.name?.message}
86+
/>
87+
<FormField
88+
id='last_name'
89+
label='Nazwisko'
90+
register={register}
91+
error={errors.last_name?.message}
92+
/>
93+
<FormField
94+
id='email'
95+
label='Adres e-mail'
96+
register={register}
97+
error={errors.email?.message}
98+
/>
99+
<PhoneInput
100+
id='phone'
101+
label='Numer telefonu'
102+
register={register}
103+
error={errors.phone?.message}
104+
countryName='phone_country'
105+
/>
106+
</div>
107+
<div className='flex items-start gap-2'>
108+
<Checkbox
109+
id='agreement'
110+
checked={isChecked}
111+
onCheckedChange={(checked) => setIsChecked(!!checked)}
112+
/>
113+
<Label htmlFor='agreement' className='text-xs'>
114+
Wyrażam zgodę na przetwarzenie moich danych przez Ośrodek Szkolenia
115+
Kierowców &quot;Nazwa szkoły&quot; w następujących celach:
116+
nawiązania kontaktu podczas realizacji kursu / szkolenia /
117+
kwalifikacji; zapisu na egzamin państwowy do wybranego Wojewódzkiego
118+
Ośrodka Ruchu Drogowego; zapisu na jazdy w warunkach specjalnych;
119+
wyrobieniu Profilu Kandydata na Kierowcą w wybranym Wydziale
120+
Komunikacji; zapisu na jazdy próbne przed egzaminem państwowym w
121+
wybranym Wojewódzkim Ośrodku Ruchu Drogowego; zgłoszenia do
122+
ubezpieczenia wynikającego ze skierowania na szkolenie oraz innych
123+
wynikających z prawidłowego wykonania usługi. Dane osobowe podaję
124+
dobrowolnie i oświadczam, że są one zgodne z prawdą. Zapoznałem/am
125+
się z treścią klauzuli informacyjnej, w tym z informacją o celu i
126+
sposobach przetwarzania danych osobowych oraz prawie dostępu do
127+
treści swoich danych i prawie ich poprawiania.
128+
</Label>
129+
</div>
130+
<div className='flex flex-row justify-center gap-2 md:justify-start'>
131+
<Button type='submit' size={buttonSize} className={buttonClassName}>
132+
ZAPISUJĘ SIĘ!
133+
</Button>
134+
</div>
135+
</form>
136+
</FormProvider>
123137
);
124138
}

0 commit comments

Comments
 (0)