diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 49a85047..f3f89ff1 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -233,8 +233,9 @@ "total": "Total" }, "tailscale": { - "private_ip": "Private IP", - "status": "Status" + "address": "Address", + "expires": "Expires", + "last_seen": "Last Seen" }, "tdarr": { "queue": "Queue", diff --git a/src/widgets/tailscale/component.jsx b/src/widgets/tailscale/component.jsx index e80f9e8c..ad87cc2b 100644 --- a/src/widgets/tailscale/component.jsx +++ b/src/widgets/tailscale/component.jsx @@ -5,7 +5,9 @@ import useWidgetAPI from "utils/proxy/use-widget-api"; export default function Component({ service }) { const { widget } = service; - const { data: statsData, error: statsError } = useWidgetAPI(widget, "device"); + const { data: statsData, error: statsError } = useWidgetAPI(widget, "device", { + refreshInterval: 1000 * 60 + }); if (statsError) { return ; @@ -14,24 +16,47 @@ export default function Component({ service }) { if (!statsData) { return ( - - + + + ); } - const getStatus = () => { - const { endpoints, latency } = statsData.clientConnectivity - return (endpoints.length === 0 || Object.keys(latency).length === 0) ? "Offline" : "Online" - } - + const now = new Date() + const address = statsData.addresses[0] - const privateIP = statsData.addresses[0] + const getLastSeen = () => { + const lastSeen = new Date(statsData.lastSeen) + const diff = now.getTime() - lastSeen.getTime() + const diffInYears = Math.ceil(diff / (1000 * 60 * 60 * 24 * 365)) + if (diffInYears > 1) return `${diffInYears}y Ago` + const diffInWeeks = Math.ceil(diff / (1000 * 60 * 60 * 24 * 7)) + if (diffInWeeks > 1) return `${diffInWeeks}w Ago` + const diffInDays = Math.ceil(diff / (1000 * 60 * 60 * 24)) + if (diffInDays > 1) return `${diffInDays}d Ago` + const diffInHours = Math.ceil(diff / (1000 * 60 * 60)) + if (diffInHours > 1) return `${diffInHours}h Ago` + const diffInMinutes = Math.ceil(diff / (1000 * 60)) + if (diffInMinutes > 1) return `${diffInMinutes}m Ago` + const diffInSeconds = Math.ceil(diff / 1000) + if (diffInSeconds > 10) return `${diffInSeconds}s Ago` + return 'Just Now' + } + + const getExpiry = () => { + if (statsData.keyExpiryDisabled) return 'Never' + const expiry = new Date(statsData.expires) + const diff = expiry.getTime() - now.getTime() + const days = Math.ceil(diff / (1000 * 60 * 60 * 24)) + return `${days} Days` + } return ( - - + + + ); } diff --git a/src/widgets/tailscale/widget.js b/src/widgets/tailscale/widget.js index 7891ca80..8033d354 100644 --- a/src/widgets/tailscale/widget.js +++ b/src/widgets/tailscale/widget.js @@ -1,7 +1,7 @@ import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; const widget = { - api: "https://api.tailscale.com/api/v2/{endpoint}/{deviceid}?fields=all", + api: "https://api.tailscale.com/api/v2/{endpoint}/{deviceid}", proxyHandler: credentialedProxyHandler, mappings: {