import React, { useState, useCallback } from 'react'; import { type IUserHasId, USER_STATUS } from '@growi/core'; import { useTranslation } from 'next-i18next'; import { UncontrolledDropdown, DropdownToggle, DropdownMenu, } from 'reactstrap'; import AdminUsersContainer from '~/client/services/AdminUsersContainer'; import { withUnstatedContainers } from '../../UnstatedUtils'; import GrantAdminButton from './GrantAdminButton'; import GrantReadOnlyButton from './GrantReadOnlyButton'; import RevokeAdminMenuItem from './RevokeAdminMenuItem'; import RevokeReadOnlyMenuItem from './RevokeReadOnlyMenuItem'; import SendInvitationEmailButton from './SendInvitationEmailButton'; import StatusActivateButton from './StatusActivateButton'; import StatusSuspendedMenuItem from './StatusSuspendMenuItem'; import UserRemoveButton from './UserRemoveButton'; import styles from './UserMenu.module.scss'; type UserMenuProps = { adminUsersContainer: AdminUsersContainer, user: IUserHasId, } const UserMenu = (props: UserMenuProps) => { const { t } = useTranslation('admin'); const { adminUsersContainer, user } = props; const [isInvitationEmailSended, setIsInvitationEmailSended] = useState(user.isInvitationEmailSended); const onClickPasswordResetHandler = useCallback(async() => { await adminUsersContainer.showPasswordResetModal(user); }, [adminUsersContainer, user]); const onSuccessfullySentInvitationEmailHandler = useCallback(() => { setIsInvitationEmailSended(true); }, []); const renderEditMenu = useCallback(() => { return ( <>
  • {t('user_management.user_table.edit_menu')}
  • ); }, [onClickPasswordResetHandler, t]); const renderStatusMenu = useCallback(() => { return ( <>
  • {t('user_management.status')}
  • {(user.status === USER_STATUS.REGISTERED || user.status === USER_STATUS.SUSPENDED) && } {user.status === USER_STATUS.ACTIVE && } {user.status === USER_STATUS.INVITED && ( )} {(user.status === USER_STATUS.REGISTERED || user.status === USER_STATUS.SUSPENDED || user.status === USER_STATUS.INVITED) && }
  • ); }, [isInvitationEmailSended, onSuccessfullySentInvitationEmailHandler, t, user]); const renderAdminMenu = useCallback(() => { return ( <>
  • {t('user_management.user_table.administrator_menu')}
  • {user.admin ? : }
  • {user.readOnly ? : }
  • ); }, [t, user]); return ( {(user.status === USER_STATUS.INVITED && !isInvitationEmailSended) && } {renderEditMenu()} {user.status !== USER_STATUS.DELETED && renderStatusMenu()} {user.status === USER_STATUS.ACTIVE && renderAdminMenu()} ); }; /** * Wrapper component for using unstated */ // eslint-disable-next-line max-len const UserMenuWrapper: React.ForwardRefExoticComponent & React.RefAttributes> = withUnstatedContainers(UserMenu, [AdminUsersContainer]); export default UserMenuWrapper;