Skip to content

Dashboard: Update team layout #7464

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

MananTank
Copy link
Member

@MananTank MananTank commented Jun 27, 2025


PR-Codex overview

This PR focuses on refactoring the billing and settings structure within the application, consolidating routes, and updating UI components to improve navigation and user experience.

Detailed summary

  • Deleted several unused files related to billing and credits.
  • Updated links from /settings/billing to /billing across various components.
  • Refactored useActiveSidebarLink to simplify sidebar link management.
  • Adjusted layout components for better responsiveness.
  • Introduced a new StaffModeNotice component for staff mode indication.
  • Enhanced UI consistency in billing-related pages and components.
  • Modified redirects for billing and invoices to streamline navigation.

The following files were skipped due to too many changes: apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features

    • Introduced a full-width sidebar layout with collapsible submenus and responsive navigation.
    • Added a team sidebar layout with structured navigation for team dashboards.
    • Added collapsible UI components for use in layouts and menus.
    • Added a reusable StaffModeNotice component for staff mode indication.
  • Bug Fixes

    • Improved container sizing and maximum width constraints for better layout consistency across analytics, audit log, and ecosystem pages.
  • Refactor

    • Simplified and reorganized sidebar layouts, removing complex internal logic and mobile navigation from several components.
    • Updated navigation structures to use new sidebar and tab-based layouts.
    • Streamlined and restyled headers, banners, and button components for a more cohesive look.
    • Replaced inline staff mode banners with the StaffModeNotice component.
    • Removed sidebar navigation from usage and settings layouts for a cleaner interface.
    • Removed gas credits settings and related components from the settings area.
    • Refactored ecosystem pages to redirect directly to creation, removing landing page.
    • Updated billing-related URL paths by removing deprecated /settings segments for consistency.
    • Removed account plan constants and unused hooks for cleaner codebase.
    • Cleaned up imports and replaced some relative imports with absolute paths.
  • Style

    • Enhanced visual styling and responsiveness for range selectors, sidebars, and headers.
    • Adjusted text sizes and spacing in mobile navigation and file sections for improved readability.
    • Added rounded corners and adjusted spacing in date and interval selectors.
    • Added responsive minimum widths and consistent borders to pagination buttons and links.
  • Chores

    • Added a new dependency for collapsible UI support.
    • Updated import paths and added lint suppression comments for code clarity and maintainability.
    • Updated multiple URLs in links and buttons to reflect new billing paths without /settings segment.
    • Added responsive minimum widths to pagination buttons and consistent border styling to pagination links.

Copy link

vercel bot commented Jun 27, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs-v2 ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 28, 2025 0:33am
nebula ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 28, 2025 0:33am
thirdweb_playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 28, 2025 0:33am
thirdweb-www ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 28, 2025 0:33am
wallet-ui ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 28, 2025 0:33am

Copy link
Contributor

coderabbitai bot commented Jun 27, 2025

## Walkthrough

This update refactors and restructures sidebar and layout components, introducing new sidebar abstractions and simplifying or removing previous sidebar logic. Several components and layouts are restyled with updated container widths and spacing. New sidebar-related components are added, and dependencies are updated to include Radix UI's collapsible primitives. Numerous billing-related URLs are updated to remove the `/settings` segment. Several settings and credits-related components and pages are removed. A new `StaffModeNotice` component is introduced and used in place of inline staff mode banners. Ecosystem navigation switches from sidebar to tab-based navigation with removal of ecosystem selection dropdown. Redirects for legacy team settings URLs to billing URLs are added.

## Changes

