import { Group, Stack, Text } from '@mantine/core'; import { useQuery } from '@tanstack/react-query'; import axios from 'axios'; import { useTranslation } from 'next-i18next'; import { bytes } from '../../../../tools/bytesHelper'; import { percentage } from '../../../../tools/percentage'; import { DashDotInfo } from './DashDotTile'; interface DashDotCompactStorageProps { info: DashDotInfo; dashDotUrl: string; } export const DashDotCompactStorage = ({ info, dashDotUrl }: DashDotCompactStorageProps) => { const { t } = useTranslation('modules/dashdot'); const { data: storageLoad } = useQuery({ queryKey: [ 'dashdot/storageLoad', { dashDotUrl, }, ], queryFn: () => fetchDashDotStorageLoad(dashDotUrl), }); const totalUsed = calculateTotalLayoutSize({ layout: storageLoad?.layout ?? [], key: 'load', }); const totalSize = calculateTotalLayoutSize({ layout: info?.storage.layout ?? [], key: 'size', }); return ( {t('card.graphs.storage.label')} {percentage(totalUsed, totalSize)}% {bytes.toString(totalUsed)} / {bytes.toString(totalSize)} ); }; const calculateTotalLayoutSize = ({ layout, key, }: CalculateTotalLayoutSizeProps) => { return layout.reduce((total, current) => { return total + (current[key] as number); }, 0); }; interface CalculateTotalLayoutSizeProps { layout: TLayoutItem[]; key: keyof TLayoutItem; } const fetchDashDotStorageLoad = async (targetUrl: string) => { return (await ( await axios.get('/api/modules/dashdot', { params: { url: '/load/storage', base: targetUrl } }) ).data) as DashDotStorageLoad; }; interface DashDotStorageLoad { layout: { load: number }[]; }