diff --git a/src/element/live-chat.tsx b/src/element/live-chat.tsx index c4b26c0..d644889 100644 --- a/src/element/live-chat.tsx +++ b/src/element/live-chat.tsx @@ -22,6 +22,7 @@ import { NewGoalDialog } from "element/new-goal"; import { WriteMessage } from "element/write-message"; import useEmoji, { packId } from "hooks/emoji"; import { useLiveChatFeed } from "hooks/live-chat"; +import { useMutedPubkeys } from "hooks/lists"; import { useBadges } from "hooks/badges"; import { useLogin } from "hooks/login"; import useTopZappers from "hooks/top-zappers"; @@ -100,10 +101,10 @@ export function LiveChat({ System.ProfileLoader.TrackMetadata(pubkeys); return () => System.ProfileLoader.UntrackMetadata(pubkeys); }, [feed.zaps]); - const mutedPubkeys = useMemo(() => { return new Set(getTagValues(login?.muted.tags ?? [], "p")); }, [login]); + const hostMutedPubkeys = useMutedPubkeys(host); const userEmojiPacks = login?.emojis ?? []; const channelEmojiPacks = useEmoji(host); const allEmojiPacks = useMemo(() => { @@ -131,8 +132,10 @@ export function LiveChat({ } }, [ev]); const filteredEvents = useMemo(() => { - return events.filter((e) => !mutedPubkeys.has(e.pubkey)); - }, [events, mutedPubkeys]); + return events.filter( + (e) => !mutedPubkeys.has(e.pubkey) && !hostMutedPubkeys.has(e.pubkey) + ); + }, [events, mutedPubkeys, hostMutedPubkeys]); return (
diff --git a/src/element/mute-button.tsx b/src/element/mute-button.tsx index 15691fc..b008813 100644 --- a/src/element/mute-button.tsx +++ b/src/element/mute-button.tsx @@ -47,7 +47,7 @@ export function LoggedInMuteButton({ pubkey }: { pubkey: string }) { isMuted ? unmute() : mute()} + onClick={() => (isMuted ? unmute() : mute())} > {isMuted ? "Unmute" : "Mute"} diff --git a/src/hooks/lists.ts b/src/hooks/lists.ts new file mode 100644 index 0000000..3316cae --- /dev/null +++ b/src/hooks/lists.ts @@ -0,0 +1,29 @@ +import { useMemo } from "react"; + +import { RequestBuilder, ReplaceableNoteStore } from "@snort/system"; +import { useRequestBuilder } from "@snort/system-react"; + +import { MUTED } from "const"; +import { getTagValues } from "utils"; +import { System } from "index"; + +export function useMutedPubkeys(host?: string, leaveOpen = false) { + const mutedSub = useMemo(() => { + if (!host) return null; + const rb = new RequestBuilder(`muted:${host}`); + rb.withOptions({ leaveOpen }); + rb.withFilter().kinds([MUTED]).authors([host]); + return rb; + }, [host]); + + const { data: muted } = useRequestBuilder( + System, + ReplaceableNoteStore, + mutedSub + ); + const mutedPubkeys = useMemo(() => { + return new Set(getTagValues(muted?.tags ?? [], "p")); + }, [muted]); + + return mutedPubkeys; +}