feat(auth): add a turnstile widget #631
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR introduces a
Turnstile
React component that integrates Cloudflare's Turnstile widget for verifying human interaction. It provides an interactive challenge to users and handles various states such as initialization, success, expiration, errors, and dismissal.Functionality
The
Turnstile
component serves the following purposes:Challenge Presentation:
NEXT_PUBLIC_TURNSTILE_SITE_KEY
) is present and certain statuses ("uninitialized"
,"expired"
,"error"
) make it relevant.Challenge States:
uninitialized
: Initial state before the Turnstile widget starts.solved
: When the challenge is successfully completed.expired
: When the challenge expires without completion.error
: When the Turnstile widget encounters an error.dismissed
: When the user opts to dismiss the challenge.Timeout for Actions:
setTimeout
) before enabling actions like retrying the challenge or dismissing it. This ensures the user has enough time to interact with the widget first.Action Handling:
Error Handling:
"error"
, and a message is displayed.State-Based Rendering:
isVisible
,hasActions
).Key Features
uninitialized
,solved
,expired
,error
,dismissed
) with clear transitions.Testing Instructions
Test Cases:
status = "uninitialized"
).expired
toretry
).Simulating States:
solved
).expired
).error
).Some screenshots:
Some testing would still be needed in staging, before deploying this to prod.