import { useTranslation } from "next-i18next"; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; const Status = Object.freeze({ ok: Symbol("Ok"), errored: Symbol("Errored"), noRecent: Symbol("No Recent Backups"), }); function hasRecentBackups(client, maxDays) { const days = maxDays || 3; const diffTime = days * 24 * 60 * 60; // 7 days const recentFile = client.lastbackup > Date.now() / 1000 - diffTime; const recentImage = client.image_not_supported || client.image_disabled || client.lastbackup_image > Date.now() / 1000 - diffTime; return recentFile && recentImage; } function determineStatuses(urbackupData) { let ok = 0; let errored = 0; let noRecent = 0; let status; urbackupData.clientStatuses.forEach((client) => { status = Status.noRecent; if (hasRecentBackups(client, urbackupData.maxDays)) { status = client.file_ok && (client.image_ok || client.image_not_supported || client.image_disabled) ? Status.ok : Status.errored; } switch (status) { case Status.ok: ok += 1; break; case Status.errored: errored += 1; break; case Status.noRecent: noRecent += 1; break; default: break; } }); let totalUsage = false; // calculate total disk space if provided if (urbackupData.diskUsage) { totalUsage = 0.0; urbackupData.diskUsage.forEach((client) => { totalUsage += client.used; }); } return { ok, errored, noRecent, totalUsage }; } export default function Component({ service }) { const { t } = useTranslation(); const { widget } = service; const showDiskUsage = widget.fields?.includes("totalUsed"); const { data: urbackupData, error: urbackupError } = useWidgetAPI(widget, "status"); if (urbackupError) { return ; } if (!urbackupData) { return ( {showDiskUsage && } ); } const statusData = determineStatuses(urbackupData, widget); return ( {showDiskUsage && ( )} ); }