Skip to content

Commit 95dc5ce

Browse files
committed
paginate game activity page
1 parent 891a364 commit 95dc5ce

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

src/api/useGameActivities.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,32 @@ import makeValidatedGetRequest from './makeValidatedGetRequest'
55
import { z } from 'zod'
66
import { gameActivitySchema } from '../entities/gameActivity'
77

8-
export default function useGameActivities(activeGame: Game) {
9-
const fetcher = async ([url]: [string]) => {
10-
const res = await makeValidatedGetRequest(url, z.object({
11-
activities: z.array(gameActivitySchema)
8+
export default function useGameActivities(activeGame: Game, page: number) {
9+
const fetcher = async ([url, page]: [string, number]) => {
10+
const qs = new URLSearchParams({
11+
page: String(page)
12+
}).toString()
13+
14+
const res = await makeValidatedGetRequest(`${url}?${qs}`, z.object({
15+
activities: z.array(gameActivitySchema),
16+
count: z.number(),
17+
itemsPerPage: z.number(),
18+
isLastPage: z.boolean()
1219
}))
1320

1421
return res
1522
}
1623

1724
const { data, error } = useSWR(
18-
[`/games/${activeGame.id}/game-activities`],
25+
[`/games/${activeGame.id}/game-activities`, page],
1926
fetcher
2027
)
2128

2229
return {
2330
activities: data?.activities ?? [],
31+
count: data?.count,
32+
itemsPerPage: data?.itemsPerPage,
33+
isLastPage: data?.isLastPage,
2434
loading: !data && !error,
2535
error: error && buildError(error)
2636
}

src/pages/Activity.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState } from 'react'
12
import useGameActivities from '../api/useGameActivities'
23
import ErrorMessage from '../components/ErrorMessage'
34
import activeGameState, { SelectedActiveGame } from '../state/activeGameState'
@@ -7,10 +8,13 @@ import { secondaryNavRoutes } from '../constants/secondaryNavRoutes'
78
import Page from '../components/Page'
89
import useDaySections from '../utils/useDaySections'
910
import ActivityRenderer from '../components/ActivityRenderer'
11+
import Pagination from '../components/Pagination'
1012

1113
export default function Activity() {
14+
const [page, setPage] = useState(0)
15+
1216
const activeGame = useRecoilValue(activeGameState) as SelectedActiveGame
13-
const { activities, loading, error } = useGameActivities(activeGame)
17+
const { activities, count, itemsPerPage, loading, error } = useGameActivities(activeGame, page)
1418
const sections = useDaySections(activities)
1519

1620
return (
@@ -28,6 +32,8 @@ export default function Activity() {
2832
))}
2933

3034
{error && <ErrorMessage error={error} />}
35+
36+
{!!count && <Pagination count={count!} pageState={[page, setPage]} itemsPerPage={itemsPerPage!} />}
3137
</Page>
3238
)
3339
}

src/pages/__tests__/Activity.test.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('<Activity />', () => {
1212
const axiosMock = new MockAdapter(api)
1313

1414
it('should handle having no activities', async () => {
15-
axiosMock.onGet('http://talo.api/games/1/game-activities').replyOnce(200, { activities: [] })
15+
axiosMock.onGet(/games\/1\/game-activities/).replyOnce(200, { activities: [], count: 0, itemsPerPage: 25, isLastPage: true })
1616

1717
render(
1818
<KitchenSink
@@ -49,7 +49,7 @@ describe('<Activity />', () => {
4949
}
5050
]
5151

52-
axiosMock.onGet('http://talo.api/games/2/game-activities').replyOnce(200, { activities })
52+
axiosMock.onGet(/games\/2\/game-activities/).replyOnce(200, { activities, count: 3, itemsPerPage: 25, isLastPage: true })
5353

5454
render(
5555
<KitchenSink
@@ -89,7 +89,7 @@ describe('<Activity />', () => {
8989
}
9090
]
9191

92-
axiosMock.onGet('http://talo.api/games/3/game-activities').replyOnce(200, { activities })
92+
axiosMock.onGet(/games\/3\/game-activities/).replyOnce(200, { activities, count: 3, itemsPerPage: 25, isLastPage: true })
9393

9494
render(
9595
<KitchenSink
@@ -127,7 +127,7 @@ describe('<Activity />', () => {
127127
}
128128
]
129129

130-
axiosMock.onGet('http://talo.api/games/4/game-activities').replyOnce(200, { activities })
130+
axiosMock.onGet(/games\/4\/game-activities/).replyOnce(200, { activities, count: 3, itemsPerPage: 25, isLastPage: true })
131131

132132
render(
133133
<KitchenSink
@@ -155,7 +155,7 @@ describe('<Activity />', () => {
155155
})
156156

157157
it('should render an error', async () => {
158-
axiosMock.onGet('http://talo.api/games/5/game-activities').networkErrorOnce()
158+
axiosMock.onGet(/games\/5\/game-activities/).networkErrorOnce()
159159

160160
render(
161161
<KitchenSink

0 commit comments

Comments
 (0)