Skip to content

Conversation

@MananTank
Copy link
Member

@MananTank MananTank commented Aug 6, 2025


PR-Codex overview

This PR focuses on enhancing analytics components by introducing responsive time filters, improving data handling, and refactoring various chart components for better performance and usability.

Detailed summary

  • Removed range-selector.tsx and updated date handling in date-range-selector.tsx.
  • Added ResponsiveTimeFilters component for responsive date range selection.
  • Refactored several chart components to use async functions for data fetching.
  • Updated props in TransactionsChartCard, TotalSponsoredChartCard, and others to include new parameters.
  • Introduced AsyncEcosystemWalletUsersAnalytics for better data management.
  • Enhanced loading states with ResponsiveSuspense for improved user experience.
  • Updated AppHighlightsCard to ProjectHighlightsCard for better context in analytics.

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

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

Summary by CodeRabbit

  • New Features

    • Introduced responsive and modular time filter controls for analytics dashboards.
    • Added new highlights cards for team and project analytics, providing aggregated metrics in a combined bar chart format.
    • Added a new combined bar chart card for gas sponsorship data with dynamic chart selection.
    • Added components that map transaction and sponsorship data with chain metadata for improved analytics detail.
  • Refactor

    • Replaced multiple analytics and chart components with streamlined, asynchronous, and responsive variants.
    • Standardized date range and interval filtering using a centralized utility and responsive providers.
    • Updated chart selection to use in-app state and callbacks instead of URL-based navigation.
    • Simplified analytics page layouts by replacing Suspense with responsive suspense components.
    • Externalized data processing and state management from several chart card components to improve modularity.
    • Removed deprecated components and replaced them with updated responsive and async implementations.
  • Bug Fixes

    • Improved handling of date ranges and intervals, ensuring accurate and consistent filtering.
  • Chores

    • Removed unused or redundant components and consolidated stories for better maintainability.
    • Cleaned up imports and type definitions across analytics and project overview pages.
  • Style

    • Enhanced button and layout styling for chart selection and analytics cards.
  • Documentation

    • Updated interactive stories for analytics components to improve clarity and usability.

@changeset-bot
Copy link

changeset-bot bot commented Aug 6, 2025

⚠️ No Changeset found

Latest commit: bab4ff5

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 6, 2025

Walkthrough

This update refactors analytics dashboard components to improve responsiveness, modularity, and search parameter handling. It removes legacy range selectors and suspense wrappers, introduces responsive search parameter providers and time filter components, and updates chart cards to use explicit props for selected charts. Control flow is modularized with async components and responsive suspense, and several components are renamed or replaced for clarity and maintainability.

Changes

