[Back]
<?php

namespace FortAwesome;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

require_once trailingslashit( FONTAWESOME_DIR_PATH ) . 'includes/class-fontawesome-svg-styles-manager.php';

/**
 *  We need to register the block-editor script explicitly, instead of
 *  just relying on it to be registered by `register_block_type`, because we need to add some dependencies.
 *
 *  Thus, our block.json does not express its "editorScript" as something like "file:./index.js",
 *  it will reference the resource handle used in this registration, like: "font-awesome-block-editor".
 */
function enqueue_font_awesome_block_editor_assets() {
	wp_register_script(
		'font-awesome-block-editor',
		trailingslashit( FONTAWESOME_DIR_URL ) . 'block-editor/build/index.js',
		array(
			FontAwesome::ADMIN_RESOURCE_HANDLE,
			FontAwesome::RESOURCE_HANDLE_ICON_CHOOSER,
		),
		FontAwesome::PLUGIN_VERSION,
		array( 'in_footer' => false )
	);

	wp_register_style(
		'font-awesome-block-editor',
		trailingslashit( FONTAWESOME_DIR_URL ) . 'block-editor/build/index.css',
		array(
			FontAwesome_SVG_Styles_Manager::RESOURCE_HANDLE_SVG_STYLES,
		),
		FontAwesome::PLUGIN_VERSION
	);

	/**
	 * This is to ensure that even when a webfont/css stylesheet is loaded at
	 * the same time as we have inline SVGs in the page, the icon classes
	 * on the <svg> elements don't up with ::before pseudo-elements on them
	 * due to the rules in the webfont/css stylesheet. It probably wouldn't
	 * result in anything rendering there, but it's better for there to be no
	 * pseudo-elements present at all on the <svg> elements.
	 */
	$frontend_inline_style = <<< EOT
   .wp-block-font-awesome-icon svg::before,
   .wp-rich-text-font-awesome-icon svg::before {content: unset;}
EOT;
	wp_add_inline_style(
		FontAwesome_SVG_Styles_Manager::RESOURCE_HANDLE_SVG_STYLES,
		$frontend_inline_style
	);
}

function block_init() {
	if ( ! function_exists( 'is_wp_version_compatible' ) || ! is_wp_version_compatible( '5.8.0' ) ) {
		return;
	}

	/**
	 *  It's important that our block editor assets are registered on the `enqueue_block_editor_assets` action, because:
	 *
	 *  1. otherwise, it would happen on the `init` hook, and apparently this always triggers `wp_default_packages_vendor`
	 *     in WordPress core wp-includes/script-loader.php to run, and when it does, if there are
	 *     any `lodash` dependencies, it adds a duplicate inline `after` script like this:
	 *     ```
	 *     window.lodash = _.noConflict()
	 *     window.lodash = _.noConflict()
	 *     ```
	 *
	 *     This is not idempotent: so calling it twice has the effect of making the global `_` undefined,
	 *     which breaks other scripts that depend on the global `_`.
	 *
	 *     By invoking `wp_register_script()` within the `enqueue_block_editor_assets` hook,
	 *     that `wp_default_packages_vendor` function doesn't get called a second time, and thus,
	 *     the `window.lodash  = _.noConflict()` is not duplicated, and thus the `_` global is not
	 *     reset to `undefined`.
	 *
	 *     At the time of writing, this plugin depended on neither the 'lodash' nor 'underscore' script
	 *     handles. So wasn't that this plugin had loaded a conflicting version of lodash. It's that other
	 *     code in WordPress core *does* load conflicting versions, and it depends on the proper functioning
	 *     of `_.noConflict()` to resolve that. So we need to avoid running our code in such a way that causes
	 *     the side effect of calling `_.noConflict()` twice.
	 *
	 *     (Since resolving this problem, this plugin *did* take a dependency on the 'lodash' version that
	 *      ships with WordPress core, to eliminate the need to bundle it separately. It still has no
	 *      direct or transitive dependencies on underscore--the older version of lodash).
	 *
	 *  2. We need these assets to be loaded for the block editor, on the back end only, never on
	 *       frontend page loads. The docs indicate that we should prefer using `enqueue_block_assets`.
	 *     However, since this plugin needs to be compatible with WordPress earlier than 6.3, we can't,
	 *     because it was only in WP 6.3 that assets enqueued under `enqueue_block_assets` would be
	 *     added to the editor content iframe as well as outside the iframe. So we need to continue
	 *     using the older hook. It's no big deal, though, since--for our plugin--the older mechanism
	 *     happens to accomplish exactly what we want:
	 *     (a) load the assets in the editor UI, and
	 *     (b) load them inside the editor's content iframe,
	 *     (c) but only load them there on the back end, never on the front end.
	 *
	 *     https://developer.wordpress.org/block-editor/how-to-guides/enqueueing-assets-in-the-editor/
	 */
	if ( is_wp_version_compatible( '6.3.0' ) ) {
		add_action( 'enqueue_block_assets', 'FortAwesome\enqueue_font_awesome_block_editor_assets' );
	} else {
		add_action( 'enqueue_block_editor_assets', 'FortAwesome\enqueue_font_awesome_block_editor_assets' );
	}

	register_block_type( __DIR__ . '/build' );
}