Current File : /var/www/html/blog/wp-content/plugins/popup-maker/classes/Integration/Builder/Bricks.php
<?php

use function PopupMaker\plugin;

/**
 * Integration for Bricks BUilder
 *
 * @package   PopupMaker
 * @copyright Copyright (c) 2024, Code Atlantic LLC
 */

class PUM_Integration_Builder_Bricks extends PUM_Abstract_Integration {

	/**
	 * @var string
	 */
	public $key = 'bricks';

	/**
	 * @var string
	 */
	public $type = 'builder';

	/**
	 * @return string
	 */
	public function label() {
		return 'Bricks Builder';
	}

	/**
	 * @return bool
	 */
	public function enabled() {
		return defined( 'BRICKS_VERSION' );
	}

	/**
	 * Initializes this module.
	 */
	public function __construct() {
		add_filter( 'popmake_popup_post_type_args', [ $this, 'custom_post_type_args' ], 10, 1 );
		add_filter( 'pum_popup_content', [ $this, 'custom_popup_content' ], 10000, 2 );
		add_filter( 'template_include', [ $this, 'custom_template' ], 10000 );
		add_filter( 'pum_theme_css_selector', [ $this, 'custom_css_selector' ], 10000, 3 );
		add_action( 'wp_print_footer_scripts', [ $this, 'render_custom_editor_scripts' ] );
		add_filter( 'popmake_get_option', [ $this, 'disable_asset_caching' ], 10, 2 );
	}

	/**
	 * Modify post types for the Bricks editor.
	 *
	 * @param array<string,string|bool> $args The post type args.
	 *
	 * @return array<string,string|bool>
	 */
	public function custom_post_type_args( $args ) {
		if ( $this->is_bricks_editor() ) {
			$args['publicly_queryable'] = true;
		}

		return $args;
	}

	/**
	 * Disable asset caching for Bricks editor.
	 *
	 * @param mixed  $value The default value.
	 * @param string $key The option key.
	 *
	 * @return mixed
	 */
	public function disable_asset_caching( $value, $key ) {
		if ( $this->is_bricks_editor_canvas() && 'disable_asset_caching' === $key ) {
			return true;
		}

		return $value;
	}

	/**
	 * Check if the current page is the Bricks editor canvas.
	 *
	 * @return bool
	 */
	public function is_bricks_editor_canvas() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return $this->is_bricks_editor() && isset( $_GET['brickspreview'] );
	}

	/**
	 * Check if the current page is the Bricks editor preview.
	 *
	 * @return bool
	 */
	public function is_bricks_editor_preview() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return isset( $_GET['bricks_preview'] );
	}

	/**
	 * Check if the current page is the Bricks editor.
	 *
	 * @return bool
	 */
	public function is_bricks_editor() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return isset( $_GET['bricks'] ) && 'run' === sanitize_key( wp_unslash( $_GET['bricks'] ) );
	}

	/**
	 * Custom template for the Bricks editor.
	 *
	 * @param string $template The template path.
	 *
	 * @return string
	 */
	public function custom_template( $template ) {
		if ( is_singular( 'popup' ) ) {
			// Define the path to your custom template file within your plugin
			$custom_template = Popup_Maker::$DIR . 'templates/single-popup.php';

			if ( $this->is_bricks_editor() && ! $this->is_bricks_editor_canvas() ) {
				remove_action( 'wp_footer', [ 'PUM_Site_Popups', 'render_popups' ] );
			}

			// Check if the file exists, then use it as the template
			if ( file_exists( $custom_template ) ) {
				return $custom_template;
			}
		}

		// If not singular 'popup', return the default template
		return $template;
	}

	/**
	 * Modify the CSS selector for the Bricks editor.
	 *
	 * @param string $css_selector The CSS selector.
	 * @param int    $theme_id The theme ID.
	 * @param string $element The element type.
	 *
	 * @return string
	 */
	public function custom_css_selector( $css_selector, $theme_id, $element ) {
		if ( $this->is_bricks_editor_canvas() ) {
			$popup_id = isset( $_GET['p'] ) ? intval( $_GET['p'] ) : false;

			if ( ! $popup_id ) {
				return $css_selector;
			}

			$popup = pum_get_popup( $popup_id );

			$popup_theme = $popup->get_theme_id();

			if ( $popup_theme !== $theme_id ) {
				return $css_selector;
			}

			if ( 'overlay' === $element ) {
				$css_selector = ', #brx-body.postid-' . $popup_id;
			} elseif ( 'container' === $element ) {
				$css_selector = '#bricks-blank-canvas, #brx-content';
			}
		}

		return $css_selector;
	}

	/**
	 * Render custom editor scripts for the Bricks editor.
	 *
	 * @return void
	 */
	public function render_custom_editor_scripts() {
		if ( ! $this->is_bricks_editor_canvas() ) {
			return;
		}

		$popup_id = isset( $_GET['p'] ) ? intval( $_GET['p'] ) : false;
		if ( ! $popup_id ) {
			return;
		}

		?>
		<style>
		#pum-<?php echo esc_attr( $popup_id ); ?> { display: none; }
		body.single-popup { display: initial!important; position: static!important; }
		.pum-container, #brx-content { flex: initial!important; }
		.pum-container .brxe-container { max-width: 100%; }
		</style>
		<script type="text/javascript">
			const $ = jQuery;
			const $popup = $('#pum-<?php echo esc_attr( $popup_id ); ?>');

			const copyElStyles = (sourceElement, targetElement) => {
				$(targetElement).addClass($(sourceElement).attr('class'));
				$(targetElement).attr('style', ($(targetElement).attr('style') || '') + ($(sourceElement).attr('style') || ''));
				$(targetElement).css('max-width', $(sourceElement).css('width'));
			}

			const redraw = () => {
				$('#bricks-blank-canvas, #brx-content').css({ width: 'initial'});
				copyElStyles($popup, $('body.single-popup'));
				copyElStyles($popup.find('.pum-container'), $('#bricks-blank-canvas, #brx-content'));
			}

			if ($popup.length) {
				// console.log('popup found', window.frames[0]);
				setTimeout(redraw, 100);

				let interval = setInterval(() => {
					redraw();
				}, 500);
			}
		</script>
		<?php
	}

	/**
	 * Custom popup content using Bricks.
	 *
	 * @param string $content The popup content.
	 * @param int    $popup_id The popup ID.
	 *
	 * @return string
	 */
	public function custom_popup_content( $content, $popup_id ) {
		global $post;

		if ( 'bricks' !== Bricks\Helpers::get_editor_mode( $popup_id ) ) {
			return $content;
		}

		$original_post = $post;
		setup_postdata( $popup_id );
		// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
		$post = get_post( $popup_id );

		// $bricks_data = Bricks\Database::get_template_data( 'content' );

		$bricks_data = Bricks\Helpers::get_bricks_data( $popup_id, 'content' );
		if ( $bricks_data ) {
			ob_start();
			Bricks\Frontend::render_content( $bricks_data );
			// Enqueue bricks assets
			// Bricks\Theme_Styles::set_active_style( $popup_id );
			$content = ob_get_clean();
		}

		// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
		$post = $original_post;
		wp_reset_postdata();

		return $content;
	}
}