// @flow import * as React from "react"; import styled from "styled-components"; import { observable } from "mobx"; import { observer, inject } from "mobx-react"; import { MAX_AVATAR_DISPLAY } from "shared/constants"; import Modal from "components/Modal"; import Flex from "components/Flex"; import Facepile from "components/Facepile"; import GroupMembers from "scenes/GroupMembers"; import ListItem from "components/List/Item"; import Group from "models/Group"; import CollectionGroupMembership from "models/CollectionGroupMembership"; import GroupMembershipsStore from "stores/GroupMembershipsStore"; type Props = { group: Group, groupMemberships: GroupMembershipsStore, membership?: CollectionGroupMembership, showFacepile: boolean, renderActions: ({ openMembersModal: () => void }) => React.Node, }; @observer class GroupListItem extends React.Component { @observable membersModalOpen: boolean = false; handleMembersModalOpen = () => { this.membersModalOpen = true; }; handleMembersModalClose = () => { this.membersModalOpen = false; }; render() { const { group, groupMemberships, showFacepile, renderActions } = this.props; const memberCount = group.memberCount; const membershipsInGroup = groupMemberships.inGroup(group.id); const users = membershipsInGroup .slice(0, MAX_AVATAR_DISPLAY) .map((gm) => gm.user); const overflow = memberCount - users.length; return ( {group.name} } subtitle={ {memberCount} member{memberCount === 1 ? "" : "s"} } actions={ {showFacepile && ( )}   {renderActions({ openMembersModal: this.handleMembersModalOpen, })} } /> ); } } const Title = styled.span` &:hover { text-decoration: underline; cursor: pointer; } `; export default inject("groupMemberships")(GroupListItem);