// @flow strict import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import PlainButton from '../../../../components/plain-button'; import messages from './messages'; import AvatarGroupAvatar from './AvatarGroupAvatar'; import AssigneeDetails from './AssigneeDetails'; import type { TaskAssigneeCollection } from '../../../../common/types/tasks'; import type { GetAvatarUrlCallback } from '../../../common/flowTypes'; import './AssigneeList.scss'; const DEFAULT_ASSIGNEES_SHOWN = 3; const TASKS_PAGE_SIZE = 20; // service does not return the page size to the client at the moment type Props = {| getAvatarUrl: GetAvatarUrlCallback, initialAssigneeCount: number, isOpen: boolean, onCollapse: () => void | Promise, onExpand: () => void | Promise, users: TaskAssigneeCollection, |}; function AssigneeList(props: Props) { const { initialAssigneeCount = DEFAULT_ASSIGNEES_SHOWN, users = {}, getAvatarUrl, isOpen, onCollapse, onExpand, } = props; const { entries = [], next_marker } = users; const entryCount = entries.length; const numVisibleAssignees = isOpen ? entryCount : initialAssigneeCount; const visibleUsers = entries .slice(0, numVisibleAssignees) .map(({ id, target, status, completed_at: completedAt }) => { return (
  • ); }); const hiddenAssigneeCount = Math.max(0, entryCount - initialAssigneeCount); const maxAdditionalAssignees = TASKS_PAGE_SIZE - initialAssigneeCount; const hasMoreAssigneesThanPageSize = hiddenAssigneeCount > maxAdditionalAssignees || next_marker; const additionalAssigneeMessage = hasMoreAssigneesThanPageSize ? messages.taskShowMoreAssigneesOverflow : messages.taskShowMoreAssignees; return (
      {visibleUsers}
    {!isOpen && hiddenAssigneeCount > 0 && (
    )} {isOpen && (
    )}
    ); } export default AssigneeList;