import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { Modal, ModalBody, Button, Input } from 'reactstrap'; import RepoAPITokenPermissionEditor from '../select-editor/repo-api-token-permission-editor'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import toaster from '../toast'; import copy from 'copy-to-clipboard'; import Loading from '../loading'; import OpIcon from '../op-icon'; import SeahubModalHeader from '@/components/common/seahub-modal-header'; const apiTokenItemPropTypes = { item: PropTypes.object.isRequired, deleteAPIToken: PropTypes.func.isRequired, updateAPIToken: PropTypes.func.isRequired, }; class APITokenItem extends React.Component { constructor(props) { super(props); this.state = { isOperationShow: false, }; } onMouseEnter = () => { this.setState({ isOperationShow: true }); }; onMouseLeave = () => { this.setState({ isOperationShow: false }); }; onDeleteAPIToken = () => { this.props.deleteAPIToken(this.props.item.app_name); }; onUpdateAPIToken = (permission) => { this.props.updateAPIToken(this.props.item.app_name, permission); }; onCopyAPIToken = () => { let api_token = this.props.item.api_token; copy(api_token); toaster.success(gettext('API token is copied to the clipboard.')); }; render() { let item = this.props.item; return ( {item.app_name} {item.api_token} {this.state.isOperationShow && } ); } } APITokenItem.propTypes = apiTokenItemPropTypes; const propTypes = { repo: PropTypes.object.isRequired, onRepoAPITokenToggle: PropTypes.func.isRequired, }; class RepoAPITokenDialog extends React.Component { constructor(props) { super(props); this.state = { apiTokenList: [], permission: 'rw', appName: '', errorMsg: '', loading: true, isSubmitBtnActive: true, }; } listAPITokens = () => { seafileAPI.listRepoAPITokens(this.props.repo.repo_id).then((res) => { this.setState({ apiTokenList: res.data.repo_api_tokens, loading: false, }); }).catch(error => { if (error.response.status === 403) { this.setState({ errorMsg: gettext('Permission denied'), }); } else { this.handleError(error); } }); }; onInputChange = (e) => { let appName = e.target.value; this.setState({ appName: appName, }); }; onKeyDown = (e) => { if (e.keyCode === 13) { e.preventDefault(); this.addAPIToken(); } }; setPermission = (permission) => { this.setState({ permission: permission }); }; addAPIToken = () => { if (!this.state.appName) { return; } this.setState({ isSubmitBtnActive: false, }); const { appName, permission, apiTokenList } = this.state; seafileAPI.addRepoAPIToken(this.props.repo.repo_id, appName, permission).then((res) => { apiTokenList.push(res.data); this.setState({ apiTokenList: apiTokenList, isSubmitBtnActive: true, }); }).catch(error => { this.handleError(error); this.setState({ isSubmitBtnActive: true, }); }); }; deleteAPIToken = (appName) => { seafileAPI.deleteRepoAPIToken(this.props.repo.repo_id, appName).then((res) => { const apiTokenList = this.state.apiTokenList.filter(item => { return item.app_name !== appName; }); this.setState({ apiTokenList: apiTokenList, }); }).catch(error => { this.handleError(error); }); }; updateAPIToken = (appName, permission) => { seafileAPI.updateRepoAPIToken(this.props.repo.repo_id, appName, permission).then((res) => { let apiTokenList = this.state.apiTokenList.filter(item => { if (item.app_name === appName) { item.permission = permission; } return item; }); this.setState({ apiTokenList: apiTokenList, }); }).catch(error => { this.handleError(error); }); }; handleError = (e) => { if (e.response) { toaster.danger(e.response.data.error_msg || e.response.data.detail || gettext('Error'), { duration: 3 }); } else { toaster.danger(gettext('Please check the network.'), { duration: 3 }); } }; componentDidMount() { this.listAPITokens(); } renderContent = () => { const renderAPITokenList = this.state.apiTokenList.map((item, index) => { return ( ); }); const thead = ( {gettext('App Name')} {gettext('Permission')} API Token ); return ( {this.state.errorMsg &&

{this.state.errorMsg}

} {!this.state.errorMsg && {thead}
--
{this.state.apiTokenList.length !== 0 && {thead} {renderAPITokenList}
}
{this.state.loading && }
}
); }; render() { const itemName = '' + Utils.HTMLescape(this.props.repo.repo_name) + ''; const title = gettext('{placeholder} API Token').replace('{placeholder}', itemName); return (
{this.renderContent()}
); } } RepoAPITokenDialog.propTypes = propTypes; export default RepoAPITokenDialog;