Skip to content

Commit e2c803c

Browse files
committed
feat(reader): 添加导航锁定功能以防止在选中文本时翻页
1 parent ce866cf commit e2c803c

3 files changed

Lines changed: 24 additions & 2 deletions

File tree

packages/app-expo/assets/reader/reader.html

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
let searchGenerator = null;
7474
let searchResults = [];
7575
let searchIndex = 0;
76+
let navigationLocked = false;
7677

7778
// ─── Message handler from React Native ───
7879
window.addEventListener('message', async (e) => {
@@ -572,8 +573,14 @@
572573
}
573574

574575
// ─── Expose global functions for injectJavaScript ───
575-
window.goNext = function() { if (view) view.next(); };
576-
window.goPrev = function() { if (view) view.prev(); };
576+
window.goNext = function() {
577+
if (navigationLocked) return;
578+
if (view) view.next();
579+
};
580+
window.goPrev = function() {
581+
if (navigationLocked) return;
582+
if (view) view.prev();
583+
};
577584
window.goToHref = function(href) { if (view) view.goTo(href); };
578585
window.goToProgress = function(p) { if (view) view.goToFraction(p); };
579586
window.search = function(q) { handleSearch(q); };
@@ -587,6 +594,7 @@
587594
window.setViewMode = function(m) { applySettings({ viewMode: m }); };
588595
window.addAnnotation = function(a) { if (view) view.addAnnotation(a); };
589596
window.removeAnnotation = function(a) { if (view) view.deleteAnnotation(a); };
597+
window.setNavigationLocked = function(locked) { navigationLocked = locked; };
590598

591599
// ─── Polyfills ───
592600
Object.groupBy ??= function(iterable, fn) {

packages/app-expo/src/hooks/use-reader-bridge.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@ export function useReaderBridge(callbacks: ReaderBridgeCallbacks) {
154154
[inject],
155155
);
156156

157+
const setNavigationLocked = useCallback(
158+
(locked: boolean) => {
159+
inject(`window.setNavigationLocked(${locked})`);
160+
},
161+
[inject],
162+
);
163+
157164
// ─── Handle messages from WebView ───
158165

159166
const handleMessage = useCallback((event: { nativeEvent: { data: string } }) => {
@@ -235,5 +242,6 @@ export function useReaderBridge(callbacks: ReaderBridgeCallbacks) {
235242
removeAnnotation,
236243
applySettings,
237244
setThemeColors,
245+
setNavigationLocked,
238246
};
239247
}

packages/app-expo/src/screens/ReaderScreen.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,12 @@ export function ReaderScreen({ route, navigation }: Props) {
383383
}
384384
}, [webViewReady, highlights.length]);
385385

386+
// Lock navigation when selection is active
387+
useEffect(() => {
388+
if (!webViewReady) return;
389+
bridge.setNavigationLocked(!!selection);
390+
}, [webViewReady, selection]);
391+
386392
// Controls toggle
387393
const toggleControls = useCallback(() => {
388394
const willShow = !showControls;

0 commit comments

Comments
 (0)