import { FC } from 'react'; import { useTranslation } from 'react-i18next'; import { SectionWidget, ChartLegendContent, ChartContainer, Awaiting, ChartLegend, ChartTooltip, ChartTooltipContent, } from "@marzneshin/components"; import { Area, AreaChart, CartesianGrid, YAxis, XAxis } from "recharts" import { useState } from "react"; import { UserNodesUsageWidgetProps } from "./types"; import { dateXAxisTicks, useFromNowInterval, SelectDateView, ChartDateInterval } from "@marzneshin/common/stats-charts"; import { useChartConfig, useTransformData } from "./hooks"; import { format as formatByte } from '@chbphone55/pretty-bytes'; import { useUserNodeUsagesQuery } from "@marzneshin/modules/users"; import { UsageGraphSkeleton } from "./skeleton" export const UserNodesUsageWidget: FC = ({ user, }) => { const { t } = useTranslation(); const [timeRange, setTimeRange] = useState("1d") const { start, end } = useFromNowInterval(timeRange as ChartDateInterval); const { data, isPending } = useUserNodeUsagesQuery({ username: user.username, start, end }) const chartData = useTransformData(data); const config = useChartConfig(data); const [totalAmount, totalMetric] = formatByte(data.total); return ( {t("page.users.settings.nodes-usage.title")}} description={t("page.users.settings.nodes-usage.desc")} options={
{totalAmount} {totalMetric} Total
} footer={ } > { const [amount, metric] = formatByte(value) return `${amount} ${metric}` }} /> dateXAxisTicks(value, timeRange as ChartDateInterval)} /> { return new Date(value).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", hour: "numeric" }) }} valueFormatter={(value) => { const [amount, metric] = formatByte(value as number) return `${amount} ${metric}` }} /> } /> {data.node_usages.map(node => )} {data.node_usages.map(node => )} } /> } Skeleton={} isFetching={isPending} /> ); };