import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, isPro, username, folderPermEnabled } from '../../utils/constants'; const propTypes = { repo: PropTypes.object.isRequired, isItemFreezed: PropTypes.bool.isRequired, isShowRepoOwner: PropTypes.bool.isRequired, currentGroup: PropTypes.object.isRequired }; class RepoListItem extends React.Component { constructor(props) { super(props); this.state = { highlight: false, isOperationShow: false, isItemMenuShow: false, }; } onMouseEnter = () => { this.setState({ highlight: true, isOperationShow: true, }); } onMouseLeave = () => { this.setState({ highlight: false, isOperationShow: false, }); } toggleOperationMenu = () => { this.setState({ isItemMenuShow: !this.state.isItemMenuShow }); } getRepoComputeParams = () => { let repo = this.props.repo; let currentGroup = this.props.currentGroup; //todo--change to libray let isReadyOnly = false; if ( repo.permission === 'r' || repo.permission === 'preview') { isReadyOnly = true; } let iconUrl = Utils.getLibIconUrl({ is_encryted: repo.encrypted, is_readyonly: isReadyOnly, size: Utils.isHiDPI() ? 48 : 24 }); let iconTitle = Utils.getLibIconTitle({ 'encrypted': repo.encrypted, 'is_admin': repo.is_admin, 'permission': repo.permission }); //todo change to library; div-view is not compatibility let libPath = `${siteRoot}#group/${currentGroup.id}/lib/${this.props.repo.repo_id}/`; return { iconUrl, iconTitle, libPath }; } generatorOperations = () => { let { repo, currentGroup } = this.props; let isStaff = currentGroup.admins.indexOf(username) > -1; //for group repolist; let isRepoOwner = repo.owner_email === username; let isAdmin = repo.is_admin; let iconVisibility = this.state.isOperationShow ? '' : ' invisible'; let shareIconClassName = 'sf2-icon-share sf2-x repo-share-btn op-icon' + iconVisibility; let unshareIconClassName = 'sf2-icon-x3 sf2-x op-icon' + iconVisibility; let deleteIconClassName = 'sf2-icon-delete sf2-x op-icon' + iconVisibility; let operationMenuToggleIconClassName = 'sf2-icon-caret-down item-operation-menu-toggle-icon op-icon'; if (window.innerWidth >= 768) { operationMenuToggleIconClassName += iconVisibility; } const commonToggle = ( ); const commonOperationsInMenu = ( {gettext('Rename')} {folderPermEnabled ? {gettext('Folder Permission')} : null} {gettext('Details')} ); let desktopOperations; let mobileOperationMenu; const share = ; const unshare = const shareDropdownItem = {gettext('Share')}; const unshareDropdownItem = {gettext('Unshare')}; if (isPro) { if (repo.owner_email.indexOf('@seafile_group') != -1) { // group owned repo if (isStaff) { if (repo.owner_email == currentGroup.id + '@seafile_group') { // this repo belongs to the current group desktopOperations = ( {share} {commonToggle} {commonOperationsInMenu} ); mobileOperationMenu = ( {shareDropdownItem} {gettext('Delete')} {commonOperationsInMenu} ); } else { desktopOperations = unshare; mobileOperationMenu = unshareDropdownItem; } } } else { desktopOperations = ( {isRepoOwner || isAdmin ? share : null} {isStaff || isRepoOwner || isAdmin ? unshare : null} ); mobileOperationMenu = ( {isRepoOwner || isAdmin ? shareDropdownItem : null} {isStaff || isRepoOwner || isAdmin ? unshareDropdownItem : null} ); } } else { desktopOperations = ( {isRepoOwner ? share : null} {isStaff || isRepoOwner ? unshare : null} ); mobileOperationMenu = ( {isRepoOwner ? shareDropdownItem : null} {isStaff || isRepoOwner ? unshareDropdownItem : null} ); } const mobileOperations = ( {commonToggle}
{mobileOperationMenu}
); return { desktopOperations, mobileOperations } } renderPCUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; let { desktopOperations } = this.generatorOperations(); return ( {iconTitle} {repo.repo_name} {desktopOperations} {repo.size} {moment(repo.last_modified).fromNow()} {isShowRepoOwner && {repo.owner_name}} ); } renderMobileUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; let { mobileOperations } = this.generatorOperations(); return ( {iconTitle}/ {repo.repo_name}
{isShowRepoOwner ? {repo.owner_name} : null} {repo.size} {moment(repo.last_modified).fromNow()} {mobileOperations} ); } render() { if (window.innerWidth >= 768) { return this.renderPCUI(); } else { return this.renderMobileUI(); } } } RepoListItem.propTypes = propTypes; export default RepoListItem;