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