From 87b22f056398de41f9e9bb3feb4e2ace69eaf1dd Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Fri, 10 Apr 2015 19:00:43 +0300 Subject: [PATCH] Improved webpages support --- app/js/controllers.js | 148 +++++++++--------- app/js/directives.js | 9 +- app/js/services.js | 42 ++++- app/less/app.less | 5 +- app/partials/desktop/message.html | 2 +- .../desktop/message_attach_webpage.html | 8 +- app/partials/desktop/photo_modal.html | 10 +- 7 files changed, 139 insertions(+), 85 deletions(-) diff --git a/app/js/controllers.js b/app/js/controllers.js index dc65e673..e52c78b5 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1805,7 +1805,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) } }) - .controller('PhotoModalController', function ($q, $scope, $rootScope, $modalInstance, AppPhotosManager, AppMessagesManager, AppPeersManager, PeersSelectService, ErrorService) { + .controller('PhotoModalController', function ($q, $scope, $rootScope, $modalInstance, AppPhotosManager, AppMessagesManager, AppPeersManager, AppWebPagesManager, PeersSelectService, ErrorService) { $scope.photo = AppPhotosManager.wrapForFull($scope.photoID); $scope.nav = {}; @@ -1861,6 +1861,78 @@ angular.module('myApp.controllers', ['myApp.i18n']) updatePrevNext(); + + function preloadPhotos (sign) { + // var preloadOffsets = sign < 0 ? [-1,-2,1,-3,2] : [1,2,-1,3,-2]; + var preloadOffsets = sign < 0 ? [-1,-2] : [1,2]; + var index = list.indexOf($scope.messageID); + angular.forEach(preloadOffsets, function (offset) { + var messageID = list[index + offset]; + if (messageID !== undefined && preloaded[messageID] === undefined) { + preloaded[messageID] = true; + var message = AppMessagesManager.getMessage(messageID); + var photoID = message.media.photo.id; + AppPhotosManager.preloadPhoto(photoID); + } + }) + } + + function updatePrevNext (count) { + var index = list.indexOf($scope.messageID); + if (hasMore) { + if (count) { + $scope.count = Math.max(count, list.length); + } + } else { + $scope.count = list.length; + } + $scope.pos = $scope.count - index; + $scope.nav.hasNext = index > 0; + $scope.nav.hasPrev = hasMore || index < list.length - 1; + $scope.canForward = $scope.canDelete = $scope.messageID > 0; + }; + + $scope.nav.next = function () { + if (!$scope.nav.hasNext) { + return false; + } + + movePosition(-1); + }; + + $scope.nav.prev = function () { + if (!$scope.nav.hasPrev) { + return false; + } + movePosition(+1); + }; + + $scope.$on('history_delete', function (e, historyUpdate) { + if (historyUpdate.peerID == peerID) { + if (historyUpdate.msgs[$scope.messageID]) { + if ($scope.nav.hasNext) { + $scope.nav.next(); + } else if ($scope.nav.hasPrev) { + $scope.nav.prev(); + } else { + return $modalInstance.dismiss(); + } + } + var newList = []; + for (var i = 0; i < list.length; i++) { + if (!historyUpdate.msgs[list[i]]) { + newList.push(list[i]); + } + }; + list = newList; + } + }); + + if ($scope.webpageID) { + $scope.webpage = AppWebPagesManager.wrapForHistory($scope.webpageID); + return; + } + AppMessagesManager.getSearch(inputPeer, inputQuery, inputFilter, 0, 1000).then(function (searchCachedResult) { if (searchCachedResult.history.indexOf($scope.messageID) >= 0) { list = searchCachedResult.history; @@ -1887,16 +1959,14 @@ angular.module('myApp.controllers', ['myApp.i18n']) var messageID = list[index]; var message = AppMessagesManager.getMessage(messageID); - if (!message || - !message.media || - !message.media.photo || - !message.media.photo.id) { + var photoID = message && message.media && (message.media.photo && message.media.photo.id || message.media.webpage && message.media.webpage.photo && message.media.webpage.photo.id) + if (!photoID) { console.error('Invalid photo message', index, list, messageID, message); return; } $scope.messageID = messageID; - $scope.photoID = message.media.photo.id; + $scope.photoID = photoID; $scope.photo = AppPhotosManager.wrapForFull($scope.photoID); preloaded[$scope.messageID] = true; @@ -1911,21 +1981,6 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); }; - function preloadPhotos (sign) { - // var preloadOffsets = sign < 0 ? [-1,-2,1,-3,2] : [1,2,-1,3,-2]; - var preloadOffsets = sign < 0 ? [-1,-2] : [1,2]; - var index = list.indexOf($scope.messageID); - angular.forEach(preloadOffsets, function (offset) { - var messageID = list[index + offset]; - if (messageID !== undefined && preloaded[messageID] === undefined) { - preloaded[messageID] = true; - var message = AppMessagesManager.getMessage(messageID); - var photoID = message.media.photo.id; - AppPhotosManager.preloadPhoto(photoID); - } - }) - } - var loadingPromise = false; function loadMore () { if (loadingPromise) return loadingPromise; @@ -1950,57 +2005,6 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); }; - function updatePrevNext (count) { - var index = list.indexOf($scope.messageID); - if (hasMore) { - if (count) { - $scope.count = Math.max(count, list.length); - } - } else { - $scope.count = list.length; - } - $scope.pos = $scope.count - index; - $scope.nav.hasNext = index > 0; - $scope.nav.hasPrev = hasMore || index < list.length - 1; - $scope.canForward = $scope.canDelete = $scope.messageID > 0; - }; - - $scope.nav.next = function () { - if (!$scope.nav.hasNext) { - return false; - } - - movePosition(-1); - }; - - $scope.nav.prev = function () { - if (!$scope.nav.hasPrev) { - return false; - } - movePosition(+1); - }; - - $scope.$on('history_delete', function (e, historyUpdate) { - if (historyUpdate.peerID == peerID) { - if (historyUpdate.msgs[$scope.messageID]) { - if ($scope.nav.hasNext) { - $scope.nav.next(); - } else if ($scope.nav.hasPrev) { - $scope.nav.prev(); - } else { - return $modalInstance.dismiss(); - } - } - var newList = []; - for (var i = 0; i < list.length; i++) { - if (!historyUpdate.msgs[list[i]]) { - newList.push(list[i]); - } - }; - list = newList; - } - }); - }) .controller('UserpicModalController', function ($q, $scope, $rootScope, $modalInstance, MtpApiManager, AppPhotosManager, AppUsersManager, AppPeersManager, AppMessagesManager, ApiUpdatesManager, PeersSelectService, ErrorService) { diff --git a/app/js/directives.js b/app/js/directives.js index 9177228e..d0c7054a 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -460,11 +460,18 @@ angular.module('myApp.directives', ['myApp.filters']) .directive('myMessageWebpage', function(AppPhotosManager) { return { scope: { - 'webpage': '=myMessageWebpage' + 'webpage': '=myMessageWebpage', + 'messageId': '=messageId' }, templateUrl: templateUrl('message_attach_webpage'), link: function ($scope) { $scope.openPhoto = AppPhotosManager.openPhoto; + + $scope.$on('webpage_updated', function (e, eventData) { + if ($scope.webpage && $scope.webpage.id == eventData.id) { + $scope.$emit('ui_height'); + } + }); } }; }) diff --git a/app/js/services.js b/app/js/services.js index b8873182..8da21099 100755 --- a/app/js/services.js +++ b/app/js/services.js @@ -1398,7 +1398,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) AppAudioManager.saveAudio(apiMessage.media.audio); break; case 'messageMediaWebPage': - AppWebPagesManager.saveWebPage(apiMessage.media.webpage); + AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.id); break; } } @@ -1968,6 +1968,11 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) break; case 'messageMediaWebPage': + if (!message.media.webpage || + message.media.webpage._ == 'webPageEmpty') { + delete message.media; + break; + } message.media.webpage = AppWebPagesManager.wrapForHistory(message.media.webpage.id); break; } @@ -2495,6 +2500,18 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }); + $rootScope.$on('webpage_updated', function (e, eventData) { + angular.forEach(eventData.msgs, function (msgID) { + var historyMessage = messagesForHistory[msgID]; + if (historyMessage) { + historyMessage.media = { + _: 'messageMediaWebPage', + webpage: AppWebPagesManager.wrapForHistory(eventData.id) + }; + } + }) + }) + return { getDialogs: getDialogs, getHistory: getHistory, @@ -2688,6 +2705,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } else if (list && list.m > 0) { scope.messageID = list.m; + if (list.w) { + scope.webpageID = list.w; + } } var modalInstance = $modal.open({ @@ -2780,17 +2800,31 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) ); if (messageID) { - if (pendingWebPages[webpage.id] === undefined) { - pendingWebPages[webpage.id] = {}; + if (pendingWebPages[apiWebPage.id] === undefined) { + pendingWebPages[apiWebPage.id] = {}; } - pendingWebPages[webpage.id][messageID] = true; + pendingWebPages[apiWebPage.id][messageID] = true; webpages[apiWebPage.id] = apiWebPage; } + if (webpages[apiWebPage.id] === undefined) { webpages[apiWebPage.id] = apiWebPage; } else { safeReplaceObject(webpages[apiWebPage.id], apiWebPage); } + + if (!messageID && + pendingWebPages[apiWebPage.id] !== undefined) { + var msgs = []; + angular.forEach(pendingWebPages[apiWebPage.id], function (t, msgID) { + msgs.push(msgID); + }); + $rootScope.$broadcast('webpage_updated', { + id: apiWebPage.id, + msgs: msgs + }); + + } }; $rootScope.$on('apiUpdate', function (e, update) { diff --git a/app/less/app.less b/app/less/app.less index 93569484..751c7908 100644 --- a/app/less/app.less +++ b/app/less/app.less @@ -1521,9 +1521,12 @@ div.im_message_video_thumb { .im_message_webpage_description { margin: 2px 0 2px; } -.im_message_article_thumb { +.im_message_webpage_article_photo { + display: block; margin: 5px 0 5px 5px; } +.im_message_article_thumb { +} .im_message_video_embed { padding-bottom: 56.25%; /* 16/9 ratio */ diff --git a/app/partials/desktop/message.html b/app/partials/desktop/message.html index 7478cff2..7c550ac1 100644 --- a/app/partials/desktop/message.html +++ b/app/partials/desktop/message.html @@ -60,7 +60,7 @@
-
+
diff --git a/app/partials/desktop/message_attach_webpage.html b/app/partials/desktop/message_attach_webpage.html index 02f045ea..2e64a0ec 100644 --- a/app/partials/desktop/message_attach_webpage.html +++ b/app/partials/desktop/message_attach_webpage.html @@ -1,11 +1,11 @@ -
+
- +
-
+ -
+
diff --git a/app/partials/desktop/photo_modal.html b/app/partials/desktop/photo_modal.html index 58e9b988..3c915b8c 100644 --- a/app/partials/desktop/photo_modal.html +++ b/app/partials/desktop/photo_modal.html @@ -22,17 +22,23 @@
-
+
-
+
+
+
+ +
+
+