// @flow 'no babel-plugin-flow-react-proptypes'; // turn off this plugin because it breaks the IntlShape flow type import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import type { IntlShape } from 'react-intl'; import PlainButton from '../../components/plain-button'; import Button from '../../components/button'; import TextInputWithCopyButton from '../../components/text-input-with-copy-button'; import Toggle from '../../components/toggle/Toggle'; import Tooltip from '../../components/tooltip'; import { convertToMs } from '../../utils/datetime'; import IconMail from '../../icons/general/IconMail'; import IconClock from '../../icons/general/IconClock'; import IconGlobe from '../../icons/general/IconGlobe'; import { bdlWatermelonRed } from '../../styles/variables'; import type { ItemType } from '../../common/types/core'; import { isBoxNote } from '../../utils/file'; import convertToBoxItem from './utils/item'; import SharedLinkAccessMenu from './SharedLinkAccessMenu'; import SharedLinkPermissionMenu from './SharedLinkPermissionMenu'; import messages from './messages'; import type { accessLevelType, item as itemtype, permissionLevelType, sharedLinkType, sharedLinkTrackingType, tooltipComponentIdentifierType, } from './flowTypes'; import { PEOPLE_IN_ITEM, ANYONE_WITH_LINK, CAN_VIEW_DOWNLOAD, CAN_VIEW_ONLY } from './constants'; type Props = { autofocusSharedLink?: boolean, changeSharedLinkAccessLevel: (newAccessLevel: accessLevelType) => Promise<{ accessLevel: accessLevelType }>, changeSharedLinkPermissionLevel: ( newPermissionLevel: permissionLevelType, ) => Promise<{ permissionLevel: permissionLevelType }>, classificationName?: string, intl: IntlShape, item: itemtype, itemType: ItemType, onDismissTooltip: (componentIdentifier: tooltipComponentIdentifierType) => void, onEmailSharedLinkClick: Function, onSettingsClick?: Function, onToggleSharedLink: Function, sharedLink: sharedLinkType, showSharedLinkSettingsCallout: boolean, submitting: boolean, tooltips: { [componentIdentifier: tooltipComponentIdentifierType]: React.Node }, trackingProps: sharedLinkTrackingType, triggerCopyOnLoad?: boolean, }; class SharedLinkSection extends React.Component { static defaultProps = { trackingProps: {}, }; canAddSharedLink = (isSharedLinkEnabled: boolean, canAddLink: boolean) => { return !isSharedLinkEnabled && canAddLink; }; canRemoveSharedLink = (isSharedLinkEnabled: boolean, canRemoveLink: boolean) => { return isSharedLinkEnabled && canRemoveLink; }; renderSharedLink() { const { autofocusSharedLink, changeSharedLinkAccessLevel, changeSharedLinkPermissionLevel, classificationName, item, itemType, onDismissTooltip, onEmailSharedLinkClick, sharedLink, submitting, trackingProps, triggerCopyOnLoad, tooltips, } = this.props; const { accessLevel, allowedAccessLevels, canChangeAccessLevel, enterpriseName, isEditAllowed, isDownloadSettingAvailable, permissionLevel, url, } = sharedLink; const { copyButtonProps, onChangeSharedLinkAccessLevel, onChangeSharedLinkPermissionLevel, onSharedLinkAccessMenuOpen, onSharedLinkCopy, sendSharedLinkButtonProps, sharedLinkAccessMenuButtonProps, sharedLinkPermissionsMenuButtonProps, } = trackingProps; const isEditableBoxNote = isBoxNote(convertToBoxItem(item)) && isEditAllowed; let allowedPermissionLevels = [CAN_VIEW_DOWNLOAD, CAN_VIEW_ONLY]; if (!canChangeAccessLevel) { // remove all but current level allowedPermissionLevels = allowedPermissionLevels.filter(level => level === permissionLevel); } // if we cannot set the download value, we remove this option from the dropdown if (!isDownloadSettingAvailable) { allowedPermissionLevels = allowedPermissionLevels.filter(level => level !== CAN_VIEW_DOWNLOAD); } return (
onDismissTooltip('shared-link-copy-button')} position="middle-right" showCloseButton text={tooltips['shared-link-copy-button']} theme="callout" > }>
onDismissTooltip('shared-link-access-menu')} tooltipContent={tooltips['shared-link-access-menu'] || null} submitting={submitting} trackingProps={{ onChangeSharedLinkAccessLevel, onSharedLinkAccessMenuOpen, sharedLinkAccessMenuButtonProps, }} /> {!isEditableBoxNote && accessLevel !== PEOPLE_IN_ITEM && ( )} {isEditableBoxNote && ( }> )}
{accessLevel === ANYONE_WITH_LINK && (
)}
); } renderSharedLinkSettingsLink() { const { intl, onDismissTooltip, onSettingsClick, showSharedLinkSettingsCallout, trackingProps, tooltips, } = this.props; const { sharedLinkSettingsButtonProps } = trackingProps; return (
onDismissTooltip('shared-link-settings')} position="middle-right" showCloseButton text={ tooltips['shared-link-settings'] || ( ) } theme="callout" >
); } renderToggle() { const { item, onDismissTooltip, onToggleSharedLink, sharedLink, submitting, tooltips } = this.props; const { canChangeAccessLevel, expirationTimestamp } = sharedLink; const isSharedLinkEnabled = !!sharedLink.url; let linkText; if (isSharedLinkEnabled) { linkText = ; if (expirationTimestamp && expirationTimestamp !== 0) { linkText = ( } > ); } } else { linkText = ; } const isToggleEnabled = (this.canAddSharedLink(isSharedLinkEnabled, item.grantedPermissions.itemShare) || this.canRemoveSharedLink(isSharedLinkEnabled, canChangeAccessLevel)) && !submitting; const toggleComponent = (
); if (!submitting) { if (this.canAddSharedLink(isSharedLinkEnabled, item.grantedPermissions.itemShare)) { const sharedLinkToggleTooltip = tooltips['shared-link-toggle']; if (sharedLinkToggleTooltip) { return ( onDismissTooltip('shared-link-toggle')} position="middle-left" showCloseButton text={sharedLinkToggleTooltip} theme="callout" > {toggleComponent} ); } return ( } > {toggleComponent} ); } if (!this.canRemoveSharedLink(isSharedLinkEnabled, canChangeAccessLevel)) { return ( }> {toggleComponent} ); } } return toggleComponent; } render() { const { sharedLink, onSettingsClick } = this.props; const isSharedLinkEnabled = !!sharedLink.url; return (

{/* eslint-disable-next-line jsx-a11y/label-has-for */}
{this.renderToggle()} {isSharedLinkEnabled && onSettingsClick && this.renderSharedLinkSettingsLink()}
{isSharedLinkEnabled && this.renderSharedLink()}
); } } export default SharedLinkSection;