Skip to content

Commit 9ceb30d

Browse files
waleedlatif1claude
andcommitted
refactor(login): replace useEffect keydown listener with form onSubmit
The forgot-password modal used a global window keydown listener in a useEffect to handle Enter key — a "you might not need an effect" anti-pattern with a stale closure risk. Replaced with a native <form onSubmit> wrapper which handles Enter natively, eliminating the useEffect, the global listener, and the stale closure. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4256aae commit 9ceb30d

File tree

1 file changed

+41
-48
lines changed

1 file changed

+41
-48
lines changed

apps/sim/app/(auth)/login/login-form.tsx

Lines changed: 41 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { useEffect, useMemo, useRef, useState } from 'react'
3+
import { useMemo, useRef, useState } from 'react'
44
import { Turnstile, type TurnstileInstance } from '@marsidev/react-turnstile'
55
import { createLogger } from '@sim/logger'
66
import { Eye, EyeOff } from 'lucide-react'
@@ -121,19 +121,6 @@ export default function LoginPage({
121121
: null
122122
)
123123

124-
useEffect(() => {
125-
const handleKeyDown = (event: KeyboardEvent) => {
126-
if (event.key === 'Enter' && forgotPasswordOpen) {
127-
handleForgotPassword()
128-
}
129-
}
130-
131-
window.addEventListener('keydown', handleKeyDown)
132-
return () => {
133-
window.removeEventListener('keydown', handleKeyDown)
134-
}
135-
}, [forgotPasswordEmail, forgotPasswordOpen])
136-
137124
const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {
138125
const newEmail = e.target.value
139126
setEmail(newEmail)
@@ -602,45 +589,51 @@ export default function LoginPage({
602589
<ModalContent className='dark' size='sm'>
603590
<ModalHeader>Reset Password</ModalHeader>
604591
<ModalBody>
605-
<ModalDescription className='mb-4 text-[var(--text-muted)] text-sm'>
606-
Enter your email address and we'll send you a link to reset your password if your
607-
account exists.
608-
</ModalDescription>
609-
<div className='space-y-4'>
610-
<div className='space-y-2'>
611-
<Label htmlFor='reset-email'>Email</Label>
612-
<Input
613-
id='reset-email'
614-
value={forgotPasswordEmail}
615-
onChange={(e) => setForgotPasswordEmail(e.target.value)}
616-
placeholder='Enter your email'
617-
required
618-
type='email'
619-
className={cn(
620-
resetStatus.type === 'error' && 'border-red-500 focus:border-red-500'
592+
<form
593+
onSubmit={(e) => {
594+
e.preventDefault()
595+
handleForgotPassword()
596+
}}
597+
>
598+
<ModalDescription className='mb-4 text-[var(--text-muted)] text-sm'>
599+
Enter your email address and we'll send you a link to reset your password if your
600+
account exists.
601+
</ModalDescription>
602+
<div className='space-y-4'>
603+
<div className='space-y-2'>
604+
<Label htmlFor='reset-email'>Email</Label>
605+
<Input
606+
id='reset-email'
607+
value={forgotPasswordEmail}
608+
onChange={(e) => setForgotPasswordEmail(e.target.value)}
609+
placeholder='Enter your email'
610+
required
611+
type='email'
612+
className={cn(
613+
resetStatus.type === 'error' && 'border-red-500 focus:border-red-500'
614+
)}
615+
/>
616+
{resetStatus.type === 'error' && (
617+
<div className='mt-1 text-red-400 text-xs'>
618+
<p>{resetStatus.message}</p>
619+
</div>
621620
)}
622-
/>
623-
{resetStatus.type === 'error' && (
624-
<div className='mt-1 text-red-400 text-xs'>
621+
</div>
622+
{resetStatus.type === 'success' && (
623+
<div className='mt-1 text-[#4CAF50] text-xs'>
625624
<p>{resetStatus.message}</p>
626625
</div>
627626
)}
627+
<BrandedButton
628+
type='submit'
629+
disabled={isSubmittingReset}
630+
loading={isSubmittingReset}
631+
loadingText='Sending'
632+
>
633+
Send Reset Link
634+
</BrandedButton>
628635
</div>
629-
{resetStatus.type === 'success' && (
630-
<div className='mt-1 text-[#4CAF50] text-xs'>
631-
<p>{resetStatus.message}</p>
632-
</div>
633-
)}
634-
<BrandedButton
635-
type='button'
636-
onClick={handleForgotPassword}
637-
disabled={isSubmittingReset}
638-
loading={isSubmittingReset}
639-
loadingText='Sending'
640-
>
641-
Send Reset Link
642-
</BrandedButton>
643-
</div>
636+
</form>
644637
</ModalBody>
645638
</ModalContent>
646639
</Modal>

0 commit comments

Comments
 (0)