Cohort / File(s) Change Summary
Date Range Calculation Adjustment
apps/dashboard/src/@/components/analytics/date-range-selector.tsx
Adjusted date calculation logic in getLastNDaysRange to use the current date directly, removing previous timezone adjustment. Minor whitespace change.
Removed and Replaced Range Selector
apps/dashboard/src/@/components/analytics/range-selector.tsx
apps/dashboard/src/@/components/analytics/responsive-time-filters.tsx
Deleted the old RangeSelector component. Introduced ResponsiveTimeFilters, a new component for managing and updating time filters via search parameters.
Chart Card Refactors (Team Analytics)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
Updated chart card components to accept explicit selectedChart and selectedChartQueryParam props, removing reliance on searchParams. Refactored chart config and selection logic.
Team Analytics Highlights Refactor
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/highlights-card.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
Added new TeamHighlightsCard and helper function. Refactored analytics page to use responsive suspense, modular async components, and explicit chart selection props. Removed legacy highlight card and aggregation logic.
Ecosystem Analytics Modularization
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
Modularized analytics page with responsive suspense, split data fetching into async components, and updated summary to accept pending state. Replaced manual range parsing with centralized filter extraction.
Project Sidebar Analytics Refactor
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/index.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
Replaced Suspense wrappers with responsive suspense and async components. Updated chart cards and highlights to use explicit chart selection props. Removed legacy highlight card and aggregation logic. Updated type definitions for page props and search params.
Wallet Analytics Refactor
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)/wallets/page.tsx
Renamed and simplified wallet analytics UI, replaced suspense with responsive suspense, and introduced responsive time filters. Centralized filter logic using a helper function.
Team Analytics Header Removal
apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
Deleted the AnalyticsHeader component, which previously rendered the title and optional range selector.
Combined Bar Chart Card Refactor
apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.stories.tsx
apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.tsx
Refactored story to a single interactive example. Updated chart card to use explicit onSelect callback for chart selection, removing navigation via query parameters.
New and Updated Chart Card Components with Chain Metadata
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/transaction-card-with-chain-mapping.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/total-sponsored.tsx
Added TransactionsChartCardWithChainMapping async component to fetch and map chain metadata, process aggregated data, and render UI. Introduced new TotalSponsoredCardUI client component with chart config and responsive search param handling.
Project Sidebar Highlights Card Addition
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx
Added new ProjectHighlightsCard component with time series data processing, chart config, aggregation, trend calculation, and responsive search param updates.
Page-Level Refactors for Team and Project Analytics
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
Refactored pages to use ResponsiveSearchParamsProvider and ResponsiveSuspense with explicit chart selection props. Removed legacy aggregation and highlight components. Updated type definitions and simplified header props.
Refactor of Ecosystem Analytics Page and Components
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
Wrapped EcosystemAnalyticsPage in ResponsiveSearchParamsProvider. Replaced manual range and interval parsing with centralized utility. Passed default range prop.
Ecosystem Analytics Components Modularization
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
Split data fetching into AsyncEcosystemWalletsSummary and AsyncEcosystemWalletUsersAnalytics async components with suspense fallbacks. Replaced old combined fetching and rendering logic. Added EcosystemWalletUsersAnalyticsUI for rendering charts.
Ecosystem Wallets Summary Update
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx
Extended EcosystemWalletsSummary props to accept isPending boolean and pass it to child StatCard components for pending state display.
Wallet Analytics UI Simplification and Suspense Update
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx
Renamed InAppWalletAnalyticsInner to InAppWalletAnalyticsUI. Removed RangeSelector and layout wrappers. Replaced React Suspense with ResponsiveSuspense using searchParamsUsed prop. Updated async data fetching to return UI component.
Wallet Analytics Page Refactor
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/page.tsx
Replaced manual range and interval parsing with getFiltersFromSearchParams. Wrapped component tree in ResponsiveSearchParamsProvider. Added ResponsiveTimeFilters component. Passed normalized range prop.
Removed Suspense Wrappers in Sidebar Chart Components
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.tsx
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/index.tsx
Removed wrapper components using React Suspense and fallback loading states. Exported async functions directly that fetch data and render UI components. Updated function signatures to use explicit chart selection props instead of searchParams.
Transactions Charts UI Signature Update
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx
Changed TransactionsChartsUI to accept a single props object instead of destructured parameters. Replaced searchParams prop with selectedChart and selectedChartQueryParam. Replaced internal references accordingly.
Removed AnalyticsHeader Component
apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
Deleted the AnalyticsHeader component, which previously rendered the title and optional range selector.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ResponsiveTimeFilters
    participant SearchParamsProvider
    participant ChartCard

    User->>ResponsiveTimeFilters: Selects date range or interval
    ResponsiveTimeFilters->>SearchParamsProvider: Updates search params context
    SearchParamsProvider->>ChartCard: Passes updated range/interval props
    ChartCard->>User: Renders chart with selected filters
    User->>ChartCard: Selects chart type
    ChartCard->>SearchParamsProvider: Calls onSelect, updates selected chart param
    SearchParamsProvider->>ChartCard: Passes new selected chart prop
    ChartCard->>User: Renders updated chart
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (1)
  • TEAM-0000: Entity not found: Issue - Could not find referenced Issue.
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 08-06-dashboard_improved_chart_responsiveness_code_cleanup

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • 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.
  • 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.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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 for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for 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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@MananTank MananTank marked this pull request as ready for review August 6, 2025 14:53
@MananTank MananTank requested review from a team as code owners August 6, 2025 14:53
@github-actions github-actions bot added the Dashboard Involves changes to the Dashboard. label Aug 6, 2025
Copy link
Member Author

MananTank commented Aug 6, 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.

@vercel vercel bot temporarily deployed to Preview – wallet-ui August 6, 2025 14:53 Inactive
@vercel
Copy link

vercel bot commented Aug 6, 2025

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

Name Status Preview Comments Updated (UTC)
thirdweb-www ✅ Ready (Inspect) Visit Preview 💬 Add feedback Aug 7, 2025 1:34am
4 Skipped Deployments
Name Status Preview Comments Updated (UTC)
docs-v2 ⬜️ Skipped (Inspect) Aug 7, 2025 1:34am
nebula ⬜️ Skipped (Inspect) Aug 7, 2025 1:34am
thirdweb_playground ⬜️ Skipped (Inspect) Aug 7, 2025 1:34am
wallet-ui ⬜️ Skipped (Inspect) Aug 7, 2025 1:34am

@vercel vercel bot temporarily deployed to Preview – docs-v2 August 6, 2025 14:53 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 6, 2025 14:53 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 6, 2025 14:53 Inactive
@codecov
Copy link

codecov bot commented Aug 6, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 56.34%. Comparing base (621c1de) to head (bab4ff5).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7801   +/-   ##
=======================================
  Coverage   56.34%   56.34%           
=======================================
  Files         905      905           
  Lines       58806    58806           
  Branches     4144     4144           
=======================================
  Hits        33135    33135           
  Misses      25567    25567           
  Partials      104      104           
Flag Coverage Δ
packages 56.34% <ø> (ø)
🚀 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.

@github-actions
Copy link
Contributor

github-actions bot commented Aug 6, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 63.11 KB (-0.08% 🔽) 1.3 s (-0.08% 🔽) 304 ms (+139.68% 🔺) 1.6 s
thirdweb (cjs) 352.95 KB (0%) 7.1 s (0%) 941 ms (+3.2% 🔺) 8 s
thirdweb (minimal + tree-shaking) 5.7 KB (0%) 114 ms (0%) 81 ms (+799.33% 🔺) 195 ms
thirdweb/chains (tree-shaking) 526 B (0%) 11 ms (0%) 41 ms (+1500.4% 🔺) 52 ms
thirdweb/react (minimal + tree-shaking) 19.26 KB (0%) 386 ms (0%) 77 ms (+348.18% 🔺) 462 ms

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: 5

