[#536] Add immediate loading feedback across Blade navigation - #537
[#536] Add immediate loading feedback across Blade navigation#537DGoel1602 wants to merge 2 commits into
Conversation
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
📝 WalkthroughWalkthroughBlade now uses shared transition-aware links, routers, forms, loading surfaces, and navigation path state. Components provide optimistic tab and selector updates. Loading and reduced-motion feedback were added. Playwright and Vitest coverage verifies responsive navigation, interruptions, failures, forms, filters, cancellation, and route transitions. Merge Risk: 🔵 Low · up to The PR is broadly mergeable, but two navigation interactions can fail to show immediate pending feedback. Both fixes are localized and low risk. 🚥 Pre-merge checks | ✅ 5 | ❌ 3❌ Failed checks (2 warnings, 1 inconclusive)
✅ Passed checks (5 passed)
Full details: Linked Issues checkExplanation The code changes address the linked issue requirements for immediate feedback, optimistic navigation, loading states, guards, reduced motion, and Blade-only scope. The required screenshot and video files are excluded from review, so their contents cannot be verified. Resolution Provide reviewable evidence for the excluded files: navigation-desktop.mp4, navigation-desktop.png, navigation-mobile.mp4, navigation-mobile.png, skeleton-desktop.png, and skeleton-mobile.png. These files are excluded by the !/*.mp4 and !/*.png path filters. Full details: Docstring CoverageExplanation Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 12 functions across 50 files. (23 skipped: 6 unsupported, 17 over the file limit.) Full details: No Typescript Escape HatchesExplanation The PR adds four TypeScript assertion escape hatches: Resolution Replace each
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Note
Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.
🟡 Other comments (2)
apps/blade/src/app/_components/shared/route-transition-link.tsx-156-156 (1)
156-156: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winReplace
group-data-[exiting=true]withgroup-data-[pending=true]inmember-profile-settings-form.tsx.RouteTransitionLinknow emitsdata-pending, so the existing selector never matches.apps/blade/src/app/_components/admin/hackathon-events/hackathon-check-in-workspace.tsx-42-42 (1)
42-42: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winUse optimistic IDs for both selects.
useNavigationRouter().replacedefers the URL update in a transition, while both select values remain derived fromsearchParams. Their visible values can revert to the previous IDs until navigation commits. Add local optimistic IDs, update them withreplaceSelection, and bind bothvalueprops to those IDs, asAdminFormsSectionSelectdoes.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: QUIET
Plan: Team
Run ID: c2c023dc-c7a2-4a1d-8499-9c7da547863f
⛔ Files ignored due to path filters (6)
.forge/features/blade-responsive-navigation/evidence/navigation-desktop.mp4is excluded by!**/*.mp4.forge/features/blade-responsive-navigation/evidence/navigation-desktop.pngis excluded by!**/*.png.forge/features/blade-responsive-navigation/evidence/navigation-mobile.mp4is excluded by!**/*.mp4.forge/features/blade-responsive-navigation/evidence/navigation-mobile.pngis excluded by!**/*.png.forge/features/blade-responsive-navigation/evidence/skeleton-desktop.pngis excluded by!**/*.png.forge/features/blade-responsive-navigation/evidence/skeleton-mobile.pngis excluded by!**/*.png
📒 Files selected for processing (79)
.forge/features/blade-responsive-navigation/evidence/README.md.forge/features/blade-responsive-navigation/spec.md.forge/features/blade-responsive-navigation/srd.md.forge/features/blade-responsive-navigation/status.md.forge/features/blade-responsive-navigation/test-cases.mdapps/blade/src/app/_components/admin/alumni/alumni-bulletin-admin.tsxapps/blade/src/app/_components/admin/analytics/analytics-dashboard.tsxapps/blade/src/app/_components/admin/analytics/hackathon-analytics-dashboard.tsxapps/blade/src/app/_components/admin/analytics/team-performance-analytics-dashboard.tsxapps/blade/src/app/_components/admin/companies/company-admin-dashboard.tsxapps/blade/src/app/_components/admin/companies/company-admin-detail.tsxapps/blade/src/app/_components/admin/email/email-portal-admin.tsxapps/blade/src/app/_components/admin/email/email-portal-workspace.tsxapps/blade/src/app/_components/admin/events/event-admin-dashboard.tsxapps/blade/src/app/_components/admin/events/event-feedback-template-editor.tsxapps/blade/src/app/_components/admin/events/event-workspace-sections.tsxapps/blade/src/app/_components/admin/forms/admin-form-builder.tsxapps/blade/src/app/_components/admin/forms/admin-forms-dashboard.tsxapps/blade/src/app/_components/admin/forms/admin-forms-section-select.tsxapps/blade/src/app/_components/admin/forms/form-responses-dashboard.tsxapps/blade/src/app/_components/admin/forms/form-sections-manager.tsxapps/blade/src/app/_components/admin/hackathon-events/hackathon-check-in-workspace.tsxapps/blade/src/app/_components/admin/hackathon-events/hackathon-events-workspace.tsxapps/blade/src/app/_components/admin/hackathon/hackathon-detail.tsxapps/blade/src/app/_components/admin/hackathon/hackathon-list.tsxapps/blade/src/app/_components/admin/hackathon/hackers/hacker-roster.tsxapps/blade/src/app/_components/admin/hackathon/hackers/use-roster-url-state.tsapps/blade/src/app/_components/admin/issues/issue-create-dialog.tsxapps/blade/src/app/_components/admin/issues/issue-detail.tsxapps/blade/src/app/_components/admin/issues/issue-filters.tsxapps/blade/src/app/_components/admin/issues/issue-views.tsxapps/blade/src/app/_components/admin/issues/issue-workspace-dock.tsxapps/blade/src/app/_components/admin/issues/issue-workspace.tsxapps/blade/src/app/_components/admin/issues/template-catalog-dialog.tsxapps/blade/src/app/_components/admin/logs/admin-logs-dashboard.tsxapps/blade/src/app/_components/admin/members/member-admin-dashboard.tsxapps/blade/src/app/_components/admin/roles/admin-config-console.tsxapps/blade/src/app/_components/admin/roles/role-detail-dialog.tsxapps/blade/src/app/_components/admin/roles/role-management-dashboard.tsxapps/blade/src/app/_components/auth/sign-out-button.tsxapps/blade/src/app/_components/forms/generic-form-respondent.tsxapps/blade/src/app/_components/judging/evaluation-dialog.tsxapps/blade/src/app/_components/judging/guest-name-gate.tsxapps/blade/src/app/_components/judging/judge-deliberation.tsxapps/blade/src/app/_components/judging/judging-configuration-panel.tsxapps/blade/src/app/_components/judging/judging-control-panel.tsxapps/blade/src/app/_components/judging/project-command-center.tsxapps/blade/src/app/_components/member/alumni-dashboard.tsxapps/blade/src/app/_components/member/dashboard-client.tsxapps/blade/src/app/_components/member/member-dashboard.tsxapps/blade/src/app/_components/member/member-dues-payment.tsxapps/blade/src/app/_components/member/member-event-feedback.tsxapps/blade/src/app/_components/member/member-events-dashboard.tsxapps/blade/src/app/_components/member/member-form-history.tsxapps/blade/src/app/_components/member/member-profile-settings-form.tsxapps/blade/src/app/_components/member/member-signup-form.tsxapps/blade/src/app/_components/projects/admin-project-workspace.tsxapps/blade/src/app/_components/projects/judge-project-workspace.tsxapps/blade/src/app/_components/projects/project-directory.tsxapps/blade/src/app/_components/providers.tsxapps/blade/src/app/_components/public/member-landing-support.tsxapps/blade/src/app/_components/shared/account-settings-link.tsxapps/blade/src/app/_components/shared/authenticated-shell.tsxapps/blade/src/app/_components/shared/desktop-admin-navigation.tsxapps/blade/src/app/_components/shared/mobile-admin-navigation.tsxapps/blade/src/app/_components/shared/route-transition-link.tsxapps/blade/src/app/globals.cssapps/blade/src/app/judge/access-error/page.tsxapps/blade/src/app/loading.tsxapps/blade/src/app/not-found.tsxapps/blade/src/app/sponsor/page.tsxapps/blade/src/tests/admin/alumni-admin-navigation.test.tsxapps/blade/src/tests/admin/authenticated-shell.test.tsxapps/blade/src/tests/admin/company-admin-navigation.test.tsxapps/blade/src/tests/admin/email-portal-navigation.test.tsxapps/blade/src/tests/admin/hackathon-admin-navigation.test.tsxapps/blade/src/tests/e2e/responsive-navigation.spec.tsapps/blade/src/tests/events/admin-event-navigation.test.tsxapps/blade/src/tests/loading/route-transitions.test.tsx
💤 Files with no reviewable changes (6)
- apps/blade/src/tests/admin/hackathon-admin-navigation.test.tsx
- apps/blade/src/tests/admin/email-portal-navigation.test.tsx
- apps/blade/src/tests/admin/company-admin-navigation.test.tsx
- apps/blade/src/tests/events/admin-event-navigation.test.tsx
- apps/blade/src/tests/admin/authenticated-shell.test.tsx
- apps/blade/src/tests/admin/alumni-admin-navigation.test.tsx
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.
Why
Blade can feel unresponsive between a click and the next server response. The previous link wrapper also added an 80 ms delay and left its exit state set after navigation. Moving between pages should acknowledge the destination immediately and remain usable while data loads.
What
Closes: #536
Scope is Blade plus its feature bundle and review media. Most component changes are imports routing existing links/router calls through the shared Blade provider. No other app or shared package source changed.
Test Plan
pnpm format,pnpm lint,pnpm typecheck, andpnpm analyze:react:changed: passed. Lint reports existing repository warnings.pnpm --filter=@forge/blade build: passed with temporary local-only values for the locally missingJUDGING_ACCESS_SECRETandNEXT_PUBLIC_BLADE_URL. No environment files or deployment settings changed.To repeat the browser checks with a local test database, run
pnpm --filter=@forge/blade run e2e responsive-navigation.spec.ts --headed. To check manually, delay route requests, navigate Forms → Members, use back and repeat; at 320px, select Members from the menu and confirm it closes while feedback remains visible. Also apply an issue filter and attempt navigation with unsaved profile changes.Screenshots and recordings
The recordings use synthetic fixtures in an isolated local database. Tests deliberately hold route responses; these demonstrate feedback behavior, not production latency. Video capture adds 100 ms between browser actions for readability.
Desktop navigation
navigation-desktop.mp4
Mobile navigation
navigation-mobile.mp4
Root skeleton at desktop and 320px
The real root loading component was rendered through a temporary preview route for these captures; that route was removed. Capture notes.
Checklist
pnpm db:generateand committed the generated files inpackages/db/drizzle/