Commit e06142e2 authored by lynn's avatar lynn Committed by GitHub

feat: implement other swap events part 1 (#4151)

* init commit

* fix prettier errors

* check node env in vercel

* add shouldLogImpression to TraceEvent
parent 1f763a1c
...@@ -8,6 +8,7 @@ type TraceEventProps = { ...@@ -8,6 +8,7 @@ type TraceEventProps = {
events: Event[] events: Event[]
name: EventName name: EventName
properties?: Record<string, unknown> properties?: Record<string, unknown>
shouldLogImpression?: boolean
} & ITraceContext } & ITraceContext
/** /**
...@@ -19,7 +20,7 @@ type TraceEventProps = { ...@@ -19,7 +20,7 @@ type TraceEventProps = {
* </TraceEvent> * </TraceEvent>
*/ */
export const TraceEvent = memo((props: PropsWithChildren<TraceEventProps>) => { export const TraceEvent = memo((props: PropsWithChildren<TraceEventProps>) => {
const { name, properties, events, children, ...traceProps } = props const { shouldLogImpression, name, properties, events, children, ...traceProps } = props
return ( return (
<Trace {...traceProps}> <Trace {...traceProps}>
...@@ -31,7 +32,10 @@ export const TraceEvent = memo((props: PropsWithChildren<TraceEventProps>) => { ...@@ -31,7 +32,10 @@ export const TraceEvent = memo((props: PropsWithChildren<TraceEventProps>) => {
} }
// For each child, augment event handlers defined in `events` with event tracing. // For each child, augment event handlers defined in `events` with event tracing.
return cloneElement(child, getEventHandlers(child, traceContext, events, name, properties)) return cloneElement(
child,
getEventHandlers(child, traceContext, events, name, properties, shouldLogImpression)
)
}) })
} }
</TraceContext.Consumer> </TraceContext.Consumer>
...@@ -50,7 +54,8 @@ function getEventHandlers( ...@@ -50,7 +54,8 @@ function getEventHandlers(
traceContext: ITraceContext, traceContext: ITraceContext,
events: Event[], events: Event[],
name: EventName, name: EventName,
properties?: Record<string, unknown> properties?: Record<string, unknown>,
shouldLogImpression = true
) { ) {
const eventHandlers: Partial<Record<Event, (e: SyntheticEvent<Element, Event>) => void>> = {} const eventHandlers: Partial<Record<Event, (e: SyntheticEvent<Element, Event>) => void>> = {}
...@@ -61,7 +66,7 @@ function getEventHandlers( ...@@ -61,7 +66,7 @@ function getEventHandlers(
child.props[event]?.apply(child, args) child.props[event]?.apply(child, args)
// augment handler with analytics logging // augment handler with analytics logging
sendAnalyticsEvent(name, { ...traceContext, ...properties, action: event }) if (shouldLogImpression) sendAnalyticsEvent(name, { ...traceContext, ...properties, action: event })
} }
} }
......
...@@ -7,7 +7,11 @@ ...@@ -7,7 +7,11 @@
export enum EventName { export enum EventName {
CONNECT_WALLET_BUTTON_CLICKED = 'Connect Wallet Button Clicked', CONNECT_WALLET_BUTTON_CLICKED = 'Connect Wallet Button Clicked',
PAGE_VIEWED = 'Page Viewed', PAGE_VIEWED = 'Page Viewed',
SWAP_AUTOROUTER_VISUALIZATION_EXPANDED = 'Swap Autorouter Visualization Expanded',
SWAP_DETAILS_EXPANDED = 'Swap Details Expanded',
SWAP_MAX_TOKEN_AMOUNT_SELECTED = 'Swap Max Token Amount Selected',
SWAP_SUBMITTED = 'Swap Submitted', SWAP_SUBMITTED = 'Swap Submitted',
SWAP_TOKENS_REVERSED = 'Swap Tokens Reversed',
TOKEN_IMPORTED = 'Token Imported', TOKEN_IMPORTED = 'Token Imported',
TOKEN_SELECTED = 'Token Selected', TOKEN_SELECTED = 'Token Selected',
TOKEN_SELECTOR_OPENED = 'Token Selector Opened', TOKEN_SELECTOR_OPENED = 'Token Selector Opened',
...@@ -45,7 +49,7 @@ export const enum SectionName { ...@@ -45,7 +49,7 @@ export const enum SectionName {
/** Known modals for analytics purposes. */ /** Known modals for analytics purposes. */
export const enum ModalName { export const enum ModalName {
SWAP = 'swap-modal', CONFIRM_SWAP = 'confirm-swap-modal',
TOKEN_SELECTOR = 'token-selector-modal', TOKEN_SELECTOR = 'token-selector-modal',
// alphabetize additional modal names. // alphabetize additional modal names.
} }
...@@ -55,11 +59,15 @@ export const enum ModalName { ...@@ -55,11 +59,15 @@ export const enum ModalName {
* Use to identify low-level components given a TraceContext * Use to identify low-level components given a TraceContext
*/ */
export const enum ElementName { export const enum ElementName {
AUTOROUTER_VISUALIZATION_ROW = 'expandable-autorouter-visualization-row',
COMMON_BASES_CURRENCY_BUTTON = 'common-bases-currency-button', COMMON_BASES_CURRENCY_BUTTON = 'common-bases-currency-button',
CONFIRM_SWAP_BUTTON = 'confirm-swap-or-send', CONFIRM_SWAP_BUTTON = 'confirm-swap-or-send',
CONNECT_WALLET_BUTTON = 'connect-wallet-button', CONNECT_WALLET_BUTTON = 'connect-wallet-button',
IMPORT_TOKEN_BUTTON = 'import-token-button', IMPORT_TOKEN_BUTTON = 'import-token-button',
MAX_TOKEN_AMOUNT_BUTTON = 'max-token-amount-button',
SWAP_BUTTON = 'swap-button', SWAP_BUTTON = 'swap-button',
SWAP_DETAILS_DROPDOWN = 'swap-details-dropdown',
SWAP_TOKENS_REVERSE_ARROW_BUTTON = 'swap-tokens-reverse-arrow-button',
TOKEN_SELECTOR_ROW = 'token-selector-row', TOKEN_SELECTOR_ROW = 'token-selector-row',
WALLET_TYPE_OPTION = 'wallet-type-option', WALLET_TYPE_OPTION = 'wallet-type-option',
// alphabetize additional element names. // alphabetize additional element names.
......
...@@ -2,6 +2,8 @@ import { Trans } from '@lingui/macro' ...@@ -2,6 +2,8 @@ import { Trans } from '@lingui/macro'
import { Currency, CurrencyAmount, Percent, Token } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, Percent, Token } from '@uniswap/sdk-core'
import { Pair } from '@uniswap/v2-sdk' import { Pair } from '@uniswap/v2-sdk'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { ElementName, Event, EventName } from 'components/AmplitudeAnalytics/constants'
import { TraceEvent } from 'components/AmplitudeAnalytics/TraceEvent'
import { AutoColumn } from 'components/Column' import { AutoColumn } from 'components/Column'
import { LoadingOpacityContainer, loadingOpacityMixin } from 'components/Loader/styled' import { LoadingOpacityContainer, loadingOpacityMixin } from 'components/Loader/styled'
import { isSupportedChain } from 'constants/chains' import { isSupportedChain } from 'constants/chains'
...@@ -311,9 +313,15 @@ export default function CurrencyInputPanel({ ...@@ -311,9 +313,15 @@ export default function CurrencyInputPanel({
) : null} ) : null}
</ThemedText.Body> </ThemedText.Body>
{showMaxButton && selectedCurrencyBalance ? ( {showMaxButton && selectedCurrencyBalance ? (
<TraceEvent
events={[Event.onClick]}
name={EventName.SWAP_MAX_TOKEN_AMOUNT_SELECTED}
element={ElementName.MAX_TOKEN_AMOUNT_BUTTON}
>
<StyledBalanceMax onClick={onMax}> <StyledBalanceMax onClick={onMax}>
<Trans>MAX</Trans> <Trans>MAX</Trans>
</StyledBalanceMax> </StyledBalanceMax>
</TraceEvent>
) : null} ) : null}
</RowFixed> </RowFixed>
) : ( ) : (
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { Trade } from '@uniswap/router-sdk' import { Trade } from '@uniswap/router-sdk'
import { Currency, Percent, TradeType } from '@uniswap/sdk-core' import { Currency, Percent, TradeType } from '@uniswap/sdk-core'
import { ModalName } from 'components/AmplitudeAnalytics/constants'
import { Trace } from 'components/AmplitudeAnalytics/Trace'
import { ReactNode, useCallback, useMemo } from 'react' import { ReactNode, useCallback, useMemo } from 'react'
import { InterfaceTrade } from 'state/routing/types' import { InterfaceTrade } from 'state/routing/types'
import { tradeMeaningfullyDiffers } from 'utils/tradeMeaningFullyDiffer' import { tradeMeaningfullyDiffers } from 'utils/tradeMeaningFullyDiffer'
...@@ -89,6 +91,7 @@ export default function ConfirmSwapModal({ ...@@ -89,6 +91,7 @@ export default function ConfirmSwapModal({
) )
return ( return (
<Trace modal={ModalName.CONFIRM_SWAP} shouldLogImpression={isOpen}>
<TransactionConfirmationModal <TransactionConfirmationModal
isOpen={isOpen} isOpen={isOpen}
onDismiss={onDismiss} onDismiss={onDismiss}
...@@ -98,5 +101,6 @@ export default function ConfirmSwapModal({ ...@@ -98,5 +101,6 @@ export default function ConfirmSwapModal({
pendingText={pendingText} pendingText={pendingText}
currencyToAdd={trade?.outputAmount.currency} currencyToAdd={trade?.outputAmount.currency}
/> />
</Trace>
) )
} }
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { Currency, Percent, TradeType } from '@uniswap/sdk-core' import { Currency, Percent, TradeType } from '@uniswap/sdk-core'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { ElementName, Event, EventName } from 'components/AmplitudeAnalytics/constants'
import { TraceEvent } from 'components/AmplitudeAnalytics/TraceEvent'
import AnimatedDropdown from 'components/AnimatedDropdown' import AnimatedDropdown from 'components/AnimatedDropdown'
import Card, { OutlineCard } from 'components/Card' import Card, { OutlineCard } from 'components/Card'
import { AutoColumn } from 'components/Column' import { AutoColumn } from 'components/Column'
...@@ -133,6 +135,12 @@ export default function SwapDetailsDropdown({ ...@@ -133,6 +135,12 @@ export default function SwapDetailsDropdown({
return ( return (
<Wrapper> <Wrapper>
<AutoColumn gap={'8px'} style={{ width: '100%', marginBottom: '-8px' }}> <AutoColumn gap={'8px'} style={{ width: '100%', marginBottom: '-8px' }}>
<TraceEvent
events={[Event.onClick]}
name={EventName.SWAP_DETAILS_EXPANDED}
element={ElementName.SWAP_DETAILS_DROPDOWN}
shouldLogImpression={!showDetails}
>
<StyledHeaderRow onClick={() => setShowDetails(!showDetails)} disabled={!trade} open={showDetails}> <StyledHeaderRow onClick={() => setShowDetails(!showDetails)} disabled={!trade} open={showDetails}>
<RowFixed style={{ position: 'relative' }}> <RowFixed style={{ position: 'relative' }}>
{loading || syncing ? ( {loading || syncing ? (
...@@ -196,6 +204,7 @@ export default function SwapDetailsDropdown({ ...@@ -196,6 +204,7 @@ export default function SwapDetailsDropdown({
/> />
</RowFixed> </RowFixed>
</StyledHeaderRow> </StyledHeaderRow>
</TraceEvent>
<AnimatedDropdown open={showDetails}> <AnimatedDropdown open={showDetails}>
<AutoColumn gap={'8px'} style={{ padding: '0', paddingBottom: '8px' }}> <AutoColumn gap={'8px'} style={{ padding: '0', paddingBottom: '8px' }}>
{trade ? ( {trade ? (
......
...@@ -4,6 +4,8 @@ import { Currency, Percent, TradeType } from '@uniswap/sdk-core' ...@@ -4,6 +4,8 @@ import { Currency, Percent, TradeType } from '@uniswap/sdk-core'
import { Pair } from '@uniswap/v2-sdk' import { Pair } from '@uniswap/v2-sdk'
import { FeeAmount } from '@uniswap/v3-sdk' import { FeeAmount } from '@uniswap/v3-sdk'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { ElementName, Event, EventName } from 'components/AmplitudeAnalytics/constants'
import { TraceEvent } from 'components/AmplitudeAnalytics/TraceEvent'
import AnimatedDropdown from 'components/AnimatedDropdown' import AnimatedDropdown from 'components/AnimatedDropdown'
import { AutoColumn } from 'components/Column' import { AutoColumn } from 'components/Column'
import { LoadingRows } from 'components/Loader/styled' import { LoadingRows } from 'components/Loader/styled'
...@@ -62,6 +64,12 @@ export default memo(function SwapRoute({ trade, syncing, fixedOpen = false, ...r ...@@ -62,6 +64,12 @@ export default memo(function SwapRoute({ trade, syncing, fixedOpen = false, ...r
return ( return (
<Wrapper {...rest} darkMode={darkMode} fixedOpen={fixedOpen}> <Wrapper {...rest} darkMode={darkMode} fixedOpen={fixedOpen}>
<TraceEvent
events={[Event.onClick]}
name={EventName.SWAP_AUTOROUTER_VISUALIZATION_EXPANDED}
element={ElementName.AUTOROUTER_VISUALIZATION_ROW}
shouldLogImpression={!open}
>
<RowBetween onClick={() => setOpen(!open)}> <RowBetween onClick={() => setOpen(!open)}>
<AutoRow gap="4px" width="auto"> <AutoRow gap="4px" width="auto">
<AutoRouterLogo /> <AutoRouterLogo />
...@@ -69,6 +77,7 @@ export default memo(function SwapRoute({ trade, syncing, fixedOpen = false, ...r ...@@ -69,6 +77,7 @@ export default memo(function SwapRoute({ trade, syncing, fixedOpen = false, ...r
</AutoRow> </AutoRow>
{fixedOpen ? null : <OpenCloseIcon open={open} />} {fixedOpen ? null : <OpenCloseIcon open={open} />}
</RowBetween> </RowBetween>
</TraceEvent>
<AnimatedDropdown open={open || fixedOpen}> <AnimatedDropdown open={open || fixedOpen}>
<AutoRow gap="4px" width="auto" style={{ paddingTop: '12px', margin: 0 }}> <AutoRow gap="4px" width="auto" style={{ paddingTop: '12px', margin: 0 }}>
{syncing ? ( {syncing ? (
......
...@@ -463,6 +463,11 @@ export default function Swap() { ...@@ -463,6 +463,11 @@ export default function Swap() {
/> />
</Trace> </Trace>
<ArrowWrapper clickable={isSupportedChain(chainId)}> <ArrowWrapper clickable={isSupportedChain(chainId)}>
<TraceEvent
events={[Event.onClick]}
name={EventName.SWAP_TOKENS_REVERSED}
element={ElementName.SWAP_TOKENS_REVERSE_ARROW_BUTTON}
>
<ArrowDown <ArrowDown
size="16" size="16"
onClick={() => { onClick={() => {
...@@ -475,6 +480,7 @@ export default function Swap() { ...@@ -475,6 +480,7 @@ export default function Swap() {
: theme.deprecated_text3 : theme.deprecated_text3
} }
/> />
</TraceEvent>
</ArrowWrapper> </ArrowWrapper>
<Trace section={SectionName.CURRENCY_OUTPUT_PANEL}> <Trace section={SectionName.CURRENCY_OUTPUT_PANEL}>
<CurrencyInputPanel <CurrencyInputPanel
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment