gitscope
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/inbounds.store.ts · v0.2.1
Source
1 89f8f93 Mardin 2y ago import { create } from 'zustand';
2 89f8f93 Mardin 2y ago import { subscribeWithSelector } from 'zustand/middleware';
3 89f8f93 Mardin 2y ago import { useDashboard } from './dashboard.store';
4 89f8f93 Mardin 2y ago import { fetch } from 'service/http';
5 89f8f93 Mardin 2y ago import { Inbounds, InboundType } from 'types/inbounds';
6 89f8f93 Mardin 2y ago import { z } from 'zod';
7 6aab6f0 Mrdn 2y ago import { HostsFilterType, InboundsFilterType } from 'types';
8 6aab6f0 Mrdn 2y ago import { pageSizeManagers } from 'utils/userPreferenceStorage';
9 6aab6f0 Mrdn 2y ago import { queryClient } from 'service/react-query';
10 a61ba53 Mrdn 2y ago import { queryIds } from 'constants/query-ids';
11 89f8f93 Mardin 2y ago
12 89f8f93 Mardin 2y ago export const hostSchema = z.object({
13 89f8f93 Mardin 2y ago remark: z.string().min(1, 'Remark is required'),
14 89f8f93 Mardin 2y ago address: z.string().min(1, 'Address is required'),
15 8d27a8d Mrdn 2y ago port: z.coerce.number()
16 8d27a8d Mrdn 2y ago .gte(1, 'Port must be more than 1')
17 fca98f0 Mrdn 2y ago .lte(65535, 'Port can not be more than 65535')
18 fca98f0 Mrdn 2y ago .or(z.string().nullable()),
19 89f8f93 Mardin 2y ago path: z.string(),
20 89f8f93 Mardin 2y ago sni: z.string(),
21 89f8f93 Mardin 2y ago host: z.string(),
22 89f8f93 Mardin 2y ago security: z.enum(['inbound_default', 'none', 'tls']),
23 89f8f93 Mardin 2y ago alpn: z.string().optional(),
24 89f8f93 Mardin 2y ago fingerprint: z.string().optional(),
25 89f8f93 Mardin 2y ago });
26 89f8f93 Mardin 2y ago
27 89f8f93 Mardin 2y ago export type HostSchema = z.infer<typeof hostSchema>;
28 89f8f93 Mardin 2y ago export type HostType = HostSchema & { id?: number };
29 89f8f93 Mardin 2y ago export type Hosts = HostType[];
30 89f8f93 Mardin 2y ago
31 89f8f93 Mardin 2y ago export const fetchInbounds = async () => {
32 89f8f93 Mardin 2y ago useDashboard.setState({ loading: true });
33 89f8f93 Mardin 2y ago return fetch('/inbounds')
34 a61ba53 Mrdn 2y ago .then((inbounds: Inbounds) => inbounds)
35 89f8f93 Mardin 2y ago .finally(() => {
36 89f8f93 Mardin 2y ago useDashboard.setState({ loading: false });
37 89f8f93 Mardin 2y ago });
38 89f8f93 Mardin 2y ago };
39 89f8f93 Mardin 2y ago
40 16e5ea1 Mrdn 2y ago export const fetchInboundHosts = async (id: number | undefined): Promise<Hosts> => {
41 8d3056a Mrdn 2y ago if (id !== undefined) {
42 8d3056a Mrdn 2y ago useDashboard.setState({ loading: true });
43 8d3056a Mrdn 2y ago return fetch(`/inbounds/${id}/hosts`)
44 8d3056a Mrdn 2y ago .then((hosts: Hosts) => {
45 8d3056a Mrdn 2y ago return hosts
46 8d3056a Mrdn 2y ago })
47 8d3056a Mrdn 2y ago .finally(() => {
48 8d3056a Mrdn 2y ago useDashboard.setState({ loading: false });
49 8d3056a Mrdn 2y ago });
50 8d3056a Mrdn 2y ago } else { return [] }
51 89f8f93 Mardin 2y ago };
52 89f8f93 Mardin 2y ago
53 89f8f93 Mardin 2y ago type InboundsStateType = {
54 89f8f93 Mardin 2y ago // Loading
55 89f8f93 Mardin 2y ago loading: boolean;
56 89f8f93 Mardin 2y ago setLoading: (value: boolean) => void;
57 89f8f93 Mardin 2y ago // Inbounds
58 16e5ea1 Mrdn 2y ago selectedInbound: InboundType | undefined;
59 89f8f93 Mardin 2y ago selectInbound: (inbound: InboundType) => void;
60 a61ba53 Mrdn 2y ago refetchInbounds: () => void;
61 89f8f93 Mardin 2y ago // Hosts
62 6aab6f0 Mrdn 2y ago refetchHosts: () => void;
63 6aab6f0 Mrdn 2y ago hostsFilters: HostsFilterType;
64 6aab6f0 Mrdn 2y ago inboundsFilters: InboundsFilterType;
65 6aab6f0 Mrdn 2y ago onHostsFilterChange: (filters: Partial<HostsFilterType>) => void;
66 6aab6f0 Mrdn 2y ago onInboundsFilterChange: (filters: Partial<InboundsFilterType>) => void;
67 89f8f93 Mardin 2y ago selectedHost: HostType | null;
68 89f8f93 Mardin 2y ago selectHost: (host: HostType) => void;
69 89f8f93 Mardin 2y ago isEditingHost: boolean;
70 89f8f93 Mardin 2y ago onEditingHost: (isEditingHost: boolean, host: HostType | null) => void;
71 89f8f93 Mardin 2y ago editHost: (inboundId: number | undefined, host: HostType) => Promise<boolean | void>;
72 89f8f93 Mardin 2y ago isCreatingHost: boolean;
73 89f8f93 Mardin 2y ago onCreatingHost: (isCreatingHost: boolean) => void;
74 89f8f93 Mardin 2y ago createHost: (inboundId: number | undefined, host: HostSchema) => Promise<boolean | void>;
75 89f8f93 Mardin 2y ago isDeletingHost: boolean;
76 89f8f93 Mardin 2y ago onDeletingHost: (isDeletingHost: boolean, host: HostType) => void;
77 89f8f93 Mardin 2y ago deleteHost: (hostId: number) => void;
78 89f8f93 Mardin 2y ago };
79 89f8f93 Mardin 2y ago
80 89f8f93 Mardin 2y ago export const useInbounds = create(
81 6aab6f0 Mrdn 2y ago subscribeWithSelector<InboundsStateType>((set, get) => ({
82 89f8f93 Mardin 2y ago selectedHost: null,
83 16e5ea1 Mrdn 2y ago selectedInbound: undefined,
84 89f8f93 Mardin 2y ago loading: false,
85 89f8f93 Mardin 2y ago isDeletingHost: false,
86 89f8f93 Mardin 2y ago isCreatingHost: false,
87 89f8f93 Mardin 2y ago isEditingHost: false,
88 6aab6f0 Mrdn 2y ago hostsFilters: {
89 6aab6f0 Mrdn 2y ago name: '',
90 6aab6f0 Mrdn 2y ago limit: pageSizeManagers.hosts.getPageSize(),
91 6aab6f0 Mrdn 2y ago sort: '-created_at',
92 6aab6f0 Mrdn 2y ago },
93 6aab6f0 Mrdn 2y ago inboundsFilters: {
94 6aab6f0 Mrdn 2y ago name: '',
95 6aab6f0 Mrdn 2y ago limit: pageSizeManagers.inbounds.getPageSize(),
96 6aab6f0 Mrdn 2y ago sort: '-created_at',
97 6aab6f0 Mrdn 2y ago },
98 6aab6f0 Mrdn 2y ago onHostsFilterChange: (filters) => {
99 6aab6f0 Mrdn 2y ago set({
100 6aab6f0 Mrdn 2y ago hostsFilters: {
101 6aab6f0 Mrdn 2y ago ...get().hostsFilters,
102 6aab6f0 Mrdn 2y ago ...filters,
103 6aab6f0 Mrdn 2y ago },
104 6aab6f0 Mrdn 2y ago });
105 6aab6f0 Mrdn 2y ago },
106 6aab6f0 Mrdn 2y ago onInboundsFilterChange: (filters) => {
107 6aab6f0 Mrdn 2y ago set({
108 6aab6f0 Mrdn 2y ago hostsFilters: {
109 6aab6f0 Mrdn 2y ago ...get().inboundsFilters,
110 6aab6f0 Mrdn 2y ago ...filters,
111 6aab6f0 Mrdn 2y ago },
112 6aab6f0 Mrdn 2y ago });
113 6aab6f0 Mrdn 2y ago },
114 89f8f93 Mardin 2y ago setLoading: (value) => {
115 89f8f93 Mardin 2y ago set({ loading: value })
116 89f8f93 Mardin 2y ago },
117 89f8f93 Mardin 2y ago refetchInbounds: () => {
118 16e5ea1 Mrdn 2y ago queryClient.invalidateQueries({ queryKey: [queryIds.inbounds] });
119 89f8f93 Mardin 2y ago },
120 16e5ea1 Mrdn 2y ago refetchHosts: async () => {
121 16e5ea1 Mrdn 2y ago queryClient.invalidateQueries({ queryKey: [queryIds.hosts] });
122 6aab6f0 Mrdn 2y ago },
123 89f8f93 Mardin 2y ago selectInbound: (host): void => {
124 89f8f93 Mardin 2y ago set({ selectedInbound: host })
125 89f8f93 Mardin 2y ago },
126 89f8f93 Mardin 2y ago selectHost: (host: HostType): void => {
127 89f8f93 Mardin 2y ago set({ selectedHost: host })
128 89f8f93 Mardin 2y ago },
129 89f8f93 Mardin 2y ago onEditingHost: (isEditingHost: boolean, host: HostType | null) => {
130 89f8f93 Mardin 2y ago set({ isEditingHost, selectedHost: host });
131 89f8f93 Mardin 2y ago },
132 89f8f93 Mardin 2y ago editHost: async (hostId: number | undefined, body: HostSchema): Promise<boolean | void> => {
133 89f8f93 Mardin 2y ago if (hostId !== undefined) {
134 89f8f93 Mardin 2y ago useDashboard.setState({ loading: true });
135 89f8f93 Mardin 2y ago return fetch(`/inbounds/hosts/${hostId}`, { method: 'PUT', body })
136 89f8f93 Mardin 2y ago .then(() => true)
137 89f8f93 Mardin 2y ago .catch(() => false)
138 89f8f93 Mardin 2y ago .finally(() => {
139 89f8f93 Mardin 2y ago useDashboard.setState({ loading: false });
140 fca98f0 Mrdn 2y ago get().refetchHosts();
141 89f8f93 Mardin 2y ago });
142 89f8f93 Mardin 2y ago }
143 89f8f93 Mardin 2y ago },
144 89f8f93 Mardin 2y ago onCreatingHost: (isCreatingHost: boolean) => {
145 89f8f93 Mardin 2y ago set({ isCreatingHost });
146 89f8f93 Mardin 2y ago },
147 89f8f93 Mardin 2y ago createHost: async (inboundId: number | undefined, body: HostSchema): Promise<boolean | void> => {
148 89f8f93 Mardin 2y ago if (inboundId !== undefined) {
149 89f8f93 Mardin 2y ago useDashboard.setState({ loading: true });
150 16e5ea1 Mrdn 2y ago return fetch(`/inbounds/${inboundId}/hosts`, { method: 'POST', body })
151 89f8f93 Mardin 2y ago .then(() => true)
152 89f8f93 Mardin 2y ago .catch(() => false)
153 89f8f93 Mardin 2y ago .finally(() => {
154 89f8f93 Mardin 2y ago useDashboard.setState({ loading: false });
155 fca98f0 Mrdn 2y ago get().refetchHosts();
156 89f8f93 Mardin 2y ago });
157 89f8f93 Mardin 2y ago }
158 89f8f93 Mardin 2y ago },
159 89f8f93 Mardin 2y ago onDeletingHost: (isDeletingHost: boolean, host: HostType | null) => {
160 89f8f93 Mardin 2y ago set({ isDeletingHost, selectedHost: host });
161 89f8f93 Mardin 2y ago },
162 89f8f93 Mardin 2y ago deleteHost: async (hostId: number): Promise<boolean> => {
163 89f8f93 Mardin 2y ago useDashboard.setState({ loading: true });
164 89f8f93 Mardin 2y ago return fetch(`/inbounds/hosts/${hostId}`, { method: 'DELETE' })
165 fca98f0 Mrdn 2y ago .then(() => {
166 fca98f0 Mrdn 2y ago get().refetchHosts();
167 fca98f0 Mrdn 2y ago return true;
168 fca98f0 Mrdn 2y ago })
169 89f8f93 Mardin 2y ago .catch(() => false)
170 89f8f93 Mardin 2y ago .finally(() => {
171 89f8f93 Mardin 2y ago useDashboard.setState({ loading: false });
172 89f8f93 Mardin 2y ago });
173 89f8f93 Mardin 2y ago },
174 89f8f93 Mardin 2y ago }))
175 89f8f93 Mardin 2y ago );