Commit 64207f29 authored by Greg Bugyis's avatar Greg Bugyis Committed by GitHub

feat: Log events on NavBar Search (#4761)

parent 7b6ac6cf
...@@ -11,6 +11,8 @@ export enum EventName { ...@@ -11,6 +11,8 @@ export enum EventName {
EXPLORE_SEARCH_SELECTED = 'Explore Search Selected', EXPLORE_SEARCH_SELECTED = 'Explore Search Selected',
EXPLORE_TOKEN_ROW_CLICKED = 'Explore Token Row Clicked', EXPLORE_TOKEN_ROW_CLICKED = 'Explore Token Row Clicked',
PAGE_VIEWED = 'Page Viewed', PAGE_VIEWED = 'Page Viewed',
NAVBAR_SEARCH_SELECTED = 'Navbar Search Selected',
NAVBAR_SEARCH_EXITED = 'Navbar Search Exited',
SWAP_AUTOROUTER_VISUALIZATION_EXPANDED = 'Swap Autorouter Visualization Expanded', SWAP_AUTOROUTER_VISUALIZATION_EXPANDED = 'Swap Autorouter Visualization Expanded',
SWAP_DETAILS_EXPANDED = 'Swap Details Expanded', SWAP_DETAILS_EXPANDED = 'Swap Details Expanded',
SWAP_MAX_TOKEN_AMOUNT_SELECTED = 'Swap Max Token Amount Selected', SWAP_MAX_TOKEN_AMOUNT_SELECTED = 'Swap Max Token Amount Selected',
...@@ -110,6 +112,7 @@ export enum ElementName { ...@@ -110,6 +112,7 @@ export enum ElementName {
EXPLORE_SEARCH_INPUT = 'explore_search_input', EXPLORE_SEARCH_INPUT = 'explore_search_input',
IMPORT_TOKEN_BUTTON = 'import-token-button', IMPORT_TOKEN_BUTTON = 'import-token-button',
MAX_TOKEN_AMOUNT_BUTTON = 'max-token-amount-button', MAX_TOKEN_AMOUNT_BUTTON = 'max-token-amount-button',
NAVBAR_SEARCH_INPUT = 'navbar-search-input',
PRICE_UPDATE_ACCEPT_BUTTON = 'price-update-accept-button', PRICE_UPDATE_ACCEPT_BUTTON = 'price-update-accept-button',
SWAP_BUTTON = 'swap-button', SWAP_BUTTON = 'swap-button',
SWAP_DETAILS_DROPDOWN = 'swap-details-dropdown', SWAP_DETAILS_DROPDOWN = 'swap-details-dropdown',
...@@ -126,6 +129,7 @@ export enum ElementName { ...@@ -126,6 +129,7 @@ export enum ElementName {
*/ */
export enum Event { export enum Event {
onClick = 'onClick', onClick = 'onClick',
onFocus = 'onFocus',
onKeyPress = 'onKeyPress', onKeyPress = 'onKeyPress',
onSelect = 'onSelect', onSelect = 'onSelect',
// alphabetize additional events. // alphabetize additional events.
......
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
import { t } from '@lingui/macro' import { t } from '@lingui/macro'
import { sendAnalyticsEvent } from 'analytics'
import { ElementName, Event, EventName } from 'analytics/constants'
import { TraceEvent } from 'analytics/TraceEvent'
import clsx from 'clsx' import clsx from 'clsx'
import { NftVariant, useNftFlag } from 'featureFlags/flags/nft' import { NftVariant, useNftFlag } from 'featureFlags/flags/nft'
import useDebounce from 'hooks/useDebounce' import useDebounce from 'hooks/useDebounce'
...@@ -92,6 +95,10 @@ export const SearchBar = () => { ...@@ -92,6 +95,10 @@ export const SearchBar = () => {
const showCenteredSearchContent = const showCenteredSearchContent =
!isOpen && phase1Flag !== NftVariant.Enabled && !isMobileOrTablet && searchValue.length === 0 !isOpen && phase1Flag !== NftVariant.Enabled && !isMobileOrTablet && searchValue.length === 0
const navbarSearchEventProperties = {
navbar_search_input_text: debouncedSearchValue,
}
return ( return (
<Box position="relative"> <Box position="relative">
<Box <Box
...@@ -122,20 +129,27 @@ export const SearchBar = () => { ...@@ -122,20 +129,27 @@ export const SearchBar = () => {
<ChevronLeftIcon /> <ChevronLeftIcon />
</Box> </Box>
</Box> </Box>
<Box <TraceEvent
as="input" events={[Event.onFocus]}
placeholder={placeholderText} name={EventName.NAVBAR_SEARCH_SELECTED}
onChange={(event: ChangeEvent<HTMLInputElement>) => { element={ElementName.NAVBAR_SEARCH_INPUT}
!isOpen && toggleOpen() >
setSearchValue(event.target.value) <Box
}} as="input"
className={`${styles.searchBarInput} ${ placeholder={placeholderText}
showCenteredSearchContent ? styles.searchContentCentered : styles.searchContentLeftAlign onChange={(event: ChangeEvent<HTMLInputElement>) => {
}`} !isOpen && toggleOpen()
value={searchValue} setSearchValue(event.target.value)
ref={inputRef} }}
width={phase1Flag === NftVariant.Enabled || isOpen ? 'full' : '160'} onBlur={() => sendAnalyticsEvent(EventName.NAVBAR_SEARCH_EXITED, navbarSearchEventProperties)}
/> className={`${styles.searchBarInput} ${
showCenteredSearchContent ? styles.searchContentCentered : styles.searchContentLeftAlign
}`}
value={searchValue}
ref={inputRef}
width={phase1Flag === NftVariant.Enabled || isOpen ? 'full' : '160'}
/>
</TraceEvent>
</Row> </Row>
<Box className={clsx(isOpen ? styles.visible : styles.hidden)}> <Box className={clsx(isOpen ? styles.visible : styles.hidden)}>
{isOpen && ( {isOpen && (
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { sendAnalyticsEvent } from 'analytics'
import { EventName } from 'analytics/constants'
import { NftVariant, useNftFlag } from 'featureFlags/flags/nft' import { NftVariant, useNftFlag } from 'featureFlags/flags/nft'
import { Box } from 'nft/components/Box' import { Box } from 'nft/components/Box'
import { Column, Row } from 'nft/components/Flex' import { Column, Row } from 'nft/components/Flex'
...@@ -58,6 +60,15 @@ export const SearchBarDropdownSection = ({ ...@@ -58,6 +60,15 @@ export const SearchBarDropdownSection = ({
isHovered={hoveredIndex === index + startingIndex} isHovered={hoveredIndex === index + startingIndex}
setHoveredIndex={setHoveredIndex} setHoveredIndex={setHoveredIndex}
toggleOpen={toggleOpen} toggleOpen={toggleOpen}
traceEvent={() =>
sendAnalyticsEvent(EventName.NAVBAR_SEARCH_EXITED, {
position: index,
selected_type: 'collection',
suggestion_count: suggestions.length,
selected_name: suggestion.name,
selected_address: suggestion.address,
})
}
index={index + startingIndex} index={index + startingIndex}
/> />
) : ( ) : (
...@@ -67,6 +78,15 @@ export const SearchBarDropdownSection = ({ ...@@ -67,6 +78,15 @@ export const SearchBarDropdownSection = ({
isHovered={hoveredIndex === index + startingIndex} isHovered={hoveredIndex === index + startingIndex}
setHoveredIndex={setHoveredIndex} setHoveredIndex={setHoveredIndex}
toggleOpen={toggleOpen} toggleOpen={toggleOpen}
traceEvent={() =>
sendAnalyticsEvent(EventName.NAVBAR_SEARCH_EXITED, {
position: index,
selected_type: 'token',
suggestion_count: suggestions.length,
selected_name: suggestion.name,
selected_address: suggestion.address,
})
}
index={index + startingIndex} index={index + startingIndex}
/> />
) )
......
...@@ -19,10 +19,18 @@ interface CollectionRowProps { ...@@ -19,10 +19,18 @@ interface CollectionRowProps {
isHovered: boolean isHovered: boolean
setHoveredIndex: (index: number | undefined) => void setHoveredIndex: (index: number | undefined) => void
toggleOpen: () => void toggleOpen: () => void
traceEvent: () => void
index: number index: number
} }
export const CollectionRow = ({ collection, isHovered, setHoveredIndex, toggleOpen, index }: CollectionRowProps) => { export const CollectionRow = ({
collection,
isHovered,
setHoveredIndex,
toggleOpen,
traceEvent,
index,
}: CollectionRowProps) => {
const [brokenImage, setBrokenImage] = useState(false) const [brokenImage, setBrokenImage] = useState(false)
const [loaded, setLoaded] = useState(false) const [loaded, setLoaded] = useState(false)
const addToSearchHistory = useSearchHistory( const addToSearchHistory = useSearchHistory(
...@@ -33,7 +41,8 @@ export const CollectionRow = ({ collection, isHovered, setHoveredIndex, toggleOp ...@@ -33,7 +41,8 @@ export const CollectionRow = ({ collection, isHovered, setHoveredIndex, toggleOp
const handleClick = useCallback(() => { const handleClick = useCallback(() => {
addToSearchHistory(collection) addToSearchHistory(collection)
toggleOpen() toggleOpen()
}, [addToSearchHistory, collection, toggleOpen]) traceEvent()
}, [addToSearchHistory, collection, toggleOpen, traceEvent])
useEffect(() => { useEffect(() => {
const keyDownHandler = (event: KeyboardEvent) => { const keyDownHandler = (event: KeyboardEvent) => {
...@@ -96,10 +105,11 @@ interface TokenRowProps { ...@@ -96,10 +105,11 @@ interface TokenRowProps {
isHovered: boolean isHovered: boolean
setHoveredIndex: (index: number | undefined) => void setHoveredIndex: (index: number | undefined) => void
toggleOpen: () => void toggleOpen: () => void
traceEvent: () => void
index: number index: number
} }
export const TokenRow = ({ token, isHovered, setHoveredIndex, toggleOpen, index }: TokenRowProps) => { export const TokenRow = ({ token, isHovered, setHoveredIndex, toggleOpen, traceEvent, index }: TokenRowProps) => {
const [brokenImage, setBrokenImage] = useState(false) const [brokenImage, setBrokenImage] = useState(false)
const [loaded, setLoaded] = useState(false) const [loaded, setLoaded] = useState(false)
const addToSearchHistory = useSearchHistory( const addToSearchHistory = useSearchHistory(
...@@ -110,7 +120,8 @@ export const TokenRow = ({ token, isHovered, setHoveredIndex, toggleOpen, index ...@@ -110,7 +120,8 @@ export const TokenRow = ({ token, isHovered, setHoveredIndex, toggleOpen, index
const handleClick = useCallback(() => { const handleClick = useCallback(() => {
addToSearchHistory(token) addToSearchHistory(token)
toggleOpen() toggleOpen()
}, [addToSearchHistory, toggleOpen, token]) traceEvent()
}, [addToSearchHistory, toggleOpen, token, traceEvent])
const tokenDetailsPath = getTokenDetailsURL(token.address, undefined, token.chainId) const tokenDetailsPath = getTokenDetailsURL(token.address, undefined, token.chainId)
// Close the modal on escape // Close the modal on escape
......
...@@ -79,7 +79,7 @@ export default function SearchBar() { ...@@ -79,7 +79,7 @@ export default function SearchBar() {
<Trans <Trans
render={({ translation }) => ( render={({ translation }) => (
<TraceEvent <TraceEvent
events={[Event.onSelect]} events={[Event.onFocus]}
name={EventName.EXPLORE_SEARCH_SELECTED} name={EventName.EXPLORE_SEARCH_SELECTED}
element={ElementName.EXPLORE_SEARCH_INPUT} element={ElementName.EXPLORE_SEARCH_INPUT}
> >
......
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