Merge branch 'worktree-agent-af80e237' into Develop
# Conflicts: # .planning/REQUIREMENTS.md # .planning/STATE.md
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
---
|
||||
phase: 18-global-items-public-profiles
|
||||
plan: 05
|
||||
subsystem: ui
|
||||
tags: [react, tanstack-router, tanstack-query, profiles, public-setups, tailwind]
|
||||
|
||||
requires:
|
||||
- phase: 18-global-items-public-profiles
|
||||
plan: 03
|
||||
provides: "Profile API endpoints, public setup endpoint, isPublic field"
|
||||
provides:
|
||||
- "usePublicProfile and useUpdateProfile hooks"
|
||||
- "ProfileSection component for settings page"
|
||||
- "Public profile page at /users/$userId"
|
||||
- "PublicSetupCard component"
|
||||
- "Setup visibility toggle (isPublic) on setup detail page"
|
||||
- "Public badge on setup list cards"
|
||||
affects: []
|
||||
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns: ["Profile data fetched via usePublicProfile(userId) for form pre-population"]
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- "src/client/hooks/useProfile.ts"
|
||||
- "src/client/components/ProfileSection.tsx"
|
||||
- "src/client/routes/users/$userId.tsx"
|
||||
- "src/client/components/PublicSetupCard.tsx"
|
||||
modified:
|
||||
- "src/client/routes/settings.tsx"
|
||||
- "src/client/routes/setups/$setupId.tsx"
|
||||
- "src/client/hooks/useSetups.ts"
|
||||
- "src/client/components/SetupCard.tsx"
|
||||
- "src/client/components/SetupsView.tsx"
|
||||
|
||||
key-decisions:
|
||||
- "Profile data loaded via usePublicProfile(userId) rather than extending /auth/me response"
|
||||
- "isPublic toggle placed in setup detail action bar as a button with globe icon"
|
||||
- "Public badge shown on SetupCard in list view for visual indicator"
|
||||
|
||||
patterns-established:
|
||||
- "Public profile route pattern: /users/$userId with TanStack Router file-based routing"
|
||||
- "Profile edit via dedicated ProfileSection component in settings page"
|
||||
|
||||
requirements-completed: [PROF-01, PROF-02, PROF-03, PROF-04, PROF-05]
|
||||
|
||||
duration: 5min
|
||||
completed: 2026-04-05
|
||||
---
|
||||
|
||||
# Phase 18 Plan 05: User Profiles & Public Sharing Client Summary
|
||||
|
||||
**Profile edit UI in settings with avatar upload, public profile page with setup listing, and setup visibility toggle with globe icon**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** 5 min
|
||||
- **Started:** 2026-04-05T11:15:08Z
|
||||
- **Completed:** 2026-04-05T11:19:47Z
|
||||
- **Tasks:** 3 (2 auto + 1 checkpoint auto-approved)
|
||||
- **Files modified:** 9
|
||||
|
||||
## What Was Built
|
||||
|
||||
### Task 1: Profile hooks and profile edit UI
|
||||
- Created `usePublicProfile` hook for fetching public profile data and `useUpdateProfile` mutation hook
|
||||
- Created `ProfileSection` component with avatar upload (reuses existing /api/images endpoint), display name input (max 100 chars), bio textarea with character counter (max 500 chars), and save button
|
||||
- Added ProfileSection to settings page as first section (visible when authenticated)
|
||||
|
||||
### Task 2: Public profile page and setup visibility toggle
|
||||
- Created public profile page at `/users/$userId` with avatar, display name (falls back to "User #id"), bio, and grid of public setups
|
||||
- Created `PublicSetupCard` component showing setup name and formatted creation date
|
||||
- Added isPublic toggle button with globe icon in setup detail action bar
|
||||
- Added "Public" badge to SetupCard in list view
|
||||
- Updated `useSetups` interfaces and `useUpdateSetup` mutation to support `isPublic` field
|
||||
|
||||
### Task 3: Verification (auto-approved)
|
||||
- Build succeeds, lint passes
|
||||
|
||||
## Commits
|
||||
|
||||
| Task | Commit | Message |
|
||||
|------|--------|---------|
|
||||
| 1 | f120d17 | feat(18-05): add profile hooks and profile edit UI in settings |
|
||||
| 2 | a995668 | feat(18-05): add public profile page and setup visibility toggle |
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
### Auto-fixed Issues
|
||||
|
||||
**1. [Rule 2 - Missing] Profile data loading strategy**
|
||||
- **Found during:** Task 1
|
||||
- **Issue:** Plan suggested reading profile from `auth?.user?.displayName` but /auth/me only returns `{ id }`, not profile fields
|
||||
- **Fix:** Used `usePublicProfile(userId)` to fetch profile data separately, with useEffect for form initialization
|
||||
- **Files modified:** src/client/components/ProfileSection.tsx
|
||||
|
||||
## Known Stubs
|
||||
|
||||
None -- all components are wired to real API endpoints.
|
||||
|
||||
## Self-Check: PASSED
|
||||
Reference in New Issue
Block a user