50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
(function (root, factory) {
|
|
if (typeof module === 'object' && module.exports) module.exports = factory;
|
|
else root.createUpdateReadPosition = factory;
|
|
})(typeof self !== 'undefined' ? self : this, function createUpdateReadPosition(options) {
|
|
const panel = options.panel;
|
|
const jump = options.jump;
|
|
let identity = '';
|
|
let openingTop = 0;
|
|
let movedByUser = false;
|
|
let positioned = false;
|
|
let target = null;
|
|
|
|
function moveToTarget() {
|
|
if (!target) return false;
|
|
target.classList?.add('update-new-activity');
|
|
target.scrollIntoView({ block:'end' });
|
|
positioned = true;
|
|
jump.hidden = true;
|
|
return true;
|
|
}
|
|
|
|
panel.addEventListener('scroll', () => {
|
|
if (identity && !positioned && panel.scrollTop !== openingTop) movedByUser = true;
|
|
}, { passive:true });
|
|
|
|
return {
|
|
open(nextIdentity) {
|
|
identity = String(nextIdentity || '');
|
|
openingTop = panel.scrollTop;
|
|
movedByUser = false;
|
|
positioned = false;
|
|
target = null;
|
|
jump.hidden = true;
|
|
},
|
|
ready(readyIdentity, newest) {
|
|
if (!identity || String(readyIdentity || '') !== identity || positioned || !newest) return false;
|
|
target = newest;
|
|
target.classList?.add('update-new-activity');
|
|
if (movedByUser) {
|
|
jump.hidden = false;
|
|
return false;
|
|
}
|
|
return moveToTarget();
|
|
},
|
|
jump() {
|
|
return moveToTarget();
|
|
},
|
|
};
|
|
});
|