|
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