import React, { useEffect, useMemo } from 'react'; import { useSocialStore } from '../../stores/socialStore'; import { useUIStore } from '../../stores/uiStore'; import { Avatar } from '../ui/Avatar'; import { Username } from '../ui/Username'; import type { Friend } from '@backspace/shared'; import { parseFederatedUsername } from '../../utils/identity'; export function ActivityPanel() { const friends = useSocialStore((s) => s.friends); const loadFriends = useSocialStore((s) => s.loadFriends); const memberListOpen = useUIStore((s) => s.memberListOpen); const openUserProfile = useUIStore((s) => s.openUserProfile); useEffect(() => { loadFriends(); }, [loadFriends]); const { onlineFriends, offlineFriends } = useMemo(() => { const online = friends.filter(f => f.status !== 'offline'); const offline = friends.filter(f => f.status === 'offline'); return { onlineFriends: online, offlineFriends: offline }; }, [friends]); if (!memberListOpen) return null; const handleFriendClick = (e: React.MouseEvent, friend: Friend) => { e.stopPropagation(); const rect = e.currentTarget.getBoundingClientRect(); openUserProfile( { id: friend.id, username: friend.username, displayName: friend.displayName, avatar: friend.avatar, banner: friend.banner, accentColor: friend.accentColor, avatarColor: friend.avatarColor, bio: friend.bio, status: friend.status, customStatus: friend.customStatus, createdAt: friend.createdAt, homeUserId: friend.homeUserId, homeInstance: friend.homeInstance, isAdmin: false, replicatedInstances: [], }, { top: Math.min(rect.top, window.innerHeight - 450), left: rect.left - 316, } ); }; const renderFriend = (friend: Friend, isOffline = false) => { const { baseName, domain } = parseFederatedUsername(friend.username); const friendDisplayName = friend.displayName ?? baseName; return (