@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
94 lines (92 loc) • 4.31 kB
JavaScript
import { useEffect, useMemo, useRef } from 'react';
import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
import prepareExtensionProvider from '../../utils/prepare-extension-provider';
import prepareQuickInsertProvider from '../../utils/prepare-quick-insert-provider';
import getProvidersFromEditorProps from '../utils/getProvidersFromEditorProps';
import handleProviders from '../utils/handleProviders';
function useEditorRef(
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
preset) {
var apiRef = useRef();
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 = prepareExtensionProvider(function () {
return editorActions;
})(extensionProviders);
var quickInsertProvider = prepareQuickInsertProvider(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
*/
export default 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 = useMemo(function () {
return getProvidersFromEditorProps({
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 = useRef(new ProviderFactory());
var editorRef = useEditorRef(props.preset);
var preparedProviders = 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]);
useEffect(function () {
handleProviders(providerFactory.current, providers, preparedProviders.extensionProvider, preparedProviders.quickInsertProvider);
}, [providers, preparedProviders]);
// componentWillUnmount equivalent
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;
}