From 67daf1074702f8ee8e0720c6f864bc4b8eb3780c Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Fri, 20 Dec 2013 17:24:50 +0100 Subject: prevent multiple autopage requests, fix #201 --- js/app/services/businesslayer/businesslayer.coffee | 2 ++ .../businesslayer/itembusinesslayer.coffee | 1 + js/app/services/persistence.coffee | 10 +++++-- js/public/app.js | 14 +++++++-- .../businesslayer/itembusinesslayerSpec.coffee | 16 +++++++++++ js/tests/services/persistenceSpec.coffee | 33 ++++++++++++++++++++++ 6 files changed, 71 insertions(+), 5 deletions(-) (limited to 'js') diff --git a/js/app/services/businesslayer/businesslayer.coffee b/js/app/services/businesslayer/businesslayer.coffee index 14d692084..f7b02baea 100644 --- a/js/app/services/businesslayer/businesslayer.coffee +++ b/js/app/services/businesslayer/businesslayer.coffee @@ -27,9 +27,11 @@ angular.module('News').factory '_BusinessLayer', -> constructor: (@_activeFeed, @_persistence, @_itemModel, @_type, @_$rootScope) -> + @_preventAutopage = false load: (id) -> + @_preventAutopage = false @_$rootScope.$broadcast 'loadingNewItems' @_itemModel.clear() @_persistence.getItems @_type, id, 0, => diff --git a/js/app/services/businesslayer/itembusinesslayer.coffee b/js/app/services/businesslayer/itembusinesslayer.coffee index 1382df190..82d19de8e 100644 --- a/js/app/services/businesslayer/itembusinesslayer.coffee +++ b/js/app/services/businesslayer/itembusinesslayer.coffee @@ -106,6 +106,7 @@ StarredBusinessLayer, NewestItem) -> loadNext: (callback) -> + lowestItemId = @_itemModel.getLowestId() if lowestItemId != 0 @_persistence.getItems @_activeFeed.getType(), diff --git a/js/app/services/persistence.coffee b/js/app/services/persistence.coffee index 176589e9c..1bbe754eb 100644 --- a/js/app/services/persistence.coffee +++ b/js/app/services/persistence.coffee @@ -30,7 +30,7 @@ $rootScope, $q) -> constructor: (@_request, @_feedLoading, @_autoPageLoading, @_newLoading, @_config, @_activeFeed, @_$rootScope) -> - + @_preventUselessAutoPageRequest = false init: -> ### @@ -64,13 +64,16 @@ $rootScope, $q) -> # show different loading signs if offset == 0 + @_preventUselessAutoPageRequest = false loading = @_feedLoading else loading = @_autoPageLoading # loading sign handling loading.increase() - successCallbackWrapper = (data) -> + successCallbackWrapper = (data) => + if data.items.length == 0 + @_preventUselessAutoPageRequest = true onSuccess(data) loading.decrease() failureCallbackWrapper = (data) -> @@ -85,7 +88,8 @@ $rootScope, $q) -> onSuccess: successCallbackWrapper onFailure: failureCallbackWrapper - @_request.get 'news_items', params + if not @_preventUselessAutoPageRequest + @_request.get 'news_items', params getNewItems: (type, id, lastModified, onSuccess) -> diff --git a/js/public/app.js b/js/public/app.js index e314695ca..c709dccab 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -1051,10 +1051,12 @@ License along with this library. If not, see . this._itemModel = _itemModel; this._type = _type; this._$rootScope = _$rootScope; + this._preventAutopage = false; } BusinessLayer.prototype.load = function(id) { var _this = this; + this._preventAutopage = false; this._$rootScope.$broadcast('loadingNewItems'); this._itemModel.clear(); this._persistence.getItems(this._type, id, 0, function() { @@ -2730,6 +2732,7 @@ License along with this library. If not, see . this._config = _config; this._activeFeed = _activeFeed; this._$rootScope = _$rootScope; + this._preventUselessAutoPageRequest = false; } Persistence.prototype.init = function() { @@ -2760,18 +2763,23 @@ License along with this library. If not, see . Persistence.prototype.getItems = function(type, id, offset, onSuccess) { - var failureCallbackWrapper, loading, params, successCallbackWrapper; + var failureCallbackWrapper, loading, params, successCallbackWrapper, + _this = this; if (onSuccess == null) { onSuccess = null; } onSuccess || (onSuccess = function() {}); if (offset === 0) { + this._preventUselessAutoPageRequest = false; loading = this._feedLoading; } else { loading = this._autoPageLoading; } loading.increase(); successCallbackWrapper = function(data) { + if (data.items.length === 0) { + _this._preventUselessAutoPageRequest = true; + } onSuccess(data); return loading.decrease(); }; @@ -2788,7 +2796,9 @@ License along with this library. If not, see . onSuccess: successCallbackWrapper, onFailure: failureCallbackWrapper }; - return this._request.get('news_items', params); + if (!this._preventUselessAutoPageRequest) { + return this._request.get('news_items', params); + } }; Persistence.prototype.getNewItems = function(type, id, lastModified, onSuccess) { diff --git a/js/tests/services/businesslayer/itembusinesslayerSpec.coffee b/js/tests/services/businesslayer/itembusinesslayerSpec.coffee index 75804323d..9ac0a9e24 100644 --- a/js/tests/services/businesslayer/itembusinesslayerSpec.coffee +++ b/js/tests/services/businesslayer/itembusinesslayerSpec.coffee @@ -264,3 +264,19 @@ describe 'ItemBusinessLayer', -> expect(@persistence.getNewItems).toHaveBeenCalledWith( @FeedType.Feed, 3, 4, callback) + + + it 'should autopage the next items if there are none', => + @NewestItem.handle(13) + @persistence.getItems = jasmine.createSpy('autopage') + callback = -> + + @ItemModel.add({id: 2, guidHash: 'abc', feedId: 2, status: 16}) + @ItemModel.add({id: 3, guidHash: 'abcd', feedId: 2, status: 16}) + @ItemModel.add({id: 1, guidHash: 'abce', feedId: 2, status: 16}) + @ItemModel.add({id: 6, guidHash: 'abcf', feedId: 2, status: 16}) + + @ItemBusinessLayer.loadNext(callback) + + expect(@persistence.getItems).toHaveBeenCalledWith( + @FeedType.Feed, 3, 1, jasmine.any(Function)) \ No newline at end of file diff --git a/js/tests/services/persistenceSpec.coffee b/js/tests/services/persistenceSpec.coffee index b9250b974..323a41330 100644 --- a/js/tests/services/persistenceSpec.coffee +++ b/js/tests/services/persistenceSpec.coffee @@ -74,6 +74,37 @@ describe 'Persistence', -> expect(@req.get).toHaveBeenCalledWith('news_items', expected) + it 'should reset the autopage lock when loading a new feed', => + data = + items: [] + called = 0 + @req.get.andCallFake (route, params) -> + params.onSuccess(data) + called++ + + success = -> + @Persistence.getItems(2, 3, 4, success) + @Persistence.getItems(2, 3, 0, success) + + expect(called).toBe(2) + + + it 'should not send autopage request if reqeust returned nothing', => + data = + items: [] + called = 0 + @req.get.andCallFake (route, params) -> + params.onSuccess(data) + called++ + + success = -> + @Persistence.getItems(2, 3, 4, success) + @Persistence.getItems(2, 3, 4, success) + + expect(called).toBe(1) + + + it 'should send a load new items request', => success = -> params = @@ -446,3 +477,5 @@ describe 'Persistence', -> expect(@req.post).toHaveBeenCalledWith('news_usersettings_setcompact', expected) + + -- cgit v1.2.3