Skip to content

Commit 1f263ad

Browse files
authored
feat(onboarding): let users permanently skip the onboarding flow (#3525)
* feat(onboarding): let users permanently skip the onboarding flow Adds a permanent, cross-device skip to the new onboarding flow so a no-lease user is no longer trapped in the picker or the stripped auto-deploy screen. Backend: new nullable `onboardingSkippedAt` timestamp on the user settings table (migration 0034), exposed on `/v1/user/me`, and a new idempotent `POST /v1/user/skipOnboarding` that sets it once via a set-if-null update so the original skip time is never overwritten. Frontend: a `useSkipOnboarding` hook that records the event, persists the flag, awaits a session refresh, then routes to the deployments list; the onboarding gate and stripped-chrome hook both treat a skipped user as onboarded; and a shared SkipOnboardingButton on the picker and the minimal nav of the auto-deploy screen. Closes CON-750 * fix(onboarding): keep the user in place when the post-skip session refresh fails - report the refresh error and skip navigation: the gate would still see a flagless user and bounce the navigation back into onboarding anyway - restore the import-x/no-cycle suppressions in the user model schema that this branch mistakenly removed (fixes the api lint CI failure) - inject Nav's heavy children via DEPENDENCIES and cover its minimal chrome with a spec (codecov patch gap on the skip button line) - use faker uuids for unique-constrained usernames in the user service integration test and type the RequireOnboarding user fixture with mock<T> * fix(user): restore no-cycle suppressions stripped by the pre-commit hook lint-staged runs eslint from the repo root where the typescript resolver cannot resolve @src aliases, so import-x/no-cycle never fires there and --fix deletes the directives as unused; committed with --no-verify to keep them (the workspace-level lint, which CI runs, needs them) * test(user): add the skip onboarding route to the API docs snapshot * fix(onboarding): only navigate after the refreshed profile carries the skip flag - run the whole persist-and-refresh sequence inside the mutation so isSkipping disables the skip button for its full duration instead of re-enabling during the session-refresh window - navigate from an effect gated on user.onboardingSkippedAt — the same profile the onboarding gate reads — so a fail-open flagless 200 from the profile route no longer bounces the user back into the funnel * feat(onboarding): consolidate skipping into the shared button and gate provider links - replace the picker's bespoke skip-the-trial button, sheet reason and analytics event with the shared SkipOnboardingButton in the page body - land a skipped user on the new-deployment page instead of the deployments list, and spell out the skip in the button label - render marketplace provider names as plain text until the user is onboarded: the provider detail link would bounce them back into the onboarding funnel (new useIsOnboarded hook reusing the gate's lease-existence query without refetching it on mount) - drop the wallet passthrough from useEnsureTrialStarted, orphaned by the removed trial conditional * feat(deployment): add a tooltip and settings icon to the SDL import/export trigger - swap the overflow dots for a settings icon and name the trigger "Import or export config" via one constant feeding both the tooltip and the accessible label * refactor(analytics): drop the unused onboarding_add_credits_click event * test(onboarding): model the post-refresh profile transition in the skip spec * fix(deployment): increase gap between navigation items for improved spacing
1 parent 71fbe2a commit 1f263ad

40 files changed

Lines changed: 2102 additions & 135 deletions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE "userSetting" ADD COLUMN "onboardingSkippedAt" timestamp;

0 commit comments

Comments
 (0)