feat(threads): implement thread side panel with full functionality#123
Merged
Just-Insane merged 10 commits intoSableClient:devfrom Mar 14, 2026
Merged
feat(threads): implement thread side panel with full functionality#123Just-Insane merged 10 commits intoSableClient:devfrom
Just-Insane merged 10 commits intoSableClient:devfrom
Conversation
bc59926 to
fe82ee7
Compare
Contributor
Author
|
Also Fixes #124 - Use the SDK's notification options, will properly respect user's notification settings. |
fa71c0a to
1d65bfa
Compare
Member
|
A few issues I found, not sure which ones overlap with #124 :
Also, maybe we should align the editor at the bottom with the main editor? Looks a bit weird having it lower down. |
Contributor
Author
These should all be fixed now, if you want to test? |
b0cad0d to
54c7f24
Compare
Just-Insane
pushed a commit
to Just-Insane/Sable
that referenced
this pull request
Mar 13, 2026
# Conflicts: # src/app/features/room/Room.tsx # src/app/features/room/RoomInput.tsx
80879cc to
cd4cc56
Compare
1309db6 to
0d4026d
Compare
github-merge-queue bot
pushed a commit
that referenced
this pull request
Mar 14, 2026
feat(threads): implement thread side panel with full functionality
added 8 commits
March 13, 2026 23:26
- Add roomToOpenThread atom family for tracking active thread per room - Add roomToThreadBrowser atom family for thread browser visibility - Add Thread, ThreadEvent, and NotificationCountType exports to matrix-sdk types - Update toggleReaction to support thread timeline sets - Foundation for thread feature state management
ThreadDrawer: - Side panel for viewing and replying within threads - Full message rendering with reactions, edits, deletions, replies - Auto-scrolls to bottom on new replies - Marks thread as read when viewing - Isolated draft state per thread - Emoji picker and sticker support ThreadBrowser: - List view of all threads in room sorted by latest activity - Search functionality to filter threads by content - Thread preview with root message, reply count, and latest reply - Click to open thread in drawer - Jump button to navigate to root message in main timeline Both: - Desktop: side panel mode - Mobile: full-screen overlay mode - Re-render on ThreadEvent updates
RoomTimeline: - Add ThreadReplyChip component showing reply count, avatars, latest reply preview - Filter thread replies from main timeline (keep only root messages) - Add thread button to start threads from messages - Exclude thread events from triggering timeline pagination - Re-render on ThreadEvent updates for live reply counts - Thread reply counts exclude root message, reactions, and edits RoomViewHeader: - Add thread button with unread badge using SDK notification APIs - Initialize Thread objects from room history on mount - Scan timeline for thread roots and thread replies - Auto-create Thread objects for new thread events - Toggle between thread drawer and thread browser - Close drawer and open browser when clicking button with drawer open Room: - Render ThreadDrawer when thread is open (desktop: side panel, mobile: overlay) - Render ThreadBrowser when browser open and no thread active - Auto-open thread drawer when navigating to thread event IDs - Coordinate openThreadId and threadBrowserOpen state RoomViewFollowing: - Support filtering read receipts by thread participant IDs - Show thread-specific following indicator
RoomInput: - Seed thread reply draft when opening drawer from notification - Handle thread relation in message composition - Support isolated draft state per thread - Auto-populate replyTo when replying in thread - Send messages with thread relation metadata - Clear thread draft after sending reply
Editor: - Fix Slate initialValue per-instance to support multiple editors - Each editor (main timeline, thread drawer) maintains independent state - Prevents value conflicts between simultaneous editors Thread Mockup: - Add ThreadMockupPage for development and design testing - Full mockup UI with realistic thread interactions - Navigation from WelcomePage for easy access - Routes added for /mockup/threads path Quality Tooling: - Add check-quality.sh script for pre-push validation - Runs type checks, lint, and builds before pushing - Helps catch issues before CI/CD CI/CD: - Update GitHub Actions workflows for quality checks - Update dependabot and cloudflare preview workflows - Update docker-publish workflow - Update require-changeset workflow Call Preferences: - Clean up unused imports in CallControls.tsx - Remove orphaned callPreferences hook code Changesets: - Add feat-threads.md for minor version bump - Remove fix_call_preferences.md (superseded)
- Remove src/app/features/thread-mockup/ directory and all mockup references - Remove scripts/check-quality.sh - Restore CallControls.tsx to origin/dev (removed unrelated changes) - Verified RoomInput.tsx and RoomTimeline.tsx contain only thread-related changes
da3c371 to
dfcefe0
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Matrix thread support with side panels, browser, and notification integration.
Features
Implementation Details
room.createThread(),room.getThreads())thread.getEventReadUpTo()andthread.hasCurrentUserParticipatedRelated
Future enhancement tracked in #124 to leverage SDK's thread-specific notification APIs (getThreadUnreadNotificationCount(),hasThreadUnreadNotification()).