-
Notifications
You must be signed in to change notification settings - Fork 68
feat: support more emoji note reactions #5379
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
🐙 Octomind❌ Failed: 9/14
✅ Passed: 5/14
commit sha: 967fe1c |
|
the emoji picker component uses https://cdn.jsdelivr.net to lazily fetch all the emojis, so we probably need to ask someone about GDPR compliance (or locally add all the emojis, see |
Add [email protected] for comprehensive emoji selection support
- Change ReactionType from union type to string for flexibility - Add LEGACY_REACTION_EMOJI_MAP with unified Unicode codes - Add utility functions getEmojiDisplay() and reactionSupportsSkinTone() - Define QUICK_REACTIONS for reaction bar (limited to 5 for space) - Maintain backward compatibility with existing reactions
- Create EmojiPickerReactionBar with portal-based rendering - Support quick reactions (5 legacy emojis) plus full emoji picker - Implement proper event handling to prevent modal conflicts - Add keyboard navigation support (Enter/Escape) - Use ReactFocusLock for accessibility - Position picker dynamically relative to trigger button
- Replace NoteReactionBar with EmojiPickerReactionBar component - Update click-outside handler to recognize emoji picker portal - Modify NoteReactionBar to disable interaction when board locked - Update tests to reflect component interface changes - Maintain existing reaction functionality while adding emoji picker
- Update NoteReactionChip to use Emoji component for legacy reactions - Update NoteReactionChipCondensed with consistent emoji rendering - Update NoteReactionPopup to use unified emoji display - Maintain size consistency across components (14px, 16px, 18px) - Support both legacy reactions and new unicode emojis - Remove unused imports and clean up code
- Add showBoardReactions selector from view state - Hide reaction system when showBoardReactions is disabled - Ensure setting properly controls reaction visibility
- Remove SkinToneSelector component from appearance settings - Remove unused import for SkinToneSelector - Skin tone selection is no longer needed since emoji picker has skin tones disabled - Simplify appearance settings interface
- Implement intelligent positioning that shows picker above button when near viewport bottom - Add viewport boundary detection to ensure picker is always fully visible - Calculate optimal horizontal positioning to prevent overflow - Include buffer zones for comfortable spacing from viewport edges - Automatically adjust position based on available space
- Add theme detection from app state to EmojiPickerReactionBar - Pass current theme (light/dark/auto) to emoji-picker-react library - Create type-safe theme conversion between app and library types - Ensure emoji picker automatically adapts to user's theme preference - Maintain existing SCSS dark mode styles for wrapper components
- Fix plus icon dark mode compatibility with proper color theming - Improve plus icon alignment with better positioning and padding - Replace static quick reactions with recently used emojis system - Add localStorage-based recent emojis tracking (max 5 emojis) - Automatically track new emoji usage and update quick selection - Fall back to legacy reactions when no recent emojis available - Maintain backward compatibility with existing reaction system
Remove unused index parameter to satisfy eslint max-warnings 0 requirement
- Replace old NoteReactionBar with EmojiPickerReactionBar in tests - Add emoji-picker-react mocks to avoid test environment issues - Update test expectations to match new component behavior - Remove unused imports and simplify test cases - All tests now pass successfully
- Update Appearance snapshots to reflect SkinToneSelector restoration - Update Column snapshots for component structure changes - All snapshot tests now pass successfully
Switch emoji picker components to use EmojiStyle.NATIVE to prevent loading emoji PNG files from external CDN. This ensures emojis are rendered using the system's native emoji font instead of downloading images from emoji-picker-react's default CDN.
0d15d64 to
c4c6a7e
Compare
|
I refactored the emoji picker components to native emoji style. This means, there is no more client side communication to jsdelivr! |
- Replace complex LEGACY_REACTION_EMOJI_MAP with clean DEFAULT_EMOJIS array - Add buildQuickReactions utility function for cleaner logic - Introduce PERMANENT_EMOJIS and FALLBACK_EMOJIS constants - Add utility functions: isDefaultEmoji, getEmojiDisplay, getDefaultEmojiData - Maintain backwards compatibility with deprecated LEGACY_REACTION_EMOJI_MAP - Improve code readability and maintainability
- Add show-more-default-light.svg and show-more-default-dark.svg - Add show-more-hover-light.svg and show-more-hover-dark.svg - Add show-more-active-light.svg and show-more-active-dark.svg - Support different states (default, hover, active) and themes (light, dark) - Icons designed for emoji picker "show more" button functionality
- Export ShowMoreDefaultLight, ShowMoreDefaultDark - Export ShowMoreHoverLight, ShowMoreHoverDark - Export ShowMoreActiveLight, ShowMoreActiveDark - Follow existing project icon architecture and naming conventions - Enable centralized icon management through components/Icon
- Create reusable icon component with automatic theme and state switching - Support default, hover, and active states through CSS - Support light and dark themes automatically via theme attribute - Use all 6 show-more SVG variants for complete state coverage - Integrate with existing emoji picker button styling system
- Replace ➕ emoji with ShowMoreEmojiesIcon component - Integrate with existing button state management and theme system - Use buildQuickReactions utility for cleaner emoji logic - Simplify component structure and improve maintainability - Remove complex inline emoji selection logic
- Update test descriptions from "plus button" to "show more button" - Change test selectors from emoji text to aria-label - Maintain test coverage for all existing functionality - Update comments to reflect new icon-based implementation
|
The deployment to the dev cluster was successful. You can find the deployment here: https://5379.development.scrumlr.fra.ics.inovex.io Deployed Images
|
Schwehn42
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| * - Maximum of 3 recent emojis | ||
| * - Permanent emojis are ignored | ||
| */ | ||
| export const addRecentEmoji = createAsyncThunk<EmojiData[], EmojiData>("recentEmojis/addRecentEmoji", async (emojiData, {getState}) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| export const addRecentEmoji = createAsyncThunk<EmojiData[], EmojiData>("recentEmojis/addRecentEmoji", async (emojiData, {getState}) => { | |
| export const addRecentEmoji = createAsyncThunk<EmojiData[], EmojiData, {state: ApplicationState}>("recentEmojis/addRecentEmoji", async (emojiData, {getState}) => { |
this enables getState to be typed, so we can drop the as any casts
| if (element && lang !== "en") { | ||
| let i18nPromise; | ||
| if (lang === "de") { | ||
| i18nPromise = import("emoji-picker-element/i18n/de"); | ||
| } else if (lang === "fr") { | ||
| i18nPromise = import("emoji-picker-element/i18n/fr"); | ||
| } | ||
|
|
||
| if (i18nPromise) { | ||
| i18nPromise | ||
| .then((module) => { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| (element as any).i18n = module.default; | ||
| }) | ||
| .catch(() => { | ||
| // Fallback to English if translation is missing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this part looks a bit odd, is it just for on the fly language change?
| handleClickReaction: (e: React.MouseEvent<HTMLButtonElement>, emoji: string) => void; | ||
| } | ||
|
|
||
| const getPickerPosition = (buttonRect: DOMRect) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it think this should be updated dynamically when the screen size changes

Closes #4168
Description
Enhanced the emoji reaction system by replacing the limited 7-emoji selection with a full emoji picker supporting hundreds of emojis. The system now shows your 5 most recently used emojis as quick selections, falling back to legacy reactions when none are available. Added smart positioning, dark mode support, and localStorage persistence for recent emojis while maintaining backward compatibility.
Changelog
Backend
Frontend Core
Components
Features
Fixes
Checklist
(Optional) Visual Changes
White and darkmode are supported:
Multiple skin colors are supported:
As a new user I have a quick selection of emojis:
After I already used a emoji, it will appear in the quick selection