Commit 64296d82 authored by Ian Lapham's avatar Ian Lapham Committed by Noah Zinsmeister

Update GA (#577)

* add updated GA

* update swap/send events

* add custom variable for device type

* cleanup
parent 701cbde2
...@@ -2,6 +2,7 @@ import React, { Component } from 'react' ...@@ -2,6 +2,7 @@ import React, { Component } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import styled from 'styled-components' import styled from 'styled-components'
import ReactGA from 'react-ga'
import { ReactComponent as Dropup } from '../../assets/images/dropup-blue.svg' import { ReactComponent as Dropup } from '../../assets/images/dropup-blue.svg'
import { ReactComponent as Dropdown } from '../../assets/images/dropdown-blue.svg' import { ReactComponent as Dropdown } from '../../assets/images/dropdown-blue.svg'
...@@ -94,11 +95,17 @@ class ContextualInfo extends Component { ...@@ -94,11 +95,17 @@ class ContextualInfo extends Component {
return ( return (
<> <>
<SummaryWrapperContainer <SummaryWrapperContainer
onClick={() => onClick={() => {
!this.state.showDetails &&
ReactGA.event({
category: 'Advanced Interaction',
action: 'Open Advanced Details',
label: 'Pool Page Details'
})
this.setState(prevState => { this.setState(prevState => {
return { showDetails: !prevState.showDetails } return { showDetails: !prevState.showDetails }
}) })
} }}
> >
{!this.state.showDetails ? ( {!this.state.showDetails ? (
<> <>
......
import React, { useState } from 'react' import React, { useState } from 'react'
import styled, { css } from 'styled-components' import styled, { css } from 'styled-components'
import { transparentize } from 'polished' import { transparentize } from 'polished'
import ReactGA from 'react-ga'
import { ReactComponent as Dropup } from '../../assets/images/dropup-blue.svg' import { ReactComponent as Dropup } from '../../assets/images/dropup-blue.svg'
import { ReactComponent as Dropdown } from '../../assets/images/dropdown-blue.svg' import { ReactComponent as Dropdown } from '../../assets/images/dropdown-blue.svg'
...@@ -99,7 +99,17 @@ export default function ContextualInfo({ ...@@ -99,7 +99,17 @@ export default function ContextualInfo({
<SummaryWrapper>{contextualInfo}</SummaryWrapper> <SummaryWrapper>{contextualInfo}</SummaryWrapper>
) : ( ) : (
<> <>
<SummaryWrapperContainer onClick={() => setShowDetails(s => !s)}> <SummaryWrapperContainer
onClick={() => {
!showDetails &&
ReactGA.event({
category: 'Advanced Interaction',
action: 'Open Advanced Details',
label: 'Swap/Send Page Details'
})
setShowDetails(s => !s)
}}
>
<> <>
<ErrorSpan isError={isError} slippageWarning={slippageWarning} highSlippageWarning={highSlippageWarning}> <ErrorSpan isError={isError} slippageWarning={slippageWarning} highSlippageWarning={highSlippageWarning}>
{(slippageWarning || highSlippageWarning) && ( {(slippageWarning || highSlippageWarning) && (
......
...@@ -19,6 +19,7 @@ import { useTransactionAdder } from '../../contexts/Transactions' ...@@ -19,6 +19,7 @@ import { useTransactionAdder } from '../../contexts/Transactions'
import { useAddressBalance, useExchangeReserves } from '../../contexts/Balances' import { useAddressBalance, useExchangeReserves } from '../../contexts/Balances'
import { useAddressAllowance } from '../../contexts/Allowances' import { useAddressAllowance } from '../../contexts/Allowances'
import { useWalletModalToggle } from '../../contexts/Application' import { useWalletModalToggle } from '../../contexts/Application'
import { useETHPriceInUSD } from '../../contexts/Balances'
const INPUT = 0 const INPUT = 0
const OUTPUT = 1 const OUTPUT = 1
...@@ -246,6 +247,9 @@ export default function ExchangePage({ initialCurrency, sending = false, params ...@@ -246,6 +247,9 @@ export default function ExchangePage({ initialCurrency, sending = false, params
const { t } = useTranslation() const { t } = useTranslation()
const { account, error } = useWeb3React() const { account, error } = useWeb3React()
// BigNumber.js instance
const ethPrice = useETHPriceInUSD()
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
// check if URL specifies valid slippage, if so use as default // check if URL specifies valid slippage, if so use as default
...@@ -564,13 +568,51 @@ export default function ExchangePage({ initialCurrency, sending = false, params ...@@ -564,13 +568,51 @@ export default function ExchangePage({ initialCurrency, sending = false, params
} }
async function onSwap() { async function onSwap() {
//if user changed deadline, log new one in minutes
if (deadlineFromNow !== DEFAULT_DEADLINE_FROM_NOW) {
ReactGA.event({
category: 'Advanced Interaction',
action: 'Set Custom Deadline',
value: deadlineFromNow / 60
})
}
const deadline = Math.ceil(Date.now() / 1000) + deadlineFromNow const deadline = Math.ceil(Date.now() / 1000) + deadlineFromNow
// if user has changed slippage, log
if (swapType === TOKEN_TO_TOKEN) {
if (parseInt(tokenAllowedSlippageBig.toString()) !== TOKEN_ALLOWED_SLIPPAGE_DEFAULT) {
ReactGA.event({
category: 'Advanced Interaction',
action: 'Set Custom Slippage',
value: parseInt(tokenAllowedSlippageBig.toString())
})
}
} else {
if (parseInt(allowedSlippageBig.toString()) !== ALLOWED_SLIPPAGE_DEFAULT) {
ReactGA.event({
category: 'Advanced Interaction',
action: 'Set Custom Slippage',
value: parseInt(allowedSlippageBig.toString())
})
}
}
let estimate, method, args, value let estimate, method, args, value
let inputEthPerToken = 1
if (inputCurrency !== 'ETH') {
inputEthPerToken = inputReserveToken && inputReserveETH ? inputReserveETH / inputReserveToken : null
}
let usdTransactionSize = ethPrice * inputEthPerToken * inputValueFormatted
if (independentField === INPUT) { if (independentField === INPUT) {
// general details about transaction
ReactGA.event({ ReactGA.event({
category: `${swapType}`, category: 'Transaction',
action: sending ? 'TransferInput' : 'SwapInput' action: sending ? 'SendInput' : 'SwapInput',
label: outputCurrency,
value: usdTransactionSize
}) })
if (swapType === ETH_TO_TOKEN) { if (swapType === ETH_TO_TOKEN) {
...@@ -601,9 +643,12 @@ export default function ExchangePage({ initialCurrency, sending = false, params ...@@ -601,9 +643,12 @@ export default function ExchangePage({ initialCurrency, sending = false, params
value = ethers.constants.Zero value = ethers.constants.Zero
} }
} else if (independentField === OUTPUT) { } else if (independentField === OUTPUT) {
// general details about transaction
ReactGA.event({ ReactGA.event({
category: `${swapType}`, category: 'Transaction',
action: sending ? 'TransferOutput' : 'SwapOutput' action: sending ? 'SendOutput' : 'SwapOutput',
label: outputCurrency,
value: usdTransactionSize
}) })
if (swapType === ETH_TO_TOKEN) { if (swapType === ETH_TO_TOKEN) {
......
import React from 'react' import React from 'react'
import ReactGA from 'react-ga'
import styled from 'styled-components' import styled from 'styled-components'
import { darken, transparentize } from 'polished' import { darken, transparentize } from 'polished'
import Toggle from 'react-switch' import Toggle from 'react-switch'
...@@ -103,7 +104,14 @@ export default function Footer() { ...@@ -103,7 +104,14 @@ export default function Footer() {
{'☀️'} {'☀️'}
</EmojiToggle> </EmojiToggle>
} }
onChange={() => toggleDarkMode()} onChange={() => {
ReactGA.event({
category: 'Advanced Interaction',
action: 'Toggle Theme',
label: isDark ? 'Light' : 'Dark'
})
toggleDarkMode()
}}
/> />
</FooterFrame> </FooterFrame>
) )
......
import React, { useState, useEffect, useRef, useCallback } from 'react' import React, { useState, useEffect, useRef, useCallback } from 'react'
import ReactGA from 'react-ga'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled, { css, keyframes } from 'styled-components' import styled, { css, keyframes } from 'styled-components'
import { darken, lighten } from 'polished' import { darken, lighten } from 'polished'
...@@ -81,7 +80,7 @@ const Popup = styled(Flex)` ...@@ -81,7 +80,7 @@ const Popup = styled(Flex)`
position: absolute; position: absolute;
width: 228px; width: 228px;
left: -78px; left: -78px;
top: -124px; top: -94px;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 0.6rem 1rem; padding: 0.6rem 1rem;
...@@ -642,11 +641,6 @@ export default function TransactionDetails(props) { ...@@ -642,11 +641,6 @@ export default function TransactionDetails(props) {
const b = text => <Bold>{text}</Bold> const b = text => <Bold>{text}</Bold>
const renderTransactionDetails = () => { const renderTransactionDetails = () => {
ReactGA.event({
category: 'TransactionDetail',
action: 'Open'
})
if (props.independentField === props.INPUT) { if (props.independentField === props.INPUT) {
return props.sending ? ( return props.sending ? (
<TransactionInfo> <TransactionInfo>
......
import React, { useState, useEffect } from 'react' import React, { useState, useEffect } from 'react'
import ReactGA from 'react-ga'
import styled from 'styled-components' import styled from 'styled-components'
import { isMobile } from 'react-device-detect' import { isMobile } from 'react-device-detect'
import { useWeb3React, UnsupportedChainIdError } from '@web3-react/core' import { useWeb3React, UnsupportedChainIdError } from '@web3-react/core'
...@@ -155,6 +156,19 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions ...@@ -155,6 +156,19 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
}, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious]) }, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious])
const tryActivation = async connector => { const tryActivation = async connector => {
let name = ''
Object.keys(SUPPORTED_WALLETS).map(key => {
if (connector === SUPPORTED_WALLETS[key].connector) {
return (name = SUPPORTED_WALLETS[key].name)
}
return true
})
// log selected wallet
ReactGA.event({
category: 'Wallet',
action: 'Change Wallet',
label: name
})
setPendingWallet(connector) // set wallet for pending view setPendingWallet(connector) // set wallet for pending view
setWalletView(WALLET_VIEWS.PENDING) setWalletView(WALLET_VIEWS.PENDING)
activate(connector, undefined, true).catch(e => { activate(connector, undefined, true).catch(e => {
......
...@@ -5,6 +5,7 @@ import { Web3ReactProvider, createWeb3ReactRoot } from '@web3-react/core' ...@@ -5,6 +5,7 @@ import { Web3ReactProvider, createWeb3ReactRoot } from '@web3-react/core'
import { ethers } from 'ethers' import { ethers } from 'ethers'
import { NetworkContextName } from './constants' import { NetworkContextName } from './constants'
import { isMobile } from 'react-device-detect'
import LocalStorageContextProvider, { Updater as LocalStorageContextUpdater } from './contexts/LocalStorage' import LocalStorageContextProvider, { Updater as LocalStorageContextUpdater } from './contexts/LocalStorage'
import ApplicationContextProvider, { Updater as ApplicationContextUpdater } from './contexts/Application' import ApplicationContextProvider, { Updater as ApplicationContextUpdater } from './contexts/Application'
import TransactionContextProvider, { Updater as TransactionContextUpdater } from './contexts/Transactions' import TransactionContextProvider, { Updater as TransactionContextUpdater } from './contexts/Transactions'
...@@ -25,9 +26,13 @@ function getLibrary(provider) { ...@@ -25,9 +26,13 @@ function getLibrary(provider) {
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
ReactGA.initialize('UA-128182339-1') ReactGA.initialize('UA-128182339-1')
ReactGA.set({
customBrowserType: !isMobile ? 'desktop' : window.web3 || window.ethereum ? 'mobileWeb3' : 'mobileRegular'
})
} else { } else {
ReactGA.initialize('test', { testMode: true }) ReactGA.initialize('test', { testMode: true })
} }
ReactGA.pageview(window.location.pathname + window.location.search) ReactGA.pageview(window.location.pathname + window.location.search)
function ContextProviders({ children }) { function ContextProviders({ children }) {
......
...@@ -15,7 +15,7 @@ import { brokenTokens } from '../../constants' ...@@ -15,7 +15,7 @@ import { brokenTokens } from '../../constants'
import { amountFormatter, calculateGasMargin } from '../../utils' import { amountFormatter, calculateGasMargin } from '../../utils'
import { useTransactionAdder } from '../../contexts/Transactions' import { useTransactionAdder } from '../../contexts/Transactions'
import { useTokenDetails } from '../../contexts/Tokens' import { useTokenDetails } from '../../contexts/Tokens'
import { useAddressBalance, useExchangeReserves } from '../../contexts/Balances' import { useAddressBalance, useExchangeReserves, useETHPriceInUSD } from '../../contexts/Balances'
import { useAddressAllowance } from '../../contexts/Allowances' import { useAddressAllowance } from '../../contexts/Allowances'
const INPUT = 0 const INPUT = 0
...@@ -200,6 +200,9 @@ export default function AddLiquidity({ params }) { ...@@ -200,6 +200,9 @@ export default function AddLiquidity({ params }) {
const { t } = useTranslation() const { t } = useTranslation()
const { library, account, active } = useWeb3React() const { library, account, active } = useWeb3React()
// BigNumber.js instance
const ethPrice = useETHPriceInUSD()
// clear url of query // clear url of query
useEffect(() => { useEffect(() => {
const history = createBrowserHistory() const history = createBrowserHistory()
...@@ -296,11 +299,6 @@ export default function AddLiquidity({ params }) { ...@@ -296,11 +299,6 @@ export default function AddLiquidity({ params }) {
}, [reserveETH, reserveToken, decimals]) }, [reserveETH, reserveToken, decimals])
function renderTransactionDetails() { function renderTransactionDetails() {
ReactGA.event({
category: 'TransactionDetail',
action: 'Open'
})
const b = text => <BlueSpan>{text}</BlueSpan> const b = text => <BlueSpan>{text}</BlueSpan>
if (isNewExchange) { if (isNewExchange) {
...@@ -381,9 +379,15 @@ export default function AddLiquidity({ params }) { ...@@ -381,9 +379,15 @@ export default function AddLiquidity({ params }) {
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
async function onAddLiquidity() { async function onAddLiquidity() {
// take ETH amount, multiplied by ETH rate and 2 for total tx size
let usdTransactionSize = ethPrice * (inputValueParsed / 1e18) * 2
// log pool added to and total usd amount
ReactGA.event({ ReactGA.event({
category: 'Pool', category: 'Transaction',
action: 'AddLiquidity' action: 'Add Liquidity',
label: outputCurrency,
value: usdTransactionSize
}) })
const deadline = Math.ceil(Date.now() / 1000) + DEADLINE_FROM_NOW const deadline = Math.ceil(Date.now() / 1000) + DEADLINE_FROM_NOW
......
...@@ -104,8 +104,8 @@ function CreateExchange({ location, params }) { ...@@ -104,8 +104,8 @@ function CreateExchange({ location, params }) {
factory.createExchange(tokenAddress.address, { gasLimit: estimatedGasLimit }).then(response => { factory.createExchange(tokenAddress.address, { gasLimit: estimatedGasLimit }).then(response => {
ReactGA.event({ ReactGA.event({
category: 'Pool', category: 'Transaction',
action: 'CreateExchange' action: 'Create Exchange'
}) })
addTransaction(response) addTransaction(response)
......
...@@ -13,7 +13,7 @@ import OversizedPanel from '../../components/OversizedPanel' ...@@ -13,7 +13,7 @@ import OversizedPanel from '../../components/OversizedPanel'
import ArrowDown from '../../assets/svg/SVGArrowDown' import ArrowDown from '../../assets/svg/SVGArrowDown'
import { useTransactionAdder } from '../../contexts/Transactions' import { useTransactionAdder } from '../../contexts/Transactions'
import { useTokenDetails } from '../../contexts/Tokens' import { useTokenDetails } from '../../contexts/Tokens'
import { useAddressBalance } from '../../contexts/Balances' import { useAddressBalance, useETHPriceInUSD } from '../../contexts/Balances'
import { calculateGasMargin, amountFormatter } from '../../utils' import { calculateGasMargin, amountFormatter } from '../../utils'
// denominated in bips // denominated in bips
...@@ -244,10 +244,17 @@ export default function RemoveLiquidity({ params }) { ...@@ -244,10 +244,17 @@ export default function RemoveLiquidity({ params }) {
} }
}, [fetchPoolTokens, library]) }, [fetchPoolTokens, library])
// BigNumber.js instance
const ethPrice = useETHPriceInUSD()
async function onRemoveLiquidity() { async function onRemoveLiquidity() {
// take ETH amount, multiplied by ETH rate and 2 for total tx size
let usdTransactionSize = ethPrice * (ethWithdrawn / 1e18) * 2
ReactGA.event({ ReactGA.event({
category: 'Pool', category: 'Transaction',
action: 'RemoveLiquidity' action: 'Remove Liquidity',
label: outputCurrency,
value: usdTransactionSize
}) })
const deadline = Math.ceil(Date.now() / 1000) + DEADLINE_FROM_NOW const deadline = Math.ceil(Date.now() / 1000) + DEADLINE_FROM_NOW
...@@ -271,11 +278,6 @@ export default function RemoveLiquidity({ params }) { ...@@ -271,11 +278,6 @@ export default function RemoveLiquidity({ params }) {
const b = text => <BlueSpan>{text}</BlueSpan> const b = text => <BlueSpan>{text}</BlueSpan>
function renderTransactionDetails() { function renderTransactionDetails() {
ReactGA.event({
category: 'TransactionDetail',
action: 'Open'
})
return ( return (
<div> <div>
<div> <div>
......
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