gitscope
← marzneshin / v0.1.1 / app/dashboard/src/stores/services.store.ts
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/services.store.ts · TypeScript
Blame Raw
 1import { queryClient } from 'service/react-query';
 2import { StatisticsQueryKey } from 'components/statistics-card';
 3import { Service, ServiceCreate } from 'types/service';
 4import { pageSizeManagers } from 'utils/userPreferenceStorage';
 5import { create } from 'zustand';
 6import { subscribeWithSelector } from 'zustand/middleware';
 7import { fetch } from 'service/http';
 8import { ServicesFilterType } from 'types/filter';
 9import { useDashboard, useUsers } from 'stores';
10
11type ServicesStateType = {
12  services: Service[],
13  isCreatingNewService: boolean;
14  editingService: Service | null | undefined;
15  deletingService: Service | null;
16  servicesFilters: ServicesFilterType;
17  onCreateService: (isOpen: boolean) => void;
18  onEditingService: (service: Service | null) => void;
19  onDeletingService: (service: Service | null) => void;
20  refetchServices: () => void;
21  deleteService: (service: Service) => Promise<void>;
22  createService: (service: ServiceCreate) => Promise<void>;
23  editService: (service: ServiceCreate) => Promise<void>;
24  onFilterChange: (filters: Partial<ServicesFilterType>) => void;
25};
26
27export const fetchServices = async (query: ServicesFilterType): Promise<Service[]> => {
28  for (const key in query) {
29    if (!query[key as keyof ServicesFilterType]) delete query[key as keyof ServicesFilterType];
30  }
31
32  useDashboard.setState({ loading: true });
33
34  return fetch('/services')
35    .then((services) => {
36      useServices.setState({ services });
37      return services;
38    })
39    .finally(() => {
40      useDashboard.setState({ loading: false });
41    });
42};
43
44export const useServices = create(
45  subscribeWithSelector<ServicesStateType>((set, get) => ({
46    editingService: null,
47    deletingService: null,
48    isCreatingNewService: false,
49    services: [],
50    servicesFilters: {
51      name: '',
52      limit: pageSizeManagers.services.getPageSize(),
53      sort: '-created_at',
54    },
55    onFilterChange: (filters) => {
56      set({
57        servicesFilters: {
58          ...get().servicesFilters,
59          ...filters,
60        },
61      });
62      get().refetchServices();
63    },
64    refetchServices: () => {
65      fetchServices(get().servicesFilters);
66    },
67    onCreateService: (isCreatingNewService) => set({ isCreatingNewService }),
68    onEditingService: (editingService) => {
69      set({ editingService });
70    },
71    onDeletingService: (deletingService) => {
72      set({ deletingService });
73    },
74    deleteService: async (service: Service) => {
75      set({ editingService: null });
76      return fetch(`/services/${service.id}`, { method: 'DELETE' }).then(() => {
77        set({ deletingService: null });
78        get().refetchServices();
79        useUsers.getState().refetchUsers();
80        queryClient.invalidateQueries(StatisticsQueryKey);
81      });
82    },
83    createService: async (body: ServiceCreate) => {
84      return fetch('/services', { method: 'POST', body }).then(() => {
85        set({ editingService: null });
86        get().refetchServices();
87        queryClient.invalidateQueries(StatisticsQueryKey);
88      });
89    },
90    editService: async (body: ServiceCreate) => {
91      return fetch(`/services/${body.id}`, { method: 'PUT', body }).then(
92        () => {
93          get().onEditingService(null);
94          get().refetchServices();
95        }
96      );
97    },
98  }))
99);