snort/packages/app/src/Element/Relay.tsx

111 lines
3.5 KiB
TypeScript
Raw Normal View History

import "./Relay.css";
2023-03-28 14:34:01 +00:00
import { useMemo } from "react";
2023-02-08 21:10:26 +00:00
import { useIntl, FormattedMessage } from "react-intl";
import { useNavigate } from "react-router-dom";
2023-03-28 14:34:01 +00:00
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faPlug,
faSquareCheck,
faSquareXmark,
faWifi,
faPlugCircleXmark,
faGear,
2023-03-29 09:34:39 +00:00
faWarning,
} from "@fortawesome/free-solid-svg-icons";
2023-03-28 14:34:01 +00:00
import { RelaySettings } from "@snort/nostr";
2023-01-20 11:11:50 +00:00
import useRelayState from "Feed/RelayState";
2023-03-28 14:34:01 +00:00
import { System } from "System";
2023-04-14 11:33:19 +00:00
import { getRelayName, unixNowMs, unwrap } from "Util";
2023-02-08 21:10:26 +00:00
import messages from "./messages";
2023-04-14 11:33:19 +00:00
import useLogin from "Hooks/useLogin";
import { setRelays } from "Login";
2023-01-09 12:40:10 +00:00
2023-01-16 17:48:25 +00:00
export interface RelayProps {
addr: string;
2023-01-16 17:48:25 +00:00
}
2023-01-09 12:40:10 +00:00
2023-01-16 17:48:25 +00:00
export default function Relay(props: RelayProps) {
2023-02-08 21:10:26 +00:00
const { formatMessage } = useIntl();
const navigate = useNavigate();
2023-04-14 11:33:19 +00:00
const login = useLogin();
const relaySettings = unwrap(login.relays.item[props.addr] ?? System.Sockets.get(props.addr)?.Settings ?? {});
const state = useRelayState(props.addr);
const name = useMemo(() => getRelayName(props.addr), [props.addr]);
2023-01-09 12:40:10 +00:00
function configure(o: RelaySettings) {
2023-04-14 11:33:19 +00:00
setRelays(
login,
{
...login.relays.item,
[props.addr]: o,
},
unixNowMs()
);
}
2023-01-09 12:40:10 +00:00
2023-02-07 19:47:57 +00:00
const latency = Math.floor(state?.avgLatency ?? 0);
return (
<>
<div className={`relay w-max`}>
<div className={`flex ${state?.connected ? "bg-success" : "bg-error"}`}>
<FontAwesomeIcon icon={faPlug} />
</div>
<div className="f-grow f-col">
<div className="flex mb10">
<b className="f-2">{name}</b>
<div className="f-1">
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.Write} />
<span
className="checkmark"
onClick={() =>
configure({
write: !relaySettings.write,
read: relaySettings.read,
})
2023-02-09 12:26:54 +00:00
}>
<FontAwesomeIcon icon={relaySettings.write ? faSquareCheck : faSquareXmark} />
</span>
</div>
<div className="f-1">
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.Read} />
<span
className="checkmark"
onClick={() =>
configure({
write: relaySettings.write,
read: !relaySettings.read,
})
2023-02-09 12:26:54 +00:00
}>
<FontAwesomeIcon icon={relaySettings.read ? faSquareCheck : faSquareXmark} />
</span>
</div>
</div>
<div className="flex">
<div className="f-grow">
2023-03-29 09:34:39 +00:00
<FontAwesomeIcon icon={faWifi} className="mr5 ml5" />
{latency > 2000
2023-02-08 21:10:26 +00:00
? formatMessage(messages.Seconds, {
n: (latency / 1000).toFixed(0),
})
: formatMessage(messages.Milliseconds, {
n: latency.toLocaleString(),
})}
&nbsp;
2023-03-29 09:34:39 +00:00
<FontAwesomeIcon icon={faPlugCircleXmark} className="mr5 ml5" /> {state?.disconnects}
<FontAwesomeIcon icon={faWarning} className="mr5 ml5" />
{state?.pendingRequests?.length}
</div>
<div>
2023-02-09 12:26:54 +00:00
<span className="icon-btn" onClick={() => navigate(state?.id ?? "")}>
<FontAwesomeIcon icon={faGear} />
</span>
2023-01-11 13:05:32 +00:00
</div>
</div>
</div>
</div>
</>
);
}