Repository navigation
Expand file tree
/
Copy pathreader-scroll.mjs
More file actions
77 lines (74 loc) · 2.81 KB
/
Copy pathreader-scroll.mjs
File metadata and controls
77 lines (74 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { t } from '../../i18n/index.mjs';
export function createReaderScroll({
renderState,
session,
motion,
translationState,
preferences,
activity,
feedback,
view,
actions,
}) {
function showScrollbar(event) {
const el = event?.currentTarget;
if (!el) return;
el.dataset.scrolling = 'true';
clearTimeout(renderState.scrollbarTimers.get(el));
renderState.scrollbarTimers.set(
el,
setTimeout(() => {
delete el.dataset.scrolling;
renderState.scrollbarTimers.delete(el);
}, 800),
);
}
function scrolling(event) {
actions.rootActions.immersiveScroll();
if (session.restoringView.value || motion.fitResizing) return;
activity.performanceRecorder.scroll();
const el = view.reader.value,
now = performance.now(),
position = view.direction.value === 'horizontal' ? el?.scrollLeft : el?.scrollTop,
extent = view.direction.value === 'horizontal' ? el?.clientWidth : el?.clientHeight;
if (translationState.lastTranslationScroll && position !== undefined) {
const delta = position - translationState.lastTranslationScroll.position;
if (Math.abs(delta) > 1) translationState.readingDirection = Math.sign(delta);
translationState.translationMoving =
Math.abs(delta) > extent * 0.6 ||
Math.abs(delta) / Math.max(16, now - translationState.lastTranslationScroll.time) >
extent / 700;
}
translationState.lastTranslationScroll = { position: position || 0, time: now };
const viewport = actions.readerViewport.viewportPages();
if (!motion.pinching.value) actions.translationQueue.schedulePages();
actions.readerViewport.scheduleViewport(viewport);
actions.readingPosition.scheduleReadingSave();
showScrollbar(event);
actions.readerPreview.interruptPreview();
actions.readerInputs.showNavigator();
feedback.reading.value = t('reading.scrolling');
clearTimeout(translationState.timer);
translationState.timer = setTimeout(() => {
if (!motion.pinching.value) settle();
}, 180);
}
function settle() {
translationState.translationMoving = false;
if (!activity.foreground.value && preferences.translationMode.value !== 'full') return;
if (!renderState.previewScrolling && !motion.pinching.value) {
for (const n of renderState.visiblePages) {
const p = session.pages.value[n - 1];
if (p) renderState.pendingPreview.set(n, p);
}
actions.readerPreview.flushPreview();
}
if (!activity.foreground.value && preferences.translationMode.value !== 'full') return;
const p = session.pages.value[view.active.value - 1];
if (!p) return;
feedback.reading.value = t('reading.readingPage', { page: p.number });
p.dwell++;
actions.translationQueue.schedulePages();
}
return { showScrollbar, scrolling, settle };
}