gitscope
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/nodes.store.ts · v0.1.0
Source
1 bf7c131 Mardin 2y ago import { useQuery } from 'react-query';
2 bf7c131 Mardin 2y ago import { fetch } from 'service/http';
3 bf7c131 Mardin 2y ago import { create } from 'zustand';
4 5bb2712 Mardin 2y ago import { z } from 'zod';
5 89f8f93 Mardin 2y ago import { FilterUsageType, NodesFilterType } from 'types/filter';
6 6aab6f0 Mrdn 2y ago import { pageSizeManagers } from 'utils/userPreferenceStorage';
7 89f8f93 Mardin 2y ago import { useDashboard } from './dashboard.store';
8 a47eb4c Dawsh 2y ago
9 a47eb4c Dawsh 2y ago export const NodeSchema = z.object({
10 a47eb4c Dawsh 2y ago name: z.string().min(1),
11 a47eb4c Dawsh 2y ago address: z.string().min(1),
12 a47eb4c Dawsh 2y ago port: z
13 a47eb4c Dawsh 2y ago .number()
14 a47eb4c Dawsh 2y ago .min(1)
15 a47eb4c Dawsh 2y ago .or(z.string().transform((v) => parseFloat(v))),
16 a47eb4c Dawsh 2y ago xray_version: z.string().nullable().optional(),
17 a47eb4c Dawsh 2y ago id: z.number().nullable().optional(),
18 a47eb4c Dawsh 2y ago status: z
19 5bb2712 Mardin 2y ago .enum(['healthy', 'unhealthy', 'disabled']),
20 a47eb4c Dawsh 2y ago message: z.string().nullable().optional(),
21 5bb2712 Mardin 2y ago usage_coefficient: z.number().default(1),
22 5bb2712 Mardin 2y ago add_as_new_host: z.boolean(),
23 5bb2712 Mardin 2y ago });
24 5bb2712 Mardin 2y ago
25 5bb2712 Mardin 2y ago export const NodeCreateSchema = z.object({
26 5bb2712 Mardin 2y ago name: z.string().min(1),
27 5bb2712 Mardin 2y ago address: z.string().min(1),
28 5bb2712 Mardin 2y ago port: z
29 5bb2712 Mardin 2y ago .number()
30 5bb2712 Mardin 2y ago .min(1)
31 5bb2712 Mardin 2y ago .or(z.string().transform((v) => parseFloat(v))),
32 5bb2712 Mardin 2y ago id: z.number().nullable().optional(),
33 5bb2712 Mardin 2y ago status: z
34 5bb2712 Mardin 2y ago .enum(['none', 'disabled']),
35 5bb2712 Mardin 2y ago usage_coefficient: z.number().default(1),
36 a47eb4c Dawsh 2y ago add_as_new_host: z.boolean().optional(),
37 a47eb4c Dawsh 2y ago });
38 a47eb4c Dawsh 2y ago
39 a47eb4c Dawsh 2y ago export type NodeType = z.infer<typeof NodeSchema>;
40 5bb2712 Mardin 2y ago export type NodeCreate = z.infer<typeof NodeCreateSchema>;
41 a47eb4c Dawsh 2y ago
42 a47eb4c Dawsh 2y ago export const getNodeDefaultValues = (): NodeType => ({
43 bf7c131 Mardin 2y ago name: '',
44 bf7c131 Mardin 2y ago address: '',
45 5bb2712 Mardin 2y ago status: 'unhealthy',
46 a47eb4c Dawsh 2y ago port: 62050,
47 bf7c131 Mardin 2y ago xray_version: '',
48 5bb2712 Mardin 2y ago add_as_new_host: false,
49 5bb2712 Mardin 2y ago usage_coefficient: 1,
50 5bb2712 Mardin 2y ago });
51 5bb2712 Mardin 2y ago
52 5bb2712 Mardin 2y ago export const getNodeCreateDefaultValues = (): NodeCreate => ({
53 5bb2712 Mardin 2y ago name: '',
54 5bb2712 Mardin 2y ago address: '',
55 5bb2712 Mardin 2y ago status: 'none',
56 5bb2712 Mardin 2y ago port: 62050,
57 5bb2712 Mardin 2y ago add_as_new_host: false,
58 5bb2712 Mardin 2y ago usage_coefficient: 1,
59 5bb2712 Mardin 2y ago id: 0,
60 a47eb4c Dawsh 2y ago });
61 a47eb4c Dawsh 2y ago
62 bf7c131 Mardin 2y ago export const FetchNodesQueryKey = 'fetch-nodes-query-key';
63 a47eb4c Dawsh 2y ago
64 5bb2712 Mardin 2y ago export function fetchNodes() {
65 5bb2712 Mardin 2y ago return fetch('/nodes');
66 5bb2712 Mardin 2y ago }
67 5bb2712 Mardin 2y ago
68 a47eb4c Dawsh 2y ago export type NodeStore = {
69 a47eb4c Dawsh 2y ago nodes: NodeType[];
70 5bb2712 Mardin 2y ago certificate: string,
71 5bb2712 Mardin 2y ago deletingNode?: NodeCreate | null;
72 5bb2712 Mardin 2y ago editingNode: NodeCreate | null;
73 5bb2712 Mardin 2y ago isAddingNode: boolean;
74 4205669 Mardin 2y ago isShowingNodesUsage: boolean;
75 5bb2712 Mardin 2y ago isEditingNode: boolean;
76 4205669 Mardin 2y ago isEditingCore: boolean;
77 5bb2712 Mardin 2y ago nodesFilters: NodesFilterType;
78 5bb2712 Mardin 2y ago refetchNodes: () => void;
79 5bb2712 Mardin 2y ago refetchCertificate: () => void;
80 a47eb4c Dawsh 2y ago fetchNodesUsage: (query: FilterUsageType) => Promise<void>;
81 5bb2712 Mardin 2y ago addNode: (node: NodeCreate) => Promise<unknown>;
82 5bb2712 Mardin 2y ago deleteNode: (node: NodeCreate) => Promise<unknown>;
83 5bb2712 Mardin 2y ago updateNode: (node: NodeCreate) => Promise<unknown>;
84 a47eb4c Dawsh 2y ago reconnectNode: (node: NodeType) => Promise<unknown>;
85 5bb2712 Mardin 2y ago onDeletingNode: (node: NodeCreate | undefined) => void;
86 5bb2712 Mardin 2y ago onEditingNode: (node: NodeType | undefined) => void;
87 5bb2712 Mardin 2y ago onAddingNode: (isAddingNode: boolean) => void;
88 5bb2712 Mardin 2y ago onFilterChange: (filters: Partial<NodesFilterType>) => void;
89 4205669 Mardin 2y ago onShowingNodesUsage: (isShowingNodesUsage: boolean) => void;
90 a47eb4c Dawsh 2y ago };
91 a47eb4c Dawsh 2y ago
92 a47eb4c Dawsh 2y ago export const useNodesQuery = () => {
93 a47eb4c Dawsh 2y ago return useQuery({
94 a47eb4c Dawsh 2y ago queryKey: FetchNodesQueryKey,
95 5bb2712 Mardin 2y ago queryFn: fetchNodes,
96 5bb2712 Mardin 2y ago refetchInterval: useNodes.getState().editingNode ? 3000 : undefined,
97 a47eb4c Dawsh 2y ago refetchOnWindowFocus: false,
98 a47eb4c Dawsh 2y ago });
99 a47eb4c Dawsh 2y ago };
100 a47eb4c Dawsh 2y ago
101 a47eb4c Dawsh 2y ago export const useNodes = create<NodeStore>((set, get) => ({
102 a47eb4c Dawsh 2y ago nodes: [],
103 5bb2712 Mardin 2y ago certificate: '',
104 5bb2712 Mardin 2y ago editingNode: null,
105 5bb2712 Mardin 2y ago deletingNode: null,
106 5bb2712 Mardin 2y ago isAddingNode: false,
107 5bb2712 Mardin 2y ago isEditingNode: false,
108 4205669 Mardin 2y ago isShowingNodesUsage: false,
109 4205669 Mardin 2y ago isEditingCore: false,
110 5bb2712 Mardin 2y ago nodesFilters: {
111 5bb2712 Mardin 2y ago name: '',
112 6aab6f0 Mrdn 2y ago limit: pageSizeManagers.nodes.getPageSize(),
113 5bb2712 Mardin 2y ago sort: '-created_at',
114 a47eb4c Dawsh 2y ago },
115 5bb2712 Mardin 2y ago onFilterChange: (filters) => {
116 5bb2712 Mardin 2y ago set({
117 5bb2712 Mardin 2y ago nodesFilters: {
118 5bb2712 Mardin 2y ago ...get().nodesFilters,
119 5bb2712 Mardin 2y ago ...filters,
120 5bb2712 Mardin 2y ago },
121 5bb2712 Mardin 2y ago });
122 5bb2712 Mardin 2y ago get().refetchNodes();
123 5bb2712 Mardin 2y ago },
124 5bb2712 Mardin 2y ago addNode: async (body) => {
125 5bb2712 Mardin 2y ago return fetch('/nodes', { method: 'POST', body }).then(() => { get().refetchCertificate() });
126 5bb2712 Mardin 2y ago },
127 5bb2712 Mardin 2y ago refetchNodes: () => {
128 5bb2712 Mardin 2y ago useDashboard.setState({ loading: true })
129 5bb2712 Mardin 2y ago fetchNodes().then((nodes) => {
130 5bb2712 Mardin 2y ago useDashboard.setState({ loading: false })
131 5bb2712 Mardin 2y ago set({ nodes });
132 5bb2712 Mardin 2y ago })
133 a47eb4c Dawsh 2y ago },
134 5bb2712 Mardin 2y ago refetchCertificate: () => {
135 5bb2712 Mardin 2y ago fetch('/nodes/settings').then((res) => {
136 5bb2712 Mardin 2y ago set({ certificate: res.certificate });
137 5bb2712 Mardin 2y ago })
138 5bb2712 Mardin 2y ago },
139 5bb2712 Mardin 2y ago fetchNodesUsage: (query: FilterUsageType) => {
140 bf7c131 Mardin 2y ago return fetch('/nodes/usage', { query });
141 a47eb4c Dawsh 2y ago },
142 5bb2712 Mardin 2y ago updateNode: (body) => {
143 5bb2712 Mardin 2y ago console.log('update: ' + body.id)
144 5bb2712 Mardin 2y ago return fetch(`/nodes/${body.id}`, {
145 bf7c131 Mardin 2y ago method: 'PUT',
146 a47eb4c Dawsh 2y ago body,
147 a47eb4c Dawsh 2y ago });
148 a47eb4c Dawsh 2y ago },
149 5bb2712 Mardin 2y ago onDeletingNode: (node: NodeCreate | undefined) => {
150 5bb2712 Mardin 2y ago if (node !== undefined) {
151 5bb2712 Mardin 2y ago set({ deletingNode: node });
152 5bb2712 Mardin 2y ago }
153 5bb2712 Mardin 2y ago else {
154 5bb2712 Mardin 2y ago set({ deletingNode: undefined });
155 5bb2712 Mardin 2y ago }
156 a47eb4c Dawsh 2y ago },
157 5bb2712 Mardin 2y ago reconnectNode: (body) => {
158 5bb2712 Mardin 2y ago return fetch(`/nodes/${body.id}/reconnect`, {
159 bf7c131 Mardin 2y ago method: 'POST',
160 a47eb4c Dawsh 2y ago });
161 a47eb4c Dawsh 2y ago },
162 a47eb4c Dawsh 2y ago deleteNode: () => {
163 5bb2712 Mardin 2y ago return fetch(`/nodes/${get().deletingNode?.id}`, {
164 bf7c131 Mardin 2y ago method: 'DELETE',
165 a47eb4c Dawsh 2y ago });
166 a47eb4c Dawsh 2y ago },
167 5bb2712 Mardin 2y ago onEditingNode: (editingNode: NodeType | undefined) => {
168 5bb2712 Mardin 2y ago if (editingNode !== undefined) {
169 5bb2712 Mardin 2y ago const { status, ...rest } = editingNode;
170 5bb2712 Mardin 2y ago set({ editingNode: { ...rest, status: (status === 'healthy' || status === 'unhealthy') ? 'none' : 'disabled' }, isEditingNode: true });
171 5bb2712 Mardin 2y ago }
172 5bb2712 Mardin 2y ago else {
173 5bb2712 Mardin 2y ago set({ editingNode: undefined, isEditingNode: false });
174 5bb2712 Mardin 2y ago
175 5bb2712 Mardin 2y ago }
176 5bb2712 Mardin 2y ago },
177 5bb2712 Mardin 2y ago onAddingNode: (isAddingNode: boolean) => {
178 5bb2712 Mardin 2y ago set({ isAddingNode });
179 4205669 Mardin 2y ago },
180 4205669 Mardin 2y ago onShowingNodesUsage: (isShowingNodesUsage: boolean) => {
181 4205669 Mardin 2y ago set({ isShowingNodesUsage });
182 4205669 Mardin 2y ago },
183 a47eb4c Dawsh 2y ago }));