GrantAdminButton.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React, { type JSX, 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 { toastError, toastSuccess } from '~/client/util/toastr';
  6. import { withUnstatedContainers } from '../../UnstatedUtils';
  7. type GrantAdminButtonProps = {
  8. adminUsersContainer: AdminUsersContainer;
  9. user: IUserHasId;
  10. };
  11. const GrantAdminButton = (props: GrantAdminButtonProps): JSX.Element => {
  12. const { t } = useTranslation('admin');
  13. const { adminUsersContainer, user } = props;
  14. const onClickGrantAdminBtnHandler = useCallback(async () => {
  15. try {
  16. const username = await adminUsersContainer.grantUserAdmin(user._id);
  17. toastSuccess(t('toaster.grant_user_admin', { username }));
  18. } catch (err) {
  19. toastError(err);
  20. }
  21. }, [adminUsersContainer, t, user._id]);
  22. return (
  23. <button
  24. className="dropdown-item"
  25. type="button"
  26. onClick={() => onClickGrantAdminBtnHandler()}
  27. >
  28. <span className="material-symbols-outlined me-1">person_add</span>
  29. {t('user_management.user_table.grant_admin_access')}
  30. </button>
  31. );
  32. };
  33. /**
  34. * Wrapper component for using unstated
  35. */
  36. const GrantAdminButtonWrapper: React.ForwardRefExoticComponent<
  37. Pick<any, string | number | symbol> & React.RefAttributes<any>
  38. > = withUnstatedContainers(GrantAdminButton, [AdminUsersContainer]);
  39. export default GrantAdminButtonWrapper;