linagora-rse
Version:
259 lines (229 loc) • 8.13 kB
JavaScript
;
angular.module('esn.activitystream')
.directive('activityStreamUpdatesNotifier', function() {
return {
restrict: 'E',
replace: true,
templateUrl: '/views/modules/activitystream/updates-notifier.html'
};
})
.directive('activityStreamNotification', function(moment, session, livenotification, notificationFactory) {
return {
restrict: 'A',
link: function(scope) {
function liveNotificationHandler(msg) {
if (msg.actor && msg.actor._id !== session.user._id) {
var m = moment(new Date(msg.published).getTime());
notificationFactory.weakInfo('Activity Stream updated',
msg.actor.displayName + ' added a message ' + m.fromNow());
scope.asMessagesUpdates = scope.asMessagesUpdates || {post: [], update: []};
if (msg.verb === 'post') {
scope.asMessagesUpdates.post.push(msg);
} else if (msg.verb === 'update') {
var alreadyKnown = scope.asMessagesUpdates.update
.concat(scope.asMessagesUpdates.post)
.some(function(m) {
return m.object._id === msg.object._id;
});
if (!alreadyKnown) {
scope.asMessagesUpdates.update.push(msg);
}
}
}
}
var socketIORoom = livenotification('/activitystreams', scope.activitystream.activity_stream.uuid)
.on('notification', liveNotificationHandler);
scope.$on('$destroy', function() {
socketIORoom.removeListener('notification', liveNotificationHandler);
});
}
};
})
.directive('activityStream', function(_, messageAPI, $rootScope, $timeout) {
return {
restrict: 'E',
scope: {
// TODO Remove this when the injection module has
// the method to inject inside all domains.
calendarHomeId: '=calendarId',
streams: '=',
activitystream: '='
},
replace: true,
templateUrl: '/views/modules/activitystream/activitystream.html',
controller: 'activitystreamController',
link: function(scope) {
scope.streams = scope.streams || [];
scope.streams = scope.streams.concat(scope.activitystream);
scope.lastPost = {
messageId: null,
comment: null
};
function isInStreams(id) {
return scope.streams.some(function(stream) {
return stream.activity_stream && stream.activity_stream.uuid === id;
});
}
function onMessagePosted(evt, msgMeta) {
if (!isInStreams(msgMeta.activitystreamUuid)) {
return;
}
if (scope.restActive[msgMeta.activitystreamUuid] || scope.updateMessagesActive) {
return;
}
scope.getStreamUpdates(msgMeta.activitystreamUuid);
scope.lastPost.messageId = msgMeta.id;
}
function getThreadById(id) {
var thread = null;
scope.threads.every(function(msg) {
if (msg._id === id) {
thread = msg;
return false;
}
return true;
});
return thread;
}
function updateMessage(message) {
var running = message.shares.filter(function(share) {
return share.objectType === 'activitystream' && scope.restActive[share.id];
});
if (running.length > 0 || scope.updateMessagesActive) {
return;
}
message.shares.forEach(function(share) {
if (share.objectType === 'activitystream' && scope.streams.indexOf(share.id) !== -1) {
scope.restActive[share.id] = true;
}
});
var parentId = message._id;
messageAPI.get(parentId).then(function(response) {
var message = response.data;
var thread = getThreadById(parentId);
if (thread) {
thread.responses = message.responses;
}
}).finally(function() {
message.shares.forEach(function(share) {
if (share.objectType === 'activitystream' && scope.streams.indexOf(share.id) !== -1) {
scope.restActive[share.id] = false;
}
});
});
}
function onCommentPosted(evt, msgMeta) {
var thread = getThreadById(msgMeta.parent._id);
if (thread) {
updateMessage(thread);
scope.lastPost.comment = {
id: msgMeta.id,
parentId: msgMeta.parent._id
};
}
}
function onCommentDeleted(evt, data) {
if (!isInStreams(data.activitystreamUuid)) {
return;
}
var messageId = data.id;
var parentId = data.parentId;
var thread = getThreadById(parentId);
if (!thread) {
return;
}
_.remove(thread.responses, function(item) {
return item._id === messageId;
});
}
function onMessageDeleted(evt, data) {
var streamId = data.activitystreamUuid;
var messageId = data.id;
if (isInStreams(streamId)) {
_.remove(scope.threads, function(item) {
return item._id === messageId;
});
}
}
// set as read once displayed
$timeout(function() {
scope.streams.forEach(function(stream) {
$rootScope.$emit('activitystream:updated', {
activitystreamUuid: stream.activity_stream.uuid
});
});
}, 0);
var unregMsgPostedListener = $rootScope.$on('message:posted', onMessagePosted);
var unregCmtPostedListener = $rootScope.$on('message:comment', onCommentPosted);
var unregCmtDeletedListener = $rootScope.$on('message:comment:deleted', onCommentDeleted);
var unregMsgDeletedListener = $rootScope.$on('message:deleted', onMessageDeleted);
scope.$on('$destroy', function() {
unregMsgPostedListener();
unregCmtPostedListener();
unregCmtDeletedListener();
unregMsgDeletedListener();
});
}
};
})
.directive('activityStreamOrigin', function() {
return {
restrict: 'E',
replace: true,
scope: {
streams: '='
},
templateUrl: '/views/modules/activitystream/activitystream-origin.html'
};
})
.directive('activityStreamCard', function() {
return {
scope: {
activitystream: '='
},
restrict: 'E',
replace: true,
templateUrl: '/views/modules/activitystream/activitystream-card.html'
};
})
.directive('activityStreamFilter', function($log, localStorageService) {
return {
restrict: 'E',
templateUrl: '/views/modules/activitystream/activitystream-filter.html',
link: function($scope) {
var storage = localStorageService.getOrCreateInstance('streamFilters');
$scope.displayList = $scope.streams.filter(function(stream) {
return stream.activity_stream.uuid !== $scope.activitystream.activity_stream.uuid;
});
function getKeyName() {
return $scope.activitystream._id;
}
function getCachedStream() {
return storage.getItem(getKeyName());
}
$scope.selectStream = function(stream) {
$scope.selectedStream = stream;
storage.setItem(getKeyName(), stream.activity_stream.uuid).then(function() {
$log.debug('Filter saved in local storage');
});
};
$scope.clearStreamSelection = function() {
storage.removeItem(getKeyName()).then(function() {
$log.debug('Filter removed form local storage');
}).finally(function() {
$scope.selectedStream = null;
});
};
getCachedStream().then(function(stream) {
if (stream) {
var found = $scope.streams.filter(function(item) {
return item.activity_stream.uuid === stream;
});
if (found.length > 0) {
$scope.selectedStream = found[0];
}
}
});
}
};
});