fix: remove GA code (#7303)

* feat: move ga events to amplitude

* fix: remove GA code
This commit is contained in:
eddie 2023-09-12 13:23:49 -07:00 committed by GitHub
parent 3e05db4b87
commit 1c3ce8fdb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 3 additions and 204 deletions

@ -262,7 +262,6 @@
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-feather": "^2.0.8", "react-feather": "^2.0.8",
"react-ga4": "^1.4.1",
"react-infinite-scroll-component": "^6.1.0", "react-infinite-scroll-component": "^6.1.0",
"react-is": "^17.0.2", "react-is": "^17.0.2",
"react-markdown": "^4.3.1", "react-markdown": "^4.3.1",

@ -36,6 +36,8 @@
--> -->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="preconnect" href="%REACT_APP_AMPLITUDE_PROXY_URL%" />
<link rel="preload" href="%PUBLIC_URL%/fonts/Basel-Book.woff" as="font" type="font/woff" crossorigin /> <link rel="preload" href="%PUBLIC_URL%/fonts/Basel-Book.woff" as="font" type="font/woff" crossorigin />
<link rel="preload" href="%PUBLIC_URL%/fonts/Basel-Medium.woff" as="font" type="font/woff" crossorigin /> <link rel="preload" href="%PUBLIC_URL%/fonts/Basel-Medium.woff" as="font" type="font/woff" crossorigin />

@ -1,7 +1,6 @@
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { CurrencyAmount, Token } from '@uniswap/sdk-core' import { CurrencyAmount, Token } from '@uniswap/sdk-core'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { sendEvent } from 'components/analytics'
import { useCallback, useEffect } from 'react' import { useCallback, useEffect } from 'react'
import { Heart, X } from 'react-feather' import { Heart, X } from 'react-feather'
import styled, { keyframes } from 'styled-components' import styled, { keyframes } from 'styled-components'
@ -65,10 +64,6 @@ export default function ClaimPopup() {
const showClaimModal = useModalIsOpen(ApplicationModal.SELF_CLAIM) const showClaimModal = useModalIsOpen(ApplicationModal.SELF_CLAIM)
const toggleSelfClaimModal = useToggleSelfClaimModal() const toggleSelfClaimModal = useToggleSelfClaimModal()
const handleToggleSelfClaimModal = useCallback(() => { const handleToggleSelfClaimModal = useCallback(() => {
sendEvent({
category: 'MerkleDrop',
action: 'Toggle self claim modal',
})
toggleSelfClaimModal() toggleSelfClaimModal()
}, [toggleSelfClaimModal]) }, [toggleSelfClaimModal])
@ -79,10 +74,6 @@ export default function ClaimPopup() {
// listen for available claim and show popup if needed // listen for available claim and show popup if needed
useEffect(() => { useEffect(() => {
if (userHasAvailableclaim) { if (userHasAvailableclaim) {
sendEvent({
category: 'MerkleDrop',
action: 'Show claim popup',
})
toggleShowClaimPopup() toggleShowClaimPopup()
} }
// the toggleShowClaimPopup function changes every time the popup changes, so this will cause an infinite loop. // the toggleShowClaimPopup function changes every time the popup changes, so this will cause an infinite loop.

@ -5,7 +5,6 @@ import { Currency, Token } from '@uniswap/sdk-core'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { Trace } from 'analytics' import { Trace } from 'analytics'
import { useCachedPortfolioBalancesQuery } from 'components/AccountDrawer/PrefetchBalancesWrapper' import { useCachedPortfolioBalancesQuery } from 'components/AccountDrawer/PrefetchBalancesWrapper'
import { sendEvent } from 'components/analytics'
import { supportedChainIdFromGQLChain } from 'graphql/data/util' import { supportedChainIdFromGQLChain } from 'graphql/data/util'
import useDebounce from 'hooks/useDebounce' import useDebounce from 'hooks/useDebounce'
import { useOnClickOutside } from 'hooks/useOnClickOutside' import { useOnClickOutside } from 'hooks/useOnClickOutside'
@ -76,16 +75,6 @@ export function CurrencySearch({
const searchToken = useToken(debouncedQuery) const searchToken = useToken(debouncedQuery)
const searchTokenIsAdded = useIsUserAddedToken(searchToken) const searchTokenIsAdded = useIsUserAddedToken(searchToken)
useEffect(() => {
if (isAddressSearch) {
sendEvent({
category: 'Currency Select',
action: 'Search by address',
label: isAddressSearch,
})
}
}, [isAddressSearch])
const defaultTokens = useDefaultActiveTokens(chainId) const defaultTokens = useDefaultActiveTokens(chainId)
const filteredTokens: Token[] = useMemo(() => { const filteredTokens: Token[] = useMemo(() => {
return Object.values(defaultTokens).filter(getTokenFilter(debouncedQuery)) return Object.values(defaultTokens).filter(getTokenFilter(debouncedQuery))

@ -1,53 +0,0 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
// TODO(WEB-2166): Delete this file when we remove Google Analytics completely.
import { GaOptions, InitOptions, UaEventOptions } from 'react-ga4/types/ga4'
/**
* Google Analytics Provider containing all methods used throughout app to log events to Google Analytics.
*/
export default class GoogleAnalyticsProvider {
public sendEvent(event: string | UaEventOptions, params?: any) {
// ReactGA.event(event, params)
}
public initialize(
GA_MEASUREMENT_ID: InitOptions[] | string,
options?: {
legacyDimensionMetric?: boolean
nonce?: string
testMode?: boolean
gaOptions?: GaOptions | any
gtagOptions?: any
}
) {
// ReactGA.initialize(GA_MEASUREMENT_ID, options)
}
public set(fieldsObject: any) {
// ReactGA.set(fieldsObject)
}
public outboundLink(
{
label,
}: {
label: string
},
hitCallback: () => unknown
) {
// ReactGA.outboundLink({ label }, hitCallback)
}
public pageview(path?: string, _?: string[], title?: string) {
// ReactGA.pageview(path, _, title)
}
public ga(...args: any[]) {
// ReactGA.ga(...args)
}
public gaCommandSendTiming(timingCategory: any, timingVar: any, timingValue: any, timingLabel: any) {
// ReactGA._gaCommandSendTiming(timingCategory, timingVar, timingValue, timingLabel)
}
}

@ -1,91 +1,8 @@
import { InterfaceEventName } from '@uniswap/analytics-events' import { InterfaceEventName } from '@uniswap/analytics-events'
import { useWeb3React } from '@web3-react/core'
import { sendAnalyticsEvent } from 'analytics' import { sendAnalyticsEvent } from 'analytics'
import { useEffect } from 'react'
import { UaEventOptions } from 'react-ga4/types/ga4'
import { useLocation } from 'react-router-dom'
import { isMobile } from 'utils/userAgent'
import { getCLS, getFCP, getFID, getLCP, Metric } from 'web-vitals'
import GoogleAnalyticsProvider from './GoogleAnalyticsProvider'
const GOOGLE_ANALYTICS_CLIENT_ID_STORAGE_KEY = 'ga_client_id'
const GOOGLE_ANALYTICS_ID: string | undefined = process.env.REACT_APP_GOOGLE_ANALYTICS_ID
const storedClientId = window.localStorage.getItem(GOOGLE_ANALYTICS_CLIENT_ID_STORAGE_KEY)
const googleAnalytics = new GoogleAnalyticsProvider()
export function sendEvent(event: string | UaEventOptions, params?: any) {
return googleAnalytics.sendEvent(event, params)
}
export function outboundLink({ label }: { label: string }) { export function outboundLink({ label }: { label: string }) {
sendAnalyticsEvent(InterfaceEventName.EXTERNAL_LINK_CLICK, { sendAnalyticsEvent(InterfaceEventName.EXTERNAL_LINK_CLICK, {
label, label,
}) })
} }
export function sendTiming(timingCategory: any, timingVar: any, timingValue: any, timingLabel: any) {
return googleAnalytics.gaCommandSendTiming(timingCategory, timingVar, timingValue, timingLabel)
}
if (typeof GOOGLE_ANALYTICS_ID === 'string') {
googleAnalytics.initialize(GOOGLE_ANALYTICS_ID, {
gaOptions: {
storage: 'none',
storeGac: false,
clientId: storedClientId ?? undefined,
},
})
googleAnalytics.set({
anonymizeIp: true,
customBrowserType: !isMobile
? 'desktop'
: 'web3' in window || 'ethereum' in window
? 'mobileWeb3'
: 'mobileRegular',
})
} else {
googleAnalytics.initialize('test', { gtagOptions: { debug_mode: true } })
}
const installed = Boolean(window.navigator.serviceWorker?.controller)
const hit = Boolean((window as any).__isDocumentCached)
const action = installed ? (hit ? 'Cache hit' : 'Cache miss') : 'Not installed'
sendEvent({ category: 'Service Worker', action, nonInteraction: true })
function reportWebVitals({ name, delta, id }: Metric) {
sendTiming('Web Vitals', name, Math.round(name === 'CLS' ? delta * 1000 : delta), id)
}
// tracks web vitals and pageviews
export function useAnalyticsReporter() {
const { pathname, search } = useLocation()
useEffect(() => {
getFCP(reportWebVitals)
getFID(reportWebVitals)
getLCP(reportWebVitals)
getCLS(reportWebVitals)
}, [])
const { chainId } = useWeb3React()
useEffect(() => {
// cd1 - custom dimension 1 - chainId
googleAnalytics.set({ cd1: chainId ?? 0 })
}, [chainId])
useEffect(() => {
googleAnalytics.pageview(`${pathname}${search}`)
}, [pathname, search])
useEffect(() => {
// typed as 'any' in react-ga4 -.-
googleAnalytics.ga((tracker: any) => {
if (!tracker) return
const clientId = tracker.get('clientId')
window.localStorage.setItem(GOOGLE_ANALYTICS_CLIENT_ID_STORAGE_KEY, clientId)
})
}, [])
}

@ -1,4 +1,3 @@
import { sendEvent } from 'components/analytics'
import ms from 'ms' import ms from 'ms'
import { useEffect } from 'react' import { useEffect } from 'react'
import { ApplicationModal, setOpenModal } from 'state/application/reducer' import { ApplicationModal, setOpenModal } from 'state/application/reducer'
@ -25,11 +24,6 @@ export default function useAccountRiskCheck(account: string | null | undefined)
.then((data) => { .then((data) => {
if (data.block) { if (data.block) {
dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT))
sendEvent({
category: 'Address Screening',
action: 'blocked',
label: account,
})
} }
}) })
.catch(() => dispatch(setOpenModal(null))) .catch(() => dispatch(setOpenModal(null)))

@ -1,4 +1,3 @@
import { sendEvent } from 'components/analytics'
import { SupportedLocale } from 'constants/locales' import { SupportedLocale } from 'constants/locales'
import useParsedQueryString from 'hooks/useParsedQueryString' import useParsedQueryString from 'hooks/useParsedQueryString'
import { stringify } from 'qs' import { stringify } from 'qs'
@ -6,15 +5,12 @@ import { useMemo } from 'react'
import type { To } from 'react-router-dom' import type { To } from 'react-router-dom'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { useActiveLocale } from './useActiveLocale'
export function useLocationLinkProps(locale: SupportedLocale | null): { export function useLocationLinkProps(locale: SupportedLocale | null): {
to?: To to?: To
onClick?: () => void onClick?: () => void
} { } {
const location = useLocation() const location = useLocation()
const qs = useParsedQueryString() const qs = useParsedQueryString()
const activeLocale = useActiveLocale()
return useMemo( return useMemo(
() => () =>
@ -25,14 +21,7 @@ export function useLocationLinkProps(locale: SupportedLocale | null): {
...location, ...location,
search: stringify({ ...qs, lng: locale }), search: stringify({ ...qs, lng: locale }),
}, },
onClick: () => {
sendEvent({
category: 'Localization',
action: 'Switch Locale',
label: `${activeLocale} -> ${locale}`,
})
},
}, },
[location, qs, activeLocale, locale] [location, qs, locale]
) )
} }

@ -22,7 +22,6 @@ import { getEnvName, isBrowserRouterEnabled } from 'utils/env'
import { getCurrentPageFromLocation } from 'utils/urlRoutes' import { getCurrentPageFromLocation } from 'utils/urlRoutes'
import { getCLS, getFCP, getFID, getLCP, Metric } from 'web-vitals' import { getCLS, getFCP, getFID, getLCP, Metric } from 'web-vitals'
import { useAnalyticsReporter } from '../components/analytics'
import ErrorBoundary from '../components/ErrorBoundary' import ErrorBoundary from '../components/ErrorBoundary'
import NavBar, { PageTabs } from '../components/NavBar' import NavBar, { PageTabs } from '../components/NavBar'
import Polling from '../components/Polling' import Polling from '../components/Polling'
@ -122,8 +121,6 @@ export default function App() {
const [scrolledState, setScrolledState] = useState(false) const [scrolledState, setScrolledState] = useState(false)
const infoPoolPageEnabled = useInfoPoolPageEnabled() const infoPoolPageEnabled = useInfoPoolPageEnabled()
useAnalyticsReporter()
useEffect(() => { useEffect(() => {
window.scrollTo(0, 0) window.scrollTo(0, 0)
setScrolledState(false) setScrolledState(false)

@ -1,7 +1,5 @@
import { skipToken } from '@reduxjs/toolkit/query/react' import { skipToken } from '@reduxjs/toolkit/query/react'
import { Currency, CurrencyAmount, Percent, TradeType } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, Percent, TradeType } from '@uniswap/sdk-core'
import { IMetric, MetricLoggerUnit, setGlobalMetric } from '@uniswap/smart-order-router'
import { sendTiming } from 'components/analytics'
import { AVERAGE_L1_BLOCK_TIME } from 'constants/chainInfo' import { AVERAGE_L1_BLOCK_TIME } from 'constants/chainInfo'
import { ZERO_PERCENT } from 'constants/misc' import { ZERO_PERCENT } from 'constants/misc'
import { useRoutingAPIArguments } from 'lib/hooks/routing/useRoutingAPIArguments' import { useRoutingAPIArguments } from 'lib/hooks/routing/useRoutingAPIArguments'
@ -136,20 +134,3 @@ export function useRoutingAPITrade<TTradeType extends TradeType>(
tradeResult?.trade, tradeResult?.trade,
]) ])
} }
// only want to enable this when app hook called
class GAMetric extends IMetric {
putDimensions() {
return
}
putMetric(key: string, value: number, unit?: MetricLoggerUnit) {
sendTiming('Routing API', `${key} | ${unit}`, value, 'client')
}
setProperty() {
return
}
}
setGlobalMetric(new GAMetric())

@ -1,5 +1,3 @@
import 'components/analytics'
import * as Sentry from '@sentry/react' import * as Sentry from '@sentry/react'
import { BrowserTracing } from '@sentry/tracing' import { BrowserTracing } from '@sentry/tracing'
import { SharedEventName } from '@uniswap/analytics-events' import { SharedEventName } from '@uniswap/analytics-events'

@ -17461,11 +17461,6 @@ react-focus-lock@^2.3.1:
use-callback-ref "^1.2.1" use-callback-ref "^1.2.1"
use-sidecar "^1.0.1" use-sidecar "^1.0.1"
react-ga4@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/react-ga4/-/react-ga4-1.4.1.tgz#6ee2a2db115ed235b2f2092bc746b4eeeca9e206"
integrity sha512-ioBMEIxd4ePw4YtaloTUgqhQGqz5ebDdC4slEpLgy2sLx1LuZBC9iYCwDymTXzcntw6K1dHX183ulP32nNdG7w==
react-infinite-scroll-component@^6.1.0: react-infinite-scroll-component@^6.1.0:
version "6.1.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f" resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f"