-
Notifications
You must be signed in to change notification settings - Fork 549
posthog migration: part 5 #7367
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
Conversation
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the ## Walkthrough
This change removes the custom analytics tracking hook (`useTrack`) and all related event tracking logic from the application. All tracking calls, tracking utility functions, and props related to analytics have been deleted across components, pages, and stories. In a few places, new direct analytics reporting functions are introduced for specific events. The control flow and core functionality remain unchanged except for the removal of analytics side effects.
## Changes
| File(s) / Path(s) | Change Summary |
|-------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
| `apps/dashboard/src/hooks/analytics/useTrack.ts`<br>`apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/_common/tracking.ts`<br>`apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/_common/tracking.ts` | Deleted the custom `useTrack` analytics hook and all tracking data utility functions for NFT and token events. |
| All files importing or using `useTrack` (components, pages, stories, modals, forms, etc.) | Removed all imports, initializations, and calls to `useTrack` and `trackEvent`. Deleted related props and handlers. |
| Onboarding components, stories, and props (e.g., `LoginOrSignup`, `LinkWalletPrompt`, `VerifyEmail`) | Removed all tracking-related props, types, and event calls from component signatures and usages. |
| `apps/dashboard/src/@/analytics/report.ts` | Simplified existing reporting, added new event reporting functions for contract publishing, faucet usage, and chain configuration. |
| `apps/dashboard/src/components/configure-networks/ConfigureNetworks.tsx` | Replaced generic tracking with direct call to new `reportChainConfigurationAdded` function on custom network add. |
| `apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx` | Replaced tracking with new direct call to `reportContractPublished` on publish success; removed attempt/error tracking. |
| `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx` | Replaced tracking with direct call to `reportFaucetUsed` on faucet claim success; removed all other tracking. |
| `apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx`<br>`apps/dashboard/src/components/embedded-wallets/Configure/index.tsx` | Removed `trackingCategory` prop and all tracking logic from smart wallet and embedded wallet settings components. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/cards.tsx` | Removed tracking-related props and logic from `CardLink` and `Cards`. |
| `apps/dashboard/src/components/embedded-wallets/Configure/InAppWalletSettingsUI.stories.tsx`<br>`apps/dashboard/src/components/embedded-wallets/Configure/index.tsx` | Removed all tracking props and logic from embedded wallet settings stories and components. |
| `apps/dashboard/src/components/settings/Account/Billing/CreditsItem.tsx`<br>`apps/dashboard/src/components/onboarding/ApplyForOpCreditsForm.tsx`<br>`apps/dashboard/src/components/onboarding/ApplyForOpCreditsModal.tsx` | Removed all tracking logic from OP sponsorship credits components. |
| `apps/dashboard/src/components/settings/ApiKeys/Create/index.tsx`<br>`apps/dashboard/src/components/settings/AuthorizedWallets/AuthorizedWalletsTable.tsx` | Removed all tracking logic from API key and authorized wallet components. |
| `apps/dashboard/src/components/settings/Account/Notifications.tsx` | Removed tracking on notification preference update; now relies solely on transaction notifications. |
| `apps/nebula/src/@/components/ui/NavLink.tsx`<br>`apps/nebula/src/@/components/blocks/buttons/MismatchButton.tsx`<br>`apps/nebula/src/@/utils/parse-error.tsx`<br>`apps/nebula/src/app/(app)/components/Swap/common.tsx` | Removed or cleaned up commented-out tracking code in Nebula app components. |
| `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page-ui.tsx`<br>`apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/create-token-page.client.tsx` | Added calls to `reportAssetCreationStepConfigured` at UI step transitions in NFT and token creation flows. |
| `apps/dashboard/src/components/contract-components/import-contract/modal.tsx` | Added optional `onSuccess` callback prop to `ImportModal` and `ImportForm` components to notify successful import. |
| All other affected files (various components, modals, forms, and pages) | Removed all tracking logic, props, and utility usage. Updated error handling to use `console.error` where applicable.|
## Sequence Diagram(s)
```mermaid
sequenceDiagram
participant User
participant UI_Component
participant Analytics
User->>UI_Component: Triggers tracked action (e.g., publish, faucet, add chain)
alt New direct reporting (where applicable)
UI_Component->>Analytics: reportContractPublished/reportFaucetUsed/reportChainConfigurationAdded
else No tracking
UI_Component-->>Analytics: (No call, tracking removed)
end Possibly related PRs
Suggested reviewers
|
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
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. |
@coderabbitai review |
✅ Actions performedReview triggered.
|
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #7367 +/- ##
=======================================
Coverage 52.35% 52.35%
=======================================
Files 939 939
Lines 63161 63161
Branches 4217 4217
=======================================
Hits 33070 33070
Misses 29984 29984
Partials 107 107
🚀 New features to boost your workflow:
|
size-limit report 📦
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🔭 Outside diff range comments (11)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/add-admin-button.tsx (1)
68-79
: Early-exit missing when wallet address is invalid
onError
is invoked on an invalid address, but the code continues to callgrantPermissions
, which will inevitably fail (and potentially log sensitive errors). Add areturn
(or surround withelse
) to stop execution.- if (!isAddress(data.walletAddress)) { - onError(new Error("Invalid wallet address")); - } + if (!isAddress(data.walletAddress)) { + onError(new Error("Invalid wallet address")); + return; + }apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/claim-button.tsx (2)
94-101
:transactionCount
is incorrect when an approval tx is requiredWhen
approveTx
exists you actually submit two transactions (approve + claim) buttransactionCount
is hard-coded to1
, so downstream UI components (e.g., progress bars) will under-report.- transactionCount={1} + transactionCount={approveTx ? 2 : 1}
80-84
: Runtime regex may break while_decimals
is loading
pattern={
^\d+(\.\d{1,${_decimals || 18}})?$}
will renderundefined
until the hook resolves, producing an invalid regex like^\\d+(\.\d{1,undefined})?$
. Guard the pattern or fall back to a safe default.- pattern={`^\\d+(\\.\\d{1,${_decimals || 18}})?$`} + pattern={_decimals !== undefined + ? `^\\d+(\\.\\d{1,${_decimals}})?$` + : '^\\d+(\\.\\d{1,18})?$'}apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/burn-tab.tsx (1)
31-41
: Add basic numeric validation foramount
to avoidBigInt
runtime errors
burn1155
converts the user-supplied string toBigInt
without validating that the input is a positive integer.
An empty value, decimals, or non-numeric characters will throw (BigInt
fails on invalid input) and surface as an unhandled exception.-<Input placeholder="1" {...register("amount")} /> +<Input + placeholder="1" + {...register("amount", { + required: "Amount is required", + pattern: { + value: /^[1-9]\d*$/, + message: "Enter a positive integer", + }, + })} +/>This keeps UX consistent with other numeric fields and prevents avoidable crashes.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/claim-tab.tsx (1)
60-76
: Validate thatamount
is positive before creating the transactionThe current custom validator only checks for integer-ness. A user could therefore input
0
or a negative number, leading to a revert on-chain and a wasted transaction fee.- if (!Number.isInteger(valueNum)) { - return "Amount must be an integer"; + if (!Number.isInteger(valueNum) || valueNum <= 0) { + return "Amount must be a positive integer"; }apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx (1)
359-404
: Form stays dirty after successful save – callform.reset
instead ofsetValue
form.setValue("phases", newPhases)
re-assigns fresh object references, soreact-hook-form
still marks the form as dirty. This keeps the “unsaved changes” banner visible even though the data is persisted. Useform.reset
(orresetField
) to synchronise internal state and clear the dirty flags.- const newPhases = d.phases.map((phase) => ({ - ...phase, - isEditing: false, - fromSdk: true, - })); - - form.setValue("phases", newPhases); + const newPhases = d.phases.map((phase) => ({ + ...phase, + isEditing: false, + fromSdk: true, + })); + + // clears dirty state & keeps validation meta intact + form.reset({ phases: newPhases }, { keepValues: true });apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/claim-button.tsx (1)
63-66
:TransactionButton
points to a non-existent form – add anid
TransactionButton
’sform={CLAIM_FORM_ID}
attribute relies on the<form>
element having the sameid
. Without it, the button is detached from form submission semantics (e.g. native validation, Enter-key submit).- <form className="mt-8 flex w-full flex-col gap-3 md:flex-row"> + <form + id={CLAIM_FORM_ID} + className="mt-8 flex w-full flex-col gap-3 md:flex-row" + >Also applies to: 107-115
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx (1)
283-290
: Duplicate push produces two identicalstorage
service entries
serviceToAdd
is pushed inside theif (serviceMeta.name === "storage")
block and again immediately afterwards, resulting in duplicate objects in theservices
array.
This will send malformed payloads to the API and may break the project-settings update.- if (serviceMeta.name === "storage") { - serviceToAdd.actions = serviceMeta.actions as ("read" | "write")[]; - services.push(serviceToAdd); - } - - services.push(serviceToAdd); + if (serviceMeta.name === "storage") { + serviceToAdd.actions = serviceMeta.actions as ("read" | "write")[]; + } + + services.push(serviceToAdd);apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/list-form.tsx (1)
585-597
: Buy-out price is never persisted for auctionsThe input is always bound to
pricePerToken
, but whenlistingType === "auction"
the mutation readsbuyoutPricePerToken
.
Result: every auction is created with a buy-out price of 0, irrespective of what the user enters.- <Input {...form.register("pricePerToken")} /> + <Input + {...form.register( + form.watch("listingType") === "auction" + ? "buyoutPricePerToken" + : "pricePerToken", + )} + />This keeps the direct-listing path intact while correctly wiring the auction field.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page.tsx (1)
127-135
:mutateAsync
fire-and-forget may raise unhandled rejections
addContractToProject.mutateAsync
returns a Promise that is neither awaited nor.catch
-ed.
If the network call fails you’ll get an unhandled rejection in the console, potentially killing React’s render loop in strict mode.- addContractToProject.mutateAsync({ + addContractToProject + .mutateAsync({ teamId: props.teamId, projectId: props.projectId, contractAddress: contractAddress, chainId: collectionInfo.chain, deploymentType: "asset", contractType: ercType === "erc721" ? "DropERC721" : "DropERC1155", - }); + }) + .catch((err) => { + console.error("Failed to register contract in project:", err); + });apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/add-relayer-button.tsx (1)
117-124
: UX: disable the “Add” button while the mutation is in flightCurrently the form can be submitted repeatedly. Disable the button (or the whole form) using
isLoading
fromreact-query
mutation state to prevent duplicate relayer creation requests.- const { mutate: createRelayer } = useEngineCreateRelayer({ + const { mutate: createRelayer, isPending } = useEngineCreateRelayer({ ... - <Button + <Button type="submit" colorScheme="primary" - isDisabled={!form.formState.isValid} + isDisabled={!form.formState.isValid || isPending} + isLoading={isPending} >
🧹 Nitpick comments (63)
apps/dashboard/src/@/components/blocks/pricing-card.tsx (2)
152-156
:cta.onClick
is passed directly – consider a small wrapper for stricter typing
cta.onClick
is declared as() => void
, whilebuttonProps.onClick
expectsReact.MouseEventHandler<HTMLButtonElement>
. Because React’s type definitions are bivariant this compiles, but the variance loophole can hide mistakes (e.g., someone later adds anevent.preventDefault()
insidecta.onClick
and needs theevent
). Wrapping keeps the signature explicit and avoids accidental misuse:- onClick: cta.onClick, + onClick: (e) => { + cta.onClick?.(); // still optional-safe + },
170-174
: Same typing caveat for theLink
element’sonClick
For consistency with the Button case above – and to avoid leaking the
MouseEvent
parameter to a callback that doesn’t expect it – wrap the call similarly:- onClick={cta.onClick} + onClick={(e) => { + cta.onClick?.(); + }}This keeps both call-sites symmetric and future-proof.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/add-admin-button.tsx (1)
77-79
: Avoid leaking details through console logging
console.error(error)
may expose engine URL or auth token in the browser console. Prefer wrapping or redacting the message before logging.apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/add-access-token-button.tsx (1)
52-55
: Redact sensitive data before logging
console.error(error)
can surface the freshly-created access token if the API returns it inside the error object. Either remove the log or strip sensitive fields first.- console.error(error); + // console.error(redact(error));apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/kms-gcp-config.tsx (1)
71-72
: Prefer structured error reporting instead of bareconsole.error
console.error(error)
is helpful during local development but offers little value in production where logs may be discarded or unreachable.
Consider piping the exception into your central error-monitoring solution (e.g. Sentry, Datadog) or at least adding contextual metadata so ops can correlate failures.- console.error(error); + captureException(error, { + component: "KmsGcpConfig", + action: "setGcpKmsConfig", + instanceUrl: instance.url, + });If you deliberately removed analytics tracking, this is a good moment to ensure another mechanism still surfaces runtime errors.
apps/dashboard/src/components/settings/AuthorizedWallets/AuthorizedWalletsTable.tsx (1)
93-108
: Surface error details to the user and monitoring tools
- The toast shows a generic failure message but discards the actual exception. Including the
.message
(or a safe subset) helps users debug quickly.- As with other components, relying solely on
console.error
means losing visibility in production.- toast.error("Something went wrong while revoking the device", { - description: - "Please visit our support site: https://thirdweb.com/support", - }); + toast.error("Failed to revoke device", { + description: (error as Error).message ?? undefined, + }); + + captureException(error, { + component: "AuthorizedWalletsTable", + action: "revokeAuthorizedWallet", + authorizedWalletId: revokeAuthorizedWalletId, + });apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/components/proposal-button.tsx (1)
67-72
: Capture proposal-creation failures more robustly
console.error(error)
silences failures in production UIs. Forward the exception to the same toast (for user context) and to your monitoring pipeline.- onError: (error) => { - console.error(error); - }, + onError: (error) => { + toast.error((error as Error).message); + captureException(error, { + component: "ProposalButton", + action: "createProposal", + contractAddress: contract.address, + }); + },apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/royalties.tsx (1)
101-106
: Avoid double-logging & enrich error context
onError(error)
already triggers the standard notification toast; adding a nakedconsole.error
duplicates noise without extra value.
If additional context is needed, prefer a structured logger or monitoring client:- console.error(error); - onError(error); + onError(error); // already notifies the UI + captureException(error, { + component: "SettingsRoyalties", + action: "setDefaultRoyaltyInfo", + contractAddress: contract.address, + });apps/dashboard/src/components/settings/ApiKeys/Create/index.tsx (1)
221-223
: Expose meaningful error information on project-creation failureRight now users only see “Failed to create a project”. If the backend returns a descriptive message (e.g., duplicate name), surface it:
-onError: () => { - toast.error("Failed to create a project"); +onError: (error) => { + toast.error( + (error as Error).message || "Failed to create a project", + ); + captureException(error, { + component: "CreateProjectForm", + action: "createProject", + }); },This improves UX and keeps observability parity after removing analytics tracking.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/webhooks/components/webhooks-table.tsx (1)
203-204
: Avoid rawconsole.error
in UI code.Directly logging the entire error object to the browser console may expose stack traces or sensitive payloads, and it cannot be filtered/aggregated in production.
Prefer one of the following:- console.error(error); +// Replace with structured logging or send to monitoring service +captureException(error); // Sentry (example) +// or at least: +console.error("[Webhook-delete]", error?.message ?? error);This keeps the console clean and prevents accidental leakage.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/webhooks/components/add-webhook-button.tsx (1)
83-84
: Sanitise or removeconsole.error
.
useTxNotifications
already surfaces the failure to the user, so the extraconsole.error
offers limited value and could reveal request details (URLs, auth headers) in prod consoles.- onError: (error) => { - onError(error); - console.error(error); + onError: (error) => { + onError(error); // already handles user feedback / telemetry + // Optional: captureException(error); // send to monitoring },apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/keypairs-table.tsx (1)
151-154
: Avoid double-logging and leaking stack traces
onError(error)
already surfaces a toast notification; the extra uncontrolledconsole.error(error)
will duplicate the log and may expose internal details in production builds.- onError: (error) => { - onError(error); - console.error(error); - }, + onError,apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/claim-button.tsx (1)
120-131
: Consolidate error handling
onError
inside bothapproveTx
and the main send call do nothing exceptconsole.error
. Consider passing the sharedclaimTokensNotifications.onError
to keep a consistent UX and avoid repeating code.- onError: (error) => { - console.error(error); - }, + onError: claimTokensNotifications.onError,apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/relayers-table.tsx (2)
256-259
: Redundantconsole.error
onError(error)
already shows a toast; the extraconsole.error
duplicates logs.- onError: (error) => { - onError(error); - console.error(error); - }, + onError,
370-373
: Same duplication in revoke flowApply the same cleanup here to avoid double logging.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/mint-form.tsx (1)
121-123
: Drop the secondconsole.error
– error is already logged in thecatch
console.error
here fires inside the mutation’sonError
, and then the same error is logged again in thecatch
block below. One log line is enough.- onError: (error) => { - console.error(error); - }, + onError: () => { + /* handled in catch */ + },apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/wallet-credentials/components/edit-wallet-credential-button.tsx (1)
40-43
: Remove duplicated logging (console.log
vsconsole.error
)Both calls print the same error; keep the
console.error
(with stack trace) and drop the plainconsole.log
to avoid noise.- console.log(error); - console.error(error); + console.error(error);apps/dashboard/src/components/CustomChat/CustomChatContent.tsx (2)
49-55
: Clear thechatAbortController
infinally
to avoid dangling references
setChatAbortController(abortController)
is set before the fetch, but never reset once the request finishes (successfully or with an error).
Keeping the stale controller instance around in state is harmless, yet unnecessary and may cause confusion when debugging multiple parallel chats.} finally { setIsChatStreaming(false); setEnableAutoScroll(false); + // release reference to the finished/aborted request + setChatAbortController(undefined); }
191-192
:messages
in the dependency array causes a re-creation each render
handleFeedback
depends onmessages
, which is recreated on every state update, so the callback is re-instantiated after each message change.
That’s fine functionally but unnecessary. Derive the needed message inside the callback via functionalsetState
, or memoisemessages
if you really need it.
Reducing the dependency list slightly improves render performance.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/lazy-mint-form.tsx (1)
103-110
: Duplicate error handling – console noise
console.error
is executed both in theonError
callback and the outercatch
, resulting in the same stack trace being printed twice.
Drop one of them to keep logs clean.onError: (error) => { - console.error(error); },
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/shared-metadata-form.tsx (1)
92-95
: Same error logged twiceAs in the lazy-mint form, the error is printed in both the
onError
callback and the surroundingcatch
block. Remove one to avoid duplication.- onError: (error) => { - console.error(error); - }, + onError: () => { /* handled in surrounding catch */ },apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/platform-fees.tsx (1)
91-94
: Duplicateconsole.error
The same error is logged here and in
onError(error)
fromuseTxNotifications
, leading to redundant output.- onError: (error) => { - console.error(error); - onError(error); - }, + onError,apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/create-token-page-impl.tsx (1)
103-110
: Log the full error object, not just the parsed message
console.error(errorMessage)
strips stack‐trace/context and is used four times in these catch blocks. Prefer logging the original error (or both) to aid debugging.- console.error(errorMessage); + console.error(e); // preserves stack & metadata + console.error(errorMessage); // optional: keep user-friendly textApply the same change in the three other catch blocks for consistency.
Also applies to: 150-152, 208-210, 284-286
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx (1)
108-111
: Include stack trace when logging mint errorsSame note as above – log the raw
error
object before (or in addition to) any derived messaging to avoid losing context.- console.error(error); + console.error(error); // full stackMinor, but helpful during on-call debugging.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/import-backend-wallet-button.tsx (1)
93-96
: Retain original error details in logsLogging only
error
is good. Consider adding structured data (e.g.,instance.url
,walletType
) to speed up incident triage, but fine to defer.apps/dashboard/src/components/pay/RouteDiscovery.tsx (1)
90-97
: Disable the submit button when the form is invalid, not only when it’s pristine
disabled: !form.formState.isDirty
blocks submission on untouched forms, but allows submission when fields are dirty yet invalid (e.g. empty token address). Prefer!form.formState.isValid
(withmode: "onChange"
or"all"
) to reflect actual validity.- disabled: !form.formState.isDirty, + disabled: !form.formState.isValid,Remember to initialise the form with
mode: "onChange"
to get real-time validity updates:- const form = useForm<RouteDiscoveryValidationSchema>({ + const form = useForm<RouteDiscoveryValidationSchema>({ resolver: zodResolver(routeDiscoveryValidationSchema), + mode: "onChange",apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/add-keypair-button.tsx (1)
80-95
: Missing client-side validation of the public key
onClick
fires the mutation with whatever is inpublicKey
, but there’s no quick validation that the textarea actually contains a PEM-encoded public key for the selected algorithm. A simple length / header-footer check avoids round-trips and gives instant feedback.const onClick = async () => { + if (!publicKey.startsWith("-----BEGIN PUBLIC KEY-----") || + !publicKey.trim().endsWith("-----END PUBLIC KEY-----")) { + onError(new Error("Invalid public key format")); + return; + } + try { await importKeypair({ publicKey,apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/claim-button.tsx (1)
90-100
: Numeric validation should ensure a positive integer and usetype="number"
The current validator only checks for an integer. Negative or zero amounts pass. Also, using an explicit number input gives users native mobile keyboards and prevents non-numeric characters.- <Input - type="text" + <Input + type="number" {...register("amount", { validate: (value) => { const valueNum = Number(value); - if (!Number.isInteger(valueNum)) { - return "Amount must be an integer"; + if (!Number.isInteger(valueNum) || valueNum <= 0) { + return "Amount must be a positive integer"; } }, })}apps/dashboard/src/app/(app)/login/onboarding/account-onboarding-ui.tsx (1)
43-46
: Consider using an explicit reducer for multi-step onboarding
As the number of onboarding states grows, nested objects withbackScreen
references become harder to reason about. AuseReducer
with explicit action types (NEXT
,BACK
,RESET
) will centralise transitions and avoid deep object copies.No immediate bug – just a maintainability consideration.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/create-backend-wallet-button.tsx (1)
71-80
: Reduce duplicate error surfacing & tighten logging
toast.promise()
already surfaces the rejected promise with the"Failed to create wallet"
message, anduseEngineCreateBackendWallet
will throw in that case.
The additionalonError
handler therefore:
- Logs the same error twice (toast + console).
- Costs an extra callback that brings no state change.
Unless you plan to forward the error to a central logger (e.g. Sentry), consider dropping the callback or enriching the log.
- onError: (error) => { - console.error(error); - }, + // Let toast.promise handle UI feedback. + // Forward to external error logger here if needed.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/primary-sale.tsx (1)
90-94
: Unnecessary extraconsole.error
useTxNotifications.onError()
already turns the exception into a toast.
The extraconsole.error
is fine in dev but can spam production logs.- onError: (error) => { - console.error(error); - onError(error); - }, + onError,apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/admins-table.tsx (1)
165-168
: Prefer one-shot error handling instead of rawconsole.error
Both mutation handlers already feed into
useTxNotifications.onError
, so the explicitconsole.error
duplicates noise without adding context.
If you need structured logging, consider a shared logger; otherwise drop the call.- onError: (error) => { - onError(error); - console.error(error); - }, + onError,Also applies to: 241-244
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/circle-config.tsx (1)
48-54
: Avoid double-logging errors
toast.error
already informs the user; the extraconsole.error
can be removed or replaced with a structured logger.- toast.error("Failed to set configuration", { - description: error.message, - }); - console.error(error); + toast.error("Failed to set configuration", { + description: error.message, + });apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx (2)
313-317
: Prefer structured logging & user feedback over bareconsole.error
toast.error
already informs the user; an additional nakedconsole.error(err)
spams the browser console and leaks raw error objects in prod.
Consider piping errors to a central logger/Sentry instead, or remove the extra statement.
946-949
: Sameconsole.error
concern applies hereSee comment above – logging the raw error for delete-project failures should go through a proper logger.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/access-tokens-table.tsx (2)
173-181
: Surface error to the user, not just the console
onError
already shows a toast, so emittingconsole.error(error)
is redundant for production.
Route the error to a telemetry pipeline or remove the call.
249-257
: Ditto for delete flowSame remark as above – consider dropping or replacing direct console logging.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/update-metadata-form.tsx (1)
160-166
: Lost toast on tx-level failure
sendAndConfirmTx.mutateAsync
’sonError
only prints to the console now. The user only sees a toast if the promise rejects (caught in the outercatch
).
For immediate feedback keep the toast insideonError
as well:- onError: (error) => { - console.error(error); - }, + onError: (error) => { + console.error(error); + updateMetadataNotifications.onError(error); + },apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/wallet-credentials/components/create-wallet-credential-button.tsx (1)
28-35
: Replace raw console logging with structured reportingAs elsewhere, the rejection path only logs to the console. Consider forwarding to a central logger or removing to avoid leaking stack traces.
apps/dashboard/src/app/(app)/login/onboarding/LinkWalletPrompt/LinkWalletPrompt.tsx (1)
24-31
: Add user feedback on success and surface precise errorsYou notify the parent via
onLinkWalletRequestSent
, but the user never sees an explicit confirmation toast, while failures get only a generic message.- onSuccess: () => { - props.onLinkWalletRequestSent(); - }, - onError: (err) => { - const error = err as Error; - console.error(error); - toast.error("Failed to send link wallet request"); - }, + onSuccess: () => { + toast.success("Link-wallet email sent"); + props.onLinkWalletRequestSent(); + }, + onError: (err) => { + console.error(err); + toast.error(err instanceof Error ? err.message : "Failed to send link wallet request"); + },Tiny UX win and more helpful diagnostics.
apps/dashboard/src/app/(app)/login/onboarding/LoginOrSignup/LoginOrSignup.tsx (1)
44-65
:isExistingEmail
is hard-coded tofalse
on every successIf the backend chooses whether the email is new or existing, the callback currently mis-informs the next step. Consider making the API return that flag (or inspect the current
tab
state) instead of assuming.- onSuccess: () => { - props.onRequestSent({ - email: values.email, - isExistingEmail: false, - }); + onSuccess: (data) => { + props.onRequestSent({ + email: values.email, + // derive this from API or the current tab + isExistingEmail: tab === "login", + });Ensures the subsequent flow shows the correct UI.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx (1)
121-124
: Analytics call should not block UI in case of network hiccups
reportFaucetUsed
is synchronous now, but if it ever becomes async and throws, it would bubble into React Query’sonSuccess
chain. Wrap it defensively:onSuccess: () => { - reportFaucetUsed({ chainId }); + try { + reportFaucetUsed({ chainId }); + } catch { + // non-blocking + } },Keeps the happy path resilient.
apps/dashboard/src/components/configure-networks/ConfigureNetworks.tsx (1)
29-35
: Confirm path alias & payload size
../../@/analytics/report
relies on the@
directory living atsrc/@
. If the alias ever moves, TS won’t help because this is a relative import—consider using the established alias import (@/analytics/report
) for consistency.
rpcURLs
can be large; PostHog payloads have a 32 kB limit. Trim/limit length if users enter many URLs.-import { reportChainConfigurationAdded } from "../../@/analytics/report"; +import { reportChainConfigurationAdded } from "@/analytics/report";apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/components/delegate-button.tsx (1)
44-49
: Console log could leak stack-traces; surface the message to the user & add context.
console.error(error);
is handy while developing but (a) it does not surface anything useful to the end-user beyond the generic toast you already show, and (b) stack traces might leak internals in production logs.- console.error(error); + console.error("Failed to delegate tokens:", error); + // Optionally surface the specific reason to the user + // toast.error(error.message ?? "Unknown error");If you want to keep silent logs, consider routing through a central logger instead of
console.*
.apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx (1)
265-273
: Include a fallback publisher identifier for better analytics fidelity.
ensNameOrAddress
can be empty – sending""
gives you an anonymous publisher in PostHog.
Consider falling back to the wallet address to preserve attribution.- publisher: ensNameOrAddress ?? "", + publisher: ensNameOrAddress ?? account?.address ?? "",apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/backend-wallets-table.tsx (2)
331-338
: Prefer descriptive log messages over naked errors.- console.error(error); + console.error("Failed to update backend wallet label:", error);A tiny improvement that eases production log grepping.
640-647
: Same remark here – add context to the error log.- console.error(error); + console.error("Failed to delete backend wallet:", error);Consistent, contextual logs make post-mortems quicker.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/claim-tokens/claim-tokens-ui.tsx (1)
46-46
: Please remove stale TODO or open a tracking ticket.The comment still references figuring out tracking, but all PostHog-related tracking was intentionally removed in this PR. Leaving the TODO here is misleading.
-// TODO figure out proper tracking for this that helps us drive this product forward +// (tracking removed – no longer applicable)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/contract-subscriptions/components/add-contract-subscription-button.tsx (1)
140-143
: Avoid leaking errors only to the console – surface them to monitoring.
console.error
is fine during development, but production UIs often suppress console output.
Consider forwarding the error to a central logger / Sentry so failures are observable.- console.error(error); + // TODO: send to central error reporter so ops can track failures + console.error(error);apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch/launch-nft.tsx (1)
205-213
: Same logging remark as above – integrate with unified error reporting.
console.error(parsedError)
is easy to miss in prod.
Hook this into whatever observability tool the dashboard uses (Sentry, LogRocket, etc.).apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/components/distribute-button.tsx (1)
58-60
: Consider structured error reporting instead of plainconsole.error
.For consistency and easier debugging, forward the error to a shared logger before/after calling
onError
.apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page.tsx (1)
52-56
: Shadowing thechain
identifier hampers readabilityWithin
getContractAndAccount
,chain
is declared twice (parameter vs. localconst chain = …
).
While not technically wrong, the shadowing forces readers to double-take. Consider renaming the inner variable to something likeresolvedChain
ortargetChain
to make intent crystal-clear.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-edition-drop/buy-edition-drop.client.tsx (1)
113-116
: RepeatedparseError
+console.error
blocks could be centralisedThe same three-liner appears in three different catch scopes. A tiny helper like
logParsedError(err)
would DRY things up and avoid accidental divergence.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-nft-drop/buy-nft-drop.client.tsx (1)
70-73
: Ditto on duplicated error-handlingSame recommendation as the Edition-Drop component—factor out repetitive error logging to keep the happy-path logic readable.
apps/dashboard/src/components/embedded-wallets/Configure/index.tsx (2)
56-60
:UpdateAPIKeyTrackingData
is now dead codeTracking is gone, but the helper type lingers. Prune it to avoid confusion.
-type UpdateAPIKeyTrackingData = { - hasCustomBranding: boolean; - hasCustomJwt: boolean; - hasCustomAuthEndpoint: boolean; -};
230-239
: Stale tracking parameter still propagated
props.updateApiKey
is invoked with a second argument (trackingData
) that no longer serves any purpose.
Either drop the extra argument here or update the prop’s signature to reflect its obsolescence—keeping both mismatched increases mental overhead.- props.updateApiKey( - { - services: newServices, - }, - { - hasCustomBranding: !!branding, - hasCustomJwt: !!customAuthentication, - hasCustomAuthEndpoint: !!customAuthEndpoint, - }, - ); + props.updateApiKey({ + services: newServices, + });apps/dashboard/src/@/analytics/report.ts (1)
25-43
: Consider normalising event names & payloadsThe new helpers are great, but we now have mixed styles:
reportContractDeployed
passes the payload raw.reportFaucetUsed
re-maps its props inline.Consistent shape (either always spread incoming props or always re-map) will make the API easier to remember and reduce mistakes.
apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.tsx (2)
22-32
: Remove the now-unusedaccountAddress
prop
accountAddress
is no longer referenced inside the component after the tracking clean-up. Keeping unused props invites confusion and triggers lint warnings.- accountAddress: string;
Unless this value is still consumed by callers, consider pruning it from both the prop type and all call-sites.
160-168
: Drop the obsolete"trackingAction"
key fromOmit
VerifyEmailProps
no longer containstrackingAction
, yet it is still listed in theOmit
utility. While TypeScript allows extraneous keys, removing it tightens intent and avoids future head-scratching.- props: Omit<VerifyEmailProps, "title" | "trackingAction">, + props: Omit<VerifyEmailProps, "title">,apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/contract-subscriptions/components/contract-subscriptions-table.tsx (2)
374-382
: Use a centralized logger instead ofconsole.error
Direct
console.error
calls make it hard to aggregate and search production issues. If you already have a unified logging/monitoring solution (e.g. Sentry, Datadog), delegate to it here.- onError(error); - console.error(error); + onError(error); // toast / UI feedback + log.error(error); // centralised telemetry(Substitute
log.error
with whatever logger the dashboard uses.)
368-378
: Minor readability: avoid shadowing theonSuccess
/onError
variables
mutate
’s options already use the keysonSuccess
andonError
; re-using the same identifiers from the outer scope can be momentarily confusing.- onSuccess: () => { - onSuccess(); + onSuccess: () => { + notifySuccess(); ... - onError: (error) => { - onError(error); + onError: (error) => { + notifyError(error);A simple rename clarifies the data-flow without functional changes.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/add-relayer-button.tsx (1)
120-126
: Replaceconsole.error
with structured loggingSame concern as in the subscriptions modal—prefer the project’s logging utility over raw
console.error
to keep error reporting consistent.- onError(error); - console.error(error); + notifyError(error); // existing toast/helper + log.error(error); // centralised telemetryapps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/PayModal.tsx (1)
19-23
: Addtype="button"
to non-form buttonsAlthough this button is not inside a
<form>
today, addingtype="button"
prevents accidental form submission if the component is ever reused within a<form>
.- <Button variant="primary" className="w-full"> + <Button variant="primary" type="button" className="w-full">
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (108)
apps/dashboard/src/@/analytics/report.ts
(2 hunks)apps/dashboard/src/@/components/blocks/pricing-card.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx
(4 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/PayModal.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/cancel-tab.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/list-form.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx
(0 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]/nfts/[tokenId]/components/airdrop-tab.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/burn-tab.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/claim-tab.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/mint-supply-tab.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/transfer-tab.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/update-metadata-form.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/claim-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/lazy-mint-form.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/mint-form.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/reveal-button.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/shared-metadata-form.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/Analytics.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/components/index.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/components/delegate-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/components/proposal-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/claim-tokens/claim-tokens-ui.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-edition-drop/buy-edition-drop.client.tsx
(6 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-nft-drop/buy-nft-drop.client.tsx
(5 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/metadata.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/platform-fees.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/primary-sale.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/royalties.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/components/distribute-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/airdrop-form.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/burn-button.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/claim-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/mint-button.tsx
(0 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/transfer-button.tsx
(0 hunks)apps/dashboard/src/app/(app)/account/contracts/DeployedContractsPageHeader.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/contracts/_components/DeployViaCLIOrImportCard.tsx
(1 hunks)apps/dashboard/src/app/(app)/login/onboarding/LinkWalletPrompt/LinkWalletPrompt.stories.tsx
(0 hunks)apps/dashboard/src/app/(app)/login/onboarding/LinkWalletPrompt/LinkWalletPrompt.tsx
(1 hunks)apps/dashboard/src/app/(app)/login/onboarding/LoginOrSignup/LoginOrSignup.stories.tsx
(0 hunks)apps/dashboard/src/app/(app)/login/onboarding/LoginOrSignup/LoginOrSignup.tsx
(1 hunks)apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.stories.tsx
(0 hunks)apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.tsx
(2 hunks)apps/dashboard/src/app/(app)/login/onboarding/account-onboarding-ui.tsx
(1 hunks)apps/dashboard/src/app/(app)/login/onboarding/account-onboarding.stories.tsx
(0 hunks)apps/dashboard/src/app/(app)/login/onboarding/account-onboarding.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/invite-team-members-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/cards.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/_common/step-card.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/_common/tracking.ts
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page.tsx
(6 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch/launch-nft.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/upload-nfts/upload-nfts.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/_common/tracking.ts
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/create-token-page-impl.tsx
(4 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/launch/launch-token.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/account-abstraction/settings/page.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/send-test-tx.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/create-server-wallet.client.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/create-vault-account.client.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/list-access-tokens.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/rotate-admin-key.client.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx
(0 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/access-tokens-table.tsx
(4 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/add-access-token-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/add-keypair-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/keypairs-table.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/add-admin-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/admins-table.tsx
(4 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/circle-config.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/kms-aws-config.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/kms-gcp-config.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/contract-subscriptions/components/add-contract-subscription-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/contract-subscriptions/components/contract-subscriptions-table.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/backend-wallets-table.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/create-backend-wallet-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/import-backend-wallet-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/add-relayer-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/relayers-table.tsx
(4 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/wallet-credentials/components/create-wallet-credential-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/wallet-credentials/components/edit-wallet-credential-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/webhooks/components/add-webhook-button.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/webhooks/components/webhooks-table.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx
(3 hunks)apps/dashboard/src/components/CustomChat/CustomChatButton.tsx
(0 hunks)apps/dashboard/src/components/CustomChat/CustomChatContent.tsx
(3 hunks)apps/dashboard/src/components/configure-networks/ConfigureNetworks.tsx
(2 hunks)apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx
(2 hunks)apps/dashboard/src/components/embedded-wallets/Configure/InAppWalletSettingsUI.stories.tsx
(0 hunks)apps/dashboard/src/components/embedded-wallets/Configure/index.tsx
(1 hunks)apps/dashboard/src/components/onboarding/ApplyForOpCreditsForm.tsx
(0 hunks)apps/dashboard/src/components/onboarding/ApplyForOpCreditsModal.tsx
(0 hunks)apps/dashboard/src/components/pay/PayConfig.tsx
(0 hunks)apps/dashboard/src/components/pay/RouteDiscovery.tsx
(1 hunks)apps/dashboard/src/components/settings/Account/Billing/CreditsItem.tsx
(0 hunks)apps/dashboard/src/components/settings/Account/Notifications.tsx
(1 hunks)apps/dashboard/src/components/settings/ApiKeys/Create/index.tsx
(2 hunks)apps/dashboard/src/components/settings/AuthorizedWallets/AuthorizedWalletsTable.tsx
(1 hunks)apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx
(1 hunks)apps/dashboard/src/hooks/analytics/useTrack.ts
(0 hunks)apps/nebula/src/@/components/blocks/buttons/MismatchButton.tsx
(0 hunks)apps/nebula/src/@/components/ui/NavLink.tsx
(0 hunks)apps/nebula/src/@/utils/parse-error.tsx
(0 hunks)apps/nebula/src/app/(app)/components/Swap/common.tsx
(1 hunks)
💤 Files with no reviewable changes (36)
- apps/dashboard/src/components/embedded-wallets/Configure/InAppWalletSettingsUI.stories.tsx
- apps/dashboard/src/app/(app)/login/onboarding/LoginOrSignup/LoginOrSignup.stories.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/account-abstraction/settings/page.tsx
- apps/dashboard/src/app/(app)/login/onboarding/account-onboarding.stories.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/mint-button.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/rotate-admin-key.client.tsx
- apps/nebula/src/@/utils/parse-error.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/reveal-button.tsx
- apps/dashboard/src/components/onboarding/ApplyForOpCreditsForm.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/connect/in-app-wallets/settings/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/transfer-button.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/airdrop-tab.tsx
- apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.stories.tsx
- apps/dashboard/src/components/onboarding/ApplyForOpCreditsModal.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/create-server-wallet.client.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx
- apps/nebula/src/@/components/ui/NavLink.tsx
- apps/dashboard/src/app/(app)/login/onboarding/account-onboarding.tsx
- apps/dashboard/src/components/CustomChat/CustomChatButton.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/create-vault-account.client.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/metadata.tsx
- apps/dashboard/src/app/(app)/login/onboarding/LinkWalletPrompt/LinkWalletPrompt.stories.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)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/transfer-tab.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/_common/step-card.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/components/index.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/burn-button.tsx
- apps/dashboard/src/components/settings/Account/Billing/CreditsItem.tsx
- apps/dashboard/src/components/pay/PayConfig.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/launch/launch-token.tsx
- apps/nebula/src/@/components/blocks/buttons/MismatchButton.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/cancel-tab.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/mint-supply-tab.tsx
- apps/dashboard/src/hooks/analytics/useTrack.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/_common/tracking.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/_common/tracking.ts
🧰 Additional context used
🧬 Code Graph Analysis (4)
apps/dashboard/src/components/configure-networks/ConfigureNetworks.tsx (1)
apps/dashboard/src/@/analytics/report.ts (1)
reportChainConfigurationAdded
(191-207)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/PayModal.tsx (1)
packages/thirdweb/src/react/web/ui/components/buttons.tsx (1)
Button
(19-140)
apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx (1)
apps/dashboard/src/@/analytics/report.ts (1)
reportContractPublished
(35-42)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx (1)
apps/dashboard/src/@/analytics/report.ts (1)
reportFaucetUsed
(171-177)
⏰ Context from checks skipped due to timeout of 90000ms (7)
- GitHub Check: Graphite / mergeability_check
- GitHub Check: E2E Tests (pnpm, webpack)
- GitHub Check: E2E Tests (pnpm, esbuild)
- GitHub Check: Size
- GitHub Check: Unit Tests
- GitHub Check: Build Packages
- GitHub Check: Lint Packages
🔇 Additional comments (18)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/send-test-tx.client.tsx (1)
47-51
: Removal ofuseTrack
looks safeThe hook deletion does not affect runtime logic, and no other side-effects were introduced.
Good clean-up.apps/dashboard/src/app/(app)/account/contracts/_components/DeployViaCLIOrImportCard.tsx (1)
5-6
: Import clean-up is fine
useTrack
removal has no behavioural impact here.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/invite-team-members-button.tsx (1)
9-14
: LGTM – tracking removal onlyThe button now simply routes to the member settings page with no analytics side-effects.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/list-access-tokens.client.tsx (1)
33-33
: Removal of analytics hook looks good.The
useTrack
cleanup introduces no functional or type-safety issues in this component.
Nothing else changed in this hunk.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/Analytics.tsx (1)
11-11
: Analytics hook removal confirmed.The import removal is consistent with the PostHog deprecation. No further action needed.
apps/dashboard/src/app/(app)/account/contracts/DeployedContractsPageHeader.tsx (1)
41-46
: Looks good – removal of analytics side-effect is completeNo functional impact; the button now purely toggles the modal.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/airdrop-form.tsx (1)
48-58
: 👍 Removal of tracking code is cleanNo behavioural change; error handling remains intact.
apps/dashboard/src/components/CustomChat/CustomChatContent.tsx (1)
135-136
: Missing dependency:props.client
is read inside the componentThe dependency array now omits
props.client
, but the hook uses it in JSX further down (<CustomChats … client={props.client} />
and<ChatBar … client={props.client} />
).
While React guarantees prop-stability for the same object reference, it’s safer (and prevents future bugs) to include it explicitly.- [props.authToken, props.clientId, props.teamId, sessionId], + [props.authToken, props.client, props.clientId, props.teamId, sessionId],apps/nebula/src/app/(app)/components/Swap/common.tsx (1)
1-7
: Removal of unused tracking import looks goodThe diff only reflects the removal of an (empty) line that previously held a
useTrack
import. No functional impact, and unused code was cleaned up.apps/dashboard/src/components/settings/Account/Notifications.tsx (1)
36-39
: Nice simplification of mutation callbacksPassing the existing
onSuccess
/onError
handlers directly keeps the component lean and removes now-unused tracking noise.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx (1)
20-20
: Import change looks goodThe updated import keeps the typings intact and removes the unused tracking utilities. No further action needed.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx (1)
208-211
: Clarify paid-plan messageThe button text mentions “Starter, Growth, Scale and Pro”, but “Scale” was newly added. Double-check marketing copy for consistency elsewhere (pricing pages, FAQs).
apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx (1)
261-269
: Mutation callbacks look good after tracking removal.Forwarding
onSuccess
/onError
directly keeps existing UX unchanged – no further action needed.apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/cards.tsx (1)
70-82
: Event handler removal is fine – keyboard fallback still works.With
onClick
now directly wired, theonKeyDown
check still guarantees keyboard accessibility. No additional changes required.apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx (1)
1-3
: Good move to centralised analytics helper.Importing
reportContractPublished
keeps event semantics explicit and removes genericuseTrack
noise. 👍apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/claim-tokens/claim-tokens-ui.tsx (1)
34-34
: Looks good – hook migration is correct.
useActiveAccount
+useSendTransaction
is the right pair after the SDK refactor. No issues spotted.apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/upload-nfts/upload-nfts.tsx (1)
59-60
: Passing callbacks directly keeps the component pure – nice.Forwarding
onNext
/onPrev
without side-effect wrappers simplifies the component and removes hidden analytics dependencies. 👍Also applies to: 76-77
apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.tsx (1)
35-41
: Double-checkvalues
vsdefaultValues
inuseForm
React-Hook-Form’s stable API still expects
defaultValues
; the newervalues
option is experimental and gated behind theshouldUseFormState
flag. If your project isn’t on that canary release, this will silently drop the initial value and may break type-safety.- values: { + defaultValues: { confirmationToken: "", },Please verify your RHF version or switch to
defaultValues
to stay on the safe side.
...(sidebar)/engine/dedicated/(instance)/[engineId]/configuration/components/kms-aws-config.tsx
Outdated
Show resolved
Hide resolved
cba391f
to
019fe14
Compare
019fe14
to
20cb255
Compare
57a8fec
to
8fe1dca
Compare
f005dd2
to
74ce5f7
Compare
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bug: Error Handling Bug in Multiple UI Components
The parseError()
function returns string | JSX.Element
, but its result is now directly passed to reportAssetBuyFailed()
's error
parameter and toast.error()
's description
, both expecting a string
. The removed type check (typeof errorMessage === "string" ? errorMessage : "Unknown error"
) previously prevented this. This can cause runtime errors when parseError()
returns a JSX.Element
. This issue affects buy-nft-drop.client.tsx
, buy-edition-drop.client.tsx
, and similar error handling in claim-tokens-ui.tsx
, create-nft-page.tsx
, create-token-page-impl.tsx
, launch-nft.tsx
, and launch-token.tsx
.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-nft-drop/buy-nft-drop.client.tsx#L110-L135
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-edition-drop/buy-edition-drop.client.tsx#L168-L181
Bug: Type Mismatch in Error Reporting
The parseError
utility can return string | JSX.Element
, but its result is directly passed to reportAssetCreationFailed
, which expects a string. This omits a necessary type check, potentially causing type or runtime errors when a JSX.Element
is returned.
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page.tsx#L151-L162
Was this report helpful? Give feedback by reacting with 👍 or 👎
Merge activity
|
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added event reporting for contract publishing, faucet usage, and custom chain configuration additions. - Introduced detailed event reporting for asset purchases, creations, imports, and configuration steps. - **Refactor** - Replaced legacy analytics tracking hooks with centralized reporting functions for key user actions. - Updated asset creation flows to report step transitions and outcomes with enhanced detail. - **Bug Fixes** - Clarified faucet claim restriction text to include the "Scale" plan alongside other eligible plans. - **Chores** - Removed all legacy analytics tracking hooks and event calls across the dashboard. - Simplified event reporting by eliminating unused tracking utilities and hooks without affecting user workflows. <!-- end of auto-generated comment: release notes by coderabbit.ai --> <!-- start pr-codex --> --- ## PR-Codex overview This PR focuses on removing the `useTrack` analytics hook from various components and replacing it with direct logging or removing tracking functionality entirely. ### Detailed summary - Deleted `useTrack` imports and instances from multiple files. - Removed tracking-related code from components such as `LinkWalletPrompt`, `LoginOrSignup`, and `StepCard`. - Replaced tracking calls with direct logging in error handling. - Adjusted various components to eliminate unnecessary tracking. > The following files were skipped due to too many changes: `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/vault/components/list-access-tokens.client.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/primary-sale.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/mint-form.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/mint-supply-tab.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/wallet-credentials/components/edit-wallet-credential-button.tsx`, `apps/dashboard/src/@/components/blocks/pricing-card.tsx`, `apps/dashboard/src/components/embedded-wallets/Configure/index.tsx`, `apps/dashboard/src/components/onboarding/ApplyForOpCreditsForm.tsx`, `apps/dashboard/src/components/settings/AuthorizedWallets/AuthorizedWalletsTable.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/components/platform-fees.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/update-metadata-form.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/burn-tab.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/shared-metadata-form.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/components/airdrop-tab.tsx`, `apps/dashboard/src/components/configure-networks/ConfigureNetworks.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/airdrop-form.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/burn-button.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/transfer-button.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/overview/components/backend-wallets-table.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/claim-button.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/admins/components/admins-table.tsx`, `apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/relayers/components/relayers-table.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/access-tokens/components/access-tokens-table.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/components/claim-button.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/PayModal.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx`, `apps/dashboard/src/app/(app)/login/onboarding/account-onboarding-ui.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/upload-nfts/upload-nfts.tsx`, `apps/dashboard/src/components/CustomChat/CustomChatContent.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]/(chainPage)/components/client/FaucetButton.tsx`, `apps/dashboard/src/components/contract-components/contract-publish-form/index.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/cards.tsx`, `apps/dashboard/src/app/(app)/login/onboarding/VerifyEmail/VerifyEmail.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/launch/launch-nft.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/launch/launch-token.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-nft-drop/buy-nft-drop.client.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/claim-tokens/claim-tokens-ui.tsx`, `apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/nft/overview/buy-edition-drop/buy-edition-drop.client.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/token/create-token-page-impl.tsx`, `apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/assets/create/nft/create-nft-page.tsx`, `apps/dashboard/src/@/analytics/report.ts` > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` <!-- end pr-codex -->
74ce5f7
to
2aa9ce5
Compare
56caeaa
to
1397adf
Compare
Summary by CodeRabbit
New Features
Refactor
Bug Fixes
Chores
PR-Codex overview
This PR primarily focuses on removing the
useTrack
hook from various components and replacing it with alternative tracking methods or removing tracking functionality altogether.Detailed summary
useTrack
hook usages in multiple components.reportAssetCreationStepConfigured
for specific asset creation tracking.