| File(s)                                                                                                   | Change Summary |
|-----------------------------------------------------------------------------------------------------------|---------------|
| `apps/dashboard/package.json`                                                                              | Added `@radix-ui/react-collapsible` dependency. |
| `apps/dashboard/src/@/components/analytics/date-range-selector.tsx`                                        | Added optional `className` prop; uses `cn` utility for class merging. |
| `apps/dashboard/src/@/components/analytics/range-selector.tsx`                                             | Updated layout and styling classes for responsive flex layout and rounded elements. |
| `apps/dashboard/src/@/components/blocks/MobileSidebar.tsx`                                                 | Changed `useActiveSidebarLink` from exported to internal function. |
| `apps/dashboard/src/@/components/blocks/SidebarLayout.tsx`                                                 | Replaced detailed sidebar logic with a simplified layout using `CustomSidebar` and `MobileSidebar`. Removed helper components and the `FullWidthSidebarLayout` export. |
| `apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx`                                     | Added new comprehensive sidebar layout component with collapsible submenus and active state logic. |
| `apps/dashboard/src/@/components/ui/collapsible.tsx`                                                       | New file: Re-exports Radix UI collapsible primitives as local components. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx`                               | New file: Implements a team dashboard sidebar layout using `FullWidthSidebarLayout` with structured navigation links. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx`                                          | Refactored to use `SidebarProvider` and `TeamSidebarLayout`; restyled "Staff Mode" banner; removed tab navigation and footer. Added ecosystem data fetching. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx`                                | Added `md:max-w-7xl` class to container for max width constraint. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx`                              | Added `max-w-5xl` to containers; wrapped children in new flex column div. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx`                                | Removed `container` class from outer div. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx` | Switched from sidebar to tab-based navigation; updated link structure and container classes. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx` | Changed padding and added max width to container; removed ecosystem select dropdown. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx`                       | Removed entire settings layout component and related mobile nav/sidebar logic. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx`   | Added `text-sm` class for smaller text size in mobile nav. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx`                                  | Removed sidebar, updated container and button styling. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx`                                | Reduced header gap and font size/weight; reorganized summary cards with added status dot and percentages. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx`                      | Updated heading and added description for files section. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx` | Changed import path for `FullWidthSidebarLayout`. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx`                        | Replaced custom staff mode banner with `StaffModeNotice` component; updated imports. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts`        | Added lint ignore comments for explicit `any` usage. |
| `apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx`                               | Added `max-w-7xl` class to container; wrapped `RangeSelector` in responsive div. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/StaffModeNotice.tsx`                     | New file: Added `StaffModeNotice` component displaying a styled staff mode banner with leave button. |
| `apps/dashboard/redirects.js`                                                                               | Added `teamPageRedirects` array to redirect legacy team settings billing URLs to new billing URLs; appended to redirects list. |
| Multiple billing-related components and files (`billing.tsx`, `CancelPlanModal.tsx`, `TeamPlanBadge.tsx`, `UpsellWrapper.tsx`, `BillingAlertBannersUI.tsx`, `FreePlanUpsellBannerUI.tsx`, `PlanInfoCard.tsx`) | Updated billing-related URLs to remove `/settings` segment. |
| Deleted settings credits-related components and pages (`SettingsCreditsPage.tsx`, `ApplyForOpCreditsForm.tsx`, `ApplyForOpCreditsModal.tsx`, `PlanCard.tsx`, `applyOpSponsorship.ts`, `SettingsCreditsPage.tsx`) | Removed gas credits settings and application components. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx`                                 | New billing layout component added with authentication and team validation, rendering billing tabs and children. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx`                                  | Updated billing page path to remove `/settings` segment; minor styling adjustment. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx`                               | Refactored settings layout to remove client and account fetching; simplified to render tabs and children. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx`                 | Updated upgrade link URL to remove `/settings` segment. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/Alerts.tsx`    | Updated billing link URL to remove `/settings` segment. |
| `apps/dashboard/src/app/(app)/team/components/TeamHeader/TeamAndProjectSelectorPopoverButton.tsx`          | Updated upgrade billing link URL to remove `/settings` segment. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/EcosystemCreatePage.tsx`          | Added header section with title and description with external link; restyled layout container. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/components/client/create-ecosystem-form.client.tsx` | Removed static header section from form UI; replaced ecosystem permissions link with `UnderlineLink`. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/loading.tsx`                      | Changed default export to wrapper component adding `border-none` class. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/hooks/use-ecosystem-list.ts`             | Deleted hook for fetching ecosystem list. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx`                                | Removed ecosystem landing page component; replaced with immediate redirect to ecosystem creation page. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/layout.tsx`                                                 | Changed import of `getAuthToken` to absolute path. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx`                          | Consolidated imports; wrapped `RangeSelector` in responsive div. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx` | Updated import path for `InAppWalletStats` type to absolute alias. |
| `apps/dashboard/src/@/components/blocks/pagination-buttons.tsx`                                           | Added responsive minimum width style to pagination buttons. |
| `apps/dashboard/src/@/components/ui/pagination.tsx`                                                       | Updated `PaginationLink` to always have visible border when inactive. |
| `apps/dashboard/src/@/hooks/useApi.ts`                                                                    | Removed exported constant `accountPlan`. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant TeamSidebarLayout
    participant FullWidthSidebarLayout
    participant SidebarProvider

    User->>SidebarProvider: Render Team Page Layout
    SidebarProvider->>TeamSidebarLayout: Render with layoutPath, children
    TeamSidebarLayout->>FullWidthSidebarLayout: Pass structured sidebar links and children
    FullWidthSidebarLayout->>User: Render sidebar navigation and page content

Possibly related PRs

Suggested reviewers

  • joaquim-verges
  • MananTank

<!-- walkthrough_end -->

<!-- This is an auto-generated comment: resource warnings by coderabbit.ai -->

> [!WARNING]
> ## Review ran into problems
> 
> <details>
> <summary>🔥 Problems</summary>
> 
> Errors were encountered while retrieving linked issues.
> 
> <details>
> <summary>Errors (1)</summary>
> 
> * TEAM-0000: Entity not found: Issue - Could not find referenced Issue.
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: resource warnings by coderabbit.ai -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=thirdweb-dev/js&utm_content=7464):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@MananTank MananTank marked this pull request as ready for review June 27, 2025 19:21
@MananTank MananTank requested review from a team as code owners June 27, 2025 19:21
@github-actions github-actions bot added the Dashboard Involves changes to the Dashboard. label Jun 27, 2025
Copy link
Member Author

MananTank commented Jun 27, 2025


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
apps/dashboard/src/@/components/ui/collapsible.tsx (1)

1-12: Add a Storybook entry for the new UI primitive

Per our guidelines, every new reusable UI component under @/components/ui/* should have an accompanying *.stories.tsx for quick visual regression testing and documentation. Consider adding a minimal story that showcases a basic open/close interaction.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts (1)

32-32: LGTM! Consider tracking the FIXME comments.

The lint suppressions appropriately acknowledge the use of any types. Since input validation occurs upstream via isAbiInput (per retrieved learnings), this technical debt is acceptable.

Would you like me to create tracking issues for the FIXME comments to ensure they're addressed in future iterations?

Also applies to: 97-97, 180-180

apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (1)

1-1: Consider renaming file to follow coding guidelines.

According to the coding guidelines, interactive component files should be named in PascalCase with a .client.tsx suffix. Consider renaming this file to FullWidthSidebarLayout.client.tsx.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7f7f48 and 13360b1.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (23)
  • apps/dashboard/package.json (1 hunks)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/analytics/range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/blocks/MobileSidebar.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (1 hunks)
  • apps/dashboard/src/@/components/ui/collapsible.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
`**/*.@(ts|tsx)`: Accept a typed 'props' object and export a named function (e.g...

**/*.@(ts|tsx): Accept a typed 'props' object and export a named function (e.g., export function MyComponent()).
Combine class names via 'cn', expose 'className' prop if useful.
Reuse core UI primitives; avoid re-implementing buttons, cards, modals.
Local state or effects live inside; data fetching happens in hooks.
Merge class names with 'cn' from '@/lib/utils' to keep conditional logic readable.
Stick to design-tokens: background ('bg-card'), borders ('border-border'), muted text ('text-muted-foreground') etc.
Use the 'container' class with a 'max-w-7xl' cap for page width consistency.
Spacing utilities ('px-', 'py-', 'gap-*') are preferred over custom margins.
Responsive helpers follow mobile-first ('max-sm', 'md', 'lg', 'xl').
Never hard-code colors – always go through Tailwind variables.
Tailwind CSS is the styling system – avoid inline styles or CSS modules.
Prefix files with 'import "server-only";' so they never end up in the client bundle (for server-only code).

📄 Source: CodeRabbit Inference Engine (.cursor/rules/dashboard.mdc)

List of files the instruction was applied to:

  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
  • apps/dashboard/src/@/components/ui/collapsible.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx
  • apps/dashboard/src/@/components/analytics/range-selector.tsx
  • apps/dashboard/src/@/components/blocks/MobileSidebar.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx
  • apps/dashboard/src/@/components/blocks/SidebarLayout.tsx
  • apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx
`**/components/*`: Add 'className' to the root element of every component for external overrides. Place the file close to its feature: 'feature/components/MyComponent.tsx'.

