import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import cookie from 'react-cookies'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, canAddPublicRepo } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import Repo from '../../models/repo'; import toaster from '../../components/toast'; import Loading from '../../components/loading'; import EmptyTip from '../../components/empty-tip'; import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view'; import SortOptionsDialog from '../../components/dialog/sort-options'; import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar'; import ModalPortal from '../../components/modal-portal'; import CreateRepoDialog from '../../components/dialog/create-repo-dialog'; import ShareRepoDialog from '../../components/dialog/share-repo-dialog'; import { LIST_MODE } from '../../components/dir-view-mode/constants'; const propTypes = { currentViewMode: PropTypes.string, inAllLibs: PropTypes.bool, repoList: PropTypes.array, }; class PublicSharedView extends React.Component { constructor(props) { super(props); this.state = { isLoading: true, errMessage: '', repoList: [], isCreateRepoDialogOpen: false, isSelectRepoDialogOpen: false, sortBy: cookie.load('seafile-repo-dir-sort-by') || 'name', // 'name' or 'time' or 'size' sortOrder: cookie.load('seafile-repo-dir-sort-order') || 'asc', // 'asc' or 'desc' isSortOptionsDialogOpen: false, libraryType: 'public', }; } componentDidMount() { if (!this.props.repoList) { seafileAPI.listRepos({ type: 'public' }).then((res) => { let repoList = res.data.repos.map((item) => { return new Repo(item); }); this.setState({ isLoading: false, repoList: Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder) }); }).catch((error) => { this.setState({ isLoading: false, errMessage: Utils.getErrorMsg(error, true) }); }); } else { this.setState({ isLoading: false, repoList: Utils.sortRepos(this.props.repoList, this.state.sortBy, this.state.sortOrder) }); } } onItemUnshare = (repo) => { seafileAPI.unshareRepo(repo.repo_id, { share_type: 'public' }).then(() => { let repoList = this.state.repoList.filter(item => { return item.repo_id !== repo.repo_id; }); this.setState({ repoList: repoList }); let message = gettext('Successfully unshared {name}').replace('{name}', repo.repo_name); toaster.success(message); }).catch(error => { let errMessage = Utils.getErrorMsg(error); if (errMessage === gettext('Error')) { errMessage = gettext('Failed to unshare {name}').replace('{name}', repo.repo_name); } toaster(errMessage); }); }; onItemDelete = () => { // todo need to optimized }; addRepoItem = (repo) => { let isExist = false; let repoIndex = 0; let repoList = this.state.repoList; for (let i = 0; i < repoList.length; i ++) { if (repo.repo_id === repoList[i].repo_id) { isExist = true; repoIndex = i; break; } } if (isExist) { this.state.repoList.splice(repoIndex, 1); } let newRepoList = this.state.repoList.map(item => {return item;}); newRepoList.unshift(repo); this.setState({ repoList: newRepoList }); }; sortItems = (sortBy, sortOrder) => { cookie.save('seafile-repo-dir-sort-by', sortBy); cookie.save('seafile-repo-dir-sort-order', sortOrder); this.setState({ sortBy: sortBy, sortOrder: sortOrder, repoList: Utils.sortRepos(this.state.repoList, sortBy, sortOrder) }); }; toggleSortOptionsDialog = () => { this.setState({ isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen }); }; renderContent = () => { const { inAllLibs = false, currentViewMode = LIST_MODE } = this.props; // inAllLibs: in 'All Libs'('Files') page const { errMessage } = this.state; const emptyTip = inAllLibs ?
{gettext('No public libraries')}
: (