path = $path;
$this->url = $url;
$this->version = $version;
}
public static function boot( string $path, string $url, string $version ): self
{
if ( self::$instance !== null ) {
return self::$instance;
}
self::$instance = new self( $path, $url, $version );
self::$instance->registerHooks();
return self::$instance;
}
public function path(): string
{
return $this->path;
}
public function url(): string
{
return $this->url;
}
public function version(): string
{
return $this->version;
}
public function renderMissingWooCommerceNotice(): void
{
if ( ! \current_user_can( 'activate_plugins' ) ) {
return;
}
echo '
';
echo \esc_html__(
'Agent001 requires WooCommerce to be installed and active. The plugin is idle until WooCommerce is available.',
'agent001-support-assistant-for-woocommerce'
);
echo '
';
}
private function registerHooks(): void
{
if ( ! $this->isWooCommerceActive() ) {
\add_action( 'admin_notices', [ $this, 'renderMissingWooCommerceNotice' ] );
return;
}
$settings = new Settings();
$reader = new ProductReader( $GLOBALS['wpdb'] );
$http = new HttpClient();
$progress = new SyncProgress();
$synchronizer = new Synchronizer( $settings, $reader, $http, $progress );
$syncRunner = new SyncRunner( $synchronizer, $settings, $progress );
$syncRunner->register();
( new CachePurger() )->register();
( new DailySync( $settings, $syncRunner, $progress ) )->register();
$this->registerSyncHooks( $settings, $reader, $http );
$this->registerStorefront( $settings );
$this->registerAdmin( $settings, $http, $reader, $progress, $syncRunner );
}
private function registerSyncHooks( Settings $settings, ProductReader $reader, HttpClient $http ): void
{
( new ProductHooks( $settings ) )->register();
( new ProductSyncWorker( $settings, $reader, $http ) )->register();
( new OrderLookupController( $settings ) )->register();
}
private function registerStorefront( Settings $settings ): void
{
if ( \is_admin() ) {
return;
}
( new WidgetInjector( $settings ) )->register();
}
private function registerAdmin(
Settings $settings,
HttpClient $http,
ProductReader $reader,
SyncProgress $progress,
SyncRunner $syncRunner
): void {
if ( ! \is_admin() ) {
return;
}
$agents = new AgentSelectionController( $settings, $http );
$onboarding = new Onboarding( $settings, $progress );
$onboarding->register();
( new SettingsPage( $settings, $syncRunner, $progress, $agents, $this->path, $this->url, $this->version, $onboarding ) )->register();
$monitor = new IndexingMonitor( $settings, new HttpClient( 10, 1 ), $progress );
( new SyncAjaxController( $syncRunner, $progress, $reader, $settings, $monitor ) )->register();
( new ConnectController( $settings, $http ) )->register();
( new ReviewPrompt( $progress ) )->register();
$agents->register();
}
private function isWooCommerceActive(): bool
{
return \class_exists( 'WooCommerce' );
}
}