show if event has been reposted

This commit is contained in:
hzrd149 2024-01-29 12:48:46 +00:00
parent b12d695c1e
commit 3ec46822dd
3 changed files with 43 additions and 10 deletions

View File

@ -1,23 +1,43 @@
import { Button, IconButton, useDisclosure } from "@chakra-ui/react";
import { kinds } from "nostr-tools";
import { NostrEvent } from "../../../types/nostr-event";
import { RepostIcon } from "../../icons";
import useEventCount from "../../../hooks/use-event-count";
import RepostModal from "./repost-modal";
import useEventExists from "../../../hooks/use-event-exists";
import useCurrentAccount from "../../../hooks/use-current-account";
export default function RepostButton({ event }: { event: NostrEvent }) {
const { isOpen, onClose, onOpen } = useDisclosure();
const repostCount = useEventCount({ "#e": [event.id], kinds: [6] });
const account = useCurrentAccount();
const hasReposted = useEventExists(
account ? { "#e": [event.id], kinds: [kinds.Repost, kinds.GenericRepost], authors: [account.pubkey] } : undefined,
[], //only check the cache
false,
);
const repostCount = useEventCount({ "#e": [event.id], kinds: [kinds.Repost, kinds.GenericRepost] });
return (
<>
{repostCount !== undefined && repostCount > 0 ? (
<Button leftIcon={<RepostIcon />} onClick={onOpen} title="Repost Note">
<Button
leftIcon={<RepostIcon />}
onClick={onOpen}
title="Repost Note"
colorScheme={hasReposted ? "primary" : undefined}
>
{repostCount}
</Button>
) : (
<IconButton icon={<RepostIcon />} onClick={onOpen} aria-label="Repost Note" title="Repost Note" />
<IconButton
icon={<RepostIcon />}
onClick={onOpen}
aria-label="Repost Note"
title="Repost Note"
colorScheme={hasReposted ? "primary" : undefined}
/>
)}
{isOpen && <RepostModal isOpen={isOpen} onClose={onClose} event={event} />}
</>

View File

@ -4,7 +4,10 @@ import eventExistsService from "../services/event-exists";
import { NostrRequestFilter } from "../types/nostr-query";
import useSubject from "./use-subject";
export default function useEventExists(filter: NostrRequestFilter, relays: string[], fallback = true) {
const sub = useMemo(() => eventExistsService.requestExists(filter, relays), [stringify(filter), relays.join("|")]);
export default function useEventExists(filter?: NostrRequestFilter, relays: string[] = [], fallback = true) {
const sub = useMemo(
() => filter && eventExistsService.requestExists(filter, relays),
[stringify(filter), relays.join("|")],
);
return useSubject(sub) ?? fallback;
}

View File

@ -8,6 +8,8 @@ import relayScoreboardService from "./relay-scoreboard";
import { logger } from "../helpers/debug";
import { matchFilter, matchFilters } from "nostr-tools";
import { NostrEvent } from "../types/nostr-event";
import { relayRequest } from "../helpers/relay";
import { localRelay } from "./local-relay";
function hashFilter(filter: NostrRequestFilter) {
return stringify(filter);
@ -35,11 +37,17 @@ class EventExistsService {
if (!this.filters.has(key)) this.filters.set(key, filter);
if (sub.value !== true) {
for (const url of relays) {
if (!asked.has(url) && !pending.has(url)) {
pending.add(url);
relayRequest(localRelay, Array.isArray(filter) ? filter : [filter]).then((cached) => {
if (cached.length > 0) {
for (const e of cached) this.handleEvent(e, false);
} else {
for (const url of relays) {
if (!asked.has(url) && !pending.has(url)) {
pending.add(url);
}
}
}
}
});
}
return sub;
@ -72,13 +80,15 @@ class EventExistsService {
}
}
handleEvent(event: NostrEvent) {
handleEvent(event: NostrEvent, cache = true) {
for (const [key, filter] of this.filters) {
const doseMatch = Array.isArray(filter) ? matchFilters(filter, event) : matchFilter(filter, event);
if (doseMatch && this.answers.get(key).value !== true) {
this.answers.get(key).next(true);
}
}
if (cache) localRelay.publish(event);
}
}