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();