Skip to content

Dashboard: File organization changes #7788

New issue

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

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

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 4, 2025

Conversation

MananTank
Copy link
Member

@MananTank MananTank commented Aug 4, 2025

Summary by CodeRabbit

  • New Features

    • Added a hook to fetch favorite chain IDs for user accounts.
    • Introduced contract verification functionality.
    • Added UI for saving deployed contracts to projects.
    • Provided new lightweight types for teams and projects.
  • Bug Fixes

    • Replaced NFT media cell rendering in marketplace tables for improved display and interaction.
  • Refactor

    • Standardized and reorganized import paths across the app for improved maintainability.
    • Renamed and updated fieldset components in contract deployment forms for consistency.
    • Centralized and simplified cookie and authentication token handling.
    • Removed or relocated obsolete and redundant components and types.
  • Chores

    • Cleaned up unused files and consolidated constants.
    • Updated and clarified type imports throughout the codebase.

Copy link

vercel bot commented Aug 4, 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 4, 2025 9:44pm
4 Skipped Deployments
Name Status Preview Comments Updated (UTC)
docs-v2 ⬜️ Skipped (Inspect) Aug 4, 2025 9:44pm
nebula ⬜️ Skipped (Inspect) Aug 4, 2025 9:44pm
thirdweb_playground ⬜️ Skipped (Inspect) Aug 4, 2025 9:44pm
wallet-ui ⬜️ Skipped (Inspect) Aug 4, 2025 9:44pm

Copy link

changeset-bot bot commented Aug 4, 2025

⚠️ No Changeset found

Latest commit: ad2d225

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

@vercel vercel bot temporarily deployed to Preview – docs-v2 August 4, 2025 20:37 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 4, 2025 20:37 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 4, 2025 20:37 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 4, 2025 20:37 Inactive
Copy link
Contributor

coderabbitai bot commented Aug 4, 2025

Walkthrough

This change set primarily reorganizes and updates import paths throughout the codebase to use more specific, absolute, or alias-based module paths, reflecting a modular restructuring. It introduces a new contract verification API, centralizes the favorite chains logic into a reusable hook, and refactors types and UI components for contract import and deployment. Several obsolete files and functions are removed, and minor component renaming is performed for consistency.

Changes

Cohort / File(s) Change Summary
Import Path Refactoring
apps/dashboard/src/@/actions/account/getAccount.ts, apps/dashboard/src/@/actions/stripe-actions.ts, apps/dashboard/src/@/actions/team/createTeam.ts, apps/dashboard/src/@/analytics/report.ts, apps/dashboard/src/@/api/account/get-account.ts, apps/dashboard/src/@/api/account/linked-wallets.ts, apps/dashboard/src/@/api/auth-token.ts, apps/dashboard/src/@/api/contract/fetchDeployMetadata.ts, apps/dashboard/src/@/api/project/projects.ts, apps/dashboard/src/@/api/team/audit-log.ts, apps/dashboard/src/@/api/team/dedicated-support.ts, apps/dashboard/src/@/api/team/ecosystems.ts, apps/dashboard/src/@/api/team/get-team.ts, apps/dashboard/src/@/api/team/team-invites.ts, apps/dashboard/src/@/api/team/team-members.ts, apps/dashboard/src/@/api/team/verified-domain.ts, apps/dashboard/src/@/components/billing/billing.tsx, apps/dashboard/src/@/components/billing/pricing-card.tsx, apps/dashboard/src/@/components/billing/renew-subscription-button.tsx, apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx, apps/dashboard/src/@/components/blocks/GatedSwitch.tsx, apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx, apps/dashboard/src/@/components/blocks/TokenSelector.tsx, apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx, apps/dashboard/src/@/components/chat/CustomChatButton.tsx, apps/dashboard/src/@/components/chat/CustomChatContent.tsx, apps/dashboard/src/@/components/chat/CustomChats.tsx, apps/dashboard/src/@/components/connect-wallet/index.tsx, apps/dashboard/src/@/components/contract-components/tables/contract-table.stories.tsx, apps/dashboard/src/@/components/contract-components/tables/contract-table.tsx, apps/dashboard/src/@/components/contracts/code-overview.tsx, apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx, apps/dashboard/src/@/components/contracts/contract-table/index.tsx, apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx, apps/dashboard/src/@/components/contracts/import-contract/types.ts, apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx, apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx, apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx, apps/dashboard/src/@/components/project/create-project-modal/index.tsx, apps/dashboard/src/@/components/tx-button/MismatchButton.tsx, apps/dashboard/src/@/constants/cookie.ts, apps/dashboard/src/@/constants/cookies.ts, apps/dashboard/src/@/constants/planToTierRecord.ts, apps/dashboard/src/@/hooks/contract-hooks.ts, apps/dashboard/src/@/hooks/useApi.ts, apps/dashboard/src/@/icons/ChainIcon.tsx, apps/dashboard/src/@/storybook/stubs.ts, apps/dashboard/src/@/utils/getValidTeamPlan.tsx, apps/dashboard/src/@/utils/pricing.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/FaucetSection.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-metadata.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.client.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/account/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/explore/[category]/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/explore/components/contract-row/index.tsx, apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/ProfileUI.tsx, apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/components/published-contracts.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/contract-metadata-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/royalty-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-functions.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/published-contract.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts, apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/contract-header.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx, apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx, apps/dashboard/src/app/(app)/account/components/AccountHeaderUI.tsx, apps/dashboard/src/app/(app)/account/devices/page.tsx, apps/dashboard/src/app/(app)/account/layout.tsx, apps/dashboard/src/app/(app)/account/overview/AccountTeamsUI.tsx, apps/dashboard/src/app/(app)/account/page.tsx, apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx, apps/dashboard/src/app/(app)/account/settings/page.tsx, apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx, apps/dashboard/src/app/(app)/account/wallets/LinkWalletsUI.stories.tsx, apps/dashboard/src/app/(app)/account/wallets/page.tsx, apps/dashboard/src/app/(app)/api/testnet-faucet/can-claim/route.ts, apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts, apps/dashboard/src/app/(app)/get-started/team/[team_slug]/add-members/page.tsx, apps/dashboard/src/app/(app)/get-started/team/[team_slug]/layout.tsx, apps/dashboard/src/app/(app)/get-started/team/[team_slug]/page.tsx, apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/_components/plan-selector.tsx, apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/page.tsx, apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/JoinTeamPage.tsx, apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/entry.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/list.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CancelPlanModal.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.stories.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/Pricing.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.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)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemWalletUsersChartCard.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/add-partner/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/add-partner-form.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/integration-permissions-toggle.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/partner-form.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/update-partner-form.client.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/auth-options-section.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/ecosystem-partners-section.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/partners-table.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-partner.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/partners/[partner_id]/edit/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-ecosystem.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/domain-verification.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPage.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPageUI.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/updateTeam.ts, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.stories.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.stories.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.stories.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/_common.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/CreateSupportCase.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportCaseDetails.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportTicketForm.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/case-list.tsx, apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/apis/support.ts, apps/dashboard/src/@/api/project/getSortedDeployedContracts.tsx, apps/dashboard/src/@/utils/resolveAddressAndEns.tsx, apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx, apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/page.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/modular-contract-default-modules-fieldset.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/custom-contract.tsx, apps/dashboard/src/app/(app)/account/devices/AccountDevicesPage.tsx
Updated import paths for types, API functions, and components to use more specific, absolute, or alias-based modules, reflecting a modular restructuring. No logic changes.
Contract Verification API
apps/dashboard/src/@/api/contract/verify-contract.ts, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/components/ContractSourcesPage.tsx, apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx
Introduced a new verifyContract async function for contract verification via an external API. Updated references to use this centralized function. Removed local duplicate implementation.
Favorite Chains Hook Refactor
apps/dashboard/src/@/hooks/favorite-chains.ts, apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/client/star-button.tsx, apps/dashboard/src/@/components/connect-wallet/index.tsx, apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx
Extracted the favorite chains logic into a reusable useFavoriteChainIds hook. Updated all consumers to use the new hook and removed redundant local implementations.
Contract Import/Deploy Types & UI Refactor
apps/dashboard/src/@/components/contracts/import-contract/types.ts, apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.stories.tsx, apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx
Split and refactored types for minimal teams/projects into a dedicated module. Removed legacy UI implementation and introduced a new AddToProjectCardUI component. Renamed fieldset component for consistency.
Component/Type Import Path Updates
apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx, apps/dashboard/src/@/components/contracts/contract-table/index.tsx, apps/dashboard/src/@/components/contracts/code-overview.tsx, apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx, apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx, apps/dashboard/src/@/components/tx-button/MismatchButton.tsx, apps/dashboard/src/@/components/project/create-project-modal/index.tsx, apps/dashboard/src/@/components/billing/pricing-card.tsx, apps/dashboard/src/@/components/billing/renew-subscription-button.tsx, apps/dashboard/src/@/components/blocks/GatedSwitch.tsx, apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx, apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx, apps/dashboard/src/@/components/chat/CustomChatButton.tsx, apps/dashboard/src/@/components/chat/CustomChatContent.tsx, apps/dashboard/src/@/components/chat/CustomChats.tsx, apps/dashboard/src/@/components/billing/billing.tsx, apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx, apps/dashboard/src/@/components/blocks/TokenSelector.tsx, apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx, apps/dashboard/src/@/components/connect-wallet/index.tsx
Updated import paths for various components and types to reflect new API and component locations, including billing, blocks, chat, and contract components. No logic changes.
Cookie/Constants Refactor
apps/dashboard/src/@/constants/cookie.ts, apps/dashboard/src/@/constants/cookies.ts, apps/dashboard/src/@/api/auth-token.ts
Removed unused cookie-related functions, consolidated cookie constants into a single file, deleted redundant cookies file, and updated imports accordingly.
Removed/Deleted Components
apps/dashboard/src/@/components/contracts/media-cell.tsx
Deleted the MediaCell component and updated all usages to use NFTMediaWithEmptyState directly with explicit props.
Miscellaneous Import Path Cleanups
Various files including storybook stubs, utility functions, and dashboard pages
Numerous other files updated to use new module paths for types, utility functions, and components. No logic changes.

