Skip to content

Commit 4834d12

Browse files
authored
refactor(supernova): fix all typescript migration leftovers for Filters (#774)
* refactor(supernova): return types over the storeProvider * refactor(supernova): closes #764 * refactor(supernova): ignore casting problems in ref * chore(supernova): changeset * fix(supernova): remove unused prop
1 parent fe294e9 commit 4834d12

File tree

8 files changed

+108
-104
lines changed

8 files changed

+108
-104
lines changed

.changeset/tricky-lizards-approve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudoperators/juno-app-supernova": patch
3+
---
4+
5+
reducing unnecessary @ts-ignore directives, improving type safety and code clarity in filter components

apps/supernova/src/components/StoreProvider.tsx

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,47 @@
44
*/
55

66
import React, { createContext, useContext } from "react"
7-
import { createStore, useStore } from "zustand"
7+
import { createStore, useStore, StoreApi } from "zustand"
88
import { devtools } from "zustand/middleware"
99

1010
import createSilencesSlice from "../lib/createSilencesSlice"
1111
import createAlertsSlice from "../lib/createAlertsSlice"
12-
import createFiltersSlice from "../lib/createFiltersSlice"
12+
import createFiltersSlice, { FilterSlice, FilterActions } from "../lib/createFiltersSlice"
1313
import createGlobalsSlice from "../lib/createGlobalsSlice"
1414
import createUserActivitySlice from "../lib/createUserActivitySlice"
1515

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)
1817

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) => {
2026
return (
2127
<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+
}))}
3235
>
3336
{children}
3437
</StoreContext.Provider>
3538
)
3639
}
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+
}
3948

