gitscope
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/users.store.ts · v0.1.2
Source
1 89f8f93 Mardin 2y ago import { User, UserCreate } from 'types/user';
2 4205669 Mardin 2y ago import { subscribeWithSelector } from 'zustand/middleware';
3 4205669 Mardin 2y ago import { create } from 'zustand';
4 6aab6f0 Mrdn 2y ago import { pageSizeManagers } from 'utils/userPreferenceStorage';
5 4205669 Mardin 2y ago import { fetch } from 'service/http';
6 89f8f93 Mardin 2y ago import { useServices, useDashboard } from 'stores';
7 bedeeff Mardin 2y ago import { StatisticsQueryKey } from 'components/statistics-card';
8 bedeeff Mardin 2y ago import { queryClient } from 'service/react-query';
9 89f8f93 Mardin 2y ago import { UsersFilterType, FilterUsageType } from 'types/filter';
10 a61ba53 Mrdn 2y ago import { queryIds } from 'constants/query-ids';
11 4205669 Mardin 2y ago
12 4205669 Mardin 2y ago type UsersStateType = {
13 4205669 Mardin 2y ago isCreatingNewUser: boolean;
14 4205669 Mardin 2y ago editingUser: User | null | undefined;
15 4205669 Mardin 2y ago deletingUser: User | null;
16 4205669 Mardin 2y ago usersFilters: UsersFilterType;
17 4205669 Mardin 2y ago resetUsageUser: User | null;
18 4205669 Mardin 2y ago revokeSubscriptionUser: User | null;
19 4205669 Mardin 2y ago isResetingAllUsage: boolean;
20 4205669 Mardin 2y ago subscribeUrl: string | null;
21 4205669 Mardin 2y ago QRcodeLinks: string[] | null;
22 4205669 Mardin 2y ago setQRCode: (links: string[] | null) => void;
23 4205669 Mardin 2y ago setSubLink: (subscribeURL: string | null) => void;
24 4205669 Mardin 2y ago onResetAllUsage: (isResetingAllUsage: boolean) => void;
25 4205669 Mardin 2y ago resetAllUsage: () => Promise<void>;
26 4205669 Mardin 2y ago resetDataUsage: (user: User) => Promise<void>;
27 4205669 Mardin 2y ago revokeSubscription: (user: User) => Promise<void>;
28 4205669 Mardin 2y ago onCreateUser: (isOpen: boolean) => void;
29 4205669 Mardin 2y ago onEditingUser: (user: User | null) => void;
30 4205669 Mardin 2y ago onDeletingUser: (user: User | null) => void;
31 4205669 Mardin 2y ago refetchUsers: () => void;
32 4205669 Mardin 2y ago onFilterChange: (filters: Partial<UsersFilterType>) => void;
33 4205669 Mardin 2y ago deleteUser: (user: User) => Promise<void>;
34 4205669 Mardin 2y ago createUser: (user: UserCreate) => Promise<void>;
35 4205669 Mardin 2y ago editUser: (user: UserCreate) => Promise<void>;
36 4205669 Mardin 2y ago fetchUserUsage: (user: User, query: FilterUsageType) => Promise<void>;
37 4205669 Mardin 2y ago }
38 4205669 Mardin 2y ago
39 a61ba53 Mrdn 2y ago type UserResponse = {
40 a61ba53 Mrdn 2y ago total: number,
41 a61ba53 Mrdn 2y ago users: User[]
42 a61ba53 Mrdn 2y ago }
43 a61ba53 Mrdn 2y ago
44 a61ba53 Mrdn 2y ago export const fetchUsers = async (query: UsersFilterType): Promise<UserResponse> => {
45 4205669 Mardin 2y ago for (const key in query) {
46 4205669 Mardin 2y ago if (!query[key as keyof UsersFilterType]) delete query[key as keyof UsersFilterType];
47 4205669 Mardin 2y ago }
48 4205669 Mardin 2y ago useDashboard.setState({ loading: true });
49 4205669 Mardin 2y ago return fetch('/users', { query })
50 4205669 Mardin 2y ago .then((users) => {
51 4205669 Mardin 2y ago for (let i = 0; i < users.users.length; i++) {
52 4205669 Mardin 2y ago users.users[i].service = users.users[i].service_ids;
53 4205669 Mardin 2y ago }
54 4205669 Mardin 2y ago return users;
55 4205669 Mardin 2y ago })
56 4205669 Mardin 2y ago .finally(() => {
57 4205669 Mardin 2y ago useDashboard.setState({ loading: false });
58 4205669 Mardin 2y ago });
59 4205669 Mardin 2y ago };
60 4205669 Mardin 2y ago
61 4205669 Mardin 2y ago export const useUsers = create(subscribeWithSelector<UsersStateType>((set, get) => ({
62 4205669 Mardin 2y ago editingUser: null,
63 4205669 Mardin 2y ago deletingUser: null,
64 4205669 Mardin 2y ago isCreatingNewUser: false,
65 4205669 Mardin 2y ago resetUsageUser: null,
66 4205669 Mardin 2y ago revokeSubscriptionUser: null,
67 4205669 Mardin 2y ago isResetingAllUsage: false,
68 4205669 Mardin 2y ago usersFilters: {
69 4205669 Mardin 2y ago username: '',
70 6aab6f0 Mrdn 2y ago limit: pageSizeManagers.users.getPageSize(),
71 4205669 Mardin 2y ago sort: '-created_at',
72 4205669 Mardin 2y ago },
73 4205669 Mardin 2y ago QRcodeLinks: null,
74 4205669 Mardin 2y ago subscribeUrl: null,
75 4205669 Mardin 2y ago setQRCode: (QRcodeLinks) => {
76 4205669 Mardin 2y ago set({ QRcodeLinks });
77 4205669 Mardin 2y ago },
78 4205669 Mardin 2y ago setSubLink: (subscribeUrl) => {
79 4205669 Mardin 2y ago set({ subscribeUrl });
80 4205669 Mardin 2y ago },
81 4205669 Mardin 2y ago refetchUsers: () => {
82 a61ba53 Mrdn 2y ago queryClient.invalidateQueries(queryIds.users);
83 4205669 Mardin 2y ago },
84 4205669 Mardin 2y ago resetAllUsage: async () => {
85 4205669 Mardin 2y ago return fetch('/users/reset', { method: 'POST' }).then(() => {
86 4205669 Mardin 2y ago get().onResetAllUsage(false);
87 4205669 Mardin 2y ago get().refetchUsers();
88 4205669 Mardin 2y ago });
89 4205669 Mardin 2y ago },
90 4205669 Mardin 2y ago onResetAllUsage: (isResetingAllUsage) => set({ isResetingAllUsage }),
91 4205669 Mardin 2y ago onCreateUser: (isCreatingNewUser) => set({ isCreatingNewUser }),
92 4205669 Mardin 2y ago onEditingUser: (editingUser) => {
93 4205669 Mardin 2y ago set({ editingUser });
94 4205669 Mardin 2y ago },
95 4205669 Mardin 2y ago onDeletingUser: (deletingUser) => {
96 4205669 Mardin 2y ago set({ deletingUser });
97 4205669 Mardin 2y ago },
98 4205669 Mardin 2y ago onFilterChange: (filters) => {
99 4205669 Mardin 2y ago set({
100 4205669 Mardin 2y ago usersFilters: {
101 4205669 Mardin 2y ago ...get().usersFilters,
102 4205669 Mardin 2y ago ...filters,
103 4205669 Mardin 2y ago },
104 4205669 Mardin 2y ago });
105 4205669 Mardin 2y ago get().refetchUsers();
106 4205669 Mardin 2y ago },
107 4205669 Mardin 2y ago deleteUser: async (user: User) => {
108 4205669 Mardin 2y ago set({ editingUser: null });
109 bedeeff Mardin 2y ago return fetch(`/users/${user.username}`, { method: 'DELETE' }).then(() => {
110 4205669 Mardin 2y ago set({ deletingUser: null });
111 4205669 Mardin 2y ago get().refetchUsers();
112 4205669 Mardin 2y ago queryClient.invalidateQueries(StatisticsQueryKey);
113 4205669 Mardin 2y ago });
114 4205669 Mardin 2y ago },
115 4205669 Mardin 2y ago createUser: async (body: UserCreate) => {
116 bedeeff Mardin 2y ago return fetch('/users', { method: 'POST', body }).then(() => {
117 4205669 Mardin 2y ago set({ editingUser: null });
118 4205669 Mardin 2y ago get().refetchUsers();
119 4205669 Mardin 2y ago useServices.getState().refetchServices();
120 4205669 Mardin 2y ago queryClient.invalidateQueries(StatisticsQueryKey);
121 4205669 Mardin 2y ago });
122 4205669 Mardin 2y ago },
123 4205669 Mardin 2y ago editUser: async (body: UserCreate) => {
124 bedeeff Mardin 2y ago return fetch(`/users/${body.username}`, { method: 'PUT', body }).then(
125 4205669 Mardin 2y ago () => {
126 4205669 Mardin 2y ago get().onEditingUser(null);
127 4205669 Mardin 2y ago get().refetchUsers();
128 4205669 Mardin 2y ago }
129 4205669 Mardin 2y ago );
130 4205669 Mardin 2y ago },
131 4205669 Mardin 2y ago
132 4205669 Mardin 2y ago fetchUserUsage: (body: User, query: FilterUsageType) => {
133 4205669 Mardin 2y ago for (const key in query) {
134 4205669 Mardin 2y ago if (!query[key as keyof FilterUsageType])
135 4205669 Mardin 2y ago delete query[key as keyof FilterUsageType];
136 4205669 Mardin 2y ago }
137 bedeeff Mardin 2y ago return fetch(`/users/${body.username}/usage`, { method: 'GET', query });
138 4205669 Mardin 2y ago },
139 4205669 Mardin 2y ago resetDataUsage: async (user) => {
140 bedeeff Mardin 2y ago return fetch(`/users/${user.username}/reset`, { method: 'POST' }).then(
141 4205669 Mardin 2y ago () => {
142 4205669 Mardin 2y ago set({ resetUsageUser: null });
143 4205669 Mardin 2y ago get().refetchUsers();
144 4205669 Mardin 2y ago }
145 4205669 Mardin 2y ago );
146 4205669 Mardin 2y ago },
147 4205669 Mardin 2y ago revokeSubscription: async (user) => {
148 bedeeff Mardin 2y ago return fetch(`/users/${user.username}/revoke_sub`, {
149 4205669 Mardin 2y ago method: 'POST',
150 4205669 Mardin 2y ago }).then((user) => {
151 4205669 Mardin 2y ago set({ revokeSubscriptionUser: null, editingUser: user });
152 4205669 Mardin 2y ago get().refetchUsers();
153 4205669 Mardin 2y ago });
154 4205669 Mardin 2y ago },
155 4205669 Mardin 2y ago })));