diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 5fbaaf216..60bfef6b7 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -126,7 +126,11 @@ "total": "Total" }, "coinmarketcap": { - "configure": "Configure one or more crypto currencies to track" + "configure": "Configure one or more crypto currencies to track", + "1hour": "1 Hour", + "1day": "1 Day", + "7days": "7 Days", + "30days": "30 Days" }, "gotify": { "apps": "Applications", diff --git a/src/components/services/dropdown.jsx b/src/components/services/dropdown.jsx new file mode 100644 index 000000000..4bc25a8fd --- /dev/null +++ b/src/components/services/dropdown.jsx @@ -0,0 +1,48 @@ +import { Fragment } from "react"; +import { Menu, Transition } from "@headlessui/react"; +import { BiCog } from "react-icons/bi"; +import classNames from "classnames"; + +export default function Dropdown({ options, value, setValue }) { + return ( + +
+ + {options.find((option) => option.value === value).label} + +
+ + + +
+ {options.map((option) => ( + + + + ))} +
+
+
+
+ ); +} diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx index 2d50276e3..06cc1629d 100644 --- a/src/components/services/item.jsx +++ b/src/components/services/item.jsx @@ -1,9 +1,12 @@ import Image from "next/future/image"; import { Disclosure } from "@headlessui/react"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; import Status from "./status"; import Widget from "./widget"; import Docker from "./widgets/service/docker"; +import Dropdown from "./dropdown"; function resolveIcon(icon) { if (icon.startsWith("http")) { @@ -22,6 +25,8 @@ function resolveIcon(icon) { } export default function Item({ service }) { + const { t } = useTranslation(); + const handleOnClick = () => { if (service.href && service.href !== "#") { window.open(service.href, "_blank").focus(); diff --git a/src/components/services/widget.jsx b/src/components/services/widget.jsx index d2c8fbf78..df1243240 100644 --- a/src/components/services/widget.jsx +++ b/src/components/services/widget.jsx @@ -45,7 +45,7 @@ const widgetMappings = { npm: Npm, tautulli: Tautulli, gotify: Gotify, - prowlarr: Prowlarr + prowlarr: Prowlarr, }; export default function Widget({ service }) { diff --git a/src/components/services/widgets/service/coinmarketcap.jsx b/src/components/services/widgets/service/coinmarketcap.jsx index c5e66ebc8..8fc30f525 100644 --- a/src/components/services/widgets/service/coinmarketcap.jsx +++ b/src/components/services/widgets/service/coinmarketcap.jsx @@ -1,15 +1,26 @@ import useSWR from "swr"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; -import getSymbolFromCurrency from "currency-symbol-map"; import Widget from "../widget"; import Block from "../block"; +import Dropdown from "components/services/dropdown"; import { formatApiUrl } from "utils/api-helpers"; +import classNames from "classnames"; export default function CoinMarketCap({ service }) { const { t } = useTranslation(); + const dateRangeOptions = [ + { label: t("coinmarketcap.1hour"), value: "1h" }, + { label: t("coinmarketcap.1day"), value: "24h" }, + { label: t("coinmarketcap.7days"), value: "7d" }, + { label: t("coinmarketcap.30days"), value: "30d" }, + ]; + + const [dateRange, setDateRange] = useState(dateRangeOptions[0].value); + const config = service.widget; const currencyCode = config.currency ?? "USD"; const { symbols } = config; @@ -30,7 +41,7 @@ export default function CoinMarketCap({ service }) { return ; } - if (!statsData) { + if (!statsData || !dateRange) { return ( @@ -39,28 +50,36 @@ export default function CoinMarketCap({ service }) { } const { data } = statsData; - const currencySymbol = getSymbolFromCurrency(currencyCode); return ( +
+ +
+
- {symbols.map((key) => ( + {symbols.map((symbol) => (
-
{data[key].name}
+
{data[symbol].name}
- {currencySymbol} - {data[key].quote[currencyCode].price.toFixed(2)} + {t("common.number", { + value: data[symbol].quote[currencyCode].price, + style: "currency", + currency: currencyCode, + })}
0 ? "text-emerald-300" : "text-rose-300" + data[symbol].quote[currencyCode][`percent_change_${dateRange}`] > 0 + ? "text-emerald-300" + : "text-rose-300" }`} > - {data[key].quote[currencyCode].percent_change_1h.toFixed(2)}% + {data[symbol].quote[currencyCode][`percent_change_${dateRange}`].toFixed(2)}%
diff --git a/src/components/services/widgets/widget.jsx b/src/components/services/widgets/widget.jsx index 98e4683eb..12202c05f 100644 --- a/src/components/services/widgets/widget.jsx +++ b/src/components/services/widgets/widget.jsx @@ -7,5 +7,5 @@ export default function Widget({ error = false, children }) { ); } - return
{children}
; + return
{children}
; }