HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: /var/www/indoadvisory/wp/wp-content/plugins/divi-essential-/includes/admin.php
<?php

namespace Divi_Essential\Includes;

defined( 'ABSPATH' ) || die();

class Admin {

	const MODULES_NONCE = 'dnxte_save_admin';
	const SAVE_MODULE_ACTION = 'dnxte_save_modules_data';
	const SAVE_FEATURE_ACTION = 'dnxte_save_extensions_data';
	

	public function __construct() {
		add_action( 'admin_menu', array( __CLASS__, 'add_menu' ), 21 );
		add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ), 21 );
		add_action( 'wp_ajax_' . self::MODULES_NONCE, array( __CLASS__, 'save_data' ) );
		add_action( 'wp_ajax_' . self::SAVE_MODULE_ACTION, array( __CLASS__, 'save_modules_data' ) );
		add_action( 'wp_ajax_' . self::SAVE_FEATURE_ACTION, array( __CLASS__, 'save_extensions_data' ) );
		$visibility_feature = get_option('dnxte_inactive_extensions', array() );

		// Divi shortcode.
		if ( ! defined( 'DE_SHORTCODE' ) ) {
			define( 'DE_SHORTCODE', 'divi_shortcode_library' );
		}
		add_shortcode( DE_SHORTCODE, array( $this, 'dnxte_divi_shortcode' ) );
		if( ! in_array( 'dnxte-shortcode-extension', $visibility_feature) ){
			add_filter( 'manage_edit-et_pb_layout_columns', array( $this, 'dnxte_divi_shortcode_post_columns_header' ) );
			add_action( 'manage_et_pb_layout_posts_custom_column', array( $this, 'dnxte_divi_shortcode_post_columns_content' ) );
		}

		if( ! in_array( 'dnxte-widget-extension', $visibility_feature) ){
			add_action('widgets_init',function() {
				register_widget( 'dnxte_widget_library' );
			}
			);
			require_once DIVI_ESSENTIAL_DIR . 'includes/Extension/widget-library.php';        
		}

		
	/**
	 * 
	 * 3. the required plugin license action_hook start
	 */
		add_action('admin_init', array( __CLASS__, 'dnext_essential_plugin_updater'), 0);
		add_action('admin_init', array( __CLASS__, 'dnext_essential_register_option'));
		add_action('admin_init', array( __CLASS__, 'dnext_essential_activate_license'));
		add_action('admin_init', array( __CLASS__, 'dnext_essential_deactivate_license'));
		add_action('admin_notices', array( __CLASS__, 'dnext_essential_admin_notices'));
	/**
	 * 
	 * 3. the required plugin license action_hook end
	 */
	}
	
    public static function add_menu() {
		
		add_menu_page(
			__( 'Divi Essential', 'dnxte-divi-essential' ),
			__( 'Divi Essential', 'dnxte-divi-essential' ),
			'manage_options',
			'dnxte-essential',
			array( __CLASS__, 'render_main'),
			dnxte_svg_icon(),
			111
		);
		

	/**
	 * 
	 * 4. The required plugin license submenu start
	 */
		add_submenu_page(
			'dnxte-essential',
			__( 'Divi Essential License', 'dnxte-divi-essential' ),
			__( 'Divi Essential License', 'dnxte-divi-essential' ),
			'manage_options',
			DNEXT_ESSENTIAL_PLUGIN_LICENSE_PAGE,
			array( __CLASS__, 'render_license_page')
		);

	/**
	 * 
	 * 4. The required plugin license submenu END
	 */
	}

	public static function enqueue_scripts() {

		if ( ! current_user_can( 'manage_options' )) {
			return;
		}


			wp_enqueue_style(
				'dnxte-admin',
				DIVI_ESSENTIAL_ASSETS . 'admin/css/admin.css'
			);

			wp_enqueue_script(
				'dnxte-admin-js',
				DIVI_ESSENTIAL_ASSETS . 'admin/js/admin.js',
				array( 'jquery' ),
				DIVI_ESSENTIAL_VERSION,
				true
			);
	
			wp_localize_script( 
				'dnxte-admin-js', 
				'Dnxte_Essential', 
				array(
					'ajaxurl'	=>	admin_url( 'admin-ajax.php' ),
					'nonce'   	=>	wp_create_nonce( self::MODULES_NONCE ),
					'action'  	=>	self::MODULES_NONCE,
				) 
			);
		

	}

	public static function save_data($data) {
		$posted_data = ! empty( $data ) ? $data : '';
		$data = array();
		parse_str( $posted_data, $data );

		do_action( 'dnxte_save_admin_data', $data );

		return $data;
	}

	public static function save_modules_data( $data ) {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}
		check_ajax_referer( self::MODULES_NONCE, 'nonce' ) ;
		
		$modules_data = isset( $_POST['data'] ) ? $_POST['data'] : ''; // phpcs:ignore 

		

		$data = self::save_data($modules_data);
		$modules = ! empty( $data['modules'] ) ? $data['modules'] : array();
		$inactive_modules = array_values( array_diff( array_keys( self::get_modules_map() ), $modules ) );

		self::save_inactive_modules('modules', $inactive_modules);
		
		wp_send_json_success();
	}
	public static function save_extensions_data() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}
		
		check_ajax_referer( self::MODULES_NONCE, 'nonce' );

		$extensions_data = isset($_POST['data']) ? $_POST['data'] : ''; // phpcs:ignore 
		$data = self::save_data( $extensions_data);
		$feature = ! empty( $data['extensions'] ) ? $data['extensions'] : array();
		$inactive_modules = array_values( array_diff( array_keys( self::get_extensions_map() ), $feature ) );
		
		self::save_inactive_modules('extensions', $inactive_modules);
		
		wp_send_json_success();
	}

	public static function get_inactive( $field ) {
		return get_option( 'dnxte_inactive_'. $field, array() );
	}

	public static function save_inactive_modules( $field, $modules = array() ) {
		update_option( 'dnxte_inactive_'.$field, $modules );
	}

	private static function get_free_modules_map() {
		
		return array(
			'dnxte-divider'      => array(
				'title'  => __( 'Next Divider', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-next-divider/',
				'icon'   => DIVI_ESSENTIAL_ICON . "DiviNextDivider/icon.svg",
				'is_active' => true,
			),
			'dnxte-image-magnifier'      => array(
				'title'  => __( 'Image Magnifier', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-magnifier/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNextImageMagnifier/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-reveal'     => array(
				'title'  => __( 'Image Reveal', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-reveal/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNextImageReveal/icon.svg',
				'is_active' => true,
			),
			'dnxte-lottie'     => array(
				'title'  => __( 'Lottie', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-lottie/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNextLottie/icon.svg',
				'is_active' => true,
			),
			'dnxte-gallery-slider'     => array(
				'title'  => __( 'Gallery Slider', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-gallery-slider/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNextThumbsGallery/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-hotspot'     => array(
				'title'  => __( 'Image Hotspot', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-hotspot/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNextTooltip/icon.svg',
				'is_active' => true,
			),
			'dnxte-3d-cube-slider'     => array(
				'title'  => __( '3d Cube Slider', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-3d-cube-slider/',
				'icon'   => DIVI_ESSENTIAL_ICON .'DiviNxte3dCubeSlider/icon.svg',
				'is_active' => true,
			),
			'dnxte-business-hour'     => array(
				'title'  => __( 'Business Hour', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-business-hour/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxteBusinessHour/icon.svg',
				'is_active' => true,
			),
			'dnxte-coverflow-slider'     => array(
				'title'  => __( 'Divi Carousel', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-coverflow-slider/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxteCoverflowSlider/icon.svg',
				'is_active' => true,
			),
			'dnxte-feature-list'     => array(
				'title'  => __( 'Feature List', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-feature-list/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxteFeatureList/icon.svg',
				'is_active' => true,
			),
			'dnxte-floating-element'     => array(
				'title'  => __( 'Floating Element', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-floating-elements/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxteFloatingElement/icon.svg',
				'is_active' => true,
			),
			'dnxte-price-list'     => array(
				'title'  => __( 'Price List', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-price-list/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxtePriceList/icon.svg',
				'is_active' => true,
			),
			'dnxte-promo-box'     => array(
				'title'  => __( 'Promo Box', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/next-promo-box/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxtePromobox/icon.svg',
				'is_active' => true,
			),
			'dnxte-testimonial-slider'     => array(
				'title'  => __( 'Testimonial Slider', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-testimonial-carousel/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxteTestimonial/icon.svg',
				'is_active' => true,
			),
			'dnxte-flip-box'      => array(
				'title'  => __( 'Flip Box', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-flip-box/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxtFlipbox/icon.svg',
				'is_active' => true,
			),
			'dnxte-logo-carousel'     => array(
				'title'  => __( 'Logo Carousel', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-logo-carousel/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxtLogoCarousel/icon.svg',
				'is_active' => true,
			),
			'dnxte-person'     => array(
				'title'  => __( 'Person', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-next-person/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'DiviNxtPerson/icon.svg',
				'is_active' => true,
			),
			'dnxte-3D-flip-box'     => array(
				'title'  => __( '3D Flip Box', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/3d-flip-box/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'Next3dFlipbox/icon.svg',
				'is_active' => true,
			),
			'dnxte-before-after'     => array(
				'title'  => __( 'Before After', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-before-after-module/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextBeforeAfter/icon.svg',
				'is_active' => true,
			),
			'dnxte-blurb'     => array(
				'title'  => __( 'Blurb', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-next-blurb/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextBlurb/icon.svg',
				'is_active' => true,
			),
			'dnxte-button'     => array(
				'title'  => __( 'Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-next-button/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextButton/icon.svg',
				'is_active' => true,
			),
			'dnxte-circular-image-hover'     => array(
				'title'  => __( 'Circular Image Hover', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-circular-image-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextCircularImageHover/icon.svg',
				'is_active' => true,
			),
			'dnxte-facbook-comment'     => array(
				'title'  => __( 'Facbook Comment', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-comment/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextComment/icon.svg',
				'is_active' => true,
			),
			'dnxte-dual-button'     => array(
				'title'  => __( 'Dual Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-dual-button/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextDualButton/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-embedded-comment'     => array(
				'title'  => __( 'Facebook Embedded Comment', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-embedded-comment/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextEmbeddedComment/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-embedded-post'     => array(
				'title'  => __( 'Facebook Embedded Post', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-embedded-post/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextEmbeddedPost/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-embedded-Video'     => array(
				'title'  => __( 'Facebook Embedded Video', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-embedded-video/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextEmbeddedVideo/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-page'     => array(
				'title'  => __( 'Facebook Page', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-page/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextFBPage/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-share-button'     => array(
				'title'  => __( 'Facebook Share Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-share/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextFBShareButton/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-gradient'     => array(
				'title'  => __( 'Text Gradient', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-gradient-text/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextGradientText/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-accordion'     => array(
				'title'  => __( 'Image Accordion', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-accordion/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextImageAccordion/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-hover-box'     => array(
				'title'  => __( 'Image Hover Box', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-hover-box-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextImageHoverBox/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-icon-effect'     => array(
				'title'  => __( 'Image Icon Effect', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-icon-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextImageIcon/icon.svg',
				'is_active' => true,
			),
			'dnxte-image-scroll'     => array(
				'title'  => __( 'Image Scroll', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-image-scroll-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextImageScroll/icon.svg',
				'is_active' => true,
			),
			'dnxte-facebook-like-button'     => array(
				'title'  => __( 'Facebook Like Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-facebook-like/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextLikeButton/icon.svg',
				'is_active' => true,
			),
			'dnxte-masonry-gallery'     => array(
				'title'  => __( 'Masonry Gallery', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-masonry-gallery/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextMasonary/icon.svg',
				'is_active' => true,
			),
			'dnxte-mega-image-effect'     => array(
				'title'  => __( 'Mega Image Effect', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-mega-image-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextMegaImageEffect/icon.svg',
				'is_active' => true,
			),
			'dnxte-minimal-image'     => array(
				'title'  => __( 'Minimal Image', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-minimal-image-hover-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextMinimalImageHover/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-multi-heading'     => array(
				'title'  => __( 'Text Multi Heading', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-multi-heading/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextMultiHeading/icon.svg',
				'is_active' => true,
			),
			'dnxte-rating'     => array(
				'title'  => __( 'Divi Rating', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-rating/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextRating/icon.svg',
				'is_active' => true,
			),
			'dnxte-divi-review'     => array(
				'title'  => __( 'Divi Review', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-review/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextReview/icon.svg',
				'is_active' => true,
			),
			'dnxte-step-flow'     => array(
				'title'  => __( 'Step Flow', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/step-flow/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextStepFlow/icon.svg',
				'is_active' => true,
			),
			'dnxte-team-creative'     => array(
				'title'  => __( 'Divi Creative Team', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-creative-team/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTeamCreative/icon.svg',
				'is_active' => true,
			),
			'dnxte-team-member-overlay'     => array(
				'title'  => __( 'Team Member Overlay', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-team-member-overlay/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTeamOverlay/icon.svg',
				'is_active' => true,
			),
			'dnxte-team-overlay-card'     => array(
				'title'  => __( 'Divi Team Overlay Card', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-team-overlay-card/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTeamOverlayCard/icon.svg',
				'is_active' => true,
			),
			'dnxte-team-social-reveal'     => array(
				'title'  => __( 'Team Social Reveal', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-team-social-reveal/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTeamSocialReveal/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-animation'     => array(
				'title'  => __( 'Text Animation', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-animation/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextAnimation/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-color-motion'     => array(
				'title'  => __( 'Text Color Motion', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-color-motion/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextColorMotion/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-divider'     => array(
				'title'  => __( 'Text Divider', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-divider/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextDivider/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-glitch'     => array(
				'title'  => __( 'Text Glitch', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-glitch-text/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextGlitch/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-highlight'     => array(
				'title'  => __( 'Text Highlight', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-highlight/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextHighlight/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-hover-highlight'  => array(
				'title'  => __( 'Text Hover Highlight', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-hover-highlight/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextHoverHighlight/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-mask'  => array(
				'title'  => __( 'Text Mask', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-mask/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextMask/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-stroke'  => array(
				'title'  => __( 'Text Stroke', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-stroke/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextStroke/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-stroke-motion'  => array(
				'title'  => __( 'Text Stroke Motion', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-stroke-motion/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextStrokeMotion/icon.svg',
				'is_active' => true,
			),
			'dnxte-text-tilt'  => array(
				'title'  => __( 'Text Tilt', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-text-tilt/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTextTilt/icon.svg',
				'is_active' => true,
			),
			'dnxte-timeline'  => array(
				'title'  => __( 'Timeline', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-timeline/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTimeline/icon.svg',
				'is_active' => true,
			),
			'dnxte-twitter-follow'  => array(
				'title'  => __( 'Twitter Follow Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-twitter-follow/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTwitterFollow/icon.svg',
				'is_active' => true,
			),
			'dnxte-twitter-share'  => array(
				'title'  => __( 'Twitter Tweet Button', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-twitter-button/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTwitterShare/icon.svg',
				'is_active' => true,
			),
			'dnxte-twitter-timeline'  => array(
				'title'  => __( 'Twitter Timeline', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-twitter-timeline/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTwitterTimeline/icon.svg',
				'is_active' => true,
			),
			'dnxte-twitter-tweet'  => array(
				'title'  => __( 'Twitter Tweet', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-twitter-tweet/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextTwitterTweet/icon.svg',
				'is_active' => true,
			),
			'dnxte-ultimate-image-hover'  => array(
				'title'  => __( 'Ultimate Image Hover', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-ultimate-image-effect/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextUltimateImageHover/icon.svg',
				'is_active' => true,
			),
			'dnxte-content-toggle'  => array(
				'title'  => __( 'Content Toggle', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-content-toggle/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextContentToggle/icon.svg',
				'is_active' => true,
			),
			'dnxte-post-carousel' => array(
				'title'  => __( 'Post Carousel', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-post-carousel/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextBlogSlider/icon.svg',
			),
			'dnxte-advanced-tab' => array(
				'title'  => __( 'Advanced tab', 'dnxte-divi-essential' ),
				'demo'   => 'https://www.diviessential.com/divi-advanced-tab/',
				'icon'   => DIVI_ESSENTIAL_ICON . 'NextAdvancedTab/icon.svg',
			),
		);
	}

	private static function get_pro_modules_map() {
		return array();
	}

	public static function get_modules_map() {

		$free_modules_map 	= self::get_free_modules_map();
		$modules_map 		= array_merge( $free_modules_map, self::get_pro_modules_map() );

		uksort( $modules_map, array( __CLASS__, 'sort_widgets') );
		return $modules_map;

	}

	public static function get_extensions_map() {

		$modules_map = array(
			'custom-attributes-extension'	=> array(
				'title'	=> __('Custom Attributes','dnxte-divi-essential'),
				'demo'	=> 'https://diviessential.com/custom-attribute/',
				'icon'	=> plugin_dir_url(__FILE__ ) . './Extension/icon-image/custom-attribute.png',
				'is_active' => true,
			),
			'read-more-extension'	=> array(
				'title'	=> __('Read More','dnxte-divi-essential'),
				'demo'	=> 'https://diviessential.com/read-more/',
				'icon'	=> plugin_dir_url(__FILE__ ) . './Extension/icon-image/read-more.png',
				'is_active' => true,
			),
			'popup-pro-extension'	=> array(
				'title'	=> __('Popup Pro','dnxte-divi-essential'),
				'demo'	=> 'https://diviessential.com/divi-popup-pro/',
				'icon'	=> plugin_dir_url(__FILE__ ) . './popup-pro/img/popup-builder.png',
				'is_active' => true,
			),
			'dnxte-shortcode-extension'	=> array(
				'title'	=> __('Shortcode Library','dnxte-divi-essential'),
				'demo'	=> 'https://diviessential.com/library-shortcode/',
				'icon'	=> plugin_dir_url(__FILE__ ) . './Extension/icon-image/library-shortcode.svg',
				'is_active' => true,
			),
			'dnxte-widget-extension'	=> array(
				'title'	=> __('Widget Library','dnxte-divi-essential'),
				'demo'	=> 'https://diviessential.com/widget-library/',
				'icon'	=> plugin_dir_url(__FILE__ ) . './Extension/icon-image/library-widget.svg',
				'is_active' => true,
			),
		);

		uksort( $modules_map, array( __CLASS__, 'sort_widgets') );
		return $modules_map;

	}

	public static function sort_widgets($k1, $k2) {
		return strcasecmp( $k1, $k2 );
	}

	public static function get_tabs() {

		$icon_url = DIVI_ESSENTIAL_ASSETS . 'images/admin/';

		$tabs = array(
			'home'      => array(
				'title'    => esc_html__( 'Home', 'dnxte-divi-essential' ),
				'icon'     => '',
				'renderer' => array( __CLASS__, 'render_home' ),
			),
			'modules'      => array(
				'title'    => esc_html__( 'Modules', 'dnxte-divi-essential' ),
				'icon'     => '',
				'renderer' => array( __CLASS__, 'render_modules' ),
			),
			'extensions'      => array(
				'title'    => esc_html__( 'Extensions', 'dnxte-divi-essential' ),
				'icon'     => '',
				'renderer' => array( __CLASS__, 'render_extensions' ),
			),
		);

		return $tabs;
	}

	private static function load_template( $template ) {
		$file = DIVI_ESSENTIAL_DIR . 'includes/admin/view/admin-' . $template . '.php';
		if ( is_readable( $file ) ) {
			include $file;
		}
	}

	public static function render_main() {
		self::load_template( 'main' );
	}

	public static function render_home() {
		self::load_template( 'home' );
	}

	public static function render_modules() {
		self::load_template( 'modules' );
	}
	public static function render_extensions() {
		self::load_template( 'extensions' );
	}


	public function dnxte_divi_shortcode( $divi_shortcode = array() ) {
		if ( empty( $divi_shortcode['id'] ) ) {
			return '';
		}
		return do_shortcode( '[et_pb_section global_module="' . $divi_shortcode['id'] . '"][/et_pb_section]' );
	}

	public function dnxte_divi_shortcode_post_columns_header( $columns ){
		$columns['shortcode'] = __( 'Shortcode Library', 'dnxte-divi-essential' );
		return $columns;
	}

	public function dnxte_divi_shortcode_post_columns_content( $column_name ) {
		global $post;
		switch ( $column_name ) {
			case 'shortcode':
				$shortcode = esc_attr(sprintf( '[%s id="%d"]', DE_SHORTCODE, $post->ID ));
				printf( '<input class="dnxte-shortcode-input" type="text" readonly onfocus="this.select()" value="%s" style="width:100%%" />',  esc_attr($shortcode) );
				break;
		}
	}

	/**
	 * 
	 * 5. the required plugin license function start
	 */
	public static function dnext_essential_plugin_updater() {

		// retrieve our license key from the DB
		$license_key = '';
			if (get_option('dnext_essential_license_key') !== null) {
                $license_key = trim(get_option('dnext_essential_license_key') ?? '');
            }
	
		// setup the updater
		$edd_updater = new \DNEXT_Essential_Plugin_Updater_Class(DNEXT_ESSENTIAL_STORE_URL, DIVI_ESSENTIAL_FILE,
			array(
				'version' => DIVI_ESSENTIAL_VERSION, // current version number
				'license' => $license_key, // license key (used get_option above to retrieve from DB)
				'item_id' => DNEXT_ESSENTIAL_ITEM_ID, // ID of the product
				'author'  => 'Divi Next', // author of this plugin
				'beta'    => false,
			)
		);
	}

	public static function render_license_page() {
		$license = get_option('dnext_essential_license_key');
		$status = get_option('dnext_essential_license_status');
		?>
		<div class="wrap">
			<h2><?php esc_html_e('Divi Essential License Options', 'dnxte-divi-essential');?></h2>
			<form method="post" action="options.php">
				<?php settings_fields('dnext_essential_license');?>
				<table class="form-table">
					<tbody>
						<tr valign="top">
							<th scope="row" valign="top">
								<?php esc_html_e('License Key', 'dnxte-divi-essential');?>
							</th>
							<td>
								<input id="dnext_essential_license_key" name="dnext_essential_license_key" type="password" class="regular-text" value="<?php esc_attr_e($license);?>" />
								<label class="description" for="dnext_essential_license_key"><?php esc_html_e('Enter your license key', 'dnxte-divi-essential');?></label>
							</td>
						</tr>
						<?php if (false !== $license) {?>
							<tr valign="top">
								<th scope="row" valign="top">
									<?php esc_html_e('Activate License', 'dnxte-divi-essential');?>
								</th>
								<td>
									<?php if (false !== $status && 'valid' == $status) {?>
										<span style="color:green;"><?php esc_html_e('is_active', 'dnxte-divi-essential');?></span>
										<?php wp_nonce_field('dnext_essential_nonce', 'dnext_essential_nonce');?>
										<input type="submit" class="button-secondary" name="dnext_essential_plugin_license_deactivate" value="<?php esc_attr_e('Deactivate License', 'dnxte-divi-essential');?>"/>
									<?php } else {
			wp_nonce_field('dnext_essential_nonce', 'dnext_essential_nonce');?>
										<input type="submit" class="button-secondary" name="dnext_essential_plugin_license_activate" value="<?php esc_attr_e('Activate License', 'dnxte-divi-essential');?>"/>
									<?php }?>
								</td>
							</tr>
						<?php }?>
					</tbody>
				</table>
				<?php submit_button();?>
			</form>
		<?php
	}

	public static function dnext_essential_register_option() {
		// creates our settings in the options table
		register_setting('dnext_essential_license', 'dnext_essential_license_key', 'dnext_essential_sanitize_license');
	}
	
	public static function dnext_essential_sanitize_license($new) {
		$old = get_option('dnext_essential_license_key');
		if ($old && $old != $new) {
			delete_option('dnext_essential_license_status'); // new license has been entered, so must reactivate
		}
		return $new;
	}

	public static function dnext_essential_activate_license() {

		// listen for our activate button to be clicked
		if (isset($_POST['dnext_essential_plugin_license_activate'])) {
	
			// run a quick security check
			if (!check_admin_referer('dnext_essential_nonce', 'dnext_essential_nonce')) {
				return;
			}
			// get out if we didn't click the Activate button
	
			// retrieve the license from the database
			$license = '';
			if (get_option('dnext_essential_license_key') !== null) {
                $license = trim(get_option('dnext_essential_license_key') ?? '');
            }
	
			// data to send in our API request
			$api_params = array(
				'edd_action' => 'activate_license',
				'license'    => $license,
				'item_name'  => rawurlencode(DNEXT_ESSENTIAL_ITEM_NAME), // the name of our product in EDD
				'url'        => home_url(),
			);
	
			// Call the custom API.
			$response = wp_remote_post(DNEXT_ESSENTIAL_STORE_URL, array('timeout' => 15, 'sslverify' => false, 'body' => $api_params));
	
			// make sure the response came back okay
			if (is_wp_error($response) || 200 !== wp_remote_retrieve_response_code($response)) {
	
				if (is_wp_error($response)) {
					$message = $response->get_error_message();
				} else {
					$message = __('An error occurred, please try again.', 'dnxte-divi-essential');
				}
	
			} else {
	
				$license_data = json_decode(wp_remote_retrieve_body($response));
	
				if (false === $license_data->success) {
	
					switch ($license_data->error) {
	
					case 'expired':
	
						$message = sprintf(
							__('Your license key expired on %s.', 'dnxte-divi-essential'),
							date_i18n(get_option('date_format'), strtotime($license_data->expires, current_time('mysql')))
						);
						break;
	
					case 'disabled':
					case 'revoked':
	
						$message = __('Your license key has been disabled.', 'dnxte-divi-essential');
						break;
	
					case 'missing':
	
						$message = __('Invalid license.', 'dnxte-divi-essential');
						break;
	
					case 'invalid':
					case 'site_inactive':
	
						$message = __('Your license is not active for this URL.', 'dnxte-divi-essential');
						break;
	
					case 'item_name_mismatch':
	
						$message = sprintf(__('This appears to be an invalid license key for %s.', 'dnxte-divi-essential'), DNEXT_ESSENTIAL_ITEM_NAME);
						break;
	
					case 'no_activations_left':
	
						$message = __('Your license key has reached its activation limit.', 'dnxte-divi-essential');
						break;
	
					default:
	
						$message = __('An error occurred, please try again.', 'dnxte-divi-essential');
						break;
					}
	
				}
	
			}
	
			// Check if anything passed on a message constituting a failure
			if (!empty($message)) {
				$base_url = admin_url('admin.php?page=' . DNEXT_ESSENTIAL_PLUGIN_LICENSE_PAGE);
				$redirect = add_query_arg(array('sl_activation' => 'false', 'message' => rawurlencode($message)), $base_url);
	
				wp_safe_redirect($redirect);
				exit();
			}
	
			// $license_data->license will be either "valid" or "invalid"
	
			update_option('dnext_essential_license_status', $license_data->license);
			wp_safe_redirect(admin_url('admin.php?page=' . DNEXT_ESSENTIAL_PLUGIN_LICENSE_PAGE));
			exit();
		}
	}

	public static function dnext_essential_deactivate_license() {

		// listen for our activate button to be clicked
		if (isset($_POST['dnext_essential_plugin_license_deactivate'])) {
	
			// run a quick security check
			if (!check_admin_referer('dnext_essential_nonce', 'dnext_essential_nonce')) {
				return;
			}
			// get out if we didn't click the Activate button
	
			// retrieve the license from the database
			$license = '';
			if (get_option('dnext_essential_license_key') !== null) {
                $license = trim(get_option('dnext_essential_license_key') ?? '');
            }
	
			// data to send in our API request
			$api_params = array(
				'edd_action' => 'deactivate_license',
				'license'    => $license,
				'item_name'  => rawurlencode(DNEXT_ESSENTIAL_ITEM_NAME), // the name of our product in EDD
				'url'        => home_url(),
			);
	
			// Call the custom API.
			$response = wp_remote_post(DNEXT_ESSENTIAL_STORE_URL, array('timeout' => 15, 'sslverify' => false, 'body' => $api_params));
	
			// make sure the response came back okay
			if (is_wp_error($response) || 200 !== wp_remote_retrieve_response_code($response)) {
	
				if (is_wp_error($response)) {
					$message = $response->get_error_message();
				} else {
					$message = __('An error occurred, please try again.', 'dnxte-divi-essential');
				}
	
				$base_url = admin_url('admin.php?page=' . DNEXT_ESSENTIAL_PLUGIN_LICENSE_PAGE);
				$redirect = add_query_arg(array('sl_activation' => 'false', 'message' => rawurlencode($message)), $base_url);
	
				wp_safe_redirect($redirect);
				exit();
			}
	
			// decode the license data
			$license_data = json_decode(wp_remote_retrieve_body($response));
	
			// $license_data->license will be either "deactivated" or "failed"
			if ('deactivated' == $license_data->license) {
				delete_option('dnext_essential_license_status');
			}
	
			wp_safe_redirect(admin_url('admin.php?page=' . DNEXT_ESSENTIAL_PLUGIN_LICENSE_PAGE));
			exit();
	
		}
	}

	public function dnext_essential_check_license() {

		global $wp_version;
	
		$license = '';
			if (get_option('dnext_essential_license_key') !== null) {
                $license = trim(get_option('dnext_essential_license_key') ?? '');
            }
	
		$api_params = array(
			'edd_action' => 'check_license',
			'license'    => $license,
			'item_name'  => rawurlencode(DNEXT_ESSENTIAL_ITEM_NAME),
			'url'        => home_url(),
		);
	
		// Call the custom API.
		$response = wp_remote_post(DNEXT_ESSENTIAL_STORE_URL, array('timeout' => 15, 'sslverify' => false, 'body' => $api_params));
	
		if (is_wp_error($response)) {
			return false;
		}
	
		$license_data = json_decode(wp_remote_retrieve_body($response));
	
		if ('valid' == $license_data->license) {
			echo 'valid';exit;
			// this license is still valid
		} else {
			echo 'invalid';exit;
			// this license is no longer valid
		}
	}

	public static function dnext_essential_admin_notices() {
		if (isset($_GET['sl_activation']) && !empty($_GET['message'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	
			switch ($_GET['sl_activation']) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	
			case 'false':
				$message = urldecode(sanitize_text_field($_GET['message'])); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				?>
					<div class="error">
						<p><?php echo $message; // phpcs:ignore WordPress.Security.EscapeOutput ?></p>
					</div>
					<?php
	break;
	
			case 'true':
			default:
				// Developers can put a custom success message here for when activation is successful if they way.
				break;
	
			}
		}
	}

	/**
	 * 
	 * 5. the required plugin license function END
	 */
}