UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

125 lines 4.87 kB
import _extends from "@babel/runtime/helpers/extends"; /** * @jsxRuntime classic * @jsx jsx */ import { useCallback } from 'react'; // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766 import { jsx } from '@emotion/react'; import { useIntl } from 'react-intl'; import withAnalyticsContext from '@atlaskit/analytics-next/withAnalyticsContext'; import DropdownMenu, { DropdownItem, DropdownItemGroup } from '@atlaskit/dropdown-menu'; import ChevronDownIcon from '@atlaskit/icon/core/chevron-down'; import PreferencesIcon from '@atlaskit/icon/core/customize'; import LinkExternalIcon from '@atlaskit/icon/core/link-external'; import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals'; import { cardMessages as messages } from '../../messages'; import { StyledButton } from './StyledButton'; import { useLinkOverlayAnalyticsEvents } from './useLinkOverlayAnalyticsEvents'; const SMALL_LINK_TOOLBAR_ANALYTICS_SOURCE = 'smallLinkToolbar'; const Dropdown = ({ onConfigureClick: onConfigureClickCallback, onOpenLinkClick: onOpenLinkClickCallback, onDropdownChange, editorView, testId }) => { const { formatMessage } = useIntl(); const configureLinkLabel = formatMessage(messages.inlineConfigureLink); const goToLinkLabel = formatMessage(messages.inlineGoToLink); const { fireActionClickEvent, fireLinkClickEvent, fireToolbarViewEvent } = useLinkOverlayAnalyticsEvents(); const focusEditor = useCallback(() => { // Fix dropdown giving focus back to the trigger async which is then unmounted and losing focus // this is happening deep within atlaskit dropdown as a result of this code: https://github.com/focus-trap/focus-trap/blob/master/index.js#L987 // use setTimeout to run this async after that call setTimeout(() => editorView.focus(), 0); }, [editorView]); const onOpenChange = useCallback(({ isOpen, event }) => { onDropdownChange === null || onDropdownChange === void 0 ? void 0 : onDropdownChange(isOpen); if (isOpen) { fireToolbarViewEvent(); } if (!isOpen && event instanceof KeyboardEvent) { focusEditor(); } }, [fireToolbarViewEvent, focusEditor, onDropdownChange]); const onGoToLinkClick = useCallback(event => { fireActionClickEvent('goToLink'); onOpenLinkClickCallback === null || onOpenLinkClickCallback === void 0 ? void 0 : onOpenLinkClickCallback(event); focusEditor(); }, [fireActionClickEvent, focusEditor, onOpenLinkClickCallback]); const onConfigureClick = useCallback(() => { fireActionClickEvent('configureLink'); onConfigureClickCallback === null || onConfigureClickCallback === void 0 ? void 0 : onConfigureClickCallback(); focusEditor(); }, [fireActionClickEvent, focusEditor, onConfigureClickCallback]); const memoizedTrigger = useCallback(({ onClick, triggerRef, ...props }) => jsx(StyledButton, _extends({ innerRef: triggerRef // Ignored via go/ees005 // eslint-disable-next-line react/jsx-props-no-spreading }, props, { iconBefore: jsx(ChevronDownIcon, { label: configureLinkLabel, size: "small" }) // eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- intentional: onClick closes over per-render trigger prop , onClick: e => { onClick === null || onClick === void 0 ? void 0 : onClick(e); fireLinkClickEvent(); } })), [configureLinkLabel, fireLinkClickEvent]); return jsx(DropdownMenu, { trigger: expValEquals('platform_editor_perf_lint_cleanup', 'isEnabled', true) ? memoizedTrigger : ({ onClick, triggerRef, ...props }) => jsx(StyledButton, _extends({ innerRef: triggerRef // Ignored via go/ees005 // eslint-disable-next-line react/jsx-props-no-spreading }, props, { iconBefore: jsx(ChevronDownIcon, { label: configureLinkLabel, size: "small" }) // eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- intentional fallback for experiment off path , onClick: e => { onClick === null || onClick === void 0 ? void 0 : onClick(e); fireLinkClickEvent(); } })), testId: `${testId}-dropdown`, onOpenChange: onOpenChange }, jsx(DropdownItemGroup, null, jsx(DropdownItem, { elemBefore: jsx(LinkExternalIcon, { label: goToLinkLabel }), testId: `${testId}-dropdown-item-open-link`, onClick: onGoToLinkClick }, goToLinkLabel), jsx(DropdownItem, { elemBefore: jsx(PreferencesIcon, { label: configureLinkLabel }), onClick: onConfigureClick, testId: `${testId}-dropdown-item-configure` }, configureLinkLabel))); }; const _default_1 = withAnalyticsContext({ source: SMALL_LINK_TOOLBAR_ANALYTICS_SOURCE })(Dropdown); export default _default_1;