UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

89 lines (87 loc) 3.55 kB
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; }