mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-11 16:57:39 +00:00
NIP-51's kind:10000 mute list defines four entry types — `p` (pubkeys), `word`, `e` (threads) and `t` (hashtags). Quartz parsed only the first three, so `t` hashtag mutes written by other clients were silently dropped: uncounted, invisible, and never applied to filtering. Quartz: - Add HashtagTag (`"t"`) implementing the MuteTag sealed interface, and register it in MuteTag.parse/isTagged so it round-trips like the other entry types. - Add mutedHashtags()/mutedHashtagIds() TagArray helpers. Filtering (commons): - Add hiddenHashtags to LiveHiddenUsers plus isHashtagHidden(), and hide notes carrying a muted hashtag in Note.isHiddenFor() (exact, case- insensitive `t`-tag match — distinct from the existing substring word scan). Amethyst: - Aggregate HashtagTag entries from the mute/block lists in HiddenUsersState. - MuteListState.hideHashtag/showHashtag + Account and AccountViewModel wrappers, and observeUserIsMutingHashtag. - Surface a Mute/Unmute hashtag action in the hashtag screen's options overflow menu. Tests: HashtagTagTest (parse/round-trip/MuteTag dispatch) and NoteIsHiddenForTest cases for muted-hashtag hiding. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017giudm3gXumsxZmd3uMQc8