@@ -3,8 +3,8 @@ import AppLayout from '@/layouts/app-layout';
3
3
import SettingsLayout from '@/layouts/settings/layout' ;
4
4
import { type BreadcrumbItem } from '@/types' ;
5
5
import { Transition } from '@headlessui/react' ;
6
- import { Head , useForm } from '@inertiajs/react' ;
7
- import { FormEventHandler , useRef } from 'react' ;
6
+ import { Form , Head } from '@inertiajs/react' ;
7
+ import { useRef } from 'react' ;
8
8
9
9
import HeadingSmall from '@/components/heading-small' ;
10
10
import { Button } from '@/components/ui/button' ;
@@ -22,32 +22,6 @@ export default function Password() {
22
22
const passwordInput = useRef < HTMLInputElement > ( null ) ;
23
23
const currentPasswordInput = useRef < HTMLInputElement > ( null ) ;
24
24
25
- const { data, setData, errors, put, reset, processing, recentlySuccessful } = useForm ( {
26
- current_password : '' ,
27
- password : '' ,
28
- password_confirmation : '' ,
29
- } ) ;
30
-
31
- const updatePassword : FormEventHandler = ( e ) => {
32
- e . preventDefault ( ) ;
33
-
34
- put ( route ( 'password.update' ) , {
35
- preserveScroll : true ,
36
- onSuccess : ( ) => reset ( ) ,
37
- onError : ( errors ) => {
38
- if ( errors . password ) {
39
- reset ( 'password' , 'password_confirmation' ) ;
40
- passwordInput . current ?. focus ( ) ;
41
- }
42
-
43
- if ( errors . current_password ) {
44
- reset ( 'current_password' ) ;
45
- currentPasswordInput . current ?. focus ( ) ;
46
- }
47
- } ,
48
- } ) ;
49
- } ;
50
-
51
25
return (
52
26
< AppLayout breadcrumbs = { breadcrumbs } >
53
27
< Head title = "Password settings" />
@@ -56,71 +30,90 @@ export default function Password() {
56
30
< div className = "space-y-6" >
57
31
< HeadingSmall title = "Update password" description = "Ensure your account is using a long, random password to stay secure" />
58
32
59
- < form method = "POST" onSubmit = { updatePassword } className = "space-y-6" >
60
- < div className = "grid gap-2" >
61
- < Label htmlFor = "current_password" > Current password</ Label >
62
-
63
- < Input
64
- id = "current_password"
65
- ref = { currentPasswordInput }
66
- value = { data . current_password }
67
- onChange = { ( e ) => setData ( 'current_password' , e . target . value ) }
68
- type = "password"
69
- className = "mt-1 block w-full"
70
- autoComplete = "current-password"
71
- placeholder = "Current password"
72
- />
73
-
74
- < InputError message = { errors . current_password } />
75
- </ div >
76
-
77
- < div className = "grid gap-2" >
78
- < Label htmlFor = "password" > New password</ Label >
79
-
80
- < Input
81
- id = "password"
82
- ref = { passwordInput }
83
- value = { data . password }
84
- onChange = { ( e ) => setData ( 'password' , e . target . value ) }
85
- type = "password"
86
- className = "mt-1 block w-full"
87
- autoComplete = "new-password"
88
- placeholder = "New password"
89
- />
90
-
91
- < InputError message = { errors . password } />
92
- </ div >
93
-
94
- < div className = "grid gap-2" >
95
- < Label htmlFor = "password_confirmation" > Confirm password</ Label >
96
-
97
- < Input
98
- id = "password_confirmation"
99
- value = { data . password_confirmation }
100
- onChange = { ( e ) => setData ( 'password_confirmation' , e . target . value ) }
101
- type = "password"
102
- className = "mt-1 block w-full"
103
- autoComplete = "new-password"
104
- placeholder = "Confirm password"
105
- />
106
-
107
- < InputError message = { errors . password_confirmation } />
108
- </ div >
109
-
110
- < div className = "flex items-center gap-4" >
111
- < Button disabled = { processing } > Save password</ Button >
112
-
113
- < Transition
114
- show = { recentlySuccessful }
115
- enter = "transition ease-in-out"
116
- enterFrom = "opacity-0"
117
- leave = "transition ease-in-out"
118
- leaveTo = "opacity-0"
119
- >
120
- < p className = "text-sm text-neutral-600" > Saved</ p >
121
- </ Transition >
122
- </ div >
123
- </ form >
33
+ < Form
34
+ method = "put"
35
+ action = { route ( 'password.update' ) }
36
+ options = { {
37
+ preserveScroll : true ,
38
+ } }
39
+ resetOnError = { [ 'password' , 'password_confirmation' , 'current_password' ] }
40
+ resetOnSuccess
41
+ onError = { ( errors ) => {
42
+ if ( errors . password ) {
43
+ passwordInput . current ?. focus ( ) ;
44
+ }
45
+
46
+ if ( errors . current_password ) {
47
+ currentPasswordInput . current ?. focus ( ) ;
48
+ }
49
+ } }
50
+ className = "space-y-6"
51
+ >
52
+ { ( { errors, processing, recentlySuccessful } ) => (
53
+ < >
54
+ < div className = "grid gap-2" >
55
+ < Label htmlFor = "current_password" > Current password</ Label >
56
+
57
+ < Input
58
+ id = "current_password"
59
+ ref = { currentPasswordInput }
60
+ name = "current_password"
61
+ type = "password"
62
+ className = "mt-1 block w-full"
63
+ autoComplete = "current-password"
64
+ placeholder = "Current password"
65
+ />
66
+
67
+ < InputError message = { errors . current_password } />
68
+ </ div >
69
+
70
+ < div className = "grid gap-2" >
71
+ < Label htmlFor = "password" > New password</ Label >
72
+
73
+ < Input
74
+ id = "password"
75
+ ref = { passwordInput }
76
+ name = "password"
77
+ type = "password"
78
+ className = "mt-1 block w-full"
79
+ autoComplete = "new-password"
80
+ placeholder = "New password"
81
+ />
82
+
83
+ < InputError message = { errors . password } />
84
+ </ div >
85
+
86
+ < div className = "grid gap-2" >
87
+ < Label htmlFor = "password_confirmation" > Confirm password</ Label >
88
+
89
+ < Input
90
+ id = "password_confirmation"
91
+ name = "password_confirmation"
92
+ type = "password"
93
+ className = "mt-1 block w-full"
94
+ autoComplete = "new-password"
95
+ placeholder = "Confirm password"
96
+ />
97
+
98
+ < InputError message = { errors . password_confirmation } />
99
+ </ div >
100
+
101
+ < div className = "flex items-center gap-4" >
102
+ < Button disabled = { processing } > Save password</ Button >
103
+
104
+ < Transition
105
+ show = { recentlySuccessful }
106
+ enter = "transition ease-in-out"
107
+ enterFrom = "opacity-0"
108
+ leave = "transition ease-in-out"
109
+ leaveTo = "opacity-0"
110
+ >
111
+ < p className = "text-sm text-neutral-600" > Saved</ p >
112
+ </ Transition >
113
+ </ div >
114
+ </ >
115
+ ) }
116
+ </ Form >
124
117
</ div >
125
118
</ SettingsLayout >
126
119
</ AppLayout >
0 commit comments