fix(reader): use Tauri clipboard plugin for copy on Android (#4409)

navigator.clipboard.writeText is unreliable inside the Tauri Android
WebView, so tapping Copy in the Reader's selection popup silently
no-ops. Route the write through @tauri-apps/plugin-clipboard-manager
on Tauri targets (Android, iOS, macOS, Windows, Linux), with a
graceful navigator.clipboard / execCommand fallback for the web
build and older WebViews.

- Add tauri-plugin-clipboard-manager (Rust + JS)
- Register the plugin in lib.rs
- Grant clipboard-manager:allow-write-text / allow-read-text
- New utils/clipboard.ts wrapper with platform-aware fallback chain
- Annotator handleCopy and handleConfirmExport use the wrapper
This commit is contained in:
loveheaven
2026-06-02 22:02:52 +08:00
committed by GitHub
parent 5ff18b8f32
commit 726f53a64b
8 changed files with 345 additions and 7 deletions
@@ -45,6 +45,7 @@ import {
import { runSimpleCC } from '@/utils/simplecc';
import { getWordCount } from '@/utils/word';
import { getIndexFromCfi, isCfiInLocation } from '@/utils/cfi';
import { writeTextToClipboard } from '@/utils/clipboard';
import { TransformContext } from '@/services/transformers/types';
import { transformContent } from '@/services/transformService';
import {
@@ -729,9 +730,10 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => {
const handleCopy = (dismissPopup = true) => {
if (!selection || !selection.text) return;
const textToCopy = selection.text;
setTimeout(() => {
// Delay to ensure it won't be overridden by system clipboard actions
navigator.clipboard?.writeText(selection.text);
void writeTextToClipboard(textToCopy);
}, 100);
if (dismissPopup) {
handleDismissPopupAndSelection();
@@ -1208,7 +1210,7 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => {
setTimeout(() => {
// Delay to ensure it won't be overridden by system clipboard actions
navigator.clipboard?.writeText(content);
void writeTextToClipboard(content);
}, 100);
const ext = isPlainText ? 'txt' : 'md';