|
4 | 4 | */ |
5 | 5 |
|
6 | 6 | import React, { createContext, useContext } from "react" |
7 | | -import { createStore, useStore } from "zustand" |
| 7 | +import { createStore, useStore, StoreApi } from "zustand" |
8 | 8 | import { devtools } from "zustand/middleware" |
9 | 9 |
|
10 | 10 | import createSilencesSlice from "../lib/createSilencesSlice" |
11 | 11 | import createAlertsSlice from "../lib/createAlertsSlice" |
12 | | -import createFiltersSlice from "../lib/createFiltersSlice" |
| 12 | +import createFiltersSlice, { FilterSlice, FilterActions } from "../lib/createFiltersSlice" |
13 | 13 | import createGlobalsSlice from "../lib/createGlobalsSlice" |
14 | 14 | import createUserActivitySlice from "../lib/createUserActivitySlice" |
15 | 15 |
|
16 | | -// @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0. |
17 | | -const StoreContext = createContext() |
| 16 | +const StoreContext = createContext<StoreApi<AppState> | null>(null) |
18 | 17 |
|
19 | | -export const StoreProvider = ({ options, children }: any) => { |
| 18 | +type AppState = FilterSlice & Record<string, any> |
| 19 | + |
| 20 | +interface StoreProviderProps { |
| 21 | + options?: Record<string, any> // should be defined later on for the props |
| 22 | + children: React.ReactNode |
| 23 | +} |
| 24 | + |
| 25 | +export const StoreProvider = ({ options, children }: StoreProviderProps) => { |
20 | 26 | return ( |
21 | 27 | <StoreContext.Provider |
22 | | - value={createStore( |
23 | | - devtools((set, get) => ({ |
24 | | - ...createGlobalsSlice(set, get, options), |
25 | | - // @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0. |
26 | | - ...createUserActivitySlice(set, get), |
27 | | - ...createAlertsSlice(set, get), |
28 | | - ...createFiltersSlice(set, get, options), |
29 | | - ...createSilencesSlice(set, get, options), |
30 | | - })) |
31 | | - )} |
| 28 | + value={createStore<AppState>((set, get) => ({ |
| 29 | + ...createGlobalsSlice(set, get, options), |
| 30 | + ...createUserActivitySlice(set), |
| 31 | + ...createAlertsSlice(set, get), |
| 32 | + ...createFiltersSlice(set, get, options), |
| 33 | + ...createSilencesSlice(set, get, options), |
| 34 | + }))} |
32 | 35 | > |
33 | 36 | {children} |
34 | 37 | </StoreContext.Provider> |
35 | 38 | ) |
36 | 39 | } |
37 | | -// @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0. |
38 | | -const useAppStore = (selector: any) => useStore(useContext(StoreContext), selector) |
| 40 | + |
| 41 | +const useAppStore = <T,>(selector: (state: AppState) => T): T => { |
| 42 | + const store = useContext(StoreContext) |
| 43 | + if (!store) { |
| 44 | + throw new Error("useAppStore must be used within a StoreProvider") |
| 45 | + } |
| 46 | + return useStore(store, selector) |
| 47 | +} |
39 | 48 |
|
40 | 49 | // atomic exports only instead of exporting whole store |
41 | 50 | // See reasoning here: https://tkdodo.eu/blog/working-with-zustand |
@@ -67,16 +76,14 @@ export const useAlertEnrichedLabels = () => useAppStore((state: any) => state.al |
67 | 76 | export const useAlertsActions = () => useAppStore((state: any) => state.alerts.actions) |
68 | 77 |
|
69 | 78 | // Filter exports |
70 | | -export const useFilterLabels = () => useAppStore((state: any) => state.filters.labels) |
71 | | -export const useActiveFilters = () => useAppStore((state: any) => state.filters.activeFilters) |
72 | | -export const usePausedFilters = () => useAppStore((state: any) => state.filters.pausedFilters) |
73 | | -export const useSearchTerm = () => useAppStore((state: any) => state.filters.searchTerm) |
74 | | -export const useFilterLabelValues = () => useAppStore((state: any) => state.filters.filterLabelValues) |
75 | | -export const usePredefinedFilters = () => useAppStore((state: any) => state.filters.predefinedFilters) |
76 | | -export const useActivePredefinedFilter = () => useAppStore((state: any) => state.filters.activePredefinedFilter) |
77 | | -export const useFilterPills = () => useAppStore((state: any) => state.filters.filterPills) |
78 | | - |
79 | | -export const useFilterActions = () => useAppStore((state: any) => state.filters.actions) |
| 79 | +export const useFilterLabels = () => useAppStore((state: AppState) => state.filters.labels) |
| 80 | +export const useActiveFilters = () => useAppStore((state: AppState) => state.filters.activeFilters) |
| 81 | +export const usePausedFilters = () => useAppStore((state: AppState) => state.filters.pausedFilters) |
| 82 | +export const useSearchTerm = () => useAppStore((state: AppState) => state.filters.searchTerm) |
| 83 | +export const useFilterLabelValues = () => useAppStore((state: AppState) => state.filters.filterLabelValues) |
| 84 | +export const usePredefinedFilters = () => useAppStore((state: AppState) => state.filters.predefinedFilters) |
| 85 | +export const useActivePredefinedFilter = () => useAppStore((state: AppState) => state.filters.activePredefinedFilter) |
| 86 | +export const useFilterActions = () => useAppStore((state: AppState) => state.filters.actions) |
80 | 87 |
|
81 | 88 | // Silences exports |
82 | 89 | export const useSilencesItems = () => useAppStore((state: any) => state.silences.items) |
|
0 commit comments