Skip to content

feat: unified "Muted" column (users + threads + words)#9

Merged
DocNR merged 9 commits into
mainfrom
feat/mute-column
Jun 14, 2026
Merged

feat: unified "Muted" column (users + threads + words)#9
DocNR merged 9 commits into
mainfrom
feat/mute-column

Conversation

@DocNR

@DocNR DocNR commented Jun 14, 2026

Copy link
Copy Markdown
Owner

Summary

Adds a standing "Muted" column that puts everything you've muted in one place: muted users, muted threads, and muted words, under a <Tabs> filter (All / Users / Threads / Words). Fixes today's fragmentation, where users+threads lived on a Settings-only /mutes page and words lived in General Settings.

  • One column, per-account scoped. Users + threads come from your kind-10000 list via useMuteList() (scoped to the column's account by <AccountScope>). supportsViewAs: false — mute management is for your own account.
  • Words are global, and labeled as such. The Words tab shows your client-side muted-words list with a note: "Muted words apply to all your accounts." Same useContentPolicy() state as Settings → General, so they stay in sync.
  • Reuse, not duplication. The three row UIs were extracted into src/components/Mute/ (MutedUserItem, MutedThreadItem, MutedWordsSection); the Settings muted-words manager is now a thin wrapper over the shared section.
  • /mutes is now a column. The profile-menu "muted" link and the /mutes route spawn-or-focus a single deduped mute-list column (mirrors Bookmarks/Notifications), retiring the old MuteListPage secondary page (−177 lines).
  • Manage inline: unmute users (+ public/private toggle), unmute threads, add/remove words.

Ships as v26.13.0 with a "What's new" entry. Picker shortcut is u (m is taken by Messages).

Implementation notes

  • All 7 column-type touchpoints wired (TColumnType, dispatchBody, columnLabel, picker descriptor, migrateColumns allowlist, i18n) + the dispatch-coverage.spec.ts exhaustiveness guard.
  • UsersSection lists are reactive + sorted ([...getMutePubkeys()].sort()): populates on cold-start relay load and reflects unmutes, while the stable sort prevents rows jumping when you toggle a user public↔private.
  • Pure consumer-layer composition — no storage, wire, or migration changes.

Test plan

  • Column picker shows a "Muted" tile (shortcut u); adding it creates an account-scoped column
  • Tabs All/Users/Threads/Words filter correctly; empty states render; "All" stacks all three
  • Unmute a user / toggle public-private; unmute a thread (row vanishes); add+remove a word (reflected in Settings → General too)
  • Profile "muted" link opens/focuses the column without duplicating
  • A freshly-added Muted column populates once your mute list loads (cold-start), and survives reload
  • Arabic (Settings → Languages → العربية): tabs, headers, words note render correctly RTL

npm run build clean, 857 tests pass, lint clean.

🤖 Generated with Claude Code

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 14, 2026

Copy link
Copy Markdown

Deploying jank with  Cloudflare Pages  Cloudflare Pages

Latest commit: 53b4adc
Status: ✅  Deploy successful!
Preview URL: https://69d62389.jank-4ii.pages.dev
Branch Preview URL: https://feat-mute-column.jank-4ii.pages.dev

View logs

Address review feedback on the Muted column:
- User rows now navigate to the profile on click; thread rows open the
  thread (push(toNote)/push(toProfile), mirroring how feed cards open).
  Action controls (lock toggle, unmute) stopPropagation so they don't
  also navigate.
- Words render as full-width rows (icon + word + remove) in the column
  via a new MutedWordsSection variant='rows', so users/threads/words read
  as one consistent list. Settings keeps the compact 'chips' default.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@DocNR DocNR merged commit 930db65 into main Jun 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant