Skip to content

Commit 5ae1d9e

Browse files
waleedlatif1claude
andcommitted
refactor(auth): use getResponsePromise() for Turnstile token retrieval
Replace the manual Promise + refs + timeout pattern with the documented getResponsePromise(timeout) API from @marsidev/react-turnstile. This eliminates captchaToken state, captchaResolveRef, captchaRejectRef, and all callback wiring on the Turnstile component. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7b8f2d0 commit 5ae1d9e

File tree

2 files changed

+6
-70
lines changed

2 files changed

+6
-70
lines changed

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

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,7 @@ export default function LoginPage({
8787
const [password, setPassword] = useState('')
8888
const [passwordErrors, setPasswordErrors] = useState<string[]>([])
8989
const [showValidationError, setShowValidationError] = useState(false)
90-
const [captchaToken, setCaptchaToken] = useState<string | null>(null)
9190
const turnstileRef = useRef<TurnstileInstance>(null)
92-
const captchaResolveRef = useRef<((token: string) => void) | null>(null)
93-
const captchaRejectRef = useRef<((reason: unknown) => void) | null>(null)
9491
const turnstileSiteKey = useMemo(() => getEnv('NEXT_PUBLIC_TURNSTILE_SITE_KEY'), [])
9592
const buttonClass = useBrandedButtonClass()
9693

@@ -172,21 +169,12 @@ export default function LoginPage({
172169
let errorHandled = false
173170

174171
// Execute Turnstile challenge on submit and get a fresh token
175-
let token = captchaToken
172+
let token: string | undefined
176173
if (turnstileSiteKey && turnstileRef.current) {
177174
try {
178175
turnstileRef.current.reset()
179-
let timeoutId: ReturnType<typeof setTimeout> | undefined
180-
token = await Promise.race([
181-
new Promise<string>((resolve, reject) => {
182-
captchaResolveRef.current = resolve
183-
captchaRejectRef.current = reject
184-
turnstileRef.current?.execute()
185-
}),
186-
new Promise<string>((_, reject) => {
187-
timeoutId = setTimeout(() => reject(new Error('Captcha timed out')), 15_000)
188-
}),
189-
]).finally(() => clearTimeout(timeoutId))
176+
turnstileRef.current.execute()
177+
token = await turnstileRef.current.getResponsePromise(15_000)
190178
} catch {
191179
setPasswordErrors(['Captcha verification failed. Please try again.'])
192180
setShowValidationError(true)
@@ -208,8 +196,6 @@ export default function LoginPage({
208196
},
209197
},
210198
onError: (ctx) => {
211-
turnstileRef.current?.reset()
212-
setCaptchaToken(null)
213199
logger.error('Login error:', ctx.error)
214200

215201
if (ctx.error.code?.includes('EMAIL_NOT_VERIFIED')) {
@@ -488,24 +474,6 @@ export default function LoginPage({
488474
<Turnstile
489475
ref={turnstileRef}
490476
siteKey={turnstileSiteKey}
491-
onSuccess={(token) => {
492-
setCaptchaToken(token)
493-
captchaResolveRef.current?.(token)
494-
captchaResolveRef.current = null
495-
captchaRejectRef.current = null
496-
}}
497-
onError={() => {
498-
setCaptchaToken(null)
499-
captchaRejectRef.current?.(new Error('Captcha failed'))
500-
captchaResolveRef.current = null
501-
captchaRejectRef.current = null
502-
}}
503-
onExpire={() => {
504-
setCaptchaToken(null)
505-
captchaRejectRef.current?.(new Error('Captcha expired'))
506-
captchaResolveRef.current = null
507-
captchaRejectRef.current = null
508-
}}
509477
options={{ size: 'invisible', execution: 'execute' }}
510478
/>
511479
)}

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

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,7 @@ function SignupFormContent({
9191
const [emailError, setEmailError] = useState('')
9292
const [emailErrors, setEmailErrors] = useState<string[]>([])
9393
const [showEmailValidationError, setShowEmailValidationError] = useState(false)
94-
const [captchaToken, setCaptchaToken] = useState<string | null>(null)
9594
const turnstileRef = useRef<TurnstileInstance>(null)
96-
const captchaResolveRef = useRef<((token: string) => void) | null>(null)
97-
const captchaRejectRef = useRef<((reason: unknown) => void) | null>(null)
9895
const turnstileSiteKey = useMemo(() => getEnv('NEXT_PUBLIC_TURNSTILE_SITE_KEY'), [])
9996
const buttonClass = useBrandedButtonClass()
10097

@@ -252,21 +249,12 @@ function SignupFormContent({
252249
const sanitizedName = trimmedName
253250

254251
// Execute Turnstile challenge on submit and get a fresh token
255-
let token = captchaToken
252+
let token: string | undefined
256253
if (turnstileSiteKey && turnstileRef.current) {
257254
try {
258255
turnstileRef.current.reset()
259-
let timeoutId: ReturnType<typeof setTimeout> | undefined
260-
token = await Promise.race([
261-
new Promise<string>((resolve, reject) => {
262-
captchaResolveRef.current = resolve
263-
captchaRejectRef.current = reject
264-
turnstileRef.current?.execute()
265-
}),
266-
new Promise<string>((_, reject) => {
267-
timeoutId = setTimeout(() => reject(new Error('Captcha timed out')), 15_000)
268-
}),
269-
]).finally(() => clearTimeout(timeoutId))
256+
turnstileRef.current.execute()
257+
token = await turnstileRef.current.getResponsePromise(15_000)
270258
} catch {
271259
setPasswordErrors(['Captcha verification failed. Please try again.'])
272260
setShowValidationError(true)
@@ -288,8 +276,6 @@ function SignupFormContent({
288276
},
289277
},
290278
onError: (ctx) => {
291-
turnstileRef.current?.reset()
292-
setCaptchaToken(null)
293279
logger.error('Signup error:', ctx.error)
294280
const errorMessage: string[] = ['Failed to create account']
295281

@@ -494,24 +480,6 @@ function SignupFormContent({
494480
<Turnstile
495481
ref={turnstileRef}
496482
siteKey={turnstileSiteKey}
497-
onSuccess={(token) => {
498-
setCaptchaToken(token)
499-
captchaResolveRef.current?.(token)
500-
captchaResolveRef.current = null
501-
captchaRejectRef.current = null
502-
}}
503-
onError={() => {
504-
setCaptchaToken(null)
505-
captchaRejectRef.current?.(new Error('Captcha failed'))
506-
captchaResolveRef.current = null
507-
captchaRejectRef.current = null
508-
}}
509-
onExpire={() => {
510-
setCaptchaToken(null)
511-
captchaRejectRef.current?.(new Error('Captcha expired'))
512-
captchaResolveRef.current = null
513-
captchaRejectRef.current = null
514-
}}
515483
options={{ size: 'invisible', execution: 'execute' }}
516484
/>
517485
)}

0 commit comments

Comments
 (0)