import { BasicOrderProvider, StandardRelayerAPIOrderProvider } from '@0x/asset-buyer'; import { ObjectMap } from '@0x/types'; import { State } from '../redux/reducer'; import { heapUtil } from './heap'; let isDisabled = false; export const disableAnalytics = (shouldDisableAnalytics: boolean) => { isDisabled = shouldDisableAnalytics; }; export const evaluateIfEnabled = (fnCall: () => void) => { if (isDisabled) { return; } fnCall(); }; enum EventNames { INSTANT_OPENED = 'Instant - Opened', WALLET_READY = 'Wallet - Ready', } const track = (eventName: EventNames, eventData: ObjectMap = {}): void => { evaluateIfEnabled(() => { heapUtil.evaluateHeapCall(heap => heap.track(eventName, eventData)); }); }; function trackingEventFnWithoutPayload(eventName: EventNames): () => void { return () => { track(eventName); }; } // tslint:disable-next-line:no-unused-variable function trackingEventFnWithPayload>( eventName: EventNames, ): (eventDataProperties: T) => void { return (eventDataProperties: T) => { track(eventName, eventDataProperties); }; } export interface AnalyticsUserOptions { ethAddress?: string; ethBalanceInUnitAmount?: string; } export interface AnalyticsEventOptions { embeddedHost?: string; embeddedUrl?: string; networkId?: number; providerName?: string; gitSha?: string; npmVersion?: string; orderSource?: string; affiliateAddress?: string; affiliateFeePercent?: number; } export const analytics = { addUserProperties: (properties: AnalyticsUserOptions): void => { evaluateIfEnabled(() => { heapUtil.evaluateHeapCall(heap => heap.addUserProperties(properties)); }); }, addEventProperties: (properties: AnalyticsEventOptions): void => { evaluateIfEnabled(() => { heapUtil.evaluateHeapCall(heap => heap.addEventProperties(properties)); }); }, generateEventProperties: (state: State, window: Window): AnalyticsEventOptions => { let orderSource = 'unknown'; const orderProvider = state.providerState.assetBuyer.orderProvider; if (orderProvider instanceof StandardRelayerAPIOrderProvider) { orderSource = orderProvider.apiUrl; } else if (orderProvider instanceof BasicOrderProvider) { orderSource = 'provided'; } const affiliateAddress = state.affiliateInfo ? state.affiliateInfo.feeRecipient : 'none'; const affiliateFeePercent = state.affiliateInfo ? parseFloat(state.affiliateInfo.feePercentage.toFixed(4)) : 0; return { embeddedHost: window.location.host, embeddedUrl: window.location.href, networkId: state.network, providerName: state.providerState.name, gitSha: process.env.GIT_SHA, npmVersion: process.env.NPM_PACKAGE_VERSION, orderSource, affiliateAddress, affiliateFeePercent, }; }, trackWalletReady: trackingEventFnWithoutPayload(EventNames.WALLET_READY), trackInstantOpened: trackingEventFnWithoutPayload(EventNames.INSTANT_OPENED), };