Skip to content

Commit 579fdef

Browse files
committed
ref(tsc): projectTeams endpoint to apiOptions
1 parent a16fcfa commit 579fdef

File tree

2 files changed

+38
-49
lines changed

2 files changed

+38
-49
lines changed

static/app/actionCreators/projects.tsx

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {useCallback} from 'react';
2+
import {queryOptions, skipToken, useQueryClient} from '@tanstack/react-query';
23
import type {Query} from 'history';
34
import chunk from 'lodash/chunk';
45
import debounce from 'lodash/debounce';
@@ -14,9 +15,7 @@ import {ProjectsStatsStore} from 'sentry/stores/projectsStatsStore';
1415
import {ProjectsStore} from 'sentry/stores/projectsStore';
1516
import type {Team} from 'sentry/types/organization';
1617
import type {Project} from 'sentry/types/project';
17-
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
18-
import type {ApiQueryKey} from 'sentry/utils/queryClient';
19-
import {setApiQueryData, useApiQuery, useQueryClient} from 'sentry/utils/queryClient';
18+
import {apiOptions} from 'sentry/utils/api/apiOptions';
2019
import {useApi} from 'sentry/utils/useApi';
2120

2221
type UpdateParams = {
@@ -284,27 +283,7 @@ export function fetchProjectsCount(api: Client, orgSlug: string) {
284283
return api.requestPromise(`/organizations/${orgSlug}/projects-count/`);
285284
}
286285

287-
function makeProjectTeamsQueryKey({
288-
orgSlug,
289-
projectSlug,
290-
cursor,
291-
}: {
292-
orgSlug: string;
293-
projectSlug: string;
294-
cursor?: string;
295-
}): ApiQueryKey {
296-
return [
297-
getApiUrl('/projects/$organizationIdOrSlug/$projectIdOrSlug/teams/', {
298-
path: {
299-
organizationIdOrSlug: orgSlug,
300-
projectIdOrSlug: projectSlug,
301-
},
302-
}),
303-
{query: {cursor}},
304-
];
305-
}
306-
307-
export function useFetchProjectTeams({
286+
export function projectTeamsApiOptions({
308287
orgSlug,
309288
projectSlug,
310289
cursor,
@@ -313,10 +292,19 @@ export function useFetchProjectTeams({
313292
projectSlug: string;
314293
cursor?: string;
315294
}) {
316-
return useApiQuery<Team[]>(makeProjectTeamsQueryKey({orgSlug, projectSlug, cursor}), {
317-
staleTime: 0,
295+
return queryOptions({
296+
...apiOptions.as<Team[]>()(
297+
'/projects/$organizationIdOrSlug/$projectIdOrSlug/teams/',
298+
{
299+
path:
300+
orgSlug && projectSlug
301+
? {organizationIdOrSlug: orgSlug, projectIdOrSlug: projectSlug}
302+
: skipToken,
303+
query: {cursor},
304+
staleTime: 0,
305+
}
306+
),
318307
retry: false,
319-
enabled: Boolean(orgSlug && projectSlug),
320308
});
321309
}
322310

@@ -331,18 +319,17 @@ export function useAddTeamToProject({
331319
}) {
332320
const api = useApi();
333321
const queryClient = useQueryClient();
322+
const {queryKey} = projectTeamsApiOptions({orgSlug, projectSlug, cursor});
334323

335324
return useCallback(
336325
async (team: Team) => {
337326
await addTeamToProject(api, orgSlug, projectSlug, team);
338327

339-
setApiQueryData<Team[]>(
340-
queryClient,
341-
makeProjectTeamsQueryKey({orgSlug, projectSlug, cursor}),
342-
prevData => (Array.isArray(prevData) ? [team, ...prevData] : [team])
328+
queryClient.setQueryData(queryKey, prevData =>
329+
prevData ? {...prevData, json: [team, ...prevData.json]} : prevData
343330
);
344331
},
345-
[api, orgSlug, projectSlug, cursor, queryClient]
332+
[api, orgSlug, projectSlug, queryKey, queryClient]
346333
);
347334
}
348335

@@ -357,18 +344,18 @@ export function useRemoveTeamFromProject({
357344
}) {
358345
const api = useApi();
359346
const queryClient = useQueryClient();
347+
const {queryKey} = projectTeamsApiOptions({orgSlug, projectSlug, cursor});
360348

361349
return useCallback(
362350
async (teamSlug: string) => {
363351
await removeTeamFromProject(api, orgSlug, projectSlug, teamSlug);
364352

365-
setApiQueryData<Team[]>(
366-
queryClient,
367-
makeProjectTeamsQueryKey({orgSlug, projectSlug, cursor}),
368-
prevData =>
369-
Array.isArray(prevData) ? prevData.filter(team => team?.slug !== teamSlug) : []
353+
queryClient.setQueryData(queryKey, prevData =>
354+
prevData
355+
? {...prevData, json: prevData.json.filter(team => team?.slug !== teamSlug)}
356+
: prevData
370357
);
371358
},
372-
[api, orgSlug, projectSlug, cursor, queryClient]
359+
[api, orgSlug, projectSlug, queryKey, queryClient]
373360
);
374361
}

static/app/views/settings/project/projectTeams.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import {useQuery} from '@tanstack/react-query';
2+
13
import {addErrorMessage} from 'sentry/actionCreators/indicator';
24
import {
5+
projectTeamsApiOptions,
36
useAddTeamToProject,
4-
useFetchProjectTeams,
57
useRemoveTeamFromProject,
68
} from 'sentry/actionCreators/projects';
79
import {hasEveryAccess} from 'sentry/components/acl/access';
@@ -12,6 +14,7 @@ import {Pagination} from 'sentry/components/pagination';
1214
import {SentryDocumentTitle} from 'sentry/components/sentryDocumentTitle';
1315
import {t, tct} from 'sentry/locale';
1416
import {TeamStore} from 'sentry/stores/teamStore';
17+
import {selectJsonWithHeaders} from 'sentry/utils/api/apiOptions';
1518
import {decodeScalar} from 'sentry/utils/queryString';
1619
import {routeTitleGen} from 'sentry/utils/routeTitle';
1720
import {useLocation} from 'sentry/utils/useLocation';
@@ -29,16 +32,15 @@ export default function ProjectTeams() {
2932
const organization = useOrganization();
3033
const {project} = useProjectSettingsOutlet();
3134

32-
const {
33-
data: projectTeams,
34-
isPending,
35-
isError,
36-
getResponseHeader,
37-
} = useFetchProjectTeams({
38-
orgSlug: organization.slug,
39-
projectSlug: project.slug,
40-
cursor: decodeScalar(location.query.cursor),
35+
const {data, isPending, isError} = useQuery({
36+
...projectTeamsApiOptions({
37+
orgSlug: organization.slug,
38+
projectSlug: project.slug,
39+
cursor: decodeScalar(location.query.cursor),
40+
}),
41+
select: selectJsonWithHeaders,
4142
});
43+
const projectTeams = data?.json;
4244

4345
const handleAddTeamToProject = useAddTeamToProject({
4446
orgSlug: organization.slug,
@@ -107,7 +109,7 @@ export default function ProjectTeams() {
107109
onRemoveTeam={handleRemoveTeamFromProject}
108110
onCreateTeam={handleAddTeamToProject}
109111
/>
110-
<Pagination pageLinks={getResponseHeader?.('Link')} onCursor={handleCursor} />
112+
<Pagination pageLinks={data?.headers.Link} onCursor={handleCursor} />
111113
</div>
112114
</SentryDocumentTitle>
113115
);

0 commit comments

Comments
 (0)