Sequence Diagram(s)

sequenceDiagram
    participant UI
    participant useFavoriteChainIds
    participant apiServerProxy
    participant Server

    UI->>useFavoriteChainIds: Call hook
    useFavoriteChainIds->>apiServerProxy: GET /v1/chains/favorites
    apiServerProxy->>Server: Forward request
    Server-->>apiServerProxy: Respond with favorite chain IDs
    apiServerProxy-->>useFavoriteChainIds: Return data
    useFavoriteChainIds-->>UI: Provide favorite chain IDs
Loading
sequenceDiagram
    participant UI
    participant verifyContract (API)
    participant RemoteAPI

    UI->>verifyContract: Call with contract info
    verifyContract->>RemoteAPI: POST /verify/contract (with chainId, address)
    RemoteAPI-->>verifyContract: Respond with verification result
    verifyContract-->>UI: Return result or log error
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • jnsdls

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-05-dashboard_file_organization_changes

🪧 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 4, 2025 20:37
@MananTank MananTank requested a review from a team as a code owner August 4, 2025 20:37
@github-actions github-actions bot added the Dashboard Involves changes to the Dashboard. label Aug 4, 2025
@MananTank MananTank requested a review from a team as a code owner August 4, 2025 20:37
Copy link
Member Author

MananTank commented Aug 4, 2025


How to use the Graphite Merge Queue

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

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

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

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

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

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

Copy link

codecov bot commented Aug 4, 2025

Codecov Report

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

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7788   +/-   ##
=======================================
  Coverage   56.34%   56.34%           
=======================================
  Files         905      905           
  Lines       58788    58788           
  Branches     4142     4142           
=======================================
  Hits        33127    33127           
  Misses      25556    25556           
  Partials      105      105           
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.

Copy link
Contributor

github-actions bot commented Aug 4, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 63.15 KB (0%) 1.3 s (0%) 143 ms (+68.39% 🔺) 1.5 s
thirdweb (cjs) 353.02 KB (0%) 7.1 s (0%) 612 ms (+0.29% 🔺) 7.7 s
thirdweb (minimal + tree-shaking) 5.7 KB (0%) 114 ms (0%) 35 ms (+611.66% 🔺) 149 ms
thirdweb/chains (tree-shaking) 526 B (0%) 11 ms (0%) 14 ms (+782.26% 🔺) 24 ms
thirdweb/react (minimal + tree-shaking) 19.3 KB (0%) 386 ms (0%) 18 ms (+45.36% 🔺) 404 ms

@graphite-app graphite-app bot changed the base branch from 08-04-dashboard_dedicated_engine_header_ui_tweak_on_mobile_tab_component_tweaks to graphite-base/7788 August 4, 2025 20:47
@MananTank MananTank force-pushed the graphite-base/7788 branch from 91ade0b to 0aac9a8 Compare August 4, 2025 20:52
@MananTank MananTank force-pushed the 08-05-dashboard_file_organization_changes branch from fb751b1 to ce41797 Compare August 4, 2025 20:52
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 4, 2025 20:53 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 4, 2025 20:53 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 4, 2025 20:53 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 4, 2025 20:53 Inactive
@MananTank MananTank changed the base branch from graphite-base/7788 to 08-04-dashboard_dedicated_engine_header_ui_tweak_on_mobile_tab_component_tweaks August 4, 2025 20:53
Base automatically changed from 08-04-dashboard_dedicated_engine_header_ui_tweak_on_mobile_tab_component_tweaks to main August 4, 2025 20:58
@MananTank MananTank force-pushed the 08-05-dashboard_file_organization_changes branch from ce41797 to 4d63d24 Compare August 4, 2025 21:00
@vercel vercel bot temporarily deployed to Preview – nebula August 4, 2025 21:00 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 4, 2025 21:00 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 4, 2025 21:00 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 4, 2025 21:00 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: 51

🔭 Outside diff range comments (34)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx (1)

1-9: Missing 'use client' directive for a hook-based component

The file uses useState, useMemo, and other browser-only hooks, so it must start with the 'use client'; pragma per the dashboard client-component rules. Without it, Next.js will treat this as a Server Component, causing runtime errors once hooks are executed.

+'use client';
+
 import type { UseQueryResult } from "@tanstack/react-query";
apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx (1)

1-4: Add the "use client" directive

This component consumes React hooks (useFormContext, useState via TabButtons callbacks), so it must be a client component. Per the dashboard coding rules, every client component must start with the string literal 'use client'; before the first import.

+'use client';
 import type { Abi } from "abitype";
 import type { Dispatch, SetStateAction } from "react";
 import { useFormContext } from "react-hook-form";
 import type { ThirdwebClient } from "thirdweb";
apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx (1)

1-3: Insert "use client"

Hooks (useState, useFormContext) are used extensively, so this must be marked as a client component.

+'use client';
 import { compare, validate } from "compare-versions";
 import { useState } from "react";
 import { useFormContext } from "react-hook-form";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts (2)

1-7: Mark hook as client-side

The hook consumes React-Query and therefore must start with 'use client';.

+'use client';
 import {
   type UseMutationOptions,
   useMutation,
   useQueryClient,
 } from "@tanstack/react-query";
 import type { Ecosystem } from "@/api/team/ecosystems";

28-33: Remove artificial 3 s delay

A hard-coded setTimeout slows down every deletion and blocks the mutation queue for no functional reason.

-      await new Promise((resolve) => setTimeout(resolve, 3000));

Drop the line unless there is a documented requirement to simulate latency.

apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx (1)

108-110: format expects a Date, not an ISO string

wallet.createdAt is typed/used as a string but passed directly to date-fns/format, which requires a Date | number. Wrap it with new Date(...) to avoid runtime/TS errors.

-{format(wallet.createdAt, "MMM d, yyyy")}
+{format(new Date(wallet.createdAt), "MMM d, yyyy")}
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts (1)

