birzha/plugins/rainlab/userplus/components/Notifications.php

130 lines
3.5 KiB
PHP

<?php namespace Rainlab\Userplus\Components;
use Auth;
use Carbon\Carbon;
use Cms\Classes\ComponentBase;
use ApplicationException;
use Illuminate\Support\Facades\Redirect;
class Notifications extends ComponentBase
{
public function componentDetails()
{
return [
'name' => 'Notifications Component',
'description' => 'Display user and site-wide notifications'
];
}
public function defineProperties()
{
return [
'recordsPerPage' => [
'title' => 'Records per page',
'comment' => 'Number of notifications to display per page',
'default' => 7
],
'includeAssets' => [
'title' => 'Include assets',
'comment' => 'Inject the JavaScript and Stylesheet used by the default component markup',
'type' => 'checkbox',
'default' => true
],
'frontend' => [
'title' => 'Frontend block',
'description' => 'Choose where in the page to display',
'type' => 'dropdown',
'options' => ['desktop','mobile'],
'default' => 'desktop'
]
];
}
public function onRun()
{
if (!Auth::getUser()) {
return;
}
if ($this->property('includeAssets')) {
$this->addCss('assets/css/notifications.css');
$this->addJs('assets/js/notifications.js');
}
$this->prepareVars();
}
protected function prepareVars()
{
$this->page['recordsToDisplay'] = $this->getRecordCountToDisplay();
$this->page['hasNotifications'] = $this->hasNotifications();
}
public function hasNotifications()
{
return $this->getUnreadQuery()->count() > 0;
}
public function unreadNotifications($recordsToDisplay = null)
{
if (!$recordsToDisplay) {
$recordsToDisplay = $this->getRecordCountToDisplay();
}
return $this->getUnreadQuery()->paginate($recordsToDisplay);
}
//
// AJAX
//
public function onLoadNotifications()
{
$this->prepareVars();
$this->page['notifications'] = $this->unreadNotifications();
}
public function onLoadOlderNotifications()
{
$recordsToDisplay = $this->getRecordCountToDisplay() + $this->property('recordsPerPage');
$this->page['recordsToDisplay'] = $recordsToDisplay;
$this->page['notifications'] = $this->unreadNotifications($recordsToDisplay);
}
public function onMarkAllNotificationsAsRead()
{
$this->getUnreadQuery()->update(['read_at' => Carbon::now()]);
$this->prepareVars();
$this->page['notifications'] = $this->unreadNotifications();
}
public function onMarkNotificationAsRead()
{
$this->getUnreadQuery()
->where('id', \Input::get('notification_id'))
->update(['read_at' => Carbon::now()]);
return Redirect::to(\Input::get('redirect_link'));
}
//
// Helpers
//
protected function getRecordCountToDisplay()
{
return ((int) post('records_per_page')) ?: $this->property('recordsPerPage');
}
protected function getUnreadQuery()
{
if (!$user = Auth::getUser()) {
throw new ApplicationException('You must be logged in');
}
return $user->notifications()->applyUnread();
}
}