feat: close relays
This commit is contained in:
@ -2,12 +2,12 @@ import { Link } from "react-router-dom";
|
||||
|
||||
import useRelayState from "@/Feed/RelayState";
|
||||
import useLogin from "@/Hooks/useLogin";
|
||||
import RelayUptime from "@/Pages/settings/relays/uptime";
|
||||
import { getRelayName } from "@/Utils";
|
||||
|
||||
import Icon from "../Icons/Icon";
|
||||
import RelayPermissions from "./permissions";
|
||||
import RelayStatusLabel from "./status-label";
|
||||
import RelayUptime from "./uptime";
|
||||
|
||||
export interface RelayProps {
|
||||
addr: string;
|
||||
|
21
packages/app/src/Components/Relay/uptime-label.tsx
Normal file
21
packages/app/src/Components/Relay/uptime-label.tsx
Normal file
@ -0,0 +1,21 @@
|
||||
import classNames from "classnames";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
|
||||
export default function UptimeLabel({ avgPing }: { avgPing: number }) {
|
||||
const idealPing = 500;
|
||||
const badPing = idealPing * 2;
|
||||
return (
|
||||
<div
|
||||
className={classNames("font-semibold", {
|
||||
"text-error": isNaN(avgPing) || avgPing > badPing,
|
||||
"text-warning": avgPing > idealPing && avgPing < badPing,
|
||||
"text-success": avgPing < idealPing,
|
||||
})}
|
||||
title={`${avgPing.toFixed(0)} ms`}>
|
||||
{isNaN(avgPing) && <FormattedMessage defaultMessage="Dead" />}
|
||||
{avgPing > badPing && <FormattedMessage defaultMessage="Poor" />}
|
||||
{avgPing > idealPing && avgPing < badPing && <FormattedMessage defaultMessage="Good" />}
|
||||
{avgPing < idealPing && <FormattedMessage defaultMessage="Great" />}
|
||||
</div>
|
||||
);
|
||||
}
|
43
packages/app/src/Components/Relay/uptime.tsx
Normal file
43
packages/app/src/Components/Relay/uptime.tsx
Normal file
@ -0,0 +1,43 @@
|
||||
import { sanitizeRelayUrl, unixNow } from "@snort/shared";
|
||||
import { EventKind, RequestBuilder } from "@snort/system";
|
||||
import { useRequestBuilder } from "@snort/system-react";
|
||||
import { useMemo } from "react";
|
||||
|
||||
import { findTag } from "@/Utils";
|
||||
import { Day, MonitorRelays } from "@/Utils/Const";
|
||||
|
||||
import UptimeLabel from "./uptime-label";
|
||||
|
||||
export default function RelayUptime({ url }: { url: string }) {
|
||||
const sub = useMemo(() => {
|
||||
const u = sanitizeRelayUrl(url);
|
||||
if (!u) return;
|
||||
|
||||
const rb = new RequestBuilder(`uptime`);
|
||||
rb.withFilter()
|
||||
.kinds([30_166 as EventKind])
|
||||
.tag("d", [u])
|
||||
.since(unixNow() - Day)
|
||||
.relay(MonitorRelays);
|
||||
return rb;
|
||||
}, [url]);
|
||||
|
||||
const data = useRequestBuilder(sub);
|
||||
const myData = data.filter(a => findTag(a, "d") === url);
|
||||
const ping = myData.reduce(
|
||||
(acc, v) => {
|
||||
const read = findTag(v, "rtt-read");
|
||||
if (read) {
|
||||
acc.n += 1;
|
||||
acc.total += Number(read);
|
||||
}
|
||||
return acc;
|
||||
},
|
||||
{
|
||||
n: 0,
|
||||
total: 0,
|
||||
},
|
||||
);
|
||||
const avgPing = ping.total / ping.n;
|
||||
return <UptimeLabel avgPing={avgPing} />;
|
||||
}
|
Reference in New Issue
Block a user