Skip to content

Commit c9af9df

Browse files
authored
ref(tsc): move release endpoints to apiOptions (#112566)
1 parent 9a2f677 commit c9af9df

File tree

27 files changed

+462
-544
lines changed

27 files changed

+462
-544
lines changed

static/app/components/customResolutionModal.tsx

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Fragment, useMemo, useState} from 'react';
22
import styled from '@emotion/styled';
3+
import {useQuery} from '@tanstack/react-query';
34

45
import {Button} from '@sentry/scraps/button';
56
import {CompactSelect, type SelectOption} from '@sentry/scraps/compactSelect';
@@ -14,8 +15,7 @@ import {IconOpen} from 'sentry/icons';
1415
import {t} from 'sentry/locale';
1516
import {ConfigStore} from 'sentry/stores/configStore';
1617
import type {Release} from 'sentry/types/release';
17-
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
18-
import {useApiQuery} from 'sentry/utils/queryClient';
18+
import {apiOptions} from 'sentry/utils/api/apiOptions';
1919
import {normalizeUrl} from 'sentry/utils/url/normalizeUrl';
2020
import {useDebouncedValue} from 'sentry/utils/useDebouncedValue';
2121
import {useOrganization} from 'sentry/utils/useOrganization';
@@ -67,47 +67,46 @@ export function CustomResolutionModal(props: CustomResolutionModalProps) {
6767
const currentUser = ConfigStore.get('user');
6868
const [selectionError, setSelectionError] = useState<string | null>(null);
6969

70-
const releaseListUrl = props.projectSlug
71-
? getApiUrl('/projects/$organizationIdOrSlug/$projectIdOrSlug/releases/', {
72-
path: {
73-
organizationIdOrSlug: organization.slug,
74-
projectIdOrSlug: props.projectSlug,
75-
},
76-
})
77-
: getApiUrl('/organizations/$organizationIdOrSlug/releases/', {
70+
const releaseListOptions = props.projectSlug
71+
? apiOptions.as<Release[]>()(
72+
'/projects/$organizationIdOrSlug/$projectIdOrSlug/releases/',
73+
{
74+
path: {
75+
organizationIdOrSlug: organization.slug,
76+
projectIdOrSlug: props.projectSlug,
77+
},
78+
query: {query: debouncedSearch},
79+
staleTime: 60_000,
80+
}
81+
)
82+
: apiOptions.as<Release[]>()('/organizations/$organizationIdOrSlug/releases/', {
7883
path: {organizationIdOrSlug: organization.slug},
84+
query: {query: debouncedSearch},
85+
staleTime: 60_000,
7986
});
8087

81-
const {data: releases = [], isFetching} = useApiQuery<Release[]>(
82-
[
83-
releaseListUrl,
84-
{
85-
query: {
86-
query: debouncedSearch,
87-
},
88-
},
89-
],
90-
{
91-
staleTime: 60_000,
92-
retry: false,
93-
}
94-
);
88+
const {data: releases = [], isFetching} = useQuery({
89+
...releaseListOptions,
90+
retry: false,
91+
});
9592

9693
const shouldLookupExact = debouncedSearch.trim().length > 0;
9794

9895
// Attempt to find the exact release, the list is capped at the most recent 100 releases
99-
const {data: exactRelease} = useApiQuery<Release>(
100-
[
101-
getApiUrl('/organizations/$organizationIdOrSlug/releases/$version/', {
102-
path: {organizationIdOrSlug: organization.slug, version: debouncedSearch.trim()},
103-
}),
104-
],
105-
{
106-
enabled: shouldLookupExact,
107-
staleTime: 30_000,
108-
retry: false,
109-
}
110-
);
96+
const {data: exactRelease} = useQuery({
97+
...apiOptions.as<Release>()(
98+
'/organizations/$organizationIdOrSlug/releases/$version/',
99+
{
100+
path: {
101+
organizationIdOrSlug: organization.slug,
102+
version: debouncedSearch.trim(),
103+
},
104+
staleTime: 30_000,
105+
}
106+
),
107+
enabled: shouldLookupExact,
108+
retry: false,
109+
});
111110

112111
const options = useMemo((): Array<SelectOption<string>> => {
113112
const baseOptions = releases.map(release =>

static/app/components/versionHoverCard.tsx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {useMemo} from 'react';
22
import styled from '@emotion/styled';
3+
import {useQuery} from '@tanstack/react-query';
34

45
import {AvatarList} from '@sentry/scraps/avatar';
56
import {Tag} from '@sentry/scraps/badge';
@@ -19,9 +20,9 @@ import type {Actor} from 'sentry/types/core';
1920
import type {Organization} from 'sentry/types/organization';
2021
import type {User} from 'sentry/types/user';
2122
import {defined} from 'sentry/utils';
23+
import {deploysApiOptions} from 'sentry/utils/deploysApiOptions';
2224
import {uniqueId} from 'sentry/utils/guid';
23-
import {useDeploys} from 'sentry/utils/useDeploys';
24-
import {useRelease} from 'sentry/utils/useRelease';
25+
import {releaseApiOptions} from 'sentry/utils/releaseApiOptions';
2526
import {useRepositories} from 'sentry/utils/useRepositories';
2627
import {parseVersion} from 'sentry/utils/versions/parseVersion';
2728

@@ -41,19 +42,23 @@ function VersionHoverCardBody({organization, releaseVersion, projectSlug}: BodyP
4142
data: release,
4243
isPending: isReleaseLoading,
4344
isError: isReleaseError,
44-
} = useRelease({
45-
orgSlug: organization.slug,
46-
projectSlug,
47-
releaseVersion,
48-
});
45+
} = useQuery(
46+
releaseApiOptions({
47+
orgSlug: organization.slug,
48+
projectSlug,
49+
releaseVersion,
50+
})
51+
);
4952
const {
5053
data: deploys,
5154
isPending: isDeploysLoading,
5255
isError: isDeploysError,
53-
} = useDeploys({
54-
orgSlug: organization.slug,
55-
releaseVersion,
56-
});
56+
} = useQuery(
57+
deploysApiOptions({
58+
orgSlug: organization.slug,
59+
releaseVersion,
60+
})
61+
);
5762

5863
function getRepoLink() {
5964
const orgSlug = organization.slug;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type {Deploy} from 'sentry/types/release';
2+
import {apiOptions} from 'sentry/utils/api/apiOptions';
3+
4+
export function deploysApiOptions({
5+
orgSlug,
6+
releaseVersion,
7+
query,
8+
}: {
9+
orgSlug: string;
10+
releaseVersion: string;
11+
query?: Record<'project', unknown>;
12+
}) {
13+
return apiOptions.as<Deploy[]>()(
14+
'/organizations/$organizationIdOrSlug/releases/$version/deploys/',
15+
{
16+
path: {
17+
organizationIdOrSlug: orgSlug,
18+
version: releaseVersion,
19+
},
20+
query,
21+
staleTime: Infinity,
22+
}
23+
);
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type {Release} from 'sentry/types/release';
2+
import {apiOptions} from 'sentry/utils/api/apiOptions';
3+
4+
export function releaseApiOptions({
5+
orgSlug,
6+
projectSlug,
7+
releaseVersion,
8+
}: {
9+
orgSlug: string;
10+
projectSlug: string;
11+
releaseVersion: string;
12+
}) {
13+
return apiOptions.as<Release>()(
14+
'/projects/$organizationIdOrSlug/$projectIdOrSlug/releases/$version/',
15+
{
16+
path: {
17+
organizationIdOrSlug: orgSlug,
18+
projectIdOrSlug: projectSlug,
19+
version: releaseVersion,
20+
},
21+
staleTime: Infinity,
22+
}
23+
);
24+
}

static/app/utils/useDeploys.tsx

Lines changed: 0 additions & 32 deletions
This file was deleted.

static/app/utils/useRelease.tsx

Lines changed: 0 additions & 31 deletions
This file was deleted.

static/app/views/dashboards/hooks/useReleases.tsx

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
import {useCallback, useMemo} from 'react';
22
import type {UseQueryResult} from '@tanstack/react-query';
3+
import {useQuery} from '@tanstack/react-query';
34
import chunk from 'lodash/chunk';
45

56
import type {ApiResult} from 'sentry/api';
67
import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
78
import {DEFAULT_RELEASES_SORT, ReleasesSortOption} from 'sentry/constants/releases';
89
import type {Release} from 'sentry/types/release';
10+
import {apiOptions} from 'sentry/utils/api/apiOptions';
911
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
1012
import type {TableData} from 'sentry/utils/discover/discoverQuery';
1113
import {DiscoverDatasets} from 'sentry/utils/discover/types';
12-
import {
13-
fetchDataQuery,
14-
useApiQuery,
15-
useQueries,
16-
type ApiQueryKey,
17-
} from 'sentry/utils/queryClient';
14+
import {fetchDataQuery, useQueries, type ApiQueryKey} from 'sentry/utils/queryClient';
1815
import {escapeFilterValue} from 'sentry/utils/tokenizeSearch';
1916
import {useOrganization} from 'sentry/utils/useOrganization';
2017

@@ -59,30 +56,24 @@ export function useReleases(
5956
: (sortBy ?? DEFAULT_RELEASES_SORT);
6057

6158
// Fetch releases
62-
const releaseResults = useApiQuery<Release[]>(
63-
[
64-
getApiUrl('/organizations/$organizationIdOrSlug/releases/', {
65-
path: {organizationIdOrSlug: organization.slug},
66-
}),
67-
{
68-
query: {
69-
project: projects,
70-
per_page: 50,
71-
environment: environments,
72-
query: searchTerm,
73-
sort: activeSort,
74-
// flatten=1 groups releases across projects when sorting by non-date fields,
75-
// flatten=0 keeps releases separate per project for date sorting
76-
flatten: activeSort === ReleasesSortOption.DATE ? 0 : 1,
77-
},
59+
const releaseResults = useQuery({
60+
...apiOptions.as<Release[]>()('/organizations/$organizationIdOrSlug/releases/', {
61+
path: {organizationIdOrSlug: organization.slug},
62+
query: {
63+
project: projects,
64+
per_page: 50,
65+
environment: environments,
66+
query: searchTerm,
67+
sort: activeSort,
68+
// flatten=1 groups releases across projects when sorting by non-date fields,
69+
// flatten=0 keeps releases separate per project for date sorting
70+
flatten: activeSort === ReleasesSortOption.DATE ? 0 : 1,
7871
},
79-
],
80-
{
8172
staleTime: Infinity,
82-
enabled: isReady,
83-
retry: false,
84-
}
85-
);
73+
}),
74+
enabled: isReady,
75+
retry: false,
76+
});
8677

8778
const allReleases = useMemo(() => releaseResults.data ?? [], [releaseResults.data]);
8879

static/app/views/discover/table/quickContext/releaseContext.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {useEffect, useMemo} from 'react';
22
import styled from '@emotion/styled';
3+
import {useQuery} from '@tanstack/react-query';
34

45
import {AvatarList} from '@sentry/scraps/avatar';
56

@@ -13,9 +14,8 @@ import type {Actor} from 'sentry/types/core';
1314
import type {ReleaseWithHealth} from 'sentry/types/release';
1415
import type {User} from 'sentry/types/user';
1516
import {trackAnalytics} from 'sentry/utils/analytics';
16-
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
17+
import {apiOptions} from 'sentry/utils/api/apiOptions';
1718
import {uniqueId} from 'sentry/utils/guid';
18-
import {useApiQuery} from 'sentry/utils/queryClient';
1919
import {useUser} from 'sentry/utils/useUser';
2020

2121
import {NoContext} from './quickContextWrapper';
@@ -33,18 +33,17 @@ import {ContextType, tenSecondInMs} from './utils';
3333
export function ReleaseContext(props: BaseContextProps) {
3434
const user = useUser();
3535
const {dataRow, organization} = props;
36-
const {isPending, isError, data} = useApiQuery<ReleaseWithHealth>(
37-
[
38-
getApiUrl('/organizations/$organizationIdOrSlug/releases/$version/', {
36+
const {isPending, isError, data} = useQuery(
37+
apiOptions.as<ReleaseWithHealth>()(
38+
'/organizations/$organizationIdOrSlug/releases/$version/',
39+
{
3940
path: {
4041
organizationIdOrSlug: organization.slug,
4142
version: dataRow.release,
4243
},
43-
}),
44-
],
45-
{
46-
staleTime: tenSecondInMs,
47-
}
44+
staleTime: tenSecondInMs,
45+
}
46+
)
4847
);
4948

5049
const authors = useMemo(

0 commit comments

Comments
 (0)