SeenUserInfo.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 { Popover, PopoverBody, UncontrolledTooltip } 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
  22. type="button"
  23. id="btn-seen-user"
  24. className="shadow-none btn btn-seen-user border-0 d-flex align-items-center"
  25. >
  26. <span className="material-symbols-outlined me-1">footprint</span>
  27. <span className="total-counts">
  28. {sumOfSeenUsers || seenUsers.length}
  29. </span>
  30. </button>
  31. <Popover
  32. placement="bottom"
  33. isOpen={isPopoverOpen}
  34. target="btn-seen-user"
  35. toggle={togglePopover}
  36. trigger="legacy"
  37. disabled={disabled}
  38. >
  39. <PopoverBody
  40. className={`user-list-popover ${popoverStyles['user-list-popover']}`}
  41. >
  42. <div className="px-2 text-end user-list-content text-truncate text-muted">
  43. <UserPictureList users={seenUsers} />
  44. </div>
  45. </PopoverBody>
  46. </Popover>
  47. <UncontrolledTooltip
  48. data-testid="seen-user-info-tooltip"
  49. target="btn-seen-user"
  50. fade={false}
  51. >
  52. {t('tooltip.footprints')}
  53. </UncontrolledTooltip>
  54. </div>
  55. );
  56. };
  57. export default SeenUserInfo;