UserMenu.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import React, { useState } from 'react';
  2. import { IUserHasId } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. UncontrolledDropdown, DropdownToggle, DropdownMenu,
  6. } from 'reactstrap';
  7. import AdminUsersContainer from '~/client/services/AdminUsersContainer';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import GiveAdminButton from './GiveAdminButton';
  10. import RemoveAdminMenuItem from './RemoveAdminMenuItem';
  11. import SendInvitationEmailButton from './SendInvitationEmailButton';
  12. import StatusActivateButton from './StatusActivateButton';
  13. import StatusSuspendedMenuItem from './StatusSuspendMenuItem';
  14. import UserRemoveButton from './UserRemoveButton';
  15. import styles from './UserMenu.module.scss';
  16. type UserMenuProps = {
  17. adminUsersContainer: AdminUsersContainer,
  18. user: IUserHasId,
  19. }
  20. const UserMenu = (props: UserMenuProps) => {
  21. const { t } = useTranslation('admin');
  22. const { adminUsersContainer, user } = props;
  23. const [isInvitationEmailSended, setIsInvitationEmailSended] = useState<boolean>(user.isInvitationEmailSended);
  24. const onClickPasswordResetHandler = async() => {
  25. await adminUsersContainer.showPasswordResetModal(user);
  26. };
  27. const onSuccessfullySentInvitationEmailHandler = () => {
  28. setIsInvitationEmailSended(true);
  29. };
  30. const renderEditMenu = () => {
  31. return (
  32. <>
  33. <li className="dropdown-divider"></li>
  34. <li className="dropdown-header">{t('admin:user_management.user_table.edit_menu')}</li>
  35. <li>
  36. <button className="dropdown-item" type="button" onClick={onClickPasswordResetHandler}>
  37. <i className="icon-fw icon-key"></i>{ t('admin:user_management.reset_password') }
  38. </button>
  39. </li>
  40. </>
  41. );
  42. };
  43. const renderStatusMenu = () => {
  44. return (
  45. <>
  46. <li className="dropdown-divider"></li>
  47. <li className="dropdown-header">{t('user_management.status')}</li>
  48. <li>
  49. {(user.status === 1 || user.status === 3) && <StatusActivateButton user={user} />}
  50. {user.status === 2 && <StatusSuspendedMenuItem user={user} />}
  51. {user.status === 5 && (
  52. <SendInvitationEmailButton
  53. user={user}
  54. isInvitationEmailSended={isInvitationEmailSended}
  55. onSuccessfullySentInvitationEmail={onSuccessfullySentInvitationEmailHandler}
  56. />
  57. )}
  58. {(user.status === 1 || user.status === 3 || user.status === 5) && <UserRemoveButton user={user} />}
  59. </li>
  60. </>
  61. );
  62. };
  63. const renderAdminMenu = () => {
  64. return (
  65. <>
  66. <li className="dropdown-divider pl-0"></li>
  67. <li className="dropdown-header">{t('admin:user_management.user_table.administrator_menu')}</li>
  68. <li>
  69. {user.admin === true && <RemoveAdminMenuItem user={user} />}
  70. {user.admin === false && <GiveAdminButton user={user} />}
  71. </li>
  72. </>
  73. );
  74. };
  75. return (
  76. <UncontrolledDropdown id="userMenu" size="sm">
  77. <DropdownToggle caret color="secondary" outline>
  78. <i className="icon-settings" />
  79. {(user.status === 5 && !isInvitationEmailSended)
  80. && <i className={`fa fa-circle text-danger grw-usermenu-notification-icon ${styles['grw-usermenu-notification-icon']}`} />}
  81. </DropdownToggle>
  82. <DropdownMenu positionFixed>
  83. {renderEditMenu}
  84. {user.status !== 4 && renderStatusMenu}
  85. {user.status === 2 && renderAdminMenu}
  86. </DropdownMenu>
  87. </UncontrolledDropdown>
  88. );
  89. };
  90. /**
  91. * Wrapper component for using unstated
  92. */
  93. // eslint-disable-next-line max-len
  94. const UserMenuWrapper: React.ForwardRefExoticComponent<Pick<any, string | number | symbol> & React.RefAttributes<any>> = withUnstatedContainers(UserMenu, [AdminUsersContainer]);
  95. export default UserMenuWrapper;