Browse Source

Improved channels error handling

master
Igor Zhukov 9 years ago
parent
commit
7ab5650f99
  1. 22
      app/js/controllers.js
  2. 3
      app/js/locales/en-us.json
  3. 21
      app/js/messages_manager.js
  4. 29
      app/js/services.js
  5. 3
      app/partials/desktop/confirm_modal.html
  6. 5
      app/partials/desktop/error_modal.html
  7. 15
      app/partials/desktop/im.html

22
app/js/controllers.js

@ -620,7 +620,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$scope.dialogs = []; $scope.dialogs = [];
$scope.contacts = []; $scope.contacts = [];
$scope.foundUsers = []; $scope.foundPeers = [];
$scope.foundMessages = []; $scope.foundMessages = [];
if ($scope.search === undefined) { if ($scope.search === undefined) {
@ -854,7 +854,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
if (!searchMessages) { if (!searchMessages) {
$scope.dialogs = []; $scope.dialogs = [];
$scope.contacts = []; $scope.contacts = [];
$scope.foundUsers = []; $scope.foundPeers = [];
} }
$scope.foundMessages = []; $scope.foundMessages = [];
@ -966,15 +966,16 @@ angular.module('myApp.controllers', ['myApp.i18n'])
if (curJump != contactsJump) return; if (curJump != contactsJump) return;
MtpApiManager.invokeApi('contacts.search', {q: $scope.search.query, limit: 10}).then(function (result) { MtpApiManager.invokeApi('contacts.search', {q: $scope.search.query, limit: 10}).then(function (result) {
AppUsersManager.saveApiUsers(result.users); AppUsersManager.saveApiUsers(result.users);
AppChatsManager.saveApiChats(result.chats);
if (curJump != contactsJump) return; if (curJump != contactsJump) return;
$scope.foundUsers = []; $scope.foundPeers = [];
angular.forEach(result.results, function(contactFound) { angular.forEach(result.results, function(contactFound) {
var userID = contactFound.user_id; var peerID = AppPeersManager.getPeerID(contactFound);
if (peersInDialogs[userID] === undefined) { if (peersInDialogs[peerID] === undefined) {
$scope.foundUsers.push({ $scope.foundPeers.push({
userID: userID, id: peerID,
user: AppUsersManager.getUser(userID), username: AppPeersManager.getPeer(peerID).username,
peerString: AppUsersManager.getUserString(userID) peerString: AppUsersManager.getUserString(peerID)
}); });
} }
}); });
@ -1726,6 +1727,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
if (updPeerID == $scope.curDialog.peerID) { if (updPeerID == $scope.curDialog.peerID) {
$location.url('/im'); $location.url('/im');
} }
historiesQueuePop(updPeerID);
}); });
$scope.$on('notify_settings', function (e, data) { $scope.$on('notify_settings', function (e, data) {
@ -3926,7 +3928,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
.controller('ContactsModalController', function ($scope, $timeout, $modal, $modalInstance, MtpApiManager, AppUsersManager, ErrorService) { .controller('ContactsModalController', function ($scope, $timeout, $modal, $modalInstance, MtpApiManager, AppUsersManager, ErrorService) {
$scope.contacts = []; $scope.contacts = [];
$scope.foundUsers = []; $scope.foundPeers = [];
$scope.search = {}; $scope.search = {};
$scope.slice = {limit: 20, limitDelta: 20}; $scope.slice = {limit: 20, limitDelta: 20};

3
app/js/locales/en-us.json

@ -217,6 +217,7 @@
"confirm_modal_abort_password_setup": "Abort two-step verification setup?", "confirm_modal_abort_password_setup": "Abort two-step verification setup?",
"confirm_modal_reset_account_md": "Are you sure?\nThis action can not be undone.\n\nYou will lose all your chats and messages, along with any media and files you shared, if you proceed with resetting your account.", "confirm_modal_reset_account_md": "Are you sure?\nThis action can not be undone.\n\nYou will lose all your chats and messages, along with any media and files you shared, if you proceed with resetting your account.",
"confirm_modal_join_group_link": "Do you want to join the group «{title}»?", "confirm_modal_join_group_link": "Do you want to join the group «{title}»?",
"confirm_modal_join_channel_link": "Do you want to join the channel «{title}»?",
"confirm_modal_revoke_group_link": "Are you sure you want to revoke this link? Once you do, no one will be able to join the group using it.", "confirm_modal_revoke_group_link": "Are you sure you want to revoke this link? Once you do, no one will be able to join the group using it.",
"confirm_modal_revoke_channel_link": "Are you sure you want to revoke this link? Once you do, no one will be able to join the channel using it.", "confirm_modal_revoke_channel_link": "Are you sure you want to revoke this link? Once you do, no one will be able to join the channel using it.",
"confirm_modal_delete_channel_md": "Are you sure you want to delete this channel?\n\nAll messages will be removed and all messages will be lost.", "confirm_modal_delete_channel_md": "Are you sure you want to delete this channel?\n\nAll messages will be removed and all messages will be lost.",
@ -363,6 +364,8 @@
"error_modal_password_disabled_descripion": "You have disabled Two-Step Verification.", "error_modal_password_disabled_descripion": "You have disabled Two-Step Verification.",
"error_modal_user_not_mutual_contact": "The user can be invited by his contact only", "error_modal_user_not_mutual_contact": "The user can be invited by his contact only",
"error_modal_invite_link_invalid": "The invite link is invalid", "error_modal_invite_link_invalid": "The invite link is invalid",
"error_modal_channel_not_accessible": "Sorry, this channel is not accessible.",
"error_modal_not_contact_flood": "Sorry, you can only send messages to mutual contacts at the moment. {more-info-link: More info »}",
"head_telegram": "Telegram", "head_telegram": "Telegram",

21
app/js/messages_manager.js

@ -314,7 +314,7 @@ angular.module('myApp.services')
offset_id: maxID ? getMessageLocalID(maxID) : 0, offset_id: maxID ? getMessageLocalID(maxID) : 0,
add_offset: offset || 0, add_offset: offset || 0,
limit: limit || 0 limit: limit || 0
}, {noErrorBox: true}); });
} else { } else {
promise = MtpApiManager.invokeApi('messages.getHistory', { promise = MtpApiManager.invokeApi('messages.getHistory', {
peer: inputPeer, peer: inputPeer,
@ -365,6 +365,23 @@ angular.module('myApp.services')
} }
return historyResult; return historyResult;
}); });
}, function (error) {
switch (error.type) {
case 'CHANNEL_PRIVATE':
var channel = AppChatsManager.getChat(-peerID);
channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};
ApiUpdatesManager.processUpdateMessage({
_: 'updates',
updates: [{
_: 'updateChannel',
channel_id: -peerID
}],
chats: [channel],
users: []
});
break;
}
return $q.reject(error);
}); });
} }
@ -1599,7 +1616,7 @@ angular.module('myApp.services')
chatTitle = chatInvite.title; chatTitle = chatInvite.title;
} }
ErrorService.confirm({ ErrorService.confirm({
type: 'JOIN_GROUP_BY_LINK', type: chatInvite.flags & 1 ? 'JOIN_CHANNEL_BY_LINK' : 'JOIN_GROUP_BY_LINK',
title: chatTitle title: chatTitle
}).then(function () { }).then(function () {
return MtpApiManager.invokeApi('messages.importChatInvite', { return MtpApiManager.invokeApi('messages.importChatInvite', {

29
app/js/services.js

@ -418,9 +418,14 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
case 'updateUserPhoto': case 'updateUserPhoto':
var userID = update.user_id; var userID = update.user_id;
if (users[userID]) { var user = users[userID];
if (user) {
forceUserOnline(userID); forceUserOnline(userID);
safeReplaceObject(users[userID].photo, update.photo); if (!user.photo) {
user.photo = update.photo;
} else {
safeReplaceObject(user.photo, update.photo);
}
if (cachedPhotoLocations[userID] !== undefined) { if (cachedPhotoLocations[userID] !== undefined) {
safeReplaceObject(cachedPhotoLocations[userID], update.photo && update.photo.photo_small || {empty: true}); safeReplaceObject(cachedPhotoLocations[userID], update.photo && update.photo.photo_small || {empty: true});
@ -619,7 +624,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
function isChannel (id) { function isChannel (id) {
var chat = chats[id]; var chat = chats[id];
if (chat && chat._ == 'channel' || if (chat && (chat._ == 'channel' || chat._ == 'channelForbidden') ||
channelAccess[id]) { channelAccess[id]) {
return true; return true;
} }
@ -965,7 +970,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
} }
}) })
.service('AppProfileManager', function ($q, $rootScope, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, NotificationsManager, MtpApiManager, RichTextProcessor) { .service('AppProfileManager', function ($q, $rootScope, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, NotificationsManager, MtpApiManager, ApiUpdatesManager, RichTextProcessor) {
var botInfos = {}; var botInfos = {};
var chatsFull = {}; var chatsFull = {};
@ -1129,6 +1134,22 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
return fullChannel; return fullChannel;
}); });
}, function (error) {
switch (error.type) {
case 'CHANNEL_PRIVATE':
var channel = AppChatsManager.getChat(id);
channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};
ApiUpdatesManager.processUpdateMessage({
_: 'updates',
updates: [{
_: 'updateChannel',
channel_id: id
}],
chats: [channel],
users: []
});
break;
}
}); });
} }

3
app/partials/desktop/confirm_modal.html

@ -48,6 +48,9 @@
<div ng-switch-when="JOIN_GROUP_BY_LINK" my-i18n="confirm_modal_join_group_link"> <div ng-switch-when="JOIN_GROUP_BY_LINK" my-i18n="confirm_modal_join_group_link">
<my-i18n-param name="title"><strong ng-bind="title"></strong></my-i18n-param> <my-i18n-param name="title"><strong ng-bind="title"></strong></my-i18n-param>
</div> </div>
<div ng-switch-when="JOIN_CHANNEL_BY_LINK" my-i18n="confirm_modal_join_channel_link">
<my-i18n-param name="title"><strong ng-bind="title"></strong></my-i18n-param>
</div>
<div ng-switch-when="REVOKE_GROUP_INVITE_LINK" my-i18n="confirm_modal_revoke_group_link"></div> <div ng-switch-when="REVOKE_GROUP_INVITE_LINK" my-i18n="confirm_modal_revoke_group_link"></div>
<div ng-switch-when="REVOKE_CHANNEL_INVITE_LINK" my-i18n="confirm_modal_revoke_channel_link"></div> <div ng-switch-when="REVOKE_CHANNEL_INVITE_LINK" my-i18n="confirm_modal_revoke_channel_link"></div>
<div ng-switch-when="CHANNEL_DELETE" my-i18n="confirm_modal_delete_channel_md"></div> <div ng-switch-when="CHANNEL_DELETE" my-i18n="confirm_modal_delete_channel_md"></div>

5
app/partials/desktop/error_modal.html

@ -42,7 +42,10 @@
<span ng-switch-when="INVITE_HASH_INVALID" my-i18n="error_modal_invite_link_invalid"></span> <span ng-switch-when="INVITE_HASH_INVALID" my-i18n="error_modal_invite_link_invalid"></span>
<span ng-switch-when="INVITE_HASH_EXPIRED" my-i18n="error_modal_invite_link_invalid"></span> <span ng-switch-when="INVITE_HASH_EXPIRED" my-i18n="error_modal_invite_link_invalid"></span>
<span ng-switch-when="INVITE_HASH_EMPTY" my-i18n="error_modal_invite_link_invalid"></span> <span ng-switch-when="INVITE_HASH_EMPTY" my-i18n="error_modal_invite_link_invalid"></span>
<span ng-switch-when="CHANNEL_PRIVATE" my-i18n="error_modal_channel_not_accessible"></span>
<span ng-switch-when="PEER_FLOOD" my-i18n="error_modal_not_contact_flood">
<my-i18n-param name="more-info-link"><a href="https://telegram.org/faq#can-39t-send-messages-to-non-contacts" target="_blank">{0}</a></my-i18n-param>
</span>
<div ng-switch-default ng-switch="error.code"> <div ng-switch-default ng-switch="error.code">

15
app/partials/desktop/im.html

@ -48,19 +48,18 @@
</ul> </ul>
</div> </div>
<div class="im_dialogs_contacts_wrap" ng-show="foundUsers.length > 0"> <div class="im_dialogs_contacts_wrap" ng-show="foundPeers.length > 0">
<h5 my-i18n="im_found_title"></h5> <h5 my-i18n="im_found_title"></h5>
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">
<li class="im_dialog_wrap" ng-repeat="foundUser in foundUsers track by foundUser.userID" ng-class="{active: curDialog.peerID == foundUser.userID}"> <li class="im_dialog_wrap" ng-repeat="foundPeer in foundPeers track by foundPeer.id" ng-class="{active: curDialog.peerID == foundPeer.id}">
<a class="im_dialog" ng-mousedown="dialogSelect(foundUser.peerString)"> <a class="im_dialog" ng-mousedown="dialogSelect(foundPeer.peerString)">
<div class="im_dialog_photo pull-left" my-peer-photolink="foundUser.userID" img-class="im_dialog_photo" watch="true"></div> <div class="im_dialog_photo pull-left" my-peer-photolink="foundPeer.id" img-class="im_dialog_photo" watch="true"></div>
<div class="im_dialog_message_wrap"> <div class="im_dialog_message_wrap">
<div class="im_dialog_peer"> <div class="im_dialog_peer">
<span class="im_dialog_user" my-peer-link="foundUser.userID"></span> <span class="im_dialog_user" my-peer-link="foundPeer.id"></span>
</div> </div>
<div class="im_dialog_message" ng-switch="foundUser.user.username.length > 0"> <div class="im_dialog_message">
<span ng-switch-when="true" class="im_dialog_message_text" ng-bind="::'@' + foundUser.user.username"></span> <span class="im_dialog_message_text" ng-bind="::'@' + foundPeer.username"></span>
<span ng-switch-default class="im_dialog_message_text" my-user-status="::foundUser.userID"></span>
</div> </div>
</div> </div>
</a> </a>

Loading…
Cancel
Save