GrantAdminButton.tsx 1.5 KB

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