diff options
author | HK2FB <tom.schmidt@helsana.ch> | 2022-05-15 13:16:56 +0200 |
---|---|---|
committer | Sean Molenaar <sean@seanmolenaar.eu> | 2022-05-22 16:07:30 +0200 |
commit | b036d309c27132e4f10df952e9335afdb3edfeb5 (patch) | |
tree | e888f1fa178f2fe36baefcfb2ccc080ef27645ce /js-old/directive/NewsScroll.js | |
parent | 50c8960f8d36ab6012f62034f815561078380dc0 (diff) |
Vue Rewrite
Signed-off-by: Sean Molenaar <sean@seanmolenaar.eu>
Diffstat (limited to 'js-old/directive/NewsScroll.js')
-rw-r--r-- | js-old/directive/NewsScroll.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/js-old/directive/NewsScroll.js b/js-old/directive/NewsScroll.js new file mode 100644 index 000000000..44271b72b --- /dev/null +++ b/js-old/directive/NewsScroll.js @@ -0,0 +1,111 @@ +/** + * Nextcloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Bernhard Posselt 2014 + */ +app.directive('newsScroll', function ($timeout, ITEM_AUTO_PAGE_SIZE, + MARK_READ_TIMEOUT, SCROLL_TIMEOUT) { + 'use strict'; + var timer; + + // autopaging + var autoPage = function (limit, elem, scope) { + var counter = 0; + var articles = elem.find('.item'); + + for (var i = articles.length - 1; i >= 0; i -= 1) { + var item = $(articles[i]); + + + // if the counter is higher than the size it means + // that it didnt break to auto page yet and that + // there are more items, so break + if (counter >= limit) { + break; + } + + // this is only reached when the item is not is + // below the top and we didnt hit the factor yet so + // autopage and break + if (item[0].getBoundingClientRect().top < 0) { + scope.$apply(scope.newsScrollAutoPage); + break; + } + + counter += 1; + } + }; + + // mark read + var markRead = function (enabled, elem, scope) { + if (enabled) { + var ids = []; + var articles = elem.querySelectorAll('.item:not(.read)'); + + articles.forEach(function(article) { + // distance to top + height + var distTop = article.offsetTop + article.offsetHeight; + var scrollTop = window.pageYOffset || + document.documentElement.scrollTop; + if (distTop < scrollTop) { + ids.push(parseInt(article.dataset.id, 10)); + } else { + return false; + } + }); + + scope.itemIds = ids; + scope.$apply(scope.newsScrollMarkRead); + } + }; + + return { + restrict: 'A', + scope: { + 'newsScroll': '@', + 'newsScrollAutoPage': '&', + 'newsScrollMarkRead': '&', + 'newsScrollEnabledMarkRead': '=', + }, + link: function (scope, elem) { + var allowScroll = true; + + var scrollHandler = function () { + // allow only one scroll event to trigger every 300ms + if (allowScroll) { + allowScroll = false; + + $timeout(function () { + allowScroll = true; + }, SCROLL_TIMEOUT * 1000); + + autoPage(ITEM_AUTO_PAGE_SIZE, elem, scope); + + // dont stack mark read requests + if (timer) { + $timeout.cancel(timer); + } + + // allow user to undo accidental scroll + timer = $timeout(function () { + markRead(scope.newsScrollEnabledMarkRead, + elem[0], + scope); + timer = undefined; + }, MARK_READ_TIMEOUT*1000); + } + }; + + $(document).on('scroll', scrollHandler); + + // remove scroll handler if element is destroyed + scope.$on('$destroy', function () { + $(document).off('scroll', scrollHandler); + }); + } + }; +});
\ No newline at end of file |