You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/public/src/modules/handleBack.js

107 lines
3.2 KiB
JavaScript

'use strict';
define('handleBack', [
'components',
'storage',
'navigator',
'forum/pagination',
], function (components, storage, navigator, pagination) {
const handleBack = {};
let loadTopicsMethod;
handleBack.init = function (_loadTopicsMethod) {
loadTopicsMethod = _loadTopicsMethod;
saveClickedIndex();
$(window).off('action:popstate', onBackClicked).on('action:popstate', onBackClicked);
};
handleBack.onBackClicked = onBackClicked;
function saveClickedIndex() {
$('[component="category"]').on('click', '[component="topic/header"]', function () {
const clickedIndex = $(this).parents('[data-index]').attr('data-index');
const windowScrollTop = $(window).scrollTop();
$('[component="category/topic"]').each(function (index, el) {
if ($(el).offset().top - windowScrollTop > 0) {
storage.setItem('category:bookmark', $(el).attr('data-index'));
storage.setItem('category:bookmark:clicked', clickedIndex);
storage.setItem('category:bookmark:offset', $(el).offset().top - windowScrollTop);
return false;
}
});
});
}
function onBackClicked(isMarkedUnread) {
const highlightUnread = isMarkedUnread && ajaxify.data.template.unread;
if (
ajaxify.data.template.category ||
ajaxify.data.template.recent ||
ajaxify.data.template.popular ||
highlightUnread
) {
let bookmarkIndex = storage.getItem('category:bookmark');
let clickedIndex = storage.getItem('category:bookmark:clicked');
storage.removeItem('category:bookmark');
storage.removeItem('category:bookmark:clicked');
if (!utils.isNumber(bookmarkIndex)) {
return;
}
bookmarkIndex = Math.max(0, parseInt(bookmarkIndex, 10) || 0);
clickedIndex = Math.max(0, parseInt(clickedIndex, 10) || 0);
if (config.usePagination) {
const page = Math.ceil((parseInt(bookmarkIndex, 10) + 1) / config.topicsPerPage);
if (parseInt(page, 10) !== ajaxify.data.pagination.currentPage) {
pagination.loadPage(page, function () {
handleBack.scrollToTopic(bookmarkIndex, clickedIndex);
});
} else {
handleBack.scrollToTopic(bookmarkIndex, clickedIndex);
}
} else {
if (bookmarkIndex === 0) {
handleBack.scrollToTopic(bookmarkIndex, clickedIndex);
return;
}
$('[component="category"]').empty();
loadTopicsMethod(Math.max(0, bookmarkIndex - 1) + 1, function () {
handleBack.scrollToTopic(bookmarkIndex, clickedIndex);
});
}
}
}
handleBack.highlightTopic = function (topicIndex) {
const highlight = components.get('category/topic', 'index', topicIndex);
if (highlight.length && !highlight.hasClass('highlight')) {
highlight.addClass('highlight');
setTimeout(function () {
highlight.removeClass('highlight');
}, 5000);
}
};
handleBack.scrollToTopic = function (bookmarkIndex, clickedIndex) {
if (!utils.isNumber(bookmarkIndex)) {
return;
}
const scrollTo = components.get('category/topic', 'index', bookmarkIndex);
if (scrollTo.length) {
const offset = storage.getItem('category:bookmark:offset');
storage.removeItem('category:bookmark:offset');
$(window).scrollTop(scrollTo.offset().top - offset);
handleBack.highlightTopic(clickedIndex);
navigator.update();
}
};
return handleBack;
});