HEX
Server: Apache/2
System: Linux bq-e705.pointdnshere.com 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64
User: wellmix (1103)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/wellmix/public_html/wp-content/plugins/pymntpl-paypal-woocommerce/src/Main.php
<?php


namespace PaymentPlugins\WooCommerce\PPCP;

use PaymentPlugins\PayPalSDK\PayPalClient;
use PaymentPlugins\WooCommerce\PPCP\Admin\Install;
use PaymentPlugins\WooCommerce\PPCP\Admin\Menus;
use PaymentPlugins\WooCommerce\PPCP\Admin\MetaBoxes\Order as OrderMetaBox;
use PaymentPlugins\WooCommerce\PPCP\Admin\MetaBoxes\ProductData as ProductDataMetaBox;
use PaymentPlugins\WooCommerce\PPCP\Admin\PageController;
use PaymentPlugins\WooCommerce\PPCP\Admin\Settings\AdvancedSettings;
use PaymentPlugins\WooCommerce\PPCP\Admin\Settings\APISettings;
use PaymentPlugins\WooCommerce\PPCP\Admin\Settings\PayLaterMessageSettings;
use PaymentPlugins\WooCommerce\PPCP\Admin\Settings\SettingsApi;
use PaymentPlugins\WooCommerce\PPCP\Admin\Update;
use PaymentPlugins\WooCommerce\PPCP\Assets\AssetDataApi;
use PaymentPlugins\WooCommerce\PPCP\Cache\CacheHandler;
use PaymentPlugins\WooCommerce\PPCP\Cache\CacheInterface;
use PaymentPlugins\WooCommerce\PPCP\Factories\CoreFactories;
use PaymentPlugins\WooCommerce\PPCP\Integrations\PluginIntegrationsRegistry;
use PaymentPlugins\WooCommerce\PPCP\Package\PackageController;
use PaymentPlugins\WooCommerce\PPCP\Package\PackageRegistry;
use PaymentPlugins\WooCommerce\PPCP\Payments\Gateways\PayPalGateway;
use PaymentPlugins\WooCommerce\PPCP\Payments\PaymentGateways;
use PaymentPlugins\WooCommerce\PPCP\Assets\AssetsApi;
use PaymentPlugins\WooCommerce\PPCP\Rest\RestController;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\CartPayLaterMessage;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\CartPaymentButtons;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\ProductPayLaterMessage;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\ProductPaymentButtons;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\ShortCodesController;
use PaymentPlugins\WooCommerce\PPCP\Shortcodes\ShortCodesRegistry;

/**
 * Main class that loads all functionality.
 *
 * Class Main
 *
 * @package PaymentPlugins\WooCommerce\PPCP
 */
class Main {

	private $container;

	private $version;

	private $path;

	private $plugin_name;

	private $file;

	public static function container() {
		static $container;
		if ( ! $container ) {
			$container = new \PaymentPlugins\WooCommerce\PPCP\Container\Container();
		}

		return $container;
	}

	/**
	 * Main constructor.
	 *
	 * @param string $version
	 * @param string $file
	 */
	public function __construct( $version, $file ) {
		$this->file        = $file;
		$this->path        = plugin_dir_path( $file );
		$this->plugin_name = plugin_basename( $file );
		$this->version     = $version;
		$this->container   = self::container();
		add_action( 'woocommerce_init', [ $this, 'register_woocommerce_dependencies' ], 10 );
		add_action( 'woocommerce_init', [ $this, 'initialize' ], 15 );
		add_action( 'plugins_loaded', [ $this, 'do_plugins_loaded' ] );
		$this->register();
		$this->container->get( Install::class );
		$this->container->get( Update::class );
		$this->container->get( PackageController::class );
	}

