diff --git a/src/components/timeline-page/timeline-health/index.tsx b/src/components/timeline-page/timeline-health/index.tsx index 339d6efd7..1286d6320 100644 --- a/src/components/timeline-page/timeline-health/index.tsx +++ b/src/components/timeline-page/timeline-health/index.tsx @@ -1,8 +1,9 @@ +import { useMemo, useRef } from "react"; import { - Button, - Flex, + Box, Table, TableContainer, + TableRowProps, Tbody, Td, Text, @@ -11,18 +12,25 @@ import { Tooltip, Tr, useColorMode, + useToast, } from "@chakra-ui/react"; import { TimelineLoader } from "../../../classes/timeline-loader"; import useSubject from "../../../hooks/use-subject"; -import { getEventRelays } from "../../../services/event-relays"; +import { getEventRelays, handleEventFromRelay } from "../../../services/event-relays"; import { NostrEvent } from "../../../types/nostr-event"; -import { useMemo, useRef } from "react"; import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer"; import { RelayFavicon } from "../../relay-favicon"; import { NoteLink } from "../../note-link"; import dayjs from "dayjs"; +import { nostrPostAction } from "../../../classes/nostr-post-action"; +import relayPoolService from "../../../services/relay-pool"; -function EventRow({ event, relays }: { event: NostrEvent; relays: string[] }) { +function EventRow({ + event, + relays, + ...props +}: { event: NostrEvent; relays: string[] } & Omit) { + const toast = useToast(); const sub = useMemo(() => getEventRelays(event.id), [event.id]); const seenRelays = useSubject(sub); @@ -33,8 +41,20 @@ function EventRow({ event, relays }: { event: NostrEvent; relays: string[] }) { const yes = colorMode === "light" ? "green.200" : "green.800"; const no = colorMode === "light" ? "red.200" : "red.800"; + const broadcast = (relay: string) => { + const { results } = nostrPostAction([relay], event, 5000); + + results.subscribe((result) => { + if (result.status) { + handleEventFromRelay(relayPoolService.requestRelay(result.url, false), event); + } else if (result.message) { + toast({ description: result.message, status: result.status ? "success" : "error" }); + } + }); + }; + return ( - + {dayjs.unix(event.created_at).fromNow()} @@ -47,7 +67,14 @@ function EventRow({ event, relays }: { event: NostrEvent; relays: string[] }) { {relays.map((relay) => ( - + !seenRelays.includes(relay) && broadcast(relay)} + cursor={seenRelays.includes(relay) ? undefined : "pointer"} + > ))} @@ -60,10 +87,6 @@ export default function TimelineHealth({ timeline }: { timeline: TimelineLoader return ( <> - - {/* */} - {/* */} - @@ -76,11 +99,13 @@ export default function TimelineHealth({ timeline }: { timeline: TimelineLoader {timeline.relays.map((relay) => ( - - - + ))}
Content - - + + + + + +