/**
 * 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.
 *
 * @flow strict
 */

import type {
  BaseSelection,
  LexicalEditor,
  RangeSelection,
  LexicalNode,
} from 'lexical';

/*
 * Rich Text
 */

declare export function $insertDataTransferForRichText(
  dataTransfer: DataTransfer,
  selection: BaseSelection,
  editor: LexicalEditor,
): void;

declare export function $getHtmlContent(
  editor: LexicalEditor,
  selection?: BaseSelection,
): string | null;

declare export function $getLexicalContent(
  editor: LexicalEditor,
): string | null;

declare export function $insertGeneratedNodes(
  editor: LexicalEditor,
  nodes: Array<LexicalNode>,
  selection: BaseSelection,
): void;
/*
 * Plain Text
 */

/*
 * Export as JSON
 */

declare export function $insertDataTransferForPlainText(
  dataTransfer: DataTransfer,
  selection: RangeSelection,
): void;

declare export function $handleRichTextDrop(
  event: DragEvent,
  editor: LexicalEditor,
): boolean;

declare export function $handlePlainTextDrop(
  event: DragEvent,
  editor: LexicalEditor,
): boolean;

declare export function $writeDragSourceToDataTransfer(
  dataTransfer: DataTransfer,
  editor: LexicalEditor,
  selection: RangeSelection,
): void;

interface BaseSerializedNode {
  children?: Array<BaseSerializedNode>;
  type: string;
  version: number;
}

declare export function $generateJSONFromSelectedNodes<
  SerializedNode extends BaseSerializedNode,
>(
  editor: LexicalEditor,
  selection: BaseSelection | null,
): {
  namespace: string,
  nodes: Array<SerializedNode>,
};

declare export function $generateNodesFromSerializedNodes(
  serializedNodes: Array<BaseSerializedNode>,
): Array<LexicalNode>;

declare export function copyToClipboard(
  editor: LexicalEditor,
  event: null | ClipboardEvent,
): Promise<boolean>;
