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