15-23: next option breaks in the browser

When fetchPartners is invoked from usePartners (a React-Query client hook) this code will run in the browser.
fetch will throw: “Invalid value for init option ‘next’”.

-  const res = await fetch(`${ecosystem.url}/${ecosystem.id}/partners`, {
-    headers: { … },
-    next: { revalidate: 0 },
-  });
+  const init: RequestInit = {
+    headers: {
+      Authorization: `Bearer ${authToken}`,
+      "x-thirdweb-team-id": teamId,
+    },
+  };
+  // Only attach Next.js cache hints on the server
+  if (typeof window === "undefined") {
+    (init as any).next = { revalidate: 0 };
+  }
+
+  const res = await fetch(`${ecosystem.url}/${ecosystem.id}/partners`, init);

Failing to guard this will crash every client render that queries partners.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts (1)

1-8: ❗ Move sensitive fetch helper to a server-only module

authToken and teamId headers must never reach the browser bundle.
Because this helper sits in hooks/ and lacks the import "server-only"; guard, any client component could import it and expose PII in the JS payload.

+import "server-only";
 import type { Ecosystem, Partner } from "@/api/team/ecosystems";

Alternatively, relocate the file under @/api/** and prefix it with server-only.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts (1)

26-33: ❗ Leaking bearer tokens to the client

useAddPartner executes in the browser (React Query mutation).
Passing authToken directly to fetch ships the raw JWT to every user who loads the page, violating the “Keep tokens secret via internal API routes or server actions” guideline.

Refactor:

  1. Create a server action / internal API route /api/partners/add.
  2. Move the fetch call (and secret headers) there.
  3. From the client, call that endpoint without credentials.

Until then, any user can inspect dev-tools and exfiltrate team tokens.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx (1)

1-6: ❗ Missing import "server-only"; in a server component

This file renders on the edge/runtime only; add the guard at the very top to keep it out of the client bundle.

+import "server-only";
 import { notFound } from "next/navigation";
apps/dashboard/src/@/components/project/create-project-modal/index.tsx (1)

1-11: Missing 'use client'; directive violates dashboard client-component rule

This component uses hooks (useState, useForm, React Query) → it must be compiled as a client component.
Add the directive before all imports:

+'use client';
+
 import { zodResolver } from "@hookform/resolvers/zod";
apps/dashboard/src/@/components/chat/CustomChats.tsx (1)

1-10: Missing 'use client' directive breaks React-client compilation

CustomChats uses React hooks (useEffect, useState) but the file lacks the required "use client"; pragma at the very top. Without it, Next.js will treat the component as a server component and compilation will fail.

+// Interactive chat UI (hooks inside)
+'use client';
 
 import {
   AlertCircleIcon,
   ArrowRightIcon,
apps/dashboard/src/@/api/team/team-invites.ts (1)

21-26: Inconsistent unauthenticated handling vs. other helpers.
Here you throw new Error("Unauthorized"), whereas team-members.ts returns undefined. Choose one convention (throw vs return value) and apply it across all API helpers so callers can rely on a single contract.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts (1)

50-53: Query key is too generic – will collide across teams

invalidateQueries({ queryKey: ["ecosystems"] }) flushes the cache for every team.
Use a descriptive, stable key that scopes to the current team to prevent unwanted refetches in other dashboards.

-      await queryClient.invalidateQueries({
-        queryKey: ["ecosystems"],
-      });
+      await queryClient.invalidateQueries({
+        queryKey: ["team", teamId, "ecosystems"],
+      });
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1)

1-4: Add "server-only" directive at the top of this server component

Dashboard server-side pages must start with

import "server-only";

to guarantee the file is never bundled for the browser.
Please insert the directive as the first statement.

+import "server-only";
 import {
   EmptyStateCard,
   EmptyStateContent,
 } from "app/(app)/team/components/Analytics/EmptyStateCard";
apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx (1)

1-13: Prepend import "server-only"; and add explicit return type

This helper only runs on the server (it fetches auth-protected data and never uses React runtime APIs). Per our dashboard guidelines, it must be tree-shaken from the client bundle, and its signature should expose its return type.

• File:
apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx

• Change required:

  1. Add import "server-only"; at the top of the file.
  2. Annotate the function to return Promise<ProjectContract[]>.
+ import "server-only";
  import {
    getProjectContracts,
    type ProjectContract,
  } from "@/api/project/getProjectContracts";
  import { fetchChainWithLocalOverrides } from "@/utils/fetchChainWithLocalOverrides";

-export async function getSortedDeployedContracts(params: {
+export async function getSortedDeployedContracts(
+  params: {
     onlyMainnet?: boolean;
     teamId: string;
     projectId: string;
     authToken: string;
     deploymentType: string | undefined;
-}) {
+  }
+): Promise<ProjectContract[]> {
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx (1)

1-8: Mark the page as a server component

This route performs server-only work (cookie-based account lookup) and exports default async function Page.
Insert the server-only pragma so Next.js never bundles it for the client:

+import "server-only";
 import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx (1)

1-8: Server component should start with import "server-only";

The notifications settings page fetches the authenticated account on the server.
Add the directive to satisfy the dashboard rule set.

+import "server-only";
 import { getValidAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx (1)

1-6: Add import "server-only"; at the top

This explorer page is rendered on the server (no hooks / 'use client').
Please mark it explicitly to avoid accidental client bundle inclusion.

+import "server-only";
 import type { Abi } from "abitype";
 import { CircleAlertIcon } from "lucide-react";
 import type { ThirdwebContract } from "thirdweb";
 import type { ChainMetadata } from "thirdweb/chains";
 import { getContractFunctionsFromAbi } from "@/api/contract/getContractFunctionsFromAbi";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx (1)

5-9: Unusual Promise annotation on props.params

Page receives params synchronously from the Next.js router.
Typing it as Promise<…> forces an unnecessary await, adds latency, and obscures intent.

Consider:

-export default async function Page(props: {
-  params: Promise<PublicContractPageParams>;
-}) {
-  const [params, account] = await Promise.all([props.params, getRawAccount()]);
+export default async function Page(props: {
+  params: PublicContractPageParams;
+}) {
+  const [account] = await Promise.all([getRawAccount()]);
+  const { chain_id, contractAddress } = props.params;

(Adjust usages accordingly.)

apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx (1)

1-4: Missing import "server-only"; directive – this code is being bundled for the browser

This file is a server component (it awaits filesystem/IPFS calls and pulls heavy thirdweb SDK objects).
Per the dashboard guidelines, every server component must start with import "server-only"; so it never leaks into the client bundle.

+import "server-only";
 import { isAddress } from "thirdweb";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx (1)

71-85: Array.sort() mutates in-place – this leaks side-effects into props

projects is received from props. When searchTerm === "" the reference _projectsToShow points to that original array, and the subsequent sort() mutates it, potentially causing unexpected re-renders.

Refactor by sorting a shallow copy:

-    if (sortBy === "name") {
-      _projectsToShow = _projectsToShow.sort((a, b) =>
+    if (sortBy === "name") {
+      _projectsToShow = [..._projectsToShow].sort((a, b) =>
         a.name.localeCompare(b.name),
       );
     } else if (sortBy === "createdAt") {
-      _projectsToShow = _projectsToShow.sort(
+      _projectsToShow = [..._projectsToShow].sort(
         (a, b) =>
           new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),
       );
     } else if (sortBy === "monthlyActiveUsers") {
-      _projectsToShow = _projectsToShow.sort(
+      _projectsToShow = [..._projectsToShow].sort(
         (a, b) => b.monthlyActiveUsers - a.monthlyActiveUsers,
       );
     }
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts (1)

1-7: Prefix util with import "server-only" to keep it out of the client bundle

This helper performs network-heavy contract-fetching and is only ever called from server components.
Adding the directive prevents tree-shakers from putting it in any client chunk in the future.

+import "server-only";
 import { isAddress, type ThirdwebClient } from "thirdweb";
 import { resolveAddress } from "thirdweb/extensions/ens";
 import {
   fetchLatestPublishedContractVersion,
   fetchPublishedContractVersions,
 } from "@/api/contract/fetch-contracts-with-versions";
apps/dashboard/src/@/api/auth-token.ts (1)

9-17: await cookies() is a bug – cookies() is synchronous

next/headers returns a plain ReadonlyRequestCookies object.
awaiting a non-Promise both confuses TypeScript and adds an unnecessary micro-task.

-export async function getAuthToken() {
-  const cookiesManager = await cookies();
+export async function getAuthToken() {
+  const cookiesManager = cookies();

The same issue appears in getAuthTokenWalletAddress (Line 20) and getUserThirdwebClient (Line 47).
Please drop the await in all three places.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportTicketForm.tsx (1)

1-8: Missing 'use client' directive – this file will fail at runtime
The component uses React hooks (useState, useRef) but is currently treated as a server component. Add the directive at the very top to opt-in to client compilation.

+"use client";
 import { LockIcon } from "lucide-react";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx (1)

1-2: Add the mandatory import "server-only"; prelude

Server components in apps/dashboard must start with import "server-only"; to guarantee they never end up in the client bundle.
Place it before every other import:

+import "server-only";
 import { notFound } from "next/navigation";
apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts (1)

1-3: Prefix API route with import "server-only";

API handlers (dashboard/**/api/**/*) must begin with the server-only directive.
This prevents the handler from ever being bundled for the browser and aligns with project rules.

