mirror of
https://github.com/hzrd149/nostrudel.git
synced 2025-09-26 19:47:25 +02:00
show pending relays in publish log
This commit is contained in:
@@ -6,7 +6,7 @@ import createDefer from "./deferred";
|
|||||||
import { PersistentSubject } from "./subject";
|
import { PersistentSubject } from "./subject";
|
||||||
import ControlledObservable from "./controlled-observable";
|
import ControlledObservable from "./controlled-observable";
|
||||||
|
|
||||||
type Result = { relay: AbstractRelay; success: boolean; message: string };
|
export type PublishResult = { relay: AbstractRelay; success: boolean; message: string };
|
||||||
|
|
||||||
export default class NostrPublishAction {
|
export default class NostrPublishAction {
|
||||||
id = nanoid();
|
id = nanoid();
|
||||||
@@ -14,14 +14,15 @@ export default class NostrPublishAction {
|
|||||||
relays: string[];
|
relays: string[];
|
||||||
event: NostrEvent;
|
event: NostrEvent;
|
||||||
|
|
||||||
results = new PersistentSubject<Result[]>([]);
|
results = new PersistentSubject<PublishResult[]>([]);
|
||||||
|
completePromise = createDefer();
|
||||||
|
|
||||||
onResult = new ControlledObservable<Result>();
|
/** @deprecated */
|
||||||
onComplete = createDefer<Result[]>();
|
onResult = new ControlledObservable<PublishResult>();
|
||||||
|
|
||||||
private remaining = new Set<AbstractRelay>();
|
private remaining = new Set<AbstractRelay>();
|
||||||
|
|
||||||
constructor(label: string, relays: Iterable<string>, event: NostrEvent, timeout: number = 5000) {
|
constructor(label: string, relays: Iterable<string>, event: NostrEvent, timeout: number = 10_000) {
|
||||||
this.label = label;
|
this.label = label;
|
||||||
this.relays = Array.from(relays);
|
this.relays = Array.from(relays);
|
||||||
this.event = event;
|
this.event = event;
|
||||||
@@ -42,12 +43,15 @@ export default class NostrPublishAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private handleResult(id: string, success: boolean, message: string, relay: AbstractRelay) {
|
private handleResult(id: string, success: boolean, message: string, relay: AbstractRelay) {
|
||||||
const result: Result = { relay, success, message };
|
const result: PublishResult = { relay, success, message };
|
||||||
this.results.next([...this.results.value, result]);
|
this.results.next([...this.results.value.filter((r) => r.relay !== relay), result]);
|
||||||
this.onResult.next(result);
|
this.onResult.next(result);
|
||||||
|
|
||||||
this.remaining.delete(relay);
|
this.remaining.delete(relay);
|
||||||
if (this.remaining.size === 0) this.onComplete.resolve(this.results.value);
|
|
||||||
|
if (this.remaining.size === 0) {
|
||||||
|
this.completePromise.resolve();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleTimeout() {
|
private handleTimeout() {
|
||||||
|
@@ -1,7 +1,18 @@
|
|||||||
import { Alert, AlertDescription, AlertIcon, AlertTitle, Box, Flex, FlexProps, Link, Progress } from "@chakra-ui/react";
|
import {
|
||||||
|
Alert,
|
||||||
|
AlertDescription,
|
||||||
|
AlertIcon,
|
||||||
|
AlertTitle,
|
||||||
|
Box,
|
||||||
|
Flex,
|
||||||
|
FlexProps,
|
||||||
|
Link,
|
||||||
|
Progress,
|
||||||
|
Spinner,
|
||||||
|
} from "@chakra-ui/react";
|
||||||
import { Link as RouterLink } from "react-router-dom";
|
import { Link as RouterLink } from "react-router-dom";
|
||||||
|
|
||||||
import NostrPublishAction from "../classes/nostr-publish-action";
|
import NostrPublishAction, { PublishResult } from "../classes/nostr-publish-action";
|
||||||
import useSubject from "../hooks/use-subject";
|
import useSubject from "../hooks/use-subject";
|
||||||
import { RelayPaidTag } from "../views/relays/components/relay-card";
|
import { RelayPaidTag } from "../views/relays/components/relay-card";
|
||||||
import { EmbedEvent } from "./embed-event";
|
import { EmbedEvent } from "./embed-event";
|
||||||
@@ -10,27 +21,52 @@ export type PostResultsProps = {
|
|||||||
pub: NostrPublishAction;
|
pub: NostrPublishAction;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function PublishResultRow({ result }: { result: PublishResult }) {
|
||||||
|
return (
|
||||||
|
<Alert status={result.success ? "success" : "warning"}>
|
||||||
|
<AlertIcon />
|
||||||
|
<Box>
|
||||||
|
<AlertTitle>
|
||||||
|
<Link as={RouterLink} to={`/r/${encodeURIComponent(result.relay.url)}`}>
|
||||||
|
{result.relay.url}
|
||||||
|
</Link>
|
||||||
|
<RelayPaidTag url={result.relay.url} />
|
||||||
|
</AlertTitle>
|
||||||
|
{result.message && <AlertDescription>{result.message}</AlertDescription>}
|
||||||
|
</Box>
|
||||||
|
</Alert>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function PublishDetails({ pub }: PostResultsProps & Omit<FlexProps, "children">) {
|
export function PublishDetails({ pub }: PostResultsProps & Omit<FlexProps, "children">) {
|
||||||
const results = useSubject(pub.results);
|
const results = useSubject(pub.results);
|
||||||
|
|
||||||
|
const relayResults: Record<string, PublishResult | undefined> = {};
|
||||||
|
for (const url of pub.relays) {
|
||||||
|
relayResults[url] = results.find((r) => r.relay.url === url);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex direction="column" gap="2">
|
<Flex direction="column" gap="2">
|
||||||
<EmbedEvent event={pub.event} />
|
<EmbedEvent event={pub.event} />
|
||||||
<Progress value={(results.length / pub.relays.length) * 100} size="lg" hasStripe />
|
<Progress value={(results.length / pub.relays.length) * 100} size="lg" hasStripe />
|
||||||
{results.map(({ success, message, relay }) => (
|
{Object.entries(relayResults).map(([url, result]) =>
|
||||||
<Alert key={relay.url} status={success ? "success" : "warning"}>
|
result ? (
|
||||||
<AlertIcon />
|
<PublishResultRow key={url} result={result} />
|
||||||
<Box>
|
) : (
|
||||||
<AlertTitle>
|
<Alert status="info">
|
||||||
<Link as={RouterLink} to={`/r/${encodeURIComponent(relay.url)}`}>
|
<Spinner mr="2" />
|
||||||
{relay.url}
|
<Box>
|
||||||
</Link>
|
<AlertTitle>
|
||||||
<RelayPaidTag url={relay.url} />
|
<Link as={RouterLink} to={`/r/${encodeURIComponent(url)}`}>
|
||||||
</AlertTitle>
|
{url}
|
||||||
{message && <AlertDescription>{message}</AlertDescription>}
|
</Link>
|
||||||
</Box>
|
<RelayPaidTag url={url} />
|
||||||
</Alert>
|
</AlertTitle>
|
||||||
))}
|
</Box>
|
||||||
|
</Alert>
|
||||||
|
),
|
||||||
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -64,7 +64,7 @@ function PublishAction({ pub }: { pub: NostrPublishAction }) {
|
|||||||
<PublishActionStatusTag ml="auto" pub={pub} />
|
<PublishActionStatusTag ml="auto" pub={pub} />
|
||||||
</Flex>
|
</Flex>
|
||||||
{details.isOpen && (
|
{details.isOpen && (
|
||||||
<Modal isOpen onClose={details.onClose} size="xl">
|
<Modal isOpen onClose={details.onClose} size="2xl">
|
||||||
<ModalOverlay />
|
<ModalOverlay />
|
||||||
<ModalContent>
|
<ModalContent>
|
||||||
<ModalHeader pt="4" px="4" pb="0">
|
<ModalHeader pt="4" px="4" pb="0">
|
||||||
|
Reference in New Issue
Block a user