diff options
Diffstat (limited to 'webclient/rooms')
-rw-r--r-- | webclient/rooms/rooms-controller.js | 195 | ||||
-rw-r--r-- | webclient/rooms/rooms.html | 80 |
2 files changed, 275 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(); +}]); diff --git a/webclient/rooms/rooms.html b/webclient/rooms/rooms.html new file mode 100644 index 0000000000..04b153982e --- /dev/null +++ b/webclient/rooms/rooms.html @@ -0,0 +1,80 @@ +<div ng-controller="RoomsController" class="rooms"> + + <div class="page"> + + <div> + <form> + <input size="40" ng-model="newProfileInfo.name" ng-enter="setDisplayName(newProfileInfo.name)" /> + <button ng-disabled="!newProfileInfo.name" ng-click="setDisplayName(newProfileInfo.name)">Update Name</button> + </form> + </div> + <div> + <form> + <input size="40" ng-model="newProfileInfo.avatar" ng-enter="setAvatar(newProfileInfo.avatar)" /> + <button ng-disabled="!newProfileInfo.avatar" ng-click="setAvatar(newProfileInfo.avatar)">Update Avatar</button> + </form> + </div> + <br/> + + <div> + <form> + <input size="40" ng-model="linkedEmails.linkNewEmail" ng-enter="linkEmail(linkedEmails.linkNewEmail)" /> + <button ng-disabled="!linkedEmails.linkNewEmail" ng-click="linkEmail(linkedEmails.linkNewEmail)"> + Link Email + </button> + {{ emailFeedback }} + </form> + <form ng-hide="!linkedEmails.emailBeingAuthed"> + Enter validation token for {{ linkedEmails.emailBeingAuthed }}: + <br /> + <input size="20" ng-model="linkedEmails.emailCode" ng-enter="submitEmailCode(linkedEmails.emailCode)" /> + <button ng-disabled="!linkedEmails.emailCode || !linkedEmails.linkNewEmail" ng-click="submitEmailCode(linkedEmails.emailCode)"> + Submit Code + </button> + </form> + Linked emails: + <table> + <tr ng-repeat="(address, info) in linkedEmails.linkedEmailList"> + <td>{{address}}</td> + </tr> + </table> + </div> + <br/> + + <h3>My rooms</h3> + + <div class="rooms" ng-repeat="room in rooms"> + <div> + <a href="#/room/{{ room.room_id }}" >{{ room.room_alias }}</a> + </div> + </div> + <br/> + + <h3>Public rooms</h3> + + <div class="public_rooms" ng-repeat="room in public_rooms"> + <div> + <a href="#/room/{{ room.room_id }}" >{{ room.room_alias }}</a> + </div> + </div> + <br/> + + <div> + <form> + <input size="40" ng-model="newRoom.room_id" ng-enter="createNewRoom(newRoom.room_id, newRoom.private)" placeholder="(e.g. foo_channel)"/> + <input type="checkbox" ng-model="newRoom.private">private + <button ng-disabled="!newRoom.room_id" ng-click="createNewRoom(newRoom.room_id, newRoom.private)">Create room</button> + </form> + </div> + <div> + <form> + <input size="40" ng-model="goToRoom.room_id" ng-enter="goToRoom(goToRoom.room_id)" placeholder="(e.g. #foo_channe:example.org)"/> + <button ng-disabled="!goToRoom.room_id" ng-click="goToRoom(goToRoom.room_id)">Go to room</button> + </form> + </div> + <br/> + + {{ feedback }} + + </div> +</div> |