import {html} from 'htm/preact';
import {Component} from 'preact';
import {log, querySelector, querySelectorAll} from '..';
type Props = Record;
type State = {
hidden: boolean;
newCommentCount: number;
previousComment: HTMLElement | null;
};
export class JumpToNewCommentFeature extends Component {
constructor() {
super();
const newCommentCount = querySelectorAll('.comment.is-comment-new').length;
this.state = {
hidden: false,
newCommentCount,
previousComment: null
};
if (newCommentCount === 0) {
log('Jump To New Comment: 0 new comments found, not doing anything.');
} else {
log(
`Jump To New Comment: Initialized for ${newCommentCount} new comments.`
);
}
}
jump = () => {
// Remove the new comment style from the previous
// jumped comment if there is one.
this.state.previousComment?.classList.remove('is-comment-new');
const newestComment = document.querySelector(
'.comment.is-comment-new'
);
// If there are no new comments left, hide the button.
if (newestComment === null) {
log('Jump To New Comment: Final comment reached, hiding the button.');
this.setState({hidden: true});
return;
}
// If the newest comment is invisible, expand all comments to make it visible.
if (newestComment.offsetParent === null) {
querySelector('[data-js-comment-expand-all-button]').click();
}
newestComment.scrollIntoView({behavior: 'smooth'});
this.setState({previousComment: newestComment});
};
render() {
const newCommentCount = this.state.newCommentCount;
// If there are no new comments, don't render anything.
if (newCommentCount === 0) {
return;
}
const commentsLeft = querySelectorAll('.comment.is-comment-new').length;
const hidden = this.state.hidden ? 'trx-hidden' : '';
return html``;
}
}