+import "server-only";
 import { ipAddress } from "@vercel/functions";
 import { startOfToday } from "date-fns";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx (1)

60-76: Avoid mutating props when sorting

Array.prototype.sort mutates the array in place.
When searchTerm is empty the variable value still references props.teamInvites, so the original prop is mutated – React warns against this.

-    let value = props.teamInvites;
+    // clone to keep props immutable
+    let value = [...props.teamInvites];
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx (1)

1-2: Missing import "server-only";

This is a server page. Add the directive before any other import:

+import "server-only";
 import { subDays } from "date-fns";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx (1)

1-9: Add import "server-only"; to follow server-component rules.

This utility/component file is used on the server (no 'use client').
Prefixing with the directive prevents accidental client bundling.

+import "server-only";
 import type { ThirdwebContract } from "thirdweb";
 import { polygon } from "thirdweb/chains";
 import { getBytecode, getContract } from "thirdweb/contract";
@@
 import { extractIPFSUri, isValidENSName } from "thirdweb/utils";
 import { fetchPublishedContractsFromDeploy } from "@/api/contract/fetchPublishedContractsFromDeploy";
 import { ContractCard } from "@/components/contracts/contract-card/contract-card";
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx (1)

1-1: Add 'use client'; directive to prevent React-hook runtime errors

This component mounts hooks (useFieldArray) and renders interactive UI, so Next.js must treat it as a client component.
Without the directive the build will fail with React Hook "useFieldArray" is called in server component.

+ 'use client';
+
 import { InfoIcon, PlusIcon, Trash2Icon } from "lucide-react";
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx (1)

1-1: Mark as client component

This fieldset receives register from React-Hook-Form (client-only). Add the directive to avoid build-time hook violations.

+ 'use client';
+
 import type { UseFormRegisterReturn } from "react-hook-form";
apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx (1)

22-32: Missing early-return after loginRedirect may leak data

