EditingUserList.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { type FC, useState } from 'react';
  2. import type { IUserHasId } from '@growi/core';
  3. import { UserPicture } from '@growi/ui/dist/components';
  4. import { Popover, PopoverBody } from 'reactstrap';
  5. import UserPictureList from '../Common/UserPictureList';
  6. import popoverStyles from './user-list-popover.module.scss';
  7. type Props = {
  8. className: string,
  9. userList: IUserHasId[]
  10. }
  11. export const EditingUserList: FC<Props> = ({ className, userList }) => {
  12. const [isPopoverOpen, setIsPopoverOpen] = useState(false);
  13. const togglePopover = () => setIsPopoverOpen(!isPopoverOpen);
  14. const firstFourUsers = userList.slice(0, 4);
  15. const remainingUsers = userList.slice(4);
  16. return (
  17. <div className={className}>
  18. {userList.length > 0 && (
  19. <div className="d-flex justify-content-end">
  20. {firstFourUsers.map(user => (
  21. <div className="ms-1">
  22. <UserPicture
  23. user={user}
  24. noLink
  25. additionalClassName="border border-info"
  26. />
  27. </div>
  28. ))}
  29. {remainingUsers.length > 0 && (
  30. <div className="ms-1">
  31. <button type="button" id="btn-editing-user" className="btn border-0 bg-info-subtle rounded-pill p-0">
  32. <span className="fw-bold text-info p-1">+{remainingUsers.length}</span>
  33. </button>
  34. <Popover placement="bottom" isOpen={isPopoverOpen} target="btn-editing-user" toggle={togglePopover} trigger="legacy">
  35. <PopoverBody className={`user-list-popover ${popoverStyles['user-list-popover']}`}>
  36. <UserPictureList users={remainingUsers} />
  37. </PopoverBody>
  38. </Popover>
  39. </div>
  40. )}
  41. </div>
  42. )}
  43. </div>
  44. );
  45. };