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>
|