| 1 |
bedeeff |
Mardin |
2y ago |
import { |
| 2 |
bedeeff |
Mardin |
2y ago |
Box, |
| 3 |
bedeeff |
Mardin |
2y ago |
CircularProgress, |
| 4 |
bedeeff |
Mardin |
2y ago |
VStack, |
| 5 |
bedeeff |
Mardin |
2y ago |
chakra, |
| 6 |
bedeeff |
Mardin |
2y ago |
useColorMode, |
| 7 |
bedeeff |
Mardin |
2y ago |
} from '@chakra-ui/react'; |
| 8 |
bedeeff |
Mardin |
2y ago |
import { ChartPieIcon } from '@heroicons/react/24/outline'; |
| 9 |
89f8f93 |
Mardin |
2y ago |
import { FilterUsageType } from 'types/filter'; |
| 10 |
89f8f93 |
Mardin |
2y ago |
import { useNodes } from 'stores'; |
| 11 |
bedeeff |
Mardin |
2y ago |
import dayjs from 'dayjs'; |
| 12 |
bedeeff |
Mardin |
2y ago |
import { FC, Suspense, useEffect, useState } from 'react'; |
| 13 |
bedeeff |
Mardin |
2y ago |
import ReactApexChart from 'react-apexcharts'; |
| 14 |
bedeeff |
Mardin |
2y ago |
import { useTranslation } from 'react-i18next'; |
| 15 |
bedeeff |
Mardin |
2y ago |
import { Icon } from 'components/icon'; |
| 16 |
5825ea4 |
Mardin |
2y ago |
import { UsageFilter, createUsageConfig } from 'components/usage-filter'; |
| 17 |
bedeeff |
Mardin |
2y ago |
import { StatisticsCardWide } from 'components/statistics-card'; |
| 18 |
bedeeff |
Mardin |
2y ago |
|
| 19 |
bedeeff |
Mardin |
2y ago |
const UsageIcon = chakra(ChartPieIcon, { |
| 20 |
bedeeff |
Mardin |
2y ago |
baseStyle: { |
| 21 |
bedeeff |
Mardin |
2y ago |
w: 5, |
| 22 |
bedeeff |
Mardin |
2y ago |
h: 5, |
| 23 |
bedeeff |
Mardin |
2y ago |
}, |
| 24 |
bedeeff |
Mardin |
2y ago |
}); |
| 25 |
bedeeff |
Mardin |
2y ago |
|
| 26 |
bedeeff |
Mardin |
2y ago |
export type NodesUsageProps = {}; |
| 27 |
bedeeff |
Mardin |
2y ago |
|
| 28 |
bedeeff |
Mardin |
2y ago |
export const NodesUsage: FC<NodesUsageProps> = () => { |
| 29 |
bedeeff |
Mardin |
2y ago |
const { isShowingNodesUsage } = useNodes(); |
| 30 |
bedeeff |
Mardin |
2y ago |
const { fetchNodesUsage } = useNodes(); |
| 31 |
bedeeff |
Mardin |
2y ago |
const { t } = useTranslation(); |
| 32 |
bedeeff |
Mardin |
2y ago |
const { colorMode } = useColorMode(); |
| 33 |
bedeeff |
Mardin |
2y ago |
|
| 34 |
bedeeff |
Mardin |
2y ago |
const usageTitle = t('userDialog.total'); |
| 35 |
bedeeff |
Mardin |
2y ago |
const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle)); |
| 36 |
bedeeff |
Mardin |
2y ago |
const [usageFilter, setUsageFilter] = useState('1m'); |
| 37 |
bedeeff |
Mardin |
2y ago |
const fetchUsageWithFilter = (query: FilterUsageType) => { |
| 38 |
bedeeff |
Mardin |
2y ago |
fetchNodesUsage(query).then((data: any) => { |
| 39 |
bedeeff |
Mardin |
2y ago |
const labels = []; |
| 40 |
bedeeff |
Mardin |
2y ago |
const series = []; |
| 41 |
bedeeff |
Mardin |
2y ago |
for (const key in data.usages) { |
| 42 |
bedeeff |
Mardin |
2y ago |
const entry = data.usages[key]; |
| 43 |
bedeeff |
Mardin |
2y ago |
series.push(entry.uplink + entry.downlink); |
| 44 |
bedeeff |
Mardin |
2y ago |
labels.push(entry.node_name); |
| 45 |
bedeeff |
Mardin |
2y ago |
} |
| 46 |
bedeeff |
Mardin |
2y ago |
setUsage(createUsageConfig(colorMode, usageTitle, series, labels)); |
| 47 |
bedeeff |
Mardin |
2y ago |
}); |
| 48 |
bedeeff |
Mardin |
2y ago |
}; |
| 49 |
bedeeff |
Mardin |
2y ago |
|
| 50 |
bedeeff |
Mardin |
2y ago |
useEffect(() => { |
| 51 |
bedeeff |
Mardin |
2y ago |
if (isShowingNodesUsage) { |
| 52 |
bedeeff |
Mardin |
2y ago |
fetchUsageWithFilter({ |
| 53 |
bedeeff |
Mardin |
2y ago |
start: dayjs().utc().subtract(30, 'day').format('YYYY-MM-DDTHH:00:00'), |
| 54 |
bedeeff |
Mardin |
2y ago |
}); |
| 55 |
bedeeff |
Mardin |
2y ago |
} |
| 56 |
bedeeff |
Mardin |
2y ago |
}, [isShowingNodesUsage]); |
| 57 |
bedeeff |
Mardin |
2y ago |
|
| 58 |
bedeeff |
Mardin |
2y ago |
return ( |
| 59 |
bedeeff |
Mardin |
2y ago |
<StatisticsCardWide |
| 60 |
bedeeff |
Mardin |
2y ago |
title={t('header.nodesUsage')} |
| 61 |
bedeeff |
Mardin |
2y ago |
icon={<Icon color="primary"> |
| 62 |
bedeeff |
Mardin |
2y ago |
<UsageIcon color="white" /> </Icon>} |
| 63 |
bedeeff |
Mardin |
2y ago |
content={ |
| 64 |
bedeeff |
Mardin |
2y ago |
<VStack gap={4}> |
| 65 |
bedeeff |
Mardin |
2y ago |
<UsageFilter |
| 66 |
bedeeff |
Mardin |
2y ago |
defaultValue={usageFilter} |
| 67 |
bedeeff |
Mardin |
2y ago |
onChange={(filter, query) => { |
| 68 |
bedeeff |
Mardin |
2y ago |
setUsageFilter(filter); |
| 69 |
bedeeff |
Mardin |
2y ago |
fetchUsageWithFilter(query); |
| 70 |
bedeeff |
Mardin |
2y ago |
}} |
| 71 |
bedeeff |
Mardin |
2y ago |
/> |
| 72 |
bedeeff |
Mardin |
2y ago |
<Box justifySelf="center" w="full" maxW="300px" mt="4"> |
| 73 |
bedeeff |
Mardin |
2y ago |
<Suspense fallback={<CircularProgress isIndeterminate />}> |
| 74 |
bedeeff |
Mardin |
2y ago |
<ReactApexChart |
| 75 |
bedeeff |
Mardin |
2y ago |
options={usage.options} |
| 76 |
bedeeff |
Mardin |
2y ago |
series={usage.series} |
| 77 |
bedeeff |
Mardin |
2y ago |
type="donut" |
| 78 |
bedeeff |
Mardin |
2y ago |
height="500px" |
| 79 |
bedeeff |
Mardin |
2y ago |
/> |
| 80 |
bedeeff |
Mardin |
2y ago |
</Suspense> |
| 81 |
bedeeff |
Mardin |
2y ago |
</Box> |
| 82 |
bedeeff |
Mardin |
2y ago |
</VStack> |
| 83 |
bedeeff |
Mardin |
2y ago |
|
| 84 |
bedeeff |
Mardin |
2y ago |
} /> |
| 85 |
bedeeff |
Mardin |
2y ago |
); |
| 86 |
bedeeff |
Mardin |
2y ago |
}; |