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 &&
{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;