Skip to content

Commit ac80173

Browse files
committed
feat(web): enhance onboarding flow for returning users and add loading state handling
1 parent 73c8f35 commit ac80173

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

packages/web/src/views/Onboarding/OnboardingFlow.test.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,19 @@ describe("OnboardingFlow", () => {
6464
});
6565

6666
describe("Returning User Flow", () => {
67-
it("shows login flow first even for returning users", () => {
67+
it("skips login flow and goes directly to sign-in-with-google for returning users", () => {
6868
mockUseHasCompletedSignup.mockReturnValue({
6969
hasCompletedSignup: true,
7070
markSignupCompleted: jest.fn(),
7171
});
7272

7373
render(<OnboardingFlow />);
7474

75-
// First step should still be login/waitlist
75+
// Should skip login steps and go directly to main onboarding
7676
expect(screen.getByTestId("onboarding")).toBeInTheDocument();
77-
expect(screen.getByTestId("first-step-id")).toHaveTextContent("welcome");
77+
expect(screen.getByTestId("first-step-id")).toHaveTextContent(
78+
"sign-in-with-google",
79+
);
7880
});
7981

8082
it("calls useHasCompletedSignup to check signup status", () => {
@@ -88,6 +90,18 @@ describe("OnboardingFlow", () => {
8890
// Hook should be called to determine which step to start at
8991
expect(mockUseHasCompletedSignup).toHaveBeenCalled();
9092
});
93+
94+
it("waits for hasCompletedSignup to load before rendering", () => {
95+
mockUseHasCompletedSignup.mockReturnValue({
96+
hasCompletedSignup: null,
97+
markSignupCompleted: jest.fn(),
98+
});
99+
100+
const { container } = render(<OnboardingFlow />);
101+
102+
// Should render nothing while loading
103+
expect(container.firstChild).toBeNull();
104+
});
91105
});
92106

93107
describe("Mobile Flow", () => {

packages/web/src/views/Onboarding/OnboardingFlow.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,14 @@ const _OnboardingFlow: React.FC = () => {
167167
];
168168

169169
// Initially hide the steps until the user logs in
170+
// For returning users, show the steps immediately
170171
useEffect(() => {
171-
setHideSteps(true);
172-
}, [setHideSteps]);
172+
if (hasCompletedSignup) {
173+
setHideSteps(false);
174+
} else {
175+
setHideSteps(true);
176+
}
177+
}, [setHideSteps, hasCompletedSignup]);
173178

174179
// Show mobile flow if on mobile device
175180
if (isMobile) {
@@ -184,19 +189,6 @@ const _OnboardingFlow: React.FC = () => {
184189
);
185190
}
186191

187-
if (!showOnboarding) {
188-
return (
189-
<Onboarding
190-
key="login-onboarding"
191-
steps={loginSteps}
192-
onComplete={() => {
193-
setShowOnboarding(true);
194-
setHideSteps(false);
195-
}}
196-
/>
197-
);
198-
}
199-
200192
// Determine initial step based on signup status
201193
// If user has completed signup before, skip welcome screens and start at sign-in-with-google
202194
const getInitialStepIndex = () => {
@@ -210,6 +202,25 @@ const _OnboardingFlow: React.FC = () => {
210202
return 0; // Start from beginning for new users
211203
};
212204

205+
// Wait for hasCompletedSignup to load before showing anything
206+
if (hasCompletedSignup === null) {
207+
return null;
208+
}
209+
210+
// For returning users (hasCompletedSignup = true), skip login steps and go directly to main onboarding
211+
if (!showOnboarding && !hasCompletedSignup) {
212+
return (
213+
<Onboarding
214+
key="login-onboarding"
215+
steps={loginSteps}
216+
onComplete={() => {
217+
setShowOnboarding(true);
218+
setHideSteps(false);
219+
}}
220+
/>
221+
);
222+
}
223+
213224
return (
214225
<Onboarding
215226
key="main-onboarding"

0 commit comments

Comments
 (0)