88 lines
2.8 KiB
TypeScript
88 lines
2.8 KiB
TypeScript
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<string | number> = {}): 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<T extends ObjectMap<string | number>>(
|
|
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;
|
|
}
|
|
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';
|
|
}
|
|
|
|
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,
|
|
};
|
|
},
|
|
trackWalletReady: trackingEventFnWithoutPayload(EventNames.WALLET_READY),
|
|
trackInstantOpened: trackingEventFnWithoutPayload(EventNames.INSTANT_OPENED),
|
|
};
|