diff --git a/apps/readest-app/src-tauri/src/lib.rs b/apps/readest-app/src-tauri/src/lib.rs index 9f4d1aac..3e143e58 100644 --- a/apps/readest-app/src-tauri/src/lib.rs +++ b/apps/readest-app/src-tauri/src/lib.rs @@ -11,21 +11,20 @@ mod menu; #[cfg(target_os = "macos")] mod traffic_light_plugin; -mod transfer_file; -use transfer_file::{download_file, upload_file}; - #[cfg(target_os = "macos")] use tauri::TitleBarStyle; -use std::path::PathBuf; -use tauri::{command, Window}; -use tauri::{AppHandle, Emitter, Manager, Url}; -use tauri::{WebviewUrl, WebviewWindowBuilder}; -use tauri_plugin_fs::FsExt; -use tauri_plugin_oauth::start; - #[cfg(desktop)] -use tauri::Listener; +use std::path::PathBuf; +#[cfg(desktop)] +use tauri::{AppHandle, Listener, Manager, Url}; +#[cfg(desktop)] +use tauri_plugin_fs::FsExt; + +mod transfer_file; +use tauri::{command, Emitter, WebviewUrl, WebviewWindowBuilder, Window}; +use tauri_plugin_oauth::start; +use transfer_file::{download_file, upload_file}; #[cfg(desktop)] fn allow_file_in_scopes(app: &AppHandle, files: Vec) { @@ -84,6 +83,7 @@ async fn list_fonts() -> Result, String> { } #[derive(Clone, serde::Serialize)] +#[allow(dead_code)] struct Payload { args: Vec, cwd: String, diff --git a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx index 64b50aef..ff94e4f2 100644 --- a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx @@ -49,6 +49,7 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { const isShowingPopup = useRef(false); const isTextSelected = useRef(false); const isUpToShowPopup = useRef(false); + const isTouchstarted = useRef(false); const [selection, setSelection] = useState(); const [showAnnotPopup, setShowAnnotPopup] = useState(false); const [showWiktionaryPopup, setShowWiktionaryPopup] = useState(false); @@ -94,14 +95,6 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { } setSelection({ key: bookKey, text: sel.toString(), range, index }); }; - const handlePointerup = () => { - // Available on iOS and Desktop, fired when release the long press - // Note that on Android, pointerup event is fired for any tap but not for long press - const sel = doc.getSelection(); - if (isValidSelection(sel)) { - makeSelection(sel, true); - } - }; const handleSelectionchange = () => { // Available on iOS, Android and Desktop, fired when the selection is changed // Ideally the popup only shows when the selection is done, @@ -109,7 +102,7 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { // we make the popup show when the selection is changed const sel = doc.getSelection(); if (isValidSelection(sel)) { - if (osPlatform === 'android') { + if (osPlatform === 'android' && isTouchstarted.current) { makeSelection(sel, false); } } else if (!isUpToShowPopup.current) { @@ -120,14 +113,32 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { setShowDeepLPopup(false); } }; + const handlePointerup = () => { + // Available on iOS and Desktop, fired when release the long press + // Note that on Android, pointerup event is fired after an additional touch event + const sel = doc.getSelection(); + if (isValidSelection(sel)) { + makeSelection(sel, true); + } + }; + const handleTouchstart = () => { + // Available on iOS and Android for the initial touch event + isTouchstarted.current = true; + }; const handleTouchmove = () => { - // Available on iOS + // Available on iOS, on Android not fired // To make the popup not to follow the selection setShowAnnotPopup(false); }; + const handleTouchend = () => { + // Available on iOS, on Android fired after an additional touch event + isTouchstarted.current = false; + }; if (bookData.book?.format !== 'PDF') { detail.doc?.addEventListener('pointerup', handlePointerup); + detail.doc?.addEventListener('touchstart', handleTouchstart); detail.doc?.addEventListener('touchmove', handleTouchmove); + detail.doc?.addEventListener('touchend', handleTouchend); detail.doc?.addEventListener('selectionchange', handleSelectionchange); // Disable the default context menu on mobile devices,