Skip to content

Commit 27a3bd5

Browse files
committed
Pagination added
1 parent 3b61972 commit 27a3bd5

7 files changed

Lines changed: 116 additions & 52 deletions

File tree

src/api/fetchTeams.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { type Team } from "@/data/schema"
2-
import {type TeamsResponse} from "@/data/schema"
1+
import { type Team, type TeamsResponse } from "@/data/schema";
2+
import { TeamsResponseSchema } from "@/data/schema";
33
import axios from "./axiosConfig";
44

5-
6-
export const fetchTeams = async()=>{
7-
try{
8-
const response = await axios.get<TeamsResponse>('admin/teams?limit=10')
9-
console.log(response.data.data.teams)
10-
return response.data.data.teams;
11-
}catch(err){
12-
throw err;
13-
}
14-
}
15-
16-
5+
export const fetchTeams = async ({ page, limit }: { page: number; limit: number }) => {
6+
try {
7+
const response = await axios.get<TeamsResponse>(
8+
`admin/teams?page=${page}&limit=${limit}`
9+
);
10+
const parsedResponse = TeamsResponseSchema.parse(response.data);
11+
return { teams: parsedResponse.data.teams };
12+
} catch (err) {
13+
console.log(err);
14+
throw err;
15+
}
16+
};

src/api/fetchUsers.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
import { type User } from "@/data/schema"
2-
import {type UserResponse} from "@/data/schema"
1+
import { type UserResponse } from "@/data/schema";
2+
import { usersResponseSchema } from "@/data/schema";
33
import axios from "./axiosConfig";
44

5+
export const fetchUsers = async ({
6+
page,
7+
limit,
8+
}: {
9+
page: number;
10+
limit: number;
11+
}) => {
12+
try {
13+
const response = await axios.get<UserResponse>(
14+
`admin/users?page=${page}&limit=${limit}`
15+
);
516

6-
export const fetchUsers = async()=>{
7-
try{
8-
const response = await axios.get<UserResponse>('admin/users?limit=10')
9-
console.log(response.data)
10-
return response.data.data.users;
11-
}catch(err){
12-
console.log(err)
13-
throw err;
14-
}
15-
}
16-
17-
17+
const parsedResponse = usersResponseSchema.parse(response.data);
18+
return {users: parsedResponse.data.users, totalPages: 100};
19+
} catch (err) {
20+
console.log(err);
21+
throw err;
22+
}
23+
};

src/app/teams/page.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@ import tooms from "@/components/dumTeams.json";
99
import { useQuery } from "@tanstack/react-query";
1010
import { type Team } from "@/data/schema";
1111
import { fetchTeams } from "@/api/fetchTeams";
12+
import { useState } from "react";
1213

