options_repository = $options_repository; $this->nonce_service = $nonce_service; $this->inline_css_generator = new InlineCssGenerator($options_repository, $logger); } /** * Initialize asset management. */ public function init(): void { add_action('wp_enqueue_scripts', [$this, 'enqueue_frontend_assets']); add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_assets']); // Inject inline CSS early in head (priority 1) add_action('admin_head', [$this->inline_css_generator, 'inject_inline_css'], 1); } /** * Enqueue frontend assets. */ public function enqueue_frontend_assets(): void { // Always enqueue main CSS for overlay styles wp_enqueue_style( 'adsd-style', plugin_dir_url(\ADSD_PLUGIN_FILE) . 'build/css/style.min.css', [], ADSD_PLUGIN_VERSION ); // Only load JavaScript for users with proper roles if (!$this->should_load_frontend_assets()) { return; } // Enqueue main JavaScript wp_enqueue_script( 'adsd-app', plugin_dir_url(\ADSD_PLUGIN_FILE) . 'build/js/app.js', ['jquery'], ADSD_PLUGIN_VERSION, true ); // Localize script with data wp_localize_script('adsd-app', 'adsdData', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => $this->nonce_service->create_nonce('adsd_selection_mode'), 'isActive' => $this->is_selection_mode_active(), 'strings' => [ 'selectElement' => __('Select Element', 'ads-destroyer'), 'cancel' => __('Cancel', 'ads-destroyer'), 'confirm' => __('Confirm', 'ads-destroyer'), 'elementSelected' => __('Element Selected', 'ads-destroyer'), 'xpathGenerated' => __('XPath Generated', 'ads-destroyer'), ], ]); } /** * Enqueue admin assets. * * @param string $hook_suffix */ public function enqueue_admin_assets(string $hook_suffix): void { // Always enqueue main CSS for overlay styles wp_enqueue_style( 'adsd-style', plugin_dir_url(\ADSD_PLUGIN_FILE) . 'build/css/style.min.css', [], '1.0.0' ); // Only load admin-specific assets on our admin pages if (strpos($hook_suffix, 'ads-destroyer') === false) { return; } // Enqueue admin CSS wp_enqueue_style( 'adsd-admin-style', plugin_dir_url(\ADSD_PLUGIN_FILE) . 'build/css/admin-settings-style.min.css', [], '1.0.0' ); // Enqueue admin JavaScript wp_enqueue_script( 'adsd-admin-settings', plugin_dir_url(\ADSD_PLUGIN_FILE) . 'build/js/admin-settings.js', ['jquery', 'wp-util'], '1.0.0', true ); // Localize admin script wp_localize_script('adsd-admin-settings', 'adsdAdminData', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => $this->nonce_service->create_nonce('adsd_admin_actions'), 'strings' => [ 'confirmDelete' => __('Are you sure you want to delete this rule?', 'ads-destroyer'), 'ruleSaved' => __('Rule saved successfully', 'ads-destroyer'), 'ruleDeleted' => __('Rule deleted successfully', 'ads-destroyer'), 'error' => __('An error occurred', 'ads-destroyer'), 'testingXPath' => __('Testing XPath...', 'ads-destroyer'), 'xPathValid' => __('XPath is valid', 'ads-destroyer'), 'xPathInvalid' => __('XPath is invalid', 'ads-destroyer'), ], ]); } /** * Check if frontend assets should be loaded. * * @return bool */ private function should_load_frontend_assets(): bool { $allowed_roles = $this->options_repository->get_option('allowed_roles', ['administrator']); $user = wp_get_current_user(); if (!$user || !$user->ID) { return false; } return !empty(array_intersect($user->roles, $allowed_roles)); } /** * Check if selection mode is currently active. * * @return bool */ private function is_selection_mode_active(): bool { return isset($_SESSION['adsd_selection_mode']) && $_SESSION['adsd_selection_mode'] === true; } }