import React from 'react';
import styled from 'styled-components';
import ButtonGroup from '@atlaskit/button/button-group';
import Button from '@atlaskit/button/custom-theme-button';
import { borderRadius } from '@atlaskit/theme/constants';
import { N40 } from '@atlaskit/theme/colors';
import Toolbar from '../../Toolbar';
import PluginSlot from '../../PluginSlot';
import WithPluginState from '../../WithPluginState';
import ContentStyles from '../../ContentStyles';
import {
EditorAppearanceComponentProps,
EditorAppearance,
} from '../../../types';
import {
pluginKey as maxContentSizePluginKey,
MaxContentSizePluginState,
} from '../../../plugins/max-content-size';
import { stateKey as mediaPluginKey } from '../../../plugins/media/pm-plugins/plugin-key';
import { ClickAreaBlock } from '../../Addon';
import { tableCommentEditorStyles } from '../../../plugins/table/ui/common-styles.css';
import WithFlash from '../../WithFlash';
import { WidthConsumer } from '@atlaskit/editor-common';
import { akEditorMobileBreakoutPoint } from '@atlaskit/editor-shared-styles';
import WidthEmitter from '../../WidthEmitter';
import { GRID_GUTTER } from '../../../plugins/grid';
import classnames from 'classnames';
import { InjectedIntlProps, injectIntl } from 'react-intl';
import messages from '../../../messages';
import { MediaPluginState } from '../../../plugins/media/pm-plugins/types';
import {
TableControlsPadding,
MainToolbar,
MainToolbarCustomComponentsSlot,
} from './Toolbar';
export interface CommentEditorProps {
isMaxContentSizeReached?: boolean;
maxHeight?: number;
}
const CommentEditorMargin = 14;
const CommentEditorSmallerMargin = 8;
const CommentEditor: any = styled.div`
display: flex;
flex-direction: column;
.less-margin .ProseMirror {
margin: 12px ${CommentEditorSmallerMargin}px ${CommentEditorSmallerMargin}px;
}
min-width: 272px;
/* Border + Toolbar + Footer + (Paragraph + ((Parahraph + Margin) * (DefaultLines - 1)) */
/* calc(2px + 40px + 24px + ( 20px + (32px * 2))) */
min-height: 150px;
height: auto;
${(props: CommentEditorProps) =>
props.maxHeight
? 'max-height: ' + props.maxHeight + 'px;'
: ''} background-color: white;
border: 1px solid ${N40};
box-sizing: border-box;
border-radius: ${borderRadius()}px;
max-width: inherit;
word-wrap: break-word;
`;
CommentEditor.displayName = 'CommentEditor';
const ContentArea = styled(ContentStyles)`
flex-grow: 1;
overflow-x: hidden;
overflow-y: auto;
line-height: 24px;
/** Hack for Bitbucket to ensure entire editorView gets drop event; see ED-3294 **/
/** Hack for tables controlls. Otherwise marging collapse and controlls are misplaced. **/
.ProseMirror {
margin: 12px ${CommentEditorMargin}px ${CommentEditorMargin}px;
}
.gridParent {
margin-left: ${CommentEditorMargin - GRID_GUTTER}px;
margin-right: ${CommentEditorMargin - GRID_GUTTER}px;
width: calc(100% + ${CommentEditorMargin - GRID_GUTTER}px);
}
padding: ${TableControlsPadding}px;
${tableCommentEditorStyles};
`;
ContentArea.displayName = 'ContentArea';
const SecondaryToolbar = styled.div`
box-sizing: border-box;
justify-content: flex-end;
align-items: center;
display: flex;
padding: 12px 1px;
`;
SecondaryToolbar.displayName = 'SecondaryToolbar';
export interface EditorAppearanceComponentState {}
class Editor extends React.Component<
EditorAppearanceComponentProps & InjectedIntlProps,
EditorAppearanceComponentState
> {
static displayName = 'CommentEditorAppearance';
private appearance: EditorAppearance = 'comment';
private containerElement: HTMLElement | null = null;
private handleSave = () => {
if (this.props.editorView && this.props.onSave) {
this.props.onSave(this.props.editorView);
}
};
private handleCancel = () => {
if (this.props.editorView && this.props.onCancel) {
this.props.onCancel(this.props.editorView);
}
};
private renderChrome = ({
maxContentSize,
mediaState,
}: {
maxContentSize?: MaxContentSizePluginState;
mediaState?: MediaPluginState;
}) => {
const {
editorDOMElement,
editorView,
editorActions,
eventDispatcher,
providerFactory,
contentComponents,
customContentComponents,
customPrimaryToolbarComponents,
primaryToolbarComponents,
customSecondaryToolbarComponents,
popupsMountPoint,
popupsBoundariesElement,
popupsScrollableElement,
maxHeight,
onSave,
onCancel,
disabled,
dispatchAnalyticsEvent,
intl,
useStickyToolbar,
} = this.props;
const maxContentSizeReached = Boolean(
maxContentSize?.maxContentSizeReached,
);
const showSecondaryToolbar =
!!onSave || !!onCancel || !!customSecondaryToolbarComponents;
return (
{customPrimaryToolbarComponents}
{({ width }) => {
return (
(this.containerElement = ref)}
className={classnames('ak-editor-content-area', {
'less-margin': width < akEditorMobileBreakoutPoint,
})}
>
{customContentComponents}
{editorDOMElement}
);
}}
{showSecondaryToolbar && (
{!!onSave && (
)}
{!!onCancel && (
)}
{customSecondaryToolbarComponents}
)}
);
};
render() {
return (
);
}
}
export const CommentEditorWithIntl = injectIntl(Editor);