HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/wp-rollback/src/PluginSetup/PluginScripts.php
<?php

/**
 * Plugin Scripts
 *
 * @package WpRollback\Free\PluginSetup
 */

declare(strict_types=1);

namespace WpRollback\Free\PluginSetup;

use WpRollback\Free\Core\Constants;
use WpRollback\SharedCore\Core\Assets\AssetsManager;
use WpRollback\SharedCore\Core\SharedCore;
use WpRollback\SharedCore\Rollbacks\Registry\RollbackStepRegisterer;
/**
 * Handles script and style registration for the free plugin.
 *
 */
class PluginScripts
{
    /**
     * Initialize scripts.
     *
     * @return void
     */
    public function initialize(): void
    {
        add_action('admin_enqueue_scripts', [$this, 'enqueueAssets']);
        add_action('admin_enqueue_scripts', [$this, 'enqueueCommandPaletteScript']);
    }

    /**
     * Enqueue plugin assets.
     *
     * @return void
     */
    public function enqueueAssets(): void
    {
        $assetsManager = SharedCore::container()->make(AssetsManager::class);
        
        // Determine the correct admin URL based on context
        $adminUrl = is_network_admin()
            ? network_admin_url('settings.php?page=wp-rollback')
            : admin_url('tools.php?page=wp-rollback');
        
        $assetsManager->enqueueScript('tools', [
            'rollback_nonce' => wp_create_nonce('wpr_rollback_nonce'),
            'restApiNonce' => wp_create_nonce('wp_rest'),
            'adminUrl' => $adminUrl,
            'pluginsUrl' => admin_url('plugins.php'),
            'themesUrl' => admin_url('themes.php'),
            'restUrl' => esc_url_raw(rest_url()),
            'rollbackSteps' => $this->getRollbackSteps(),
        ]);
    }

    /**
     * Enqueue the command palette script on all admin pages.
     *
     * Bypasses AssetsManager's screen restriction intentionally — the command
     * palette must be available everywhere in wp-admin, not just the Tools page.
     *
     * @return void
     */
    public function enqueueCommandPaletteScript(): void
    {
        if (!current_user_can('manage_options')) {
            return;
        }

        // Graceful degradation: command palette requires WP 6.3+
        if (!wp_script_is('wp-commands', 'registered')) {
            return;
        }

        $constants = SharedCore::container()->make(Constants::class);
        $assetFile = $constants->getPluginDir() . '/build/commandPalette.asset.php';
        $assetData = file_exists($assetFile)
            ? require $assetFile
            : ['dependencies' => [], 'version' => $constants->getVersion()];

        $handle = $constants->getSlug() . '-command-palette';

        wp_enqueue_script(
            $handle,
            $constants->getPluginUrl() . '/build/commandPalette.js',
            $assetData['dependencies'],
            $assetData['version'],
            true
        );

        if (!function_exists('get_plugins')) {
            require_once ABSPATH . 'wp-admin/includes/plugin.php';
        }

        $plugins = [];
        foreach (get_plugins() as $pluginFile => $pluginData) {
            $pluginFile = (string) $pluginFile;
            $slug = dirname($pluginFile);
            if ('.' === $slug) {
                $slug = basename($pluginFile, '.php');
            }
            $plugins[] = [
                'name' => $pluginData['Name'],
                'slug' => $slug,
            ];
        }

        $themes = [];
        foreach (wp_get_themes() as $themeSlug => $themeObject) {
            $themes[] = [
                'name' => $themeObject->get('Name'),
                'slug' => $themeSlug,
            ];
        }

        $adminUrl = is_network_admin()
            ? network_admin_url('settings.php?page=wp-rollback')
            : admin_url('tools.php?page=wp-rollback');

        wp_localize_script(
            $handle,
            'wprCommandPaletteData',
            [
                'plugins'  => $plugins,
                'themes'   => $themes,
                'adminUrl' => $adminUrl,
            ]
        );

        wp_set_script_translations($handle, $constants->getTextDomain(), $constants->getPluginDir() . '/languages');
    }

    /**
     * Get rollback steps data for script localization.
     *
     * @return array
     */
    protected function getRollbackSteps(): array
    {
        $stepRegisterer = SharedCore::container()->make(RollbackStepRegisterer::class);
        $steps = [];
        
        foreach ($stepRegisterer->getAllRollbackSteps() as $stepClass) {
            $steps[] = [
                'id' => $stepClass::id(),
                'rollbackProcessingMessage' => $stepClass::rollbackProcessingMessage()
            ];
        }
        
        return $steps;
    }
}