()
| 20 | const DEFAULT_TOTAL_ITEMS = 7; |
| 21 | |
| 22 | export default function Users() { |
| 23 | const [users, setUsers] = useState<GetUsersResponse>({ |
| 24 | items: [], |
| 25 | totalPages: 1, |
| 26 | }); |
| 27 | const [isLoading, setIsLoading] = useState<boolean>(false); |
| 28 | const searchParams = useSearchParams(); |
| 29 | |
| 30 | const [currentSearch, setCurrentSearch] = useQueryState("search", { |
| 31 | defaultValue: "", |
| 32 | }); |
| 33 | const [page, setPage] = useQueryState("page", parseAsInteger.withDefault(1)); |
| 34 | const [totalItems, setTotalItems] = useQueryState( |
| 35 | "totalItems", |
| 36 | parseAsInteger.withDefault(0) |
| 37 | ); |
| 38 | |
| 39 | const search = searchParams.get("search"); |
| 40 | |
| 41 | // TODO: Remove this useEffect, use new hooks |
| 42 | useEffect(() => { |
| 43 | const fetchUsers = async () => { |
| 44 | setIsLoading(true); |
| 45 | const users = await getUsers({ |
| 46 | page: page < 1 ? DEFAULT_PAGE : page, |
| 47 | totalItems: totalItems < 1 ? DEFAULT_TOTAL_ITEMS : totalItems, |
| 48 | search, |
| 49 | }); |
| 50 | setUsers(users); |
| 51 | setIsLoading(false); |
| 52 | }; |
| 53 | |
| 54 | fetchUsers(); |
| 55 | }, [search, page, totalItems]); |
| 56 | |
| 57 | return ( |
| 58 | <div className="m-10 flex flex-col gap-5"> |
| 59 | <div className="flex justify-between gap-3 w-full"> |
| 60 | <div> |
| 61 | <Input |
| 62 | value={currentSearch} |
| 63 | placeholder="Search" |
| 64 | onChange={(e) => setCurrentSearch(e.target.value)} |
| 65 | /> |
| 66 | </div> |
| 67 | |
| 68 | <Select onValueChange={(value) => setTotalItems(parseInt(value))}> |
| 69 | <SelectTrigger className="w-[180px]"> |
| 70 | <SelectValue placeholder="Total Items" /> |
| 71 | </SelectTrigger> |
| 72 | <SelectContent> |
| 73 | <SelectItem value="5">5</SelectItem> |
| 74 | <SelectItem value="10">10</SelectItem> |
| 75 | <SelectItem value="20">20</SelectItem> |
| 76 | <SelectItem value="50">50</SelectItem> |
| 77 | </SelectContent> |
| 78 | </Select> |
| 79 | </div> |
nothing calls this directly
no test coverage detected