diff --git a/packages/ui-kit/src/components/Leaderboard/Leaderboard.tsx b/packages/ui-kit/src/components/Leaderboard/Leaderboard.tsx index 35f381f3..64b9b05e 100644 --- a/packages/ui-kit/src/components/Leaderboard/Leaderboard.tsx +++ b/packages/ui-kit/src/components/Leaderboard/Leaderboard.tsx @@ -9,7 +9,7 @@ import { getTimeZone, LeaderboardLabels, useCombinedRefsCallback, - useConnectedData, + useEmptyableData, withThemeWrapper } from '../../helpers' import { useLeaderboard } from '../../hooks/useLeaderboard' @@ -92,8 +92,8 @@ export const LeaderboardComponent = React.forwardRef({ - destroyChart, + const { data, isEmptyState, setData } = useEmptyableData({ + onEmptyData: destroyChart, isDataEmpty: (data) => data.rows?.length === 0 }) diff --git a/packages/ui-kit/src/components/PieChart/PieChart.tsx b/packages/ui-kit/src/components/PieChart/PieChart.tsx index 84a588fa..a4624c92 100644 --- a/packages/ui-kit/src/components/PieChart/PieChart.tsx +++ b/packages/ui-kit/src/components/PieChart/PieChart.tsx @@ -6,7 +6,7 @@ import { getCustomChartLabelsPlugin, getTimeZone, useCombinedRefsCallback, - useConnectedData, + useEmptyableData, withThemeWrapper } from '../../helpers' import { useCounter } from '../../hooks/useCounter' @@ -136,8 +136,8 @@ export const PieChartComponent = React.forwardRef } }, [chartRef]) - const { data, isEmptyState, setData } = useConnectedData({ - destroyChart, + const { data, isEmptyState, setData } = useEmptyableData({ + onEmptyData: destroyChart, isDataEmpty: (data) => data.rows?.length === 0 }) diff --git a/packages/ui-kit/src/components/TimeSeries/TimeSeries.tsx b/packages/ui-kit/src/components/TimeSeries/TimeSeries.tsx index 282c8327..7b79bda2 100644 --- a/packages/ui-kit/src/components/TimeSeries/TimeSeries.tsx +++ b/packages/ui-kit/src/components/TimeSeries/TimeSeries.tsx @@ -9,7 +9,7 @@ import { customCanvasBackgroundColor, formatLabels, getTimeZone, - useConnectedData, + useEmptyableData, useForwardedRefCallback, withThemeWrapper } from '../../helpers' @@ -141,8 +141,8 @@ export const TimeSeriesComponent = React.forwardRef({ - destroyChart, + const { data, isEmptyState, setData } = useEmptyableData({ + onEmptyData: destroyChart, isDataEmpty: (data) => !data.values || !data.labels || data.values.length === 0 }) diff --git a/packages/ui-kit/src/helpers/index.ts b/packages/ui-kit/src/helpers/index.ts index 6bcc6044..128d9f9f 100644 --- a/packages/ui-kit/src/helpers/index.ts +++ b/packages/ui-kit/src/helpers/index.ts @@ -14,7 +14,7 @@ export * from './storybookCodeTemplate' export * from './themeUtils' export * from './useCombinedRefs' export * from './useCombinedRefsCallback' -export * from './useConnectedData' +export * from './useEmptyableData' export * from './useForwardedRefCallback' export * from './useStorybookAccessToken' export * from './withThemeWrapper' diff --git a/packages/ui-kit/src/helpers/useConnectedData/index.ts b/packages/ui-kit/src/helpers/useConnectedData/index.ts deleted file mode 100644 index 4e38407f..00000000 --- a/packages/ui-kit/src/helpers/useConnectedData/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useConnectedData' diff --git a/packages/ui-kit/src/helpers/useConnectedData/useConnectedData.ts b/packages/ui-kit/src/helpers/useConnectedData/useConnectedData.ts deleted file mode 100644 index 06852821..00000000 --- a/packages/ui-kit/src/helpers/useConnectedData/useConnectedData.ts +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' - -export type UseConnectedDataProps = { - isDataEmpty: (data: T) => boolean - destroyChart: () => void -} - -export const useConnectedData = ({ destroyChart, isDataEmpty }: UseConnectedDataProps) => { - const [isEmptyState, setIsEmptyState] = React.useState(false) - const [data, setData] = React.useState() - - React.useEffect(() => { - const isEmptyStateVal = !data || isDataEmpty(data) - - setIsEmptyState(isEmptyStateVal) - - if (isEmptyStateVal) { - destroyChart() - return - } - }, [data, destroyChart, isDataEmpty]) - - return { - data, - setData, - isEmptyState, - setIsEmptyState - } -} diff --git a/packages/ui-kit/src/helpers/useEmptyableData/index.ts b/packages/ui-kit/src/helpers/useEmptyableData/index.ts new file mode 100644 index 00000000..a8db91bf --- /dev/null +++ b/packages/ui-kit/src/helpers/useEmptyableData/index.ts @@ -0,0 +1 @@ +export * from './useEmptyableData' diff --git a/packages/ui-kit/src/helpers/useEmptyableData/useEmptyableData.ts b/packages/ui-kit/src/helpers/useEmptyableData/useEmptyableData.ts new file mode 100644 index 00000000..496b562b --- /dev/null +++ b/packages/ui-kit/src/helpers/useEmptyableData/useEmptyableData.ts @@ -0,0 +1,37 @@ +import React from 'react' + +export type UseEmptyableDataProps = { + isDataEmpty: (data: T) => boolean + onEmptyData: () => void +} + +/** + * Returns a getter and setter for `data` where, whenever `data` changes. + * + * 1. Check if `data` is empty, using a user-supplied function `isDateEmpty`. + * 2. If it's empty, call a user-supplied function `onEmptyData`. + * + * Returns also a getter for whether the data is empty (`isEmptyState`). + */ + +export const useEmptyableData = ({ onEmptyData, isDataEmpty }: UseEmptyableDataProps) => { + const [isEmptyState, setIsEmptyState] = React.useState(false) + const [data, setData] = React.useState() + + React.useEffect(() => { + const isEmptyStateVal = !data || isDataEmpty(data) + + setIsEmptyState(isEmptyStateVal) + + if (isEmptyStateVal) { + onEmptyData() + return + } + }, [data, onEmptyData, isDataEmpty]) + + return { + data, + setData, + isEmptyState + } +}