import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap'; import { gettext, username, canGenerateShareLink, canGenerateUploadLink, canInvitePeople, additionalShareDialogNote } from '../../utils/constants'; import ShareToUser from './share-to-user'; import ShareToGroup from './share-to-group'; import ShareToInvitePeople from './share-to-invite-people'; import GenerateShareLink from './generate-share-link'; import GenerateUploadLink from './generate-upload-link'; import InternalLink from './internal-link'; import { seafileAPI } from '../../utils/seafile-api'; import Loading from '../loading'; import { Utils } from '../../utils/utils'; import toaster from '../toast'; import '../../css/share-link-dialog.css'; const propTypes = { isGroupOwnedRepo: PropTypes.bool, itemType: PropTypes.string.isRequired, // there will be three choose: ['library', 'dir', 'file'] itemName: PropTypes.string.isRequired, itemPath: PropTypes.string.isRequired, toggleDialog: PropTypes.func.isRequired, repoID: PropTypes.string.isRequired, repoEncrypted: PropTypes.bool, userPerm: PropTypes.string, enableDirPrivateShare: PropTypes.bool, }; class ShareDialog extends React.Component { constructor(props) { super(props); this.state = { activeTab: this.getInitialActiveTab(), isRepoJudgemented: false, isRepoOwner: false, }; } componentDidMount() { let repoID = this.props.repoID; seafileAPI.getRepoInfo(repoID).then(res => { let isRepoOwner = res.data.owner_email === username; this.setState({ isRepoJudgemented: true, isRepoOwner: isRepoOwner, }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } getInitialActiveTab = () => { const { repoEncrypted, userPerm, enableDirPrivateShare } = this.props; const enableShareLink = !repoEncrypted && canGenerateShareLink; const enableUploadLink = !repoEncrypted && canGenerateUploadLink && userPerm == 'rw'; if (enableShareLink) { return 'shareLink'; } else if (enableUploadLink) { return 'uploadLink'; } else if (enableDirPrivateShare) { return 'shareToUser'; } } toggle = (tab) => { if (this.state.activeTab !== tab) { this.setState({ activeTab: tab }); } } renderDirContent = () => { if (!this.state.isRepoJudgemented) { return ; } let activeTab = this.state.activeTab; const { repoEncrypted, userPerm, enableDirPrivateShare, itemType } = this.props; const enableShareLink = !repoEncrypted && canGenerateShareLink; const enableUploadLink = !repoEncrypted && canGenerateUploadLink && userPerm == 'rw'; return (
{(enableShareLink && activeTab === 'shareLink') && } {(enableUploadLink && activeTab === 'uploadLink') && } {(itemType === 'dir' && activeTab === 'internalLink') && } {enableDirPrivateShare && {activeTab === 'shareToUser' && } {activeTab === 'shareToGroup' && } {(canInvitePeople && activeTab === 'invitePeople') && } }
); } renderFileContent = () => { let activeTab = this.state.activeTab; const { itemType } = this.props; return (
{activeTab === 'shareLink' && } {activeTab === 'internalLink' && }
); } renderExternalShareMessage = () => { if (additionalShareDialogNote && (typeof additionalShareDialogNote) === 'object') { return (
{additionalShareDialogNote.title}
{additionalShareDialogNote.content}
); } return null; } render() { const { itemType, itemName, repoEncrypted } = this.props; const enableShareLink = !repoEncrypted && canGenerateShareLink; return (
{gettext('Share')} {itemName} {this.renderExternalShareMessage()} {(itemType === 'library' || itemType === 'dir') && this.renderDirContent()} {(itemType === 'file' && enableShareLink) && this.renderFileContent()}
); } } ShareDialog.propTypes = propTypes; export default ShareDialog;