summary refs log tree commit diff
path: root/webclient/rooms/rooms-controller.js
diff options
context:
space:
mode:
Diffstat (limited to 'webclient/rooms/rooms-controller.js')
-rw-r--r--webclient/rooms/rooms-controller.js195
1 files changed, 195 insertions, 0 deletions
diff --git a/webclient/rooms/rooms-controller.js b/webclient/rooms/rooms-controller.js
new file mode 100644
index 0000000000..58420e0eb2
--- /dev/null
+++ b/webclient/rooms/rooms-controller.js
@@ -0,0 +1,195 @@
+'use strict';
+
+angular.module('RoomsController', ['matrixService'])
+.controller('RoomsController', ['$scope', '$location', 'matrixService',
+                               function($scope, $location, matrixService) {
+                                   
+    $scope.rooms = [];
+    $scope.public_rooms = [];
+    $scope.newRoomId = "";
+    $scope.feedback = "";
+    
+    $scope.newRoom = {
+        room_id: "",
+        private: false
+    };
+    
+    $scope.goToRoom = {
+        room_id: "",
+    };
+
+    $scope.newProfileInfo = {
+        name: matrixService.config().displayName,
+        avatar: matrixService.config().avatarUrl
+    };
+
+    $scope.linkedEmails = {
+        linkNewEmail: "", // the email entry box
+        emailBeingAuthed: undefined, // to populate verification text
+        authTokenId: undefined, // the token id from the IS
+        emailCode: "", // the code entry box
+        linkedEmailList: matrixService.config().emailList // linked email list
+    };
+    
+    var assignRoomAliases = function(data) {
+        for (var i=0; i<data.length; i++) {
+            var alias = matrixService.getRoomIdToAliasMapping(data[i].room_id);
+            if (alias) {
+                data[i].room_alias = alias;
+            }
+            else {
+                data[i].room_alias = data[i].room_id;
+            }
+        }
+        return data;
+    };
+
+    $scope.refresh = function() {
+        // List all rooms joined or been invited to
+        $scope.rooms = matrixService.rooms();
+        matrixService.rooms().then(
+            function(data) {
+                data = assignRoomAliases(data);
+                $scope.feedback = "Success";
+                $scope.rooms = data;
+            },
+            function(reason) {
+                $scope.feedback = "Failure: " + reason;
+            });
+        
+        matrixService.publicRooms().then(
+            function(data) {
+                $scope.public_rooms = assignRoomAliases(data.chunk);
+            }
+        );
+    };
+    
+    $scope.createNewRoom = function(room_id, isPrivate) {
+        
+        var visibility = "public";
+        if (isPrivate) {
+            visibility = "private";
+        }
+        
+        matrixService.create(room_id, visibility).then(
+            function(response) { 
+                // This room has been created. Refresh the rooms list
+                console.log("Created room " + response.room_alias + " with id: "+
+                response.room_id);
+                matrixService.createRoomIdToAliasMapping(
+                    response.room_id, response.room_alias);
+                $scope.refresh();
+            },
+            function(reason) {
+                $scope.feedback = "Failure: " + reason;
+            });
+    };
+    
+    // Go to a room
+    $scope.goToRoom = function(room_id) {
+        // Simply open the room page on this room id
+        //$location.path("room/" + room_id);
+        matrixService.join(room_id).then(
+            function(response) {
+                if (response.hasOwnProperty("room_id")) {
+                    if (response.room_id != room_id) {
+                        $location.path("room/" + response.room_id);
+                        return;
+                     }
+                }
+
+                $location.path("room/" + room_id);
+            },
+            function(reason) {
+                $scope.feedback = "Can't join room: " + reason;
+            }
+        );
+    };
+
+    $scope.setDisplayName = function(newName) {
+        matrixService.setDisplayName(newName).then(
+            function(response) {
+                $scope.feedback = "Updated display name.";
+                var config = matrixService.config();
+                config.displayName = newName;
+                matrixService.setConfig(config);
+                matrixService.saveConfig();
+            },
+            function(reason) {
+                $scope.feedback = "Can't update display name: " + reason;
+            }
+        );
+    };
+
+    $scope.setAvatar = function(newUrl) {
+        console.log("Updating avatar to "+newUrl);
+        matrixService.setProfilePictureUrl(newUrl).then(
+            function(response) {
+                console.log("Updated avatar");
+                $scope.feedback = "Updated avatar.";
+                var config = matrixService.config();
+                config.avatarUrl = newUrl;
+                matrixService.setConfig(config);
+                matrixService.saveConfig();
+            },
+            function(reason) {
+                $scope.feedback = "Can't update avatar: " + reason;
+            }
+        );
+    };
+
+    $scope.linkEmail = function(email) {
+        matrixService.linkEmail(email).then(
+            function(response) {
+                if (response.success === true) {
+                    $scope.linkedEmails.authTokenId = response.tokenId;
+                    $scope.emailFeedback = "You have been sent an email.";
+                    $scope.linkedEmails.emailBeingAuthed = email;
+                }
+                else {
+                    $scope.emailFeedback = "Failed to send email.";
+                }
+            },
+            function(reason) {
+                $scope.emailFeedback = "Can't send email: " + reason;
+            }
+        );
+    };
+
+    $scope.submitEmailCode = function(code) {
+        var tokenId = $scope.linkedEmails.authTokenId;
+        if (tokenId === undefined) {
+            $scope.emailFeedback = "You have not requested a code with this email.";
+            return;
+        }
+        matrixService.authEmail(matrixService.config().user_id, tokenId, code).then(
+            function(response) {
+                if ("success" in response && response.success === false) {
+                    $scope.emailFeedback = "Failed to authenticate email.";
+                    return;
+                }
+                var config = matrixService.config();
+                var emailList = {};
+                if ("emailList" in config) {
+                    emailList = config.emailList;
+                }
+                emailList[response.address] = response;
+                // save the new email list
+                config.emailList = emailList;
+                matrixService.setConfig(config);
+                matrixService.saveConfig();
+                // invalidate the email being authed and update UI.
+                $scope.linkedEmails.emailBeingAuthed = undefined;
+                $scope.emailFeedback = "";
+                $scope.linkedEmails.linkedEmailList = emailList;
+                $scope.linkedEmails.linkNewEmail = "";
+                $scope.linkedEmails.emailCode = "";
+            },
+            function(reason) {
+                $scope.emailFeedback = "Failed to auth email: " + reason;
+            }
+        );
+    };
+    
+    $scope.refresh();
+}]);