gitscope
← marzneshin / v0.1.1 / app/dashboard/src/pages/home/statistics.tsx
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/pages/home/statistics.tsx · TypeScript
Blame Raw
  1import { BoxProps, chakra, HStack, Text } from '@chakra-ui/react';
  2import {
  3  ChartBarIcon,
  4  ChartPieIcon,
  5  UsersIcon,
  6} from '@heroicons/react/24/outline';
  7import { useDashboard } from 'stores';
  8import { FC } from 'react';
  9import { useTranslation } from 'react-i18next';
 10import { useQuery } from 'react-query';
 11import { fetch } from 'service/http';
 12import { formatBytes, numberWithCommas } from 'utils/formatByte';
 13import { StatisticsCardInLine, StatisticsQueryKey } from 'components/statistics-card';
 14
 15const TotalUsersIcon = chakra(UsersIcon, {
 16  baseStyle: {
 17    w: 5,
 18    h: 5,
 19    position: 'relative',
 20    zIndex: '2',
 21  },
 22});
 23
 24const NetworkIcon = chakra(ChartBarIcon, {
 25  baseStyle: {
 26    w: 5,
 27    h: 5,
 28    position: 'relative',
 29    zIndex: '2',
 30  },
 31});
 32
 33const MemoryIcon = chakra(ChartPieIcon, {
 34  baseStyle: {
 35    w: 5,
 36    h: 5,
 37    position: 'relative',
 38    zIndex: '2',
 39  },
 40});
 41
 42
 43export const Statistics: FC<BoxProps> = (props) => {
 44  const { version } = useDashboard();
 45  const { data: systemData } = useQuery({
 46    queryKey: StatisticsQueryKey,
 47    queryFn: () => fetch('/system'),
 48    refetchInterval: 5000,
 49    onSuccess: ({ version: currentVersion }) => {
 50      if (version !== currentVersion)
 51        useDashboard.setState({ version: currentVersion });
 52    },
 53  });
 54  const { t } = useTranslation();
 55  return (
 56    <HStack
 57      justifyContent="space-between"
 58      gap={0}
 59      columnGap={{ lg: 4, md: 0 }}
 60      rowGap={{ lg: 0, base: 4 }}
 61      display="flex"
 62      flexDirection={{ lg: 'row', base: 'column' }}
 63      {...props}
 64    >
 65      <StatisticsCardInLine
 66        title={t('activeUsers')}
 67        content={
 68          systemData && (
 69            <HStack alignItems="flex-end">
 70              <Text>{numberWithCommas(systemData.users_active)}</Text>
 71              <Text
 72                fontWeight="normal"
 73                fontSize="lg"
 74                as="span"
 75                display="inline-block"
 76                pb="5px"
 77              >
 78                / {numberWithCommas(systemData.total_user)}
 79              </Text>
 80            </HStack>
 81          )
 82        }
 83        icon={<TotalUsersIcon />}
 84      />
 85      <StatisticsCardInLine
 86        title={t('dataUsage')}
 87        content={
 88          systemData &&
 89          formatBytes(
 90            systemData.incoming_bandwidth + systemData.outgoing_bandwidth
 91          )
 92        }
 93        icon={<NetworkIcon />}
 94      />
 95      <StatisticsCardInLine
 96        title={t('memoryUsage')}
 97        content={
 98          systemData && (
 99            <HStack alignItems="flex-end">
100              <Text>{formatBytes(systemData.mem_used, 1, true)[0]}</Text>
101              <Text
102                fontWeight="normal"
103                fontSize="lg"
104                as="span"
105                display="inline-block"
106                pb="5px"
107              >
108                {formatBytes(systemData.mem_used, 1, true)[1]} /{' '}
109                {formatBytes(systemData.mem_total, 1)}
110              </Text>
111            </HStack>
112          )
113        }
114        icon={<MemoryIcon />}
115      />
116    </HStack>
117  );
118};