suggestedAvatarStack.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import {css} from '@emotion/react';
  2. import styled from '@emotion/styled';
  3. import ActorAvatar from 'sentry/components/avatar/actorAvatar';
  4. import BaseAvatar from 'sentry/components/avatar/baseAvatar';
  5. import {Actor} from 'sentry/types';
  6. type Props = {
  7. owners: Actor[];
  8. reverse?: boolean;
  9. } & BaseAvatar['props'] &
  10. Omit<React.ComponentProps<typeof ActorAvatar>, 'actor' | 'hasTooltip'>;
  11. // Constrain the number of visible suggestions
  12. const MAX_SUGGESTIONS = 3;
  13. function SuggestedAvatarStack({
  14. owners,
  15. tooltip,
  16. tooltipOptions,
  17. reverse = true,
  18. suggested = true,
  19. ...props
  20. }: Props) {
  21. const [firstSuggestion, ...suggestedOwners] = owners;
  22. const numAvatars = Math.min(owners.length, MAX_SUGGESTIONS);
  23. return (
  24. <AvatarStack reverse={reverse} data-test-id="suggested-avatar-stack">
  25. {suggestedOwners.slice(0, numAvatars - 1).map((owner, i) => (
  26. <Avatar
  27. round={firstSuggestion.type === 'user'}
  28. actor={owner}
  29. hasTooltip={false}
  30. {...props}
  31. key={i}
  32. index={i}
  33. reverse={reverse}
  34. suggested={suggested}
  35. />
  36. ))}
  37. <Avatar
  38. actor={firstSuggestion}
  39. tooltip={tooltip}
  40. tooltipOptions={{...tooltipOptions, skipWrapper: true}}
  41. {...props}
  42. index={numAvatars - 1}
  43. reverse={reverse}
  44. suggested={suggested}
  45. />
  46. </AvatarStack>
  47. );
  48. }
  49. const AvatarStack = styled('div')<{reverse: boolean}>`
  50. display: flex;
  51. align-content: center;
  52. ${p => p.reverse && `flex-direction: row-reverse;`}
  53. `;
  54. const translateStyles = (props: {index: number; reverse: boolean}) => css`
  55. transform: translateX(${props.reverse ? 60 * props.index : 60 * -props.index}%);
  56. `;
  57. const Avatar = styled(ActorAvatar)<{index: number; reverse: boolean}>`
  58. ${translateStyles}
  59. `;
  60. export default SuggestedAvatarStack;