Skip to content

Commit

Permalink
Scroll when adding a message. Track last read timestamp.
Browse files Browse the repository at this point in the history
  • Loading branch information
dstrus committed May 11, 2016
1 parent 5082c9a commit e774078
Show file tree
Hide file tree
Showing 8 changed files with 102 additions and 48 deletions.
26 changes: 25 additions & 1 deletion app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ angular
'firebase',
'angular-md5',
'angularResizable',
'angular-inview',
'ui.router'
])
.config(function ($stateProvider, $urlRouterProvider) {
Expand Down Expand Up @@ -140,6 +141,9 @@ angular
}],
channelName: ["$stateParams", "channels", function($stateParams, channels) {
return "#" + channels.$getRecord($stateParams.channelId).name;
}],
channelId: ["$stateParams", "channels", function($stateParams, channels) {
return $stateParams.channelId;
}]
}
})
Expand All @@ -157,10 +161,30 @@ angular
.then(function() {
return "@" + Users.getDisplayName($stateParams.uid);
});
}],
channelId: ["$stateParams", "channels", function($stateParams, channels) {
return $stateParams.uid;
}]
}
});

$urlRouterProvider.otherwise('/');
})
.constant('FirebaseUrl', 'https://des-ngslack.firebaseio.com/');
.constant('FirebaseUrl', 'https://des-ngslack.firebaseio.com/')
.directive('scrollBottom', ['$timeout', function ($timeout) {
// See http://stackoverflow.com/a/32482823
return {
scope: {
scrollBottom: "="
},
link: function ($scope, $element) {
$scope.$watchCollection('scrollBottom', function (newValue) {
if (newValue) {
$timeout(function(){
$element.scrollTop($element[0].scrollHeight);
}, 0);
}
});
}
}
}]);
5 changes: 2 additions & 3 deletions app/channels/channels.html
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ <h2>
</footer>
</aside>

<article>
<ui-view></ui-view>
</article>

