import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import MediaQuery from 'react-responsive'; import moment from 'moment'; import { Link } from '@reach/router'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, siteRoot, storages } from '../../utils/constants'; import ModalPortal from '../../components/modal-portal'; import ShareDialog from '../../components/dialog/share-dialog'; import toaster from '../../components/toast'; import DeleteRepoDialog from '../../components/dialog/delete-repo-dialog'; import TransferDialog from '../../components/dialog/transfer-dialog'; import LibHistorySettingDialog from '../../components/dialog/lib-history-setting-dialog'; import ChangeRepoPasswordDialog from '../../components/dialog/change-repo-password-dialog'; import ResetEncryptedRepoPasswordDialog from '../../components/dialog/reset-encrypted-repo-password-dialog'; import Rename from '../../components/rename'; import MylibRepoMenu from './mylib-repo-menu'; const propTypes = { repo: PropTypes.object.isRequired, isItemFreezed: PropTypes.bool.isRequired, onFreezedItem: PropTypes.func.isRequired, onUnfreezedItem: PropTypes.func.isRequired, onRenameRepo: PropTypes.func.isRequired, onDeleteRepo: PropTypes.func.isRequired, onTransferRepo: PropTypes.func.isRequired, onRepoDetails: PropTypes.func.isRequired, onRepoClick: PropTypes.func.isRequired, }; class MylibRepoListItem extends React.Component { constructor(props) { super(props); this.state = { isOpIconShow: false, isStarred: this.props.repo.starred, isRenaming: false, isShareDialogShow: false, isDeleteDialogShow: false, isTransferDialogShow: false, isHistorySettingDialogShow: false, isChangePasswordDialogShow: false, isResetPasswordDialogShow: false, }; } onMouseEnter = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShow: true, highlight: true, }); } } onMouseLeave = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShow: false, highlight: false }); } } onMenuItemClick = (item) => { switch(item) { case 'Share': this.onShareToggle(); break; case 'Delete': this.onDeleteToggle(); break; case 'Rename': this.onRenameToggle(); break; case 'Transfer': this.onTransferToggle(); break; case 'History Setting': this.onHistorySettingToggle(); break; case 'Change Password': this.onChangePasswordToggle(); break; case 'Reset Password': this.onResetPasswordToggle(); break; case 'Folder Permission': // todo break; case 'Details': this.onRepoDetails(); break; case 'Label current state': this.onLabel(); break; default: break; } } onRepoClick = () => { this.props.onRepoClick(this.props.repo); } onStarRepo = () => { if (this.state.isStarred) { seafileAPI.unStarItem(this.props.repo.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); }); } else { seafileAPI.starItem(this.props.repo.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); }) } } onShareToggle = () => { this.setState({isShareDialogShow: !this.state.isShareDialogShow}); } onDeleteToggle = () => { this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow}); } onRenameToggle = () => { this.props.onFreezedItem(); this.setState({isRenaming: !this.state.isRenaming}); } onTransferToggle = () => { this.setState({isTransferDialogShow: !this.state.isTransferDialogShow}); } onHistorySettingToggle = () => { this.setState({isHistorySettingDialogShow: !this.state.isHistorySettingDialogShow}); } onChangePasswordToggle = () => { this.setState({isChangePasswordDialogShow: !this.state.isChangePasswordDialogShow}); } onResetPasswordToggle = () => { this.setState({isResetPasswordDialogShow: !this.state.isResetPasswordDialogShow}); } onRepoDetails = () => { this.props.onRepoDetails(this.props.repo); } onLabel = () => { // todo } onUnfreezedItem = () => { this.setState({ highlight: false, isOpIconShow: false, }); this.props.onUnfreezedItem(); } onRenameConfirm = (newName) => { let repo = this.props.repo; let repoID = repo.repo_id; seafileAPI.renameRepo(repoID, newName).then(() => { this.props.onRenameRepo(repo, newName); this.onRenameCancel(); }); } onRenameCancel = () => { this.props.onUnfreezedItem(); this.setState({isRenaming: !this.state.isRenaming}); } onTransferRepo = (user) => { let repoID = this.props.repo.repo_id; seafileAPI.transferRepo(repoID, user.email).then(res => { this.props.onTransferRepo(repoID); let message = gettext('Successfully transferred the library.'); toaster.success(message); }).catch(res => { let message = gettext('Failed. Please check the network.'); toaster.danger(message); }); this.onTransferToggle(); } onDeleteRepo = (repo) => { seafileAPI.deleteRepo(repo.repo_id).then((res) => { this.props.onDeleteRepo(repo); // TODO: show feedback msg }).catch((error) => { // TODO: show feedback msg }); } renderPCUI = () => { let repo = this.props.repo; let iconUrl = Utils.getLibIconUrl(repo); let iconTitle = Utils.getLibIconTitle(repo); let repoURL = `${siteRoot}library/${repo.repo_id}/${Utils.encodePath(repo.repo_name)}/`; return ( {!this.state.isStarred && } {this.state.isStarred && } {iconTitle} {this.state.isRenaming && ( )} {!this.state.isRenaming && repo.repo_name && ( {repo.repo_name} )} {!this.state.isRenaming && !repo.repo_name && (gettext('Broken (please contact your administrator to fix this library)')) } {(repo.repo_name && this.state.isOpIconShow) && (
)} {repo.size} {storages.length > 0 && {repo.storage_name}} {moment(repo.last_modified).fromNow()} ); } renderMobileUI = () => { let repo = this.props.repo; let iconUrl = Utils.getLibIconUrl(repo); let iconTitle = Utils.getLibIconTitle(repo); let repoURL = `${siteRoot}library/${repo.repo_id}/${Utils.encodePath(repo.repo_name)}/`; return ( {iconTitle} {this.state.isRenaming && ( )} {!this.state.isRenaming && repo.repo_name && (
{repo.repo_name}
)} {!this.state.isRenaming && !repo.repo_name &&
(gettext('Broken (please contact your administrator to fix this library)'))
} {repo.size} {moment(repo.last_modified).fromNow()} {repo.repo_name && ( )} ); } render() { let repo = this.props.repo; return ( {this.renderPCUI()} {this.renderMobileUI()} {this.state.isShareDialogShow && ( )} {this.state.isDeleteDialogShow && ( )} {this.state.isTransferDialogShow && ( )} {this.state.isHistorySettingDialogShow && ( )} {this.state.isChangePasswordDialogShow && ( )} {this.state.isResetPasswordDialogShow && ( )} ) } } MylibRepoListItem.propTypes = propTypes; export default MylibRepoListItem;