From e357d2b5351471ebd2f6fea06d4e7453c423d1d5 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 19 Oct 2015 16:20:00 +1030 Subject: [PATCH] Add third state to flags header icon closes flarum/core#500 --- .../flags/js/forum/src/components/FlagList.js | 4 +- .../js/forum/src/components/FlagsDropdown.js | 4 +- extensions/flags/src/Listener/AddFlagsApi.php | 37 +++++++++++++++---- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 69f6b7bc6..05823dc96 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -63,7 +63,7 @@ export default class FlagList extends Component { * been loaded. */ load() { - if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) { + if (app.cache.flags && !app.session.user.attribute('newFlagsCount')) { return; } @@ -71,7 +71,7 @@ export default class FlagList extends Component { m.redraw(); app.store.find('flags').then(flags => { - app.forum.pushAttributes({unreadFlagsCount: 0}); + app.session.user.pushAttributes({newFlagsCount: 0}); app.cache.flags = flags.sort((a, b) => b.time() - a.time()); this.loading = false; diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 07c26a29d..88c47a5a7 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -21,10 +21,10 @@ export default class FlagsDropdown extends NotificationsDropdown { } getUnreadCount() { - return app.forum.attribute('unreadFlagsCount'); + return app.cache.flags ? app.cache.flags.length : app.forum.attribute('flagsCount'); } getNewCount() { - return app.forum.attribute('newFlagsCount'); + return app.session.user.attribute('newFlagsCount'); } } diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index bc8fee2be..17f96a430 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -10,6 +10,7 @@ namespace Flarum\Flags\Listener; +use Flarum\Api\Serializer\CurrentUserSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Api\Serializer\PostSerializer; use Flarum\Core\User; @@ -51,16 +52,14 @@ class AddFlagsApi $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); if ($event->attributes['canViewFlags']) { - $query = Flag::whereVisibleTo($event->actor); - - if ($time = $event->actor->flags_read_time) { - $query->where('flags.time', '>', $time); - } - - $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count(); + $event->attributes['flagsCount'] = (int) $this->getFlagsCount($event->actor); } } + if ($event->isSerializer(CurrentUserSerializer::class)) { + $event->attributes['newFlagsCount'] = (int) $this->getNewFlagsCount($event->model); + } + if ($event->isSerializer(PostSerializer::class)) { $event->attributes['canFlag'] = $event->actor->can('flag', $event->model); } @@ -75,4 +74,28 @@ class AddFlagsApi $event->post('/flags', 'flags.create', Controller\CreateFlagController::class); $event->delete('/posts/{id}/flags', 'flags.delete', Controller\DeleteFlagsController::class); } + + /** + * @param User $actor + * @return int + */ + protected function getFlagsCount(User $actor) + { + return Flag::whereVisibleTo($actor)->distinct('flags.post_id')->count(); + } + + /** + * @param User $actor + * @return int + */ + protected function getNewFlagsCount(User $actor) + { + $query = Flag::whereVisibleTo($actor); + + if ($time = $actor->flags_read_time) { + $query->where('flags.time', '>', $time); + } + + return $query->distinct('flags.post_id')->count(); + } }