diff --git a/packages/web/src/components/layout/ChannelSidebar.tsx b/packages/web/src/components/layout/ChannelSidebar.tsx index 26b0a80c..90e2b61a 100644 --- a/packages/web/src/components/layout/ChannelSidebar.tsx +++ b/packages/web/src/components/layout/ChannelSidebar.tsx @@ -11,17 +11,14 @@ import { VoiceControls } from '../voice/VoiceControls'; import { useVoiceStore } from '../../stores/voiceStore'; import { Avatar } from '../ui/Avatar'; import { Mascot } from '../ui/Mascot'; -import { Username } from '../ui/Username'; -import { Tooltip } from '../ui/Tooltip'; import { wsSend } from '../../hooks/useWebSocket'; import { AudioManager } from '../../audio/AudioManager'; import { hasPermissionBit, PermissionBits } from '../../utils/permissions'; -import { parseFederatedUsername, isSelf } from '../../utils/identity'; -import { formatDmTimestamp, formatDmPreview } from '../../utils/dmFormatters'; import { joinVoiceChannel, broadcastVoiceStatus, broadcastDeafenViaLiveKit } from '../../utils/voice'; import { useContextMenuStore, type ContextMenuItem } from '../../stores/contextMenuStore'; import { ConfirmDialog } from '../ui/ConfirmDialog'; import { DmSearchBar } from './DmSearchBar'; +import { DmListItem } from './DmListItem'; import { useDragManager, type DropTarget, type LayoutItem } from '../../hooks/useDragManager'; import { useDelayedLoading } from '../../hooks/useDelayedLoading'; @@ -442,7 +439,7 @@ export function ChannelSidebar() {
@@ -466,7 +463,7 @@ export function ChannelSidebar() { Coming Soon
@@ -488,138 +485,25 @@ export function ChannelSidebar() {
- {dmChannels.map((dm) => { - const otherMembers = dm.members.filter(m => !isSelf(m, user)); - const isGroup = !!dm.ownerId; - if (otherMembers.length === 0 && !isGroup) return null; - const isDmUnread = unreadChannels.has(dm.id) && currentChannelId !== dm.id; - - const firstOtherDm = isGroup ? null : otherMembers[0]; - const { baseName: dmBaseName, domain: dmDomain } = parseFederatedUsername(firstOtherDm?.username ?? ''); - const dmDisplayName = isGroup - ? (otherMembers.length > 0 - ? otherMembers.map(m => m.displayName ?? parseFederatedUsername(m.username).baseName).join(', ') - : 'Empty Group') - : firstOtherDm?.displayName ?? dmBaseName; - - const dmItem = ( -
handleChannelClick(dm.id)} - className={`relative flex items-center gap-3 px-2 h-[42px] rounded-[4px] cursor-pointer transition-colors group ${ - currentChannelId === dm.id - ? 'bg-interactive-selected text-white' - : isDmUnread - ? 'text-white hover:bg-interactive-hover' - : 'text-txt-tertiary hover:bg-interactive-hover hover:text-txt-secondary' - }`} - > - {isDmUnread && ( -
- )} - {isGroup ? ( -
- {otherMembers.slice(0, 2).map((m, i) => ( -
- -
- ))} -
- ) : ( - - )} -
-
- - {dmDisplayName} - - {!isGroup && dmDomain && ( - - - - - - )} - {dm.lastMessage && ( - - {formatDmTimestamp(dm.lastMessage.createdAt)} - - )} -
- {(() => { - const preview = formatDmPreview(dm.lastMessage ?? null); - if (isGroup) { - const lastMsg = dm.lastMessage; - const senderName = (lastMsg && 'user' in lastMsg ? lastMsg.user?.displayName : undefined) - ?? dm.members.find(m => m.id === lastMsg?.userId)?.displayName - ?? 'Unknown'; - const groupPreview = preview - ? `${senderName}: ${preview}` - : `${dm.members.length} Members`; - return ( -
- {groupPreview} -
- ); - } - if (preview) { - return ( -
- {preview} -
- ); - } - return null; - })()} -
- -
- ); - - if (isGroup) { - return ( -
handleDmContextMenu(e, dm.id)}> - {dmItem} -
- ); - } - - return dmItem; - })} + {dmChannels.map((dm) => ( + { + if (currentChannelId === id) { + navigate('/channels/@me'); + setCurrentChannel(null); + } + useSpaceStore.getState().closeDm(id); + }} + onLeave={(id) => setLeaveGroupDmId(id)} + onContextMenu={handleDmContextMenu} + /> + ))} {dmChannels.length === 0 && (