4049
// atomic exports only instead of exporting whole store
4150
// See reasoning here: https://tkdodo.eu/blog/working-with-zustand
@@ -67,16 +76,14 @@ export const useAlertEnrichedLabels = () => useAppStore((state: any) => state.al
6776
export const useAlertsActions = () => useAppStore((state: any) => state.alerts.actions)
6877

6978
// 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)
8087

8188
// Silences exports
8289
export const useSilencesItems = () => useAppStore((state: any) => state.silences.items)

apps/supernova/src/components/alerts/AlertsList.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const AlertsList = () => {
3232
</DataGridCell>
3333
</DataGridRow>
3434
),
35+
// @ts-ignore
3536
refFunction: (ref: any) => (
3637
<DataGridRow>
3738
<DataGridCell colSpan={3} className="border-b-0 py-0">

apps/supernova/src/components/filters/FilterPills.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,26 @@ import { useActiveFilters, usePausedFilters, useFilterActions } from "../StorePr
1111
const FilterPills = () => {
1212
const activeFilters = useActiveFilters()
1313
const pausedFilters = usePausedFilters()
14-
// @ts-ignore
1514
const { removeActiveFilter, addActiveFilter, addPausedFilter, removePausedFilter } = useFilterActions()
1615

17-
const pauseFilter = (key: any, value: any) => {
16+
const pauseFilter = (key: string, value: string) => {
1817
addPausedFilter(key, value)
1918
}
2019

21-
const deleteFilter = (key: any, value: any) => {
20+
const deleteFilter = (key: string, value: string) => {
2221
removeActiveFilter(key, value)
2322
removePausedFilter(key, value)
2423
}
2524

26-
const activateFilter = (key: any, value: any) => {
25+
const activateFilter = (key: string, value: string) => {
2726
addActiveFilter(key, value)
2827
removePausedFilter(key, value)
2928
}
3029

3130
return (
3231
<Stack gap="2" wrap={true}>
33-
{/* @ts-expect-error TS(2550): Property 'entries' does not exist on type 'ObjectC... Remove this comment to see the */}
3432
{Object.entries(activeFilters).map(([key, filterItems]) => {
35-
// @ts-ignore
3633
return filterItems?.map((item: any) =>
37-
// @ts-ignore
3834
pausedFilters[key]?.includes(item) ? (
3935
<Pill
4036
className="bg-theme-background-lvl-4 opacity-70"

apps/supernova/src/components/filters/FilterSelect.tsx

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ const FilterSelect = () => {
1919
const [filterLabel, setFilterLabel] = useState("")
2020
const [filterValue, setFilterValue] = useState("")
2121
const [resetKey] = useState(Date.now())
22-
// @ts-ignore
2322
const { addActiveFilter, loadFilterLabelValues, clearFilters, setSearchTerm } = useFilterActions()
2423
const filterLabels = useFilterLabels()
2524
const filterLabelValues = useFilterLabelValues()
2625
const activeFilters = useActiveFilters()
2726
const searchTerm = useSearchTerm()
2827

29-
const handleFilterAdd = (value: any) => {
28+
const handleFilterAdd = (value?: any) => {
3029
if (filterLabel && (filterValue || value)) {
3130
// add active filter to store
3231
addActiveFilter(filterLabel, filterValue || value)
@@ -41,7 +40,6 @@ const FilterSelect = () => {
4140
const handleFilterLabelChange = (value: any) => {
4241
setFilterLabel(value)
4342
// lazy loading of all possible values for this label (only load them if we haven't already)
44-
// @ts-ignore
4543
if (!filterLabelValues[value]?.values) {
4644
loadFilterLabelValues(value)
4745
}
@@ -62,12 +60,6 @@ const FilterSelect = () => {
6260
return () => clearTimeout(debouncedSearchTerm)
6361
}
6462

65-
// const handleKeyDown = (event) => {
66-
// if (event.key === "Enter") {
67-
// handleFilterValueChange()
68-
// }
69-
// }
70-
7163
return (
7264
<Stack alignment="center" gap="8">
7365
<InputGroup>
@@ -78,58 +70,46 @@ const FilterSelect = () => {
7870
value={filterLabel}
7971
onChange={(val: any) => handleFilterLabelChange(val)}
8072
>
81-
{// @ts-ignore
82-
filterLabels?.map((filter: any) => (
73+
{filterLabels?.map((filter: any) => (
8374
<SelectOption value={filter} label={humanizeString(filter)} key={filter} />
8475
))}
8576
</Select>
8677
<Select
8778
name="filterValue"
8879
value={filterValue}
8980
onChange={(value: any) => handleFilterValueChange(value)}
90-
// @ts-ignore
9181
disabled={filterLabelValues[filterLabel] ? false : true}
92-
// @ts-ignore
9382
loading={filterLabelValues[filterLabel]?.isLoading}
9483
className="filter-value-select w-96 bg-theme-background-lvl-0"
9584
key={resetKey}
9685
>
97-
{/* @ts-ignore */}
9886
{filterLabelValues[filterLabel]?.values
9987
?.filter(
10088
(
10189
value: any // filter out already active values for this label
102-
// @ts-ignore
10390
) => !activeFilters[filterLabel]?.includes(value)
10491
)
10592
.slice(0, 100) // take only the first 100 values. This isn't a good solution TODO: fix this properly with combo box, typeahead search, lazy loading, etc.
10693
.map((value: any) => <SelectOption value={value} key={value} />)}
10794
</Select>
108-
{/* @ts-expect-error TS(2554): Expected 1 arguments, but got 0. // @ts-expect-error TS(2554): Expected 1 */}
10995
<Button onClick={() => handleFilterAdd()} icon="filterAlt" className="py-[0.3rem]" />
11096
</InputGroup>
111-
{
112-
// @ts-ignore
113-
renderClearButton()
114-
}
97+
{renderClearButton()}
11598
<SearchInput
11699
placeholder="search term or regular expression"
117100
className="w-96 ml-auto"
118-
// @ts-ignore
119101
value={searchTerm || ""}
120102
onSearch={(value: any) => setSearchTerm(value)}
121-
onClear={() => setSearchTerm(null)}
103+
onClear={() => setSearchTerm("")}
122104
onChange={(value: any) => handleSearchChange(value)}
123105
/>
124106
</Stack>
125107
)
126108

127109
function renderClearButton(): React.ReactNode {
128-
// @ts-ignore
129110
return (
130111
activeFilters &&
131112
Object.keys(activeFilters).length > 0 && (
132-
// @ts-ignore
133113
<Button label="Clear all" onClick={() => clearFilters()} variant="subdued" />
134114
)
135115
)

apps/supernova/src/components/filters/PredefinedFilters.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { useActivePredefinedFilter, useFilterActions, usePredefinedFilters } fro
1010
import SilenceScheduled from "../silences/SilenceScheduled"
1111

1212
const PredefinedFilters = () => {
13-
// @ts-ignore
1413
const { setActivePredefinedFilter } = useFilterActions()
1514
const predefinedFilters = usePredefinedFilters()
1615
const activePredefinedFilter = useActivePredefinedFilter()
@@ -24,18 +23,14 @@ const PredefinedFilters = () => {
2423

2524
return (
2625
<Stack>
27-
{
28-
// @ts-ignore
29-
renderPredefinedFilterTabs()
30-
}
26+
{renderPredefinedFilterTabs()}
3127
<div className="ml-auto">
3228
<SilenceScheduled />
3329
</div>
3430
</Stack>
3531
)
3632

3733
function renderPredefinedFilterTabs(): React.ReactNode {
38-
// @ts-ignore
3934
return (
4035
predefinedFilters &&
4136
selectedItem && (

apps/supernova/src/components/silences/SilencesList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ const SilencesList = () => {
7070
} catch (e) {
7171
console.warn("search term is not a valid regex. " + e)
7272

73-
// @ts-expect-error TS(2550) FIXME: Property 'includes' does not exist on type 'string... Remove this comment to see the full error message
7473
filtered = filtered.filter((silence: any) => JSON.stringify(silence).toLowerCase().includes(regEx.toLowerCase))
7574
}
7675

@@ -98,6 +97,7 @@ const SilencesList = () => {
9897
</DataGridCell>
9998
</DataGridRow>
10099
),
100+
// @ts-ignore
101101
refFunction: (ref: any) => (
102102
<DataGridRow>
103103
<DataGridCell colSpan={3} className="border-b-0 py-0">

0 commit comments

Comments
 (0)