From 1b99f65d07530a8f019a6292024cfde7984fad36 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Sun, 10 May 2026 20:40:31 +0200 Subject: [PATCH] =?UTF-8?q?feat(ui):=20WelcomeHeader=20polish=20=E2=80=94?= =?UTF-8?q?=20AvatarStack,=20Owner=20label,=20Open=20Group=20Settings,=20L?= =?UTF-8?q?eave=20hover=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/src/components/chat/MessageList.tsx | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/packages/web/src/components/chat/MessageList.tsx b/packages/web/src/components/chat/MessageList.tsx index 7da172d0..c709fb75 100644 --- a/packages/web/src/components/chat/MessageList.tsx +++ b/packages/web/src/components/chat/MessageList.tsx @@ -14,6 +14,8 @@ import { type PendingBubble, } from '../../stores/pendingMessageStore'; import { Avatar } from '../ui/Avatar'; +import { AvatarStack } from '../ui/AvatarStack'; +import { useUIStore } from '../../stores/uiStore'; import { hasPermissionBit, PermissionBits } from '../../utils/permissions'; import { isSelf, parseFederatedUsername } from '../../utils/identity'; import { useDelayedLoading } from '../../hooks/useDelayedLoading'; @@ -757,6 +759,8 @@ function WelcomeHeader({ channelId }: { channelId: string }) { const authUser = useAuthStore((s) => s.user); const removeFriend = useSocialStore((s) => s.removeFriend); const friends = useSocialStore((s) => s.friends); + const openUserProfile = useUIStore((s) => s.openUserProfile); + const openModal = useUIStore((s) => s.openModal); const isDm = isDmChannel(channelId); const navigate = useNavigate(); @@ -767,7 +771,7 @@ function WelcomeHeader({ channelId }: { channelId: string }) { const isGroupDm = !!dm.ownerId; if (isGroupDm) { - const groupName = otherMembers + const groupName = dm.name ?? otherMembers .map(m => m.displayName ?? (m.username?.includes('@') ? m.username.split('@')[0] : m.username)) .join(', '); const ownerMember = dm.members.find(m => m.id === dm.ownerId); @@ -783,41 +787,57 @@ function WelcomeHeader({ channelId }: { channelId: string }) { } }; + const handleOpenSettings = () => { + openModal('groupDmSettings', { dmChannelId: channelId, initialTab: 'overview' }); + }; + + const handleOwnerClick = (e: React.MouseEvent) => { + if (!ownerMember) return; + const rect = e.currentTarget.getBoundingClientRect(); + openUserProfile(ownerMember, { + top: Math.min(rect.bottom + 8, window.innerHeight - 450), + left: rect.left, + }); + }; + return (
-
- {otherMembers.slice(0, 2).map((m, idx) => ( -
- -
- ))} +
+

{groupName}

This is the beginning of your group conversation.

- Group created by @{ownerName} + Owner:{' '} + {ownerMember ? ( + + ) : ( + @{ownerName} + )}

{hasFederated && (

Messages are stored on your and your recipients' home instances. They are not end-to-end encrypted.

)} -
+
+