@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
101 lines (98 loc) • 4.74 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useProviderFactory;
var _react = require("react");
var _providerFactory = require("@atlaskit/editor-common/provider-factory");
var _prepareExtensionProvider = _interopRequireDefault(require("../../utils/prepare-extension-provider"));
var _prepareQuickInsertProvider = _interopRequireDefault(require("../../utils/prepare-quick-insert-provider"));
var _getProvidersFromEditorProps = _interopRequireDefault(require("../utils/getProvidersFromEditorProps"));
var _handleProviders = _interopRequireDefault(require("../utils/handleProviders"));
function useEditorRef(
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
preset) {
var apiRef = (0, _react.useRef)();
(0, _react.useEffect)(function () {
return preset === null || preset === void 0 ? void 0 : preset.apiResolver.on(function (api) {
apiRef.current = api;
});
}, [preset === null || preset === void 0 ? void 0 : preset.apiResolver]);
return apiRef;
}
function prepareProviders(editorActions, apiRef, quickInsert, extensionProviders, createAnalyticsEvent) {
var extensionProvider = (0, _prepareExtensionProvider.default)(function () {
return editorActions;
})(extensionProviders);
var quickInsertProvider = (0, _prepareQuickInsertProvider.default)(editorActions, apiRef, extensionProvider, quickInsert, createAnalyticsEvent);
return {
extensionProvider: extensionProvider,
quickInsertProvider: quickInsertProvider
};
}
/**
*
* This hook is used to create the provider factory object.
*
* @param props
* @param editorActions
* @param createAnalyticsEvent
* @returns ProviderFactory for Editor
*/
function useProviderFactory(props, editorActions, createAnalyticsEvent) {
var autoformattingProvider = props.autoformattingProvider,
emojiProvider = props.emojiProvider,
mentionProvider = props.mentionProvider,
legacyImageUploadProvider = props.legacyImageUploadProvider,
taskDecisionProvider = props.taskDecisionProvider,
contextIdentifierProvider = props.contextIdentifierProvider,
searchProvider = props.searchProvider,
macroProvider = props.macroProvider,
activityProvider = props.activityProvider,
collabEdit = props.collabEdit,
collabEditProvider = props.collabEditProvider,
presenceProvider = props.presenceProvider,
quickInsert = props.quickInsert,
extensionProviders = props.extensionProviders;
var providers = (0, _react.useMemo)(function () {
return (0, _getProvidersFromEditorProps.default)({
autoformattingProvider: autoformattingProvider,
emojiProvider: emojiProvider,
mentionProvider: mentionProvider,
legacyImageUploadProvider: legacyImageUploadProvider,
taskDecisionProvider: taskDecisionProvider,
contextIdentifierProvider: contextIdentifierProvider,
searchProvider: searchProvider,
macroProvider: macroProvider,
activityProvider: activityProvider,
collabEdit: collabEdit,
collabEditProvider: collabEditProvider,
presenceProvider: presenceProvider
});
}, [autoformattingProvider, emojiProvider, mentionProvider, legacyImageUploadProvider, taskDecisionProvider, contextIdentifierProvider, searchProvider, macroProvider, activityProvider, collabEdit, collabEditProvider, presenceProvider]);
var providerFactory = (0, _react.useRef)(new _providerFactory.ProviderFactory());
var editorRef = useEditorRef(props.preset);
var preparedProviders = (0, _react.useMemo)(function () {
return (
// Though this will introduce some performance regression related to quick insert
// loading but we can remove it soon when Forge will move to new API.
// quickInsert={Promise.resolve(consumerQuickInsert)} is one of the main reason behind this performance issue.
prepareProviders(editorActions, editorRef, quickInsert, extensionProviders, createAnalyticsEvent)
);
}, [extensionProviders, quickInsert, editorActions, createAnalyticsEvent, editorRef]);
(0, _react.useEffect)(function () {
(0, _handleProviders.default)(providerFactory.current, providers, preparedProviders.extensionProvider, preparedProviders.quickInsertProvider);
}, [providers, preparedProviders]);
// componentWillUnmount equivalent
(0, _react.useEffect)(function () {
return function () {
// Disable this next line because it is not a React node
// so we can safely call destroy on the ref.
// eslint-disable-next-line react-hooks/exhaustive-deps
providerFactory.current.destroy();
};
}, []);
return providerFactory.current;
}