	public function initialize() {
		$this->container->get( PaymentGateways::class );
		$this->container->get( RestApi::class );
		$this->container->get( PluginIntegrationController::class );
		$this->container->get( OrderStatusController::class );
		$this->container->get( PaymentButtonController::class );
		$this->container->get( Conversion\Controller::class );
		$this->container->get( WebhookEventReceiver::class );
		$this->container->get( OrderApplicationUrlHandler::class );
		$this->container->get( RefundsManager::class );
		$this->container->get( PayPalQueryParams::class );
		$this->container->get( ContextHandler::class );
		$this->container->get( AjaxFrontendHandler::class );
		$this->container->get( ShortCodesController::class );
		$this->container->get( Messages::class );

		if ( is_admin() ) {
			$this->container->get( SettingsApi::class );
			$this->container->get( Menus::class );
			$this->container->get( PageController::class );
			$this->container->get( OrderMetaBox::class );
			$this->container->get( ProductDataMetaBox::class );
		} else {
			$this->container->get( SettingsRegistry::class );
		}

		do_action( 'wc_ppcp_loaded' );
	}

	/**
	 * These are dependencies only registered when WooCommerce is active.
	 */
	public function register_woocommerce_dependencies() {
		// Settings
		$this->container->register( APISettings::class, function ( $container ) {
			return new APISettings( $container->get( 'adminAssets' ), $container->get( Logger::class ) );
		} );
		$this->container->register( AdvancedSettings::class, function ( $container ) {
			return new AdvancedSettings( $container->get( 'adminAssets' ), $container->get( Logger::class ) );
		} );
		$this->container->register( PayLaterMessageSettings::class, function ( $container ) {
			return new PayLaterMessageSettings( $container->get( 'adminAssets' ), $container->get( Logger::class ) );
		} );
		$this->container->register( SettingsRegistry::class, function ( $container ) {
			return new SettingsRegistry( [
				$container->get( APISettings::class ),
				$container->get( AdvancedSettings::class ),
				$container->get( PayLaterMessageSettings::class )
			], $container );
		} );
		$this->container->register( PaymentGateways::class, function ( $container ) {
			$payment_gateways = new PaymentGateways(
				$container->get( PaymentMethodRegistry::class ),
				$container->get( AssetsApi::class ),
				$container->get( AssetDataApi::class ),
				$container->get( APISettings::class ) );
			$payment_gateways->set_page_context( $container->get( ContextHandler::class ) );

			return $payment_gateways;
		} );
		$this->container->register( OrderStatusController::class, function ( $container ) {
			return new OrderStatusController( $container->get( AdvancedSettings::class ) );
		} );
		$this->container->register( PluginIntegrationController::class, function ( $container ) {
			return new PluginIntegrationController(
				$container->get( PluginIntegrationsRegistry::class ),
				$container );
		} );
		$this->container->register( PayPalClient::class, function ( $container ) {
			return new WPPayPalClient( $container->get( APISettings::class ), $container->get( Logger::class ) );
		} );
		$this->container->register( TemplateLoader::class, function ( $container ) {
			return new TemplateLoader( $container->get( Config::class ), 'pymntpl-paypal-woocommerce' );
		} );
		$this->container->register( PayPalGateway::class, function ( $container ) {
			return new PayPalGateway(
				$container->get( PaymentHandler::class ),
				$container->get( Logger::class ),
				$container->get( AssetsApi::class ),
				$container->get( TemplateLoader::class ) );
		} );
		$this->container->register( PaymentHandler::class, function ( $container ) {
			return new PaymentHandler(
				$container->get( PayPalClient::class ),
				$container->get( CoreFactories::class ),
				$container->get( CacheHandler::class )
			);
		} );
		$this->container->register( SettingsApi::class, function ( $container ) {
			return new SettingsApi( $container->get( SettingsRegistry::class ), $container->get( 'adminAssets' ), $container->get( 'adminData' ) );
		} );
		$this->container->register( 'adminAssets', function ( $container ) {
			return new AssetsApi( $container->get( Config::class ) );
		} );
		$this->container->register( 'adminData', function ( $container ) {
			return new AssetDataApi( 'wc-ppcp-admin-commons' );
		} );
		$this->container->register( AssetsApi::class, function ( $container ) {
			return new AssetsApi( $container->get( Config::class ), [
				'wc-ppcp-utils'    => 'build/js/utils.js',
				'wc-ppcp-product'  => 'build/js/product.js',
				'wc-ppcp-cart'     => 'build/js/cart.js',
				'wc-ppcp-minicart' => 'build/js/minicart.js'
			] );
		} );
		$this->container->register( AssetDataApi::class, function ( $container ) {
			return new AssetDataApi();
		} );
		$this->container->register( RestController::class, function ( $container ) {
			return new RestController( $container );
		} );
		$this->container->register( RestApi::class, function ( $container ) {
			return new RestApi( $container->get( RestController::class ) );
		} );
		$this->container->register( PluginIntegrationsRegistry::class, function ( $container ) {
			return new PluginIntegrationsRegistry( $container );
		} );
		$this->container->register( Messages::class, function ( $container ) {
			return new Messages();
		} );
		$this->container->register( PaymentButtonController::class, function ( $container ) {
			$instance = new PaymentButtonController(
				$container->get( PaymentGateways::class ),
				$container->get( AssetDataApi::class ),
				$container->get( TemplateLoader::class )
			);
			$instance->set_cart_location( $container->get( AdvancedSettings::class )->get_option( 'cart_location' ) );
			$instance->set_minicart_location( $container->get( AdvancedSettings::class )->get_option( 'minicart_location' ) );
			$instance->initialize();

			return $instance;
		} );
		$this->container->register( WebhookEventReceiver::class, function ( $container ) {
			return new WebhookEventReceiver(
				$container->get( PayPalClient::class ),
				$container->get( PaymentHandler::class ),
				$container->get( Logger::class )
			);
		} );
		$this->container->register( OrderApplicationUrlHandler::class, function ( $container ) {
			$handler = new OrderApplicationUrlHandler( $container->get( PaymentGateways::class ) );
			$handler->initialize();

			return $handler;
		} );
		$this->container->register( RefundsManager::class, function ( $container ) {
			return new RefundsManager();
		} );
		$this->container->register( PayPalQueryParams::class, function ( $container ) {
			$instance = new PayPalQueryParams( $container->get( AssetDataApi::class ), $container->get( APISettings::class ) );
			$instance->set_context_handler( $container->get( ContextHandler::class ) );

			return $instance;
		} );
		$this->container->register( ContextHandler::class, function ( $container ) {
			return new ContextHandler();
		} );
		$this->container->register( CoreFactories::class, function ( $container ) {
			$instance = new CoreFactories();
			$instance->register( $container );

			return $instance;
		} );
		$this->container->register( Conversion\Registry::class, function ( $container ) {
			return new Conversion\Registry( $container );
		} );
		$this->container->register( Conversion\Controller::class, function ( $container ) {
			return new Conversion\Controller( $container->get( Conversion\Registry::class ) );
		} );
		$this->container->register( AjaxFrontendHandler::class, function ( $container ) {
			return new AjaxFrontendHandler(
				$container->get( PayPalClient::class ),
				$container->get( PaymentGateways::class ),
				$container->get( CacheHandler::class )
			);
		} );
		$this->container->register( CacheHandler::class, function () {
			return new CacheHandler( Constants::PPCP_CACHE_KEY );
		} );
		$this->container->register( ShortCodesRegistry::class, function ( $container ) {
			return new ShortCodesRegistry( $container );
		} );
		$this->container->register( ShortCodesController::class, function ( $container ) {
			return new ShortCodesController( $container->get( ShortCodesRegistry::class ) );
		} );
		$this->container->register( ProductPaymentButtons::class, function ( $container ) {
			return new ProductPaymentButtons(
				$container->get( AssetsApi::class ),
				$container->get( TemplateLoader::class )
			);
		} );
		$this->container->register( CartPaymentButtons::class, function ( $container ) {
			return new CartPaymentButtons(
				$container->get( AssetsApi::class ),
				$container->get( TemplateLoader::class )
			);
		} );
		$this->container->register( ProductPayLaterMessage::class, function ( $container ) {
			return new ProductPayLaterMessage(
				$container->get( AssetsApi::class ),
				$container->get( TemplateLoader::class )
			);
		} );
		$this->container->register( CartPayLaterMessage::class, function ( $container ) {
			return new CartPayLaterMessage(
				$container->get( AssetsApi::class ),
				$container->get( TemplateLoader::class )
			);
		} );
	}

