gitscope
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/services.store.ts · v0.1.2
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 a61ba53 Mrdn 2y ago import { queryIds } from 'constants/query-ids';
11 4205669 Mardin 2y ago
12 4205669 Mardin 2y ago type ServicesStateType = {
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 return services;
37 4205669 Mardin 2y ago })
38 4205669 Mardin 2y ago .finally(() => {
39 4205669 Mardin 2y ago useDashboard.setState({ loading: false });
40 4205669 Mardin 2y ago });
41 4205669 Mardin 2y ago };
42 4205669 Mardin 2y ago
43 4205669 Mardin 2y ago export const useServices = create(
44 4205669 Mardin 2y ago subscribeWithSelector<ServicesStateType>((set, get) => ({
45 4205669 Mardin 2y ago editingService: null,
46 4205669 Mardin 2y ago deletingService: null,
47 4205669 Mardin 2y ago isCreatingNewService: false,
48 4205669 Mardin 2y ago servicesFilters: {
49 4205669 Mardin 2y ago name: '',
50 6aab6f0 Mrdn 2y ago limit: pageSizeManagers.services.getPageSize(),
51 4205669 Mardin 2y ago sort: '-created_at',
52 4205669 Mardin 2y ago },
53 4205669 Mardin 2y ago onFilterChange: (filters) => {
54 4205669 Mardin 2y ago set({
55 4205669 Mardin 2y ago servicesFilters: {
56 4205669 Mardin 2y ago ...get().servicesFilters,
57 4205669 Mardin 2y ago ...filters,
58 4205669 Mardin 2y ago },
59 4205669 Mardin 2y ago });
60 4205669 Mardin 2y ago get().refetchServices();
61 4205669 Mardin 2y ago },
62 4205669 Mardin 2y ago refetchServices: () => {
63 a61ba53 Mrdn 2y ago queryClient.invalidateQueries(queryIds.services);
64 4205669 Mardin 2y ago },
65 4205669 Mardin 2y ago onCreateService: (isCreatingNewService) => set({ isCreatingNewService }),
66 4205669 Mardin 2y ago onEditingService: (editingService) => {
67 4205669 Mardin 2y ago set({ editingService });
68 4205669 Mardin 2y ago },
69 4205669 Mardin 2y ago onDeletingService: (deletingService) => {
70 4205669 Mardin 2y ago set({ deletingService });
71 4205669 Mardin 2y ago },
72 4205669 Mardin 2y ago deleteService: async (service: Service) => {
73 4205669 Mardin 2y ago set({ editingService: null });
74 5bb2712 Mardin 2y ago return fetch(`/services/${service.id}`, { method: 'DELETE' }).then(() => {
75 4205669 Mardin 2y ago set({ deletingService: null });
76 4205669 Mardin 2y ago get().refetchServices();
77 4205669 Mardin 2y ago useUsers.getState().refetchUsers();
78 4205669 Mardin 2y ago queryClient.invalidateQueries(StatisticsQueryKey);
79 4205669 Mardin 2y ago });
80 4205669 Mardin 2y ago },
81 4205669 Mardin 2y ago createService: async (body: ServiceCreate) => {
82 5bb2712 Mardin 2y ago return fetch('/services', { method: 'POST', body }).then(() => {
83 4205669 Mardin 2y ago set({ editingService: null });
84 4205669 Mardin 2y ago get().refetchServices();
85 4205669 Mardin 2y ago queryClient.invalidateQueries(StatisticsQueryKey);
86 4205669 Mardin 2y ago });
87 4205669 Mardin 2y ago },
88 4205669 Mardin 2y ago editService: async (body: ServiceCreate) => {
89 5bb2712 Mardin 2y ago return fetch(`/services/${body.id}`, { method: 'PUT', body }).then(
90 4205669 Mardin 2y ago () => {
91 4205669 Mardin 2y ago get().onEditingService(null);
92 4205669 Mardin 2y ago get().refetchServices();
93 4205669 Mardin 2y ago }
94 4205669 Mardin 2y ago );
95 4205669 Mardin 2y ago },
96 4205669 Mardin 2y ago }))
97 4205669 Mardin 2y ago );