import React from 'react';
import { Node as PMNode } from 'prosemirror-model';
import { EditorView, NodeView } from 'prosemirror-view';
import { InjectedIntlProps, injectIntl } from 'react-intl';
import styled from 'styled-components';
import { ZERO_WIDTH_SPACE } from '@atlaskit/editor-common';
import { Color, Status, StatusStyle } from '@atlaskit/status/element';
import { EventDispatcher } from '../../../event-dispatcher';
import { getPosHandler, ReactNodeView } from '../../../nodeviews';
import InlineNodeWrapper, {
createMobileInlineDomRef,
} from '../../../ui/InlineNodeWrapper';
import { PortalProviderAPI } from '../../../ui/PortalProvider';
import { StatusPluginOptions } from '../types';
import { messages } from './messages';
export interface StyledStatusProps {
placeholderStyle: boolean;
}
export const StyledStatus = styled.span`
opacity: ${(props: StyledStatusProps) => (props.placeholderStyle ? 0.5 : 1)};
`;
export interface ContainerProps {
view: EditorView;
text?: string;
color: Color;
style?: StatusStyle;
localId?: string;
eventDispatcher?: EventDispatcher;
}
class StatusContainerView extends React.Component<
ContainerProps & InjectedIntlProps,
{}
> {
static displayName = 'StatusContainerView';
constructor(props: ContainerProps & InjectedIntlProps) {
super(props);
}
render() {
const {
text,
color,
localId,
style,
intl: { formatMessage },
} = this.props;
const statusText = text ? text : formatMessage(messages.placeholder);
return (
);
}
private handleClick = (event: React.SyntheticEvent) => {
if (event.nativeEvent.stopImmediatePropagation) {
event.nativeEvent.stopImmediatePropagation();
}
// handling of popup is done in plugin.apply on selection change.
};
}
export const IntlStatusContainerView = injectIntl(StatusContainerView);
export interface Props {
options?: StatusPluginOptions;
}
export class StatusNodeView extends ReactNodeView {
createDomRef() {
if (
this.reactComponentProps.options &&
this.reactComponentProps.options.useInlineWrapper
) {
return createMobileInlineDomRef();
}
return super.createDomRef();
}
setDomAttrs(node: PMNode, element: HTMLElement) {
const { color, localId, style } = node.attrs;
element.dataset.color = color;
element.dataset.localId = localId;
element.dataset.style = style;
}
render(props: Props) {
const { options } = props;
const { text, color, localId, style } = this.node.attrs;
return (
{options && options.allowZeroWidthSpaceAfter && ZERO_WIDTH_SPACE}
);
}
}
export default function statusNodeView(
portalProviderAPI: PortalProviderAPI,
eventDispatcher: EventDispatcher,
options?: StatusPluginOptions,
) {
return (node: PMNode, view: EditorView, getPos: getPosHandler): NodeView =>
new StatusNodeView(node, view, getPos, portalProviderAPI, eventDispatcher, {
options,
}).init();
}