🔭 Outside diff range comments (2)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (2)

275-280: Update AsyncTotalSponsoredCard to use new props pattern

The AsyncTotalSponsoredCard is still passing searchParams to TotalSponsoredCard, but based on the PR's pattern and other similar components, it should pass selectedChart and selectedChartQueryParam props instead.

The component should be updated to match the pattern used in the team analytics page where AsyncTotalSponsoredCard passes explicit selectedChart and selectedChartQueryParam props. This would require importing and using TotalSponsoredChartCardUI from the shared components instead of the local TotalSponsoredCard.


436-531: Refactor TotalSponsoredCard to reuse shared TotalSponsoredChartCardUI

The in-page TotalSponsoredCard is effectively re-implementing the logic already encapsulated by TotalSponsoredChartCardUI. Please remove the local component and switch to the shared UI primitive:

• File to update
– apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx

• Replace the internal async function TotalSponsoredCard(…) { … } entirely with:

import { TotalSponsoredChartCardUI } from "../(team)/_components/TotalSponsoredCard";

export default function PageWrapper({ data, aggregatedData, searchParams }) {
  return (
    <TotalSponsoredChartCardUI
      data={data}
      aggregatedData={aggregatedData}
      selectedChart={searchParams?.totalSponsored as string | undefined}
      selectedChartQueryParam="totalSponsored"
      title="Gas Sponsored"
      description={/* optional */}
      onlyMainnet={/* if you only want mainnet view */}
    />
  );
}

• Key changes

  1. Remove all date-processing/chart logic from this file.
  2. Delegate state and URL param handling to useSetResponsiveSearchParams inside the shared component.
  3. Pass through data, aggregatedData, selectedChart, selectedChartQueryParam, plus any UI props you need.

This aligns with the PR’s goal of consolidating chart cards and standardizing URL-driven responsiveness.

🧹 Nitpick comments (2)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx (1)

147-147: Remove redundant fallback to empty array

The || [] fallback is unnecessary since props.ecosystemWalletStats is already an array (either populated or empty) based on the prop definition.

-      ecosystemWalletStats={props.ecosystemWalletStats || []}
+      ecosystemWalletStats={props.ecosystemWalletStats}

Also applies to: 153-153

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

85-90: Use the defaultRange variable instead of hardcoding

The defaultRange variable is defined but not used in the getFiltersFromSearchParams call.

 const defaultRange: DurationId = "last-30";
 const { range, interval } = getFiltersFromSearchParams({
-  defaultRange: "last-30",
+  defaultRange,
   from: searchParams.from,
   interval: searchParams.interval,
   to: searchParams.to,
 });

@MananTank MananTank force-pushed the 08-06-dashboard_improved_chart_responsiveness_code_cleanup branch from 3083496 to ba0e1b8 Compare August 6, 2025 15:07
@vercel vercel bot temporarily deployed to Preview – nebula August 6, 2025 15:07 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 6, 2025 15:07 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 6, 2025 15:07 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 6, 2025 15:07 Inactive
@MananTank MananTank marked this pull request as draft August 6, 2025 15:12
@MananTank MananTank force-pushed the 08-06-dashboard_improved_chart_responsiveness_code_cleanup branch from ba0e1b8 to 8c4888f Compare August 6, 2025 15:19
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 6, 2025 15:19 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 6, 2025 15:19 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 6, 2025 15:19 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 6, 2025 15:19 Inactive
@graphite-app
Copy link
Contributor

graphite-app bot commented Aug 7, 2025

Merge activity

graphite-app bot pushed a commit that referenced this pull request Aug 7, 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 enhancing the analytics components by improving the handling of date ranges, adding responsive search parameters, and refactoring several components for better performance and usability.

### Detailed summary
- Removed `range-selector.tsx` and refactored date handling.
- Updated `todayDate` calculation for timezone issues.
- Added `isPending` state to `EcosystemWalletsSummary` and other components.
- Converted several components to async functions.
- Introduced `ResponsiveTimeFilters` for better date range selection.
- Enhanced `TransactionsChartCard` and `TotalSponsoredChartCard` with chain mapping.
- Improved loading states using `ResponsiveSuspense`.
- Refactored `AppHighlightsCard` into `ProjectHighlightsCard` for better usability.

> The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/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 responsive and modular time filter controls for analytics dashboards.
  * Added new highlights cards for team and project analytics, providing aggregated metrics in a combined bar chart format.
  * Added a new combined bar chart card for gas sponsorship data with dynamic chart selection.
  * Added components that map transaction and sponsorship data with chain metadata for improved analytics detail.

* **Refactor**
  * Replaced multiple analytics and chart components with streamlined, asynchronous, and responsive variants.
  * Standardized date range and interval filtering using a centralized utility and responsive providers.
  * Updated chart selection to use in-app state and callbacks instead of URL-based navigation.
  * Simplified analytics page layouts by replacing Suspense with responsive suspense components.
  * Externalized data processing and state management from several chart card components to improve modularity.
  * Removed deprecated components and replaced them with updated responsive and async implementations.

