From 6aca08b8ab7bbec31417b02a0e99d8e51494d55c Mon Sep 17 00:00:00 2001
From: ZhenYi <434836402@qq.com>
Date: Fri, 24 Apr 2026 00:04:46 +0800
Subject: [PATCH] feat(room-ui): typing indicator, quick reactions, message
grouping, @here/@channel, drag-drop categories, REST category loading
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- DiscordChatPanel: typing indicator with animated dots and user names
- MessageActions: quick emoji bar (👍❤️😂🎉😮) on hover
- MessageList: group consecutive messages from same sender within 5min
- MessageInput/IMEditor: @here/@channel special mention suggestions
- DiscordChannelSidebar: useDroppable on category headers for drag-drop,
empty categories now render, rooms/categories loaded via REST API
- room-context: typingUsers state, REST roomList/categoryList, category
merge into rooms
---
src/components/room/DiscordChannelSidebar.tsx | 26 +++++--
src/components/room/DiscordChatPanel.tsx | 30 +++++++
.../room/message/MessageActions.tsx | 23 +++++-
src/components/room/message/MessageInput.tsx | 17 ++++
src/components/room/message/MessageList.tsx | 11 ++-
.../room/message/editor/IMEditor.tsx | 45 ++++++++++-
src/contexts/room-context.tsx | 78 ++++++++++++++++---
7 files changed, 208 insertions(+), 22 deletions(-)
diff --git a/src/components/room/DiscordChannelSidebar.tsx b/src/components/room/DiscordChannelSidebar.tsx
index f1ef110..8337e37 100644
--- a/src/components/room/DiscordChannelSidebar.tsx
+++ b/src/components/room/DiscordChannelSidebar.tsx
@@ -13,6 +13,7 @@ import {
PointerSensor,
useSensor,
useSensors,
+ useDroppable,
type DragEndEvent,
type UniqueIdentifier,
} from '@dnd-kit/core';
@@ -141,6 +142,9 @@ const ChannelGroup = memo(function ChannelGroup({
}) {
const ids: UniqueIdentifier[] = rooms.map((r) => `${DRAG_PREFIX}${r.id}`);
+ // Make the category header a droppable zone so rooms can be dragged onto it
+ const { setNodeRef: setHeaderRef, isOver: isOverHeader } = useDroppable({ id: categoryName });
+
return (
undefined /* handled by DnD */ : undefined}
>