SeenUserInfo.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import type { FC } from 'react';
  2. import React, { useState } from 'react';
  3. import type { IUser } from '@growi/core';
  4. import { useTranslation } from 'next-i18next';
  5. import { UncontrolledTooltip, Popover, PopoverBody } from 'reactstrap';
  6. import UserPictureList from '../Common/UserPictureList';
  7. import styles from './SeenUserInfo.module.scss';
  8. import popoverStyles from './user-list-popover.module.scss';
  9. interface Props {
  10. seenUsers: IUser[],
  11. sumOfSeenUsers?: number,
  12. disabled?: boolean,
  13. }
  14. const SeenUserInfo: FC<Props> = (props: Props) => {
  15. const { t } = useTranslation();
  16. const [isPopoverOpen, setIsPopoverOpen] = useState(false);
  17. const { seenUsers, sumOfSeenUsers, disabled } = props;
  18. const togglePopover = () => setIsPopoverOpen(!isPopoverOpen);
  19. return (
  20. <div className={`grw-seen-user-info ${styles['grw-seen-user-info']}`}>
  21. <button type="button" id="btn-seen-user" className="shadow-none btn btn-seen-user border-0 d-flex align-items-center">
  22. <span className="material-symbols-outlined me-1">footprint</span>
  23. <span className="total-counts">{sumOfSeenUsers || seenUsers.length}</span>
  24. </button>
  25. <Popover placement="bottom" isOpen={isPopoverOpen} target="btn-seen-user" toggle={togglePopover} trigger="legacy" disabled={disabled}>
  26. <PopoverBody className={`user-list-popover ${popoverStyles['user-list-popover']}`}>
  27. <div className="px-2 text-end user-list-content text-truncate text-muted">
  28. <UserPictureList users={seenUsers} />
  29. </div>
  30. </PopoverBody>
  31. </Popover>
  32. <UncontrolledTooltip data-testid="seen-user-info-tooltip" target="btn-seen-user" fade={false}>
  33. {t('tooltip.footprints')}
  34. </UncontrolledTooltip>
  35. </div>
  36. );
  37. };
  38. export default SeenUserInfo;