feat(instant): Quote fetch tracking
This commit is contained in:
		@@ -11,7 +11,7 @@ import { asyncData } from '../redux/async_data';
 | 
			
		||||
import { DEFAULT_STATE, DefaultState, State } from '../redux/reducer';
 | 
			
		||||
import { store, Store } from '../redux/store';
 | 
			
		||||
import { fonts } from '../style/fonts';
 | 
			
		||||
import { AccountState, AffiliateInfo, AssetMetaData, Network, OrderSource } from '../types';
 | 
			
		||||
import { AccountState, AffiliateInfo, AssetMetaData, Network, OrderSource, QuoteFetchedVia } from '../types';
 | 
			
		||||
import { analytics, disableAnalytics } from '../util/analytics';
 | 
			
		||||
import { assetUtils } from '../util/asset';
 | 
			
		||||
import { errorFlasher } from '../util/error_flasher';
 | 
			
		||||
@@ -115,7 +115,10 @@ export class ZeroExInstantProvider extends React.Component<ZeroExInstantProvider
 | 
			
		||||
        this._buyQuoteHeartbeat.start(BUY_QUOTE_UPDATE_INTERVAL_TIME_MS);
 | 
			
		||||
        // Trigger first buyquote fetch
 | 
			
		||||
        // tslint:disable-next-line:no-floating-promises
 | 
			
		||||
        asyncData.fetchCurrentBuyQuoteAndDispatchToStore(state, dispatch, { updateSilently: false });
 | 
			
		||||
        asyncData.fetchCurrentBuyQuoteAndDispatchToStore(state, dispatch, {
 | 
			
		||||
            updateSilently: false,
 | 
			
		||||
            fetchedVia: QuoteFetchedVia.Manual,
 | 
			
		||||
        });
 | 
			
		||||
        // warm up the gas price estimator cache just in case we can't
 | 
			
		||||
        // grab the gas price estimate when submitting the transaction
 | 
			
		||||
        // tslint:disable-next-line:no-floating-promises
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import { ERC20AssetAmountInput, ERC20AssetAmountInputProps } from '../components
 | 
			
		||||
import { Action, actions } from '../redux/actions';
 | 
			
		||||
import { State } from '../redux/reducer';
 | 
			
		||||
import { ColorOption } from '../style/theme';
 | 
			
		||||
import { AffiliateInfo, ERC20Asset, Omit, OrderProcessState } from '../types';
 | 
			
		||||
import { AffiliateInfo, ERC20Asset, Omit, OrderProcessState, QuoteFetchedVia } from '../types';
 | 
			
		||||
import { buyQuoteUpdater } from '../util/buy_quote_updater';
 | 
			
		||||
 | 
			
		||||
export interface SelectedERC20AssetAmountInputProps {
 | 
			
