UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

60 lines (58 loc) 1.79 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import { useLayoutEffect, useMemo, useState } from 'react'; import { EditorPresetBuilder } from '@atlaskit/editor-common/preset'; // eslint-disable-next-line @typescript-eslint/no-explicit-any /** * Creates a preset. * * Takes an input function that returns a preset (and memoizes it) depending * on the dependency array provided. * * Returns a pluginInjectionApi in order to apply actions and subscribe to plugin * changes outside of the editor. * * @param createPreset * @param dependencies * @returns PresetAPI ({ pluginInjectionApi, preset, actionBuilder }) * * Example: * ```ts * function ExampleEditor() { * const { preset, editorApi } = usePreset((builder) => * builder.add(plugin1).add(plugin2) * , []); * * // Can execute typesafe commands based on plugin1 or 2 * const runCommand = () => editorApi.core.actions.execute( * editorApi.plugin1.commands.doSomething() * ) * return ( * <> * <Editor preset={preset} /> * <Button onClick={runCommand}>Run command</Button> * </> * ) * } * ``` */ export function usePreset(createPreset) { var dependencies = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var _useState = useState(undefined), _useState2 = _slicedToArray(_useState, 2), editorApi = _useState2[0], setAPI = _useState2[1]; var preset = useMemo(function () { return createPreset(new EditorPresetBuilder()); }, // eslint-disable-next-line react-hooks/exhaustive-deps dependencies); useLayoutEffect(function () { return preset.apiResolver.on(function (api) { setAPI(api); }); }, [preset.apiResolver]); return { editorApi: editorApi, preset: preset }; }