gitscope
← marzneshin / v0.3.0-alpha5 / dashboard/src/features/users/services/users.query.ts
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/features/users/services/users.query.ts · TypeScript
Blame Raw
 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}