浏览代码

Merge pull request #512 from Tarow/gluetun-widget

Add gluetun widget
shamoon 2 年之前
父节点
当前提交
6e7236981b

+ 5 - 0
public/locales/en/common.json

@@ -325,5 +325,10 @@
         "active": "Active",
         "active": "Active",
         "queue": "Queue",
         "queue": "Queue",
         "total": "Total"
         "total": "Total"
+    },
+    "gluetun": {
+        "public_ip": "Public IP",
+        "region": "Region",
+        "country": "Country"
     }
     }
 }
 }

+ 1 - 0
src/widgets/components.js

@@ -9,6 +9,7 @@ const components = {
   coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
   coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
   docker: dynamic(() => import("./docker/component")),
   docker: dynamic(() => import("./docker/component")),
   emby: dynamic(() => import("./emby/component")),
   emby: dynamic(() => import("./emby/component")),
+  gluetun: dynamic(() => import("./gluetun/component")),
   gotify: dynamic(() => import("./gotify/component")),
   gotify: dynamic(() => import("./gotify/component")),
   homebridge: dynamic(() => import("./homebridge/component")),
   homebridge: dynamic(() => import("./homebridge/component")),
   jackett: dynamic(() => import("./jackett/component")),
   jackett: dynamic(() => import("./jackett/component")),

+ 35 - 0
src/widgets/gluetun/component.jsx

@@ -0,0 +1,35 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
+
+  if (gluetunError) {
+    return <Container error={t("widget.api_error")} />;
+  }
+
+  if (!gluetunData) {
+    return (
+      <Container service={service}>
+        <Block label="gluetun.public_ip" />
+        <Block label="gluetun.region" />
+        <Block label="gluetun.country" />
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      <Block label="gluetun.public_ip" value={gluetunData.public_ip} />
+      <Block label="gluetun.region" value={gluetunData.region} />
+      <Block label="gluetun.country" value={gluetunData.country} />
+    </Container>
+  );
+}

+ 14 - 0
src/widgets/gluetun/widget.js

@@ -0,0 +1,14 @@
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/v1/{endpoint}",
+  proxyHandler: genericProxyHandler,
+
+  mappings: {
+    ip: {
+      endpoint: "publicip/ip",
+    },
+  },
+};
+
+export default widget;

+ 2 - 0
src/widgets/widgets.js

@@ -5,6 +5,7 @@ import bazarr from "./bazarr/widget";
 import changedetectionio from "./changedetectionio/widget";
 import changedetectionio from "./changedetectionio/widget";
 import coinmarketcap from "./coinmarketcap/widget";
 import coinmarketcap from "./coinmarketcap/widget";
 import emby from "./emby/widget";
 import emby from "./emby/widget";
+import gluetun from "./gluetun/widget";
 import gotify from "./gotify/widget";
 import gotify from "./gotify/widget";
 import homebridge from "./homebridge/widget";
 import homebridge from "./homebridge/widget";
 import jackett from "./jackett/widget";
 import jackett from "./jackett/widget";
@@ -46,6 +47,7 @@ const widgets = {
   changedetectionio,
   changedetectionio,
   coinmarketcap,
   coinmarketcap,
   emby,
   emby,
+  gluetun,
   gotify,
   gotify,
   homebridge,
   homebridge,
   jackett,
   jackett,