<ui-view></ui-view>
</main>
27 changes: 24 additions & 3 deletions app/channels/messages.controller.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,42 @@
angular.module("angularfireSlackApp")
.controller(
"MessagesCtrl",
["profile", "channelName", "messages",
function(profile, channelName, messages) {
["$firebaseArray", "profile", "channelName", "channelId", "messages",
function($firebaseArray, profile, channelName, channelId, messages) {
var messagesCtrl = this;
messagesCtrl.messages = messages;
messagesCtrl.channelName = channelName;
messagesCtrl.channelId = channelId;

messagesCtrl.message = "";

messagesCtrl.markAsRead = function($index, $inview, $inviewpart, $event) {
var domId = $event.inViewTarget.id
var messageId = domId.substr(domId.indexOf("_") + 1);
var timestamp = messages.$getRecord(messageId).timestamp;
messagesCtrl.updateLastReadTimestamp(timestamp);
};

messagesCtrl.updateLastReadTimestamp = function(timestamp) {
if (!profile.channels) {
profile.channels = {};
}

if (!profile.channels[messagesCtrl.channelId] || profile.channels[messagesCtrl.channelId].lastReadTimestamp < timestamp) {
profile.channels[messagesCtrl.channelId] = { lastReadTimestamp: timestamp };
profile.$save();
}
};

messagesCtrl.sendMessage = function() {
if (messagesCtrl.message.length > 0) {
messagesCtrl.messages.$add({
uid: profile.$id,
body: messagesCtrl.message,
timestamp: Firebase.ServerValue.TIMESTAMP
}).then(function() {
}).then(function(result) {
var messageData = messagesCtrl.messages.$getRecord(result.key());
messagesCtrl.updateLastReadTimestamp(messageData.timestamp);
messagesCtrl.message = "";
});
}
Expand Down
83 changes: 44 additions & 39 deletions app/channels/messages.html
Original file line number Diff line number Diff line change
@@ -1,44 +1,49 @@
<header>
<h1>
<span>{{ messagesCtrl.channelName }}</span>
<img
ng-repeat="user in channelsCtrl.users"
class="user-pic"
ng-class="{ online: user.online }"
alt="{{ user.displayName }}"
ng-src="{{ channelsCtrl.getGravatar(user.$id) }}" />
</h1>
</header>
<article scroll-bottom="messagesCtrl.messages">
<header>
<h1>
<span>{{ messagesCtrl.channelName }}</span>
<img
ng-repeat="user in channelsCtrl.users"
class="user-pic"
ng-class="{ online: user.online }"
alt="{{ user.displayName }}"
ng-src="{{ channelsCtrl.getGravatar(user.$id) }}" />
</h1>
</header>

<ul>
<li ng-repeat="message in messagesCtrl.messages">
<img
class="user-pic"
alt="{{ channelsCtrl.getDisplayName(message.uid) }}"
ng-src="{{ channelsCtrl.getGravatar(message.uid) }}" />
<ul in-view-container>
<li
id="message_{{ message.$id }}"
ng-repeat="message in messagesCtrl.messages"
in-view="$inview&&messagesCtrl.markAsRead($index, $inview, $inviewpart, $event)">
<img
class="user-pic"
alt="{{ channelsCtrl.getDisplayName(message.uid) }}"
ng-src="{{ channelsCtrl.getGravatar(message.uid) }}" />

<div class="message-info">
<div class="user-name">
{{ channelsCtrl.getDisplayName(message.uid) }}
<span class="timestamp">{{ message.timestamp | date: "short" }}</span>
</div>
<div class="message-info">
<div class="user-name">
{{ channelsCtrl.getDisplayName(message.uid) }}
<span class="timestamp">{{ message.timestamp | date: "short" }}</span>
</div>

<div class="message">
{{ message.body }}
<div class="message">
{{ message.body }}
</div>
</div>
</div>
</li>
</ul>
</li>
</ul>

<form id="new-message" ng-submit="messagesCtrl.sendMessage()">
<p class="input-group">
<input
type="text"
class="form-control"
placeholder="Type a message..."
ng-model="messagesCtrl.message">
<span class="input-group-btn">
<button type="submit" class="btn btn-default">Send</button>
</span>
</p>
</form>
<form id="new-message" ng-submit="messagesCtrl.sendMessage()">
<p class="input-group">
<input
type="text"
class="form-control"
placeholder="Type a message..."
ng-model="messagesCtrl.message">
<span class="input-group-btn">
<button type="submit" class="btn btn-default">Send</button>
</span>
</p>
</form>
</article>
1 change: 1 addition & 0 deletions app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
<script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
<script src="bower_components/angular-md5/angular-md5.js"></script>
<script src="bower_components/angular-resizable/src/angular-resizable.js"></script>
<script src="bower_components/angular-inview/angular-inview.js"></script>
<!-- endbower -->
<!-- endbuild -->

Expand Down
4 changes: 3 additions & 1 deletion app/styles/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ article {
vertical-align: top;
height:100%;
overflow-y:scroll;
padding:55px 0 65px 0;
padding:55px 0 70px 0;
}

/*@media only screen and (max-width: 893px) {
Expand All @@ -166,6 +166,7 @@ article {
}*/

article header {
background: #f1f5f8;
border-bottom: 2px solid white;
padding: 0 15px;
position:fixed;
Expand Down Expand Up @@ -202,6 +203,7 @@ article header .user-pic.online {
}

article form#new-message {
background: #f1f5f8;
position:fixed;
border-top: 2px solid white;
bottom:0;
Expand Down
3 changes: 2 additions & 1 deletion bower.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"angularfire": "~1.1.0",
"angular-ui-router": "~0.2.14",
"angular-md5": "~0.1.7",
"angular-resizable": "^1.2.0"
"angular-resizable": "^1.2.0",
"angular-inview": "^1.5.7"
},
"devDependencies": {
"angular-mocks": "^1.3.0"
Expand Down
1 change: 1 addition & 0 deletions test/karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ module.exports = function(config) {
'bower_components/angular-ui-router/release/angular-ui-router.js',
'bower_components/angular-md5/angular-md5.js',
'bower_components/angular-resizable/src/angular-resizable.js',
'bower_components/angular-inview/angular-inview.js',
'bower_components/angular-mocks/angular-mocks.js',
// endbower
'app/scripts/**/*.js',
Expand Down

0 comments on commit e774078

Please sign in to comment.