diff --git a/.gitignore b/.gitignore index 0b7d3321a..99d3b8c5c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ coverage/ yarn-error.log .idea Brewfile.lock.json +.env diff --git a/src/app/components/book-selector/after-form-submit.ts b/src/app/components/book-selector/after-form-submit.ts index bc57912e6..8fe0d1e25 100644 --- a/src/app/components/book-selector/after-form-submit.ts +++ b/src/app/components/book-selector/after-form-submit.ts @@ -2,6 +2,7 @@ import React from 'react'; import fetchBooks from '~/models/books'; import {filterLiveBooks, SalesforceBook} from '~/helpers/books'; import {useNavigate, NavigateFunction, useLocation} from 'react-router-dom'; +import {captureEvent} from '~/helpers/posthog'; function afterFormSubmit( navigate: NavigateFunction, @@ -17,6 +18,7 @@ function afterFormSubmit( /* Send to Tech Scout with books pre-selected -- Language removed */ const scoutBooks = selectedBooks.map((sfBook) => sfBook.value.replace(/ *\[.*/, '')); + captureEvent('interest_form_submitted', {bookCount: selectedBooks.length}); navigate('/partners', { state: { confirmation: true, diff --git a/src/app/components/book-selector/book-selector.tsx b/src/app/components/book-selector/book-selector.tsx index ce57dc998..7c13a7baa 100644 --- a/src/app/components/book-selector/book-selector.tsx +++ b/src/app/components/book-selector/book-selector.tsx @@ -6,6 +6,7 @@ import {salesforceTitles, SalesforceBook} from '~/helpers/books'; import BookCheckbox from '~/components/book-checkbox/book-checkbox'; import {useIntl} from 'react-intl'; import {useFirstSearchArgument} from './after-form-submit'; +import {captureEvent} from '~/helpers/posthog'; import './book-selector.scss'; const spanishPairings: Record = { @@ -252,6 +253,15 @@ function BookSelector({ }: { data: {books: Books}; } & PropsFromOutside) { + const trackedToggleBook = useCallback( + (book: SalesforceBook) => { + const action = selectedBooks.includes(book) ? 'deselected' : 'selected'; + + captureEvent('book_selected', {bookTitle: book.text, action}); + toggleBook(book); + }, + [selectedBooks, toggleBook] + ); const books = React.useMemo( () => salesforceTitles(data.books).filter(includeFilter), [data.books, includeFilter] @@ -323,7 +333,7 @@ function BookSelector({ ))} @@ -340,7 +350,7 @@ function BookSelector({ getBooks={booksBySubject} name={name} selectedBooks={selectedBooks} - toggleBook={toggleBook} + toggleBook={trackedToggleBook} limitReached={limitReached} forceOpen={searchLower.length > 0} /> diff --git a/src/app/components/search-bar/search-bar.tsx b/src/app/components/search-bar/search-bar.tsx index 876239945..030e06a34 100644 --- a/src/app/components/search-bar/search-bar.tsx +++ b/src/app/components/search-bar/search-bar.tsx @@ -8,6 +8,7 @@ import {faTimes} from '@fortawesome/free-solid-svg-icons/faTimes'; import {faSearch} from '@fortawesome/free-solid-svg-icons/faSearch'; import {treatSpaceOrEnterAsClick} from '~/helpers/events'; import cn from 'classnames'; +import {captureEvent} from '~/helpers/posthog'; import './search-bar.scss'; type SearchBarParams = { @@ -51,10 +52,11 @@ function SearchInput({amongWhat}: Pick) { (event: React.KeyboardEvent) => { if (event.key === 'Enter') { event.preventDefault(); + captureEvent('book_search_performed', {searchQuery: searchString}); doSearch(); } }, - [doSearch] + [doSearch, searchString] ); const inputId = `search-${amongWhat}`; @@ -119,13 +121,17 @@ function ClearButton() { } function SearchButton() { - const {doSearch} = useSearchContext(); + const {doSearch, searchString} = useSearchContext(); + const handleSearch = React.useCallback(() => { + captureEvent('book_search_performed', {searchQuery: searchString}); + doSearch(); + }, [doSearch, searchString]); return (