is_v2()) { add_action('admin_notices', [$this, 'begin_notice_capture'], -9999); add_action('admin_notices', [$this, 'end_notice_capture'], 9999); } } public function is_v2() { return get_option(self::UI_OPTION, 'v2') !== 'legacy'; } private function is_our_screen() { return isset($_GET['page']) && $_GET['page'] === $this->menu_slug && !AdminHelper::is_pro_installed(); // phpcs:ignore WordPress.Security.NonceVerification } public function add_menu() { if (!current_user_can($this->capability) || AdminHelper::is_pro_installed()) { return; } // SVG icon (base64 encoded) $icon_svg = 'data:image/svg+xml;base64,' . base64_encode(' '); add_menu_page( __('Divi Torque', 'divitorque'), __('Divi Torque', 'divitorque'), $this->capability, $this->menu_slug, [$this, 'render_app'], $icon_svg, 130 ); add_submenu_page( $this->menu_slug, __('Dashboard', 'divitorque'), __('Dashboard', 'divitorque'), $this->capability, $this->menu_slug, array($this, 'render_app') ); add_submenu_page( $this->menu_slug, __('Modules', 'divitorque'), __('Modules', 'divitorque'), $this->capability, "{$this->menu_slug}&path=module-manager", [$this, 'render_app'] ); if ($this->is_v2()) { add_submenu_page( $this->menu_slug, __('Settings', 'divitorque'), __('Settings', 'divitorque'), $this->capability, "{$this->menu_slug}&path=settings", [$this, 'render_app'] ); } } public function render_app() { if ($this->is_v2()) { $this->enqueue_v2(); echo '
'; return; } $this->render_try_v2_banner(); $this->enqueue_scripts(); echo '
'; } /* ─── Dashboard v2 ─────────────────────────────────────────────── */ private function enqueue_v2() { $base = DIVI_TORQUE_LITE_URL . 'admin/build/'; wp_enqueue_style('divi-torque-lite-admin-v2', $base . 'index.css', [], DIVI_TORQUE_LITE_VERSION); wp_enqueue_script( 'divi-torque-lite-admin-v2', $base . 'index.js', ['wp-api-fetch', 'wp-i18n'], DIVI_TORQUE_LITE_VERSION, true ); wp_add_inline_script( 'divi-torque-lite-admin-v2', 'window.divitorqueData = ' . wp_json_encode($this->get_v2_data()) . ';', 'before' ); } private function get_v2_data() { return [ 'root' => esc_url_raw(get_rest_url()), 'nonce' => wp_create_nonce('wp_rest'), 'ns' => 'divitorque-lite/v1', 'version' => DIVI_TORQUE_LITE_VERSION, 'adminUrl' => esc_url_raw(admin_url()), 'isLite' => true, 'docsUrl' => 'https://divitorque.com/docs/', 'upgradeUrl' => 'https://divitorque.com/pricing/?utm_source=divi-torque-lite&utm_medium=wp-admin&utm_campaign=upgrade-to-pro', 'rollbackUrl' => esc_url_raw(admin_url('admin.php?page=divitorque-rollback')), 'moduleInfo' => ModulesManager::get_all_modules(), 'abilities' => ['supported' => false], ]; } public function body_class($classes) { if ($this->is_v2() && $this->is_our_screen()) { $classes .= ' pp-scope'; } return $classes; } public function begin_notice_capture() { if (!$this->is_our_screen()) { return; } ob_start(); } public function end_notice_capture() { if (!$this->is_our_screen()) { return; } $html = ob_get_clean(); echo ''; // phpcs:ignore WordPress.Security.EscapeOutput } /* ─── v1 ⇄ v2 switching ────────────────────────────────────────── */ public function register_switch_route() { register_rest_route('divitorque-lite/v1', '/switch_dashboard_ui', [ 'methods' => 'POST', 'callback' => function ($request) { $ui = $request->get_param('ui') === 'legacy' ? 'legacy' : 'v2'; update_option(self::UI_OPTION, $ui); return rest_ensure_response(['ui' => $ui]); }, 'permission_callback' => function () { return current_user_can($this->capability); }, ]); } /** Nonce link on the legacy banner: admin.php?page=divitorque&dtl_ui=v2 */ public function handle_switch_link() { if (!isset($_GET['dtl_ui']) || !$this->is_our_screen()) { return; } if (!current_user_can($this->capability)) { return; } check_admin_referer('dtl_switch_ui'); update_option(self::UI_OPTION, $_GET['dtl_ui'] === 'legacy' ? 'legacy' : 'v2'); wp_safe_redirect(admin_url('admin.php?page=' . $this->menu_slug)); exit; } private function render_try_v2_banner() { $url = wp_nonce_url(admin_url('admin.php?page=' . $this->menu_slug . '&dtl_ui=v2'), 'dtl_switch_ui'); ?>
wp_deps(), DIVI_TORQUE_LITE_VERSION, true ); wp_enqueue_style( 'divi-torque-lite-dashboard', $dashboard_css, ['wp-components'], DIVI_TORQUE_LITE_VERSION ); $localize = [ 'root' => esc_url_raw(get_rest_url()), 'admin_slug' => $this->menu_slug, 'nonce' => wp_create_nonce('wp_rest'), 'assetsPath' => esc_url_raw($assets_url), 'version' => DIVI_TORQUE_LITE_VERSION, 'module_info' => ModulesManager::get_all_modules(), 'pro_module_info' => ModulesManager::get_all_pro_modules(), 'module_icon_path' => DIVI_TORQUE_LITE_URL . 'assets/imgs/icons', 'isProInstalled' => AdminHelper::is_pro_installed(), 'upgradeLink' => 'https://divitorque.com/pricing-lifetime/?utm_source=divi-torque-lite&utm_medium=wp-admin&utm_campaign=upgrade-to-pro&utm_content=menu-button', 'currentVersion' => DIVI_TORQUE_LITE_VERSION, ]; wp_localize_script('divi-torque-lite-dashboard', 'diviTorqueLite', $localize); } public function admin_enqueue_scripts() { wp_enqueue_style( 'divi-torque-lite-admin', DIVI_TORQUE_LITE_URL . 'assets/admin/css/admin.css', [], DIVI_TORQUE_LITE_VERSION ); } public function wp_deps() { return [ 'react', 'wp-api', 'wp-i18n', 'lodash', 'wp-components', 'wp-element', 'wp-api-fetch', 'wp-core-data', 'wp-data', 'wp-dom-ready', ]; } }