dydx-v4-web/src/constants/analytics.ts

178 lines
5.5 KiB
TypeScript

import type { SupportedLocales } from './localization';
import type { DydxNetwork } from './networks';
import type { OnboardingState, OnboardingSteps } from './account';
import type { DydxAddress, WalletType, WalletConnectionType, EvmAddress } from './wallets';
import type { DialogTypes } from './dialogs';
import type { TradeTypes } from './trade';
import type { AbacusApiStatus, HumanReadablePlaceOrderPayload } from './abacus';
// User properties
export enum AnalyticsUserProperty {
// Environment
Locale = 'selectedLocale',
Breakpoint = 'breakpoint',
// Network
Network = 'network',
// Wallet
WalletType = 'walletType',
WalletConnectionType = 'walletConnectionType',
WalletAddress = 'walletAddress',
// Account
DydxAddress = 'dydxAddress',
SubaccountNumber = 'subaccountNumber',
}
export type AnalyticsUserPropertyValue<T extends AnalyticsUserProperty> =
// Environment
T extends AnalyticsUserProperty.Breakpoint
? 'MOBILE' | 'TABLET' | 'DESKTOP_SMALL' | 'DESKTOP_MEDIUM' | 'DESKTOP_LARGE' | 'UNSUPPORTED'
: T extends AnalyticsUserProperty.Locale
? SupportedLocales
: // Network
T extends AnalyticsUserProperty.Network
? DydxNetwork
: // Wallet
T extends AnalyticsUserProperty.WalletType
? WalletType | undefined
: T extends AnalyticsUserProperty.WalletConnectionType
? WalletConnectionType | undefined
: T extends AnalyticsUserProperty.WalletAddress
? EvmAddress | DydxAddress | undefined
: // Account
T extends AnalyticsUserProperty.DydxAddress
? DydxAddress | undefined
: T extends AnalyticsUserProperty.SubaccountNumber
? number | undefined
: undefined;
// Events
export enum AnalyticsEvent {
// App
AppStart = 'AppStart',
NetworkStatus = 'NetworkStatus',
// Navigation
NavigatePage = 'NavigatePage',
NavigateDialog = 'NavigateDialog',
NavigateDialogClose = 'NavigateDialogClose',
NavigateExternal = 'NavigateExternal',
// Wallet
ConnectWallet = 'ConnectWallet',
DisconnectWallet = 'DisconnectWallet',
// Onboarding
OnboardingStepChanged = 'OnboardingStepChanged',
OnboardingAccountDerived = 'OnboardingAccountDerived',
OnboardingWalletIsNonDeterministic = 'OnboardingWalletIsNonDeterministic',
// Transfers
TransferFaucet = 'TransferFaucet',
TransferFaucetConfirmed = 'TransferFaucetConfirmed',
TransferDeposit = 'TransferDeposit',
TransferWithdraw = 'TransferWithdraw',
// Trading
TradeOrderTypeSelected = 'TradeOrderTypeSelected',
TradePlaceOrder = 'TradePlaceOrder',
TradePlaceOrderConfirmed = 'TradePlaceOrderConfirmed',
TradeCancelOrder = 'TradeCancelOrder',
TradeCancelOrderConfirmed = 'TradeCancelOrderConfirmed',
}
export type AnalyticsEventData<T extends AnalyticsEvent> =
// App
T extends AnalyticsEvent.AppStart
? {}
: T extends AnalyticsEvent.NetworkStatus
? {
status: (typeof AbacusApiStatus)['name'];
/** Last time indexer node was queried successfully */
lastSuccessfulIndexerRpcQuery?: number;
/** Time elapsed since indexer node was queried successfully */
elapsedTime?: number;
blockHeight?: number;
indexerBlockHeight?: number;
trailingBlocks?: number;
}
: // Navigation
T extends AnalyticsEvent.NavigatePage
? {
path: string;
}
: T extends AnalyticsEvent.NavigateDialog
? {
type: DialogTypes;
}
: T extends AnalyticsEvent.NavigateDialogClose
? {
type: DialogTypes;
}
: T extends AnalyticsEvent.NavigateExternal
? {
link: string;
}
: // Wallet
T extends AnalyticsEvent.ConnectWallet
? {
walletType: WalletType;
walletConnectionType: WalletConnectionType;
}
: T extends AnalyticsEvent.DisconnectWallet
? {}
: // Onboarding
T extends AnalyticsEvent.OnboardingStepChanged
? {
state: OnboardingState;
step?: OnboardingSteps;
}
: T extends AnalyticsEvent.OnboardingAccountDerived
? {
hasPreviousTransactions: boolean;
}
: // Transfers
T extends AnalyticsEvent.TransferFaucet
? {}
: T extends AnalyticsEvent.TransferFaucetConfirmed
? {
/** roundtrip time between user placing an order and confirmation from indexer (client → validator → indexer → client) */
roundtripMs: number;
/** URL/IP of node the order was sent to */
validatorUrl: string;
}
: T extends AnalyticsEvent.TransferDeposit
? {}
: T extends AnalyticsEvent.TransferWithdraw
? {}
: // Trading
T extends AnalyticsEvent.TradeOrderTypeSelected
? {
type: TradeTypes;
}
: T extends AnalyticsEvent.TradePlaceOrder
? HumanReadablePlaceOrderPayload & {
isClosePosition: boolean;
}
: T extends AnalyticsEvent.TradePlaceOrderConfirmed
? {
/** roundtrip time between user placing an order and confirmation from indexer (client → validator → indexer → client) */
roundtripMs: number;
/** URL/IP of node the order was sent to */
validatorUrl: string;
}
: T extends AnalyticsEvent.TradeCancelOrder
? {}
: T extends AnalyticsEvent.TradeCancelOrderConfirmed
? {
/** roundtrip time between user canceling an order and confirmation from indexer (client → validator → indexer → client) */
roundtripMs: number;
/** URL/IP of node the order was sent to */
validatorUrl: string;
}
: never;
export const DEFAULT_TRANSACTION_MEMO = 'dYdX Frontend (web)';