import React, { Component } from 'react'; import { Link } from '@reach/router'; import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import { gettext, siteRoot, loginUrl, canGenerateShareLink } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import SharedUploadInfo from '../../models/shared-upload-info'; class Content extends Component { constructor(props) { super(props); this.state = { modalOpen: false, modalContent: '' }; } // required by `Modal`, and can only set the 'open' state toggleModal = () => { this.setState({ modalOpen: !this.state.modalOpen }); } showModal = (options) => { this.toggleModal(); this.setState({ modalContent: options.content }); } render() { const { loading, errorMsg, items } = this.props; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('You don\'t have any upload links')}

{gettext('You can generate an upload link from any folder. Anyone who receives this link can upload files to this folder.')}

); const table = ( {items.map((item, index) => { return (); })}
{/*icon*/} {gettext('Name')} {gettext('Library')} {gettext('Visits')} {/*Operations*/}
{gettext('Link')} {this.state.modalContent}
); return items.length ? table : emptyTip; } } } class Item extends Component { constructor(props) { super(props); this.state = { showOpIcon: false, }; } handleMouseOver = () => { this.setState({showOpIcon: true}); } handleMouseOut = () => { this.setState({showOpIcon: false}); } viewLink = (e) => { e.preventDefault(); this.props.showModal({content: this.props.item.link}); } removeLink = (e) => { e.preventDefault(); this.props.onRemoveLink(this.props.item); } getUploadParams = () => { let item = this.props.item; let iconUrl = Utils.getFolderIconUrl(false); let uploadUrl = `${siteRoot}library/${item.repo_id}/${item.repo_name}${Utils.encodePath(item.path)}`; return { iconUrl, uploadUrl }; } render() { let item = this.props.item; let { iconUrl, uploadUrl } = this.getUploadParams(); let iconVisibility = this.state.showOpIcon ? '' : ' invisible'; let linkIconClassName = 'sf2-icon-link action-icon' + iconVisibility; let deleteIconClassName = 'sf2-icon-delete action-icon' + iconVisibility; return ( {item.obj_name} {item.repo_name} {item.view_cnt} ); } } class ShareAdminUploadLinks extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', items: [] }; } componentDidMount() { seafileAPI.listUploadLinks().then((res) => { // res: {data: Array(2), status: 200, statusText: "OK", headers: {…}, config: {…}, …} let items = res.data.map(item => { return new SharedUploadInfo(item); }); this.setState({ loading: false, items: items }); }).catch((error) => { if (error.response) { if (error.response.status == 403) { this.setState({ loading: false, errorMsg: gettext('Permission denied') }); location.href = `${loginUrl}?next=${encodeURIComponent(location.href)}`; } else { this.setState({ loading: false, errorMsg: gettext('Error') }); } } else { this.setState({ loading: false, errorMsg: gettext('Please check the network.') }); } }); } onRemoveLink = (item) => { seafileAPI.deleteUploadLink(item.token).then(() => { let items = this.state.items.filter(uploadItem => { return uploadItem.token !== item.token; }); this.setState({items: items}); // TODO: show feedback msg // gettext("Successfully deleted 1 item") }).catch((error) => { // TODO: show feedback msg }); } render() { return (
    { canGenerateShareLink && (
  • {gettext('Share Links')}
  • )}
  • {gettext('Upload Links')}
); } } export default ShareAdminUploadLinks;