From ac718c852a7ed4ceb44b35b74fd3894887ee3dd7 Mon Sep 17 00:00:00 2001 From: Ben Phelps Date: Sat, 27 Aug 2022 03:50:49 +0300 Subject: [PATCH] add speedtest-tracker integration --- README.md | 3 +- src/components/services/widget.jsx | 2 + .../services/widgets/service/speedtest.jsx | 39 +++++++++++++++++++ src/utils/stats-helpers.js | 12 ++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/components/services/widgets/service/speedtest.jsx diff --git a/README.md b/README.md index 0cbe8a33..97ae462e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ - Docker Integration - Status light + CPU, Memory & Network Reporting *(click on the status light)* - Service Integration - - Currently supports Sonarr, Radarr, Ombi, Emby, Jellyfin, NZBGet, ruTorrent, Portainer & PiHole + - Currently supports Sonarr, Radarr, Ombi, Emby, Jellyfin, NZBGet, ruTorrent + - Portainer, Speedtest Tracker, PiHole * Homepage Widgets - System Stats (Disk, CPU, Memory) - Weather (via weatherapi.com) diff --git a/src/components/services/widget.jsx b/src/components/services/widget.jsx index 7e33d999..5c1dd449 100644 --- a/src/components/services/widget.jsx +++ b/src/components/services/widget.jsx @@ -8,6 +8,7 @@ import Docker from "./widgets/service/docker"; import Pihole from "./widgets/service/pihole"; import Rutorrent from "./widgets/service/rutorrent"; import Jellyfin from "./widgets/service/jellyfin"; +import Speedtest from "./widgets/service/speedtest"; const widgetMappings = { docker: Docker, @@ -20,6 +21,7 @@ const widgetMappings = { nzbget: Nzbget, pihole: Pihole, rutorrent: Rutorrent, + speedtest: Speedtest, }; export default function Widget({ service }) { diff --git a/src/components/services/widgets/service/speedtest.jsx b/src/components/services/widgets/service/speedtest.jsx new file mode 100644 index 00000000..b2e28007 --- /dev/null +++ b/src/components/services/widgets/service/speedtest.jsx @@ -0,0 +1,39 @@ +import useSWR from "swr"; + +import Widget from "../widget"; +import Block from "../block"; + +import { formatBits } from "utils/stats-helpers"; + +export default function Speedtest({ service }) { + const config = service.widget; + + function buildApiUrl(endpoint) { + const { url } = config; + return `${url}/api/${endpoint}`; + } + + const { data: speedtestData, error: speedtestError } = useSWR(buildApiUrl("speedtest/latest")); + + if (speedtestError) { + return ; + } + + if (!speedtestData) { + return ( + + + + + + ); + } + + return ( + + + + + + ); +} diff --git a/src/utils/stats-helpers.js b/src/utils/stats-helpers.js index 281c36d0..b98f1cd7 100644 --- a/src/utils/stats-helpers.js +++ b/src/utils/stats-helpers.js @@ -21,3 +21,15 @@ export function formatBytes(bytes, decimals = 2) { return parseFloat(bytes / Math.pow(k, i)).toFixed(dm) + " " + sizes[i]; } + +export function formatBits(bytes, decimals = 2) { + if (bytes === 0) return "0 Bytes"; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["B", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"]; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return parseFloat(bytes / Math.pow(k, i)).toFixed(dm) + " " + sizes[i]; +}