* **Bug Fixes**
  * Improved handling of date ranges and intervals, ensuring accurate and consistent filtering.

* **Chores**
  * Removed unused or redundant components and consolidated stories for better maintainability.
  * Cleaned up imports and type definitions across analytics and project overview pages.

* **Style**
  * Enhanced button and layout styling for chart selection and analytics cards.

* **Documentation**
  * Updated interactive stories for analytics components to improve clarity and usability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the 08-06-dashboard_improved_chart_responsiveness_code_cleanup branch from 5e15af1 to 5bff16b Compare August 7, 2025 01:18
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 7, 2025 01:18 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 7, 2025 01:18 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 7, 2025 01:18 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 7, 2025 01:18 Inactive
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)/_components/TransactionsCard.tsx (1)

50-124: Clean interaction pattern with responsive search params.

The switch to callback-based chart selection with setResponsiveSearchParams is cleaner than URL manipulation. The time series data processing could potentially be moved to the wrapper component for complete separation of concerns, but the current approach is acceptable for this lightweight processing.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5e15af1 and 5bff16b.

📒 Files selected for processing (23)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/analytics/range-selector.tsx (0 hunks)
  • apps/dashboard/src/@/components/analytics/responsive-time-filters.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/transaction-card-with-chain-mapping.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/highlights-card.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (9 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/index.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/total-sponsored.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (12 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx (4 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.stories.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.tsx (4 hunks)
💤 Files with no reviewable changes (2)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
  • apps/dashboard/src/@/components/analytics/range-selector.tsx
🚧 Files skipped from review as they are similar to previous changes (19)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/total-sponsored.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.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)/components/Transactions/index.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx
  • apps/dashboard/src/@/components/analytics/responsive-time-filters.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.stories.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/transaction-card-with-chain-mapping.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/highlights-card.tsx
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
🧠 Learnings (26)
📓 Common learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Surface breaking changes prominently in PR descriptions
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Use React Query (`tanstack/react-query`) for all client data fetching.
Learnt from: arcoraven
PR: thirdweb-dev/js#7505
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx:186-204
Timestamp: 2025-07-10T10:18:33.238Z
Learning: The ThirdwebBarChart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx does not accept standard accessibility props like `aria-label` and `role` in its TypeScript interface, causing compilation errors when added.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Heavy data fetching that should not ship to the client (e.g. analytics, billing).
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Components that listen to user events, animations or live updates.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Keep components pure; fetch data outside (server component or hook) and pass it down via props.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Prefer composable primitives over custom markup: `Button`, `Input`, `Select`, `Tabs`, `Card`, `Sidebar`, `Separator`, `Badge`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Reuse core UI primitives; avoid re-implementing buttons, cards, modals.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : For notices & skeletons rely on `AnnouncementBanner`, `GenericLoadingPage`, `EmptyStateCard`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Local state or effects live inside; data fetching happens in hooks.
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.
📚 Learning: applies to dashboard/**/*client.tsx : interactive ui that relies on hooks (`usestate`, `useeffect`, ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: the thirdwebbarchart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(side...
Learnt from: arcoraven
PR: thirdweb-dev/js#7505
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx:186-204
Timestamp: 2025-07-10T10:18:33.238Z
Learning: The ThirdwebBarChart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx does not accept standard accessibility props like `aria-label` and `role` in its TypeScript interface, causing compilation errors when added.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : export default async functions without `'use client';` – they r...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Export default async functions without `'use client';` – they run on the Node edge.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : pages requiring fast transitions where data is prefetched on t...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : components that listen to user events, animations or live upda...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Components that listen to user events, animations or live updates.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : heavy data fetching that should not ship to the client (e.g. an...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Heavy data fetching that should not ship to the client (e.g. analytics, billing).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/components/*.client.tsx : client components must start with `'use client';` ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/components/*.client.tsx : Client components must start with `'use client';` before imports.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : keep components pure; fetch data outside (server component or ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Keep components pure; fetch data outside (server component or hook) and pass it down via props.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: in the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractad...
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.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : anything that consumes hooks from `@tanstack/react-query` or t...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Anything that consumes hooks from `tanstack/react-query` or thirdweb SDKs.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: the `fetchdashboardcontractmetadata` function from "@3rdweb-sdk/react/hooks/usedashboardcontractmeta...
Learnt from: MananTank
PR: thirdweb-dev/js#7177
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx:15-17
Timestamp: 2025-05-27T19:54:55.885Z
Learning: The `fetchDashboardContractMetadata` function from "3rdweb-sdk/react/hooks/useDashboardContractMetadata" has internal error handlers for all promises and cannot throw errors, so external error handling is not needed when calling this function.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: the thirdweb project has an eslint rule that restricts direct usage of `definechain`. when it's nece...
Learnt from: MananTank
PR: thirdweb-dev/js#7298
File: apps/dashboard/src/app/nebula-app/move-funds/move-funds.tsx:424-424
Timestamp: 2025-06-06T23:46:08.795Z
Learning: The thirdweb project has an ESLint rule that restricts direct usage of `defineChain`. When it's necessary to use `defineChain` directly, it's acceptable to disable the rule with `// eslint-disable-next-line no-restricted-syntax`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
📚 Learning: applies to dashboard/**/*client.tsx : use react query (`@tanstack/react-query`) for all client data ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Use React Query (`tanstack/react-query`) for all client data fetching.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
📚 Learning: applies to dashboard/**/*client.tsx : keep `querykey` stable and descriptive for cache hits....
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Keep `queryKey` stable and descriptive for cache hits.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
📚 Learning: in next.js server components, the `params` object can sometimes be a promise that needs to be awaite...
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.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : for notices & skeletons rely on `announcementbanner`, `generic...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : For notices & skeletons rely on `AnnouncementBanner`, `GenericLoadingPage`, `EmptyStateCard`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to src/@/analytics/report.ts : review `src/@/analytics/report.ts` before adding analytics ev...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to src/@/analytics/report.ts : Review `src/@/analytics/report.ts` before adding analytics events to check for duplicates

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/layout.tsx : building layout shells (`layout.tsx`) and top-level pages that ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/layout.tsx : Building layout shells (`layout.tsx`) and top-level pages that mainly assemble data.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : wrap client-side data fetching calls in r...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Wrap client-side data fetching calls in React Query (`tanstack/react-query`)

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : redirect logic using `redirect()` from `next/navigation`....
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Redirect logic using `redirect()` from `next/navigation`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : local state or effects live inside; data fetching happens in h...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Local state or effects live inside; data fetching happens in hooks.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : reuse core ui primitives; avoid re-implementing buttons, cards...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Reuse core UI primitives; avoid re-implementing buttons, cards, modals.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : import ui primitives from `@/components/u...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Import UI primitives from `@/components/ui/*` (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : when you need access to browser apis (localstorage, window, in...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : When you need access to browser APIs (localStorage, window, IntersectionObserver etc.).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : accept a typed `props` object and export a named function (`ex...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Accept a typed `props` object and export a named function (`export function MyComponent()`).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
🧬 Code Graph Analysis (1)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx (1)
apps/dashboard/src/@/types/analytics.ts (1)
  • TransactionStats (35-40)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Size
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Build Packages
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (9)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx (3)

1-9: LGTM! Client component conversion is appropriate.

The addition of "use client" and responsive search params hook aligns with the refactor to make chart components interactive while maintaining server-side data fetching in wrapper components.


10-24: Good refactor moving chartConfig to module scope.

Moving the configuration object outside the component prevents unnecessary recreations on re-renders and improves performance.


25-49: Excellent separation of concerns with explicit props.

The refactor from async function with searchParams to sync component with explicit props improves maintainability and testability. The externalization of data processing to wrapper components follows React best practices.

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

1-45: LGTM! Import changes support the responsive architecture.

The addition of responsive components and utilities aligns with the dashboard refactor goals. The SearchParams type properly defines all query parameters used by the analytics components.


47-69: Good centralization of filter processing.

Using getFiltersFromSearchParams with a consistent default range improves maintainability across analytics pages. The Promise.all pattern for awaiting params is efficient.


70-86: Clean layout refactor with responsive provider.

The ResponsiveSearchParamsProvider wrapper and simplified header structure improve maintainability. The ResponsiveTimeFilters component centralizes time filtering UI consistently.


87-167: Excellent use of ResponsiveSuspense for performance optimization.

The granular searchParamsUsed arrays enable selective re-rendering when only relevant parameters change, improving performance. The explicit prop pattern for chart selection is more maintainable than passing raw search parameters.


170-296: Well-structured async components with proper error handling.

The async components properly use Promise.allSettled for error handling and consistently return EmptyStateCard when no data is available. The explicit prop pattern for chart selection is maintained across all components.


379-423: Good async wrapper implementation following established patterns.

The component properly fetches chain metadata and processes aggregated data. The eslint-disable-next-line no-restricted-syntax for defineChain usage is acceptable here as this is a legitimate use case for chain metadata fetching.

<!--

## 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 enhancing analytics components by introducing responsive time filters, updating chart components to support new props, and refactoring existing code for improved clarity and functionality.

### Detailed summary
- Removed `range-selector.tsx` and refactored `AnalyticsHeader.tsx`.
- Added `ResponsiveTimeFilters` for better time range handling.
- Updated `EcosystemWalletsSummary` and `EcosystemAnalyticsPage` to use new props.
- Refactored various chart components to accept `selectedChart` and `selectedChartQueryParam`.
- Enhanced `AsyncTransactionsChartCard` and `AsyncTotalSponsoredCard` for better data handling.
- Replaced `LoadingChartState` with responsive loading states across components.
- Consolidated logic for handling time series data in analytics cards.
- Improved type definitions for better clarity and consistency.

> The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/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 responsive and modular time filter controls for analytics dashboards.
  * Added new highlights cards for team and project analytics, providing aggregated metrics in a combined bar chart format.
  * Added a new combined bar chart card for gas sponsorship data with dynamic chart selection.
  * Added components that map transaction and sponsorship data with chain metadata for improved analytics detail.

* **Refactor**
  * Replaced multiple analytics and chart components with streamlined, asynchronous, and responsive variants.
  * Standardized date range and interval filtering using a centralized utility and responsive providers.
  * Updated chart selection to use in-app state and callbacks instead of URL-based navigation.
  * Simplified analytics page layouts by replacing Suspense with responsive suspense components.
  * Externalized data processing and state management from several chart card components to improve modularity.
  * Removed deprecated components and replaced them with updated responsive and async implementations.

* **Bug Fixes**
  * Improved handling of date ranges and intervals, ensuring accurate and consistent filtering.

* **Chores**
  * Removed unused or redundant components and consolidated stories for better maintainability.
  * Cleaned up imports and type definitions across analytics and project overview pages.

* **Style**
  * Enhanced button and layout styling for chart selection and analytics cards.

* **Documentation**
  * Updated interactive stories for analytics components to improve clarity and usability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the 08-06-dashboard_improved_chart_responsiveness_code_cleanup branch from 5bff16b to bab4ff5 Compare August 7, 2025 01:24
@vercel vercel bot temporarily deployed to Preview – nebula August 7, 2025 01:24 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 7, 2025 01:24 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 7, 2025 01:24 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 7, 2025 01:24 Inactive
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: 1

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

397-412: Data aggregation logic is correct but could be more readable.

The mainnet/testnet classification and aggregation logic is functionally correct, but the nested filter operations could benefit from better readability.

Consider extracting the classification logic for better readability:

+  const isMainnet = (chainId: string) => 
+    !chains.find((c) => c.chainId === Number(chainId))?.testnet;
+
   const processedAggregatedData = {
-    mainnet: props.aggregatedData
-      .filter(
-        (d) => !chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
-      )
-      .reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
-    testnet: props.aggregatedData
-      .filter(
-        (d) => chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
-      )
-      .reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
+    mainnet: props.aggregatedData
+      .filter((d) => d.chainId && isMainnet(d.chainId))
+      .reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
+    testnet: props.aggregatedData
+      .filter((d) => d.chainId && !isMainnet(d.chainId))
+      .reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5bff16b and bab4ff5.

📒 Files selected for processing (23)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/analytics/range-selector.tsx (0 hunks)
  • apps/dashboard/src/@/components/analytics/responsive-time-filters.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/transaction-card-with-chain-mapping.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/highlights-card.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (9 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/index.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/total-sponsored.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx (12 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/analytics/chart/index.tsx (4 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx (0 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.stories.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.tsx (4 hunks)
💤 Files with no reviewable changes (2)
  • apps/dashboard/src/app/(app)/team/components/Analytics/AnalyticsHeader.tsx
  • apps/dashboard/src/@/components/analytics/range-selector.tsx
🚧 Files skipped from review as they are similar to previous changes (20)
  • apps/dashboard/src/@/components/analytics/date-range-selector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/Summary.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/index.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/highlights-card.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/transaction-card-with-chain-mapping.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/highlights-card.tsx
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.stories.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/overview/total-sponsored.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.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]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx
  • apps/dashboard/src/@/components/analytics/responsive-time-filters.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/EngineCloudChartCard/index.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/RpcMethodBarChartCard/index.tsx
  • apps/dashboard/src/app/(app)/team/components/Analytics/CombinedBarChartCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/Transactions/TransactionCharts.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
🧠 Learnings (23)
📓 Common learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Surface breaking changes prominently in PR descriptions
Learnt from: arcoraven
PR: thirdweb-dev/js#7505
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx:186-204
Timestamp: 2025-07-10T10:18:33.238Z
Learning: The ThirdwebBarChart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx does not accept standard accessibility props like `aria-label` and `role` in its TypeScript interface, causing compilation errors when added.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Use React Query (`tanstack/react-query`) for all client data fetching.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Heavy data fetching that should not ship to the client (e.g. analytics, billing).
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Components that listen to user events, animations or live updates.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Keep components pure; fetch data outside (server component or hook) and pass it down via props.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Prefer composable primitives over custom markup: `Button`, `Input`, `Select`, `Tabs`, `Card`, `Sidebar`, `Separator`, `Badge`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Reuse core UI primitives; avoid re-implementing buttons, cards, modals.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : For notices & skeletons rely on `AnnouncementBanner`, `GenericLoadingPage`, `EmptyStateCard`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Local state or effects live inside; data fetching happens in hooks.
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.
📚 Learning: applies to dashboard/**/*client.tsx : pages requiring fast transitions where data is prefetched on t...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: in next.js server components, the `params` object can sometimes be a promise that needs to be awaite...
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.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : heavy data fetching that should not ship to the client (e.g. an...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Heavy data fetching that should not ship to the client (e.g. analytics, billing).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : interactive ui that relies on hooks (`usestate`, `useeffect`, ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : for notices & skeletons rely on `announcementbanner`, `generic...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : For notices & skeletons rely on `AnnouncementBanner`, `GenericLoadingPage`, `EmptyStateCard`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to src/@/analytics/report.ts : review `src/@/analytics/report.ts` before adding analytics ev...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to src/@/analytics/report.ts : Review `src/@/analytics/report.ts` before adding analytics events to check for duplicates

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: the thirdwebbarchart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(side...
Learnt from: arcoraven
PR: thirdweb-dev/js#7505
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx:186-204
Timestamp: 2025-07-10T10:18:33.238Z
Learning: The ThirdwebBarChart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx does not accept standard accessibility props like `aria-label` and `role` in its TypeScript interface, causing compilation errors when added.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : components that listen to user events, animations or live upda...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Components that listen to user events, animations or live updates.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : wrap client-side data fetching calls in r...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Wrap client-side data fetching calls in React Query (`tanstack/react-query`)

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/layout.tsx : building layout shells (`layout.tsx`) and top-level pages that ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/layout.tsx : Building layout shells (`layout.tsx`) and top-level pages that mainly assemble data.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : anything that consumes hooks from `@tanstack/react-query` or t...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Anything that consumes hooks from `tanstack/react-query` or thirdweb SDKs.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : redirect logic using `redirect()` from `next/navigation`....
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Redirect logic using `redirect()` from `next/navigation`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : local state or effects live inside; data fetching happens in h...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Local state or effects live inside; data fetching happens in hooks.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : reuse core ui primitives; avoid re-implementing buttons, cards...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Reuse core UI primitives; avoid re-implementing buttons, cards, modals.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : import ui primitives from `@/components/u...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Import UI primitives from `@/components/ui/*` (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*client.tsx : when you need access to browser apis (localstorage, window, in...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : When you need access to browser APIs (localStorage, window, IntersectionObserver etc.).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : keep components pure; fetch data outside (server component or ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Keep components pure; fetch data outside (server component or hook) and pass it down via props.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: in the accounts component at apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractad...
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.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : prefer composable primitives over custom markup: `button`, `in...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Prefer composable primitives over custom markup: `Button`, `Input`, `Select`, `Tabs`, `Card`, `Sidebar`, `Separator`, `Badge`.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : accept a typed `props` object and export a named function (`ex...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Accept a typed `props` object and export a named function (`export function MyComponent()`).

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: applies to dashboard/**/*.{ts,tsx} : export default async functions without `'use client';` – they r...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{ts,tsx} : Export default async functions without `'use client';` – they run on the Node edge.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
📚 Learning: the `fetchdashboardcontractmetadata` function from "@3rdweb-sdk/react/hooks/usedashboardcontractmeta...
Learnt from: MananTank
PR: thirdweb-dev/js#7177
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx:15-17
Timestamp: 2025-05-27T19:54:55.885Z
Learning: The `fetchDashboardContractMetadata` function from "3rdweb-sdk/react/hooks/useDashboardContractMetadata" has internal error handlers for all promises and cannot throw errors, so external error handling is not needed when calling this function.

Applied to files:

  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Size
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Build Packages
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (7)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (7)

1-25: LGTM! Clean refactoring to responsive components.

The import changes properly introduce the responsive search parameters provider and suspense components, along with the new responsive time filters. The addition of chain metadata utilities aligns with the enhanced chain processing functionality.


62-68: LGTM! Centralized filter parsing improves maintainability.

The use of getFiltersFromSearchParams with a default range centralizes date range parsing logic, which is a good practice for consistency across analytics pages.


71-85: Excellent responsive provider pattern implementation.

The page structure properly wraps content in ResponsiveSearchParamsProvider and replaces the previous analytics header with a clean static title and responsive time filters. This follows the established pattern from the broader refactoring effort.


89-104: Well-structured responsive suspense with proper dependencies.

The ResponsiveSuspense correctly specifies search parameters it depends on, and the AsyncTeamHighlightsCard properly receives explicit chart selection props instead of raw search parameters. This improves modularity and makes dependencies explicit.


170-214: Component rename and prop structure improvements look good.

The component rename from AsyncAppHighlightsCard to AsyncTeamHighlightsCard better reflects its purpose, and the new prop structure with explicit selectedChart and selectedChartQueryParam is cleaner than passing raw search parameters.


36-45: Search parameter names verified as consistent across analytics components.

All three new keys—appHighlights, client_transactions, and userOpUsage—are defined in SearchParams and used identically in every analytics page (selectedChartQueryParam, searchParamsUsed, and type checks). No mismatches found; no further changes needed.


258-296: ✅ TransactionsChartCardWithChainMapping component verified

  • The component exists and its props (data, aggregatedData, selectedChart, selectedChartQueryParam, etc.) align with how it’s invoked in AsyncTransactionsChartCard.
  • It correctly fetches and filters chain metadata (with error handling), computes processedAggregatedData, and passes all required data to TransactionsChartCardUI.

No further changes needed.

Comment on lines +379 to +423
async function AsyncTotalSponsoredChartCard(props: {
data: UserOpStats[];
aggregatedData: UserOpStats[];
selectedChart: string | undefined;
className?: string;
onlyMainnet?: boolean;
title?: string;
selectedChartQueryParam: string;
description?: string;
}) {
const chains = await Promise.all(
props.data.map(
(item) =>
// eslint-disable-next-line no-restricted-syntax
item.chainId && getChainMetadata(defineChain(Number(item.chainId))),
),
).then((chains) => chains.filter((c) => c) as ChainMetadata[]);

const processedAggregatedData = {
mainnet: props.aggregatedData
.filter(
(d) => !chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
testnet: props.aggregatedData
.filter(
(d) => chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
total: props.aggregatedData.reduce(
(acc, curr) => acc + curr.sponsoredUsd,
0,
),
};

return (
<TotalSponsoredChartCardUI
chains={chains}
processedAggregatedData={processedAggregatedData}
selectedChart={props.selectedChart}
selectedChartQueryParam={props.selectedChartQueryParam}
data={props.data}
/>
);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Chain metadata processing logic needs optimization.

The new AsyncTotalSponsoredChartCard function has a performance concern: it calls getChainMetadata for every data item, which could result in redundant API calls for the same chain IDs.

Consider optimizing the chain metadata fetching:

-  const chains = await Promise.all(
-    props.data.map(
-      (item) =>
-        // eslint-disable-next-line no-restricted-syntax
-        item.chainId && getChainMetadata(defineChain(Number(item.chainId))),
-    ),
-  ).then((chains) => chains.filter((c) => c) as ChainMetadata[]);
+  // Get unique chain IDs to avoid duplicate API calls
+  const uniqueChainIds = [...new Set(props.data.map(item => item.chainId).filter(Boolean))];
+  const chains = await Promise.all(
+    uniqueChainIds.map(
+      (chainId) =>
+        getChainMetadata(defineChain(Number(chainId))),
+    ),
+  ).then((chains) => chains.filter((c) => c) as ChainMetadata[]);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function AsyncTotalSponsoredChartCard(props: {
data: UserOpStats[];
aggregatedData: UserOpStats[];
selectedChart: string | undefined;
className?: string;
onlyMainnet?: boolean;
title?: string;
selectedChartQueryParam: string;
description?: string;
}) {
const chains = await Promise.all(
props.data.map(
(item) =>
// eslint-disable-next-line no-restricted-syntax
item.chainId && getChainMetadata(defineChain(Number(item.chainId))),
),
).then((chains) => chains.filter((c) => c) as ChainMetadata[]);
const processedAggregatedData = {
mainnet: props.aggregatedData
.filter(
(d) => !chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
testnet: props.aggregatedData
.filter(
(d) => chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
total: props.aggregatedData.reduce(
(acc, curr) => acc + curr.sponsoredUsd,
0,
),
};
return (
<TotalSponsoredChartCardUI
chains={chains}
processedAggregatedData={processedAggregatedData}
selectedChart={props.selectedChart}
selectedChartQueryParam={props.selectedChartQueryParam}
data={props.data}
/>
);
}
async function AsyncTotalSponsoredChartCard(props: {
data: UserOpStats[];
aggregatedData: UserOpStats[];
selectedChart: string | undefined;
className?: string;
onlyMainnet?: boolean;
title?: string;
selectedChartQueryParam: string;
description?: string;
}) {
// Get unique chain IDs to avoid duplicate API calls
const uniqueChainIds = [...new Set(props.data.map(item => item.chainId).filter(Boolean))];
const chains = await Promise.all(
uniqueChainIds.map(
(chainId) =>
getChainMetadata(defineChain(Number(chainId))),
),
).then((chains) => chains.filter((c) => c) as ChainMetadata[]);
const processedAggregatedData = {
mainnet: props.aggregatedData
.filter(
(d) => !chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
testnet: props.aggregatedData
.filter(
(d) => chains.find((c) => c.chainId === Number(d.chainId))?.testnet,
)
.reduce((acc, curr) => acc + curr.sponsoredUsd, 0),
total: props.aggregatedData.reduce(
(acc, curr) => acc + curr.sponsoredUsd,
0,
),
};
return (
<TotalSponsoredChartCardUI
chains={chains}
processedAggregatedData={processedAggregatedData}
selectedChart={props.selectedChart}
selectedChartQueryParam={props.selectedChartQueryParam}
data={props.data}
/>
);
}
🤖 Prompt for AI Agents
In apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
between lines 379 and 423, the function AsyncTotalSponsoredChartCard calls
getChainMetadata for every item in props.data, causing redundant calls for
duplicate chain IDs. To fix this, first extract unique chain IDs from
props.data, then call getChainMetadata only once per unique chain ID. Replace
the current Promise.all mapping with a process that fetches metadata for these
unique chain IDs, improving performance by avoiding repeated API calls.

@graphite-app graphite-app bot merged commit bab4ff5 into main Aug 7, 2025
24 checks passed
@graphite-app graphite-app bot deleted the 08-06-dashboard_improved_chart_responsiveness_code_cleanup branch August 7, 2025 01:34
@vercel vercel bot temporarily deployed to Production – wallet-ui August 7, 2025 01:34 Inactive
@vercel vercel bot temporarily deployed to Production – thirdweb_playground August 7, 2025 01:34 Inactive
@vercel vercel bot temporarily deployed to Production – docs-v2 August 7, 2025 01:34 Inactive
@vercel vercel bot temporarily deployed to Production – nebula August 7, 2025 01:34 Inactive
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.

3 participants