From ae9fbdcb8bae4c00388aca132faa67d6b33069e1 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 5 Apr 2025 23:54:48 -0700
Subject: [PATCH] Chore: change hoarder widget to karakeep (#5143)
---
docs/widgets/services/hoarder.md | 17 -------
docs/widgets/services/index.md | 2 +-
docs/widgets/services/karakeep.md | 17 +++++++
mkdocs.yml | 2 +-
public/locales/en/common.json | 2 +-
src/components/services/widget/container.jsx | 17 ++++++-
src/utils/proxy/handlers/credentialed.js | 1 +
src/widgets/components.js | 3 +-
src/widgets/hoarder/component.jsx | 49 --------------------
src/widgets/karakeep/component.jsx | 49 ++++++++++++++++++++
src/widgets/{hoarder => karakeep}/widget.js | 0
src/widgets/widgets.js | 5 +-
12 files changed, 91 insertions(+), 73 deletions(-)
delete mode 100644 docs/widgets/services/hoarder.md
create mode 100644 docs/widgets/services/karakeep.md
delete mode 100644 src/widgets/hoarder/component.jsx
create mode 100644 src/widgets/karakeep/component.jsx
rename src/widgets/{hoarder => karakeep}/widget.js (100%)
diff --git a/docs/widgets/services/hoarder.md b/docs/widgets/services/hoarder.md
deleted file mode 100644
index 3e8c82ad..00000000
--- a/docs/widgets/services/hoarder.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Hoarder
-description: Hoarder Widget Configuration
----
-
-Learn more about [Hoarder](https://hoarder.app).
-
-Generate an API key for your user at `User Settings > API Keys`.
-
-Allowed fields: `["bookmarks", "favorites", "archived", "highlights", "lists", "tags"]` (maximum of 4).
-
-```yaml
-widget:
- type: hoarder
- url: http[s]://hoarder.host.or.ip[:port]
- key: hoarderapikey
-```
diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md
index beb6d491..80ff72ba 100644
--- a/docs/widgets/services/index.md
+++ b/docs/widgets/services/index.md
@@ -51,7 +51,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [HDHomeRun](hdhomerun.md)
- [Headscale](headscale.md)
- [Healthchecks](healthchecks.md)
-- [Hoarder](hoarder.md)
+- [Karakeep](karakeep.md)
- [Home Assistant](homeassistant.md)
- [HomeBox](homebox.md)
- [Homebridge](homebridge.md)
diff --git a/docs/widgets/services/karakeep.md b/docs/widgets/services/karakeep.md
new file mode 100644
index 00000000..a2902315
--- /dev/null
+++ b/docs/widgets/services/karakeep.md
@@ -0,0 +1,17 @@
+---
+title: Karakeep
+description: Karakeep Widget Configuration
+---
+
+Learn more about [Karakeep](https://karakeep.app) (formerly known as Hoarder).
+
+Generate an API key for your user at `User Settings > API Keys`.
+
+Allowed fields: `["bookmarks", "favorites", "archived", "highlights", "lists", "tags"]` (maximum of 4).
+
+```yaml
+widget:
+ type: karakeep
+ url: http[s]://karakeep.host.or.ip[:port]
+ key: karakeep_api_key
+```
diff --git a/mkdocs.yml b/mkdocs.yml
index 01a5295b..8bb19e43 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -74,7 +74,7 @@ nav:
- widgets/services/hdhomerun.md
- widgets/services/headscale.md
- widgets/services/healthchecks.md
- - widgets/services/hoarder.md
+ - widgets/services/karakeep.md
- widgets/services/homeassistant.md
- widgets/services/homebox.md
- widgets/services/homebridge.md
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 4a9c33d5..09b9c2d3 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -1024,7 +1024,7 @@
"bcharge":"Battery Charge",
"timeleft":"Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx
index 9b10233c..f5957382 100644
--- a/src/components/services/widget/container.jsx
+++ b/src/components/services/widget/container.jsx
@@ -3,6 +3,11 @@ import { SettingsContext } from "utils/contexts/settings";
import Error from "./error";
+const ALIASED_WIDGETS = {
+ pialert: "netalertx",
+ hoarder: "karakeep",
+};
+
export default function Container({ error = false, children, service }) {
const { settings } = useContext(SettingsContext);
@@ -32,7 +37,17 @@ export default function Container({ error = false, children, service }) {
if (!field.includes(".")) {
fullField = `${type}.${field}`;
}
- return fullField === child?.props?.label;
+ let matches = fullField === child?.props?.label;
+ // check if the field is an 'alias'
+ if (matches) {
+ return true;
+ } else if (ALIASED_WIDGETS[type]) {
+ matches = fullField.replace(type, ALIASED_WIDGETS[type]) === child?.props?.label;
+
+ return matches;
+ }
+ // no match
+ return false;
}),
);
}
diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index d0dbc2d6..017d44c9 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -42,6 +42,7 @@ export default async function credentialedProxyHandler(req, res, map) {
"ghostfolio",
"headscale",
"hoarder",
+ "karakeep",
"linkwarden",
"mealie",
"netalertx",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 148a626b..880c8222 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -47,7 +47,8 @@ const components = {
grafana: dynamic(() => import("./grafana/component")),
hdhomerun: dynamic(() => import("./hdhomerun/component")),
headscale: dynamic(() => import("./headscale/component")),
- hoarder: dynamic(() => import("./hoarder/component")),
+ hoarder: dynamic(() => import("./karakeep/component")),
+ karakeep: dynamic(() => import("./karakeep/component")),
peanut: dynamic(() => import("./peanut/component")),
homeassistant: dynamic(() => import("./homeassistant/component")),
homebox: dynamic(() => import("./homebox/component")),
diff --git a/src/widgets/hoarder/component.jsx b/src/widgets/hoarder/component.jsx
deleted file mode 100644
index 4be6fbab..00000000
--- a/src/widgets/hoarder/component.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import Block from "components/services/widget/block";
-import Container from "components/services/widget/container";
-import { useTranslation } from "next-i18next";
-
-import useWidgetAPI from "utils/proxy/use-widget-api";
-
-export const hoarderDefaultFields = ["bookmarks", "favorites", "archived", "highlights"];
-const MAX_ALLOWED_FIELDS = 4;
-
-export default function Component({ service }) {
- const { t } = useTranslation();
- const { widget } = service;
-
- const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
-
- if (statsError) {
- return ;
- }
-
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = hoarderDefaultFields;
- } else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
- widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
- }
-
- if (!statsData) {
- return (
-
-
-
-
-
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/widgets/karakeep/component.jsx b/src/widgets/karakeep/component.jsx
new file mode 100644
index 00000000..8a74662d
--- /dev/null
+++ b/src/widgets/karakeep/component.jsx
@@ -0,0 +1,49 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export const karakeepDefaultFields = ["bookmarks", "favorites", "archived", "highlights"];
+const MAX_ALLOWED_FIELDS = 4;
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+ const { widget } = service;
+
+ const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
+
+ if (statsError) {
+ return ;
+ }
+
+ if (!widget.fields || widget.fields.length === 0) {
+ widget.fields = karakeepDefaultFields;
+ } else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
+ widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
+ }
+
+ if (!statsData) {
+ return (
+
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/widgets/hoarder/widget.js b/src/widgets/karakeep/widget.js
similarity index 100%
rename from src/widgets/hoarder/widget.js
rename to src/widgets/karakeep/widget.js
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 992855d0..e183a9c6 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -42,7 +42,6 @@ import grafana from "./grafana/widget";
import hdhomerun from "./hdhomerun/widget";
import headscale from "./headscale/widget";
import healthchecks from "./healthchecks/widget";
-import hoarder from "./hoarder/widget";
import homeassistant from "./homeassistant/widget";
import homebox from "./homebox/widget";
import homebridge from "./homebridge/widget";
@@ -50,6 +49,7 @@ import immich from "./immich/widget";
import jackett from "./jackett/widget";
import jdownloader from "./jdownloader/widget";
import jellyseerr from "./jellyseerr/widget";
+import karakeep from "./karakeep/widget";
import kavita from "./kavita/widget";
import komga from "./komga/widget";
import kopia from "./kopia/widget";
@@ -178,7 +178,8 @@ const widgets = {
grafana,
hdhomerun,
headscale,
- hoarder,
+ hoarder: karakeep,
+ karakeep,
homeassistant,
homebox,
homebridge,