Wire onboarding task suggestions to backend, delete hardcoded catalog
Both "For You" and "Browse All" tabs are now fully server-driven on iOS and Android. No on-device task list, no client-side scoring rules. When the API fails the screen shows error + Retry + Skip so onboarding can still complete on a flaky network. Shared (KMM) - TaskCreateRequest + TaskResponse carry templateId - New BulkCreateTasksRequest/Response, TaskApi.bulkCreateTasks, APILayer.bulkCreateTasks (updates DataManager + TotalSummary) - OnboardingViewModel: templatesGroupedState + loadTemplatesGrouped; createTasks(residenceId, requests) posts once via the bulk path - Deleted regional-template plumbing: APILayer.getRegionalTemplates, OnboardingViewModel.loadRegionalTemplates, TaskTemplateApi. getTemplatesByRegion, TaskTemplate.regionId/regionName - 5 new AnalyticsEvents constants for the onboarding funnel Android (Compose) - OnboardingFirstTaskContent rewritten against the server catalog; ~70 lines of hardcoded taskCategories gone. Loading / Error / Empty panes with Retry + Skip buttons. Category icons derived from name keywords, colours from a 5-value palette keyed by category id - Browse selection carries template.id into the bulk request so task_template_id is populated server-side iOS (SwiftUI) - New OnboardingTasksViewModel (@MainActor ObservableObject) wrapping APILayer.shared for suggestions / grouped / bulk-submit with loading + error state (mirrors the TaskViewModel.swift pattern) - OnboardingFirstTaskView rewritten: buildForYouSuggestions (130 lines) and fallbackCategories (68 lines) deleted; both tabs show the same error+skip UX as Android; ForYouSuggestion/SuggestionRelevance gone - 5 new AnalyticsEvent cases with identical PostHog event names to the Kotlin constants so cross-platform funnels join cleanly - Existing TaskCreateRequest / TaskResponse call sites in TaskCard, TasksSection, TaskFormView updated for the new templateId parameter Docs - CLAUDE.md gains an "Onboarding task suggestions (server-driven)" subsection covering the data flow, key files on both platforms, and the KotlinInt(int: template.id) wrapping requirement Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,20 @@ object AnalyticsEvents {
|
||||
const val NEW_TASK_SCREEN_SHOWN = "new_task_screen_shown"
|
||||
const val TASK_CREATED = "task_created"
|
||||
|
||||
// Onboarding — First Task screen funnel
|
||||
// Fired by both iOS and Android with identical event names so the
|
||||
// PostHog funnel is cross-platform. Properties documented next to each.
|
||||
// ONBOARDING_SUGGESTIONS_LOADED: {"count": Int, "profile_completeness": Double}
|
||||
// ONBOARDING_SUGGESTION_ACCEPTED: {"template_id": Int, "relevance_score": Double}
|
||||
// ONBOARDING_BROWSE_TEMPLATE_ACCEPTED: {"template_id": Int, "category": String?}
|
||||
// ONBOARDING_TASKS_CREATED: {"count": Int}
|
||||
// ONBOARDING_TASK_STEP_SKIPPED: {"reason": "network_error" | "user_skip"}
|
||||
const val ONBOARDING_SUGGESTIONS_LOADED = "onboarding_suggestions_loaded"
|
||||
const val ONBOARDING_SUGGESTION_ACCEPTED = "onboarding_suggestion_accepted"
|
||||
const val ONBOARDING_BROWSE_TEMPLATE_ACCEPTED = "onboarding_browse_template_accepted"
|
||||
const val ONBOARDING_TASKS_CREATED = "onboarding_tasks_created"
|
||||
const val ONBOARDING_TASK_STEP_SKIPPED = "onboarding_task_step_skipped"
|
||||
|
||||
// Contractor
|
||||
const val CONTRACTOR_SCREEN_SHOWN = "contractor_screen_shown"
|
||||
const val NEW_CONTRACTOR_SCREEN_SHOWN = "new_contractor_screen_shown"
|
||||
|
||||
Reference in New Issue
Block a user