		||||
@@ -92,6 +92,7 @@ const mapDispatchToProps = (
 | 
			
		||||
                setPending: true,
 | 
			
		||||
                dispatchErrors: true,
 | 
			
		||||
                affiliateInfo,
 | 
			
		||||
                fetchedVia: QuoteFetchedVia.Manual,
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import * as _ from 'lodash';
 | 
			
		||||
import { Dispatch } from 'redux';
 | 
			
		||||
 | 
			
		||||
import { BIG_NUMBER_ZERO } from '../constants';
 | 
			
		||||
import { AccountState, ERC20Asset, OrderProcessState, ProviderState } from '../types';
 | 
			
		||||
import { AccountState, ERC20Asset, OrderProcessState, ProviderState, QuoteFetchedVia } from '../types';
 | 
			
		||||
import { analytics } from '../util/analytics';
 | 
			
		||||
import { assetUtils } from '../util/asset';
 | 
			
		||||
import { buyQuoteUpdater } from '../util/buy_quote_updater';
 | 
			
		||||
@@ -84,7 +84,7 @@ export const asyncData = {
 | 
			
		||||
    fetchCurrentBuyQuoteAndDispatchToStore: async (
 | 
			
		||||
        state: State,
 | 
			
		||||
        dispatch: Dispatch,
 | 
			
		||||
        options: { updateSilently: boolean },
 | 
			
		||||
        options: { updateSilently: boolean; fetchedVia: QuoteFetchedVia },
 | 
			
		||||
    ) => {
 | 
			
		||||
        const { buyOrderState, providerState, selectedAsset, selectedAssetUnitAmount, affiliateInfo } = state;
 | 
			
		||||
        const assetBuyer = providerState.assetBuyer;
 | 
			
		||||
@@ -99,7 +99,12 @@ export const asyncData = {
 | 
			
		||||
                dispatch,
 | 
			
		||||
                selectedAsset as ERC20Asset,
 | 
			
		||||
                selectedAssetUnitAmount,
 | 
			
		||||
                { setPending: !options.updateSilently, dispatchErrors: !options.updateSilently, affiliateInfo },
 | 
			
		||||
                {
 | 
			
		||||
                    setPending: !options.updateSilently,
 | 
			
		||||
                    dispatchErrors: !options.updateSilently,
 | 
			
		||||
                    fetchedVia: options.fetchedVia,
 | 
			
		||||
                    affiliateInfo,
 | 
			
		||||
                },
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,11 @@ export enum OrderProcessState {
 | 
			
		||||
    Failure = 'FAILURE',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum QuoteFetchedVia {
 | 
			
		||||
    Manual = 'Manual',
 | 
			
		||||
    Heartbeat = 'Heartbeat',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface SimulatedProgress {
 | 
			
		||||
    startTimeUnix: number;
 | 
			
		||||
    expectedEndTimeUnix: number;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import { BuyQuote } from '@0x/asset-buyer';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { AffiliateInfo, Asset, Network, OrderSource, ProviderState } from '../types';
 | 
			
		||||
import { AffiliateInfo, Asset, Network, OrderSource, ProviderState, QuoteFetchedVia } from '../types';
 | 
			
		||||
 | 
			
		||||
import { EventProperties, heapUtil } from './heap';
 | 
			
		||||
 | 
			
		||||
@@ -37,6 +37,8 @@ enum EventNames {
 | 
			
		||||
    TOKEN_SELECTOR_CLOSED = 'Token Selector - Closed',
 | 
			
		||||
    TOKEN_SELECTOR_CHOSE = 'Token Selector - Chose',
 | 
			
		||||
    TOKEN_SELECTOR_SEARCHED = 'Token Selector - Searched',
 | 
			
		||||
    QUOTE_FETCHED = 'Quote - Fetched',
 | 
			
		||||
    QUOTE_ERROR = 'Quote - Error',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const track = (eventName: EventNames, eventProperties: EventProperties = {}): void => {
 | 
			
		||||
@@ -177,4 +179,9 @@ export const analytics = {
 | 
			
		||||
        trackingEventFnWithPayload(EventNames.TOKEN_SELECTOR_CHOSE)(payload),
 | 
			
		||||
    trackTokenSelectorSearched: (searchText: string) =>
 | 
			
		||||
        trackingEventFnWithPayload(EventNames.TOKEN_SELECTOR_SEARCHED)({ searchText }),
 | 
			
		||||
    trackQuoteFetched: (buyQuote: BuyQuote, fetchedVia: QuoteFetchedVia) =>
 | 
			
		||||
        trackingEventFnWithPayload(EventNames.QUOTE_FETCHED)({
 | 
			
		||||
            ...buyQuoteEventProperties(buyQuote),
 | 
			
		||||
            fetchedVia,
 | 
			
		||||
        }),
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@ import { Dispatch } from 'redux';
 | 
			
		||||
import { oc } from 'ts-optchain';
 | 
			
		||||
 | 
			
		||||
import { Action, actions } from '../redux/actions';
 | 
			
		||||
import { AffiliateInfo, ERC20Asset } from '../types';
 | 
			
		||||
import { AffiliateInfo, ERC20Asset, QuoteFetchedVia } from '../types';
 | 
			
		||||
import { analytics } from '../util/analytics';
 | 
			
		||||
import { assetUtils } from '../util/asset';
 | 
			
		||||
import { errorFlasher } from '../util/error_flasher';
 | 
			
		||||
 | 
			
		||||
@@ -16,7 +17,12 @@ export const buyQuoteUpdater = {
 | 
			
		||||
        dispatch: Dispatch<Action>,
 | 
			
		||||
        asset: ERC20Asset,
 | 
			
		||||
        assetUnitAmount: BigNumber,
 | 
			
		||||
        options: { setPending: boolean; dispatchErrors: boolean; affiliateInfo?: AffiliateInfo },
 | 
			
		||||
        options: {
 | 
			
		||||
            setPending: boolean;
 | 
			
		||||
            dispatchErrors: boolean;
 | 
			
		||||
            fetchedVia: QuoteFetchedVia;
 | 
			
		||||
            affiliateInfo?: AffiliateInfo;
 | 
			
		||||
        },
 | 
			
		||||
    ): Promise<void> => {
 | 
			
		||||
        // get a new buy quote.
 | 
			
		||||
        const baseUnitValue = Web3Wrapper.toBaseUnitAmount(assetUnitAmount, asset.metaData.decimals);
 | 
			
		||||
@@ -58,5 +64,6 @@ export const buyQuoteUpdater = {
 | 
			
		||||
        errorFlasher.clearError(dispatch);
 | 
			
		||||
        // invalidate the last buy quote.
 | 
			
		||||
        dispatch(actions.updateLatestBuyQuote(newBuyQuote));
 | 
			
		||||
        analytics.trackQuoteFetched(newBuyQuote, options.fetchedVia);
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import { asyncData } from '../redux/async_data';
 | 
			
		||||
import { Store } from '../redux/store';
 | 
			
		||||
import { QuoteFetchedVia } from '../types';
 | 
			
		||||
 | 
			
		||||
import { Heartbeater } from './heartbeater';
 | 
			
		||||
 | 
			
		||||
@@ -19,6 +20,7 @@ export const generateBuyQuoteHeartbeater = (options: HeartbeatFactoryOptions): H
 | 
			
		||||
    return new Heartbeater(async () => {
 | 
			
		||||
        await asyncData.fetchCurrentBuyQuoteAndDispatchToStore(store.getState(), store.dispatch, {
 | 
			
		||||
            updateSilently: true,
 | 
			
		||||
            fetchedVia: QuoteFetchedVia.Heartbeat,
 | 
			
		||||
        });
 | 
			
		||||
    }, shouldPerformImmediatelyOnStart);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user