From 6793d7217a84b8dcf13bf56e2c5040d466d1e5af Mon Sep 17 00:00:00 2001 From: David Remer Date: Tue, 28 Apr 2020 11:42:23 +0300 Subject: [PATCH] introduce admin-notices --- composer.json | 5 ++ .../ppcp-admin-notices/composer.json | 12 +++ .../ppcp-admin-notices/extensions.php | 5 ++ modules.local/ppcp-admin-notices/module.php | 10 +++ modules.local/ppcp-admin-notices/services.php | 31 +++++++ .../ppcp-admin-notices/src/AdminNotices.php | 37 +++++++++ .../ppcp-admin-notices/src/Entity/Message.php | 34 ++++++++ .../src/Renderer/Renderer.php | 31 +++++++ .../src/Renderer/RendererInterface.php | 11 +++ .../src/Repository/Repository.php | 26 ++++++ .../src/Repository/RepositoryInterface.php | 15 ++++ modules.local/ppcp-wc-gateway/composer.json | 1 + .../src/Notice/AuthorizeOrderActionNotice.php | 80 +++++++++++++------ .../src/Notice/ConnectAdminNotice.php | 30 ++++--- .../ppcp-wc-gateway/src/WcGatewayModule.php | 31 ++++--- 15 files changed, 303 insertions(+), 56 deletions(-) create mode 100644 modules.local/ppcp-admin-notices/composer.json create mode 100644 modules.local/ppcp-admin-notices/extensions.php create mode 100644 modules.local/ppcp-admin-notices/module.php create mode 100644 modules.local/ppcp-admin-notices/services.php create mode 100644 modules.local/ppcp-admin-notices/src/AdminNotices.php create mode 100644 modules.local/ppcp-admin-notices/src/Entity/Message.php create mode 100644 modules.local/ppcp-admin-notices/src/Renderer/Renderer.php create mode 100644 modules.local/ppcp-admin-notices/src/Renderer/RendererInterface.php create mode 100644 modules.local/ppcp-admin-notices/src/Repository/Repository.php create mode 100644 modules.local/ppcp-admin-notices/src/Repository/RepositoryInterface.php diff --git a/composer.json b/composer.json index 67e599cab..2f76c0917 100644 --- a/composer.json +++ b/composer.json @@ -23,11 +23,16 @@ { "type": "path", "url": "modules.local/ppcp-wc-gateway" + }, + { + "type": "path", + "url": "modules.local/ppcp-admin-notices" } ], "require": { "dhii/module-interface": "0.2.x-dev", "psr/container": "^1.0", + "inpsyde/ppcp-admin-notices": "dev-master", "inpsyde/ppcp-button": "dev-master", "inpsyde/ppcp-wc-gateway": "dev-master", "oomphinc/composer-installers-extender": "^1.1", diff --git a/modules.local/ppcp-admin-notices/composer.json b/modules.local/ppcp-admin-notices/composer.json new file mode 100644 index 000000000..b5fd1e948 --- /dev/null +++ b/modules.local/ppcp-admin-notices/composer.json @@ -0,0 +1,12 @@ +{ + "name": "inpsyde/ppcp-admin-notices", + "type": "inpsyde-module", + "require": { + "dhii/module-interface": "0.2.x-dev" + }, + "autoload": { + "psr-4": { + "Inpsyde\\PayPalCommerce\\AdminNotices\\": "src/" + } + } +} \ No newline at end of file diff --git a/modules.local/ppcp-admin-notices/extensions.php b/modules.local/ppcp-admin-notices/extensions.php new file mode 100644 index 000000000..5989f2eb7 --- /dev/null +++ b/modules.local/ppcp-admin-notices/extensions.php @@ -0,0 +1,5 @@ + function(ContainerInterface $container) : RendererInterface { + + $repository = $container->get('admin-notices.repository'); + return new Renderer($repository); + }, + 'admin-notices.repository' => function(ContainerInterface $container) : RepositoryInterface { + + return new Repository(); + } +]; diff --git a/modules.local/ppcp-admin-notices/src/AdminNotices.php b/modules.local/ppcp-admin-notices/src/AdminNotices.php new file mode 100644 index 000000000..436fe118a --- /dev/null +++ b/modules.local/ppcp-admin-notices/src/AdminNotices.php @@ -0,0 +1,37 @@ +get('admin-notices.renderer'); + $renderer->render(); + } + ); + } +} \ No newline at end of file diff --git a/modules.local/ppcp-admin-notices/src/Entity/Message.php b/modules.local/ppcp-admin-notices/src/Entity/Message.php new file mode 100644 index 000000000..a1b6a3811 --- /dev/null +++ b/modules.local/ppcp-admin-notices/src/Entity/Message.php @@ -0,0 +1,34 @@ +type = $type; + $this->message = $message; + $this->dismissable = $dismissable; + } + + public function message() : string + { + return $this->message; + } + + public function type() : string + { + return $this->type; + } + + public function isDismissable() : bool + { + return $this->dismissable; + } +} \ No newline at end of file diff --git a/modules.local/ppcp-admin-notices/src/Renderer/Renderer.php b/modules.local/ppcp-admin-notices/src/Renderer/Renderer.php new file mode 100644 index 000000000..3aa864500 --- /dev/null +++ b/modules.local/ppcp-admin-notices/src/Renderer/Renderer.php @@ -0,0 +1,31 @@ +repository = $repository; + } + + public function render(): bool + { + $messages = $this->repository->currentMessages(); + foreach ($messages as $message) { + printf( + '

%s

', + $message->type(), + ($message->isDismissable()) ? 'is-dismissible' : '', + wp_kses_post($message->message()) + ); + } + + return (bool) count($messages); + } +} \ No newline at end of file diff --git a/modules.local/ppcp-admin-notices/src/Renderer/RendererInterface.php b/modules.local/ppcp-admin-notices/src/Renderer/RendererInterface.php new file mode 100644 index 000000000..5f3c87c03 --- /dev/null +++ b/modules.local/ppcp-admin-notices/src/Renderer/RendererInterface.php @@ -0,0 +1,11 @@ +getMessage(); + if (! $message) { + return null; + } - return $messages; + return new Message($message['message'], $message['type']); + } + + public function getMessage(): array + { + $messages[self::NO_INFO] = [ + 'message' => __( + 'Could not retrieve information. Try again later.', + 'woocommerce-paypal-gateway' + ), + 'type' => 'error', + ]; + $messages[self::ALREADY_CAPTURED] = [ + 'message' => __( + 'Payment already captured.', + 'woocommerce-paypal-gateway' + ), + 'type' => 'error', + ]; + $messages[self::FAILED] = [ + 'message' => __( + 'Failed to capture. Try again later.', + 'woocommerce-paypal-gateway' + ), + 'type' => 'error', + ]; + $messages[self::NOT_FOUND] = [ + 'message' => __( + 'Could not find payment to process.', + 'woocommerce-paypal-gateway' + ), + 'type' => 'error', + ]; + $messages[self::SUCCESS] = [ + 'message' => __( + 'Payment successfully captured.', + 'woocommerce-paypal-gateway' + ), + 'type' => 'success', + ]; + + if (! isset($_GET['ppcp-message'])) { + return []; + } + $messageId = absint($_GET[self::QUERY_PARAM]); + return (isset($messages[$messageId])) ? $messages[$messageId] : []; } public static function displayMessage(int $messageCode): void @@ -43,7 +75,7 @@ class AuthorizeOrderActionNotice 'redirect_post_location', function ($location) use ($messageCode) { return add_query_arg( - 'message', + self::QUERY_PARAM, $messageCode, $location ); diff --git a/modules.local/ppcp-wc-gateway/src/Notice/ConnectAdminNotice.php b/modules.local/ppcp-wc-gateway/src/Notice/ConnectAdminNotice.php index dc71c469e..014a94927 100644 --- a/modules.local/ppcp-wc-gateway/src/Notice/ConnectAdminNotice.php +++ b/modules.local/ppcp-wc-gateway/src/Notice/ConnectAdminNotice.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace Inpsyde\PayPalCommerce\WcGateway\Notice; +use Inpsyde\PayPalCommerce\AdminNotices\Entity\Message; use Inpsyde\PayPalCommerce\WcGateway\Settings\Settings; class ConnectAdminNotice @@ -14,26 +15,23 @@ class ConnectAdminNotice $this->settings = $settings; } - public function display() + public function connectMessage() : ?Message { if (!$this->shouldDisplay()) { - return; + return null; } - echo sprintf( - '

%s

', - wp_kses_post( - sprintf( - /* translators: %1$s the gateway name */ - __( - '%1$s is almost ready. To get started, connect your account.', - 'woocommerce-paypal-commerce-gateway' - ), - $this->settings->get('title'), - // TODO: find a better way to get the url - admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway') - ) - ) + + $message = sprintf( + /* translators: %1$s the gateway name */ + __( + '%1$s is almost ready. To get started, connect your account.', + 'woocommerce-paypal-commerce-gateway' + ), + $this->settings->get('title'), + // TODO: find a better way to get the url + admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway') ); + return new Message( $message, 'warning'); } protected function shouldDisplay(): bool diff --git a/modules.local/ppcp-wc-gateway/src/WcGatewayModule.php b/modules.local/ppcp-wc-gateway/src/WcGatewayModule.php index ff5975626..7ca5ec01a 100644 --- a/modules.local/ppcp-wc-gateway/src/WcGatewayModule.php +++ b/modules.local/ppcp-wc-gateway/src/WcGatewayModule.php @@ -6,6 +6,7 @@ namespace Inpsyde\PayPalCommerce\WcGateway; use Dhii\Container\ServiceProvider; use Dhii\Modular\Module\ModuleInterface; +use Inpsyde\PayPalCommerce\AdminNotices\Repository\Repository; use Inpsyde\PayPalCommerce\WcGateway\Admin\OrderDetail; use Inpsyde\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn; use Inpsyde\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail; @@ -47,14 +48,24 @@ class WcGatewayModule implements ModuleInterface } ); - add_action( - 'admin_notices', - function () use ($container) : void { + add_filter( + Repository::NOTICES_FILTER, + function ($notices) use ($container) : array { $notice = $container->get('wcgateway.notice.connect'); /** * @var ConnectAdminNotice $notice */ - $notice->display(); + $connectMessage = $notice->connectMessage(); + if ($connectMessage) { + $notices[] = $connectMessage; + } + $authorizeOrderAction = $container->get('wcgateway.notice.authorize-order-action'); + $authorizedMessage = $authorizeOrderAction->message(); + if ($authorizedMessage) { + $notices[] = $authorizedMessage; + } + + return $notices; } ); @@ -80,18 +91,6 @@ class WcGatewayModule implements ModuleInterface } ); - add_filter( - 'post_updated_messages', - function ($messages) use ($container) { - /** - * @var AuthorizeOrderActionNotice $authorizeOrderAction - */ - $authorizeOrderAction = $container->get('wcgateway.notice.authorize-order-action'); - return $authorizeOrderAction->registerMessages($messages); - }, - 20 - ); - add_action( 'woocommerce_order_actions_start', function ($wcOrderId) use ($container) {