From 38ebb153349ba4402be20b19b956c8d6472c6d3d Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 28 Mar 2015 11:51:25 +1030 Subject: [PATCH] Track user "last seen" time and display whether they are online or not according to their preferences --- ember/app/components/user/user-card.js | 7 ++++++- ember/app/models/user.js | 3 +++ ember/app/styles/flarum/user.less | 8 ++++++++ src/Api/Middleware/LoginWithHeader.php | 5 ++++- src/Api/Serializers/UserSerializer.php | 7 ++++++- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ember/app/components/user/user-card.js b/ember/app/components/user/user-card.js index 3580b5836..536f0abd7 100644 --- a/ember/app/components/user/user-card.js +++ b/ember/app/components/user/user-card.js @@ -70,7 +70,12 @@ export default Ember.Component.extend(HasItemLists, { } items.pushObjectWithTag(Ember.Component.extend({ - layout: Ember.Handlebars.compile('{{fa-icon "circle"}} Online') + tagName: 'li', + classNames: ['user-last-seen'], + classNameBindings: ['hidden', 'user.online:online'], + layout: Ember.Handlebars.compile('{{#if user.online}}{{fa-icon "circle"}} Online{{else}}{{fa-icon "clock-o"}} {{human-time user.lastSeenTime}}{{/if}}'), + user: this.get('user'), + hidden: Ember.computed.not('user.lastSeenTime') }), 'lastActiveTime'); items.pushObjectWithTag(Ember.Component.extend({ diff --git a/ember/app/models/user.js b/ember/app/models/user.js index aa45485b6..1f3b6f562 100644 --- a/ember/app/models/user.js +++ b/ember/app/models/user.js @@ -18,6 +18,9 @@ export default DS.Model.extend(HasItemLists, { joinTime: DS.attr('date'), lastSeenTime: DS.attr('date'), + online: Ember.computed('lastSeenTime', function() { + return this.get('lastSeenTime') > moment().subtract(5, 'minutes').toDate(); + }), readTime: DS.attr('date'), unreadNotificationsCount: DS.attr('number'), diff --git a/ember/app/styles/flarum/user.less b/ember/app/styles/flarum/user.less index e0ecf8944..b722fb8ed 100644 --- a/ember/app/styles/flarum/user.less +++ b/ember/app/styles/flarum/user.less @@ -104,6 +104,14 @@ font-size: 14px; } } + & .user-last-seen { + & .fa { + font-size: 14px; + } + &.online .fa { + font-size: 12px; + } + } } .user-activity .loading-indicator { diff --git a/src/Api/Middleware/LoginWithHeader.php b/src/Api/Middleware/LoginWithHeader.php index 1d79379f7..1b820decb 100644 --- a/src/Api/Middleware/LoginWithHeader.php +++ b/src/Api/Middleware/LoginWithHeader.php @@ -21,7 +21,10 @@ class LoginWithHeader if (starts_with($header, $this->prefix) && ($token = substr($header, strlen($this->prefix))) && ($accessToken = AccessToken::where('id', $token)->first())) { - $this->actor->setUser($accessToken->user); + $this->actor->setUser($user = $accessToken->user); + + $user->last_seen_time = time(); + $user->save(); } return $next($request); diff --git a/src/Api/Serializers/UserSerializer.php b/src/Api/Serializers/UserSerializer.php index 15bc1148f..df7e6df31 100644 --- a/src/Api/Serializers/UserSerializer.php +++ b/src/Api/Serializers/UserSerializer.php @@ -25,13 +25,18 @@ class UserSerializer extends UserBasicSerializer $attributes += [ 'bioHtml' => $user->bioHtml, 'joinTime' => $user->join_time ? $user->join_time->toRFC3339String() : null, - 'lastSeenTime' => $user->last_seen_time ? $user->last_seen_time->toRFC3339String() : null, 'discussionsCount' => (int) $user->discussions_count, 'commentsCount' => (int) $user->comments_count, 'canEdit' => $canEdit, 'canDelete' => $user->can($actorUser, 'delete'), ]; + if ($user->preference('discloseOnline')) { + $attributes += [ + 'lastSeenTime' => $user->last_seen_time ? $user->last_seen_time->toRFC3339String() : null + ]; + } + if ($canEdit) { $attributes += [ 'bio' => $user->bio,