Skip to content

feat: UI polish — page titles, login redirect, avatar, public profile link, map home button - #70

Merged
kelleyglenn merged 13 commits into
masterfrom
feature/ui-polish
Feb 26, 2026
Merged

feat: UI polish — page titles, login redirect, avatar, public profile link, map home button#70
kelleyglenn merged 13 commits into
masterfrom
feature/ui-polish

Conversation

@kelleyglenn

@kelleyglenn kelleyglenn commented Feb 26, 2026

Copy link
Copy Markdown
Owner

Summary

Implements 5 web-app UI polish issues on a single branch:

Also fixes a Docker networking bug: added SERVER_API_URL env var so generateMetadata can reach the API gateway inside Docker (where localhost:8080 doesn't work).

Test plan

  • 421 unit tests passing (npm test)
  • Manual verification of all 5 features in browser
  • Full integration test suite passing (203 tests)
  • CI passes on this PR

Closes #21
Closes #35
Closes #41
Closes #65
Closes #66

🤖 Generated with Claude Code

kelleyglenn and others added 13 commits February 25, 2026 16:07
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…button

- generateMetadata now reads SERVER_API_URL (Docker internal network)
  before falling back to NEXT_PUBLIC_API_URL (browser-accessible)
- Home button uses flyTo() instead of setViewport() so the map
  animation triggers onMoveEnd → bounds update → cluster re-fetch

Fixes #21, #35

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ient

Covers all Sonar-flagged 0% coverage files:
- Route layout metadata exports and child rendering (5 layouts)
- generateMetadata for videos/[id] and users/[id] (success, error, fallback)
- VideoDetailClient param extraction (string and array)
- MapContainer loading state (isClient: false)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add global coverageThreshold (75/65/70/75%) so new uncovered files
  fail the build before PR creation
- Bump components/map/ thresholds from 44-48% to 50-55% (actual: 54-60%)
- Extract isHome ternaries in NavBar into useNavStyles() hook to reduce
  cognitive complexity flagged by SonarCloud

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Coverage after merging feature/ui-polish into master will be

79.87%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
src/app/login
   layout.tsx100%100%100%100%
   page.tsx0%0%0%0%11, 114, 14–16, 16, 16, 18, 18, 18, 18, 18, 21–25, 28, 28–29, 3, 30, 33–36, 38–39, 4, 40, 42, 42, 42, 42, 42–44, 44, 44, 46, 49, 5–6, 61, 7, 75, 8, 86, 9
src/app/map
   layout.tsx100%100%100%100%
   page.tsx0%0%0%0%11, 23–26, 28, 28, 28–29, 29, 29, 3, 32, 32, 32, 32, 32, 36, 36, 4, 47, 5–6
src/app/profile
   layout.tsx100%100%100%100%
   page.tsx96.15%81.82%100%100%120, 135
src/app/register
   layout.tsx100%100%100%100%
   page.tsx0%0%0%0%101, 11, 112, 13–21, 24, 24–26, 29, 3, 30–31, 33, 33–35, 38, 38–39, 4, 40, 43, 45–47, 49, 49, 49, 49, 49, 5, 50–51, 51, 51, 53, 56, 6, 68, 7, 79, 8–9, 90
src/app/users/[id]
   PublicProfileClient.tsx96.88%94.44%100%100%10
   page.tsx85%100%50%83.33%29–30
src/app/videos/[id]
   VideoDetailClient.tsx66.67%100%25%83.33%7
   page.tsx85%100%50%83.33%29–30
src/app/videos/new
   layout.tsx100%100%100%100%
   page.tsx0%0%0%0%10–11, 16–18, 20–21, 21, 21, 21–22, 26, 26, 3, 34, 34, 4–6
src/components
   HeroMap.tsx100%100%100%100%
   NavBar.tsx100%100%100%100%
src/components/map
   AmendmentFilter.tsx100%100%100%100%
   BottomSheet.tsx0%0%0%0%108, 111, 20–21, 24, 3, 30–32, 36–37, 4, 41, 43–44, 44, 46, 48, 5, 50, 50, 50, 52, 56, 60–61, 61, 61, 63–66, 66, 66, 68–69, 69, 69, 73–74, 74, 74, 78, 8, 81, 85, 97
   ClusterMarker.tsx100%100%100%100%
   FilterBar.tsx97.30%95.24%100%100%96
   LocationSearch.tsx0%0%0%0%27–29, 3, 31, 33, 33–37, 39, 39, 39, 39, 4, 43–45, 5, 51, 51–52, 6
   MapContainer.tsx58.49%44.19%37.50%78.72%100, 100, 100, 104, 134, 138, 140, 144, 167, 174, 177, 186, 192, 221, 225, 227, 231, 71, 74, 74, 74, 74, 74, 74, 74, 74, 74, 87, 90, 90, 90, 90, 90, 99
   MapView.tsx0%0%0%0%11, 17–18, 27, 3, 30–32, 32, 34–35, 35, 37, 43, 47, 49, 59–60, 64–65, 69, 7, 70, 70, 70, 70, 72, 74, 74, 78, 8, 82–83, 83, 83, 83, 85, 9, 90, 93, 93
   ParticipantFilter.tsx100%100%100%100%
   SidePanel.tsx0%0%0%0%15–17, 20–21, 21, 21, 21, 23, 27, 27–28, 3–4, 40, 42, 42, 5, 53, 53, 56, 6, 67, 67, 86
   VideoInfoCard.tsx95.74%83.33%100%100%67, 75
   VideoListItem.tsx96.36%90.48%100%100%40, 48
   VideoMarker.tsx97.22%92.86%100%100%37
src/components/profile
   AvatarPicker.tsx86.67%66.67%80%93.10%115, 91, 94, 94
   MySubmissions.tsx100%100%100%100%
   PrivacySettingsForm.tsx79.17%25%75%93.75%47, 62, 64, 64
   ProfileInfoForm.tsx100%100%100%100%
   SocialLinksForm.tsx100%100%100%100%
src/components/ui
   Button.tsx100%100%100%100%
   Card.tsx100%100%100%100%
   Chip.tsx100%100%100%100%
   Input.tsx100%100%100%100%
   Toast.tsx100%100%100%100%
src/components/video
   LocationPicker.tsx76.19%66.67%83.33%77.78%174, 56–57, 77–78, 81, 93, 93–99
   MiniMap.tsx100%100%100%100%
   ModerationControls.tsx100%100%100%100%
   VideoDetail.tsx84%75%83.33%95%156, 160, 163, 176, 178, 178, 212, 34, 58, 68, 70, 73, 77, 82
   VideoSubmitForm.tsx85.49%75.36%84%90.06%101, 104, 106, 108, 147, 151, 164, 185, 188, 243, 245–246, 250, 252, 252, 252–254, 254–255, 257, 262, 262, 262, 268, 290, 290–292, 361, 71–72, 86
   YouTubePreview.tsx100%100%100%100%
src/config
   mapbox.ts100%100%100%100%
src/hooks
   useLocationClusters.ts100%100%100%100%
   useResponsive.ts100%100%100%100%
   useVideoSearch.ts92.31%80%100%100%30
src/lib/api
   auth.ts81.25%100%75%83.33%25–26
   client.ts100%100%100%100%
   locations.ts100%100%100%100%
   moderation.ts100%100%100%100%
   search.ts95.06%82.61%100%100%138, 138, 221, 221
   users.ts100%100%100%100%
   videos.ts61.90%100%60%62.50%40, 43, 47, 53, 56, 59
src/providers
   AuthProvider.tsx99.36%100%95.65%100%
   MapProvider.tsx100%100%100%100%
   QueryProvider.tsx100%100%100%100%
src/types
   map.ts86.67%50%100%100%147, 165

@sonarqubecloud

Copy link
Copy Markdown

@kelleyglenn
kelleyglenn merged commit 0f54ad4 into master Feb 26, 2026
3 checks passed
@kelleyglenn
kelleyglenn deleted the feature/ui-polish branch February 26, 2026 02:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant