forked from Openpanel-dev/openpanel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuse-visible-series.ts
More file actions
62 lines (55 loc) · 1.86 KB
/
Copy pathuse-visible-series.ts
File metadata and controls
62 lines (55 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import type { IChartData } from '@/trpc/client';
import { useCallback, useEffect, useMemo, useState } from 'react';
type VisibleSeriesOptions = {
initialSeries?: string[];
onChange?: (ids: string[]) => void;
};
export type IVisibleSeries = ReturnType<typeof useVisibleSeries>['series'];
export function useVisibleSeries(
data: IChartData,
limit?: number | undefined,
options?: VisibleSeriesOptions,
) {
const max = limit ?? 5;
const { initialSeries, onChange } = options ?? {};
const getDefaultIds = useCallback(() => {
if (initialSeries !== undefined) {
const validIds = initialSeries.filter((id) =>
data?.series?.some((s) => s.id === id),
);
return validIds.length > 0
? validIds
: data?.series?.slice(0, max).map((s) => s.id) ?? [];
}
return data?.series?.slice(0, max).map((serie) => serie.id) ?? [];
// initialSeries is stable (comes from saved report config)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [data, max]);
const [visibleSeries, setVisibleSeries] = useState<string[]>(getDefaultIds);
useEffect(() => {
setVisibleSeries(getDefaultIds());
}, [getDefaultIds]);
const handleSetVisibleSeries: typeof setVisibleSeries = useCallback(
(value) => {
setVisibleSeries((prev) => {
const next = typeof value === 'function' ? value(prev) : value;
onChange?.(next);
return next;
});
},
// onChange is stable (dispatch function from Redux)
// eslint-disable-next-line react-hooks/exhaustive-deps
[],
);
return useMemo(() => {
return {
series: data.series
.map((serie, index) => ({
...serie,
index,
}))
.filter((serie) => visibleSeries.includes(serie.id)),
setVisibleSeries: handleSetVisibleSeries,
} as const;
}, [visibleSeries, data.series, handleSetVisibleSeries]);
}