2014-08-13 04:32:18 +02:00
|
|
|
/*
|
|
|
|
Copyright 2014 matrix.org
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
'use strict';
|
|
|
|
|
2014-08-15 16:40:37 +02:00
|
|
|
angular.module('RoomsController', ['matrixService', 'mFileInput', 'mFileUpload', 'eventHandlerService'])
|
2014-08-21 18:55:41 +02:00
|
|
|
.controller('RoomsController', ['$scope', '$location', 'matrixService', 'mFileUpload', 'eventHandlerService', 'eventStreamService',
|
|
|
|
function($scope, $location, matrixService, mFileUpload, eventHandlerService, eventStreamService) {
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2014-08-15 16:40:37 +02:00
|
|
|
$scope.rooms = {};
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.public_rooms = [];
|
|
|
|
$scope.newRoomId = "";
|
|
|
|
$scope.feedback = "";
|
|
|
|
|
|
|
|
$scope.newRoom = {
|
|
|
|
room_id: "",
|
|
|
|
private: false
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.goToRoom = {
|
|
|
|
room_id: "",
|
|
|
|
};
|
|
|
|
|
2014-08-12 18:17:10 +02:00
|
|
|
$scope.joinAlias = {
|
|
|
|
room_alias: "",
|
|
|
|
};
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.newProfileInfo = {
|
|
|
|
name: matrixService.config().displayName,
|
2014-08-14 11:39:03 +02:00
|
|
|
avatar: matrixService.config().avatarUrl,
|
|
|
|
avatarFile: undefined
|
2014-08-12 16:10:52 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
$scope.linkedEmails = {
|
|
|
|
linkNewEmail: "", // the email entry box
|
|
|
|
emailBeingAuthed: undefined, // to populate verification text
|
|
|
|
authTokenId: undefined, // the token id from the IS
|
2014-08-22 11:34:27 +02:00
|
|
|
clientSecret: undefined, // our client secret
|
|
|
|
sendAttempt: 1,
|
2014-08-12 16:10:52 +02:00
|
|
|
emailCode: "", // the code entry box
|
|
|
|
linkedEmailList: matrixService.config().emailList // linked email list
|
|
|
|
};
|
|
|
|
|
2014-08-15 16:40:37 +02:00
|
|
|
$scope.$on(eventHandlerService.MEMBER_EVENT, function(ngEvent, event, isLive) {
|
|
|
|
var config = matrixService.config();
|
|
|
|
if (event.target_user_id === config.user_id && event.content.membership === "invite") {
|
|
|
|
console.log("Invited to room " + event.room_id);
|
|
|
|
// FIXME push membership to top level key to match /im/sync
|
|
|
|
event.membership = event.content.membership;
|
|
|
|
// FIXME bodge a nicer name than the room ID for this invite.
|
2014-08-21 16:30:57 +02:00
|
|
|
event.room_display_name = event.user_id + "'s room";
|
2014-08-15 16:40:37 +02:00
|
|
|
$scope.rooms[event.room_id] = event;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
var assignRoomAliases = function(data) {
|
|
|
|
for (var i=0; i<data.length; i++) {
|
|
|
|
var alias = matrixService.getRoomIdToAliasMapping(data[i].room_id);
|
|
|
|
if (alias) {
|
2014-08-13 17:29:37 +02:00
|
|
|
// use the existing alias from storage
|
2014-08-12 16:10:52 +02:00
|
|
|
data[i].room_alias = alias;
|
2014-08-21 16:30:57 +02:00
|
|
|
data[i].room_display_name = alias;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
2014-08-20 17:46:16 +02:00
|
|
|
else if (data[i].aliases && data[i].aliases[0]) {
|
2014-08-13 17:29:37 +02:00
|
|
|
// save the mapping
|
2014-08-20 17:46:16 +02:00
|
|
|
// TODO: select the smarter alias from the array
|
|
|
|
matrixService.createRoomIdToAliasMapping(data[i].room_id, data[i].aliases[0]);
|
2014-08-21 16:30:57 +02:00
|
|
|
data[i].room_display_name = data[i].aliases[0];
|
|
|
|
}
|
|
|
|
else if (data[i].membership == "invite" && "inviter" in data[i]) {
|
|
|
|
data[i].room_display_name = data[i].inviter + "'s room"
|
2014-08-13 17:29:37 +02:00
|
|
|
}
|
2014-08-12 16:10:52 +02:00
|
|
|
else {
|
2014-08-13 17:29:37 +02:00
|
|
|
// last resort use the room id
|
2014-08-21 16:30:57 +02:00
|
|
|
data[i].room_display_name = data[i].room_id;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.refresh = function() {
|
|
|
|
// List all rooms joined or been invited to
|
|
|
|
matrixService.rooms().then(
|
2014-08-14 16:43:16 +02:00
|
|
|
function(response) {
|
2014-08-21 18:17:41 +02:00
|
|
|
var data = assignRoomAliases(response.data.rooms);
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.feedback = "Success";
|
2014-08-15 16:40:37 +02:00
|
|
|
for (var i=0; i<data.length; i++) {
|
|
|
|
$scope.rooms[data[i].room_id] = data[i];
|
|
|
|
}
|
2014-08-21 18:17:41 +02:00
|
|
|
|
|
|
|
var presence = response.data.presence;
|
|
|
|
for (var i = 0; i < presence.length; ++i) {
|
|
|
|
eventHandlerService.handleEvent(presence[i], false);
|
|
|
|
}
|
2014-08-12 16:10:52 +02:00
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Failure: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
matrixService.publicRooms().then(
|
2014-08-14 16:43:16 +02:00
|
|
|
function(response) {
|
|
|
|
$scope.public_rooms = assignRoomAliases(response.data.chunk);
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
);
|
2014-08-21 18:55:41 +02:00
|
|
|
|
|
|
|
eventStreamService.resume();
|
2014-08-12 16:10:52 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
$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
|
2014-08-14 16:43:16 +02:00
|
|
|
console.log("Created room " + response.data.room_alias + " with id: "+
|
|
|
|
response.data.room_id);
|
2014-08-12 16:10:52 +02:00
|
|
|
matrixService.createRoomIdToAliasMapping(
|
2014-08-14 16:43:16 +02:00
|
|
|
response.data.room_id, response.data.room_alias);
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.refresh();
|
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Failure: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// Go to a room
|
|
|
|
$scope.goToRoom = function(room_id) {
|
|
|
|
// Simply open the room page on this room id
|
2014-08-22 11:43:54 +02:00
|
|
|
//$location.url("room/" + room_id);
|
2014-08-12 16:10:52 +02:00
|
|
|
matrixService.join(room_id).then(
|
|
|
|
function(response) {
|
2014-08-14 16:43:16 +02:00
|
|
|
if (response.data.hasOwnProperty("room_id")) {
|
|
|
|
if (response.data.room_id != room_id) {
|
2014-08-22 11:43:54 +02:00
|
|
|
$location.url("room/" + response.data.room_id);
|
2014-08-12 16:10:52 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-22 11:43:54 +02:00
|
|
|
$location.url("room/" + room_id);
|
2014-08-12 16:10:52 +02:00
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Can't join room: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2014-08-12 18:17:10 +02:00
|
|
|
$scope.joinAlias = function(room_alias) {
|
|
|
|
matrixService.joinAlias(room_alias).then(
|
|
|
|
function(response) {
|
2014-08-18 17:41:23 +02:00
|
|
|
// Go to this room
|
2014-08-22 11:43:54 +02:00
|
|
|
$location.url("room/" + room_alias);
|
2014-08-12 18:17:10 +02:00
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Can't join room: " + error.data;
|
2014-08-12 18:17:10 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
$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();
|
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Can't update display name: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2014-08-14 11:39:03 +02:00
|
|
|
|
|
|
|
$scope.$watch("newProfileInfo.avatarFile", function(newValue, oldValue) {
|
|
|
|
if ($scope.newProfileInfo.avatarFile) {
|
2014-08-14 18:40:20 +02:00
|
|
|
console.log("Uploading new avatar file...");
|
|
|
|
mFileUpload.uploadFile($scope.newProfileInfo.avatarFile).then(
|
|
|
|
function(url) {
|
|
|
|
$scope.newProfileInfo.avatar = url;
|
|
|
|
$scope.setAvatar($scope.newProfileInfo.avatar);
|
|
|
|
},
|
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Can't upload image";
|
|
|
|
}
|
|
|
|
);
|
2014-08-14 11:39:03 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
$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();
|
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.feedback = "Can't update avatar: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2014-08-22 11:34:27 +02:00
|
|
|
var generateClientSecret = function() {
|
|
|
|
var ret = "";
|
|
|
|
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
|
|
|
|
|
|
for (var i = 0; i < 32; i++) {
|
|
|
|
ret += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.linkEmail = function(email) {
|
2014-08-22 11:34:27 +02:00
|
|
|
if (email != $scope.linkedEmails.emailBeingAuthed) {
|
|
|
|
$scope.linkedEmails.clientSecret = generateClientSecret();
|
|
|
|
$scope.linkedEmails.sendAttempt = 1;
|
|
|
|
}
|
|
|
|
matrixService.linkEmail(email, $scope.linkedEmails.clientSecret, $scope.linkedEmails.sendAttempt).then(
|
2014-08-12 16:10:52 +02:00
|
|
|
function(response) {
|
2014-08-14 16:43:16 +02:00
|
|
|
if (response.data.success === true) {
|
2014-08-22 11:34:27 +02:00
|
|
|
$scope.linkedEmails.authTokenId = response.data.sid;
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.emailFeedback = "You have been sent an email.";
|
|
|
|
$scope.linkedEmails.emailBeingAuthed = email;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$scope.emailFeedback = "Failed to send email.";
|
|
|
|
}
|
|
|
|
},
|
2014-08-14 16:43:16 +02:00
|
|
|
function(error) {
|
|
|
|
$scope.emailFeedback = "Can't send email: " + error.data;
|
2014-08-12 16:10:52 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.submitEmailCode = function(code) {
|
|
|
|
var tokenId = $scope.linkedEmails.authTokenId;
|
|
|
|
if (tokenId === undefined) {
|
|
|
|
$scope.emailFeedback = "You have not requested a code with this email.";
|
|
|
|
return;
|
|
|
|
}
|
2014-08-22 11:34:27 +02:00
|
|
|
matrixService.authEmail(matrixService.config().user_id, tokenId, code, $scope.linkedEmails.clientSecret).then(
|
2014-08-12 16:10:52 +02:00
|
|
|
function(response) {
|
2014-08-14 16:43:16 +02:00
|
|
|
if ("success" in response.data && response.data.success === false) {
|
2014-08-12 16:10:52 +02:00
|
|
|
$scope.emailFeedback = "Failed to authenticate email.";
|
|
|
|
return;
|
|
|
|
}
|
2014-08-22 11:34:27 +02:00
|
|
|
matrixService.bindEmail(matrixService.config().user_id, tokenId, $scope.linkedEmails.clientSecret).then(
|
|
|
|
function(response) {
|
|
|
|
var config = matrixService.config();
|
|
|
|
var emailList = {};
|
|
|
|
if ("emailList" in config) {
|
|
|
|
emailList = config.emailList;
|
|
|
|
}
|
|
|
|
emailList[$scope.linkedEmails.emailBeingAuthed] = 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 link email: " + reason;
|
|
|
|
}
|
|
|
|
);
|
2014-08-12 16:10:52 +02:00
|
|
|
},
|
|
|
|
function(reason) {
|
|
|
|
$scope.emailFeedback = "Failed to auth email: " + reason;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.refresh();
|
|
|
|
}]);
|