chat: add +1 (like) to messages. @snicker does views/options/social/chat-message.jade flag you for any performance issues which should be optimized with bindonce? (I'm still a bit of a bo-noob)

This commit is contained in:
Tyler Renelle
2014-01-05 22:10:34 -07:00
parent 95516f709c
commit f6e6d115ac
7 changed files with 76 additions and 9 deletions

View File

@@ -16,6 +16,11 @@
position: relative
z-index: 10
.chat-message .chat-plus-one
opacity: 0
.chat-message:hover .chat-plus-one
opacity: 1
.tavern-chat, .party-chat
li

View File

@@ -127,7 +127,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
});
}])
.controller('ChatCtrl', ['$scope', 'Groups', 'User', function($scope, Groups, User){
.controller('ChatCtrl', ['$scope', 'Groups', 'User', '$http', 'API_URL', 'Notification', function($scope, Groups, User, $http, API_URL, Notification){
$scope.message = {content:''};
$scope._sending = false;
@@ -178,6 +178,20 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
}
}
$scope.likeChatMessage = function(group,message) {
if (message.uuid == User.user._id)
return Notification.text("Can't like your own message. Don't be that person.");
if (!message.likes) message.likes = {};
if (message.likes[User.user._id]) {
delete message.likes[User.user._id];
} else {
message.likes[User.user._id] = true;
}
//Chat.Chat.like({gid:group._id,mid:message.id});
$http.post(API_URL + '/api/v2/groups/' + group._id + '/chat/' + message.id + '/like');
}
$scope.sync = function(group){
group.$get();
}

View File

@@ -47,4 +47,20 @@ angular.module('groupServices', ['ngResource']).
Group: Group
}
}
]);
])
/**
* TODO Get this working. Make ChatService it's own ngResource, so we can update chat without having to sync the whole
* group object (expensive). Also so we can add chat-specific routes
*/
// .factory('Chat', ['API_URL', '$resource',
// function(API_URL, $resource) {
// var Chat = $resource(API_URL + '/api/v2/groups/:gid/chat/:mid',
// //{gid:'@_id', mid: '@_messageId'},
// {
// like: {method: 'POST', url: API_URL + '/api/v2/groups/:gid/chat/:mid'}
// //postChat: {method: "POST", url: API_URL + '/api/v2/groups/:gid/chat'},
// //deleteChatMessage: {method: "DELETE", url: API_URL + '/api/v2/groups/:gid/chat/:messageId'},
// });
// return {Chat:Chat};
// }
// ]);

View File

@@ -243,6 +243,24 @@ api.deleteChatMessage = function(req, res){
});
}
api.likeChatMessage = function(req, res) {
var user = res.locals.user;
var group = res.locals.group;
var message = _.find(group.chat, {id: req.params.mid});
if (!message) return res.json(404, {err: "Message not found!"});
if (message.uuid == user._id) return res.json(401, {err: "Can't like your own message. Don't be that person."});
if (!message.likes) message.likes = {};
if (message.likes[user._id]) {
delete message.likes[user._id];
} else {
message.likes[user._id] = true;
}
group.markModified('chat');
group.save(function(err,_saved){
return res.send(_saved.chat);
})
}
api.join = function(req, res) {
var user = res.locals.user,
group = res.locals.group;

View File

@@ -92,7 +92,8 @@ GroupSchema.methods.sendChat = function(message, user){
var message = {
id: shared.uuid(),
text: message,
timestamp: +(new Date)
timestamp: +(new Date),
likes: {}
};
if (user) {
_.defaults(message, {

View File

@@ -483,6 +483,17 @@ module.exports = (swagger, v2) ->
middleware: [auth.auth, groups.attachGroup]
action: groups.deleteChatMessage
"/groups/{gid}/chat/{mid}/like":
spec:
method: 'POST'
description: "Like a chat message"
params: [
path 'gid','Group id','string'
path 'mid','Message id','string'
]
middleware: [auth.auth, groups.attachGroup]
action: groups.likeChatMessage
# ---------------------------------
# Members
# ---------------------------------

View File

@@ -1,13 +1,15 @@
li(bindonce='group.chat', ng-repeat='message in group.chat', bo-class='{highlight: isUserMentioned(user,message), "own-message": user._id == message.uuid}')
li.chat-message(bindonce='group.chat', ng-repeat='message in group.chat', bo-class='{highlight: isUserMentioned(user,message), "own-message": user._id == message.uuid}')
div(class='scrollable-message')
a.label.chat-message(class='hidden-label')
span {{message.user}} 
|  
markdown(ng-model='message.text',target='_blank')
|  - 
span.muted.time(from-now='message.timestamp')
markdown(ng-model='message.text',target='_blank', style='padding:0px 2px')
| -
span.muted.time(from-now='message.timestamp',style='padding:0px 2px')
span(style='padding:0px 2px')
a.label(ng-show='countExists(message.likes)',ng-class='{"label-success":message.likes[user._id]}',ng-click='likeChatMessage(group,message)') +{{countExists(message.likes)}}
a.chat-plus-one.muted(ng-show='!countExists(message.likes)',ng-click='likeChatMessage(group,message)',style='background-color:#eee;padding:2px') +1
a(bo-show='user.contributor.admin || message.uuid == user.id', ng-click='deleteChatMessage(group, message)')
|
|  
i.icon-remove(tooltip='Delete')
a.label.chat-message(bo-show='message.user', class='float-label', bo-class='{"label-npc": message.backer.npc, "label-contributor-{{message.contributor.level}}":message.contributor.level}', ng-click='clickMember(message.uuid, true)')
span(tooltip='{{contribText(message.contributor, message.backer)}}') {{message.user}}