Skip to content

feat: add static What's new page linked from the sidebar#202

Merged
mitasovr merged 1 commit into
mainfrom
claude/whats-new-page-ef13f4
Jul 15, 2026
Merged

feat: add static What's new page linked from the sidebar#202
mitasovr merged 1 commit into
mainfrom
claude/whats-new-page-ef13f4

Conversation

@mitasovr

@mitasovr mitasovr commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Summary

  • New static /whats-new route with the 13 July 2026 release notes for dashboard users, rendered in the app's design system (header, category rows, known-gaps callout, coming-next cards).
  • New What's new entry at the bottom of the sidebar (footer, above settings) with active-state highlighting.
  • Page copy lives in the i18n bundle (whats_new namespace); emphasis is carried via <Trans> with <strong>/<i>.
  • Unit test covers the screen (header/stamp, all 9 improvement entries with categories, gaps callout, coming-next section).

Screenshots

Desktop, light theme — page + sidebar entry verified against the mock stack.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a “What’s New” page accessible at /whats-new.
    • Introduced localized release highlights covering recent improvements, known gaps, and upcoming features.
    • Added sidebar access and updated navigation styling for the new page.
  • Tests

    • Added coverage verifying release content, improvement categories, known gaps, and upcoming feature sections.

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>
@mitasovr
mitasovr requested a review from a team as a code owner July 15, 2026 12:57
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a localized What's New page at /whats-new, registers its route and generated typings, adds rendering tests, and updates sidebar rendering and styling.

Changes

What's New page

Layer / File(s) Summary
Localized content and screen rendering
src/screens/whats-new.tsx, src/locales/en/translation.json, src/screens/whats-new.test.tsx
Adds translated release content, dynamically rendered improvement, gaps, and upcoming sections, plus component coverage tests.
Route registration and generated typings
src/routes/whats-new.tsx, src/routeTree.gen.ts
Registers WhatsNewScreen at /whats-new and adds the route to TanStack Router’s generated runtime and type surfaces.
Sidebar rendering updates
src/components/app-sidebar.tsx
Updates sidebar imports, chevron rendering, header styling, viewer node rendering, and user identity menu markup.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related issues

  • constructorfabric/insight#1779 — Adds the requested hand-maintained What's New dashboard page with localized content, navigation, routing, and rendering.

Suggested reviewers: aleksdotbar

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: a new static What's new page linked from the sidebar.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/whats-new-page-ef13f4

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

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/components/app-sidebar.tsx (1)

146-175: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider 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 the AppSidebar render 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

📥 Commits

Reviewing files that changed from the base of the PR and between 1a9850d and d06e46a.

📒 Files selected for processing (6)
  • src/components/app-sidebar.tsx
  • src/locales/en/translation.json
  • src/routeTree.gen.ts
  • src/routes/whats-new.tsx
  • src/screens/whats-new.test.tsx
  • src/screens/whats-new.tsx

@mitasovr
mitasovr merged commit f39434e into main Jul 15, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants