View source
<?php
namespace Drupal\opigno_notification\Controller;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Ajax\RedirectCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Routing\Router;
use Drupal\Core\Session\AccountInterface;
use Drupal\opigno_notification\Entity\OpignoNotification;
use Drupal\opigno_notification\OpignoNotificationInterface;
use Drupal\opigno_notification\Services\OpignoNotificationManager;
use Drupal\private_message\Service\PrivateMessageServiceInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
class OpignoNotificationController extends ControllerBase {
protected $renderer;
protected $notificationsManager;
protected $router;
protected $pmService;
public function __construct(RendererInterface $renderer, AccountInterface $account, OpignoNotificationManager $notifications_manager, Router $router, PrivateMessageServiceInterface $pm_service) {
$this->renderer = $renderer;
$this->currentUser = $account;
$this->notificationsManager = $notifications_manager;
$this->router = $router;
$this->pmService = $pm_service;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('renderer'), $container
->get('current_user'), $container
->get('opigno_notification.manager'), $container
->get('router.no_access_checks'), $container
->get('private_message.service'));
}
public function markReadAll(Request $request) : AjaxResponse {
$response = new AjaxResponse();
$notifications = OpignoNotification::getUnreadNotifications();
foreach ($notifications as $notification) {
if (!$notification instanceof OpignoNotificationInterface) {
continue;
}
$notification
->setHasRead(TRUE);
try {
$notification
->save();
} catch (EntityStorageException $e) {
watchdog_exception('opigno_notification_exception', $e);
}
}
$route = '';
$url = '';
if ($request
->isXmlHttpRequest()) {
$url = $request->server
->get('HTTP_REFERER');
$route_info = $this->router
->match($url);
$route = $route_info['_route'] ?? '';
}
if ($route === 'view.opigno_notifications.page_all' && $url) {
$response
->addCommand(new RedirectCommand($url));
return $response;
}
$selector = '.block-notifications__item--notifications .dropdown-menu';
$response
->addCommand(new InvokeCommand($selector, 'addClass', [
'hidden',
]));
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .marker', 'addClass', [
'hidden',
]));
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .dropdown', 'dropdown', [
'toggle',
]));
$response
->addCommand(new InvokeCommand($selector, 'removeClass', [
'show',
]));
return $response;
}
public function getMessages() : AjaxResponse {
$response = new AjaxResponse();
$messages_count = $this->pmService
->getUnreadThreadCount();
$notif_count = count($this->notificationsManager
->getUserHeaderNotifications());
if ($messages_count) {
$response
->addCommand(new InvokeCommand('.block-notifications__item--messages .marker', 'removeClass', [
'hidden',
]));
}
else {
$response
->addCommand(new InvokeCommand('.block-notifications__item--messages .marker', 'addClass', [
'hidden',
]));
}
$notifications = $this->notificationsManager
->renderUserHeaderNotifications();
$response
->addCommand(new HtmlCommand('.block-notifications__item--notifications .dropdown-menu', $notifications));
if ($notif_count) {
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .marker', 'removeClass', [
'hidden',
]));
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .dropdown-menu', 'removeClass', [
'hidden',
]));
}
else {
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .dropdown-menu', 'addClass', [
'hidden',
]));
$response
->addCommand(new InvokeCommand('.block-notifications__item--notifications .marker', 'addClass', [
'hidden',
]));
}
return $response;
}
}