	/**
	 * These are classes that don't have a dependency on WC.
	 */
	public function register() {
		$this->container->register( Config::class, function ( $container ) {
			return new Config( $this->version, dirname( __FILE__ ) );
		} );
		$this->container->register( PaymentMethodRegistry::class, function ( $container ) {
			return new PaymentMethodRegistry( $container );
		} );
		$this->container->register( Logger::class, function ( $container ) {
			return new Logger( 'wc-ppcp' );
		} );
		$this->container->register( Install::class, function ( $container ) {
			return new Install( $this->plugin_name, $this->version );
		} );
		$this->container->register( Update::class, function () {
			return new Update( $this->version, $this->path . 'updates' );
		} );
		$this->container->register( Menus::class, function () {
			return new Menus();
		} );
		$this->container->register( PageController::class, function ( $container ) {
			return new PageController( $container->get( 'adminAssets' ), $container->get( 'adminData' ) );
		} );
		$this->container->register( OrderMetaBox::class, function ( $container ) {
			return new OrderMetaBox( $container->get( 'adminAssets' ) );
		} );
		$this->container->register( ProductDataMetaBox::class, function ( $container ) {
			return new ProductDataMetaBox( $container->get( 'adminAssets' ) );
		} );

		// register packages
		$this->container->register( \PaymentPlugins\PPCP\Blocks\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\Blocks\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\CheckoutWC\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\CheckoutWC\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\Stripe\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\Stripe\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\WooFunnels\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\WooFunnels\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\MondialRelay\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\MondialRelay\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\Elementor\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\Elementor\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\WooCommerceExtraProductOptions\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\WooCommerceExtraProductOptions\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\WooCommerceShipStation\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\WooCommerceShipStation\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\WooCommerceGermanized\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\WooCommerceGermanized\Package( $container, $this->version );
		} );
		$this->container->register( \PaymentPlugins\PPCP\WooCommerceProductAddons\Package::class, function ( $container ) {
			return new \PaymentPlugins\PPCP\WooCommerceProductAddons\Package( $container, $this->version );
		} );


