feat: add static What's new page linked from the sidebar#202
Conversation
Adds a /whats-new route with the 13 July 2026 release notes for dashboard users, rendered in the app's design system, and a new sidebar footer entry to reach it. Content lives in the i18n bundle; a unit test covers the screen for the diff-coverage gate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Roman Mitasov <roman.mitasov@constructor.tech>
📝 WalkthroughWalkthroughAdds a localized What's New page at ChangesWhat's New page
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related issues
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed: dependency version conflict. Check your lock file or package.json. 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.
🧹 Nitpick comments (1)
src/components/app-sidebar.tsx (1)
146-175: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider extracting the user identity menu into a separate component.
Using an IIFE (Immediately Invoked Function Expression) here is perfectly valid for scoping local variables, but extracting this section into its own component (e.g.,
ViewerIdentityMenu) can make theAppSidebarrender function cleaner and easier to maintain.♻️ Proposed refactor
You could define a smaller component outside of
AppSidebar(or in a separate file):function ViewerIdentityMenu({ viewer, viewerEmail }: { viewer: any, viewerEmail: string }) { const primaryEmail = viewer?.email ?? viewerEmail; const primary = viewer?.display_name || primaryEmail; const showSecondary = primary !== primaryEmail; return ( <SidebarMenu> <SidebarMenuItem> <SidebarMenuButton size="lg" className="cursor-default"> <Avatar className="size-8 shrink-0"> <AvatarFallback className="bg-sidebar-primary text-xs font-semibold text-sidebar-primary-foreground"> {getInitials(primary) || "?"} </AvatarFallback> </Avatar> <div className="flex min-w-0 flex-1 flex-col leading-tight"> <span className="truncate text-sm font-medium text-sidebar-foreground"> {primary} </span> {showSecondary ? ( <span className="truncate text-xs text-sidebar-foreground/60"> {primaryEmail} </span> ) : null} </div> </SidebarMenuButton> </SidebarMenuItem> </SidebarMenu> ); }And then invoke it simply as:
- {viewerEmail - ? (() => { - const primaryEmail = viewer?.email ?? viewerEmail; - const primary = viewer?.display_name || primaryEmail; - const showSecondary = primary !== primaryEmail; - return ( - <SidebarMenu> - <SidebarMenuItem> - <SidebarMenuButton size="lg" className="cursor-default"> - <Avatar className="size-8 shrink-0"> - <AvatarFallback className="bg-sidebar-primary text-xs font-semibold text-sidebar-primary-foreground"> - {getInitials(primary) || "?"} - </AvatarFallback> - </Avatar> - <div className="flex min-w-0 flex-1 flex-col leading-tight"> - <span className="truncate text-sm font-medium text-sidebar-foreground"> - {primary} - </span> - {showSecondary ? ( - <span className="truncate text-xs text-sidebar-foreground/60"> - {primaryEmail} - </span> - ) : null} - </div> - </SidebarMenuButton> - </SidebarMenuItem> - </SidebarMenu> - ); - })() - : null} + {viewerEmail ? <ViewerIdentityMenu viewer={viewer} viewerEmail={viewerEmail} /> : null}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/app-sidebar.tsx` around lines 146 - 175, Extract the viewer identity markup from the IIFE in AppSidebar into a separate ViewerIdentityMenu component, passing viewer and viewerEmail as props. Move the primaryEmail, primary, and showSecondary calculations into that component, then render ViewerIdentityMenu from the viewerEmail branch while preserving the existing display and fallback behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@src/components/app-sidebar.tsx`:
- Around line 146-175: Extract the viewer identity markup from the IIFE in
AppSidebar into a separate ViewerIdentityMenu component, passing viewer and
viewerEmail as props. Move the primaryEmail, primary, and showSecondary
calculations into that component, then render ViewerIdentityMenu from the
viewerEmail branch while preserving the existing display and fallback behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: dd636596-aea4-4ec4-94a6-d215d5651db7
📒 Files selected for processing (6)
src/components/app-sidebar.tsxsrc/locales/en/translation.jsonsrc/routeTree.gen.tssrc/routes/whats-new.tsxsrc/screens/whats-new.test.tsxsrc/screens/whats-new.tsx
Summary
whats_newnamespace); emphasis is carried via<Trans>with<strong>/<i>.Screenshots
Desktop, light theme — page + sidebar entry verified against the mock stack.
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
/whats-new.Tests