// @flow import * as React from 'react'; import { Redirect } from 'react-router-dom'; import { observable } from 'mobx'; import { inject, observer } from 'mobx-react'; import { MoreIcon } from 'outline-icons'; import Document from 'models/Document'; import UiStore from 'stores/UiStore'; import AuthStore from 'stores/AuthStore'; import CollectionStore from 'stores/CollectionsStore'; import { documentMoveUrl, documentHistoryUrl, newDocumentUrl, } from 'utils/routeHelpers'; import { DropdownMenu, DropdownMenuItem } from 'components/DropdownMenu'; type Props = { ui: UiStore, auth: AuthStore, label?: React.Node, position?: 'left' | 'right' | 'center', document: Document, collections: CollectionStore, className: string, showPrint?: boolean, showToggleEmbeds?: boolean, showPin?: boolean, onOpen?: () => void, onClose?: () => void, }; @observer class DocumentMenu extends React.Component { @observable redirectTo: ?string; componentDidUpdate() { this.redirectTo = undefined; } handleNewChild = (ev: SyntheticEvent<*>) => { const { document } = this.props; this.redirectTo = newDocumentUrl(document.collectionId, document.id); }; handleDelete = (ev: SyntheticEvent<*>) => { const { document } = this.props; this.props.ui.setActiveModal('document-delete', { document }); }; handleDocumentHistory = () => { this.redirectTo = documentHistoryUrl(this.props.document); }; handleMove = (ev: SyntheticEvent<*>) => { this.redirectTo = documentMoveUrl(this.props.document); }; handleDuplicate = async (ev: SyntheticEvent<*>) => { const duped = await this.props.document.duplicate(); // when duplicating, go straight to the duplicated document content this.redirectTo = duped.url; this.props.ui.showToast('Document duplicated'); }; handleArchive = async (ev: SyntheticEvent<*>) => { await this.props.document.archive(); this.props.ui.showToast('Document archived'); }; handleRestore = async (ev: SyntheticEvent<*>) => { await this.props.document.restore(); this.props.ui.showToast('Document restored'); }; handlePin = (ev: SyntheticEvent<*>) => { this.props.document.pin(); }; handleUnpin = (ev: SyntheticEvent<*>) => { this.props.document.unpin(); }; handleStar = (ev: SyntheticEvent<*>) => { this.props.document.star(); }; handleUnstar = (ev: SyntheticEvent<*>) => { this.props.document.unstar(); }; handleExport = (ev: SyntheticEvent<*>) => { this.props.document.download(); }; handleShareLink = async (ev: SyntheticEvent<*>) => { const { document } = this.props; if (!document.shareUrl) await document.share(); this.props.ui.setActiveModal('document-share', { document }); }; render() { if (this.redirectTo) return ; const { document, position, label, className, showPrint, showPin, auth, onOpen, onClose, } = this.props; const canShareDocuments = auth.team && auth.team.sharing; if (document.isArchived) { return ( } className={className}> Restore Delete… ); } return ( } className={className} position={position} onOpen={onOpen} onClose={onClose} > {!document.isDraft ? ( {showPin && (document.pinned ? ( Unpin ) : ( Pin to collection ))} {document.isStarred ? ( Unstar ) : ( Star )} {canShareDocuments && ( Share link… )}
Document history New child document Duplicate Archive Delete… Move…
) : ( {canShareDocuments && ( Share link… )} Delete… )}
Download {showPrint && ( Print )}
); } } export default inject('ui', 'auth', 'collections')(DocumentMenu);