Skip to content

Commit 848c6e2

Browse files
ryaneggzclaude
andauthored
feat: add React Joyride onboarding tour for new users (#870) (#872)
Implement guided onboarding tour that auto-starts for first-time users and can be replayed via a Help (?) button in the nav bar. - Add onboarding_completed field to user settings schema, repo, and API - Create OnboardingContext with auth-aware settings fetch - Define 9 tour steps targeting data-tour attributes on key UI elements - Mount Joyride in ChatLayout with dark theme styling - Add HelpButton component to ChatNav Signed-off-by: ryaneggz <kre8mymedia@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent dd9973d commit 848c6e2

15 files changed

Lines changed: 729 additions & 144 deletions

File tree

backend/src/repos/user_settings_repo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ async def set_default_sandbox(self, sandbox: Optional[str]) -> UserSettings:
195195
"model_visibility": "default_model_visibility",
196196
"files": "default_files",
197197
"deleted_files": "default_deleted_files",
198+
"onboarding_completed": "onboarding_completed",
198199
}
199200

200201
async def patch_defaults(self, data: dict) -> UserSettings:

backend/src/routes/v0/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def _build_response(settings: UserSettings, statuses: list[ProviderKeyStatus]) -
3333
model_visibility=settings.default_model_visibility,
3434
files=settings.default_files,
3535
deleted_files=settings.default_deleted_files,
36+
onboarding_completed=settings.onboarding_completed,
3637
),
3738
provider_keys=statuses,
3839
)

backend/src/schemas/entities/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class UserSettings(BaseEntity):
5555
default_deleted_files: Optional[list[str]] = Field(
5656
default=None, description="Absolute file-path tombstones that suppress implicit defaults"
5757
)
58+
onboarding_completed: Optional[bool] = Field(
59+
default=None, description="Whether the user has completed the onboarding tour"
60+
)
5861

5962

6063
class DefaultsResponse(BaseModel):
@@ -69,6 +72,7 @@ class DefaultsResponse(BaseModel):
6972
model_visibility: Optional[list[str]] = None
7073
files: Optional[dict[str, PersistedContextFile]] = None
7174
deleted_files: Optional[list[str]] = None
75+
onboarding_completed: Optional[bool] = None
7276

7377

7478
class UserSettingsResponse(BaseModel):
@@ -96,6 +100,9 @@ class PatchDefaultsRequest(BaseModel):
96100
default=None,
97101
description="Full replacement list of deleted absolute file-path tombstones, or null to clear",
98102
)
103+
onboarding_completed: Optional[bool] = Field(
104+
default=None, description="Whether the user has completed the onboarding tour"
105+
)
99106

100107

101108
class UpsertProviderKeyRequest(BaseModel):

0 commit comments

Comments
 (0)