From aa3e464b3510fddc711509c1c2f88e0ab9d4d3bb Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 8 Sep 2026 02:45:55 +0800 Subject: [PATCH] feat(web): emoji picker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plain system-emoji grid (README §3.3's mockup itself has no custom emoji asset list, just gray placeholder tiles captioned "use system emoji or a branded pack" -- matches the old app's own reasoning, no WeChat/QQ-style sticker art available). Recent-emoji tab persists via localStorage, capped at 30, same as the old app's send-message.jsx. Co-Authored-By: Claude Sonnet 5 --- .../features/messages/ConversationView.tsx | 22 +++++- web/src/features/messages/EmojiPanel.tsx | 74 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 web/src/features/messages/EmojiPanel.tsx diff --git a/web/src/features/messages/ConversationView.tsx b/web/src/features/messages/ConversationView.tsx index b637c4fd..481ddf1d 100644 --- a/web/src/features/messages/ConversationView.tsx +++ b/web/src/features/messages/ConversationView.tsx @@ -5,6 +5,7 @@ import type { StoredMessage } from 'tinode-sdk'; import { Drafty } from 'tinode-sdk'; import { Icon } from '@/app/Icon'; +import { EmojiPanel } from '@/features/messages/EmojiPanel'; import { ForwardPickerModal } from '@/features/messages/ForwardPickerModal'; import { MessageContextMenu } from '@/features/messages/MessageContextMenu'; import { MessageRow } from '@/features/messages/MessageBubble'; @@ -46,6 +47,7 @@ export function ConversationView() { const [loadingOlder, setLoadingOlder] = useState(false); const [replyTo, setReplyTo] = useState(null); const [forwardMsg, setForwardMsg] = useState(null); + const [emojiOpen, setEmojiOpen] = useState(false); const streamRef = useRef(null); const autoScrollRef = useRef(true); @@ -288,8 +290,24 @@ export function ConversationView() { ) : null} -
- +
+ + {emojiOpen ? ( +
+ { + setDraft((d) => d + emoji); + setEmojiOpen(false); + }} + /> +
+ ) : null}