diff options
Diffstat (limited to 'syweb/webclient/home')
-rw-r--r-- | syweb/webclient/home/home-controller.js | 200 | ||||
-rw-r--r-- | syweb/webclient/home/home.html | 78 |
2 files changed, 278 insertions, 0 deletions
diff --git a/syweb/webclient/home/home-controller.js b/syweb/webclient/home/home-controller.js new file mode 100644 index 0000000000..3a48e64ab4 --- /dev/null +++ b/syweb/webclient/home/home-controller.js @@ -0,0 +1,200 @@ +/* +Copyright 2014 OpenMarket Ltd + +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('HomeController', ['matrixService', 'eventHandlerService', 'RecentsController']) +.controller('HomeController', ['$scope', '$location', 'matrixService', 'eventHandlerService', + function($scope, $location, matrixService, eventHandlerService) { + + $scope.config = matrixService.config(); + $scope.public_rooms = []; + $scope.newRoomId = ""; + $scope.feedback = ""; + + $scope.newRoom = { + room_id: "", + private: false + }; + + $scope.goToRoom = { + room_id: "" + }; + + $scope.joinAlias = { + room_alias: "" + }; + + $scope.profile = { + displayName: "", + avatarUrl: "" + }; + + $scope.newChat = { + user: "" + }; + + var refresh = function() { + + matrixService.publicRooms().then( + function(response) { + $scope.public_rooms = response.data.chunk; + for (var i = 0; i < $scope.public_rooms.length; i++) { + var room = $scope.public_rooms[i]; + + // Add room_alias & room_display_name members + angular.extend(room, matrixService.getRoomAliasAndDisplayName(room)); + + } + } + ); + }; + + $scope.createNewRoom = function(room_alias, isPrivate) { + + var visibility = "public"; + if (isPrivate) { + visibility = "private"; + } + + matrixService.create(room_alias, visibility).then( + function(response) { + // This room has been created. Refresh the rooms list + console.log("Created room " + response.data.room_alias + " with id: "+ + response.data.room_id); + matrixService.createRoomIdToAliasMapping( + response.data.room_id, response.data.room_alias); + }, + function(error) { + $scope.feedback = "Failure: " + JSON.stringify(error.data); + }); + }; + + // Go to a room + $scope.goToRoom = function(room_id) { + matrixService.join(room_id).then( + function(response) { + var final_room_id = room_id; + if (response.data.hasOwnProperty("room_id")) { + final_room_id = response.data.room_id; + } + + // TODO: factor out the common housekeeping whenever we try to join a room or alias + matrixService.roomState(final_room_id).then( + function(response) { + eventHandlerService.handleEvents(response.data, false, true); + }, + function(error) { + $scope.feedback = "Failed to get room state for: " + final_room_id; + } + ); + + $location.url("room/" + final_room_id); + }, + function(error) { + $scope.feedback = "Can't join room: " + JSON.stringify(error.data); + } + ); + }; + + $scope.joinAlias = function(room_alias) { + matrixService.joinAlias(room_alias).then( + function(response) { + // TODO: factor out the common housekeeping whenever we try to join a room or alias + matrixService.roomState(response.room_id).then( + function(response) { + eventHandlerService.handleEvents(response.data, false, true); + }, + function(error) { + $scope.feedback = "Failed to get room state for: " + response.room_id; + } + ); + // Go to this room + $location.url("room/" + room_alias); + }, + function(error) { + $scope.feedback = "Can't join room: " + JSON.stringify(error.data); + } + ); + }; + + // FIXME: factor this out between user-controller and home-controller etc. + $scope.messageUser = function() { + + // FIXME: create a new room every time, for now + + matrixService.create(null, 'private').then( + function(response) { + // This room has been created. Refresh the rooms list + var room_id = response.data.room_id; + console.log("Created room with id: "+ room_id); + + matrixService.invite(room_id, $scope.newChat.user).then( + function() { + $scope.feedback = "Invite sent successfully"; + $scope.$parent.goToPage("/room/" + room_id); + }, + function(reason) { + $scope.feedback = "Failure: " + JSON.stringify(reason); + }); + }, + function(error) { + $scope.feedback = "Failure: " + JSON.stringify(error.data); + }); + }; + + + $scope.onInit = function() { + // Load profile data + // Display name + matrixService.getDisplayName($scope.config.user_id).then( + function(response) { + $scope.profile.displayName = response.data.displayname; + var config = matrixService.config(); + config.display_name = response.data.displayname; + matrixService.setConfig(config); + matrixService.saveConfig(); + }, + function(error) { + $scope.feedback = "Can't load display name"; + } + ); + // Avatar + matrixService.getProfilePictureUrl($scope.config.user_id).then( + function(response) { + $scope.profile.avatarUrl = response.data.avatar_url; + }, + function(error) { + $scope.feedback = "Can't load avatar URL"; + } + ); + + // Listen to room creation event in order to update the public rooms list + $scope.$on(eventHandlerService.ROOM_CREATE_EVENT, function(ngEvent, event, isLive) { + if (isLive) { + // As we do not know if this room is public, do a full list refresh + refresh(); + } + }); + + refresh(); + }; + + // Clean data when user logs out + $scope.$on(eventHandlerService.RESET_EVENT, function() { + $scope.public_rooms = []; + }); +}]); diff --git a/syweb/webclient/home/home.html b/syweb/webclient/home/home.html new file mode 100644 index 0000000000..0af382916e --- /dev/null +++ b/syweb/webclient/home/home.html @@ -0,0 +1,78 @@ +<div ng-controller="HomeController" data-ng-init="onInit()"> + + <div id="wrapper"> + + <div id="genericHeading"> + <a href ng-click="goToPage('/')"><img src="img/logo-small.png" width="100" height="43" alt="[matrix]"/></a> + </div> + + <h1>Welcome to homeserver {{ config.homeserver }}</h1> + + <div> + <div class="profile-avatar"> + <img ng-src="{{ (null !== profile.avatarUrl) ? profile.avatarUrl : 'img/default-profile.png' }}"/> + </div> + <div id="user-ids"> + <div id="user-displayname">{{ profile.displayName }}</div> + <div>{{ config.user_id }}</div> + </div> + </div> + + <h3>Recent conversations</h3> + <div ng-include="'recents/recents.html'"></div> + <br/> + + <h3>Public rooms</h3> + + <table class="publicTable"> + <tbody ng-repeat="room in public_rooms | orderBy:'room_display_name'" + class="publicRoomEntry" + ng-class="room.room_display_name.toLowerCase().indexOf('#matrix:') === 0 ? 'roomHighlight' : ''"> + <tr> + <td class="publicRoomEntry"> + <a href="#/room/{{ room.room_alias ? room.room_alias : room.room_id }}" > + {{ room.room_display_name }} + </a> + </td> + <td> + <div class="publicRoomJoinedUsers" + ng-show="room.num_joined_members"> + {{ room.num_joined_members }} {{ room.num_joined_members == 1 ? 'user' : 'users' }} + </div> + </td> + </tr> + <tr> + <td colspan="2" class="publicRoomTopic"> + {{ room.topic }} + </td> + </tr> + </tbody> + </table> + <br/> + + <div> + <form> + <input size="40" ng-model="newRoom.room_alias" ng-enter="createNewRoom(newRoom.room_alias, newRoom.private)" placeholder="(e.g. foo)"/> + <input type="checkbox" ng-model="newRoom.private">private + <button ng-disabled="!newRoom.room_alias" ng-click="createNewRoom(newRoom.room_alias, newRoom.private)">Create room</button> + </form> + </div> + <div> + <form> + <input size="40" ng-model="joinAlias.room_alias" ng-enter="joinAlias(joinAlias.room_alias)" placeholder="(e.g. #foo:example.org)"/> + <button ng-disabled="!joinAlias.room_alias" ng-click="joinAlias(joinAlias.room_alias)">Join room</button> + </form> + </div> + <div> + <form> + <input size="40" ng-model="newChat.user" ng-enter="messageUser()" placeholder="e.g. @user:domain.com"/> + <button ng-disabled="!newChat.user" ng-click="messageUser()">Message user</button> + </form> + </div> + + <br/> + + {{ feedback }} + + </div> +</div> |