Skip to content

Commit c68ec37

Browse files
ref: Migrate useSessions to TSQ V5 (#3715)
1 parent b1ba9f0 commit c68ec37

File tree

8 files changed

+100
-103
lines changed

8 files changed

+100
-103
lines changed

src/pages/AccountSettings/tabs/Access/Access.test.tsx

+25-19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
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, waitFor } from '@testing-library/react'
37
import userEvent from '@testing-library/user-event'
48
import { subDays } from 'date-fns'
@@ -80,31 +84,32 @@ const mockSessionInfo = {
8084
}
8185

8286
const queryClient = new QueryClient({
83-
defaultOptions: {
84-
queries: {
85-
suspense: true,
86-
},
87-
},
87+
defaultOptions: { queries: { retry: false, suspense: true } },
88+
})
89+
const queryClientV5 = new QueryClientV5({
90+
defaultOptions: { queries: { retry: false } },
8891
})
8992

9093
let testLocation: ReturnType<typeof useLocation>
9194
const wrapper: (initialEntries?: string) => React.FC<React.PropsWithChildren> =
9295
(initialEntries = '/account/gh/janedoe/access') =>
9396
({ children }) => (
94-
<QueryClientProvider client={queryClient}>
95-
<MemoryRouter initialEntries={[initialEntries]}>
96-
<Suspense fallback={<p>loading</p>}>
97-
<Route path="/account/:provider/:owner/access">{children}</Route>
98-
<Route
99-
path="*"
100-
render={({ location }) => {
101-
testLocation = location
102-
return null
103-
}}
104-
/>
105-
</Suspense>
106-
</MemoryRouter>
107-
</QueryClientProvider>
97+
<QueryClientProviderV5 client={queryClientV5}>
98+
<QueryClientProvider client={queryClient}>
99+
<MemoryRouter initialEntries={[initialEntries]}>
100+
<Suspense fallback={<p>loading</p>}>
101+
<Route path="/account/:provider/:owner/access">{children}</Route>
102+
<Route
103+
path="*"
104+
render={({ location }) => {
105+
testLocation = location
106+
return null
107+
}}
108+
/>
109+
</Suspense>
110+
</MemoryRouter>
111+
</QueryClientProvider>
112+
</QueryClientProviderV5>
108113
)
109114

