1import { useQuery } from "@tanstack/react-query";
2import { fetch } from "@marzneshin/utils";
3import { UserType } from "../types";
4import {
5 FetchEntityReturn,
6 UseEntityQueryProps,
7 SortableEntitySortQueryProps,
8 EntityQueryKeyType
9} from "@marzneshin/components";
10
11export type SortUserBy = "username" | "used_traffic" | "data_limit" | "expire" | "created_at"
12
13interface UserResponse extends UserType {
14 service_ids: number[]
15 services: any[]
16}
17
18export async function fetchUsers({ queryKey }: EntityQueryKeyType): FetchEntityReturn<UserType> {
19 return fetch(`/users`, {
20 query: {
21 page: queryKey[1],
22 size: queryKey[2],
23 username: queryKey[3],
24 descending: queryKey[5],
25 order_by: queryKey[4]
26 }
27 }).then((result) => {
28 const users: UserType[] = result.items.map((fetchedUser: UserResponse) => {
29 const user: UserType = fetchedUser;
30 user.services = fetchedUser.service_ids
31 return user
32 })
33 return {
34 entity: users,
35 pageCount: result.pages
36 };
37 });
38}
39
40export const UsersQueryFetchKey = "users";
41
42export const useUsersQuery = ({
43 page, size, search = "", sortBy = "created_at", desc = false
44}: UseEntityQueryProps & SortableEntitySortQueryProps) => {
45 return useQuery({
46 queryKey: [UsersQueryFetchKey, page, size, search, sortBy, desc],
47 queryFn: fetchUsers,
48 initialData: { entity: [], pageCount: 0 }
49 })
50}