fix: post-signup claim redirect + passkey retry for Samsung#1837
Conversation
New users arriving via claim links were blocked from seeing the claim modal because PostSignupActionManager required KYC verification. KYC is only needed for bank/offramp claims, and the claim page itself handles that gating — the modal-level check was redundant and breaking the flow. Also adds TODO for future WebAuthn conditional mediation to address Samsung dual-provider passkey conflicts.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
WalkthroughPostSignupActionManager no longer depends on auth/KYC state; modal check now triggers solely on presence of a redirect URL and useEffect depends only on router. useZeroDev refactors WebAuthn login: core key-acquisition moved to Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/components/Global/PostSignupActionManager/index.tsx (1)
43-45: Consider moving the function inside useEffect or memoizing it.
checkForPostSignupActionis called inside the effect but isn't in the dependency array. While this works becauserouteris stable, it could trigger ESLint'sexhaustive-depswarning. Moving the logic inside the effect makes the intent clearer:♻️ Optional: inline the check inside useEffect
useEffect(() => { - checkForPostSignupAction() + const redirectUrl = getRedirectUrl() + if (redirectUrl) { + const matchedAction = POST_SIGNUP_ACTIONS.find((action) => action.pathPattern.test(redirectUrl)) + if (matchedAction) { + setActionConfig({ + ...matchedAction.config, + action: () => { + router.push(redirectUrl) + clearRedirectUrl() + setShowModal(false) + }, + }) + setShowModal(true) + } + } }, [router])🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Global/PostSignupActionManager/index.tsx` around lines 43 - 45, The effect calls checkForPostSignupAction but doesn't include it in dependencies; to avoid exhaustive-deps warnings and clarify intent, either inline the logic of checkForPostSignupAction directly inside the useEffect that currently depends on router, or wrap checkForPostSignupAction with useCallback (referencing router as needed) and add that memoized function to the effect dependency array; update the useEffect to call the inlined logic or the memoized checkForPostSignupAction so ESLint no longer flags a missing dependency.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/components/Global/PostSignupActionManager/index.tsx`:
- Around line 43-45: The effect calls checkForPostSignupAction but doesn't
include it in dependencies; to avoid exhaustive-deps warnings and clarify
intent, either inline the logic of checkForPostSignupAction directly inside the
useEffect that currently depends on router, or wrap checkForPostSignupAction
with useCallback (referencing router as needed) and add that memoized function
to the effect dependency array; update the useEffect to call the inlined logic
or the memoized checkForPostSignupAction so ESLint no longer flags a missing
dependency.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 6de56793-107e-4951-b4da-cccbf154dd05
📒 Files selected for processing (2)
src/components/Global/PostSignupActionManager/index.tsxsrc/hooks/useZeroDev.ts
…evices On Samsung devices with both Google Credential Manager and Samsung Pass, the first provider may intercept the WebAuthn request and report "no passkeys" while the actual passkey lives in the other provider. This adds a single automatic retry so the second provider gets a chance to respond, which typically succeeds. Addresses ~3,900 Sentry events (PEANUT-UI-6T2/A9W/6T7) where many are likely caused by this dual-provider conflict rather than actual missing passkeys.
Summary
PostSignupActionManager— new users arriving via claim links were blocked from seeing the claim modal because they aren't KYC verified yet. KYC is only needed for bank/offramp claims, and the claim page itself handles that gating.NotAllowedErrorfor devices with multiple passkey providers (Google Credential Manager + Samsung Pass). The first provider may intercept and report "no passkeys" while the actual passkey lives in the other provider.Bug 1 details
PostSignupActionManagergated the claim modal onisUserKycVerified(), which is alwaysfalsefor new signups/homeBug 2 details
_attemptLogin(), auto-retry once onNotAllowedErrorbefore throwing to the UITest plan