// packages/block-library/src/footnotes/format.js
import { v4 as createId } from "uuid";
import { __ } from "@wordpress/i18n";
import { formatListNumbered as icon } from "@wordpress/icons";
import { insertObject } from "@wordpress/rich-text";
import {
  RichTextToolbarButton,
  store as blockEditorStore,
  privateApis
} from "@wordpress/block-editor";
import { useSelect, useDispatch, useRegistry } from "@wordpress/data";
import { store as coreDataStore } from "@wordpress/core-data";
import { createBlock, store as blocksStore } from "@wordpress/blocks";
import { unlock } from "../lock-unlock";
import { jsx } from "react/jsx-runtime";
var { usesContextKey } = unlock(privateApis);
var formatName = "core/footnote";
var POST_CONTENT_BLOCK_NAME = "core/post-content";
var SYNCED_PATTERN_BLOCK_NAME = "core/block";
var format = {
  title: __("Footnote"),
  tagName: "sup",
  className: "fn",
  attributes: {
    "data-fn": "data-fn"
  },
  interactive: true,
  contentEditable: false,
  [usesContextKey]: ["postType", "postId"],
  edit: function Edit({
    value,
    onChange,
    isObjectActive,
    context: { postType, postId }
  }) {
    const registry = useRegistry();
    const {
      getSelectedBlockClientId,
      getBlocks,
      getBlockRootClientId,
      getBlockName,
      getBlockParentsByBlockName
    } = registry.select(blockEditorStore);
    const isFootnotesSupported = useSelect(
      (select) => {
        if (!select(blocksStore).getBlockType("core/footnotes")) {
          return false;
        }
        const allowedBlocks = select(blockEditorStore).getSettings().allowedBlockTypes;
        if (allowedBlocks === false || Array.isArray(allowedBlocks) && !allowedBlocks.includes("core/footnotes")) {
          return false;
        }
        const entityRecord = select(coreDataStore).getEntityRecord(
          "postType",
          postType,
          postId
        );
        if ("string" !== typeof entityRecord?.meta?.footnotes) {
          return false;
        }
        const {
          getBlockParentsByBlockName: _getBlockParentsByBlockName,
          getSelectedBlockClientId: _getSelectedBlockClientId
        } = select(blockEditorStore);
        const parentCoreBlocks = _getBlockParentsByBlockName(
          _getSelectedBlockClientId(),
          SYNCED_PATTERN_BLOCK_NAME
        );
        return !parentCoreBlocks || parentCoreBlocks.length === 0;
      },
      [postType, postId]
    );
    const { selectionChange, insertBlock } = useDispatch(blockEditorStore);
    if (!isFootnotesSupported) {
      return null;
    }
    function onClick() {
      registry.batch(() => {
        let id;
        if (isObjectActive) {
          const object = value.replacements[value.start];
          id = object?.attributes?.["data-fn"];
        } else {
          id = createId();
          const newValue = insertObject(
            value,
            {
              type: formatName,
              attributes: {
                "data-fn": id
              },
              innerHTML: `<a href="#${id}" id="${id}-link">*</a>`
            },
            value.end,
            value.end
          );
          newValue.start = newValue.end - 1;
          onChange(newValue);
        }
        const selectedClientId = getSelectedBlockClientId();
        const parentPostContent = getBlockParentsByBlockName(
          selectedClientId,
          POST_CONTENT_BLOCK_NAME
        );
        const blocks = parentPostContent.length ? getBlocks(parentPostContent[0]) : getBlocks();
        let fnBlock = null;
        {
          const queue = [...blocks];
          while (queue.length) {
            const block = queue.shift();
            if (block.name === "core/footnotes") {
              fnBlock = block;
              break;
            }
            queue.push(...block.innerBlocks);
          }
        }
        if (!fnBlock) {
          let rootClientId = getBlockRootClientId(selectedClientId);
          while (rootClientId && getBlockName(rootClientId) !== POST_CONTENT_BLOCK_NAME) {
            rootClientId = getBlockRootClientId(rootClientId);
          }
          fnBlock = createBlock("core/footnotes");
          insertBlock(fnBlock, void 0, rootClientId);
        }
        selectionChange(fnBlock.clientId, id, 0, 0);
      });
    }
    return /* @__PURE__ */ jsx(
      RichTextToolbarButton,
      {
        icon,
        title: __("Footnote"),
        onClick,
        isActive: isObjectActive
      }
    );
  }
};
export {
  format,
  formatName
};
//# sourceMappingURL=format.js.map
