diff --git a/extensions/subscriptions/bootstrap.php b/extensions/subscriptions/bootstrap.php index df0b76df9..dd0af4e4d 100644 --- a/extensions/subscriptions/bootstrap.php +++ b/extensions/subscriptions/bootstrap.php @@ -19,6 +19,7 @@ return function (Dispatcher $events, Factory $views) { $events->subscribe(Listener\FilterDiscussionListBySubscription::class); $events->subscribe(Listener\SaveSubscriptionToDatabase::class); $events->subscribe(Listener\SendNotificationWhenReplyIsPosted::class); + $events->subscribe(Listener\FollowAfterReply::class); $views->addNamespace('flarum-subscriptions', __DIR__.'/views'); }; diff --git a/extensions/subscriptions/js/forum/dist/extension.js b/extensions/subscriptions/js/forum/dist/extension.js index 64bf8bc20..5ad194842 100644 --- a/extensions/subscriptions/js/forum/dist/extension.js +++ b/extensions/subscriptions/js/forum/dist/extension.js @@ -372,10 +372,10 @@ System.register('flarum/subscriptions/components/SubscriptionMenuItem', ['flarum } }; });; -System.register('flarum/subscriptions/main', ['flarum/extend', 'flarum/app', 'flarum/Model', 'flarum/models/Discussion', 'flarum/components/NotificationGrid', 'flarum/subscriptions/addSubscriptionBadge', 'flarum/subscriptions/addSubscriptionControls', 'flarum/subscriptions/addSubscriptionFilter', 'flarum/subscriptions/components/NewPostNotification'], function (_export) { +System.register('flarum/subscriptions/main', ['flarum/extend', 'flarum/app', 'flarum/Model', 'flarum/models/Discussion', 'flarum/components/NotificationGrid', 'flarum/subscriptions/addSubscriptionBadge', 'flarum/subscriptions/addSubscriptionControls', 'flarum/subscriptions/addSubscriptionFilter', 'flarum/subscriptions/addSubscriptionSettings', 'flarum/subscriptions/components/NewPostNotification'], function (_export) { 'use strict'; - var extend, app, Model, Discussion, NotificationGrid, addSubscriptionBadge, addSubscriptionControls, addSubscriptionFilter, NewPostNotification; + var extend, app, Model, Discussion, NotificationGrid, addSubscriptionBadge, addSubscriptionControls, addSubscriptionFilter, addSubscriptionSettings, NewPostNotification; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; @@ -393,6 +393,8 @@ System.register('flarum/subscriptions/main', ['flarum/extend', 'flarum/app', 'fl addSubscriptionControls = _flarumSubscriptionsAddSubscriptionControls['default']; }, function (_flarumSubscriptionsAddSubscriptionFilter) { addSubscriptionFilter = _flarumSubscriptionsAddSubscriptionFilter['default']; + }, function (_flarumSubscriptionsAddSubscriptionSettings) { + addSubscriptionSettings = _flarumSubscriptionsAddSubscriptionSettings['default']; }, function (_flarumSubscriptionsComponentsNewPostNotification) { NewPostNotification = _flarumSubscriptionsComponentsNewPostNotification['default']; }], @@ -406,6 +408,7 @@ System.register('flarum/subscriptions/main', ['flarum/extend', 'flarum/app', 'fl addSubscriptionBadge(); addSubscriptionControls(); addSubscriptionFilter(); + addSubscriptionSettings(); extend(NotificationGrid.prototype, 'notificationTypes', function (items) { items.add('newPost', { @@ -417,4 +420,33 @@ System.register('flarum/subscriptions/main', ['flarum/extend', 'flarum/app', 'fl }); } }; +});; +System.register('flarum/subscriptions/addSubscriptionSettings', ['flarum/extend', 'flarum/components/SettingsPage', 'flarum/components/FieldSet', 'flarum/components/Switch', 'flarum/utils/ItemList'], function (_export) { + 'use strict'; + + var extend, SettingsPage, FieldSet, Switch, ItemList; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumComponentsSettingsPage) { + SettingsPage = _flarumComponentsSettingsPage['default']; + }, function (_flarumComponentsFieldSet) { + FieldSet = _flarumComponentsFieldSet['default']; + }, function (_flarumComponentsSwitch) { + Switch = _flarumComponentsSwitch['default']; + }, function (_flarumUtilsItemList) { + ItemList = _flarumUtilsItemList['default']; + }], + execute: function () { + _export('default', function () { + extend(SettingsPage.prototype, 'notificationsItems', function (items) { + items.add('followAfterReply', Switch.component({ + children: app.translator.trans('flarum-subscriptions.forum.settings.forum_follow_after_reply_label'), + state: this.user.preferences().followAfterReply, + onchange: this.preferenceSaver('followAfterReply') + })); + }); + }); + } + }; }); \ No newline at end of file diff --git a/extensions/subscriptions/js/forum/src/addSubscriptionSettings.js b/extensions/subscriptions/js/forum/src/addSubscriptionSettings.js new file mode 100644 index 000000000..94048ddd2 --- /dev/null +++ b/extensions/subscriptions/js/forum/src/addSubscriptionSettings.js @@ -0,0 +1,17 @@ +import { extend } from 'flarum/extend'; +import SettingsPage from 'flarum/components/SettingsPage'; +import FieldSet from 'flarum/components/FieldSet'; +import Switch from 'flarum/components/Switch'; +import ItemList from 'flarum/utils/ItemList'; + +export default function() { + extend(SettingsPage.prototype, 'notificationsItems', function(items) { + items.add('followAfterReply', + Switch.component({ + children: app.translator.trans('flarum-subscriptions.forum.settings.forum_follow_after_reply_label'), + state: this.user.preferences().followAfterReply, + onchange: this.preferenceSaver('followAfterReply') + }) + ); + }); +} diff --git a/extensions/subscriptions/js/forum/src/main.js b/extensions/subscriptions/js/forum/src/main.js index b37752e72..b14c56f3f 100644 --- a/extensions/subscriptions/js/forum/src/main.js +++ b/extensions/subscriptions/js/forum/src/main.js @@ -7,6 +7,8 @@ import NotificationGrid from 'flarum/components/NotificationGrid'; import addSubscriptionBadge from 'flarum/subscriptions/addSubscriptionBadge'; import addSubscriptionControls from 'flarum/subscriptions/addSubscriptionControls'; import addSubscriptionFilter from 'flarum/subscriptions/addSubscriptionFilter'; +import addSubscriptionSettings from 'flarum/subscriptions/addSubscriptionSettings'; + import NewPostNotification from 'flarum/subscriptions/components/NewPostNotification'; app.initializers.add('subscriptions', function() { @@ -17,6 +19,7 @@ app.initializers.add('subscriptions', function() { addSubscriptionBadge(); addSubscriptionControls(); addSubscriptionFilter(); + addSubscriptionSettings(); extend(NotificationGrid.prototype, 'notificationTypes', function(items) { items.add('newPost', { diff --git a/extensions/subscriptions/src/Listener/FollowAfterReply.php b/extensions/subscriptions/src/Listener/FollowAfterReply.php new file mode 100644 index 000000000..13518b966 --- /dev/null +++ b/extensions/subscriptions/src/Listener/FollowAfterReply.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Subscriptions\Listener; + +use Flarum\Core\Access\AssertPermissionTrait; +use Flarum\Event\ConfigureUserPreferences; +use Flarum\Event\PostWasPosted; +use Illuminate\Contracts\Events\Dispatcher; + +class FollowAfterReply +{ + use AssertPermissionTrait; + + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(ConfigureUserPreferences::class, [$this, 'addUserPreference']); + $events->listen(PostWasPosted::class, [$this, 'whenPostWasPosted']); + } + + /** + * @param ConfigureUserPreferences $event + */ + public function addUserPreference(ConfigureUserPreferences $event) + { + $event->add('followAfterReply', 'boolval', false); + } + + /** + * @param PostWasPosted $event + */ + public function whenPostWasPosted(PostWasPosted $event) + { + $actor = $event->actor; + + if ($actor && $actor->exists && $actor->getPreference('followAfterReply')) { + $this->assertRegistered($actor); + + $state = $event->post->discussion->stateFor($actor); + + $state->subscription = 'follow'; + $state->save(); + } + } +}