Skip to content

Commit 72f37d3

Browse files
added gender filter
1 parent 19f7d93 commit 72f37d3

3 files changed

Lines changed: 52 additions & 5 deletions

File tree

src/api/user.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ export const fetchUsers = async ({
66
limit,
77
cursorId,
88
name,
9+
gender,
910
}: {
1011
limit: number;
1112
cursorId?: string;
1213
name?: string;
14+
gender?: string
1315
}) => {
1416
try {
1517
const params = new URLSearchParams({ limit: String(limit) });
@@ -20,7 +22,7 @@ export const fetchUsers = async ({
2022
params.append("cursor", cursorId);
2123
}
2224

23-
const url = `admin/users?${params.toString()}`;
25+
const url = gender? `admin/users/${gender}?${params.toString()}` : `admin/users?${params.toString()}`;
2426

2527
const response = await axios.get<UserResponse>(url);
2628

src/app/users/page.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ import { fetchUsers } from "@/api/user";
99
import loading from "@/assets/images/loading.gif";
1010
import { Button } from "@/components/ui/button";
1111
import { type User } from "@/data/schema";
12-
import { useQuery } from "@tanstack/react-query";
12+
import { useQuery, useQueryClient } from "@tanstack/react-query";
1313
import Image from "next/image";
14-
import { useState } from "react";
14+
import { useEffect, useState } from "react";
1515
import { useDebounce } from "use-debounce";
16+
import SelectGender from "@/components/select-gender";
17+
import toast from "react-hot-toast";
1618

1719
export default function Users() {
20+
const queryClient = useQueryClient();
21+
22+
const [gender, setGender] = useState<string>("");
1823
const [cursorHistory, setCursorHistory] = useState<string[]>([]);
1924
const [currentCursor, setCurrentCursor] = useState<string | undefined>(
2025
undefined,
@@ -34,6 +39,7 @@ export default function Users() {
3439
limit: pageLimit,
3540
cursorId: currentCursor,
3641
name: nameDebounce,
42+
gender: gender,
3743
}),
3844
placeholderData: (previousData) => previousData,
3945
// enabled: !!debouncedSearch,
@@ -54,12 +60,16 @@ export default function Users() {
5460
setCurrentCursor(prevCursor ?? undefined); // Move to previous page
5561
}
5662
};
57-
63+
useEffect(() => {
64+
void queryClient.invalidateQueries({
65+
queryKey: ["users"],
66+
});
67+
}, [gender]);
5868
const onClick = async () => {
5969
try {
6070
const blob = await downloadCSV();
6171

62-
const url = window.URL.createObjectURL(blob );
72+
const url = window.URL.createObjectURL(blob);
6373
const a = document.createElement("a");
6474
a.href = url;
6575
a.download = "users.csv"; // Set the filename for the downloaded file
@@ -84,6 +94,7 @@ export default function Users() {
8494
onChange={(e) => setTheName(e.target.value)}
8595
type="text"
8696
/>
97+
<SelectGender gender={gender} setGender={setGender}></SelectGender>
8798
<Button onClick={onClick}>Download CSV </Button>
8899
</div>
89100

src/components/select-gender.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from "react";
2+
interface SelectGenderProps {
3+
gender: string;
4+
setGender: React.Dispatch<React.SetStateAction<string>>;
5+
}
6+
import {
7+
Select,
8+
SelectContent,
9+
SelectItem,
10+
SelectTrigger,
11+
SelectValue,
12+
} from "@/components/ui/select";
13+
14+
export default function SelectGender({ gender, setGender }: SelectGenderProps) {
15+
return (
16+
<Select
17+
value={gender ?? ""}
18+
onValueChange={(value) => {
19+
setGender(value === "all" ? "" : value);
20+
}}
21+
>
22+
<SelectTrigger className="w-[180px]">
23+
<SelectValue placeholder="Gender" />
24+
</SelectTrigger>
25+
<SelectContent>
26+
<SelectItem value="all">All Genders</SelectItem>
27+
28+
<SelectItem value="M">Male</SelectItem>
29+
<SelectItem value="F">Female</SelectItem>
30+
<SelectItem value="O">Other</SelectItem>
31+
</SelectContent>
32+
</Select>
33+
);
34+
}

0 commit comments

Comments
 (0)