import { useEffect, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { removeUndefined, unwrap } from "@snort/shared"; import { NostrEvent, OkResponse } from "@snort/system"; import AsyncButton from "Element/AsyncButton"; import Icon from "Icons/Icon"; import { getRelayName, sanitizeRelayUrl } from "SnortUtils"; import { removeRelay } from "Login"; import useLogin from "Hooks/useLogin"; import useEventPublisher from "Hooks/useEventPublisher"; export function NoteBroadcaster({ evs, onClose, customRelays, }: { evs: Array; onClose: () => void; customRelays?: Array; }) { const [results, setResults] = useState>([]); const { formatMessage } = useIntl(); const login = useLogin(); const { publisher, system } = useEventPublisher(); async function sendEventToRelays(ev: NostrEvent) { if (customRelays) { return removeUndefined( await Promise.all( customRelays.map(async r => { try { return await system.WriteOnceToRelay(r, ev); } catch (e) { console.error(e); } }), ), ); } else { return await system.BroadcastEvent(ev, r => setResults(x => [...x, r])); } } async function sendNote() { const results = await Promise.all(evs.map(a => sendEventToRelays(a)).flat()); if (results.flat().every(a => a.ok)) { onClose(); } } useEffect(() => { sendNote().catch(console.error); }, []); async function removeRelayFromResult(r: OkResponse) { if (publisher) { removeRelay(login, unwrap(sanitizeRelayUrl(r.relay))); const ev = await publisher.contactList(login.follows.item, login.relays.item); await system.BroadcastEvent(ev); setResults(s => s.filter(a => a.relay !== r.relay)); } } async function retryPublish(r: OkResponse) { const ev = evs.find(a => a.id === r.id); if (ev) { const rsp = await system.WriteOnceToRelay(unwrap(sanitizeRelayUrl(r.relay)), ev); setResults(s => s.map(x => { if (x.relay === r.relay && x.id === r.id) { return rsp; //replace with new response } return x; }), ); } } return (

{results .filter(a => a.message !== "Duplicate request") .sort(a => (a.ok ? -1 : 1)) .map(r => (
{getRelayName(r.relay)} {r.message && {r.message}}
{!r.ok && (
retryPublish(r)} className="p4 br-compact flex f-center secondary" title={formatMessage({ defaultMessage: "Retry publishing", })}> removeRelayFromResult(r)} className="p4 br-compact flex f-center secondary" title={formatMessage({ defaultMessage: "Remove from my relays", })}>
)}
))}
); }