1
1
'use client' ;
2
2
3
3
import { FormField } from '@/components/shared/FormField' ;
4
+ import { PhoneInput } from '@/components/shared/PhoneInput/PhoneInput' ;
4
5
import { Button } from '@/components/ui/button' ;
5
6
import { Checkbox } from '@/components/ui/checkbox' ;
6
7
import { Label } from '@/components/ui/label' ;
7
8
import { axiosInstance } from '@/lib/axiosInstance' ;
8
9
import { CourseRegistrationSchema } from '@/validators/courseRegistration' ;
9
10
import { zodResolver } from '@hookform/resolvers/zod' ;
10
11
import { useState } from 'react' ;
11
- import { useForm } from 'react-hook-form' ;
12
+ import { FormProvider , useForm } from 'react-hook-form' ;
12
13
import { toast } from 'react-toastify' ;
13
14
import 'react-toastify/dist/ReactToastify.css' ;
14
15
15
16
interface CourseRegistrationFormProps {
16
17
courseID : string ;
17
- onSuccess ?: ( ) => void ; // callback do zamkniecia modala w RegistrationDialog
18
+ onSuccess ?: ( ) => void ;
18
19
buttonClassName ?: string ;
19
20
buttonSize ?: 'default' | 'sm' | 'lg' | 'icon' | null ;
20
21
}
@@ -24,6 +25,7 @@ interface FormValues {
24
25
last_name : string ;
25
26
email : string ;
26
27
phone : string ;
28
+ phone_country : string ;
27
29
}
28
30
29
31
export default function CourseRegistrationForm ( {
@@ -32,93 +34,105 @@ export default function CourseRegistrationForm({
32
34
buttonClassName,
33
35
buttonSize = 'sm' ,
34
36
} : CourseRegistrationFormProps ) {
37
+ const methods = useForm < FormValues > ( {
38
+ resolver : zodResolver ( CourseRegistrationSchema ) ,
39
+ defaultValues : {
40
+ phone_country : 'pl' ,
41
+ } ,
42
+ } ) ;
43
+
35
44
const {
36
45
register,
37
46
handleSubmit,
38
47
formState : { errors } ,
39
48
reset,
40
- } = useForm < FormValues > ( {
41
- resolver : zodResolver ( CourseRegistrationSchema ) ,
42
- } ) ;
49
+ } = methods ;
43
50
44
51
const [ isChecked , setIsChecked ] = useState ( false ) ;
45
52
46
- const onSubmit = async ( data : FormValues ) => {
53
+ const handleFormSubmit = async ( data : FormValues ) => {
47
54
if ( ! isChecked ) {
48
55
toast . error ( 'Musisz wyrazić zgodę na przetwarzanie danych.' ) ;
49
56
return ;
50
57
}
51
58
52
59
try {
60
+ console . log ( data ) ;
61
+
53
62
await axiosInstance . post ( `/api/courses/${ courseID } /registrations` , data ) ;
63
+
54
64
toast . success ( 'Wysłano zgłoszenie na kurs!' ) ;
55
65
reset ( ) ;
56
66
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.' ) ;
61
71
}
62
72
} ;
63
73
64
74
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 "Nazwa szkoły" 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 >
123
137
) ;
124
138
}
0 commit comments