import {Fragment} from 'react'; import {useTheme} from '@emotion/react'; import styled from '@emotion/styled'; import Avatar from 'sentry/components/avatar'; import AvatarList from 'sentry/components/avatar/avatarList'; import TeamAvatar from 'sentry/components/avatar/teamAvatar'; import {Button} from 'sentry/components/button'; import {DateTime} from 'sentry/components/dateTime'; import {Overlay, PositionWrapper} from 'sentry/components/overlay'; import {t, tn} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Team} from 'sentry/types/organization'; import type {AvatarUser, User} from 'sentry/types/user'; import {userDisplayName} from 'sentry/utils/formatters'; import useOverlay from 'sentry/utils/useOverlay'; interface DropdownListProps { users: User[]; teams?: Team[]; } export default function ParticipantList({users, teams}: DropdownListProps) { const {overlayProps, isOpen, triggerProps} = useOverlay({ position: 'bottom-start', shouldCloseOnBlur: true, isKeyboardDismissDisabled: false, }); const theme = useTheme(); const showHeaders = users.length > 0 && teams && teams.length > 0; return (
{isOpen && ( {showHeaders && teams && teams.length > 0 && ( {t('Teams (%s)', teams.length)} )} {teams?.map(team => (
{`#${team.slug}`} {tn('%s member', '%s members', team.memberCount)}
))} {showHeaders && ( {t('Individuals (%s)', users.length)} )} {users.map(user => (
{user.name}
{user.email !== user.name ? ( {user.email} ) : null}
))}
)}
); } const StyledOverlay = styled(Overlay)` display: flex; flex-direction: column; `; const ParticipantListWrapper = styled('div')` max-height: 325px; overflow-y: auto; border-radius: ${p => p.theme.borderRadius}; color: ${p => p.theme.textColor}; & > div:not(:last-child) { border-bottom: 1px solid ${p => p.theme.border}; } `; const ListTitle = styled('div')` display: flex; align-items: center; padding: ${space(1)} ${space(1.5)}; background-color: ${p => p.theme.backgroundSecondary}; color: ${p => p.theme.gray300}; text-transform: uppercase; font-weight: ${p => p.theme.fontWeightBold}; font-size: ${p => p.theme.fontSizeSmall}; `; const UserRow = styled('div')` display: flex; align-items: center; padding: ${space(1)} ${space(1.5)}; gap: ${space(1)}; line-height: 1.2; font-size: ${p => p.theme.fontSizeSmall}; min-height: 45px; `; const NameWrapper = styled('div')` & > div:only-child { margin-top: ${space(0.25)}; } `; const SmallText = styled('div')` font-size: ${p => p.theme.fontSizeExtraSmall}; `; const StyledAvatarList = styled(AvatarList)` justify-content: flex-end; padding-left: ${space(0.75)}; `; const LastSeen = styled(DateTime)` color: ${p => p.theme.subText}; font-size: ${p => p.theme.fontSizeExtraSmall}; `;