UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

94 lines (92 loc) 4.31 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) { 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; }