diff --git a/package.json b/package.json index bfc5da15f8..4a02807719 100644 --- a/package.json +++ b/package.json @@ -262,7 +262,6 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-feather": "^2.0.8", - "react-ga4": "^1.4.1", "react-infinite-scroll-component": "^6.1.0", "react-is": "^17.0.2", "react-markdown": "^4.3.1", diff --git a/public/index.html b/public/index.html index 328c4f3456..ddfc7628c9 100644 --- a/public/index.html +++ b/public/index.html @@ -36,6 +36,8 @@ --> + + diff --git a/src/components/Popups/ClaimPopup.tsx b/src/components/Popups/ClaimPopup.tsx index bf682e1899..f48fd6886c 100644 --- a/src/components/Popups/ClaimPopup.tsx +++ b/src/components/Popups/ClaimPopup.tsx @@ -1,7 +1,6 @@ import { Trans } from '@lingui/macro' import { CurrencyAmount, Token } from '@uniswap/sdk-core' import { useWeb3React } from '@web3-react/core' -import { sendEvent } from 'components/analytics' import { useCallback, useEffect } from 'react' import { Heart, X } from 'react-feather' import styled, { keyframes } from 'styled-components' @@ -65,10 +64,6 @@ export default function ClaimPopup() { const showClaimModal = useModalIsOpen(ApplicationModal.SELF_CLAIM) const toggleSelfClaimModal = useToggleSelfClaimModal() const handleToggleSelfClaimModal = useCallback(() => { - sendEvent({ - category: 'MerkleDrop', - action: 'Toggle self claim modal', - }) toggleSelfClaimModal() }, [toggleSelfClaimModal]) @@ -79,10 +74,6 @@ export default function ClaimPopup() { // listen for available claim and show popup if needed useEffect(() => { if (userHasAvailableclaim) { - sendEvent({ - category: 'MerkleDrop', - action: 'Show claim popup', - }) toggleShowClaimPopup() } // the toggleShowClaimPopup function changes every time the popup changes, so this will cause an infinite loop. diff --git a/src/components/SearchModal/CurrencySearch.tsx b/src/components/SearchModal/CurrencySearch.tsx index ecd378fc6f..010d60661d 100644 --- a/src/components/SearchModal/CurrencySearch.tsx +++ b/src/components/SearchModal/CurrencySearch.tsx @@ -5,7 +5,6 @@ import { Currency, Token } from '@uniswap/sdk-core' import { useWeb3React } from '@web3-react/core' import { Trace } from 'analytics' import { useCachedPortfolioBalancesQuery } from 'components/AccountDrawer/PrefetchBalancesWrapper' -import { sendEvent } from 'components/analytics' import { supportedChainIdFromGQLChain } from 'graphql/data/util' import useDebounce from 'hooks/useDebounce' import { useOnClickOutside } from 'hooks/useOnClickOutside' @@ -76,16 +75,6 @@ export function CurrencySearch({ const searchToken = useToken(debouncedQuery) const searchTokenIsAdded = useIsUserAddedToken(searchToken) - useEffect(() => { - if (isAddressSearch) { - sendEvent({ - category: 'Currency Select', - action: 'Search by address', - label: isAddressSearch, - }) - } - }, [isAddressSearch]) - const defaultTokens = useDefaultActiveTokens(chainId) const filteredTokens: Token[] = useMemo(() => { return Object.values(defaultTokens).filter(getTokenFilter(debouncedQuery)) diff --git a/src/components/analytics/GoogleAnalyticsProvider.tsx b/src/components/analytics/GoogleAnalyticsProvider.tsx deleted file mode 100644 index 82ffb90627..0000000000 --- a/src/components/analytics/GoogleAnalyticsProvider.tsx +++ /dev/null @@ -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) - } -} diff --git a/src/components/analytics/index.ts b/src/components/analytics/index.ts index ec93396d34..9555829769 100644 --- a/src/components/analytics/index.ts +++ b/src/components/analytics/index.ts @@ -1,91 +1,8 @@ import { InterfaceEventName } from '@uniswap/analytics-events' -import { useWeb3React } from '@web3-react/core' 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 }) { sendAnalyticsEvent(InterfaceEventName.EXTERNAL_LINK_CLICK, { 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) - }) - }, []) -} diff --git a/src/hooks/useAccountRiskCheck.ts b/src/hooks/useAccountRiskCheck.ts index a3f015516d..6692b8b7e3 100644 --- a/src/hooks/useAccountRiskCheck.ts +++ b/src/hooks/useAccountRiskCheck.ts @@ -1,4 +1,3 @@ -import { sendEvent } from 'components/analytics' import ms from 'ms' import { useEffect } from 'react' import { ApplicationModal, setOpenModal } from 'state/application/reducer' @@ -25,11 +24,6 @@ export default function useAccountRiskCheck(account: string | null | undefined) .then((data) => { if (data.block) { dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) - sendEvent({ - category: 'Address Screening', - action: 'blocked', - label: account, - }) } }) .catch(() => dispatch(setOpenModal(null))) diff --git a/src/hooks/useLocationLinkProps.ts b/src/hooks/useLocationLinkProps.ts index ad76d35864..c1bcd213e9 100644 --- a/src/hooks/useLocationLinkProps.ts +++ b/src/hooks/useLocationLinkProps.ts @@ -1,4 +1,3 @@ -import { sendEvent } from 'components/analytics' import { SupportedLocale } from 'constants/locales' import useParsedQueryString from 'hooks/useParsedQueryString' import { stringify } from 'qs' @@ -6,15 +5,12 @@ import { useMemo } from 'react' import type { To } from 'react-router-dom' import { useLocation } from 'react-router-dom' -import { useActiveLocale } from './useActiveLocale' - export function useLocationLinkProps(locale: SupportedLocale | null): { to?: To onClick?: () => void } { const location = useLocation() const qs = useParsedQueryString() - const activeLocale = useActiveLocale() return useMemo( () => @@ -25,14 +21,7 @@ export function useLocationLinkProps(locale: SupportedLocale | null): { ...location, search: stringify({ ...qs, lng: locale }), }, - onClick: () => { - sendEvent({ - category: 'Localization', - action: 'Switch Locale', - label: `${activeLocale} -> ${locale}`, - }) - }, }, - [location, qs, activeLocale, locale] + [location, qs, locale] ) } diff --git a/src/pages/App.tsx b/src/pages/App.tsx index b461bcbbdd..8e817eeddf 100644 --- a/src/pages/App.tsx +++ b/src/pages/App.tsx @@ -22,7 +22,6 @@ import { getEnvName, isBrowserRouterEnabled } from 'utils/env' import { getCurrentPageFromLocation } from 'utils/urlRoutes' import { getCLS, getFCP, getFID, getLCP, Metric } from 'web-vitals' -import { useAnalyticsReporter } from '../components/analytics' import ErrorBoundary from '../components/ErrorBoundary' import NavBar, { PageTabs } from '../components/NavBar' import Polling from '../components/Polling' @@ -122,8 +121,6 @@ export default function App() { const [scrolledState, setScrolledState] = useState(false) const infoPoolPageEnabled = useInfoPoolPageEnabled() - useAnalyticsReporter() - useEffect(() => { window.scrollTo(0, 0) setScrolledState(false) diff --git a/src/state/routing/useRoutingAPITrade.ts b/src/state/routing/useRoutingAPITrade.ts index 3bdac4d3f9..a11764f069 100644 --- a/src/state/routing/useRoutingAPITrade.ts +++ b/src/state/routing/useRoutingAPITrade.ts @@ -1,7 +1,5 @@ import { skipToken } from '@reduxjs/toolkit/query/react' 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 { ZERO_PERCENT } from 'constants/misc' import { useRoutingAPIArguments } from 'lib/hooks/routing/useRoutingAPIArguments' @@ -136,20 +134,3 @@ export function useRoutingAPITrade( 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()) diff --git a/src/tracing/index.ts b/src/tracing/index.ts index 3361eeaed7..a771111663 100644 --- a/src/tracing/index.ts +++ b/src/tracing/index.ts @@ -1,5 +1,3 @@ -import 'components/analytics' - import * as Sentry from '@sentry/react' import { BrowserTracing } from '@sentry/tracing' import { SharedEventName } from '@uniswap/analytics-events' diff --git a/yarn.lock b/yarn.lock index 34734b54ff..a2d8a8a09f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17461,11 +17461,6 @@ react-focus-lock@^2.3.1: use-callback-ref "^1.2.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: version "6.1.0" resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f"