		$this->container->register( PackageRegistry::class, function ( $container ) {
			return new PackageRegistry( $container );
		} );
		$this->container->register( PackageController::class, function ( $container ) {
			$package_controller = new PackageController( $container->get( PackageRegistry::class ) );
			$package_controller->set_packages( [
				\PaymentPlugins\PPCP\Blocks\Package::class,
				\PaymentPlugins\PPCP\CheckoutWC\Package::class,
				\PaymentPlugins\PPCP\Stripe\Package::class,
				\PaymentPlugins\PPCP\WooFunnels\Package::class,
				\PaymentPlugins\PPCP\MondialRelay\Package::class,
				\PaymentPlugins\PPCP\Elementor\Package::class,
				\PaymentPlugins\PPCP\WooCommerceExtraProductOptions\Package::class,
				\PaymentPlugins\PPCP\WooCommerceShipStation\Package::class,
				\PaymentPlugins\PPCP\WooCommerceGermanized\Package::class,
				\PaymentPlugins\PPCP\WooCommerceProductAddons\Package::class
			] );

			return $package_controller;
		} );
	}

	public function do_plugins_loaded() {
		include_once __DIR__ . '/wc-ppcp-functions.php';
		$this->load_text_domain();
		$this->declare_features();
	}

	public function load_text_domain() {
		load_plugin_textdomain( 'pymntpl-paypal-woocommerce', false, dirname( $this->plugin_name ) . '/i18n/languages' );
	}

	private function declare_features() {
		if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
			add_action( 'before_woocommerce_init', function () {
				try {
					\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', $this->file, true );
					\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'cart_checkout_blocks', $this->file, true );
				} catch ( \Exception $e ) {
				}
			} );
		}
	}

	public function version() {
		return $this->version;
	}

}