From 69f20bf38a1769177b9154f69aae5a63d2364698 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 21 Aug 2026 11:25:59 -0700
Subject: [PATCH] Another batch
---
src/widgets/argocd/component.jsx | 15 +++++----------
src/widgets/argocd/component.test.jsx | 2 +-
src/widgets/esphome/component.jsx | 12 +++++-------
src/widgets/esphome/component.test.jsx | 2 +-
src/widgets/gamedig/component.jsx | 16 +++++-----------
src/widgets/gamedig/component.test.jsx | 4 ++--
src/widgets/gluetun/component.jsx | 10 +++++-----
src/widgets/gluetun/component.test.jsx | 2 +-
src/widgets/hdhomerun/component.jsx | 15 +++++----------
src/widgets/hdhomerun/component.test.jsx | 2 +-
src/widgets/homebox/component.jsx | 14 +++-----------
src/widgets/homebox/component.test.jsx | 4 ++--
src/widgets/jellyfin/component.jsx | 12 +++++-------
src/widgets/jellyfin/component.test.jsx | 2 +-
src/widgets/jellystat/component.jsx | 12 ++++++------
src/widgets/jellystat/component.test.jsx | 4 ++--
src/widgets/ntfy/component.jsx | 12 +++++-------
src/widgets/omada/component.jsx | 12 +++++-------
src/widgets/pihole/component.jsx | 10 +++++-----
src/widgets/stash/component.jsx | 22 ++++++++--------------
src/widgets/suwayomi/component.jsx | 11 +++++------
src/widgets/suwayomi/component.test.jsx | 2 +-
src/widgets/wgeasy/component.jsx | 10 +++++-----
src/widgets/wgeasy/component.test.jsx | 2 +-
24 files changed, 85 insertions(+), 124 deletions(-)
diff --git a/src/widgets/argocd/component.jsx b/src/widgets/argocd/component.jsx
index f61bed432..16d717534 100644
--- a/src/widgets/argocd/component.jsx
+++ b/src/widgets/argocd/component.jsx
@@ -2,19 +2,14 @@ import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["apps", "synced", "outOfSync", "healthy"];
+
+export default function Component({ service: configuredService }) {
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
- if (!widget.fields) {
- widget.fields = ["apps", "synced", "outOfSync", "healthy"];
- }
-
- const MAX_ALLOWED_FIELDS = 4;
- if (widget.fields.length > MAX_ALLOWED_FIELDS) {
- widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
- }
-
const { data: appsData, error: appsError } = useWidgetAPI(widget, "applications");
const appCounts = widget.fields.map((status) => {
diff --git a/src/widgets/argocd/component.test.jsx b/src/widgets/argocd/component.test.jsx
index 88b102643..ed4b29116 100644
--- a/src/widgets/argocd/component.test.jsx
+++ b/src/widgets/argocd/component.test.jsx
@@ -25,7 +25,7 @@ describe("widgets/argocd/component", () => {
const service = { widget: { type: "argocd", fields: ["apps", "synced", "outOfSync", "healthy", "extra"] } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["apps", "synced", "outOfSync", "healthy"]);
+ expect(service.widget.fields).toEqual(["apps", "synced", "outOfSync", "healthy", "extra"]);
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expect(screen.getByText("argocd.apps")).toBeInTheDocument();
expect(screen.getByText("argocd.synced")).toBeInTheDocument();
diff --git a/src/widgets/esphome/component.jsx b/src/widgets/esphome/component.jsx
index 94fea61fa..b966e10be 100644
--- a/src/widgets/esphome/component.jsx
+++ b/src/widgets/esphome/component.jsx
@@ -3,10 +3,14 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["online", "offline", "offline_alt", "total"];
+
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: resultData, error: resultError } = useWidgetAPI(widget);
@@ -14,12 +18,6 @@ export default function Component({ service }) {
return ;
}
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = ["online", "offline", "offline_alt", "total"];
- } else if (widget.fields.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
if (!resultData) {
return (
diff --git a/src/widgets/esphome/component.test.jsx b/src/widgets/esphome/component.test.jsx
index 10ad52176..9be60325c 100644
--- a/src/widgets/esphome/component.test.jsx
+++ b/src/widgets/esphome/component.test.jsx
@@ -22,7 +22,7 @@ describe("widgets/esphome/component", () => {
const service = { widget: { type: "esphome" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["online", "offline", "offline_alt", "total"]);
+ expect(service.widget.fields).toBeUndefined();
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expect(screen.getByText("esphome.online")).toBeInTheDocument();
expect(screen.getByText("esphome.offline")).toBeInTheDocument();
diff --git a/src/widgets/gamedig/component.jsx b/src/widgets/gamedig/component.jsx
index 8ed11a124..08e885a74 100644
--- a/src/widgets/gamedig/component.jsx
+++ b/src/widgets/gamedig/component.jsx
@@ -3,8 +3,12 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["map", "currentPlayers", "ping"];
+
+export default function Component({ service: configuredService }) {
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: serverData, error: serverError } = useWidgetAPI(widget, "status");
const { t } = useTranslation();
@@ -13,16 +17,6 @@ export default function Component({ service }) {
return ;
}
- // Default fields
- if (widget.fields == null || widget.fields.length === 0) {
- widget.fields = ["map", "currentPlayers", "ping"];
- }
- const MAX_ALLOWED_FIELDS = 4;
- // Limits max number of displayed fields
- if (widget.fields != null && widget.fields.length > MAX_ALLOWED_FIELDS) {
- widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
- }
-
if (!serverData) {
return (
diff --git a/src/widgets/gamedig/component.test.jsx b/src/widgets/gamedig/component.test.jsx
index 895b4d3bc..456b0ec25 100644
--- a/src/widgets/gamedig/component.test.jsx
+++ b/src/widgets/gamedig/component.test.jsx
@@ -22,7 +22,7 @@ describe("widgets/gamedig/component", () => {
const service = { widget: { type: "gamedig", url: "http://x" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["map", "currentPlayers", "ping"]);
+ expect(service.widget.fields).toBeUndefined();
expect(container.querySelectorAll(".service-block")).toHaveLength(3);
expect(screen.getByText("gamedig.map")).toBeInTheDocument();
expect(screen.getByText("gamedig.currentPlayers")).toBeInTheDocument();
@@ -54,7 +54,7 @@ describe("widgets/gamedig/component", () => {
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["status", "name", "map", "currentPlayers"]);
+ expect(service.widget.fields).toEqual(["status", "name", "map", "currentPlayers", "ping"]);
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expectBlockValue(container, "gamedig.status", "gamedig.online");
diff --git a/src/widgets/gluetun/component.jsx b/src/widgets/gluetun/component.jsx
index 2a8401c68..989de5276 100644
--- a/src/widgets/gluetun/component.jsx
+++ b/src/widgets/gluetun/component.jsx
@@ -2,14 +2,14 @@ import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["public_ip", "region", "country"];
+
+export default function Component({ service: configuredService }) {
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
- if (!widget.fields) {
- widget.fields = ["public_ip", "region", "country"];
- }
-
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
const includePF = widget.fields.includes("port_forwarded");
const pfEndpoint = widget.version > 1 ? "port_forwarded_v2" : "port_forwarded";
diff --git a/src/widgets/gluetun/component.test.jsx b/src/widgets/gluetun/component.test.jsx
index aeb617493..6ee682733 100644
--- a/src/widgets/gluetun/component.test.jsx
+++ b/src/widgets/gluetun/component.test.jsx
@@ -22,7 +22,7 @@ describe("widgets/gluetun/component", () => {
const service = { widget: { type: "gluetun", url: "http://x" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["public_ip", "region", "country"]);
+ expect(service.widget.fields).toBeUndefined();
expect(container.querySelectorAll(".service-block")).toHaveLength(3);
expect(screen.getByText("gluetun.public_ip")).toBeInTheDocument();
expect(screen.getByText("gluetun.region")).toBeInTheDocument();
diff --git a/src/widgets/hdhomerun/component.jsx b/src/widgets/hdhomerun/component.jsx
index 2532f92bc..93f3511a4 100644
--- a/src/widgets/hdhomerun/component.jsx
+++ b/src/widgets/hdhomerun/component.jsx
@@ -2,8 +2,12 @@ import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["channels", "hd"];
+
+export default function Component({ service: configuredService }) {
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { tuner = 0 } = widget;
@@ -24,15 +28,6 @@ export default function Component({ service }) {
);
}
- // Provide a default if not set in the config
- if (!widget.fields) {
- widget.fields = ["channels", "hd"];
- }
- // Limit to a maximum of 4 at a time
- if (widget.fields.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
return (
diff --git a/src/widgets/hdhomerun/component.test.jsx b/src/widgets/hdhomerun/component.test.jsx
index b0afac7b4..0bae6812b 100644
--- a/src/widgets/hdhomerun/component.test.jsx
+++ b/src/widgets/hdhomerun/component.test.jsx
@@ -58,7 +58,7 @@ describe("widgets/hdhomerun/component", () => {
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["channels", "hd", "tunerCount", "channelNumber"]);
+ expect(service.widget.fields).toEqual(["channels", "hd", "tunerCount", "channelNumber", "signalStrength"]);
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expect(screen.getByText("hdhomerun.channels")).toBeInTheDocument();
expect(screen.getByText("hdhomerun.hd")).toBeInTheDocument();
diff --git a/src/widgets/homebox/component.jsx b/src/widgets/homebox/component.jsx
index 451d5a9a6..ee244885a 100644
--- a/src/widgets/homebox/component.jsx
+++ b/src/widgets/homebox/component.jsx
@@ -3,11 +3,13 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
export const homeboxDefaultFields = ["items", "locations", "totalValue"];
-export default function Component({ service }) {
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, homeboxDefaultFields);
const { widget } = service;
const { data: homeboxData, error: homeboxError } = useWidgetAPI(widget);
@@ -15,16 +17,6 @@ export default function Component({ service }) {
return ;
}
- // Default fields
- if (!widget.fields?.length > 0) {
- widget.fields = homeboxDefaultFields;
- }
- const MAX_ALLOWED_FIELDS = 4;
- // Limits max number of displayed fields
- if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
- widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
- }
-
if (!homeboxData) {
return (
diff --git a/src/widgets/homebox/component.test.jsx b/src/widgets/homebox/component.test.jsx
index 0342e8392..2113a28c3 100644
--- a/src/widgets/homebox/component.test.jsx
+++ b/src/widgets/homebox/component.test.jsx
@@ -9,7 +9,7 @@ import { expectBlockValue } from "test-utils/widget-assertions";
const { useWidgetAPI } = vi.hoisted(() => ({ useWidgetAPI: vi.fn() }));
vi.mock("utils/proxy/use-widget-api", () => ({ default: useWidgetAPI }));
-import Component, { homeboxDefaultFields } from "./component";
+import Component from "./component";
describe("widgets/homebox/component", () => {
beforeEach(() => {
@@ -22,7 +22,7 @@ describe("widgets/homebox/component", () => {
const service = { widget: { type: "homebox", url: "http://x" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(homeboxDefaultFields);
+ expect(service.widget.fields).toBeUndefined();
expect(container.querySelectorAll(".service-block")).toHaveLength(3);
expect(screen.getByText("homebox.items")).toBeInTheDocument();
expect(screen.getByText("homebox.locations")).toBeInTheDocument();
diff --git a/src/widgets/jellyfin/component.jsx b/src/widgets/jellyfin/component.jsx
index 8c32bb69c..d0bf24bc5 100644
--- a/src/widgets/jellyfin/component.jsx
+++ b/src/widgets/jellyfin/component.jsx
@@ -6,6 +6,9 @@ import { MdOutlineSmartDisplay } from "react-icons/md";
import { getURLSearchParams } from "utils/proxy/api-helpers";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
+
+const DEFAULT_FIELDS = ["movies", "series", "episodes", "songs"];
function ticksToTime(ticks) {
const milliseconds = ticks / 10000;
@@ -178,12 +181,6 @@ function CountBlocks({ service, countData }) {
const { t } = useTranslation();
const { widget } = service;
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = ["movies", "series", "episodes", "songs"];
- } else if (widget.fields?.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
if (!countData) {
return (
@@ -207,9 +204,10 @@ function CountBlocks({ service, countData }) {
);
}
-export default function Component({ service }) {
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const version = widget?.version ?? 1;
const useJellyfinV2 = version === 2;
diff --git a/src/widgets/jellyfin/component.test.jsx b/src/widgets/jellyfin/component.test.jsx
index fabcd1609..d0701e0a2 100644
--- a/src/widgets/jellyfin/component.test.jsx
+++ b/src/widgets/jellyfin/component.test.jsx
@@ -109,7 +109,7 @@ describe("widgets/jellyfin/component", () => {
renderWithProviders();
- expect(service.widget.fields).toEqual(["movies", "series", "episodes", "albums"]);
+ expect(service.widget.fields).toEqual(["movies", "series", "episodes", "albums", "songs"]);
expect(screen.getByText("jellyfin.albums")).toBeInTheDocument();
expect(screen.getByText("5")).toBeInTheDocument();
expect(screen.queryByText("jellyfin.songs")).not.toBeInTheDocument();
diff --git a/src/widgets/jellystat/component.jsx b/src/widgets/jellystat/component.jsx
index d62e643cd..85dd5089b 100644
--- a/src/widgets/jellystat/component.jsx
+++ b/src/widgets/jellystat/component.jsx
@@ -3,13 +3,13 @@ import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
-export default function Component({ service }) {
- const { widget } = service;
+export default function Component({ service: configuredService }) {
+ const configuredDays = configuredService.widget.days;
+ const days = Number.isInteger(configuredDays) && configuredDays > 0 ? configuredDays : 30;
+ const widget = { ...configuredService.widget, days };
+ const service = { ...configuredService, widget };
- // Days validation
- if (!(Number.isInteger(widget.days) && 0 < widget.days)) widget.days = 30;
-
- const { data: viewsData, error: viewsError } = useWidgetAPI(widget, "getViewsByLibraryType", { days: widget.days });
+ const { data: viewsData, error: viewsError } = useWidgetAPI(widget, "getViewsByLibraryType", { days });
const error = viewsError || viewsData?.message;
if (error) {
diff --git a/src/widgets/jellystat/component.test.jsx b/src/widgets/jellystat/component.test.jsx
index ecb822496..fad7de251 100644
--- a/src/widgets/jellystat/component.test.jsx
+++ b/src/widgets/jellystat/component.test.jsx
@@ -26,8 +26,8 @@ describe("widgets/jellystat/component", () => {
const service = { widget: { type: "jellystat", days: -1 } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.days).toBe(30);
- expect(useWidgetAPI).toHaveBeenCalledWith(service.widget, "getViewsByLibraryType", { days: 30 });
+ expect(service.widget.days).toBe(-1);
+ expect(useWidgetAPI).toHaveBeenCalledWith({ type: "jellystat", days: 30 }, "getViewsByLibraryType", { days: 30 });
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expect(screen.getByText("jellystat.songs")).toBeInTheDocument();
diff --git a/src/widgets/ntfy/component.jsx b/src/widgets/ntfy/component.jsx
index 2dcdd2754..4de262222 100644
--- a/src/widgets/ntfy/component.jsx
+++ b/src/widgets/ntfy/component.jsx
@@ -3,6 +3,9 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
+
+const DEFAULT_FIELDS = ["title", "message", "priority", "lastReceived"];
const priorityLabels = {
1: "min",
@@ -20,8 +23,9 @@ function Truncated({ text }) {
);
}
-export default function Component({ service }) {
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: messagesData, error: messagesError } = useWidgetAPI(widget, "messages");
@@ -30,12 +34,6 @@ export default function Component({ service }) {
return ;
}
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = ["title", "message", "priority", "lastReceived"];
- } else if (widget.fields?.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
if (!messagesData) {
return (
diff --git a/src/widgets/omada/component.jsx b/src/widgets/omada/component.jsx
index 44ea2a654..c03e93c63 100644
--- a/src/widgets/omada/component.jsx
+++ b/src/widgets/omada/component.jsx
@@ -3,10 +3,14 @@ import { useTranslation } from "next-i18next/pages";
import Block from "../../components/services/widget/block";
import Container from "../../components/services/widget/container";
import useWidgetAPI from "../../utils/proxy/use-widget-api";
+import withWidgetFields from "../../utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["connectedAp", "activeUser", "alerts", "connectedGateways"];
+
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: omadaData, error: omadaAPIError } = useWidgetAPI(widget, "info", {
@@ -17,12 +21,6 @@ export default function Component({ service }) {
return ;
}
- if (!widget.fields) {
- widget.fields = ["connectedAp", "activeUser", "alerts", "connectedGateways"];
- } else if (widget.fields?.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
if (!omadaData) {
return (
diff --git a/src/widgets/pihole/component.jsx b/src/widgets/pihole/component.jsx
index 04b3a64a6..0f941a01a 100644
--- a/src/widgets/pihole/component.jsx
+++ b/src/widgets/pihole/component.jsx
@@ -3,10 +3,14 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["queries", "blocked", "gravity"];
+
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: piholeData, error: piholeError } = useWidgetAPI(widget);
@@ -15,10 +19,6 @@ export default function Component({ service }) {
return ;
}
- if (!widget.fields) {
- widget.fields = ["queries", "blocked", "gravity"];
- }
-
if (!piholeData) {
return (
diff --git a/src/widgets/stash/component.jsx b/src/widgets/stash/component.jsx
index 485e2401e..e1d08424b 100644
--- a/src/widgets/stash/component.jsx
+++ b/src/widgets/stash/component.jsx
@@ -4,23 +4,27 @@ import { useTranslation } from "next-i18next/pages";
import { useEffect, useState } from "react";
import { formatProxyUrl } from "utils/proxy/api-helpers";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["scenes", "images"];
+
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
- const { widget } = service;
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
+ const requestWidget = configuredService.widget;
const [stats, setStats] = useState(null);
useEffect(() => {
async function fetchStats() {
- const url = formatProxyUrl(widget, "stats");
+ const url = formatProxyUrl(requestWidget, "stats");
const res = await fetch(url, { method: "POST" });
setStats(await res.json());
}
if (!stats) {
fetchStats();
}
- }, [widget, stats]);
+ }, [requestWidget, stats]);
if (!stats) {
return (
@@ -31,16 +35,6 @@ export default function Component({ service }) {
);
}
- // Provide a default if not set in the config
- if (!widget.fields) {
- widget.fields = ["scenes", "images"];
- }
-
- // Limit to a maximum of 4 at a time
- if (widget.fields.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
-
return (
diff --git a/src/widgets/suwayomi/component.jsx b/src/widgets/suwayomi/component.jsx
index f321d46d7..6945448e1 100644
--- a/src/widgets/suwayomi/component.jsx
+++ b/src/widgets/suwayomi/component.jsx
@@ -3,10 +3,14 @@ import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next/pages";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["download", "nondownload", "read", "unread"];
+
+export default function Component({ service: configuredService }) {
const { t } = useTranslation();
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const { data: suwayomiData, error: suwayomiError } = useWidgetAPI(widget);
@@ -16,11 +20,6 @@ export default function Component({ service }) {
}
if (!suwayomiData) {
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = ["download", "nondownload", "read", "unread"];
- } else if (widget.fields.length > 4) {
- widget.fields = widget.fields.slice(0, 4);
- }
return (
{widget.fields.map((field) => (
diff --git a/src/widgets/suwayomi/component.test.jsx b/src/widgets/suwayomi/component.test.jsx
index a3a779d85..152efb1a0 100644
--- a/src/widgets/suwayomi/component.test.jsx
+++ b/src/widgets/suwayomi/component.test.jsx
@@ -22,7 +22,7 @@ describe("widgets/suwayomi/component", () => {
const service = { widget: { type: "suwayomi" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["download", "nondownload", "read", "unread"]);
+ expect(service.widget.fields).toBeUndefined();
expect(container.querySelectorAll(".service-block")).toHaveLength(4);
expect(screen.getByText("suwayomi.download")).toBeInTheDocument();
expect(screen.getByText("suwayomi.nondownload")).toBeInTheDocument();
diff --git a/src/widgets/wgeasy/component.jsx b/src/widgets/wgeasy/component.jsx
index 338d94cc1..cce4c259a 100644
--- a/src/widgets/wgeasy/component.jsx
+++ b/src/widgets/wgeasy/component.jsx
@@ -2,18 +2,18 @@ import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
+import withWidgetFields from "utils/widget-fields";
-export default function Component({ service }) {
+const DEFAULT_FIELDS = ["connected", "enabled", "total"];
+
+export default function Component({ service: configuredService }) {
+ const service = withWidgetFields(configuredService, DEFAULT_FIELDS);
const { widget } = service;
const endpoint = widget.version === 2 ? "clientv2" : "client";
const { data: infoData, error: infoError } = useWidgetAPI(widget, endpoint);
- if (!widget.fields) {
- widget.fields = ["connected", "enabled", "total"];
- }
-
if (infoError || infoData?.statusCode > 400) {
return ;
}
diff --git a/src/widgets/wgeasy/component.test.jsx b/src/widgets/wgeasy/component.test.jsx
index eebc83915..8269a0906 100644
--- a/src/widgets/wgeasy/component.test.jsx
+++ b/src/widgets/wgeasy/component.test.jsx
@@ -28,7 +28,7 @@ describe("widgets/wgeasy/component", () => {
const service = { widget: { type: "wgeasy" } };
const { container } = renderWithProviders(, { settings: { hideErrors: false } });
- expect(service.widget.fields).toEqual(["connected", "enabled", "total"]);
+ expect(service.widget.fields).toBeUndefined();
// Container filters by widget.fields; "disabled" is not included by default.
expect(container.querySelectorAll(".service-block")).toHaveLength(3);
expect(screen.getByText("wgeasy.connected")).toBeInTheDocument();