RevokeAdminButton.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React, { useCallback } from 'react';
  2. import type { IUserHasId } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import AdminUsersContainer from '~/client/services/AdminUsersContainer';
  5. import { toastSuccess, toastError } from '~/client/util/toastr';
  6. import { useCurrentUser } from '~/stores-universal/context';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. type RevokeAdminButtonProps = {
  9. adminUsersContainer: AdminUsersContainer,
  10. user: IUserHasId,
  11. }
  12. const RevokeAdminButton = (props: RevokeAdminButtonProps): React.ReactElement => {
  13. const { t } = useTranslation('admin');
  14. const { data: currentUser } = useCurrentUser();
  15. const { adminUsersContainer, user } = props;
  16. const onClickRevokeAdminBtnHandler = useCallback(async() => {
  17. try {
  18. const username = await adminUsersContainer.revokeUserAdmin(user._id);
  19. toastSuccess(t('toaster.revoke_user_admin', { username }));
  20. }
  21. catch (err) {
  22. toastError(err);
  23. }
  24. }, [adminUsersContainer, t, user._id]);
  25. const renderRevokeAdminBtn = () => {
  26. return (
  27. <button className="dropdown-item" type="button" onClick={() => onClickRevokeAdminBtnHandler()}>
  28. <span className="material-symbols-outlined me-1">person_remove</span>{t('user_management.user_table.revoke_admin_access')}
  29. </button>
  30. );
  31. };
  32. const renderRevokeAdminAlert = () => {
  33. return (
  34. <div className="px-4">
  35. <span className="material-symbols-outlined me-1 mb-2">person_remove</span>{t('user_management.user_table.revoke_admin_access')}
  36. <p className="alert alert-danger">{t('user_management.user_table.cannot_revoke')}</p>
  37. </div>
  38. );
  39. };
  40. if (currentUser == null) {
  41. return <></>;
  42. }
  43. return (
  44. <>
  45. {user.username !== currentUser.username ? renderRevokeAdminBtn()
  46. : renderRevokeAdminAlert()}
  47. </>
  48. );
  49. };
  50. /**
  51. * Wrapper component for using unstated
  52. */
  53. const RevokeAdminButtonWrapper = withUnstatedContainers(RevokeAdminButton, [AdminUsersContainer]);
  54. export default RevokeAdminButtonWrapper;