import { Group, Stack, Text } from '@mantine/core'; import { useQuery } from '@tanstack/react-query'; import axios from 'axios'; import { useTranslation } from 'next-i18next'; import { useConfigContext } from '../../../../config/provider'; import { bytes } from '../../../../tools/bytesHelper'; import { percentage } from '../../../../tools/percentage'; import { DashDotInfo } from './DashDotTile'; interface DashDotCompactStorageProps { info: DashDotInfo; } export const DashDotCompactStorage = ({ info }: DashDotCompactStorageProps) => { const { t } = useTranslation('modules/dashdot'); const { data: storageLoad } = useDashDotStorage(); 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) => layout.reduce((total, current) => total + (current[key] as number), 0); interface CalculateTotalLayoutSizeProps { layout: TLayoutItem[]; key: keyof TLayoutItem; } const useDashDotStorage = () => { const { name: configName, config } = useConfigContext(); return useQuery({ queryKey: [ 'dashdot/storage', { configName, url: config?.integrations.dashDot?.properties.url, }, ], queryFn: () => fetchDashDotStorageLoad(configName), }); }; async function fetchDashDotStorageLoad(configName: string | undefined) { console.log(`storage request: ${configName}`); if (!configName) throw new Error('configName is undefined'); return (await ( await axios.get('/api/modules/dashdot/storage', { params: { configName } }) ).data) as DashDotStorageLoad; } interface DashDotStorageLoad { layout: { load: number }[]; }