import { OnlineUser } from '@/features/ide-react/context/online-users-context' import { Dropdown, DropdownHeader, DropdownItem, DropdownMenu, DropdownToggle, } from '@/features/ui/components/bootstrap-5/dropdown-menu' import OLTooltip from '@/features/ui/components/ol/ol-tooltip' import { getBackgroundColorForUserId, hslStringToLuminance, } from '@/shared/utils/colors' import classNames from 'classnames' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' // Should be kept in sync with $max-user-circles-displayed CSS constant const MAX_USER_CIRCLES_DISPLAYED = 5 // We don't want a +1 circle since we could just show the user instead const MAX_USERS_WITH_OVERFLOW_VISIBLE = MAX_USER_CIRCLES_DISPLAYED - 1 export const OnlineUsersWidget = ({ onlineUsers, goToUser, }: { onlineUsers: OnlineUser[] goToUser: (user: OnlineUser) => void }) => { const hasOverflow = onlineUsers.length > MAX_USER_CIRCLES_DISPLAYED const usersBeforeOverflow = useMemo( () => hasOverflow ? onlineUsers.slice(0, MAX_USERS_WITH_OVERFLOW_VISIBLE) : onlineUsers, [onlineUsers, hasOverflow] ) const usersInOverflow = useMemo( () => hasOverflow ? onlineUsers.slice(MAX_USERS_WITH_OVERFLOW_VISIBLE) : [], [onlineUsers, hasOverflow] ) return (
{usersBeforeOverflow.map((user, index) => ( ))} {hasOverflow && ( )}
) } const OnlineUserWidget = ({ user, goToUser, id, }: { user: OnlineUser goToUser: (user: OnlineUser) => void id: string }) => { const onClick = useCallback(() => { goToUser(user) }, [goToUser, user]) return ( ) } const OnlineUserCircle = ({ user }: { user: OnlineUser }) => { const backgroundColor = getBackgroundColorForUserId(user.user_id) const luminance = hslStringToLuminance(backgroundColor) const [character] = [...user.name] return ( = 0.5, })} style={{ backgroundColor }} > {character} ) } const OnlineUserOverflow = ({ goToUser, users, }: { goToUser: (user: OnlineUser) => void users: OnlineUser[] }) => { const { t } = useTranslation() return ( +{users.length} {users.map((user, index) => (
  • goToUser(user)} > {user.name}
  • ))}
    ) }