110115
const server = setupServer()
@@ -114,6 +119,7 @@ beforeAll(() => {
114119

115120
afterEach(() => {
116121
queryClient.clear()
122+
queryClientV5.clear()
117123
server.resetHandlers()
118124
})
119125

src/pages/AccountSettings/tabs/Access/Access.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import { useSuspenseQuery as useSuspenseQueryV5 } from '@tanstack/react-queryV5'
12
import { useState } from 'react'
23
import { Redirect, useParams } from 'react-router-dom'
34

4-
import { useSessions } from 'services/access'
5+
import { SessionsQueryOpts } from 'services/access/SessionsQueryOpts'
56
import { useUser } from 'services/user'
67
import Button from 'ui/Button'
78

@@ -18,9 +19,9 @@ function Access() {
1819
const { provider, owner } = useParams<URLParams>()
1920
const [showModal, setShowModal] = useState(false)
2021

21-
const { data: sessionData } = useSessions({
22-
provider,
23-
})
22+
const { data: sessionData } = useSuspenseQueryV5(
23+
SessionsQueryOpts({ provider })
24+
)
2425

2526
const { data: currentUser } = useUser()
2627

src/pages/AccountSettings/tabs/Access/SessionsTable.test.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { setupServer } from 'msw/node'
66
import { MemoryRouter, Route } from 'react-router-dom'
77
import { type Mock } from 'vitest'
88

9-
import { Session } from 'services/access'
9+
import { Session } from 'services/access/SessionsQueryOpts'
1010
import { formatTimeToNow } from 'shared/utils/dates'
1111

1212
import SessionsTable from './SessionsTable'

src/pages/AccountSettings/tabs/Access/SessionsTable.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import isNull from 'lodash/isNull'
88
import { useCallback, useMemo } from 'react'
99
import { useParams } from 'react-router-dom'
1010

11-
import { Session, useDeleteSession } from 'services/access'
11+
import { useDeleteSession } from 'services/access'
12+
import { Session } from 'services/access/SessionsQueryOpts'
1213
import { cn } from 'shared/utils/cn'
1314
import { formatTimeToNow } from 'shared/utils/dates'
1415
import Button from 'ui/Button'

src/pages/AccountSettings/tabs/Access/TokensTable.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import isNull from 'lodash/isNull'
88
import { useCallback, useMemo } from 'react'
99
import { useParams } from 'react-router-dom'
1010

11-
import { useRevokeUserToken, UserToken } from 'services/access'
11+
import { useRevokeUserToken } from 'services/access'
12+
import { UserToken } from 'services/access/SessionsQueryOpts'
1213
import { cn } from 'shared/utils/cn'
1314
import Button from 'ui/Button'
1415

src/services/access/useSessions.test.tsx src/services/access/SessionsQueryOpts.test.tsx

+35-44
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
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'
@@ -7,18 +11,7 @@ import { MemoryRouter, Route } from 'react-router-dom'
711

812
import { mapEdges } from 'shared/utils/graphql'
913

10-
import { Session, UserToken, useSessions } from './useSessions'
11-
12-
const queryClient = new QueryClient({
13-
defaultOptions: { queries: { retry: false } },
14-
})
15-
const wrapper: React.FC<React.PropsWithChildren> = ({ children }) => (
16-
<MemoryRouter initialEntries={['/gh']}>
17-
<Route path="/:provider">
18-
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
19-
</Route>
20-
</MemoryRouter>
21-
)
14+
import { Session, SessionsQueryOpts, UserToken } from './SessionsQueryOpts'
2215

2316
const provider = 'gh'
2417

@@ -71,14 +64,25 @@ const tokens: { edges: { node: UserToken }[] } = {
7164
],
7265
}
7366

67+
const queryClientV5 = new QueryClientV5({
68+
defaultOptions: { queries: { retry: false } },
69+
})
70+
const wrapper: React.FC<React.PropsWithChildren> = ({ children }) => (
71+
<QueryClientProviderV5 client={queryClientV5}>
72+
<MemoryRouter initialEntries={['/gh']}>
73+
<Route path="/:provider">{children}</Route>
74+
</MemoryRouter>
75+
</QueryClientProviderV5>
76+
)
77+
7478
const server = setupServer()
7579
beforeAll(() => {
7680
server.listen()
7781
})
7882

7983
beforeEach(() => {
8084
server.resetHandlers()
81-
queryClient.clear()
85+
queryClientV5.clear()
8286
})
8387

8488
afterAll(() => {
@@ -119,14 +123,12 @@ describe('useSessions', () => {
119123
}
120124

121125
describe('when called and response parsing fails', () => {
122-
beforeEach(() => {
123-
setup({ isUnsuccessfulParseError: true })
124-
})
125-
126126
it('throws a 404', async () => {
127-
const { result } = renderHook(() => useSessions({ provider }), {
128-
wrapper,
129-
})
127+
setup({ isUnsuccessfulParseError: true })
128+
const { result } = renderHook(
129+
() => useQueryV5(SessionsQueryOpts({ provider })),
130+
{ wrapper }
131+
)
130132

131133
await waitFor(() => expect(result.current.isError).toBeTruthy())
132134
await waitFor(() =>
@@ -141,43 +143,32 @@ describe('useSessions', () => {
141143
})
142144

143145
describe('when called and user is unauthenticated', () => {
144-
beforeEach(() => {
145-
setup({
146-
dataReturned: {
147-
me: null,
148-
},
149-
})
150-
})
151-
152146
it('returns null', async () => {
153-
const { result } = renderHook(() => useSessions({ provider }), {
154-
wrapper,
155-
})
147+
setup({ dataReturned: { me: null } })
148+
const { result } = renderHook(
149+
() => useQueryV5(SessionsQueryOpts({ provider })),
150+
{ wrapper }
151+
)
156152

157153
await waitFor(() => expect(result.current.data).toEqual(null))
158154
})
159155
})
160156

161157
describe('when called and user is authenticated', () => {
162-
beforeEach(() => {
158+
it('returns sessions', async () => {
163159
setup({
164160
dataReturned: {
165161
me: {
166-
sessions: {
167-
edges: [...sessions.edges],
168-
},
169-
tokens: {
170-
edges: [...tokens.edges],
171-
},
162+
sessions: { edges: [...sessions.edges] },
163+
tokens: { edges: [...tokens.edges] },
172164
},
173165
},
174166
})
175-
})
176167

177-
it('returns sessions', async () => {
178-
const { result } = renderHook(() => useSessions({ provider }), {
179-
wrapper,
180-
})
168+
const { result } = renderHook(
169+
() => useQueryV5(SessionsQueryOpts({ provider })),
170+
{ wrapper }
171+
)
181172

182173
await waitFor(() =>
183174
expect(result.current.data).toEqual({

src/services/access/useSessions.ts src/services/access/SessionsQueryOpts.ts

+30-32
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useQuery } from '@tanstack/react-query'
1+
import { queryOptions as queryOptionsV5 } from '@tanstack/react-queryV5'
22
import { z } from 'zod'
33

44
import Api from 'shared/api'
@@ -47,42 +47,40 @@ const RequestSchema = z.object({
4747
.nullable(),
4848
})
4949

50-
interface UseSessionsArgs {
51-
provider: string
52-
}
53-
54-
export function useSessions({ provider }: UseSessionsArgs) {
55-
const query = `
56-
query MySessions {
57-
me {
58-
sessions {
59-
edges {
60-
node{
61-
sessionid
62-
name
63-
ip
64-
lastseen
65-
useragent
66-
type
67-
lastFour
68-
}
69-
}
50+
const query = `query MySessions {
51+
me {
52+
sessions {
53+
edges {
54+
node {
55+
sessionid
56+
name
57+
ip
58+
lastseen
59+
useragent
60+
type
61+
lastFour
7062
}
71-
tokens {
72-
edges {
73-
node {
74-
type
75-
name
76-
lastFour
77-
id
78-
}
79-
}
63+
}
64+
}
65+
tokens {
66+
edges {
67+
node {
68+
type
69+
name
70+
lastFour
71+
id
8072
}
8173
}
8274
}
83-
`
75+
}
76+
}`
77+
78+
interface SessionsQueryArgs {
79+
provider: string
80+
}
8481

85-
return useQuery({
82+
export function SessionsQueryOpts({ provider }: SessionsQueryArgs) {
83+
return queryOptionsV5({
8684
queryKey: ['sessions', provider, query],
8785
queryFn: ({ signal }) =>
8886
Api.graphql({

src/services/access/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
export * from './useSessions'
21
export * from './useDeleteSession'
32
export * from './useRevokeUserToken'
43
export * from './useGenerateUserToken'

0 commit comments

Comments
 (0)