1314
export default function Teams() {
15+
const [pageIndex, setPageIndex] = useState(0);
16+
const [pageSize, setPageSize] = useState(10);
17+
1418
const {
15-
data: teamList,
16-
isLoading,
17-
isError,
19+
data: teamList,
20+
isLoading,
21+
isError,
1822
} = useQuery({
19-
queryKey: ["teams"],
20-
queryFn: fetchTeams,
23+
queryKey: ["teams", pageIndex, pageSize],
24+
queryFn: () => fetchTeams({ page: pageIndex + 1, limit: pageSize }),
2125
});
2226

2327
if (isLoading) {
@@ -31,7 +35,15 @@ export default function Teams() {
3135
<div className="p-4">
3236
<div className="mb-4"></div>
3337
{/* <DataTableUsers users={oosers} columns={userCol} /> */}
34-
<DataTable<Team, string> columns={teamCol} data={teamList ?? []} />
38+
<DataTable<Team, string>
39+
columns={teamCol}
40+
data={teamList?.teams ?? []}
41+
pageCount = {100}
42+
onPageChange={setPageIndex}
43+
onPageSizeChange={setPageSize}
44+
currentPage = {pageIndex}
45+
pageSize = {pageSize}
46+
/>
3547
</div>
3648
</>
3749
);

src/app/users/page.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import oosers from "@/components/dumUser.json";
99
import { useQuery } from "@tanstack/react-query";
1010
import { fetchUsers } from "@/api/fetchUsers";
1111
import { User } from "@/data/schema"
12+
import { useState } from "react";
1213

1314

1415
export default function Users() {
@@ -62,13 +63,12 @@ export default function Users() {
6263
// return <>Skill Issue</>
6364
// }
6465

65-
const {
66-
data: userList,
67-
isLoading,
68-
isError,
69-
} = useQuery({
70-
queryKey: ["users"],
71-
queryFn: fetchUsers,
66+
const [pageIndex, setPageIndex] = useState(0);
67+
const [pageSize, setPageSize] = useState(10);
68+
69+
const { data: userList, isLoading, isError } = useQuery({
70+
queryKey: ["users", pageIndex, pageSize],
71+
queryFn: () => fetchUsers({ page: pageIndex + 1, limit: pageSize }),
7272
});
7373

7474
if (isLoading) {
@@ -82,7 +82,15 @@ export default function Users() {
8282
<div className="p-4">
8383
<div className="mb-4"></div>
8484
{/* <DataTableUsers users={oosers} columns={userCol} /> */}
85-
<DataTable<User, string> columns={userCol} data={userList ?? []} />
85+
<DataTable<User, string>
86+
columns={userCol}
87+
data={userList?.users ?? []}
88+
pageCount = {100}
89+
onPageChange={setPageIndex}
90+
onPageSizeChange={setPageSize}
91+
currentPage = {pageIndex}
92+
pageSize = {pageSize}
93+
/>
8694

8795
</div>
8896
);

src/components/table/data-table-pagination.tsx

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,23 @@ import {
1717

1818
interface DataTablePaginationProps<TData> {
1919
table: Table<TData>
20+
onPageChange: (page: number) => void;
21+
onPageSizeChange: (size: number) => void
2022
}
2123

2224
export function DataTablePagination<TData>({
2325
table,
26+
onPageChange,
27+
onPageSizeChange,
2428
}: DataTablePaginationProps<TData>) {
29+
const handlePageChange = (page: number)=>{
30+
onPageChange(page);
31+
table.setPageIndex(page);
32+
}
33+
const handlePageSizeChange = (size: number)=>{
34+
onPageSizeChange(size);
35+
table.setPageSize(size)
36+
}
2537
return (
2638
<div className="flex items-center justify-between px-2">
2739
<div className="flex-1 text-sm text-muted-foreground">
@@ -33,8 +45,8 @@ export function DataTablePagination<TData>({
3345
<p className="text-sm font-medium">Rows per page</p>
3446
<Select
3547
value={`${table.getState().pagination.pageSize}`}
36-
onValueChange={(value : string) => {
37-
table.setPageSize(Number(value))
48+
onValueChange={(value) => {
49+
handlePageSizeChange(Number(value))
3850
}}
3951
>
4052
<SelectTrigger className="h-8 w-[70px]">
@@ -57,7 +69,7 @@ export function DataTablePagination<TData>({
5769
<Button
5870
variant="outline"
5971
className="hidden h-8 w-8 p-0 lg:flex"
60-
onClick={() => table.setPageIndex(0)}
72+
onClick={() => handlePageChange(0)}
6173
disabled={!table.getCanPreviousPage()}
6274
>
6375
<span className="sr-only">Go to first page</span>
@@ -66,7 +78,7 @@ export function DataTablePagination<TData>({
6678
<Button
6779
variant="outline"
6880
className="h-8 w-8 p-0"
69-
onClick={() => table.previousPage()}
81+
onClick={() => handlePageChange(table.getState().pagination.pageIndex - 1)}
7082
disabled={!table.getCanPreviousPage()}
7183
>
7284
<span className="sr-only">Go to previous page</span>
@@ -75,7 +87,7 @@ export function DataTablePagination<TData>({
7587
<Button
7688
variant="outline"
7789
className="h-8 w-8 p-0"
78-
onClick={() => table.nextPage()}
90+
onClick={() => handlePageChange(table.getState().pagination.pageIndex + 1)}
7991
disabled={!table.getCanNextPage()}
8092
>
8193
<span className="sr-only">Go to next page</span>
@@ -84,7 +96,7 @@ export function DataTablePagination<TData>({
8496
<Button
8597
variant="outline"
8698
className="hidden h-8 w-8 p-0 lg:flex"
87-
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
99+
onClick={() => handlePageChange(table.getPageCount() - 1)}
88100
disabled={!table.getCanNextPage()}
89101
>
90102
<span className="sr-only">Go to last page</span>
@@ -94,4 +106,4 @@ export function DataTablePagination<TData>({
94106
</div>
95107
</div>
96108
)
97-
}
109+
}

src/components/table/data-table.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,21 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from ".
2525
interface DataTableProps<TData, TValue> {
2626
columns: ColumnDef<TData, TValue>[];
2727
data: TData[];
28+
pageCount: number | undefined;
29+
onPageChange: (page:number)=>void;
30+
onPageSizeChange: (size: number) => void
31+
currentPage: number;
32+
pageSize: number;
2833
}
2934

3035
export function DataTable<TData, TValue>({
3136
columns,
3237
data,
38+
pageCount,
39+
onPageChange,
40+
onPageSizeChange,
41+
currentPage,
42+
pageSize
3343
}: DataTableProps<TData, TValue>) {
3444
const [rowSelection, setRowSelection] = React.useState({});
3545
const [columnVisibility, setColumnVisibility] =
@@ -39,6 +49,14 @@ export function DataTable<TData, TValue>({
3949
);
4050
const [sorting, setSorting] = React.useState<SortingState>([]);
4151

52+
const pagination = React.useMemo(
53+
() => ({
54+
pageIndex: currentPage,
55+
pageSize,
56+
}),
57+
[currentPage, pageSize]
58+
)
59+
4260
const table = useReactTable({
4361
data,
4462
columns,
@@ -47,6 +65,7 @@ export function DataTable<TData, TValue>({
4765
columnVisibility,
4866
rowSelection,
4967
columnFilters,
68+
pagination
5069
},
5170
enableRowSelection: true,
5271
onRowSelectionChange: setRowSelection,
@@ -59,8 +78,15 @@ export function DataTable<TData, TValue>({
5978
getSortedRowModel: getSortedRowModel(),
6079
getFacetedRowModel: getFacetedRowModel(),
6180
getFacetedUniqueValues: getFacetedUniqueValues(),
81+
manualPagination:true,
82+
pageCount: pageCount,
6283
});
6384

85+
React.useEffect(() => {
86+
table.setPageIndex(currentPage);
87+
table.setPageSize(pageSize);
88+
}, [currentPage, pageSize, table]);
89+
6490
return (
6591
<div className="space-y-4">
6692
<DataTableToolbar table={table} />
@@ -114,7 +140,7 @@ export function DataTable<TData, TValue>({
114140
</TableBody>
115141
</Table>
116142
</div>
117-
<DataTablePagination table={table} />
143+
<DataTablePagination table={table} onPageChange={onPageChange} onPageSizeChange = {onPageSizeChange}/>
118144
</div>
119145
);
120146
}

src/data/schema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const userSchema = z.object({
3131
});
3232

3333
// Response schema
34-
const usersResponseSchema = z.object({
34+
export const usersResponseSchema = z.object({
3535
status: z.string(),
3636
message: z.string(),
3737
data: z.object({
@@ -53,7 +53,7 @@ export const teamSchema = z.object({
5353
IsBanned: z.boolean(),
5454
});
5555

56-
const TeamsResponseSchema = z.object({
56+
export const TeamsResponseSchema = z.object({
5757
status: z.string(),
5858
message: z.string().optional(),
5959
data: z.object({

0 commit comments

Comments
 (0)