import React from 'react';
import PropTypes from 'prop-types';
import { withTranslation } from 'react-i18next';
import { CopyToClipboard } from 'react-copy-to-clipboard';
// import Button from 'react-bootstrap/es/Button';
import {
Modal, ModalHeader, ModalBody, ModalFooter,
} from 'reactstrap';
import { toastSuccess, toastError, toastWarning } from '../../../util/apiNotification';
import { withUnstatedContainers } from '../../UnstatedUtils';
import AppContainer from '../../../services/AppContainer';
import AdminUsersContainer from '../../../services/AdminUsersContainer';
class UserInviteModal extends React.Component {
constructor(props) {
super(props);
this.state = {
emailInputValue: '',
sendEmail: false,
invitedEmailList: null,
isCreateUserButtonPushed: false,
};
this.handleSubmit = this.handleSubmit.bind(this);
this.handleInput = this.handleInput.bind(this);
this.handleCheckBox = this.handleCheckBox.bind(this);
this.onToggleModal = this.onToggleModal.bind(this);
}
onToggleModal() {
this.props.adminUsersContainer.toggleUserInviteModal();
this.setState({ invitedEmailList: null });
}
showToaster() {
toastSuccess('Copied Mail and Password');
}
showToasterByEmailList(emailList, toast) {
let msg = '';
emailList.forEach((email) => {
msg += `・${email}
`;
});
switch (toast) {
case 'success':
msg = `User has been created
${msg}`;
toastSuccess(msg);
break;
case 'warning':
msg = `Existing email
${msg}`;
toastWarning(msg);
break;
case 'error':
toastError({ message: msg });
break;
}
}
renderModalBody() {
const { t } = this.props;
return (
<>
{t('admin:user_management.invite_modal.description1')}
{t('admin:user_management.invite_modal.description2')}
{!this.validEmail() && {t('admin:user_management.invite_modal.valid_email')}
}
>
);
}
renderCreatedModalBody() {
const { t } = this.props;
const { invitedEmailList } = this.state;
return (
<>
{t('admin:user_management.invite_modal.temporary_password')}
{t('admin:user_management.invite_modal.send_new_password')}
{invitedEmailList.createdUserList.length > 0 && this.renderCreatedEmail(invitedEmailList.createdUserList)}
{invitedEmailList.existingEmailList.length > 0 && this.renderExistingEmail(invitedEmailList.existingEmailList)}
>
);
}
renderModalFooter() {
const { t, appContainer } = this.props;
const { isCreateUserButtonPushed } = this.state;
const { isMailerSetup } = appContainer.config;
return (
<>
{isMailerSetup
// eslint-disable-next-line react/no-danger
?
// eslint-disable-next-line react/no-danger
:
}
>
);
}
renderCreatedModalFooter() {
const { t } = this.props;
return (
<>
>
);
}
renderCreatedEmail(userList) {
return (
);
}
renderExistingEmail(emailList) {
const { t } = this.props;
return (
<>
{t('admin:user_management.invite_modal.existing_email')}
{emailList.map((user) => {
return (
- {user}
);
})}
>
);
}
validEmail() {
return this.state.emailInputValue.match(/.+@.+\..+/) != null;
}
async handleSubmit() {
const { adminUsersContainer } = this.props;
// eslint-disable-next-line no-unused-vars
const { isCreateUserButtonPushed } = this.state;
this.setState({ isCreateUserButtonPushed: true });
const array = this.state.emailInputValue.split('\n');
const emailList = array.filter((element) => { return element.match(/.+@.+\..+/) });
const shapedEmailList = emailList.map((email) => { return email.trim() });
try {
const emailList = await adminUsersContainer.createUserInvited(shapedEmailList, this.state.sendEmail);
this.setState({ emailInputValue: '' });
this.setState({ invitedEmailList: emailList });
if (emailList.createdUserList.length > 0) {
const createdEmailList = emailList.createdUserList.map((user) => { return user.email });
this.showToasterByEmailList(createdEmailList, 'success');
}
if (emailList.existingEmailList.length > 0) {
this.showToasterByEmailList(emailList.existingEmailList, 'warning');
}
if (emailList.failedEmailList.length > 0) {
const failedEmailList = emailList.failedEmailList.map((failed, index) => {
let messgage = `email: ${failed.email}
・reason: ${failed.reason}`;
if (index !== emailList.failedEmailList.length - 1) {
messgage += '
';
}
return messgage;
});
this.showToasterByEmailList(failedEmailList, 'error');
}
}
catch (err) {
toastError(err);
}
finally {
this.setState({ isCreateUserButtonPushed: false });
}
}
handleInput(event) {
this.setState({ emailInputValue: event.target.value });
}
handleCheckBox() {
this.setState({ sendEmail: !this.state.sendEmail });
}
render() {
const { t, adminUsersContainer } = this.props;
const { invitedEmailList } = this.state;
return (
{t('admin:user_management.invite_users') }
{invitedEmailList == null ? this.renderModalBody()
: this.renderCreatedModalBody()}
{invitedEmailList == null ? this.renderModalFooter()
: this.renderCreatedModalFooter()}
);
}
}
/**
* Wrapper component for using unstated
*/
const UserInviteModalWrapper = withUnstatedContainers(UserInviteModal, [AppContainer, AdminUsersContainer]);
UserInviteModal.propTypes = {
t: PropTypes.func.isRequired, // i18next
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
adminUsersContainer: PropTypes.instanceOf(AdminUsersContainer).isRequired,
};
export default withTranslation()(UserInviteModalWrapper);