Conversation
Port onboarding v2 redesign from feat/redesign-onboarding branch as a self-contained component, served on /onboarding behind the onboarding_v2 GrowthBook feature flag. No shared layout components modified. - Add featureOnboardingV2 flag and mobileAppUrl constant - Create OnboardingV2 component with hero, tag clouds, feed preview, auth flow - Wire A/B test in onboarding page via dynamic import + feature flag - Hide experience level in auth forms when flag is on (gated on both trigger + flag) - Wrap feed preview with local SearchProvider/FeedLayoutProvider Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add static JSX header bar and collapsed sidebar to OnboardingV2 that visually match the branch's minimal onboarding look without modifying any shared layout components. Header shows logo + login/signup buttons, sidebar shows greyed-out nav icons (pointer-events-none). Also adds SearchProvider wrapper around the feed preview to fix MainFeedLayout runtime error. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Login opens the auth modal with login display, signup opens the signup chooser. Both use the v2 component's own auth flow instead of showLogin which redirects to /onboarding. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
6beb83e to
2b88e49
Compare
- Rewrite import flow: async/await + CSS transition, no setInterval - Auth first, then import: chooser buttons open auth, onSuccessfulRegistration triggers import - Add completeAction (CompletedOnboarding, EditTag, ContentTypes) after tags saved - Persist aiPrompt and signupContext via usePersistentContext (survives OAuth redirect) - Add logged-in redirect: complete → redirectToApp, incomplete → show chooser - Use ?step=complete query param to guard extension promo after completion - Persist extensionSeen flag so promo only shows once - Remove dead code: topics panel, SELECTABLE_TOPICS, intersection observer, recommendedTopics - Remove 5-second auto-redirect from feedReadyState - Fix redirect to use redirectToApp Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
47aa464 to
621fd7f
Compare
621fd7f to
b1149a8
Compare
Move ~1125 lines of <style jsx global> CSS (animations, keyframes, feed limits, parallax, glassmorphism) to a separate component. All class names are onb- prefixed, no collision risk. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…flow Step-based refactor: - Replace 6 boolean states with single OnboardingStep enum - Simplify body overflow, engagement animation, JSX conditionals - Split routing into query param handler + logged-in redirect - Remove dead code: importFlowSourceRef, onbSignup effect, 'manual' context Animation extraction: - Create useOnboardingAnimations hook (mount, tags, feed, parallax, hero tracking, engagement floater, confetti, browser detection, body overflow) Auth flow fixes: - Add autoTriggerProvider prop to AuthOptionsProps for GitHub auto-trigger - onSuccessfulRegistration triggers import based on signupContext - Routing effect guarded by step (blocks during auth/importing/extension/complete) - Completion actions fire on seniority selection, not prematurely - Experience level saved via UPDATE_USER_PROFILE_MUTATION on seniority pick Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- OnboardingRegistrationForm: MemberAlready style gated on flag + trigger - RegistrationForm: title gradient/size gated on flag - Both fall back to original v1 styles when flag is off Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
@claude review |
|
Claude finished @capJavert's task in 2m 22s —— View job Code Review
Overall this is a well-structured A/B experiment — isolated behind a flag, Bugs / Correctness1. Fire-and-forget mutation in
// ❌ fire-and-forget
gqlClient.request(UPDATE_USER_PROFILE_MUTATION, {
data: { experienceLevel: UserExperienceLevel[level] },
});Since you're already in an 2.
const [apiResult] = await Promise.allSettled([...]);
if (apiResult.status === 'fulfilled') {
setAiPrompt('');
setSignupContext(null);
}
// rejected → falls through to setGithubImportPhase('awaitingSeniority')
// user proceeds as if the profile was importedThe user still reaches the seniority screen without their profile being set up. At minimum, show an error state or toast. 3. Inner
return () => clearTimeout(exitTimer); // ✅ outer only
// inner timeouts (600ms + 350ms) are leakedUse Design / Architecture4. if (isOnboardingV2) {
return <OnboardingV2 />; // ❌ no ErrorBoundary, no Toast
}
return (
<JotaiProvider>
<ErrorBoundary feature="onboarding"> // ✅ V1 is protectedAny unhandled render error in V2 will crash the whole page. At minimum wrap it in 5. export const featureOnboardingV2 = new Feature('onboarding_v2', isDevelopment);This enables V2 for all local dev by default. Developers working on the V1 funnel won't realize V2 is silently activated. Every other feature flag in this file defaults to 6. GitHub icon SVG path hardcoded three times The GitHub icon path ( 7.
Minor8.
9.
10. const [signupContext, setSignupContext] = usePersistentContext<
'github' | 'ai' | null
>(ONBOARDING_SIGNUP_CONTEXT_KEY, null, ['github', 'ai']);The third argument appears to be an allowlist for hydration validation. Not documented — a comment would help readers understand why it's there. |
- Add error handling to experience level mutation (.catch) - Wrap OnboardingV2 in ErrorBoundary + Toast - Replace inline GitHub SVGs with GitHubIcon component (filled.svg with currentColor) - Add StrictMode guard for autoTriggerProvider (tracks provider name) - Fix mobileAppUrl to use https://api.daily.dev/mobile redirect - Move OnboardingV2Styles before content to prevent FOUC - Remove secondary from existing GitHubIcon usage (was no-op) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5638446 to
9790db2
Compare
Track all three setTimeout calls (outer + 600ms + 350ms) and clear them all on unmount to prevent leaked timers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add scopes support to BetterAuth social auth flow: - Add optional scopes param to getBetterAuthSocialRedirect chain - Add socialProviderScopes prop to AuthOptionsProps - Pass ['user:email', 'repo'] when signupContext is github - Enables bragi to analyze private repos for better tag extraction Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Changes
API: dailydotdev/daily-api#3775
Events
Did you introduce any new tracking events?
Experiment
Did you introduce any new experiments?
Manual Testing
Caution
Please make sure existing components are not breaking/affected by this PR
Preview domain
https://feat-onboarding-v2-ab-test.preview.app.daily.dev