import React, { Component } from 'react'; import moment from 'moment'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import Loading from '../../components/loading'; class Content extends Component { render() { const {loading, errorMsg, items} = this.props.data; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('No libraries have been shared with you')}

{gettext('No libraries have been shared directly with you. You can find more shared libraries at "Shared with groups".')}

); const desktopThead = ( {gettext("Library Type")} {gettext("Name")}{/*TODO: sort*/} {gettext("Actions")} {gettext("Size")} {gettext("Last Update")}{/*TODO: sort*/} {gettext("Owner")} ); const mobileThead = ( {gettext("Library Type")} {gettext("Sort:")} {/* TODO: sort */} {gettext("name")} {gettext("last update")} {gettext("Actions")} ); const table = ( {window.innerWidth >= 768 ? desktopThead : mobileThead}
); return items.length ? table : emptyTip; } } } class TableBody extends Component { constructor(props) { super(props); this.state = { items: this.props.items }; } render() { let listItems = this.state.items.map(function(item, index) { return ; }, this); return ( {listItems} ); } } class Item extends Component { constructor(props) { super(props); this.state = { showOpIcon: false, unshared: false }; this.handleMouseOver = this.handleMouseOver.bind(this); this.handleMouseOut = this.handleMouseOut.bind(this); this.share = this.share.bind(this); this.leaveShare = this.leaveShare.bind(this); } handleMouseOver() { this.setState({ showOpIcon: true }); } handleMouseOut() { this.setState({ showOpIcon: false }); } share(e) { e.preventDefault(); // TODO } leaveShare(e) { e.preventDefault(); const data = this.props.data; let request; if (data.owner_email.indexOf('@seafile_group') == -1) { let options = { 'share_type': 'personal', 'from': data.owner_email }; request = seafileAPI.leaveShareRepo(data.repo_id, options); } else { request = seafileAPI.leaveShareGroupOwnedRepo(data.repo_id); } request.then((res) => { this.setState({ unshared: true }); // TODO: show feedback msg }).catch((error) => { // TODO: show feedback msg }); } render() { if (this.state.unshared) { return null; } const data = this.props.data; const permission = data.permission; let is_readonly = false; if (permission == 'r' || permission == 'preview') { is_readonly = true; } data.icon_url = Utils.getLibIconUrl({ is_encrypted: data.encrypted, is_readonly: is_readonly, size: Utils.isHiDPI() ? 48 : 24 }); data.icon_title = Utils.getLibIconTitle({ 'encrypted': data.encrypted, 'is_admin': data.is_admin, 'permission': permission }); data.url = `${siteRoot}#shared-libs/lib/${data.repo_id}/`; let iconVisibility = this.state.showOpIcon ? '' : ' invisible'; let shareIconClassName = 'sf2-icon-share sf2-x repo-share-btn op-icon' + iconVisibility; let leaveShareIconClassName = 'sf2-icon-delete sf2-x op-icon' + iconVisibility; const desktopItem = ( {data.icon_title} {data.repo_name} { isPro && data.is_admin ? : ''} {Utils.formatSize({bytes: data.size})} {moment(data.last_modified).fromNow()} {data.owner_name} ); const mobileItem = ( {data.icon_title} {data.repo_name}
{data.owner_name} {Utils.formatSize({bytes: data.size})} {moment(data.last_modified).fromNow()} { isPro && data.is_admin ? : ''} ); return window.innerWidth >= 768 ? desktopItem : mobileItem; } } class SharedLibraries extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', items: [] }; } componentDidMount() { seafileAPI.listRepos({type:'shared'}).then((res) => { // res: {data: {...}, status: 200, statusText: "OK", headers: {…}, config: {…}, …} this.setState({ loading: false, items: res.data.repos }); }).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.") }); } }); } render() { return (

{gettext("Shared with me")}

); } } export default SharedLibraries;