clean up read relay warning screen

This commit is contained in:
hzrd149 2024-01-29 12:19:24 +00:00
parent 3d27b8d972
commit b12d695c1e
2 changed files with 62 additions and 22 deletions

View File

@ -1,5 +1,5 @@
import { PropsWithChildren, useCallback } from "react";
import { Button, ButtonGroup, Flex, Heading } from "@chakra-ui/react";
import { MouseEventHandler, PropsWithChildren, useCallback } from "react";
import { Button, Card, CardBody, CardHeader, Flex, Heading } from "@chakra-ui/react";
import { useReadRelays } from "../../hooks/use-client-relays";
import clientRelaysService, { recommendedReadRelays, recommendedWriteRelays } from "../../services/client-relays";
@ -7,28 +7,61 @@ import AddRelayForm from "../../components/relay-management-drawer/add-relay-for
import { RelayMode } from "../../classes/relay";
import useSubject from "../../hooks/use-subject";
import { offlineMode } from "../../services/offline-mode";
import { safeRelayUrls } from "../../helpers/relay";
import RelaySet from "../../classes/relay-set";
import HoverLinkOverlay from "../../components/hover-link-overlay";
const JapaneseRelays = safeRelayUrls([
"wss://r.kojira.io",
"wss://nrelay-jp.c-stellar.net",
"wss://nostr.fediverse.jp",
"wss://nostr.holybea.com",
"wss://relay-jp.nostr.wirednet.jp",
]);
function RelaySetCard({ label, read, write }: { label: string; read: Iterable<string>; write: Iterable<string> }) {
const handleClick = useCallback<MouseEventHandler>((e) => {
e.preventDefault();
clientRelaysService.readRelays.next(RelaySet.from(read));
clientRelaysService.writeRelays.next(RelaySet.from(write));
clientRelaysService.saveRelays();
}, []);
return (
<Card w="full" variant="outline">
<CardHeader px="4" pt="4" pb="2">
<Heading size="sm">
<HoverLinkOverlay href="#" onClick={handleClick}>
{label}:
</HoverLinkOverlay>
</Heading>
</CardHeader>
<CardBody px="4" pt="0" pb="4">
{RelaySet.from(read, write).urls.join(", ")}
</CardBody>
</Card>
);
}
export default function RequireReadRelays({ children }: PropsWithChildren) {
const readRelays = useReadRelays();
const offline = useSubject(offlineMode);
const setDefault = useCallback(() => {
clientRelaysService.readRelays.next(recommendedReadRelays);
clientRelaysService.writeRelays.next(recommendedWriteRelays);
clientRelaysService.saveRelays();
}, []);
if (readRelays.size === 0 && !offline)
return (
<Flex direction="column" maxW="md" mx="auto" h="full" alignItems="center" justifyContent="center" gap="4">
<Heading size="md">Looks like you don't have any relays setup</Heading>
<AddRelayForm onSubmit={(url) => clientRelaysService.addRelay(url, RelayMode.ALL)} w="full" />
<ButtonGroup ml="auto">
<Button onClick={() => offlineMode.next(true)}>Offline mode</Button>
<Button colorScheme="primary" onClick={setDefault}>
Use recommended
</Button>
</ButtonGroup>
<RelaySetCard label="Recommended Relays" read={recommendedReadRelays} write={recommendedWriteRelays} />
<RelaySetCard label="Japanese relays" read={JapaneseRelays} write={JapaneseRelays} />
<Card w="full" variant="outline">
<CardHeader px="4" pt="4" pb="2">
<Heading size="sm">Single relay:</Heading>
</CardHeader>
<CardBody px="4" pt="0" pb="4">
<AddRelayForm onSubmit={(url) => clientRelaysService.addRelay(url, RelayMode.ALL)} w="full" />
</CardBody>
</Card>
<Button onClick={() => offlineMode.next(true)}>Offline mode</Button>
</Flex>
);

View File

@ -5,16 +5,23 @@ import { PersistentSubject } from "../classes/subject";
import { logger } from "../helpers/debug";
import RelaySet from "../classes/relay-set";
import { NostrEvent } from "nostr-tools";
import { safeRelayUrls } from "../helpers/relay";
export type RelayDirectory = Record<string, { read: boolean; write: boolean }>;
export const recommendedReadRelays = new RelaySet([
"wss://relay.damus.io/",
"wss://nostr.wine/",
"wss://relay.snort.social/",
"wss://nos.lol/",
]);
export const recommendedWriteRelays = new RelaySet(["wss://relay.damus.io/", "wss://nos.lol/"]);
export const recommendedReadRelays = new RelaySet(
safeRelayUrls([
"wss://relay.damus.io/",
"wss://nostr.wine/",
"wss://relay.snort.social/",
"wss://nos.lol/",
"wss://purplerelay.com/",
"wss://eden.nostr.land/",
]),
);
export const recommendedWriteRelays = new RelaySet(
safeRelayUrls(["wss://relay.damus.io/", "wss://nos.lol/", "wss://purplerelay.com/"]),
);
class ClientRelayService {
readRelays = new PersistentSubject(new RelaySet());