import React from 'react';
import { useAtomValue } from 'jotai';
import { useTranslation } from 'next-i18next';
import PropTypes from 'prop-types';
import { CopyToClipboard } from 'react-copy-to-clipboard';
// import Button from 'react-bootstrap/es/Button';
import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
import AdminUsersContainer from '~/client/services/AdminUsersContainer';
import { toastError, toastSuccess, toastWarning } from '~/client/util/toastr';
import { isMailerSetupAtom } from '~/states/server-configurations';
import { withUnstatedContainers } from '../../UnstatedUtils';
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, isMailerSetup } = this.props;
const { isCreateUserButtonPushed } = this.state;
return (
<>
{isMailerSetup ? (
) : (
)}
>
);
}
renderCreatedModalFooter() {
const { t } = this.props;
return (
<>
{t('admin:user_management.invite_modal.send_temporary_password')}
{t('admin:user_management.invite_modal.send_email')}
>
);
}
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;
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()}
);
}
}
const UserInviteModalWrapperFC = (props) => {
const { t } = useTranslation();
const isMailerSetup = useAtomValue(isMailerSetupAtom);
return (
);
};
/**
* Wrapper component for using unstated
*/
const UserInviteModalWrapper = withUnstatedContainers(
UserInviteModalWrapperFC,
[AdminUsersContainer],
);
UserInviteModal.propTypes = {
t: PropTypes.func.isRequired, // i18next
adminUsersContainer: PropTypes.instanceOf(AdminUsersContainer).isRequired,
isMailerSetup: PropTypes.bool.isRequired,
};
export default UserInviteModalWrapper;