Skip to content

Commit be9490c

Browse files
authored
chore: Migrate useSelfHostedHasAdmins to TS Query V5 (#3579)
1 parent 753f06c commit be9490c

File tree

7 files changed

+102
-84
lines changed

7 files changed

+102
-84
lines changed

src/App.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ describe('App', () => {
224224
return HttpResponse.json({ data: {} })
225225
}),
226226
graphql.query('HasAdmins', () => {
227-
return HttpResponse.json({ data: {} })
227+
return HttpResponse.json({ data: { config: null } })
228228
}),
229229
graphql.query('owner', () => {
230230
return HttpResponse.json({ data: { owner: { isAdmin: true } } })

src/services/selfHosted/useSelfHostedHasAdmins.test.tsx renamed to src/services/selfHosted/SelfHostedHasAdminsQueryOpts.test.tsx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,61 @@
1-
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
1+
import {
2+
QueryClientProvider as QueryClientProviderV5,
3+
QueryClient as QueryClientV5,
4+
useQuery as useQueryV5,
5+
} from '@tanstack/react-queryV5'
26
import { renderHook, waitFor } from '@testing-library/react'
37
import { graphql, HttpResponse } from 'msw'
48
import { setupServer } from 'msw/node'
5-
import { PropsWithChildren } from 'react'
69
import { z } from 'zod'
710

811
import {
912
HasAdminsSchema,
10-
useSelfHostedHasAdmins,
11-
} from './useSelfHostedHasAdmins'
13+
SelfHostedHasAdminsQueryOpts,
14+
} from './SelfHostedHasAdminsQueryOpts'
1215

13-
const queryClient = new QueryClient({
16+
const queryClientV5 = new QueryClientV5({
1417
defaultOptions: { queries: { retry: false } },
1518
})
16-
const wrapper: React.FC<PropsWithChildren> = ({ children }) => (
17-
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
19+
const wrapper: React.FC<React.PropsWithChildren> = ({ children }) => (
20+
<QueryClientProviderV5 client={queryClientV5}>
21+
{children}
22+
</QueryClientProviderV5>
1823
)
1924
const server = setupServer()
2025
beforeAll(() => {
2126
server.listen()
2227
})
28+
2329
beforeEach(() => {
2430
server.resetHandlers()
25-
queryClient.clear()
31+
queryClientV5.clear()
2632
})
33+
2734
afterAll(() => {
2835
server.close()
2936
})
3037

31-
describe('useSelfHostedHasAdmins', () => {
32-
function setup({ data }: { data: z.infer<typeof HasAdminsSchema> }) {
38+
interface SetupArgs {
39+
data: z.infer<typeof HasAdminsSchema>
40+
}
41+
42+
describe('SelfHostedHasAdminsQueryOpts', () => {
43+
function setup({ data }: SetupArgs) {
3344
server.use(
3445
graphql.query('HasAdmins', () => {
3546
return HttpResponse.json({ data })
3647
})
3748
)
3849
}
50+
3951
describe('when called', () => {
4052
it('returns the user info', async () => {
4153
setup({ data: { config: { hasAdmins: true } } })
4254
const { result } = renderHook(
43-
() => useSelfHostedHasAdmins({ provider: 'gl' }),
55+
() => useQueryV5(SelfHostedHasAdminsQueryOpts({ provider: 'gl' })),
4456
{ wrapper }
4557
)
58+
4659
await waitFor(() => expect(result.current.data).toEqual(true))
4760
})
4861
})
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {
2+
keepPreviousData,
3+
queryOptions as queryOptionsV5,
4+
} from '@tanstack/react-queryV5'
5+
import { z } from 'zod'
6+
7+
import Api from 'shared/api'
8+
import { rejectNetworkError } from 'shared/api/helpers'
9+
10+
export const HasAdminsSchema = z.object({
11+
config: z
12+
.object({
13+
hasAdmins: z.boolean().nullable(),
14+
})
15+
.nullable(),
16+
})
17+
18+
const query = `query HasAdmins { config { hasAdmins } }`
19+
20+
interface SelfHostedHasAdminsQueryArgs {
21+
provider: string
22+
}
23+
24+
export const SelfHostedHasAdminsQueryOpts = ({
25+
provider,
26+
}: SelfHostedHasAdminsQueryArgs) => {
27+
return queryOptionsV5({
28+
queryKey: ['HasAdmins', provider],
29+
queryFn: () =>
30+
Api.graphql({
31+
provider,
32+
query,
33+
}).then((res) => {
34+
const parsedRes = HasAdminsSchema.safeParse(res?.data)
35+
36+
if (!parsedRes.success) {
37+
return rejectNetworkError({
38+
status: 404,
39+
data: {},
40+
dev: 'SelfHostedHasAdminsQueryOpts - 404 schema parsing failed',
41+
error: parsedRes.error,
42+
})
43+
}
44+
45+
return !!parsedRes?.data?.config?.hasAdmins
46+
}),
47+
// this is how TSQuery V5 handles keepPreviousData
48+
placeholderData: keepPreviousData,
49+
})
50+
}

src/services/selfHosted/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export * from './useSelfHostedCurrentUser'
22
export * from './useSelfHostedSeatsConfig'
3-
export * from './useSelfHostedHasAdmins'
43
export * from './useSelfHostedSeatsAndLicense'

src/services/selfHosted/useSelfHostedHasAdmins.ts

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

src/shared/GlobalBanners/MissingDesignatedAdmins/MissingDesignatedAdmins.test.jsx

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
2+
import {
3+
QueryClientProvider as QueryClientProviderV5,
4+
QueryClient as QueryClientV5,
5+
} from '@tanstack/react-queryV5'
26
import { render, screen } from '@testing-library/react'
37
import { graphql, HttpResponse } from 'msw'
48
import { setupServer } from 'msw/node'
9+
import { Suspense } from 'react'
510
import { MemoryRouter, Route } from 'react-router-dom'
611

712
import config from 'config'
@@ -17,6 +22,23 @@ const mockApiCloud = { config: undefined }
1722
const queryClient = new QueryClient({
1823
defaultOptions: { queries: { retry: false } },
1924
})
25+
const queryClientV5 = new QueryClientV5({
26+
defaultOptions: { queries: { retry: false } },
27+
})
28+
29+
const wrapper =
30+
(initialEntries = ['/gh/test-org/test-repo/pull/12']) =>
31+
({ children }) => (
32+
<QueryClientProviderV5 client={queryClientV5}>
33+
<QueryClientProvider client={queryClient}>
34+
<MemoryRouter initialEntries={initialEntries}>
35+
<Route path="/:provider/:owner/:repo/pull/:pullId">
36+
<Suspense fallback={<div>Loading</div>}>{children}</Suspense>
37+
</Route>
38+
</MemoryRouter>
39+
</QueryClientProvider>
40+
</QueryClientProviderV5>
41+
)
2042

2143
const server = setupServer()
2244
beforeAll(() => {
@@ -25,23 +47,14 @@ beforeAll(() => {
2547

2648
afterEach(() => {
2749
queryClient.clear()
50+
queryClientV5.clear()
2851
server.resetHandlers()
2952
})
3053

3154
afterAll(() => {
3255
server.close()
3356
})
3457

35-
const wrapper =
36-
(initialEntries = ['/gh/test-org/test-repo/pull/12']) =>
37-
({ children }) => (
38-
<QueryClientProvider client={queryClient}>
39-
<MemoryRouter initialEntries={initialEntries}>
40-
<Route path="/:provider/:owner/:repo/pull/:pullId">{children}</Route>
41-
</MemoryRouter>
42-
</QueryClientProvider>
43-
)
44-
4558
describe('MissingDesignatedAdmins', () => {
4659
function setup(overrideData) {
4760
server.use(

src/shared/GlobalBanners/MissingDesignatedAdmins/MissingDesignatedAdmins.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { useSuspenseQuery as useSuspenseQueryV5 } from '@tanstack/react-queryV5'
12
import { useParams } from 'react-router-dom'
23

34
import config from 'config'
45

5-
import { useSelfHostedHasAdmins } from 'services/selfHosted'
6+
import { SelfHostedHasAdminsQueryOpts } from 'services/selfHosted/SelfHostedHasAdminsQueryOpts'
67
import { Provider } from 'shared/api/helpers'
78
import A from 'ui/A'
89
import Banner from 'ui/Banner'
@@ -33,9 +34,8 @@ interface URLParams {
3334

3435
const MissingDesignatedAdmins = () => {
3536
const { provider } = useParams<URLParams>()
36-
const { data: hasAdmins, isFetching } = useSelfHostedHasAdmins(
37-
{ provider },
38-
{ enabled: !!provider && !!config.IS_SELF_HOSTED }
37+
const { data: hasAdmins, isFetching } = useSuspenseQueryV5(
38+
SelfHostedHasAdminsQueryOpts({ provider })
3939
)
4040
// This hook is purely side stepping the complexity rule here.
4141
const hideBanner = useHideBanner({

0 commit comments

Comments
 (0)