[#536] Add immediate loading feedback across Blade navigation - #537
Conversation
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
|
Warning Review limit reachedNext included review available in 37 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Path: .coderabbit.yml Review profile: QUIET Plan: Team Run ID: 📒 Files selected for processing (8)
📝 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.
DVidal1205
left a comment
There was a problem hiding this comment.
lgtm just resolve these concerns from CodeRabbit if you think it is necessary:
two navigation interactions can fail to show immediate pending feedback
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
|
Addressed both navigation feedback concerns in 9541263:
Both bugs were reproduced before the fixes. Validation after incorporating the latest The screenshot shows the settings arrow and progress indicator while the navigation response is held. It is a GitHub attachment; no media files were added to the repository. |

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. Review media is hosted as GitHub PR attachments. 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/