Add setting to hide unread activity dot indicators#2923
Conversation
|
I have read the CLA Document and I hereby sign the CLA 1 out of 2 committers have signed the CLA. |
|
I have read the CLA Document and I hereby sign the CLA |
|
recheck |
|
Here's a netlify link, if you wanted to test: |
Rooms with unread activity but no notification count (muted rooms, push-rule-downgraded rooms) showed a small grey dot in the room list and kept appearing in the collapsed "unread only" nav section even though nothing actually needed attention. This adds a "Hide Unread Activity Dots" toggle (off by default) under Settings › Notifications › System with three coordinated effects: 1. UnreadBadge: when the setting is on, skip rendering the dot entirely for rooms where count=0 and highlight=false. 2. Nav collapse filter (Direct, Home, Space): reads the same setting reactively — when on, the collapsed category shows only rooms with total>0 or highlight>0; when off, it reverts to the original behaviour of showing all rooms that have any unread activity. Toggling the setting in Settings updates the nav instantly without a page reload. 3. Settings UI: adds the toggle under Settings › Notifications › System.
|
Uhm, maybe I'm misunderstanding the purpose of this PR, but your "After" screenshot just seems to hide all the rooms that had this Unread Indicator |
|
@CrazyNicc thx for answering so quickly! Yes that's exactly the point. A lot of irrelevant events trigger that unread marker and I think it makes sense to hide them for some users who get a lot of messages 🙈 Also it is shown when the room is muted I think and probably in other scenarios. There are also a lot of bugs that are related to them. |
|
@chagai95 Oh, afaik muting the room also removed all the read indicators.
But your screenshot completely hides the rooms themselves, not just the unread markers of these rooms. Or did I miss something? |
It hides them from the unread view, when the section is closed (arrow not down), maybe muting the room helps with that, didn't check but I don't want to start muting all my rooms just to avoid seeing this, on fluffy chat it's not shown by default in the unread tab. |
|
Hi everyone, just wondering if there is something missing here? |
|
See the notice in the Project README:
|
…message" Replying to a voice note (m.audio .ogg, e.g. a bridged WhatsApp "Voice message.ogg") — or any media without a text body — rendered the quoted preview as "Failed to load message" even though the replied-to event loaded fine. Root cause: Reply.tsx only used the event's `body`. When `body` was missing/empty (or was only the stripped reply-quote), it fell through to the generic MessageFailedContent fallback, which reads "Failed to load message". Fix: when a loaded reply target has no usable text body, derive a msgtype-based preview (🎤 Voice message / 🔊 Audio / 🖼️ Image / 🎬 Video / 📄 File / 📍 Location) instead of the failure fallback. Voice notes are detected via the MSC3245/MSC1767 voice extension on m.audio. Only genuinely un-renderable events (redacted → deleted notice; unknown/no content → failure) still hit the fallbacks. General across all media msgtypes, not a voice-only band-aid. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPNRaVnHM9hmpwYyewbeVj
…e estimates The emoji board virtualizes at the group level but used a flat estimateSize of 40px per group. Before any group was measured, the virtualizer therefore believed all ~10 groups fit in the 400px viewport and eagerly mounted every group — ~1,900 emoji <button> nodes — on the very first paint, defeating the virtualization and making the popover slow to open. Estimate each group's real rendered height from its item count (48px emoji / 112px sticker buttons, ~6/3 per row + group chrome) so only the groups that actually fit the viewport mount on open (~700 nodes now, dominated by the first "People" category), and drop overscan 2 -> 1 so an off-screen 500+ item category isn't eagerly built. Scroll/search, categories, recents and custom emoji/stickers are unchanged.
…guage setting
Add an in-app, client-side transcription action for voice/audio messages
(m.audio / m.voice). A microphone button next to the audio player opens an
app-only popover that requests a transcript from the local Whisper backend
(POST /transcribe with { room_id, event_id, mxc, language? }) and shows the
returned text plus the detected language, with copy-to-clipboard. The
transcript is cached in component state and is NEVER posted to the chat or
forwarded anywhere — it is a purely client-side overlay. Transcript text is
rendered strictly as text (untrusted content).
Adds a per-user default transcription language setting (General settings) and
optional backend URL/secret overrides. The API base and shared secret are
configurable via Vite env vars VITE_TRANSCRIBE_API_BASE and
VITE_TRANSCRIBE_API_SECRET (with settings overrides taking precedence), so the
endpoint can be re-pointed without a code change; no secret is hardcoded.
New files live under src/app/features/transcription/ to avoid overlap with the
parallel in-app translation feature. Shared files touched additively:
settings.ts (new fields), RenderMessageContent/AudioContent (thread roomId/
eventId to the button), General.tsx (settings section), RoomTimeline.tsx (pass
identifiers at the two message render sites).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add per-message translate button + auto-translate-all toggle to Cinny, backed by Chagai's on-box argos/"Libre" translation API (offline, no cloud translator). New self-contained `translation` feature (kept separate from the voice-note transcription UI to minimize merge conflicts): - Per-message "Translate" trigger under each text message with a language picker; shows the translation inline. Result cached per event+target. - Global "auto-translate everywhere into <lang>" toggle + language in a new Settings > Translation page; per-chat override in room settings General. - Settings persist in Matrix account data (`in.cinny.translation`) so they sync across devices; room override beats the global setting. - Backend URL + shared token read from public/config.json (ClientConfig.translation); feature hides itself when unconfigured. - Message text is only translated, never interpreted (injection-safe). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPNRaVnHM9hmpwYyewbeVj
…lback to Settings) Ship the on-box transcription API base+secret in public/config.json (mirrors the translation block) so the 🎤 transcribe button works out of the box on the static Netlify site. TranscribeButton falls back to config.json when the per-user Settings overrides are empty (precedence: Settings > config.json > built-in default). Also fill the translation token in config.json. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPNRaVnHM9hmpwYyewbeVj
The idea is to get rid of showing those type of unread rooms and keep only the ones with the number which are a lot more reliable and important.
This is how it looks before:

and this is after:
