From f9478bb8c3c32dc3f4c22d4b2dec6cdbb3e9b112 Mon Sep 17 00:00:00 2001 From: Max Topolsky Date: Mon, 29 Dec 2025 17:27:14 -0800 Subject: [PATCH 1/6] init analytics hook --- .../analytics/preprodBuildAnalyticsEvents.tsx | 21 +++++ .../app/views/preprod/buildList/buildList.tsx | 14 +++ .../hooks/usePreprodBuildsAnalytics.tsx | 86 +++++++++++++++++++ .../detail/commitsAndFiles/preprodBuilds.tsx | 16 ++++ .../app/views/releases/list/mobileBuilds.tsx | 24 +++++- 5 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx diff --git a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx index 90d7e4be3cc0b1..6917664bd5d8c7 100644 --- a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx +++ b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx @@ -8,6 +8,13 @@ type BasePreprodBuildEvent = { project_type?: string | null; }; +type BuildListPageSource = + | 'preprod_builds_list' + | 'releases_mobile_builds_tab' + | 'releases_details_preprod_builds'; + +type BuildListDisplay = 'size' | 'distribution'; + export type PreprodBuildEventParameters = { 'preprod.builds.compare.go_to_build_details': BasePreprodBuildEvent & { slot?: 'head' | 'base'; @@ -28,6 +35,19 @@ export type PreprodBuildEventParameters = { 'preprod.builds.install_modal.opened': BasePreprodBuildEvent & { source: 'build_details_sidebar' | 'builds_table'; }; + 'preprod.builds.list.metadata': BasePreprodBuildEvent & { + builds_page_count: number; + builds_total_count: number; + datetime_selection: string; + display: BuildListDisplay; + has_search_query: boolean; + is_empty: boolean; + page_source: BuildListPageSource; + per_page: number; + project_count: number; + query_status: 'success' | 'error'; + cursor?: string | null; + }; 'preprod.builds.release.build_row_clicked': BasePreprodBuildEvent; 'preprod.releases.mobile-builds.tab-clicked': { organization: Organization; @@ -37,6 +57,7 @@ export type PreprodBuildEventParameters = { type PreprodBuildAnalyticsKey = keyof PreprodBuildEventParameters; export const preprodBuildEventMap: Record = { + 'preprod.builds.list.metadata': 'Preprod Builds: List Metadata', 'preprod.builds.release.build_row_clicked': 'Preprod Builds: Release Build Row Clicked', 'preprod.builds.details.open_insights_sidebar': 'Preprod Build Details: Insights Sidebar Opened', diff --git a/static/app/views/preprod/buildList/buildList.tsx b/static/app/views/preprod/buildList/buildList.tsx index e42fdb730dddb1..fb3786477f1c9e 100644 --- a/static/app/views/preprod/buildList/buildList.tsx +++ b/static/app/views/preprod/buildList/buildList.tsx @@ -13,6 +13,7 @@ import type RequestError from 'sentry/utils/requestError/requestError'; import useLocationQuery from 'sentry/utils/url/useLocationQuery'; import useOrganization from 'sentry/utils/useOrganization'; import {useParams} from 'sentry/utils/useParams'; +import {usePreprodBuildsAnalytics} from 'sentry/views/preprod/hooks/usePreprodBuildsAnalytics'; import type {ListBuildsApiResponse} from 'sentry/views/preprod/types/listBuildsTypes'; export default function BuildList() { @@ -54,6 +55,19 @@ export default function BuildList() { const builds = buildsData?.builds || []; const pageLinks = getResponseHeader?.('Link') || null; + const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); + + usePreprodBuildsAnalytics({ + builds, + buildsTotalCount, + cursor, + display: 'size', + error: !!error, + isLoading, + pageSource: 'preprod_builds_list', + perPage: queryParams.per_page, + projectCount: 1, + }); return ( diff --git a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx new file mode 100644 index 00000000000000..37ab3cab8ece94 --- /dev/null +++ b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx @@ -0,0 +1,86 @@ +import {useEffect} from 'react'; + +import {trackAnalytics} from 'sentry/utils/analytics'; +import useOrganization from 'sentry/utils/useOrganization'; +import usePageFilters from 'sentry/utils/usePageFilters'; +import type {BuildDetailsApiResponse} from 'sentry/views/preprod/types/buildDetailsTypes'; + +export type PreprodBuildsAnalyticsPageSource = + | 'preprod_builds_list' + | 'releases_mobile_builds_tab' + | 'releases_details_preprod_builds'; + +export type PreprodBuildsAnalyticsDisplay = 'size' | 'distribution'; + +interface UsePreprodBuildsAnalyticsProps { + builds: BuildDetailsApiResponse[]; + buildsTotalCount: number; + display: PreprodBuildsAnalyticsDisplay; + isLoading: boolean; + pageSource: PreprodBuildsAnalyticsPageSource; + perPage: number; + cursor?: string | null; + enabled?: boolean; + error?: boolean; + projectCount?: number; + searchQuery?: string | null; +} + +export function usePreprodBuildsAnalytics({ + builds, + buildsTotalCount, + cursor, + display, + enabled = true, + error, + isLoading, + pageSource, + perPage, + projectCount, + searchQuery, +}: UsePreprodBuildsAnalyticsProps) { + const organization = useOrganization(); + const {selection} = usePageFilters(); + + const datetimeSelection = `${selection.datetime.start || ''}-${selection.datetime.end || ''}-${selection.datetime.period || ''}`; + const resolvedProjectCount = projectCount ?? selection.projects.length; + const normalizedSearchQuery = searchQuery?.trim() ?? ''; + const hasSearchQuery = normalizedSearchQuery.length > 0; + const buildsPageCount = builds.length; + + useEffect(() => { + if (!enabled || isLoading) { + return; + } + + trackAnalytics('preprod.builds.list.metadata', { + organization, + builds_page_count: buildsPageCount, + builds_total_count: buildsTotalCount, + query_status: error ? 'error' : 'success', + is_empty: !error && buildsTotalCount === 0, + has_search_query: hasSearchQuery, + page_source: pageSource, + display, + cursor: cursor ?? null, + per_page: perPage, + project_count: resolvedProjectCount, + datetime_selection: datetimeSelection, + }); + }, [ + buildsPageCount, + buildsTotalCount, + cursor, + datetimeSelection, + display, + enabled, + error, + hasSearchQuery, + isLoading, + normalizedSearchQuery, + organization, + pageSource, + perPage, + resolvedProjectCount, + ]); +} diff --git a/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx b/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx index 3abd05e4703afe..ad4fb2f7c9179c 100644 --- a/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx +++ b/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx @@ -22,6 +22,7 @@ import useOrganization from 'sentry/utils/useOrganization'; import {useParams} from 'sentry/utils/useParams'; import {formatVersion} from 'sentry/utils/versions/formatVersion'; import PreprodBuildsSearchBar from 'sentry/views/preprod/components/preprodBuildsSearchBar'; +import {usePreprodBuildsAnalytics} from 'sentry/views/preprod/hooks/usePreprodBuildsAnalytics'; import type {BuildDetailsApiResponse} from 'sentry/views/preprod/types/buildDetailsTypes'; import type {ListBuildsApiResponse} from 'sentry/views/preprod/types/listBuildsTypes'; import {ReleaseContext} from 'sentry/views/releases/detail'; @@ -127,11 +128,26 @@ export default function PreprodBuilds() { ); const builds = buildsData?.builds || []; + const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); const pageLinks = getResponseHeader?.('Link') || null; const hasSearchQuery = !!urlSearchQuery?.trim(); const showOnboarding = builds.length === 0 && !hasSearchQuery && !isLoadingBuilds; + usePreprodBuildsAnalytics({ + builds, + buildsTotalCount, + cursor, + display: activeDisplay, + enabled: !!projectSlug && !!params.release, + error: !!buildsError, + isLoading: isLoadingBuilds, + pageSource: 'releases_details_preprod_builds', + perPage: queryParams.per_page, + projectCount: 1, + searchQuery: urlSearchQuery, + }); + const handleBuildRowClick = useCallback( (build: BuildDetailsApiResponse) => { trackAnalytics('preprod.builds.release.build_row_clicked', { diff --git a/static/app/views/releases/list/mobileBuilds.tsx b/static/app/views/releases/list/mobileBuilds.tsx index 58c13241b49242..87f565cd4ff952 100644 --- a/static/app/views/releases/list/mobileBuilds.tsx +++ b/static/app/views/releases/list/mobileBuilds.tsx @@ -17,6 +17,7 @@ import type RequestError from 'sentry/utils/requestError/requestError'; import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import PreprodBuildsSearchBar from 'sentry/views/preprod/components/preprodBuildsSearchBar'; +import {usePreprodBuildsAnalytics} from 'sentry/views/preprod/hooks/usePreprodBuildsAnalytics'; import type {ListBuildsApiResponse} from 'sentry/views/preprod/types/listBuildsTypes'; type Props = { @@ -100,14 +101,29 @@ export default function MobileBuilds({organization, selectedProjectIds}: Props) [location, navigate] ); - if (selectedProjectIds.length === 0) { - return ; - } - const builds = buildsData?.builds ?? []; + const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); const pageLinks = getResponseHeader?.('Link') ?? undefined; const hasSearchQuery = !!searchQuery?.trim(); const showProjectColumn = selectedProjectIds.length > 1; + usePreprodBuildsAnalytics({ + builds, + buildsTotalCount, + cursor, + display: activeDisplay, + enabled: selectedProjectIds.length > 0, + error: !!buildsError, + isLoading: isLoadingBuilds, + pageSource: 'releases_mobile_builds_tab', + perPage: buildsQueryParams.per_page, + projectCount: selectedProjectIds.length, + searchQuery, + }); + + if (selectedProjectIds.length === 0) { + return ; + } + return ( Date: Mon, 5 Jan 2026 13:25:08 -0800 Subject: [PATCH 2/6] update --- .../analytics/preprodBuildAnalyticsEvents.tsx | 12 +++++------ .../app/views/preprod/buildList/buildList.tsx | 6 ++---- .../hooks/usePreprodBuildsAnalytics.tsx | 21 ++++++------------- .../detail/commitsAndFiles/preprodBuilds.tsx | 3 --- .../app/views/releases/list/mobileBuilds.tsx | 3 --- 5 files changed, 13 insertions(+), 32 deletions(-) diff --git a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx index 6917664bd5d8c7..fd3a067d20a788 100644 --- a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx +++ b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx @@ -1,3 +1,4 @@ +import type {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import type {Organization} from 'sentry/types/organization'; type BasePreprodBuildEvent = { @@ -13,8 +14,6 @@ type BuildListPageSource = | 'releases_mobile_builds_tab' | 'releases_details_preprod_builds'; -type BuildListDisplay = 'size' | 'distribution'; - export type PreprodBuildEventParameters = { 'preprod.builds.compare.go_to_build_details': BasePreprodBuildEvent & { slot?: 'head' | 'base'; @@ -35,15 +34,14 @@ export type PreprodBuildEventParameters = { 'preprod.builds.install_modal.opened': BasePreprodBuildEvent & { source: 'build_details_sidebar' | 'builds_table'; }; - 'preprod.builds.list.metadata': BasePreprodBuildEvent & { - builds_page_count: number; - builds_total_count: number; + 'preprod.builds.list.metadata': { + build_count_on_page: number; datetime_selection: string; - display: BuildListDisplay; + display: PreprodBuildsDisplay; has_search_query: boolean; is_empty: boolean; + organization: Organization; page_source: BuildListPageSource; - per_page: number; project_count: number; query_status: 'success' | 'error'; cursor?: string | null; diff --git a/static/app/views/preprod/buildList/buildList.tsx b/static/app/views/preprod/buildList/buildList.tsx index fb3786477f1c9e..05f68c539ea51b 100644 --- a/static/app/views/preprod/buildList/buildList.tsx +++ b/static/app/views/preprod/buildList/buildList.tsx @@ -3,6 +3,7 @@ import {Flex} from '@sentry/scraps/layout'; import Feature from 'sentry/components/acl/feature'; import {LinkButton} from 'sentry/components/core/button/linkButton'; import * as Layout from 'sentry/components/layouts/thirds'; +import {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import {PreprodBuildsTable} from 'sentry/components/preprod/preprodBuildsTable'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {IconSettings} from 'sentry/icons'; @@ -55,17 +56,14 @@ export default function BuildList() { const builds = buildsData?.builds || []; const pageLinks = getResponseHeader?.('Link') || null; - const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); usePreprodBuildsAnalytics({ builds, - buildsTotalCount, cursor, - display: 'size', + display: PreprodBuildsDisplay.SIZE, error: !!error, isLoading, pageSource: 'preprod_builds_list', - perPage: queryParams.per_page, projectCount: 1, }); diff --git a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx index 37ab3cab8ece94..e2df20bcca1e9c 100644 --- a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx +++ b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx @@ -1,5 +1,6 @@ import {useEffect} from 'react'; +import type {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import {trackAnalytics} from 'sentry/utils/analytics'; import useOrganization from 'sentry/utils/useOrganization'; import usePageFilters from 'sentry/utils/usePageFilters'; @@ -10,15 +11,11 @@ export type PreprodBuildsAnalyticsPageSource = | 'releases_mobile_builds_tab' | 'releases_details_preprod_builds'; -export type PreprodBuildsAnalyticsDisplay = 'size' | 'distribution'; - interface UsePreprodBuildsAnalyticsProps { builds: BuildDetailsApiResponse[]; - buildsTotalCount: number; - display: PreprodBuildsAnalyticsDisplay; + display: PreprodBuildsDisplay; isLoading: boolean; pageSource: PreprodBuildsAnalyticsPageSource; - perPage: number; cursor?: string | null; enabled?: boolean; error?: boolean; @@ -28,14 +25,12 @@ interface UsePreprodBuildsAnalyticsProps { export function usePreprodBuildsAnalytics({ builds, - buildsTotalCount, cursor, display, enabled = true, error, isLoading, pageSource, - perPage, projectCount, searchQuery, }: UsePreprodBuildsAnalyticsProps) { @@ -46,7 +41,7 @@ export function usePreprodBuildsAnalytics({ const resolvedProjectCount = projectCount ?? selection.projects.length; const normalizedSearchQuery = searchQuery?.trim() ?? ''; const hasSearchQuery = normalizedSearchQuery.length > 0; - const buildsPageCount = builds.length; + const buildCountOnPage = builds.length; useEffect(() => { if (!enabled || isLoading) { @@ -55,21 +50,18 @@ export function usePreprodBuildsAnalytics({ trackAnalytics('preprod.builds.list.metadata', { organization, - builds_page_count: buildsPageCount, - builds_total_count: buildsTotalCount, + build_count_on_page: buildCountOnPage, query_status: error ? 'error' : 'success', - is_empty: !error && buildsTotalCount === 0, + is_empty: !error && buildCountOnPage === 0, has_search_query: hasSearchQuery, page_source: pageSource, display, cursor: cursor ?? null, - per_page: perPage, project_count: resolvedProjectCount, datetime_selection: datetimeSelection, }); }, [ - buildsPageCount, - buildsTotalCount, + buildCountOnPage, cursor, datetimeSelection, display, @@ -80,7 +72,6 @@ export function usePreprodBuildsAnalytics({ normalizedSearchQuery, organization, pageSource, - perPage, resolvedProjectCount, ]); } diff --git a/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx b/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx index ad4fb2f7c9179c..3e61498dd4235f 100644 --- a/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx +++ b/static/app/views/releases/detail/commitsAndFiles/preprodBuilds.tsx @@ -128,7 +128,6 @@ export default function PreprodBuilds() { ); const builds = buildsData?.builds || []; - const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); const pageLinks = getResponseHeader?.('Link') || null; const hasSearchQuery = !!urlSearchQuery?.trim(); @@ -136,14 +135,12 @@ export default function PreprodBuilds() { usePreprodBuildsAnalytics({ builds, - buildsTotalCount, cursor, display: activeDisplay, enabled: !!projectSlug && !!params.release, error: !!buildsError, isLoading: isLoadingBuilds, pageSource: 'releases_details_preprod_builds', - perPage: queryParams.per_page, projectCount: 1, searchQuery: urlSearchQuery, }); diff --git a/static/app/views/releases/list/mobileBuilds.tsx b/static/app/views/releases/list/mobileBuilds.tsx index 87f565cd4ff952..161d1aaf5aa42e 100644 --- a/static/app/views/releases/list/mobileBuilds.tsx +++ b/static/app/views/releases/list/mobileBuilds.tsx @@ -102,20 +102,17 @@ export default function MobileBuilds({organization, selectedProjectIds}: Props) ); const builds = buildsData?.builds ?? []; - const buildsTotalCount = Number(buildsData?.pagination?.total_count ?? 0); const pageLinks = getResponseHeader?.('Link') ?? undefined; const hasSearchQuery = !!searchQuery?.trim(); const showProjectColumn = selectedProjectIds.length > 1; usePreprodBuildsAnalytics({ builds, - buildsTotalCount, cursor, display: activeDisplay, enabled: selectedProjectIds.length > 0, error: !!buildsError, isLoading: isLoadingBuilds, pageSource: 'releases_mobile_builds_tab', - perPage: buildsQueryParams.per_page, projectCount: selectedProjectIds.length, searchQuery, }); From 035f029e514a58e25ccf9ea3eaa3ba1bc80cee9f Mon Sep 17 00:00:00 2001 From: Max Topolsky Date: Mon, 5 Jan 2026 14:01:16 -0800 Subject: [PATCH 3/6] simplify --- .../app/views/preprod/buildList/buildList.tsx | 1 + .../preprod/hooks/usePreprodBuildsAnalytics.tsx | 17 +++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/static/app/views/preprod/buildList/buildList.tsx b/static/app/views/preprod/buildList/buildList.tsx index 05f68c539ea51b..198714b04f64a9 100644 --- a/static/app/views/preprod/buildList/buildList.tsx +++ b/static/app/views/preprod/buildList/buildList.tsx @@ -61,6 +61,7 @@ export default function BuildList() { builds, cursor, display: PreprodBuildsDisplay.SIZE, + enabled: !!projectId, error: !!error, isLoading, pageSource: 'preprod_builds_list', diff --git a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx index e2df20bcca1e9c..3693e383e7b22a 100644 --- a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx +++ b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx @@ -38,40 +38,37 @@ export function usePreprodBuildsAnalytics({ const {selection} = usePageFilters(); const datetimeSelection = `${selection.datetime.start || ''}-${selection.datetime.end || ''}-${selection.datetime.period || ''}`; - const resolvedProjectCount = projectCount ?? selection.projects.length; - const normalizedSearchQuery = searchQuery?.trim() ?? ''; - const hasSearchQuery = normalizedSearchQuery.length > 0; - const buildCountOnPage = builds.length; useEffect(() => { if (!enabled || isLoading) { return; } + const buildCountOnPage = builds.length; trackAnalytics('preprod.builds.list.metadata', { organization, build_count_on_page: buildCountOnPage, query_status: error ? 'error' : 'success', is_empty: !error && buildCountOnPage === 0, - has_search_query: hasSearchQuery, + has_search_query: (searchQuery?.trim() ?? '').length > 0, page_source: pageSource, display, cursor: cursor ?? null, - project_count: resolvedProjectCount, + project_count: projectCount ?? selection.projects.length, datetime_selection: datetimeSelection, }); }, [ - buildCountOnPage, + builds.length, cursor, datetimeSelection, display, enabled, error, - hasSearchQuery, isLoading, - normalizedSearchQuery, organization, pageSource, - resolvedProjectCount, + projectCount, + searchQuery, + selection.projects.length, ]); } From 38154bd1c9cf233e954bbaee9bbe2981250457f8 Mon Sep 17 00:00:00 2001 From: Max Topolsky Date: Mon, 5 Jan 2026 14:02:41 -0800 Subject: [PATCH 4/6] remove type --- .../utils/analytics/preprodBuildAnalyticsEvents.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx index fd3a067d20a788..bbcdbbda7b73d1 100644 --- a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx +++ b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx @@ -9,11 +9,6 @@ type BasePreprodBuildEvent = { project_type?: string | null; }; -type BuildListPageSource = - | 'preprod_builds_list' - | 'releases_mobile_builds_tab' - | 'releases_details_preprod_builds'; - export type PreprodBuildEventParameters = { 'preprod.builds.compare.go_to_build_details': BasePreprodBuildEvent & { slot?: 'head' | 'base'; @@ -41,7 +36,10 @@ export type PreprodBuildEventParameters = { has_search_query: boolean; is_empty: boolean; organization: Organization; - page_source: BuildListPageSource; + page_source: + | 'preprod_builds_list' + | 'releases_mobile_builds_tab' + | 'releases_details_preprod_builds'; project_count: number; query_status: 'success' | 'error'; cursor?: string | null; From 66b04f0764cf1596d8f463ecb732b2479a71e173 Mon Sep 17 00:00:00 2001 From: Max Topolsky Date: Mon, 5 Jan 2026 14:24:51 -0800 Subject: [PATCH 5/6] fix --- static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx index bbcdbbda7b73d1..a14736a7d4bf76 100644 --- a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx +++ b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx @@ -1,5 +1,6 @@ import type {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import type {Organization} from 'sentry/types/organization'; +import type {PreprodBuildsAnalyticsPageSource} from 'sentry/views/preprod/hooks/usePreprodBuildsAnalytics'; type BasePreprodBuildEvent = { organization: Organization; @@ -36,10 +37,7 @@ export type PreprodBuildEventParameters = { has_search_query: boolean; is_empty: boolean; organization: Organization; - page_source: - | 'preprod_builds_list' - | 'releases_mobile_builds_tab' - | 'releases_details_preprod_builds'; + page_source: PreprodBuildsAnalyticsPageSource; project_count: number; query_status: 'success' | 'error'; cursor?: string | null; From 14b2bb7c39b2cee428a936186ab7dfc91f26f700 Mon Sep 17 00:00:00 2001 From: Max Topolsky Date: Mon, 5 Jan 2026 14:25:57 -0800 Subject: [PATCH 6/6] fix --- .../app/utils/analytics/preprodBuildAnalyticsEvents.tsx | 8 ++++++-- .../app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx | 8 ++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx index a14736a7d4bf76..c3ec8df556993a 100644 --- a/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx +++ b/static/app/utils/analytics/preprodBuildAnalyticsEvents.tsx @@ -1,6 +1,5 @@ import type {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import type {Organization} from 'sentry/types/organization'; -import type {PreprodBuildsAnalyticsPageSource} from 'sentry/views/preprod/hooks/usePreprodBuildsAnalytics'; type BasePreprodBuildEvent = { organization: Organization; @@ -10,6 +9,11 @@ type BasePreprodBuildEvent = { project_type?: string | null; }; +export type BuildListPageSource = + | 'preprod_builds_list' + | 'releases_mobile_builds_tab' + | 'releases_details_preprod_builds'; + export type PreprodBuildEventParameters = { 'preprod.builds.compare.go_to_build_details': BasePreprodBuildEvent & { slot?: 'head' | 'base'; @@ -37,7 +41,7 @@ export type PreprodBuildEventParameters = { has_search_query: boolean; is_empty: boolean; organization: Organization; - page_source: PreprodBuildsAnalyticsPageSource; + page_source: BuildListPageSource; project_count: number; query_status: 'success' | 'error'; cursor?: string | null; diff --git a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx index 3693e383e7b22a..6e833faea29126 100644 --- a/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx +++ b/static/app/views/preprod/hooks/usePreprodBuildsAnalytics.tsx @@ -2,20 +2,16 @@ import {useEffect} from 'react'; import type {PreprodBuildsDisplay} from 'sentry/components/preprod/preprodBuildsDisplay'; import {trackAnalytics} from 'sentry/utils/analytics'; +import type {BuildListPageSource} from 'sentry/utils/analytics/preprodBuildAnalyticsEvents'; import useOrganization from 'sentry/utils/useOrganization'; import usePageFilters from 'sentry/utils/usePageFilters'; import type {BuildDetailsApiResponse} from 'sentry/views/preprod/types/buildDetailsTypes'; -export type PreprodBuildsAnalyticsPageSource = - | 'preprod_builds_list' - | 'releases_mobile_builds_tab' - | 'releases_details_preprod_builds'; - interface UsePreprodBuildsAnalyticsProps { builds: BuildDetailsApiResponse[]; display: PreprodBuildsDisplay; isLoading: boolean; - pageSource: PreprodBuildsAnalyticsPageSource; + pageSource: BuildListPageSource; cursor?: string | null; enabled?: boolean; error?: boolean;