UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

101 lines (98 loc) 4.74 kB
"use strict"; 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; }