import type { Item } from "@/types"; import type { WidgetData } from "@/widgets/index"; import { t } from "@/i18n"; // Shared DNS-blocker layout: big block-rate, queries + blocked counts. // Pi-hole and AdGuard return the same fields from their fetchers. function num(d: WidgetData | undefined, k: string): number { const v = d?.[k]; return typeof v === "number" ? v : 0; } const fmt = (n: number) => n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)}M` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n); function BlockerWidget({ item, data, error }: { item: Item; data: WidgetData | undefined; error: string | undefined }) { if (error) { return {item.name} — {error}; } const pct = num(data, "blockedPercent"); return (