summary refs log tree commit diff
path: root/webclient/recents
diff options
context:
space:
mode:
Diffstat (limited to 'webclient/recents')
-rw-r--r--webclient/recents/recents-controller.js66
-rw-r--r--webclient/recents/recents-filter.js47
-rw-r--r--webclient/recents/recents.html53
3 files changed, 166 insertions, 0 deletions
diff --git a/webclient/recents/recents-controller.js b/webclient/recents/recents-controller.js
new file mode 100644
index 0000000000..a9805fc38a
--- /dev/null
+++ b/webclient/recents/recents-controller.js
@@ -0,0 +1,66 @@
+/*
+ Copyright 2014 matrix.org
+ 
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+'use strict';
+
+angular.module('RecentsController', ['matrixService', 'eventHandlerService'])
+.controller('RecentsController', ['$scope', 'matrixService', 'eventHandlerService', 'eventStreamService', 
+                               function($scope,  matrixService, eventHandlerService, eventStreamService) {
+    $scope.rooms = {};
+    
+    $scope.$on(eventHandlerService.MEMBER_EVENT, function(ngEvent, event, isLive) {
+        var config = matrixService.config();
+        if (event.state_key === config.user_id && event.content.membership === "invite") {
+            console.log("Invited to room " + event.room_id);
+            // FIXME push membership to top level key to match /im/sync
+            event.membership = event.content.membership;
+            // FIXME bodge a nicer name than the room ID for this invite.
+            event.room_display_name = event.user_id + "'s room";
+            $scope.rooms[event.room_id] = event;
+        }
+    });
+    
+    var refresh = function() {
+        // List all rooms joined or been invited to
+        matrixService.rooms(1, false).then(
+            function(response) {
+                var data = matrixService.assignRoomAliases(response.data.rooms);
+                for (var i=0; i<data.length; i++) {
+                    $scope.rooms[data[i].room_id] = data[i];
+
+                    // Create a shortcut for the last message of this room
+                    if (data[i].messages && data[i].messages.chunk && data[i].messages.chunk[0]) {
+                        $scope.rooms[data[i].room_id].lastMsg = data[i].messages.chunk[0];
+                    }
+                }
+
+                var presence = response.data.presence;
+                for (var i = 0; i < presence.length; ++i) {
+                    eventHandlerService.handleEvent(presence[i], false);
+                }
+            },
+            function(error) {
+                $scope.feedback = "Failure: " + error.data;
+            }
+        );
+    };
+
+    $scope.onInit = function() {
+        refresh();
+    };
+    
+}]);
+
diff --git a/webclient/recents/recents-filter.js b/webclient/recents/recents-filter.js
new file mode 100644
index 0000000000..45653fca96
--- /dev/null
+++ b/webclient/recents/recents-filter.js
@@ -0,0 +1,47 @@
+/*
+ Copyright 2014 matrix.org
+ 
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+'use strict';
+
+angular.module('RecentsController')
+.filter('orderRecents', function() {
+    return function(rooms) {
+
+        // Transform the dict into an array
+        // The key, room_id, is already in value objects
+        var filtered = [];
+        angular.forEach(rooms, function(value, key) {
+            filtered.push( value );
+        });
+
+        // And time sort them
+        // The room with the lastest message at first
+        filtered.sort(function (a, b) {
+            // Invite message does not have a body message nor ts
+            // Puth them at the top of the list
+            if (undefined === a.lastMsg) {
+                return -1;
+            }
+            else if (undefined === b.lastMsg) {
+                return 1;
+            }
+            else {
+                return b.lastMsg.ts - a.lastMsg.ts;
+            }
+        });
+        return filtered;
+    };
+});
\ No newline at end of file
diff --git a/webclient/recents/recents.html b/webclient/recents/recents.html
new file mode 100644
index 0000000000..6d2864ac97
--- /dev/null
+++ b/webclient/recents/recents.html
@@ -0,0 +1,53 @@
+<div ng-controller="RecentsController" data-ng-init="onInit()">
+    <table class="recentsTable">
+        <tbody ng-repeat="(rm_id, room) in rooms | orderRecents" ng-click="goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) )" class ="recentsRoom" >
+            <tr>
+                <td class="recentsRoomName">
+                    {{ room.room_display_name }}
+                </td>
+                <td class="recentsRoomSummaryTS">
+                    {{ (room.lastMsg.ts) | date:'MMM d HH:mm' }}
+                </td>
+            </tr>
+
+            <tr>
+                <td colspan="2" class="recentsRoomSummary">
+
+                    <div ng-show="room.membership === 'invite'" >
+                        {{ room.inviter }} invited you
+                    </div>
+
+                    <div ng-hide="room.membership === 'invite'" ng-switch="room.lastMsg.type" >
+                         <div ng-switch-when="m.room.member">
+                            {{ room.lastMsg.user_id }}
+                            {{ {"join": "joined", "leave": "left", "invite": "invited"}[room.lastMsg.content.membership] }}
+                            {{ room.lastMsg.content.membership === "invite" ? (room.lastMsg.state_key || '') : '' }}
+                        </div>
+
+                        <div ng-switch-when="m.room.message">
+                            <div ng-switch="room.lastMsg.content.msgtype">
+                                <div ng-switch-when="m.text">
+                                    {{ room.lastMsg.user_id }} :
+                                    <span ng-bind-html="(room.lastMsg.content.body) | linky:'_blank'">
+                                    </span>
+                                </div>
+
+                                <div ng-switch-when="m.image">
+                                    {{ room.lastMsg.user_id }} sent an image
+                                </div>
+
+                                <div ng-switch-default>
+                                    {{ room.lastMsg.content }}
+                                </div>
+                            </div>
+                        </div>
+
+                        <div ng-switch-default>
+                            {{ room.lastMsg }}
+                        </div>
+                    </div>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>