/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
import type {JSX} from 'react';
import {LexicalBuilder} from '@lexical/extension';
import invariant from '@lexical/internal/invariant';
import {ReactProviderExtension} from '@lexical/react/ReactProviderExtension';
import {type LexicalEditor} from 'lexical';
import {type ErrorBoundaryType, useDecorators} from './useDecorators';
export {type ErrorBoundaryType};
function isUsingReactExtension(editor: LexicalEditor): boolean {
const builder = LexicalBuilder.maybeFromEditor(editor);
if (builder && builder.hasExtensionByName(ReactProviderExtension.name)) {
for (const name of ['@lexical/plain-text', '@lexical/rich-text']) {
invariant(
!builder.hasExtensionByName(name),
'LexicalBuilder: @lexical/react legacy text plugins conflict with the %s extension. Remove the legacy or component.',
name,
);
}
return true;
}
return false;
}
function Decorators({
editor,
ErrorBoundary,
}: {
editor: LexicalEditor;
ErrorBoundary: ErrorBoundaryType;
}) {
return useDecorators(editor, ErrorBoundary);
}
/**
* @internal
*
* When using @lexical/extension, the ReactProvider is expected to handle
* rendering decorators. This component allows RichTextPlugin and
* PlainTextPlugin to be used in extension projects that have not yet
* migrated to use RichTextExtension or PlainTextExtension.
**/
export function LegacyDecorators({
editor,
ErrorBoundary,
}: {
editor: LexicalEditor;
ErrorBoundary: ErrorBoundaryType;
}): JSX.Element | null {
return isUsingReactExtension(editor) ? null : (
);
}