1
1
'use client' ;
2
2
import { faPen } from '@fortawesome/free-solid-svg-icons' ;
3
- import { LoggedUserData } from '@web/src/modules/auth/types/User' ;
4
3
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
5
- import axiosInstance from '@web/src/lib/axios' ;
4
+ import ClientAxios from '@web/src/lib/axios/ClientAxios' ;
5
+ import { LoggedUserData } from '@web/src/modules/auth/types/User' ;
6
6
import { AxiosError } from 'axios' ;
7
7
import { useState } from 'react' ;
8
- import GenericModal from '../client/GenericModal' ;
9
8
import { toast } from 'react-hot-toast' ;
9
+ import GenericModal from '../client/GenericModal' ;
10
+ import { SubmitHandler , useForm } from 'react-hook-form' ;
10
11
11
- type EditUsernameModalProps = {
12
+ interface EditUsernameModalProps {
12
13
isOpen : boolean ;
13
14
setIsOpen : ( value : boolean ) => void ;
14
15
userData : LoggedUserData ;
15
- } ;
16
+ }
17
+
18
+ interface FormValues {
19
+ username : string ;
20
+ }
16
21
17
22
export const EditUsernameModal = ( {
18
23
isOpen,
19
24
setIsOpen,
20
25
userData,
21
26
} : EditUsernameModalProps ) => {
22
- const [ isLoading , setIsLoading ] = useState ( false ) ;
27
+ const {
28
+ handleSubmit,
29
+ formState : { isSubmitting, errors } ,
30
+ register,
31
+ } = useForm < FormValues > ( ) ;
23
32
24
- const onClick = async ( ) => {
33
+ const onSubmit : SubmitHandler < FormValues > = async ( data ) => {
25
34
try {
26
- setIsLoading ( true ) ;
27
-
28
- const result = await axiosInstance . patch ( '/user/username' , {
29
- username : userData . username ,
35
+ await ClientAxios . patch ( '/user/username' , {
36
+ username : data . username ,
30
37
} ) ;
31
38
32
- console . log ( result ) ;
39
+ toast . success ( 'Username updated successfully' ) ;
40
+
41
+ // refresh the page
42
+ window . location . reload ( ) ;
33
43
} catch ( error : unknown ) {
34
44
if ( ( error as any ) . isAxiosError ) {
35
45
const axiosError = error as AxiosError ;
@@ -53,37 +63,39 @@ export const EditUsernameModal = ({
53
63
}
54
64
55
65
toast . error ( 'An error occurred. Please try again later.' ) ;
56
- } finally {
57
- setIsLoading ( false ) ;
58
66
}
59
67
} ;
60
68
61
69
return (
62
70
< GenericModal title = 'Edit username' isOpen = { isOpen } setIsOpen = { setIsOpen } >
63
71
< div className = 'flex flex-col gap-4' >
64
- < div >
72
+ < form className = 'flex flex-col gap-4' onSubmit = { handleSubmit ( onSubmit ) } >
73
+ < span className = 'text-red-500 text-sm font-medium h-4' >
74
+ { errors . username && errors . username . message }
75
+ </ span >
65
76
< label htmlFor = 'username' className = 'block text-white' >
66
77
Username
67
78
</ label >
68
79
< input
80
+ autoFocus
69
81
type = 'text'
70
82
id = 'username'
71
- name = 'username'
83
+ { ... register ( 'username' , { required : 'Username is required' } ) }
72
84
className = 'w-full bg-zinc-700 text-white rounded-lg p-2'
73
85
defaultValue = { userData . username }
74
- disabled = { isLoading }
86
+ disabled = { isSubmitting }
75
87
/>
76
- </ div >
77
- < div className = 'flex justify-end' >
78
- < button
79
- onClick = { onClick }
80
- className = 'text-sm px-3 py-2 rounded-lg bg-blue-500 hover:bg-blue-400'
81
- disabled = { isLoading }
82
- >
83
- Edit username
84
- < FontAwesomeIcon className = 'ml-2' icon = { faPen } / >
85
- </ button >
86
- </ div >
88
+ < div className = 'flex justify-end' >
89
+ < button
90
+ type = 'submit'
91
+ className = 'text-sm px-3 py-2 rounded-lg bg-blue-500 hover:bg-blue-400'
92
+ disabled = { isSubmitting }
93
+ >
94
+ Edit username
95
+ < FontAwesomeIcon className = 'ml-2' icon = { faPen } />
96
+ </ button >
97
+ </ div >
98
+ </ form >
87
99
</ div >
88
100
</ GenericModal >
89
101
) ;
0 commit comments