Feature: Emoji picker in the message input toolbar #38
Labels
No labels
area:api
area:core
area:docs
area:infra
area:ux
dependencies
documentation
duplicate
good first issue
help wanted
invalid
question
rust
status:complete
status:partial
status:planned
type:bug
type:design
type:feature
type:infra
type:refactor
type:research
type:ux
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
icub3d/decentcom#38
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Migrated from GitHub issue icub3d/decentcom#45
Original Author: @icub3d
Original Date: 2026-04-15T21:59:45Z
Feature: Emoji picker in the message input toolbar
Overview
Add an emoji picker button to the message input area that opens a popover grid of emojis grouped by category. Clicking an emoji inserts it at the current cursor position in the textarea. The toolbar is designed to be extensible — the emoji picker is the first item, but the structure should accommodate future additions (file attachments, formatting, etc.).
Background
MessageInput(client/src/components/layout/MessageInput.tsx) currently renders only a textarea and a Send button. There is no way to browse or insert emojis other than using the OS emoji keyboard. Adding an in-app picker improves discoverability and keeps the experience consistent across platforms (especially important in Tauri where OS shortcuts vary). The component is deliberately simple today, making it a good candidate for a toolbar extension.Requirements
Design
API / Interface Changes
None — emoji insertion is entirely client-side.
Data Model Changes
None.
Component Changes
client/src/data/emojis.ts(new) — static emoji data: a typed array of{ emoji: string; label: string; category: string }entries covering common emojis across 8 categories. No external library needed for MVP.client/src/components/emoji/EmojiPicker.tsx(new) — popover component:onSelect(emoji: string): void,onClose(): voidmousedownandkeydownEscape (same listener pattern asMemberContextMenu/ServerSidebar).client/src/components/layout/MessageInput.tsx(modified) — changes:useRefon the<textarea>to read and restore cursor position.valueat the saved cursor offset, update state, restore focus and cursor position.Cursor Insertion Detail
Task List
client/src/data/emojis.tswith a curated static emoji list grouped by category (~200–300 emojis across 8 categories).client/src/components/emoji/EmojiPicker.tsxwith category tabs, scrollable emoji grid, outside-click and Escape close logic.useRefto the textarea inMessageInput.tsxand implementinsertAtCursor.MessageInput.tsx; wire open/close state andonSelecthandler.Test List
EmojiPickerrenders category tabs and emoji buttons.onSelectwith the correct emoji string.onClose.mousedowncallsonClose.MessageInput— clicking the emoji button opens the picker.MessageInput— selecting an emoji appends it to the textarea value.MessageInput— emoji button is absent / disabled whendisabled=true.Open Questions