snort/src/element/Relay.tsx

90 lines
3.9 KiB
TypeScript
Raw Normal View History

2023-01-09 12:40:10 +00:00
import "./Relay.css"
2023-01-11 13:05:32 +00:00
import { faPlug, faTrash, faSquareCheck, faSquareXmark, faWifi, faUpload, faDownload, faPlugCircleXmark, faEllipsisVertical } from "@fortawesome/free-solid-svg-icons";
2023-01-09 12:40:10 +00:00
import useRelayState from "../feed/RelayState";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2023-01-11 13:05:32 +00:00
import { useMemo, useState } from "react";
2023-01-09 12:40:10 +00:00
import { useDispatch, useSelector } from "react-redux";
import { removeRelay, setRelays } from "../state/Login";
2023-01-16 17:48:25 +00:00
import { RootState } from "../state/Store";
import { RelaySettings } from "../nostr/Connection";
2023-01-09 12:40:10 +00:00
2023-01-16 17:48:25 +00:00
export interface RelayProps {
addr: string
}
2023-01-09 12:40:10 +00:00
2023-01-16 17:48:25 +00:00
export default function Relay(props: RelayProps) {
2023-01-09 12:40:10 +00:00
const dispatch = useDispatch();
2023-01-16 17:48:25 +00:00
const allRelaySettings = useSelector<RootState, Record<string, RelaySettings>>(s => s.login.relays);
const relaySettings = allRelaySettings[props.addr];
2023-01-09 12:40:10 +00:00
const state = useRelayState(props.addr);
const name = useMemo(() => new URL(props.addr).host, [props.addr]);
2023-01-11 13:05:32 +00:00
const [showExtra, setShowExtra] = useState(false);
2023-01-09 12:40:10 +00:00
2023-01-16 17:48:25 +00:00
function configure(o: RelaySettings) {
2023-01-09 12:40:10 +00:00
dispatch(setRelays({
2023-01-16 17:48:25 +00:00
relays: {
...allRelaySettings,
[props.addr]: o
},
createdAt: Math.floor(new Date().getTime() / 1000)
2023-01-09 12:40:10 +00:00
}));
}
2023-01-11 13:05:32 +00:00
2023-01-16 17:48:25 +00:00
let latency = Math.floor(state?.avgLatency ?? 0);
2023-01-09 12:40:10 +00:00
return (
<>
2023-01-11 13:05:32 +00:00
<div className={`relay w-max`}>
<div className={`flex ${state?.connected ? "bg-success" : "bg-error"}`}>
<FontAwesomeIcon icon={faPlug} />
2023-01-09 12:40:10 +00:00
</div>
<div className="f-grow f-col">
2023-01-11 13:05:32 +00:00
<div className="flex mb10">
<b className="f-2">{name}</b>
<div className="f-1">
Write
2023-01-19 11:14:41 +00:00
<span className="checkmark" onClick={() => configure({ write: !relaySettings.write, read: relaySettings.read })}>
2023-01-11 13:05:32 +00:00
<FontAwesomeIcon icon={relaySettings.write ? faSquareCheck : faSquareXmark} />
</span>
</div>
<div className="f-1">
Read
2023-01-19 11:14:41 +00:00
<span className="checkmark" onClick={() => configure({ write: relaySettings.write, read: !relaySettings.read })}>
2023-01-11 13:05:32 +00:00
<FontAwesomeIcon icon={relaySettings.read ? faSquareCheck : faSquareXmark} />
</span>
</div>
</div>
<div className="flex">
<div className="f-grow">
<FontAwesomeIcon icon={faWifi} /> {latency > 2000 ? `${(latency / 1000).toFixed(0)} secs` : `${latency.toLocaleString()} ms`}
&nbsp;
<FontAwesomeIcon icon={faPlugCircleXmark} /> {state?.disconnects}
</div>
<div>
2023-01-19 11:14:41 +00:00
<span className="icon-btn" onClick={() => setShowExtra(s => !s)}>
2023-01-11 13:05:32 +00:00
<FontAwesomeIcon icon={faEllipsisVertical} />
</span>
</div>
2023-01-09 12:40:10 +00:00
</div>
</div>
2023-01-11 13:05:32 +00:00
</div>
{showExtra ? <div className="flex relay-extra w-max">
<div className="f-1">
<FontAwesomeIcon icon={faUpload} /> {state?.events.send}
</div>
<div className="f-1">
<FontAwesomeIcon icon={faDownload} /> {state?.events.received}
</div>
<div className="f-1">
Delete
2023-01-19 11:14:41 +00:00
<span className="icon-btn" onClick={() => dispatch(removeRelay(props.addr))}>
2023-01-11 13:05:32 +00:00
<FontAwesomeIcon icon={faTrash} />
2023-01-09 12:40:10 +00:00
</span>
</div>
2023-01-11 13:05:32 +00:00
</div> : null}
2023-01-09 12:40:10 +00:00
</>
)
}