loginRedirect() throws a Next.js redirect() in most places, but this was recently tightened (see learning #7285) to require an explicit return in server components to guarantee dead-code elimination and avoid accidental execution that could expose privileged data.

   if (!teams) {
     loginRedirect(pathname);
+    return; // prevent the rest of the function from running after redirect
   }
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx (1)

1-1: Missing 'use client'; directive

This component registers React-Hook-Form inputs and renders interactive UI. Without the "use client" pragma, Next.js will treat the file as a server component, preventing hooks from working and increasing bundle size when automatically switched to the client at runtime.

+ 'use client';
 import type { ThirdwebClient } from "thirdweb";
♻️ Duplicate comments (6)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx (1)

1-1: Same server-only check applies

Same comment as in accounts/page.tsx – ensure the get-account helper is server-only.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx (1)

1-1: Same server-only check applies

Same comment as in accounts/page.tsx – ensure the get-account helper is server-only.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx (1)

1-1: Same server-only check applies

Same comment as in accounts/page.tsx – ensure the get-account helper is server-only.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx (1)

1-8: Missing import "server-only";

Same reasoning as the direct-listings page: this component runs only on the Node edge, so flag it explicitly.

+import "server-only";
 import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx (1)

1-8: Add server-only directive

Ensure this token details page is excluded from the client bundle:

+import "server-only";
 import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx (1)

5-9: params should not be a Promise

See previous comment in NFTs page – the same correction applies here.

🧹 Nitpick comments (34)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx (1)

171-178: Consider supplying alt text for accessibility

NFTMediaWithEmptyState may expose an alt/name prop to describe the NFT. Passing row.asset.metadata.name (or a fallback) improves screen-reader support.

apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx (1)

5-6: Verify that confirmEmailWithOTP and updateAccount are client-safe before importing here

This file is a 'use client' component. Per dashboard guidelines, helpers that retrieve auth tokens (getAuthToken()) or otherwise rely on server-only context must not be imported directly into client bundles.
Please confirm that:

  1. @/actions/account/confirmEmail
  2. @/actions/account/updateAccount

either (a) contain no server-only logic/secrets or (b) are thin wrappers around public API endpoints and therefore safe for the browser. If they do touch server-only utilities, move the calls behind an API route / server action and invoke that instead.

apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/resolveAddressAndEns.tsx (1)

1-1: Rename file to .ts—no JSX present
The file contains no JSX or React usage, so the .tsx extension triggers unnecessary TypeScript/React transforms during compilation. Renaming to resolveAddressAndEns.ts keeps tooling fast and avoids misleading intent.

apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx (1)

14-14: Local relative import is fine – consider aligning with alias pattern

"./contract-publisher" is the only relative import left after the alias refactor.
If contract-publisher is reused elsewhere, exposing it via @/components/contracts/contract-card would let other consumers avoid deep relative hops. Minor, purely organisational.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts (1)

1-9: Mark the utility as server-only and declare an explicit return type

This helper runs only during server rendering / data-prep but currently lacks the import "server-only"; guard.
Also, the function’s return type is inferred as { moduleName: string; params: unknown[] }, which is fine but undocumented.
Providing an explicit type signal helps call-sites and future refactors.

+import "server-only";
 import { isAddress, type ThirdwebClient } from "thirdweb";
@@
-export async function getModuleInstalledParams(
+export async function getModuleInstalledParams(
   ext: ModuleMeta,
   client: ThirdwebClient,
-) {
+): Promise<{ moduleName: string; params: { name: string; type: string }[] }> {
apps/dashboard/src/@/utils/getValidTeamPlan.tsx (1)

1-1: Rename to .ts – no JSX used

The file is typed as TSX but contains no JSX or React APIs.
Renaming to getValidTeamPlan.ts avoids unnecessary React transforms and speeds builds.

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

3-7: Minor cleanup: passHref no longer necessary

next/link automatically forwards href to the child when it’s an <a> or a component receiving href.
You can safely drop the passHref prop.

-  return (
-    <Link href={addPartnerUrl} passHref>
+  return (
+    <Link href={addPartnerUrl}>
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx (1)

7-15: Return type is implicit

For consistency with the repo’s TypeScript guidelines (“write idiomatic TS with explicit function declarations and return types”) add an explicit return type:

-export function IntegrationPermissionsSection({
+export function IntegrationPermissionsSection({
   ecosystem,
   authToken,
   teamId,
 }: {
   ecosystem?: Ecosystem;
   authToken: string;
   teamId: string;
-}) {
+}): React.JSX.Element {
apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx (1)

154-166: Variable shadowing obscures intent

unlinkWallet returned from useMutation shadows the unlinkWallet prop, making the code harder to scan. Rename the mutation object for clarity.

-const unlinkWallet = useMutation({
+const unlinkWalletMutation = useMutation({
   mutationFn: props.unlinkWallet,
@@
-            disabled={unlinkWallet.isPending}
+            disabled={unlinkWalletMutation.isPending}
@@
-              unlinkWallet.mutate(props.wallet.id);
+              unlinkWalletMutation.mutate(props.wallet.id);
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts (1)

79-83: Stable queryKey constant recommended

invalidateQueries({ queryKey: ["ecosystem", variables.ecosystem.id, "partners"] }) uses an inline array.
Define a shared constant (e.g., ecosystemPartnersKey(ecosystemId)) to avoid typos and ensure cache hits across modules.

apps/dashboard/src/@/utils/pricing.tsx (1)

1-1: Rename file to .ts – no JSX inside

This util exports plain data; using .tsx needlessly activates the JSX/React loader and increases build time.

-apps/dashboard/src/@/utils/pricing.tsx
+apps/dashboard/src/@/utils/pricing.ts
apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (1)

42-48: Only “free” can trigger upsell navigation – consider widening the check

handleNavigateToBilling stops navigation for every plan except "free".
If plans like "starter" or future free-tier variants should also prompt an upgrade, gate on a list/utility rather than a single literal.

-  if (props.plan !== "free") {
+  const upsellEligible = ["free", "starter"] as const;
+  if (!upsellEligible.includes(props.plan)) {
     return;
   }
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx (1)

12-15: highlightPlan should be optional

props.highlightPlan is required by the type but the implementation falls back to "growth" when it’s falsy. Making the prop optional avoids callers passing a dummy value.

-export function FreePlanUpsellBannerUI(props: {
-  teamSlug: string;
-  highlightPlan: Team["billingPlan"];
-}) {
+export function FreePlanUpsellBannerUI(props: {
+  teamSlug: string;
+  highlightPlan?: Team["billingPlan"];
+}) {
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx (1)

59-60: as const satisfies AuthOption[] is forward-thinking but fragile

The compile-time assertion breaks if the allowed auth options list in the backend diverges. Consider deriving the array from the server-authoritative enum to avoid drift.

No code change required now, just a heads-up.

apps/dashboard/src/@/api/team/team-members.ts (2)

28-48: Surface fetch errors instead of silently returning undefined.
Both lack-of-token and network/API failures collapse to the same undefined result, making it hard for callers to distinguish “unauthenticated” from “server returned 500”. Consider returning an error object or throwing an exception for non-OK responses.


52-78: Same silent-failure pattern as above.
getMemberByAccountId swallows fetch errors and returns undefined, diverging from other helpers that throw (see team-invites.ts). Align the behaviour across helpers for predictability.

apps/dashboard/src/@/api/team/ecosystems.ts (1)

61-74: Consider propagating error context instead of empty array.
Returning [] for every failure (network, 404, 500, etc.) hides the cause and forces callers to infer whether an ecosystem truly has no entries or something went wrong. Propagate the status or throw an exception for non-OK responses.

apps/dashboard/src/@/api/account/linked-wallets.ts (1)

26-34: Surface non-200 responses for easier debugging

Currently, any non-OK response is silently swallowed by returning null, which obscures real issues.
Consider parsing the error body and logging or propagating it.

-  if (res.ok) {
-    const json = (await res.json()) as { data: LinkedWallet[] };
-    return json.data;
-  }
-
-  return null;
+  if (!res.ok) {
+    const err = await res.text();
+    console.error("Failed to fetch linked wallets:", err);
+    return null;
+  }
+
+  const json = (await res.json()) as { data: LinkedWallet[] };
+  return json.data;
apps/dashboard/src/@/components/contracts/contract-table/index.tsx (1)

24-33: Promise.all rejects on first failure – consider Promise.allSettled

If a single metadata fetch fails, the entire batch is discarded, showing a generic error even when most contracts succeed.
Using Promise.allSettled retains partial data and surfaces which IDs failed.

-  const deployedContractMetadata = await Promise.all(
-    contractIds.map(async (id) => {
-      const res = await fetchDeployMetadata(id, serverThirdwebClient);
-      return { contractId: id, ...res };
-    }),
-  ).catch(() => null);
+  const deployedContractMetadata = (
+    await Promise.allSettled(
+      contractIds.map(async (id) => ({
+        contractId: id,
+        ...(await fetchDeployMetadata(id, serverThirdwebClient)),
+      })),
+    )
+  )
+    .filter((r): r is PromiseFulfilledResult<typeof r["value"]> => r.status === "fulfilled")
+    .map((r) => r.value);
apps/dashboard/src/@/api/team/audit-log.ts (1)

57-58: Minor typo in comment

artificallyartificially.

-  // artifically limit page size to 15 for now
+  // artificially limit page size to 15 for now
apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx (1)

29-37: React keys risk collisions & “undefined” warnings

key={signature.filename} can be duplicated (e.g. multiple MyContract.sol files) or even undefined, causing React reconciliation issues.

-        <SourceAccordionItem
-          accordionId={`acc-${i}`}
-          code={signature.source.trim()}
-          filename={signature.filename || "Unknown"}
-          key={signature.filename}
-          lang="solidity"
-        />
+        <SourceAccordionItem
+          accordionId={`acc-${i}`}
+          code={signature.source.trim()}
+          filename={signature.filename ?? "Unknown"}
+          /* ensure key is always defined & unique */
+          key={`${signature.filename ?? "unknown"}-${i}`}
+          lang="solidity"
+        />
apps/dashboard/src/@/actions/account/getAccount.ts (1)

1-7: Consider adding "server-only" directive for clarity

The file already starts with the "use server" directive, but adding the neutral

import "server-only";

at the very top makes the intent explicit and prevents accidental client-side bundling if this helper is ever imported by a client component.
(No functional change required, purely defensive.)

apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts (1)

32-41: Swallowing all errors may hide actionable issues

The blanket catch { return undefined; } suppresses every failure (network, ENS resolution, etc.), making debugging hard.

Consider at least logging the error or returning a Result object so callers can react appropriately.

-  } catch {
-    return undefined;
+  } catch (err) {
+    console.error("[getPublishedContractsWithPublisherMapping]", err);
+    return undefined;
   }
apps/dashboard/src/@/api/auth-token.ts (1)

47-54: Duplicate cookies() call – consider re-using

cookies() is inexpensive but you already fetched it at the top of the function.
Reuse the earlier cookiesManager instead of calling it again.

apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx (1)

3-31: Expose a className override to stay consistent with component guidelines

Most root elements in dashboard components accept an optional className so callers can tweak spacing when composing layouts. Adding it here costs almost nothing and avoids wrapper <div> work-arounds.

-export function ContractDeploymentFieldset(props: {
+export function ContractDeploymentFieldset(props: {
   legend: string;
   description?: React.ReactNode;
   headerChildren?: React.ReactNode;
   children: React.ReactNode;
   headerClassName?: string;
+  className?: string;
 }) {
   return (
-    <fieldset className="relative rounded-lg border border-border bg-card">
+    <fieldset
+      className={cn(
+        "relative rounded-lg border border-border bg-card",
+        props.className,
+      )}
+    >
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx (1)

26-57: Minor wording nit – clarify legend for end-users

legend="Gasless" may not be self-explanatory for less technical creators. Consider something like “Gasless (Trusted Forwarders)” for clarity.

No functional impact – optional copy tweak only.

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx (1)

13-18: moduleId appears unused – prune to avoid misleading typings.

ModuleMetadataPickedKeys defines moduleId, but every reference later uses m.name instead.
Unless another consumer needs it, drop the field to keep the type minimal.

-type ModuleMetadataPickedKeys = {
-  publisher: string;
-  moduleId: string;
-  name: string;
-  version: string;
-};
+type ModuleMetadataPickedKeys = {
+  publisher: string;
+  name: string;
+  version: string;
+};
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx (1)

125-154: Consider bounding concurrent project fetches

Promise.all(teams.map(getProjects)) fires one network request per team simultaneously.
If a workspace contains dozens of teams this may overload the backend or hit Vercel function concurrency limits.

-const teamsAndProjects: MinimalTeamsAndProjects = await Promise.all(
-  teams.map(async (team) => ({
+// limit to 5 in-flight look-ups to avoid thundering-herd
+const concurrency = 5;
+const limit = (fn: () => Promise<any>) =>
+  (inFlight < concurrency ? fn() : queue.push(fn));
+
+const teamsAndProjects: MinimalTeamsAndProjects = await Promise.all(
+  teams.map(async (team) => limit(async () => ({
     ...
-  })),
+  }))),
 );
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/apis/support.ts (1)

1-1: Use import "server-only"; for server helpers

Dashboard API helpers are required to start with import "server-only"; (guideline) to guarantee they never get bundled client-side.
"use server" is fine for Next.js, but deviates from the repo convention and may confuse static-analysis rules.

-"use server";
+import "server-only";
apps/dashboard/src/@/hooks/contract-hooks.ts (1)

12-16: Consistent file naming

Small nit: neighbouring helpers follow kebab-case (e.g. fetch-contracts-with-versions). Consider renaming fetchPublishedContracts{,FromDeploy}.ts to fetch-published-contracts{,-from-deploy}.ts for consistency with the new path.

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

3-4: Prefer alias import over deep relative path

ThirdwebMiniLogo lives in components, which is already aliased in the repo (@/components/**). Importing it via six-level relative traversal hurts readability and is brittle to directory moves.

-import { ThirdwebMiniLogo } from "../../../../../../components/ThirdwebMiniLogo";
+import { ThirdwebMiniLogo } from "@/components/ThirdwebMiniLogo";
apps/dashboard/src/@/api/contract/verify-contract.ts (1)

3-27: Improve type safety and error handling.

The function implementation is functional but could be enhanced:

  1. Add explicit return type annotation for better type safety
  2. Improve error handling - the current approach silently swallows errors which may make debugging difficult
  3. Handle non-JSON responses - response.json() could throw if the response isn't valid JSON
-export async function verifyContract(contract: ThirdwebContract) {
+export async function verifyContract(contract: ThirdwebContract): Promise<unknown> {
   try {
     const response = await fetch(
       "https://contract.thirdweb.com/verify/contract",
       {
         body: JSON.stringify({
           chainId: contract.chain.id,
           contractAddress: contract.address,
         }),
         headers: {
           "Content-Type": "application/json",
         },
         method: "POST",
       },
     );

     if (!response.ok) {
       console.error(`Error verifying contract: ${response.statusText}`);
+      return undefined;
     }

-    return await response.json();
+    try {
+      return await response.json();
+    } catch (parseError) {
+      console.error(`Error parsing verification response: ${parseError}`);
+      return undefined;
+    }
   } catch (error) {
     console.error(`Error verifying contract: ${error}`);
+    return undefined;
   }
 }
apps/dashboard/src/@/hooks/favorite-chains.ts (1)

21-28: Consider adding staleTime configuration for better caching

The hook implementation is clean and follows React Query best practices. However, per the coding guidelines, consider adding staleTime configuration since favorite chains data likely doesn't change frequently.

 export function useFavoriteChainIds() {
   const address = useActiveAccount()?.address;
   return useQuery({
     enabled: !!address,
     queryFn: () => favoriteChains(),
     queryKey: ["favoriteChains", address],
+    staleTime: 5 * 60 * 1000, // 5 minutes
   });
 }
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts (1)

14-20: Add staleTime and make the queryKey fully unique

Dashboard hooks are expected to configure React Query caching explicitly (see coding guidelines).
Consider:

  1. Giving the cache at least 60 s freshness so components don’t refetch on every re-mount.
  2. Including teamId in the key to avoid collisions if different teams share the same ecosystem.id.
   const partnersQuery = useQuery({
     queryFn: async () => {
       return fetchPartners({ authToken, ecosystem, teamId });
     },
-    queryKey: ["ecosystem", ecosystem.id, "partners"],
+    queryKey: ["ecosystem", teamId, ecosystem.id, "partners"],
+    staleTime: 60_000, // 1 minute – adjust if data is more/less volatile
     retry: false,
   });

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.

Review continued from previous batch...

@MananTank MananTank force-pushed the 08-05-dashboard_file_organization_changes branch from 4d63d24 to f72c553 Compare August 4, 2025 21:16
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 4, 2025 21:16 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 4, 2025 21:16 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 4, 2025 21:16 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 4, 2025 21:16 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

🔭 Outside diff range comments (1)
apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx (1)

1-1: Missing server-only import directive.

According to the coding guidelines, server components in the dashboard app should start with import "server-only"; to ensure they never end up in the client bundle.

Add the server-only import at the top of the file:

+import "server-only";
+
 import { notFound } from "next/navigation";
🧹 Nitpick comments (2)
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (2)

22-27: Consider adding explicit return type annotation.

While the function signature is clear, adding an explicit return type would improve TypeScript consistency and make the component's contract more explicit.

export function AddToProjectSelector(props: {
  selection: TeamAndProjectSelection;
  onSelectionChange: (selection: TeamAndProjectSelection) => void;
  teamsAndProjects: MinimalTeamsAndProjects;
  client: ThirdwebClient;
-}) {
+}): JSX.Element {

106-110: Consider using EmptyStateCard for consistency.

The "No projects" message could use the EmptyStateCard component from the design system for better consistency with other empty states in the dashboard.

-            {selectedTeam?.projects.length === 0 && (
-              <div className="flex items-center justify-start px-3 py-3 text-destructive-text text-sm">
-                No projects
-              </div>
-            )}
+            {selectedTeam?.projects.length === 0 && (
+              <EmptyStateCard
+                title="No projects"
+                description="This team doesn't have any projects yet."
+              />
+            )}

Note: You'll need to import EmptyStateCard from @/components/ui/empty-state-card if this suggestion is implemented.

Copy link
Contributor

graphite-app bot commented Aug 4, 2025

Merge activity

<!--

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

-->

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

* **New Features**
  * Added a hook to fetch favorite chain IDs for user accounts.
  * Introduced contract verification functionality.
  * Added UI for saving deployed contracts to projects.
  * Provided new lightweight types for teams and projects.

* **Bug Fixes**
  * Replaced NFT media cell rendering in marketplace tables for improved display and interaction.

* **Refactor**
  * Standardized and reorganized import paths across the app for improved maintainability.
  * Renamed and updated fieldset components in contract deployment forms for consistency.
  * Centralized and simplified cookie and authentication token handling.
  * Removed or relocated obsolete and redundant components and types.

* **Chores**
  * Cleaned up unused files and consolidated constants.
  * Updated and clarified type imports throughout the codebase.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the 08-05-dashboard_file_organization_changes branch from f72c553 to ad2d225 Compare August 4, 2025 21:37
@vercel vercel bot temporarily deployed to Preview – docs-v2 August 4, 2025 21:37 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula August 4, 2025 21:37 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui August 4, 2025 21:37 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb_playground August 4, 2025 21:37 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/@/components/contracts/import-contract/add-to-project-selector.tsx (1)

106-110: Consider improving the empty state check for better safety.

The current check selectedTeam?.projects.length === 0 could be more robust to handle undefined projects array.

Apply this diff for safer empty state checking:

-            {selectedTeam?.projects.length === 0 && (
+            {selectedTeam && (!selectedTeam.projects || selectedTeam.projects.length === 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 f72c553 and ad2d225.

📒 Files selected for processing (207)
  • apps/dashboard/src/@/actions/account/getAccount.ts (1 hunks)
  • apps/dashboard/src/@/actions/stripe-actions.ts (1 hunks)
  • apps/dashboard/src/@/actions/team/createTeam.ts (1 hunks)
  • apps/dashboard/src/@/analytics/report.ts (1 hunks)
  • apps/dashboard/src/@/api/account/get-account.ts (1 hunks)
  • apps/dashboard/src/@/api/account/linked-wallets.ts (1 hunks)
  • apps/dashboard/src/@/api/auth-token.ts (1 hunks)
  • apps/dashboard/src/@/api/contract/fetchDeployMetadata.ts (1 hunks)
  • apps/dashboard/src/@/api/contract/verify-contract.ts (1 hunks)
  • apps/dashboard/src/@/api/project/getSortedDeployedContracts.tsx (1 hunks)
  • apps/dashboard/src/@/api/project/projects.ts (1 hunks)
  • apps/dashboard/src/@/api/team/audit-log.ts (1 hunks)
  • apps/dashboard/src/@/api/team/dedicated-support.ts (1 hunks)
  • apps/dashboard/src/@/api/team/ecosystems.ts (1 hunks)
  • apps/dashboard/src/@/api/team/get-team.ts (1 hunks)
  • apps/dashboard/src/@/api/team/team-invites.ts (1 hunks)
  • apps/dashboard/src/@/api/team/team-members.ts (1 hunks)
  • apps/dashboard/src/@/api/team/verified-domain.ts (1 hunks)
  • apps/dashboard/src/@/components/billing/billing.tsx (1 hunks)
  • apps/dashboard/src/@/components/billing/pricing-card.tsx (1 hunks)
  • apps/dashboard/src/@/components/billing/renew-subscription-button.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/GatedSwitch.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/TokenSelector.tsx (1 hunks)
  • apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx (1 hunks)
  • apps/dashboard/src/@/components/chat/CustomChatButton.tsx (1 hunks)
  • apps/dashboard/src/@/components/chat/CustomChatContent.tsx (1 hunks)
  • apps/dashboard/src/@/components/chat/CustomChats.tsx (1 hunks)
  • apps/dashboard/src/@/components/connect-wallet/index.tsx (1 hunks)
  • apps/dashboard/src/@/components/contract-components/tables/contract-table.stories.tsx (1 hunks)
  • apps/dashboard/src/@/components/contract-components/tables/contract-table.tsx (1 hunks)
  • apps/dashboard/src/@/components/contracts/code-overview.tsx (1 hunks)
  • apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx (2 hunks)
  • apps/dashboard/src/@/components/contracts/contract-table/index.tsx (1 hunks)
  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (2 hunks)
  • apps/dashboard/src/@/components/contracts/import-contract/types.ts (1 hunks)
  • apps/dashboard/src/@/components/contracts/media-cell.tsx (0 hunks)
  • apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx (1 hunks)
  • apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx (1 hunks)
  • apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx (1 hunks)
  • apps/dashboard/src/@/components/project/create-project-modal/index.tsx (1 hunks)
  • apps/dashboard/src/@/components/tx-button/MismatchButton.tsx (1 hunks)
  • apps/dashboard/src/@/constants/cookie.ts (1 hunks)
  • apps/dashboard/src/@/constants/cookies.ts (0 hunks)
  • apps/dashboard/src/@/constants/planToTierRecord.ts (1 hunks)
  • apps/dashboard/src/@/hooks/contract-hooks.ts (1 hunks)
  • apps/dashboard/src/@/hooks/favorite-chains.ts (1 hunks)
  • apps/dashboard/src/@/hooks/useApi.ts (1 hunks)
  • apps/dashboard/src/@/icons/ChainIcon.tsx (1 hunks)
  • apps/dashboard/src/@/storybook/stubs.ts (1 hunks)
  • apps/dashboard/src/@/utils/getValidTeamPlan.tsx (1 hunks)
  • apps/dashboard/src/@/utils/pricing.tsx (1 hunks)
  • apps/dashboard/src/@/utils/resolveAddressAndEns.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/server/FaucetSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-metadata.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/account/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/batch-lazy-mint.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/upload-step.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/components/ContractSourcesPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/client/star-button.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/server/chain-icon.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/default-factory.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/page.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/explore/[category]/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/explore/components/contract-row/index.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/ProfileUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/components/published-contracts.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/contract-metadata-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/modular-contract-default-modules-fieldset.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/royalty-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-functions.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/published-contract.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/contract-header.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/custom-contract.tsx (9 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/components/AccountHeaderUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/devices/AccountDevicesPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/devices/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/overview/AccountTeamsUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/settings/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/wallets/LinkWalletsUI.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/account/wallets/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/api/testnet-faucet/can-claim/route.ts (1 hunks)
  • apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts (2 hunks)
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/add-members/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/_components/plan-selector.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/JoinTeamPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/entry.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/list.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CancelPlanModal.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/Pricing.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemWalletUsersChartCard.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/add-partner/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/add-partner-form.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/integration-permissions-toggle.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/partner-form.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/update-partner-form.client.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/auth-options-section.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/ecosystem-partners-section.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/partners-table.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-partner.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/partners/[partner_id]/edit/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-ecosystem.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/domain-verification.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPageUI.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/updateTeam.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.stories.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/_common.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx (1 hunks)
⛔ Files not processed due to max files limit (37)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/CreateSupportCase.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportCaseDetails.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportTicketForm.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/case-list.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/apis/support.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/cases/[id]/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/create/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/account-abstraction/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AccountAbstractionPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/aa-analytics.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/AccountFactories/factory-contracts.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/SponsorshipPolicies/index.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/SecretKeySection.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/SaveLastUsedProject.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/DeployedContractsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/_utils/getEngineInstancePageMeta.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
💤 Files with no reviewable changes (2)
  • apps/dashboard/src/@/constants/cookies.ts
  • apps/dashboard/src/@/components/contracts/media-cell.tsx
✅ Files skipped from review due to trivial changes (102)
  • apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx
  • apps/dashboard/src/@/utils/pricing.tsx
  • apps/dashboard/src/@/actions/stripe-actions.ts
  • apps/dashboard/src/@/analytics/report.ts
  • apps/dashboard/src/@/components/chat/CustomChats.tsx
  • apps/dashboard/src/@/components/contract-components/tables/contract-table.stories.tsx
  • apps/dashboard/src/@/components/project/create-project-modal/index.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts
  • apps/dashboard/src/@/components/blocks/GatedSwitch.tsx
  • apps/dashboard/src/@/components/chat/CustomChatContent.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.stories.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/server/FaucetSection.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/integration-permissions-toggle.client.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/ProfileUI.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-metadata.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx
  • apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx
  • apps/dashboard/src/@/components/billing/billing.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx
  • apps/dashboard/src/@/hooks/useApi.ts
  • apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/auth-options-section.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/_common.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx
  • apps/dashboard/src/@/icons/ChainIcon.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/list.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx
  • apps/dashboard/src/app/(app)/account/wallets/LinkWalletsUI.stories.tsx
  • apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx
  • apps/dashboard/src/@/components/tx-button/MismatchButton.tsx
  • apps/dashboard/src/app/(app)/account/components/AccountHeaderUI.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx
  • apps/dashboard/src/@/constants/planToTierRecord.ts
  • apps/dashboard/src/@/components/chat/CustomChatButton.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/add-partner/page.tsx
  • apps/dashboard/src/@/components/contract-components/tables/contract-table.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/server/chain-icon.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)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx
  • apps/dashboard/src/@/utils/getValidTeamPlan.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.stories.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/partner-form.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/ecosystem-partners-section.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-partner.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/partners-table.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts
  • apps/dashboard/src/@/api/auth-token.ts
  • apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx
  • apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemWalletUsersChartCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/add-partner-form.client.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/contract-header.tsx
  • apps/dashboard/src/app/(app)/api/testnet-faucet/can-claim/route.ts
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/update-partner-form.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/entry.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.client.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.stories.tsx
  • apps/dashboard/src/app/(app)/account/settings/page.tsx
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/_components/plan-selector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
  • apps/dashboard/src/app/(app)/account/wallets/page.tsx
  • apps/dashboard/src/@/components/contracts/code-overview.tsx
  • apps/dashboard/src/@/components/billing/renew-subscription-button.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/royalty-fieldset.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/domain-verification.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/custom-contract.tsx
  • apps/dashboard/src/@/components/contracts/import-contract/types.ts
🚧 Files skipped from review as they are similar to previous changes (102)
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx
  • apps/dashboard/src/@/api/project/getSortedDeployedContracts.tsx
  • apps/dashboard/src/@/api/account/linked-wallets.ts
  • apps/dashboard/src/@/api/team/audit-log.ts
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/upload-step.tsx
  • apps/dashboard/src/@/api/contract/fetchDeployMetadata.ts
  • apps/dashboard/src/@/api/team/team-members.ts
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx
  • apps/dashboard/src/@/api/team/verified-domain.ts
  • apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/account/page.tsx
  • apps/dashboard/src/@/components/connect-wallet/index.tsx
  • apps/dashboard/src/@/components/billing/pricing-card.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/components/published-contracts.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx
  • apps/dashboard/src/@/api/project/projects.ts
  • apps/dashboard/src/app/(app)/account/devices/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/page.tsx
  • apps/dashboard/src/@/api/team/team-invites.ts
  • apps/dashboard/src/@/actions/team/createTeam.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/partners/[partner_id]/edit/page.tsx
  • apps/dashboard/src/@/components/blocks/TokenSelector.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/updateTeam.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-ecosystem.ts
  • apps/dashboard/src/@/actions/account/getAccount.ts
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx
  • apps/dashboard/src/@/hooks/favorite-chains.ts
  • apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/JoinTeamPage.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/modular-contract-default-modules-fieldset.tsx
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/add-members/page.tsx
  • apps/dashboard/src/@/api/team/ecosystems.ts
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/batch-lazy-mint.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CancelPlanModal.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/default-factory.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx
  • apps/dashboard/src/@/api/account/get-account.ts
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.stories.tsx
  • apps/dashboard/src/@/api/team/dedicated-support.ts
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-functions.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/explore/[category]/page.tsx
  • apps/dashboard/src/@/components/contracts/contract-table/index.tsx
  • apps/dashboard/src/app/(app)/account/devices/AccountDevicesPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx
  • apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/components/ContractSourcesPage.tsx
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/page.tsx
  • apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx
  • apps/dashboard/src/@/utils/resolveAddressAndEns.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts
  • apps/dashboard/src/app/(app)/get-started/team/[team_slug]/layout.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts
  • apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts
  • apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx
  • apps/dashboard/src/@/api/team/get-team.ts
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx
  • apps/dashboard/src/@/constants/cookie.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/Pricing.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/contract-metadata-fieldset.tsx
  • apps/dashboard/src/@/storybook/stubs.ts
  • apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts
  • apps/dashboard/src/@/hooks/contract-hooks.ts
  • apps/dashboard/src/app/(app)/account/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx
  • apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPageUI.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/explore/components/contract-row/index.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/published-contract.tsx
  • apps/dashboard/src/@/api/contract/verify-contract.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.stories.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.tsx
  • apps/dashboard/src/app/(app)/account/layout.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
  • apps/dashboard/src/app/(app)/account/overview/AccountTeamsUI.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx
  • apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/client/star-button.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/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/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
🧠 Learnings (23)
📓 Common learnings
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: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to packages/thirdweb/src/wallets/** : EIP-1193, EIP-5792, EIP-7702 standard support in wallet modules
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to src/extensions/** : Auto-generated contracts from ABI definitions in extensions
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.test.{ts,tsx} : Use `FORKED_ETHEREUM_CHAIN` for mainnet interactions and `ANVIL_CHAIN` for isolated tests
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: in the project-selector.tsx component for contract imports, the addtoproject.mutate() call is intent...
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : always import from the central ui library under `@/components/...
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} : Always import from the central UI library under `@/components/ui/*` – e.g. `import { Button } from "@/components/ui/button"`.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : server components (node edge): start file...
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} : Server Components (Node edge): Start files with `import "server-only";`

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the `projectmeta` prop is not required for the server-rendered `contractdirectlistingspage` componen...
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/shared-direct-listings-page.tsx:47-52
Timestamp: 2025-05-26T16:29:54.317Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractDirectListingsPage` component in the direct listings shared page, following the same pattern as other server components in the codebase where `projectMeta` is only needed for client components.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/components/**/index.ts : group related components in their own folder and 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/**/components/**/index.ts : Group related components in their own folder and expose a single barrel `index.ts` where necessary.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the `projectmeta` prop is not required for the server-rendered `contracttokenspage` component in the...
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/shared-page.tsx:41-48
Timestamp: 2025-05-26T16:28:50.772Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractTokensPage` component in the tokens shared page, unlike some other shared pages where it's needed for consistency.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: configuration files that import and reference react components (like icon components from lucide-rea...
Learnt from: MananTank
PR: thirdweb-dev/js#7768
File: apps/playground-web/src/app/navLinks.ts:1-1
Timestamp: 2025-07-31T16:17:42.753Z
Learning: Configuration files that import and reference React components (like icon components from lucide-react) need the "use client" directive, even if they primarily export static data, because the referenced components need to be executed in a client context when used by other client components.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: in the thirdweb-dev/js repository, lucide-react icons must be imported with the "icon" suffix (e.g.,...
Learnt from: saminacodes
PR: thirdweb-dev/js#7543
File: apps/portal/src/app/pay/page.mdx:4-4
Timestamp: 2025-07-07T21:21:47.488Z
Learning: In the thirdweb-dev/js repository, lucide-react icons must be imported with the "Icon" suffix (e.g., ExternalLinkIcon, RocketIcon) as required by the new linting rule, contrary to the typical lucide-react convention of importing without the suffix.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the modulecarduiprops interface already includes a client prop of type thirdwebclient, so when compo...
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: in the thirdweb/js project, the react namespace is available for type annotations (like react.fc) wi...
Learnt from: MananTank
PR: thirdweb-dev/js#7356
File: apps/nebula/src/app/not-found.tsx:1-1
Timestamp: 2025-06-17T18:30:52.976Z
Learning: In the thirdweb/js project, the React namespace is available for type annotations (like React.FC) without needing to explicitly import React. This is project-specific configuration that differs from typical TypeScript/React setups.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : icons come from `lucide-react` or the project-specific `…/icon...
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} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : client components (browser): begin files ...
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} : Client Components (browser): Begin files with `'use client';`

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to **/*.{ts,tsx} : choose composition over inheritance; leverage utility types (`partial`, `...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.{ts,tsx} : Choose composition over inheritance; leverage utility types (`Partial`, `Pick`, etc.)

Applied to files:

  • apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.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/@/components/contracts/import-contract/add-to-project-selector.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: Unit Tests
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Lint Packages
  • GitHub Check: Build Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (5)
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (5)

16-16: LGTM: Good separation of types into dedicated module.

The import of types from a dedicated ./types module follows good modular organization practices and aligns with the coding guidelines for separating concerns.


18-20: LGTM: Clean and simple separator component.

The SlashSeparator component is well-implemented with appropriate Tailwind styling for a visual separator.


22-27: LGTM: Well-structured component props with proper TypeScript types.

The component props are properly typed and follow the established patterns for selection components in the codebase.


32-33: LGTM: Proper accessibility implementation with useId.

Using useId for form control associations is the correct approach for accessibility compliance.


35-133: LGTM: Well-implemented team and project selector with good UX patterns.

The component correctly:

  • Uses UI primitives from @/components/ui/* as required by coding guidelines
  • Implements proper accessibility with labels and IDs
  • Handles selection state changes appropriately
  • Provides visual feedback for empty states
  • Uses appropriate avatar components for visual consistency

The implementation follows React best practices and the established patterns in the codebase.

@graphite-app graphite-app bot merged commit ad2d225 into main Aug 4, 2025
24 checks passed
@graphite-app graphite-app bot deleted the 08-05-dashboard_file_organization_changes branch August 4, 2025 21:45
@vercel vercel bot temporarily deployed to Production – docs-v2 August 4, 2025 21:45 Inactive
@vercel vercel bot temporarily deployed to Production – nebula August 4, 2025 21:45 Inactive
@vercel vercel bot temporarily deployed to Production – wallet-ui August 4, 2025 21:45 Inactive
@vercel vercel bot temporarily deployed to Production – thirdweb_playground August 4, 2025 21:45 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.

2 participants