SeenUserInfo.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React, { FC, useState } from 'react';
  2. import type { IUser } from '@growi/core';
  3. import { FootstampIcon } from '@growi/ui/dist/components';
  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">
  22. <span className="me-1 footstamp-icon">
  23. <FootstampIcon />
  24. </span>
  25. <span className="total-counts">{sumOfSeenUsers || seenUsers.length}</span>
  26. </button>
  27. <Popover placement="bottom" isOpen={isPopoverOpen} target="btn-seen-user" toggle={togglePopover} trigger="legacy" disabled={disabled}>
  28. <PopoverBody className={`user-list-popover ${popoverStyles['user-list-popover']}`}>
  29. <div className="px-2 text-end user-list-content text-truncate text-muted">
  30. <UserPictureList users={seenUsers} />
  31. </div>
  32. </PopoverBody>
  33. </Popover>
  34. <UncontrolledTooltip data-testid="seen-user-info-tooltip" placement="top" target="btn-seen-user" fade={false}>
  35. {t('tooltip.footprints')}
  36. </UncontrolledTooltip>
  37. </div>
  38. );
  39. };
  40. export default SeenUserInfo;