Refactor to array based navigation
[hnim.git] / hnim.js
CommitLineData
ffe0b2f4 1(() => {
cf7b74e9
JC
2 const comments = document.querySelectorAll("tr.comtr");
3 const morelink = document.querySelectorAll("a.morelink");
4
5 const elements = [...Array.from(comments), ...Array.from(morelink)]
ffe0b2f4 6
cf7b74e9
JC
7 let elementsIndex = 0;
8 let selectedComment = elements[elementsIndex]
ffe0b2f4
JC
9 selectedComment.style.outline = '1px dashed black';
10
11 const visible = (element) => {
12 let bounds = element.getBoundingClientRect();
13 return bounds.top >= 0 && bounds.bottom <= window.innerHeight;
14 }
15
16 const changeWithVisibleCallback = (comment, callback) => {
17 if (comment == null) {
18 return;
19 }
20 selectedComment.style.outline = '';
21 selectedComment = comment;
22 selectedComment.style.outline = '1px dashed black';
23 if (!visible(comment)) {
24 callback();
25 }
26 }
27
28 const change = (comment) => {
cf7b74e9 29 elementsIndex = elements.indexOf(comment);
ffe0b2f4
JC
30 changeWithVisibleCallback(comment, () => {});
31 }
32
33 // Curry callback for moving downpage
cf7b74e9
JC
34 const changeDownpage = () => {
35 elementsIndex = Math.min(elementsIndex + 1, elements.length);
36 changeWithVisibleCallback(elements[elementsIndex], () => {window.scrollTo(0, window.scrollY + selectedComment.offsetHeight)});
ffe0b2f4
JC
37 }
38
39 // Curry callback for moving up page
cf7b74e9
JC
40 const changeUppage = () => {
41 elementsIndex = Math.max(elementsIndex - 1, 0);
42 changeWithVisibleCallback(elements[elementsIndex], () => {window.scrollTo(0, window.scrollY - selectedComment.offsetHeight)});
ffe0b2f4 43 }
ec8ce8db 44
ffe0b2f4
JC
45 document.addEventListener("click", (e) => {
46 change(e.target.closest("tr.athing"));
47 })
48 document.addEventListener("keydown", (e) => {
49 if (e.isComposing) {
ec8ce8db 50 return;
ffe0b2f4 51 }
ec8ce8db
JC
52 switch (e.key) {
53 case "j":
54 do {
cf7b74e9 55 changeDownpage();
ec8ce8db
JC
56 } while (selectedComment.classList.contains("noshow"));
57 break;
58 case "k":
59 do {
cf7b74e9 60 changeUppage();
ec8ce8db
JC
61 } while (selectedComment.classList.contains("noshow"));
62 break;
63 case "m":
64 case "Enter":
65 let togg = selectedComment.querySelector(".togg");
ec8ce8db
JC
66 if (togg) {
67 togg.click();
68 }
cf7b74e9
JC
69 else if (elementsIndex == elements.length - 1) {
70 selectedComment.click();
ec8ce8db
JC
71 }
72 break;
73 case "p":
74 while (selectedComment.querySelector("td.ind").firstElementChild.width != 0) {
cf7b74e9 75 changeUppage();
ec8ce8db
JC
76 }
77 break;
78 default:
79 //noop
ffe0b2f4
JC
80 }
81 })
82})();