@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
89 lines (87 loc) • 3.55 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) {
const apiRef = useRef();
useEffect(() => {
return preset === null || preset === void 0 ? void 0 : preset.apiResolver.on(api => {
apiRef.current = api;
});
}, [preset === null || preset === void 0 ? void 0 : preset.apiResolver]);
return apiRef;
}
function prepareProviders(editorActions, apiRef, quickInsert, extensionProviders, createAnalyticsEvent) {
const extensionProvider = prepareExtensionProvider(() => editorActions)(extensionProviders);
const quickInsertProvider = prepareQuickInsertProvider(editorActions, apiRef, extensionProvider, quickInsert, createAnalyticsEvent);
return {
extensionProvider,
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) {
const {
autoformattingProvider,
emojiProvider,
mentionProvider,
legacyImageUploadProvider,
taskDecisionProvider,
contextIdentifierProvider,
searchProvider,
macroProvider,
activityProvider,
collabEdit,
collabEditProvider,
presenceProvider,
quickInsert,
extensionProviders
} = props;
const providers = useMemo(() => getProvidersFromEditorProps({
autoformattingProvider,
emojiProvider,
mentionProvider,
legacyImageUploadProvider,
taskDecisionProvider,
contextIdentifierProvider,
searchProvider,
macroProvider,
activityProvider,
collabEdit,
collabEditProvider,
presenceProvider
}), [autoformattingProvider, emojiProvider, mentionProvider, legacyImageUploadProvider, taskDecisionProvider, contextIdentifierProvider, searchProvider, macroProvider, activityProvider, collabEdit, collabEditProvider, presenceProvider]);
const providerFactory = useRef(new ProviderFactory());
const editorRef = useEditorRef(props.preset);
const preparedProviders = useMemo(() =>
// 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(() => {
handleProviders(providerFactory.current, providers, preparedProviders.extensionProvider, preparedProviders.quickInsertProvider);
}, [providers, preparedProviders]);
// componentWillUnmount equivalent
useEffect(() => {
return () => {
// 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;
}