summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthew Hodgson <matthew@matrix.org>2014-08-17 03:48:28 +0100
committerMatthew Hodgson <matthew@matrix.org>2014-08-17 03:48:28 +0100
commit60245c4f90f60dc7af79165cf074a4df57a02558 (patch)
tree0ceb74ee15def532e833d7f87c2052e13af7713b
parentunbreak login sequence (which spuriously required a sydent server to be speci... (diff)
downloadsynapse-60245c4f90f60dc7af79165cf074a4df57a02558.tar.xz
implement html5 notifications. (have to be explicitly requested under Config)
-rw-r--r--webclient/app-controller.js15
-rw-r--r--webclient/app.css4
-rw-r--r--webclient/index.html2
-rw-r--r--webclient/room/room-controller.js19
4 files changed, 37 insertions, 3 deletions
diff --git a/webclient/app-controller.js b/webclient/app-controller.js
index 7fa87e30c1..ff4cb6e69e 100644
--- a/webclient/app-controller.js
+++ b/webclient/app-controller.js
@@ -45,6 +45,12 @@ angular.module('MatrixWebClientController', ['matrixService'])
             $scope.config = matrixService.config();        
         }
     };
+    
+    $scope.closeConfig = function() {
+        if ($scope.config) {
+            $scope.config = undefined;
+        }
+    };
 
     if (matrixService.config()) {
         eventStreamService.resume();
@@ -69,6 +75,15 @@ angular.module('MatrixWebClientController', ['matrixService'])
         console.log("Invalid access token -> log user out");
         $scope.logout();
     });
+    
+    $scope.requestNotifications = function() {
+        if (window.Notification) {
+            console.log("Notification.permission: " + window.Notification.permission);
+            window.Notification.requestPermission(function(){});
+        }
+    };
+    
+    
 }]);
 
    
diff --git a/webclient/app.css b/webclient/app.css
index 3d8d7dd72b..4e4cfffc48 100644
--- a/webclient/app.css
+++ b/webclient/app.css
@@ -260,8 +260,8 @@ h1 {
     z-index: 100;
     top: 100px;
     left: 50%;
-    width: 400px;
-    margin-left: -200px;
+    width: 500px;
+    margin-left: -250px;
     text-align: center;
     padding: 20px;
     background-color: #aaa;
diff --git a/webclient/index.html b/webclient/index.html
index ee77dd2faa..455eff4a13 100644
--- a/webclient/index.html
+++ b/webclient/index.html
@@ -39,6 +39,8 @@
         <div>Home server: {{ config.homeserver }} </div>
         <div>User ID: {{ config.user_id }} </div>
         <div>Access token: {{ config.access_token }} </div>
+        <div><button ng-click="requestNotifications()">Request notifications</button></div>
+        <div><button ng-click="closeConfig()">Close</button></div>
     </div>
 
 
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js
index 304b06c1f1..30f66de458 100644
--- a/webclient/room/room-controller.js
+++ b/webclient/room/room-controller.js
@@ -137,6 +137,23 @@ angular.module('RoomController', ['ngSanitize'])
     $scope.$on(eventHandlerService.MSG_EVENT, function(ngEvent, event, isLive) {
         if (isLive && event.room_id === $scope.room_id) {
             scrollToBottom();
+            
+            if (window.Notification) {
+                // FIXME: we should also notify based on a timer or other heuristics
+                // rather than the window being minimised
+                if (document.hidden) {
+                    var notification = new window.Notification(
+                        ($scope.members[event.user_id].displayname || event.user_id) +
+                        " (" + $scope.room_alias + ")",
+                    {
+                        "body": event.content.body,
+                        "icon": $scope.members[event.user_id].avatar_url,
+                    });
+                    $timeout(function() {
+                        notification.close();
+                    }, 5 * 1000);
+                }
+            }
         }
     });
     
@@ -154,7 +171,7 @@ angular.module('RoomController', ['ngSanitize'])
             paginate(MESSAGES_PER_PAGINATION);
         }
     };
-    
+        
     var paginate = function(numItems) {
         // console.log("paginate " + numItems);
         if ($scope.state.paginating) {