**/components/*: Add 'className' to the root element of every component for external overrides.
Place the file close to its feature: 'feature/components/MyComponent.tsx'.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/dashboard.mdc)

List of files the instruction was applied to:

  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
`**/components/@([A-Z][A-Za-z0-9]*)@(\.tsx|\.client\.tsx)`: Name files after the component in PascalCase; append '.client.tsx' when interactive.

**/components/@([A-Z][A-Za-z0-9]*)@(\.tsx|\.client\.tsx): Name files after the component in PascalCase; append '.client.tsx' when interactive.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/dashboard.mdc)

List of files the instruction was applied to:

  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
`apps/dashboard/*`: The dashboard app is a web-based developer console built wit...

apps/dashboard/*: The dashboard app is a web-based developer console built with Next.js and Chakra UI.
Use Tailwind CSS only for styling; no inline styles or CSS modules.
Use cn() from @/lib/utils for conditional class merging.
Use design system tokens for backgrounds (bg-card), borders (border-border), and muted text (text-muted-foreground).
Expose className prop on the root element of components for overrides.
Use NavLink for internal navigation with automatic active states.
Server components should start files with import "server-only"; client components should begin files with 'use client';.
Never import posthog-js in server components; analytics events are client-side only.

📄 Source: CodeRabbit Inference Engine (CLAUDE.md)

List of files the instruction was applied to:

  • apps/dashboard/package.json
`**/components/*.client.tsx`: Client components must start with 'use client'; before imports.

**/components/*.client.tsx: Client components must start with 'use client'; before imports.

📄 Source: CodeRabbit Inference Engine (.cursor/rules/dashboard.mdc)

List of files the instruction was applied to:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
🧠 Learnings (24)
📓 Common learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Keep documentation focused on developer experience and practical usage, and surface breaking changes prominently in PR descriptions.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: MananTank
PR: thirdweb-dev/js#7177
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/shared-settings-page.tsx:29-39
Timestamp: 2025-05-27T20:10:47.245Z
Learning: MananTank prefers adding error handling (try-catch) directly inside utility functions like `shouldRenderNewPublicPage` rather than requiring callers to wrap the function calls in try-catch blocks. This centralizes error handling and benefits all callers automatically.
apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (2)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Analytics events should be added intentionally, with human-readable names, and reported via helpers in 'src/@/analytics/report.ts'.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (8)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
apps/dashboard/package.json (2)
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (10)
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: MananTank
PR: thirdweb-dev/js#7356
File: apps/nebula/src/app/not-found.tsx:1-1
Timestamp: 2025-06-17T18:30:52.976Z
Learning: In the thirdweb/js project, the React namespace is available for type annotations (like React.FC) without needing to explicitly import React. This is project-specific configuration that differs from typical TypeScript/React setups.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx (2)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx (1)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts (5)
Learnt from: AmineAfia
PR: thirdweb-dev/js#7415
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts:31-42
Timestamp: 2025-06-23T13:33:05.770Z
Learning: In the thirdweb webhooks ABI utilities, validation of ABI inputs is performed upstream using the `isAbiInput` function before calling `getCanonicalType`. The `getCanonicalType` function only receives pre-validated inputs, so additional runtime validation within the function would be redundant.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Comment only ambiguous logic; avoid restating TypeScript in prose.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Write idiomatic TypeScript with explicit function declarations and return types.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx (1)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx (2)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (4)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Analytics events should be added intentionally, with human-readable names, and reported via helpers in 'src/@/analytics/report.ts'.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
apps/dashboard/src/@/components/ui/collapsible.tsx (12)
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: For new UI components, add Storybook stories (*.stories.tsx) alongside the code.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Group feature-specific components under feature/components/* with a barrel index.ts.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Reuse core UI primitives and avoid re-implementing common elements like buttons, cards, or modals.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use client components for interactive UI, components that rely on hooks, browser APIs, or require fast transitions.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx (1)
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
apps/dashboard/src/@/components/analytics/date-range-selector.tsx (8)
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Add a 'className' prop to the root element of every component to allow for external style overrides.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Analytics events should be added intentionally, with human-readable names, and reported via helpers in 'src/@/analytics/report.ts'.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Merge class names using the 'cn' utility from '@/lib/utils' to keep conditional logic readable.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Use cn() from @/lib/utils for conditional class merging.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Expose className prop on the root element of components for overrides.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
apps/dashboard/src/@/components/analytics/range-selector.tsx (2)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Analytics events should be added intentionally, with human-readable names, and reported via helpers in 'src/@/analytics/report.ts'.
apps/dashboard/src/@/components/blocks/MobileSidebar.tsx (3)
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:27:16.172Z
Learning: Next.js Link component supports external URLs without throwing errors. When used with absolute URLs (like https://...), it behaves like a regular anchor tag without client-side routing, but does not cause runtime crashes or errors as previously believed.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:30:04.326Z
Learning: Next.js Link component fully supports both internal and external URLs and works appropriately with all standard anchor attributes including target="_blank", rel="noopener noreferrer", etc. Using Link for external URLs is completely appropriate and recommended.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx (10)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: jnsdls
PR: thirdweb-dev/js#7364
File: apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx:36-41
Timestamp: 2025-06-18T02:13:34.500Z
Learning: In the logout flow in apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, when `doLogout()` fails, the cleanup steps (resetAnalytics(), wallet disconnect, router refresh) should NOT execute. This is intentional to maintain consistency - if server-side logout fails, client-side cleanup should not occur.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:27:16.172Z
Learning: Next.js Link component supports external URLs without throwing errors. When used with absolute URLs (like https://...), it behaves like a regular anchor tag without client-side routing, but does not cause runtime crashes or errors as previously believed.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:30:04.326Z
Learning: Next.js Link component fully supports both internal and external URLs and works appropriately with all standard anchor attributes including target="_blank", rel="noopener noreferrer", etc. Using Link for external URLs is completely appropriate and recommended.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx (7)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: jnsdls
PR: thirdweb-dev/js#7364
File: apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx:36-41
Timestamp: 2025-06-18T02:13:34.500Z
Learning: In the logout flow in apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, when `doLogout()` fails, the cleanup steps (resetAnalytics(), wallet disconnect, router refresh) should NOT execute. This is intentional to maintain consistency - if server-side logout fails, client-side cleanup should not occur.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (14)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: jnsdls
PR: thirdweb-dev/js#7364
File: apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx:36-41
Timestamp: 2025-06-18T02:13:34.500Z
Learning: In the logout flow in apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, when `doLogout()` fails, the cleanup steps (resetAnalytics(), wallet disconnect, router refresh) should NOT execute. This is intentional to maintain consistency - if server-side logout fails, client-side cleanup should not occur.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:27:16.172Z
Learning: Next.js Link component supports external URLs without throwing errors. When used with absolute URLs (like https://...), it behaves like a regular anchor tag without client-side routing, but does not cause runtime crashes or errors as previously believed.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: MananTank
PR: thirdweb-dev/js#7285
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx:57-57
Timestamp: 2025-06-05T13:59:49.886Z
Learning: In the thirdweb dashboard Next.js app, when using loginRedirect() in server components, ensure to add a return statement after the redirect call to prevent further code execution and potential security issues.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:30:04.326Z
Learning: Next.js Link component fully supports both internal and external URLs and works appropriately with all standard anchor attributes including target="_blank", rel="noopener noreferrer", etc. Using Link for external URLs is completely appropriate and recommended.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (13)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7285
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx:57-57
Timestamp: 2025-06-05T13:59:49.886Z
Learning: In the thirdweb dashboard Next.js app, when using loginRedirect() in server components, ensure to add a return statement after the redirect call to prevent further code execution and potential security issues.
Learnt from: MananTank
PR: thirdweb-dev/js#7228
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx:23-25
Timestamp: 2025-05-30T18:14:57.074Z
Learning: In the dashboard codebase, the `loginRedirect` function performs an actual page redirect that automatically stops execution, similar to Next.js `redirect()`. No return statement is needed after calling `loginRedirect` as it handles flow control internally.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/page.tsx:40-42
Timestamp: 2025-06-24T21:37:26.869Z
Learning: MananTank confirmed that loginRedirect function calls Next.js redirect internally, so no return statement is needed after calling loginRedirect() as it handles flow control internally by throwing an exception.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/shared-claim-conditions-page.tsx:43-49
Timestamp: 2025-05-26T16:31:02.480Z
Learning: In the thirdweb dashboard codebase, when `redirectToContractLandingPage()` is called, an explicit return statement is not required afterward because the function internally calls Next.js's `redirect()` which throws an error to halt execution.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/analytics/shared-analytics-page.tsx:33-39
Timestamp: 2025-05-26T16:30:24.965Z
Learning: In the thirdweb dashboard codebase, redirectToContractLandingPage function already handles execution termination internally (likely using Next.js redirect() which throws an exception), so no explicit return statement is needed after calling it.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:27:16.172Z
Learning: Next.js Link component supports external URLs without throwing errors. When used with absolute URLs (like https://...), it behaves like a regular anchor tag without client-side routing, but does not cause runtime crashes or errors as previously believed.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (10)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: For new UI components, add Storybook stories (*.stories.tsx) alongside the code.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (10)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: UI primitives should be imported from @/components/ui/*.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use client components for interactive UI, components that rely on hooks, browser APIs, or require fast transitions.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (5)
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: For new UI components, add Storybook stories (*.stories.tsx) alongside the code.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
🧬 Code Graph Analysis (5)
apps/dashboard/src/@/components/blocks/MobileSidebar.tsx (1)
apps/dashboard/src/@/components/blocks/Sidebar.tsx (1)
  • SidebarLink (15-23)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (3)
apps/dashboard/src/@/components/ui/sidebar.tsx (1)
  • SidebarProvider (769-769)
apps/dashboard/src/app/(app)/team/components/TeamHeader/team-header-logged-in.client.tsx (1)
  • TeamHeaderLoggedIn (24-130)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (1)
  • TeamSidebarLayout (12-107)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (1)
apps/dashboard/src/@/components/ui/tabs.tsx (1)
  • TabPathLinks (213-244)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (1)
apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (1)
  • FullWidthSidebarLayout (56-98)
apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (3)
apps/dashboard/src/@/components/ui/sidebar.tsx (14)
  • SidebarContent (751-751)
  • SidebarFooter (752-752)
  • SidebarRail (770-770)
  • SidebarTrigger (772-772)
  • SidebarGroup (753-753)
  • SidebarMenuItem (764-764)
  • SidebarGroupLabel (756-756)
  • SidebarGroupContent (755-755)
  • useSidebar (773-773)
  • SidebarMenu (760-760)
  • SidebarMenuButton (763-763)
  • SidebarMenuSub (766-766)
  • SidebarMenuSubItem (768-768)
  • SidebarSeparator (771-771)
apps/portal/src/components/Document/index.ts (1)
  • Separator (29-29)
apps/dashboard/src/@/components/ui/collapsible.tsx (3)
  • Collapsible (11-11)
  • CollapsibleTrigger (11-11)
  • CollapsibleContent (11-11)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: Unit Tests
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: Size
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Lint Packages
  • GitHub Check: Build Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (35)
apps/dashboard/package.json (1)

14-14: Dependency addition LGTM

@radix-ui/react-collapsible is correctly added under dependencies, matching its runtime use as a UI primitive.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx (1)

50-50: Verify layout width after dropping container

Removing the container class will let this page stretch to the full viewport width. If the parent layout already restricts width (e.g., with max-w-*), this is fine; otherwise the audit-log table may appear unusually wide.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (1)

13-13: Import path update looks correct

The layout now points to the new full-width-sidebar-layout module; no further action required.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx (1)

16-16: Minor typography tweak approved

Adding text-sm aligns this bar’s font size with other mobile nav elements.

apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (1)

13-13: LGTM! Consistent width constraint applied.

The addition of max-w-7xl aligns with the coding guidelines for page width consistency and follows the established pattern seen across other team components.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (1)

7-7: LGTM! Import path cleanup improves maintainability.

The change from a deep relative import path to an absolute import path enhances code readability and reduces the risk of broken imports when files are moved.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx (1)

85-86: LGTM! Typography and spacing refinements improve visual hierarchy.

The reduction in gap spacing and the adjustment from bold 3xl to semibold 2xl creates a more balanced header section that aligns with the broader UI consistency improvements across the dashboard.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1)

76-76: LGTM! Consistent responsive width constraint applied.

The addition of md:max-w-7xl follows the mobile-first responsive approach and maintains consistency with the maximum width constraints applied across other team dashboard components.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx (2)

27-27: LGTM! Consistent width constraint applied to header.

The addition of max-w-5xl maintains layout consistency with other team components while providing appropriate content width constraints.


33-35: LGTM! Improved layout structure with proper spacing.

The addition of max-w-5xl and the new wrapper div with flex column layout, gap spacing, and padding follows the coding guidelines preference for spacing utilities over custom margins and creates a more structured layout.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1)

239-240: LGTM! Consistent styling improvements.

The padding adjustment and max-w-7xl constraint align with the coding guidelines for consistent page width and improved visual hierarchy.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx (1)

154-161: LGTM! Improved heading hierarchy and user guidance.

The larger heading size, descriptive text, and increased spacing enhance the user experience by providing clearer visual hierarchy and helpful context about IPFS file storage.

apps/dashboard/src/@/components/analytics/date-range-selector.tsx (1)

11-11: Perfect implementation of className extensibility.

This change follows the coding guidelines exactly by exposing a className prop on the root element and using the cn utility for proper class merging.

Also applies to: 17-17, 31-31

apps/dashboard/src/@/components/blocks/MobileSidebar.tsx (1)

56-56: LGTM! Good API surface reduction.

Making useActiveSidebarLink internal is appropriate since it's only used within this module. This reduces the public API surface and prevents external coupling to implementation details.

apps/dashboard/src/@/components/analytics/range-selector.tsx (3)

79-79: LGTM! Responsive layout improvement.

The responsive flex layout changes provide better mobile-first design with flex-col by default and lg:flex-row for larger screens. The w-full and reduced gap spacing enhance the component's adaptability.


81-81: LGTM! Consistent design system styling.

Adding rounded-full class aligns with the design system updates and provides visual consistency across the component.


93-93: LGTM! Consistent styling with design tokens.

The bg-card rounded-full classes follow the design system guidelines for using design tokens and provide visual consistency with the DateRangeSelector component.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx (2)

15-21: LGTM! Clean header structure.

The header section properly uses container classes with max-w-6xl and maintains consistent border and padding styling.


23-25: LGTM! Simplified content layout.

The content container uses appropriate flexbox classes and maintains the max-w-6xl constraint for consistent page width. The simplification by removing sidebar navigation aligns with the broader refactoring effort.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx (3)

15-16: LGTM! Consistent container styling.

The container uses max-w-7xl for appropriate page width constraint and maintains proper flex layout for the header section.


17-18: LGTM! Enhanced button styling with design tokens.

The buttons now use rounded-full bg-card classes alongside the existing outline variant, following design system guidelines for consistent styling and proper use of design tokens.

Also applies to: 23-23


32-34: LGTM! Clean content container structure.

The content container properly uses max-w-7xl constraint and appropriate flexbox classes for layout consistency.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (4)

1-11: LGTM! Proper client component setup.

The component correctly uses the "use client" directive and imports appropriate icons from lucide-react. The FullWidthSidebarLayout import follows the established pattern.


12-19: LGTM! Clean component interface and path construction.

The component properly accepts layoutPath and children props with appropriate TypeScript typing. The path construction for usage and settings sections is clean and maintainable.


20-102: LGTM! Comprehensive sidebar navigation structure.

The sidebar configuration is well-organized with:

  • Proper use of icons for visual consistency
  • Nested submenus for Usage and Team Settings
  • Appropriate exactMatch flags for overview pages
  • Clean separation of concerns between top-level and nested navigation

The structure follows the composable UI primitive principles and provides a comprehensive navigation experience.


103-107: LGTM! Clean render implementation.

The component properly delegates rendering to FullWidthSidebarLayout and passes through the children prop, maintaining a clean separation of concerns.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (3)

2-4: LGTM! Proper import updates for tab navigation.

The imports correctly add getAuthToken and TabPathLinks to support the refactored navigation approach.


57-74: LGTM! Well-structured tab navigation implementation.

The TabPathLinks component usage is correct with:

  • Proper link structure using name and path properties
  • Consistent container styling with max-w-7xl
  • Appropriate padding classes
  • Future-ready placeholder for "Design (coming soon)" functionality

The transition from sidebar to tab navigation is well-executed and maintains design consistency.


75-77: LGTM! Consistent content container styling.

The content container maintains the max-w-7xl constraint and proper flexbox layout classes, ensuring consistency with other layout components.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (3)

1-15: LGTM! Import changes align with the new sidebar layout approach.

The addition of sidebar-related imports and the move to use TeamSidebarLayout is consistent with the PR objectives.


47-74: Staff mode implementation looks good with improved UI.

The staff mode detection logic is correct, and the new banner design with orange tones and the action button with icon provides better visual hierarchy.


87-89: ```shell
#!/bin/bash

Description: Properly verify that TeamSidebarLayout leverages FullWidthSidebarLayout

Search for FullWidthSidebarLayout usage anywhere under the team directory

rg -A 5 "FullWidthSidebarLayout" "apps/dashboard/src/app/(app)/team"


</details>
<details>
<summary>apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (1)</summary>

`1-36`: **Clean refactor that properly delegates sidebar complexity.**

The simplification of this component is well-executed, moving complex sidebar logic to the new `FullWidthSidebarLayout` while keeping this as a simple wrapper. The component correctly uses the "use client" directive and follows the coding guidelines for styling with Tailwind classes.

</details>
<details>
<summary>apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (2)</summary>

`56-98`: **Well-structured sidebar layout with proper responsive design.**

The component correctly implements a full-width sidebar layout with:
- Proper use of Tailwind classes following the coding guidelines
- AppFooter included (which was removed from the team layout)
- Mobile-responsive trigger
- Clean separation between sidebar and content areas

---

`171-297`: **Excellent implementation of recursive sidebar rendering.**

The render functions are well-structured with:
- Proper handling of all link types (links, groups, separators, submenus)
- Correct use of Collapsible components for submenus
- Good UX with mobile sidebar closing on link click
- Appropriate use of array index for separator keys (with biome-ignore comment)

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Copy link
Contributor

github-actions bot commented Jun 27, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 63.11 KB (0%) 1.3 s (0%) 447 ms (+29.03% 🔺) 1.8 s
thirdweb (cjs) 352.76 KB (0%) 7.1 s (0%) 2.9 s (+8.37% 🔺) 10 s
thirdweb (minimal + tree-shaking) 5.72 KB (0%) 115 ms (0%) 47 ms (+83.42% 🔺) 162 ms
thirdweb/chains (tree-shaking) 530 B (0%) 11 ms (0%) 30 ms (+234.69% 🔺) 41 ms
thirdweb/react (minimal + tree-shaking) 19.59 KB (0%) 392 ms (0%) 166 ms (+269.4% 🔺) 558 ms

Copy link

codecov bot commented Jun 27, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 51.91%. Comparing base (143ab6d) to head (08834f6).
Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7464   +/-   ##
=======================================
  Coverage   51.91%   51.91%           
=======================================
  Files         949      949           
  Lines       64149    64149           
  Branches     4226     4226           
=======================================
  Hits        33306    33306           
  Misses      30737    30737           
  Partials      106      106           
Flag Coverage Δ
packages 51.91% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@MananTank MananTank force-pushed the 06-28-dashboard_use_sidebar_layout_in_team_layout branch from 13360b1 to c32f96f Compare June 27, 2025 19:31
Copy link

changeset-bot bot commented Jun 27, 2025

⚠️ No Changeset found

Latest commit: 08834f6

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx (1)

20-22: Consider updating loginRedirect URL for consistency.

The loginRedirect URL points to /settings but this is a billing layout. Consider updating to redirect to the current billing path for better UX:

- loginRedirect(`/team/${params.team_slug}/~/settings`);
+ loginRedirect(`/team/${params.team_slug}/~/billing`);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c32f96f and eb81f06.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (54)
  • apps/dashboard/package.json (1 hunks)
  • apps/dashboard/redirects.js (2 hunks)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/analytics/range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/billing/CancelPlanModal/CancelPlanModal.tsx (1 hunks)
  • apps/dashboard/src/@/components/billing/billing.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/GatedSwitch.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/MobileSidebar.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/SidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/pagination-buttons.tsx (9 hunks)
  • apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx (1 hunks)
  • apps/dashboard/src/@/components/ui/collapsible.tsx (1 hunks)
  • apps/dashboard/src/@/components/ui/pagination.tsx (1 hunks)
  • apps/dashboard/src/@/hooks/useApi.ts (0 hunks)
  • apps/dashboard/src/app/(app)/components/Header/SecondaryNav/account-button.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/BillingAlertBannersUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/StaffModeNotice.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/credit-balance-section.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/SettingsCreditsPage.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/ApplyForOpCreditsForm.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/ApplyForOpCreditsModal.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/PlanCard.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/applyOpSponsorship.ts (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/page.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/Alerts.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/components/TeamHeader/TeamAndProjectSelectorPopoverButton.tsx (1 hunks)
💤 Files with no reviewable changes (8)
  • apps/dashboard/src/@/hooks/useApi.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/SettingsCreditsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/PlanCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/ApplyForOpCreditsForm.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/applyOpSponsorship.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/credits/components/ApplyForOpCreditsModal.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/SettingsLayout.tsx
✅ Files skipped from review due to trivial changes (15)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/BillingAlertBannersUI.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx
  • apps/dashboard/src/@/components/blocks/GatedSwitch.tsx
  • apps/dashboard/src/app/(app)/components/Header/SecondaryNav/account-button.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/credit-balance-section.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/Alerts.tsx
  • apps/dashboard/src/@/components/billing/CancelPlanModal/CancelPlanModal.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx
  • apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx
  • apps/dashboard/src/@/components/blocks/pagination-buttons.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx
  • apps/dashboard/src/@/components/billing/billing.tsx
🚧 Files skipped from review as they are similar to previous changes (22)
  • apps/dashboard/package.json
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamsMobileNav.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
  • apps/dashboard/src/@/components/ui/collapsible.tsx
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/utils/abiUtils.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/storage/your-files.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
  • apps/dashboard/src/@/components/analytics/range-selector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/StaffModeNotice.tsx
  • apps/dashboard/src/@/components/blocks/MobileSidebar.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
  • apps/dashboard/src/@/components/blocks/SidebarLayout.tsx
  • apps/dashboard/src/@/components/blocks/full-width-sidebar-layout.tsx
🧰 Additional context used
📓 Path-based instructions (2)
`**/*.@(ts|tsx)`: Accept a typed 'props' object and export a named function (e.g...

**/*.@(ts|tsx): Accept a typed 'props' object and export a named function (e.g., export function MyComponent()).
Combine class names via 'cn', expose 'className' prop if useful.
Reuse core UI primitives; avoid re-implementing buttons, cards, modals.
Local state or effects live inside; data fetching happens in hooks.
Merge class names with 'cn' from '@/lib/utils' to keep conditional logic readable.
Stick to design-tokens: background ('bg-card'), borders ('border-border'), muted text ('text-muted-foreground') etc.
Use the 'container' class with a 'max-w-7xl' cap for page width consistency.
Spacing utilities ('px-', 'py-', 'gap-*') are preferred over custom margins.
Responsive helpers follow mobile-first ('max-sm', 'md', 'lg', 'xl').
Never hard-code colors – always go through Tailwind variables.
Tailwind CSS is the styling system – avoid inline styles or CSS modules.
Prefix files with 'import "server-only";' so they never end up in the client bundle (for server-only code).

📄 Source: CodeRabbit Inference Engine (.cursor/rules/dashboard.mdc)

List of files the instruction was applied to:

  • apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx
  • apps/dashboard/src/@/components/ui/pagination.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx
  • apps/dashboard/src/app/(app)/team/components/TeamHeader/TeamAndProjectSelectorPopoverButton.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx
`apps/dashboard/*`: The dashboard app is a web-based developer console built wit...

apps/dashboard/*: The dashboard app is a web-based developer console built with Next.js and Chakra UI.
Use Tailwind CSS only for styling; no inline styles or CSS modules.
Use cn() from @/lib/utils for conditional class merging.
Use design system tokens for backgrounds (bg-card), borders (border-border), and muted text (text-muted-foreground).
Expose className prop on the root element of components for overrides.
Use NavLink for internal navigation with automatic active states.
Server components should start files with import "server-only"; client components should begin files with 'use client';.
Never import posthog-js in server components; analytics events are client-side only.

📄 Source: CodeRabbit Inference Engine (CLAUDE.md)

List of files the instruction was applied to:

  • apps/dashboard/redirects.js
🧠 Learnings (10)
📓 Common learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: MananTank
PR: thirdweb-dev/js#7177
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/shared-settings-page.tsx:29-39
Timestamp: 2025-05-27T20:10:47.245Z
Learning: MananTank prefers adding error handling (try-catch) directly inside utility functions like `shouldRenderNewPublicPage` rather than requiring callers to wrap the function calls in try-catch blocks. This centralizes error handling and benefits all callers automatically.
apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (5)
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: jnsdls
PR: thirdweb-dev/js#7364
File: apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx:36-41
Timestamp: 2025-06-18T02:13:34.500Z
Learning: In the logout flow in apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, when `doLogout()` fails, the cleanup steps (resetAnalytics(), wallet disconnect, router refresh) should NOT execute. This is intentional to maintain consistency - if server-side logout fails, client-side cleanup should not occur.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
apps/dashboard/src/@/components/ui/pagination.tsx (1)
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Use NavLink for internal navigation to automatically handle active states.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx (1)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
apps/dashboard/src/app/(app)/team/components/TeamHeader/TeamAndProjectSelectorPopoverButton.tsx (5)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
apps/dashboard/redirects.js (10)
Learnt from: MananTank
PR: thirdweb-dev/js#7228
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx:23-25
Timestamp: 2025-05-30T18:14:57.074Z
Learning: In the dashboard codebase, the `loginRedirect` function performs an actual page redirect that automatically stops execution, similar to Next.js `redirect()`. No return statement is needed after calling `loginRedirect` as it handles flow control internally.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/shared-claim-conditions-page.tsx:43-49
Timestamp: 2025-05-26T16:31:02.480Z
Learning: In the thirdweb dashboard codebase, when `redirectToContractLandingPage()` is called, an explicit return statement is not required afterward because the function internally calls Next.js's `redirect()` which throws an error to halt execution.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7285
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx:57-57
Timestamp: 2025-06-05T13:59:49.886Z
Learning: In the thirdweb dashboard Next.js app, when using loginRedirect() in server components, ensure to add a return statement after the redirect call to prevent further code execution and potential security issues.
Learnt from: jnsdls
PR: thirdweb-dev/js#7363
File: apps/wallet-ui/next.config.mjs:58-73
Timestamp: 2025-06-18T02:02:21.427Z
Learning: User jnsdls prefers to explicitly list specific rewrite rules for clarity/documentation purposes, even when they are functionally redundant due to catch-all patterns. In PostHog rewrite configurations, they intentionally keep specific endpoint rules like "/_ph/decide" listed after catch-all rules like "/_ph/:path*" for documentation clarity, accepting the functional redundancy.
Learnt from: jnsdls
PR: thirdweb-dev/js#7363
File: apps/playground-web/next.config.mjs:61-76
Timestamp: 2025-06-18T02:01:37.865Z
Learning: In PostHog migration rewrites, the team prefers to explicitly list the `/_ph/decide` rewrite rule even when it may be covered by a catch-all pattern, for configuration clarity and documentation purposes.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/page.tsx:40-42
Timestamp: 2025-06-24T21:37:26.869Z
Learning: MananTank confirmed that loginRedirect function calls Next.js redirect internally, so no return statement is needed after calling loginRedirect() as it handles flow control internally by throwing an exception.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/analytics/shared-analytics-page.tsx:33-39
Timestamp: 2025-05-26T16:30:24.965Z
Learning: In the thirdweb dashboard codebase, redirectToContractLandingPage function already handles execution termination internally (likely using Next.js redirect() which throws an exception), so no explicit return statement is needed after calling it.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (11)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: For new UI components, add Storybook stories (*.stories.tsx) alongside the code.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-25T02:13:08.257Z
Learning: Client components should begin files with 'use client' and use React hooks for interactivity.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Prefer composable UI primitives (Button, Input, Select, Tabs, Card, Sidebar, Separator, Badge) over custom markup for maintainability and design consistency.
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Always import reusable UI components from a central library (e.g., '@/components/ui/*') to ensure consistency and avoid duplication.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Files for components should be named in PascalCase and use the '.client.tsx' suffix if interactive.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx (13)
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: jnsdls
PR: thirdweb-dev/js#7364
File: apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx:36-41
Timestamp: 2025-06-18T02:13:34.500Z
Learning: In the logout flow in apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, when `doLogout()` fails, the cleanup steps (resetAnalytics(), wallet disconnect, router refresh) should NOT execute. This is intentional to maintain consistency - if server-side logout fails, client-side cleanup should not occur.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7285
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx:57-57
Timestamp: 2025-06-05T13:59:49.886Z
Learning: In the thirdweb dashboard Next.js app, when using loginRedirect() in server components, ensure to add a return statement after the redirect call to prevent further code execution and potential security issues.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/page.tsx:40-42
Timestamp: 2025-06-24T21:37:26.869Z
Learning: MananTank confirmed that loginRedirect function calls Next.js redirect internally, so no return statement is needed after calling loginRedirect() as it handles flow control internally by throwing an exception.
Learnt from: MananTank
PR: thirdweb-dev/js#7228
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx:23-25
Timestamp: 2025-05-30T18:14:57.074Z
Learning: In the dashboard codebase, the `loginRedirect` function performs an actual page redirect that automatically stops execution, similar to Next.js `redirect()`. No return statement is needed after calling `loginRedirect` as it handles flow control internally.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-06-23T13:49:58.951Z
Learning: Client components must begin with 'use client'; before imports to ensure correct rendering behavior in Next.js.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/shared-claim-conditions-page.tsx:43-49
Timestamp: 2025-05-26T16:31:02.480Z
Learning: In the thirdweb dashboard codebase, when `redirectToContractLandingPage()` is called, an explicit return statement is not required afterward because the function internally calls Next.js's `redirect()` which throws an error to halt execution.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/analytics/shared-analytics-page.tsx:33-39
Timestamp: 2025-05-26T16:30:24.965Z
Learning: In the thirdweb dashboard codebase, redirectToContractLandingPage function already handles execution termination internally (likely using Next.js redirect() which throws an exception), so no explicit return statement is needed after calling it.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx:2-10
Timestamp: 2025-05-26T16:28:10.079Z
Learning: In Next.js 14+, the `params` object in page components is always a Promise that needs to be awaited, so the correct typing is `params: Promise<ParamsType>` rather than `params: ParamsType`.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx (10)
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
Learnt from: jnsdls
PR: thirdweb-dev/js#7188
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx:15-15
Timestamp: 2025-05-29T00:46:09.063Z
Learning: In the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/components/accounts-count.tsx, the 3-column grid layout (md:grid-cols-3) is intentionally maintained even when rendering only one StatCard, as part of the design structure for this component.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx:2-10
Timestamp: 2025-05-26T16:28:10.079Z
Learning: In Next.js 14+, the `params` object in page components is always a Promise that needs to be awaited, so the correct typing is `params: Promise<ParamsType>` rather than `params: ParamsType`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: MananTank
PR: thirdweb-dev/js#7228
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx:23-25
Timestamp: 2025-05-30T18:14:57.074Z
Learning: In the dashboard codebase, the `loginRedirect` function performs an actual page redirect that automatically stops execution, similar to Next.js `redirect()`. No return statement is needed after calling `loginRedirect` as it handles flow control internally.
Learnt from: MananTank
PR: thirdweb-dev/js#7285
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx:57-57
Timestamp: 2025-06-05T13:59:49.886Z
Learning: In the thirdweb dashboard Next.js app, when using loginRedirect() in server components, ensure to add a return statement after the redirect call to prevent further code execution and potential security issues.
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/page.tsx:40-42
Timestamp: 2025-06-24T21:37:26.869Z
Learning: MananTank confirmed that loginRedirect function calls Next.js redirect internally, so no return statement is needed after calling loginRedirect() as it handles flow control internally by throwing an exception.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx (4)
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:155-160
Timestamp: 2025-06-10T00:46:58.580Z
Learning: In the dashboard application, the route structure for team and project navigation is `/team/[team_slug]/[project_slug]/...` without a `/project/` segment. Contract links should be formatted as `/team/${teamSlug}/${projectSlug}/contract/${chainId}/${contractAddress}`.
Learnt from: MananTank
PR: thirdweb-dev/js#7315
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx:153-226
Timestamp: 2025-06-10T00:50:20.795Z
Learning: In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch-nft.tsx, the updateStatus function correctly expects a complete MultiStepState["status"] object. For pending states, { type: "pending" } is the entire status object. For error states, { type: "error", message: React.ReactNode } is the entire status object. The current code incorrectly spreads the entire step object instead of passing just the status object.
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/nfts/page.tsx:20-20
Timestamp: 2025-05-26T16:26:58.068Z
Learning: In team/project contract pages under routes like `/team/[team_slug]/[project_slug]/contract/[chainIdOrSlug]/[contractAddress]/*`, users are always logged in by design. The hardcoded `isLoggedIn={true}` prop in these pages is intentional and correct, not a bug to be fixed.
Learnt from: jnsdls
PR: thirdweb-dev/js#6929
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx:14-19
Timestamp: 2025-05-21T05:17:31.283Z
Learning: In Next.js server components, the `params` object can sometimes be a Promise that needs to be awaited, despite type annotations suggesting otherwise. In apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/insight/webhooks/page.tsx, it's necessary to await the params object before accessing its properties.
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Size
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: Unit Tests
  • GitHub Check: Build Packages
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (13)
apps/dashboard/src/@/components/ui/pagination.tsx (1)

53-56: LGTM! Border styling improvement enhances visual consistency.

The addition of default transparent borders and conditional visible borders for inactive states creates more consistent pagination link sizing and improves visual distinction between active and inactive states. The use of design tokens (border-border) and proper className merging follows the established patterns.

apps/dashboard/redirects.js (2)

115-131: LGTM: Well-structured redirects for billing URL migration.

The new teamPageRedirects array properly handles the migration from legacy /settings/billing/* URLs to the new /billing/* structure. The redirects maintain backward compatibility and use appropriate permanent flags.


447-447: LGTM: Proper integration of team redirects.

The teamPageRedirects array is correctly spread into the main redirects array alongside existing redirect arrays.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/TeamSidebarLayout.tsx (2)

1-1: LGTM: Proper client component directive.

The 'use client' directive is correctly placed at the top of the file for this interactive sidebar component.


15-83: Well-structured sidebar layout component.

The TeamSidebarLayout component follows React best practices with:

  • Proper TypeScript typing for props
  • Good organization of sidebar links with appropriate icons
  • Consistent URL structure using the layoutPath prop
  • Clear separation of content and footer links

The component leverages the FullWidthSidebarLayout primitive as recommended in the coding guidelines.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx (3)

2-4: LGTM: Simplified imports align with layout refactor.

The import changes reflect the removal of complex account handling and adoption of tab-based navigation, which simplifies the component structure.


15-18: Good simplification: Removed unnecessary account fetching.

The Promise.all now only fetches essential data (team and authToken), removing the overhead of account validation and client creation that's no longer needed in this simplified layout.


28-61: Excellent layout simplification using design system components.

The new layout structure is much cleaner and follows the coding guidelines by:

  • Using TabPathLinks component for navigation consistency
  • Applying proper design tokens (container, max-w-6xl, etc.)
  • Maintaining responsive spacing with utility classes
  • Creating a more maintainable component structure

This aligns with the move away from complex sidebar navigation to simpler tab-based navigation.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx (1)

1-56: Well-implemented billing layout with consistent patterns.

The billing layout component follows the same successful pattern established in the settings layout:

  • Proper async server component structure
  • Concurrent data fetching with Promise.all
  • Authentication and team validation
  • Clean tab navigation with TabPathLinks
  • Consistent styling with design tokens

The component structure promotes maintainability and follows the coding guidelines effectively.

apps/dashboard/src/app/(app)/team/components/TeamHeader/TeamAndProjectSelectorPopoverButton.tsx (1)

104-106: LGTM: URL update aligns with billing route restructuring.

The change from /settings/billing to /billing is consistent with the broader refactor to simplify billing URLs across the dashboard application. This maintains proper navigation behavior with the new routing structure.

apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (1)

48-48: ```shell
#!/bin/bash

Description: Verify billing URL patterns in all .ts and .tsx files

Search for any leftover old billing URLs

rg -C2 "/~/settings/billing" -g ".ts" -g ".tsx"

Confirm usage of the new billing URL pattern

rg -C2 "/~/billing?" -g ".ts" -g ".tsx"


</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx (1)</summary>

`134-134`: **LGTM! Billing URL simplification aligns with the refactor.**

The URL change from `/~/settings/billing` to `/~/billing` is consistent with the dashboard-wide billing URL structure simplification. Query parameters are correctly preserved for the upgrade flow.

</details>
<details>
<summary>apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx (1)</summary>

`135-135`: **LGTM! Billing URL update is consistent with the dashboard refactor.**

The URL change removes the `/settings` segment while preserving the query parameters for the growth plan upgrade flow. This aligns with the systematic billing URL structure changes across the dashboard.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Copy link
Contributor

graphite-app bot commented Jun 28, 2025

Merge activity

graphite-app bot pushed a commit that referenced this pull request Jun 28, 2025
<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on refactoring the billing-related components and routes in the application, streamlining the user experience by updating links and improving layout structures.

### Detailed summary
- Deleted several unused files related to billing settings and credits.
- Updated link paths from `/settings/billing` to `/billing` across various components.
- Refactored `useActiveSidebarLink` to remove export.
- Adjusted layout and structure for better responsiveness in billing-related pages.
- Introduced a new `StaffModeNotice` component for staff mode indication.
- Enhanced visual elements and spacing in multiple components for consistency.

> The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Introduced a full-width sidebar layout with collapsible submenus and responsive navigation.
  * Added a team sidebar layout with structured navigation for team dashboards.
  * Added collapsible UI components for use in layouts and menus.
  * Added a reusable StaffModeNotice component for staff mode indication.

* **Bug Fixes**
  * Improved container sizing and maximum width constraints for better layout consistency across analytics, audit log, and ecosystem pages.

* **Refactor**
  * Simplified and reorganized sidebar layouts, removing complex internal logic and mobile navigation from several components.
  * Updated navigation structures to use new sidebar and tab-based layouts.
  * Streamlined and restyled headers, banners, and button components for a more cohesive look.
  * Replaced inline staff mode banners with the StaffModeNotice component.
  * Removed sidebar navigation from usage and settings layouts for a cleaner interface.
  * Removed gas credits settings and related components from the settings area.
  * Refactored ecosystem pages to redirect directly to creation, removing landing page.
  * Updated billing-related URL paths by removing deprecated `/settings` segments for consistency.
  * Removed account plan constants and unused hooks for cleaner codebase.
  * Cleaned up imports and replaced some relative imports with absolute paths.

* **Style**
  * Enhanced visual styling and responsiveness for range selectors, sidebars, and headers.
  * Adjusted text sizes and spacing in mobile navigation and file sections for improved readability.
  * Added rounded corners and adjusted spacing in date and interval selectors.
  * Added responsive minimum widths and consistent borders to pagination buttons and links.

* **Chores**
  * Added a new dependency for collapsible UI support.
  * Updated import paths and added lint suppression comments for code clarity and maintainability.
  * Added responsive minimum widths to pagination buttons and consistent border styling to pagination links.
  * Updated multiple URLs in links and buttons to reflect new billing paths without `/settings` segment.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the 06-28-dashboard_use_sidebar_layout_in_team_layout branch from 29a59f2 to 0ea44cc Compare June 28, 2025 01:11
<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR primarily focuses on refactoring and updating the billing and settings-related components in the dashboard application, changing URLs from `/settings` to `/billing`, and enhancing the user interface for better clarity and usability.

### Detailed summary
- Deleted several unused files related to settings and credits.
- Updated links in various components to redirect from `/settings` to `/billing`.
- Refactored `useActiveSidebarLink` to streamline sidebar link management.
- Enhanced UI elements for better responsiveness and aesthetics.
- Introduced a new `StaffModeNotice` component for staff mode indications.
- Adjusted layout components for consistent styling.
- Reorganized billing-related components into a unified structure.
- Improved pagination button styles for better visibility.

> The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Introduced a full-width sidebar layout with collapsible submenus and responsive navigation.
  * Added a team sidebar layout with structured navigation for team dashboards.
  * Added collapsible UI components for use in layouts and menus.
  * Added a reusable StaffModeNotice component for staff mode indication.

* **Bug Fixes**
  * Improved container sizing and maximum width constraints for better layout consistency across analytics, audit log, and ecosystem pages.

* **Refactor**
  * Simplified and reorganized sidebar layouts, removing complex internal logic and mobile navigation from several components.
  * Updated navigation structures to use new sidebar and tab-based layouts.
  * Streamlined and restyled headers, banners, and button components for a more cohesive look.
  * Replaced inline staff mode banners with the StaffModeNotice component.
  * Removed sidebar navigation from usage and settings layouts for a cleaner interface.
  * Removed gas credits settings and related components from the settings area.
  * Refactored ecosystem pages to redirect directly to creation, removing landing page.
  * Updated billing-related URL paths by removing deprecated `/settings` segments for consistency.
  * Removed account plan constants and unused hooks for cleaner codebase.
  * Cleaned up imports and replaced some relative imports with absolute paths.

* **Style**
  * Enhanced visual styling and responsiveness for range selectors, sidebars, and headers.
  * Adjusted text sizes and spacing in mobile navigation and file sections for improved readability.
  * Added rounded corners and adjusted spacing in date and interval selectors.
  * Added responsive minimum widths and consistent borders to pagination buttons and links.

* **Chores**
  * Added a new dependency for collapsible UI support.
  * Updated import paths and added lint suppression comments for code clarity and maintainability.
  * Added responsive minimum widths to pagination buttons and consistent border styling to pagination links.
  * Updated multiple URLs in links and buttons to reflect new billing paths without `/settings` segment.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Dashboard Involves changes to the Dashboard.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants