@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
133 lines (130 loc) • 4.67 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import React, { PureComponent, useLayoutEffect, useRef, useState } from 'react';
import { ResourcedMention } from '@atlaskit/mention/element';
import ResourcedMentionWithProfilecard from './mention-with-profilecard';
const GENERIC_USER_IDS = ['HipChat', 'all', 'here'];
const noop = () => {};
export const MentionWithProviders = ({
accessLevel,
eventHandlers,
id,
mentionProvider,
profilecardProvider: profilecardProviderResolver,
text,
localId
}) => {
const [profilecardProvider, setProfilecardProvider] = useState(null);
const mountedRef = useRef(true);
useLayoutEffect(() => {
mountedRef.current = true;
return () => {
mountedRef.current = false;
};
}, []);
useLayoutEffect(() => {
// We are not using async/await here to avoid having an intermediate Promise
// introduced by the transpiler.
// This will allow consumer to use a SynchronousPromise.resolve and avoid useless
// rerendering
profilecardProviderResolver === null || profilecardProviderResolver === void 0 ? void 0 : profilecardProviderResolver.then(result => {
if (mountedRef.current) {
setProfilecardProvider(result);
}
}).catch(() => {
if (mountedRef.current) {
setProfilecardProvider(null);
}
});
}, [profilecardProviderResolver]);
const MentionComponent = profilecardProvider && profilecardProviderResolver && GENERIC_USER_IDS.indexOf(id) === -1 ? ResourcedMentionWithProfilecard : ResourcedMention;
return /*#__PURE__*/React.createElement(MentionComponent, {
id: id,
text: text,
accessLevel: accessLevel,
localId: localId,
mentionProvider: mentionProvider
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
,
profilecardProvider: profilecardProvider,
onClick: eventHandlers === null || eventHandlers === void 0 ? void 0 : eventHandlers.onClick,
onMouseEnter: eventHandlers === null || eventHandlers === void 0 ? void 0 : eventHandlers.onMouseEnter,
onMouseLeave: eventHandlers === null || eventHandlers === void 0 ? void 0 : eventHandlers.onMouseLeave
});
};
// eslint-disable-next-line @repo/internal/react/no-class-components
export class MentionWithProvidersOld extends PureComponent {
constructor(...args) {
super(...args);
_defineProperty(this, "state", {
profilecardProvider: null
});
}
// Ignored via go/ees005
// eslint-disable-next-line react/no-unsafe
UNSAFE_componentWillMount() {
this.updateProfilecardProvider(this.props);
}
// Ignored via go/ees005
// eslint-disable-next-line react/no-unsafe
UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.profilecardProvider !== this.props.profilecardProvider) {
this.updateProfilecardProvider(nextProps);
}
}
updateProfilecardProvider(props) {
// We are not using async/await here to avoid having an intermediate Promise
// introduced by the transpiler.
// This will allow consumer to use a SynchronousPromise.resolve and avoid useless
// rerendering
if (props.profilecardProvider) {
props.profilecardProvider.then(profilecardProvider => {
this.setState({
profilecardProvider
});
}).catch(() => {
this.setState({
profilecardProvider: null
});
});
} else {
this.setState({
profilecardProvider: null
});
}
}
render() {
const {
accessLevel,
eventHandlers,
id,
mentionProvider,
text,
localId
} = this.props;
const {
profilecardProvider
} = this.state;
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const actionHandlers = {};
['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(handler => {
actionHandlers[handler] = eventHandlers && eventHandlers[handler] || noop;
});
const MentionComponent = profilecardProvider && GENERIC_USER_IDS.indexOf(id) === -1 ? ResourcedMentionWithProfilecard : ResourcedMention;
return /*#__PURE__*/React.createElement(MentionComponent, _extends({
id: id,
text: text,
accessLevel: accessLevel,
localId: localId,
mentionProvider: mentionProvider
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
,
profilecardProvider: profilecardProvider
// Ignored via go/ees005
// eslint-disable-next-line react/jsx-props-no-spreading
}, actionHandlers));
}
}