Emoji reaction detail views (desktop popover + mobile bottom sheet)#416
Merged
Conversation
Replace plain text Tooltip on reaction pills with a Popover that shows: - The emoji large at the top with reaction count - A scrollable list of reactors with avatar + display name (capped at 10) - "+N more" overflow indicator when > 10 reactors - "Click to remove your reaction" hint when current user has reacted The popover opens on hover with a 200ms delay and closes on mouse leave with a 150ms grace period (so users can move into the popover). Clicking the pill still toggles the reaction as before. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the plain-text reaction tooltip with a Popover that shows the emoji, a list of reactor avatars + display names, and a "click to remove" hint. Hover-open with 200ms delay, smooth transition between trigger and content. Data was already available in TimelineReaction — this commit threads avatarUrl through from the profile lookup. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract shared ReactionRow widget into reaction_row.dart with: - onLongPress handler that opens a modal bottom sheet - Emoji header with shortcode name (e.g., 👀) - Emoji filter chips when multiple reaction types exist - Scrollable list of reactors with avatar, display name, and about text - Profile resolution via userCacheProvider with batch preloading - Graceful fallback to pubkey prefix when profile is unavailable Both channel_detail_page.dart and thread_detail_page.dart now use the shared ReactionRow widget, eliminating the duplicated _ReactionRow private classes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wrap button in span so hover/focus fires even when disabled (BLOCK #1) - Add isNotEmpty/length guards on pubkey indexing in reaction_row (CHANGE #3) - Add keyboard focus/blur handlers to open popover (CHANGE #4) - Move useCallback hooks before early return to satisfy rules of hooks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Desktop: - Merge identical handleMouseLeave/handleBlur into single scheduleClose Mobile: - Extract SmallAvatar to shared small_avatar.dart - Move shortPubkey and formatMessageTime to date_formatters.dart - Remove duplicated _showThreadMessageActions in favor of shared showMessageActions - Remove unused import and stale comments Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ListView in the reaction bottom sheet wasn't accounting for the device safe area inset, causing content to sit behind the home indicator. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collaborator
Author
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
userCacheProvider.preload(). SharedReactionRowwidget extracted from both channel and thread detail pages.SmallAvatar,shortPubkey,formatMessageTime, and thread message actions across mobile pages. Merged identicalhandleMouseLeave/handleBlurintoscheduleCloseon desktop.Follow-up
Test plan
flutter analyze— no issuesflutter test— 98/98 passingtsc --noEmit— cleanbiome check— clean🤖 Generated with Claude Code