import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import moment from 'moment'; import { Button, Input } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import toaster from '../toast'; import Loading from '../loading'; import SharePermissionEditor from '../select-editor/share-permission-editor'; import '../../css/invitations.css'; class UserItem extends React.Component { constructor(props) { super(props); this.state = { isOperationShow: false }; } onMouseEnter = () => { this.setState({ isOperationShow: true }); }; onMouseLeave = () => { this.setState({ isOperationShow: false }); }; deleteShareItem = () => { let item = this.props.item; this.props.deleteShareItem(item.token); }; onChangeUserPermission = (permission) => { let item = this.props.item; this.props.onChangeUserPermission(item.token, permission); }; render() { let item = this.props.item; let currentPermission = item.is_admin ? 'admin' : item.permission; return ( {item.accepter} {moment(item.expire_time).format('YYYY-MM-DD')} {item.inviter_name} ); } } UserItem.propTypes = { item: PropTypes.object.isRequired, permissions: PropTypes.array.isRequired, deleteShareItem: PropTypes.func.isRequired, onChangeUserPermission: PropTypes.func.isRequired, }; class UserList extends React.Component { render() { let items = this.props.items; return ( {items.map((item, index) => { return ( ); })} ); } } UserList.propTypes = { items: PropTypes.array.isRequired, permissions: PropTypes.array.isRequired, deleteShareItem: PropTypes.func.isRequired, onChangeUserPermission: PropTypes.func.isRequired, }; const propTypes = { itemPath: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, }; class ShareToInvitePeople extends React.Component { constructor(props) { super(props); this.state = { errorMsg: '', permission: 'r', sharedItems: [], emails: '', isSubmitting: false, }; this.permissions = ['rw', 'r']; } handleInputChange = (e) => { let emails = e.target.value; this.setState({ emails: emails, }); if (this.state.errorMsg) { this.setState({ errorMsg: '', }); } }; handleKeyDown = (e) => { if (e.keyCode === 13) { e.preventDefault(); this.shareAndInvite(); } }; componentDidMount() { const path = this.props.itemPath; const repoID = this.props.repoID; seafileAPI.listRepoShareInvitations(repoID, path).then((res) => { if (res.data.length !== 0) { this.setState({ sharedItems: res.data.repo_share_invitation_list }); } }).catch(error => { const errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } setPermission = (permission) => { this.setState({ permission: permission }); }; onInvitePeople = (successArray) => { successArray.push.apply(successArray, this.state.sharedItems); this.setState({ sharedItems: successArray, }); }; shareAndInvite = () => { let emails = this.state.emails.trim(); if (!emails) { this.setState({ errorMsg: gettext('It is required.') }); return false; } let emailsArray = []; emails = emails.split(','); for (let i = 0, len = emails.length; i < len; i++) { let email = emails[i].trim(); if (email) { emailsArray.push(email); } } if (!emailsArray.length) { this.setState({ errorMsg: gettext('Email is invalid.') }); return false; } this.setState({ isSubmitting: true }); const path = this.props.itemPath; const repoID = this.props.repoID; const permission = this.state.permission; seafileAPI.addRepoShareInvitations(repoID, path, emailsArray, permission).then((res) => { const success = res.data.success; if (success.length) { let successMsg = ''; if (success.length == 1) { successMsg = gettext('Successfully invited %(email).') .replace('%(email)', success[0].accepter); } else { successMsg = gettext('Successfully invited %(email) and %(num) other people.') .replace('%(email)', success[0].accepter) .replace('%(num)', success.length - 1); } toaster.success(successMsg); this.onInvitePeople(success); } const failed = res.data.failed; if (failed.length) { for (let i = 0, len = failed.length; i < len; i++) { let failedMsg = failed[i].email + ': ' + failed[i].error_msg; toaster.danger(failedMsg); } } this.setState({ isSubmitting: false }); }).catch((error) => { const errorMsg = Utils.getErrorMsg(error); toaster.danger(errorMsg); this.setState({ isSubmitting: false }); }); }; deleteShareItem = (token) => { const path = this.props.itemPath; const repoID = this.props.repoID; seafileAPI.deleteRepoShareInvitation(repoID, path, token).then(res => { this.setState({ sharedItems: this.state.sharedItems.filter(item => { return item.token !== token; }) }); }).catch(error => { const errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; onChangeUserPermission = (token, permission) => { const path = this.props.itemPath; const repoID = this.props.repoID; seafileAPI.updateRepoShareInvitation(repoID, path, token, permission).then(() => { this.updateSharedItems(token, permission); }).catch(error => { const errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; updateSharedItems = (token, permission) => { let sharedItems = this.state.sharedItems.map(sharedItem => { if (sharedItem.token === token) { sharedItem.permission = permission; } return sharedItem; }); this.setState({ sharedItems: sharedItems }); }; render() { let { sharedItems, isSubmitting } = this.state; return ( {this.state.errorMsg.length > 0 && }
{gettext('Invite Guest')} {gettext('Permission')} {''}

{this.state.errorMsg}

{gettext('Email')} {gettext('Permission')} {gettext('Expiration')} {gettext('Inviter')} {''}
); } } ShareToInvitePeople.propTypes = propTypes; export default ShareToInvitePeople;