From 06a7a8ea82e336915bb69480601b94a717ecb4df Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 26 Mar 2025 14:11:47 +0800 Subject: [PATCH] feat: add option for transient import from file managers, closes #456 (#709) --- .../public/locales/ar/translation.json | 3 ++- .../public/locales/de/translation.json | 3 ++- .../public/locales/el/translation.json | 3 ++- .../public/locales/es/translation.json | 3 ++- .../public/locales/fr/translation.json | 3 ++- .../public/locales/hi/translation.json | 3 ++- .../public/locales/id/translation.json | 3 ++- .../public/locales/it/translation.json | 3 ++- .../public/locales/ja/translation.json | 3 ++- .../public/locales/ko/translation.json | 3 ++- .../public/locales/pl/translation.json | 3 ++- .../public/locales/pt/translation.json | 3 ++- .../public/locales/ru/translation.json | 3 ++- .../public/locales/tr/translation.json | 3 ++- .../public/locales/uk/translation.json | 3 ++- .../public/locales/vi/translation.json | 3 ++- .../public/locales/zh-CN/translation.json | 3 ++- .../public/locales/zh-TW/translation.json | 3 ++- .../app/library/components/SettingsMenu.tsx | 19 ++++++++++++++++++- apps/readest-app/src/app/library/page.tsx | 4 +++- apps/readest-app/src/hooks/useUICSS.ts | 2 +- apps/readest-app/src/services/appService.ts | 4 +++- apps/readest-app/src/services/constants.ts | 1 + apps/readest-app/src/types/settings.ts | 1 + apps/readest-app/src/types/system.ts | 1 + 25 files changed, 64 insertions(+), 22 deletions(-) diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 5782ed40..d588aaa0 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "التمييزات والتعليقات", "Note": "ملاحظة", "Copied to clipboard": "تم النسخ إلى الحافظة", - "Export Annotations": "تصدير التعليقات" + "Export Annotations": "تصدير التعليقات", + "Auto Import on File Open": "استيراد تلقائي عند فتح الملف" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index a06e90fc..ec57bb0b 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Hervorhebungen & Anmerkungen", "Note": "Notiz", "Copied to clipboard": "In die Zwischenablage kopiert", - "Export Annotations": "Anmerkungen exportieren" + "Export Annotations": "Anmerkungen exportieren", + "Auto Import on File Open": "Automatischer Import beim Öffnen einer Datei" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 0d910979..6bb39ac4 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Επισημάνσεις & Σχολιασμοί", "Note": "Σημείωση", "Copied to clipboard": "Αντιγράφηκε στο πρόχειρο", - "Export Annotations": "Εξαγωγή σχολιασμών" + "Export Annotations": "Εξαγωγή σχολιασμών", + "Auto Import on File Open": "Αυτόματη εισαγωγή κατά το άνοιγμα αρχείου" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 44915a1c..3f6976e8 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Resaltados y anotaciones", "Note": "Nota", "Copied to clipboard": "Copiado al portapapeles", - "Export Annotations": "Exportar anotaciones" + "Export Annotations": "Exportar anotaciones", + "Auto Import on File Open": "Importación automática al abrir archivo" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index c22b77d3..18df4f6c 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Surlignages et annotations", "Note": "Note", "Copied to clipboard": "Copié dans le presse-papiers", - "Export Annotations": "Exporter les annotations" + "Export Annotations": "Exporter les annotations", + "Auto Import on File Open": "Importation automatique à l'ouverture du fichier" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index e292f38b..2bac5341 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "हाइलाइट और टिप्पणियाँ", "Note": "टिप्पणी", "Copied to clipboard": "क्लिपबोर्ड पर कॉपी किया गया", - "Export Annotations": "टिप्पणियाँ निर्यात करें" + "Export Annotations": "टिप्पणियाँ निर्यात करें", + "Auto Import on File Open": "फ़ाइल खोलने पर स्वचालित आयात" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index dc810fff..6246add4 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Sorotan & Anotasi", "Note": "Catatan", "Copied to clipboard": "Disalin ke papan klip", - "Export Annotations": "Ekspor Anotasi" + "Export Annotations": "Ekspor Anotasi", + "Auto Import on File Open": "Impor Otomatis saat File Dibuka" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index ad9823a4..c3ebd277 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Evidenziazioni e annotazioni", "Note": "Nota", "Copied to clipboard": "Copiato negli appunti", - "Export Annotations": "Esporta annotazioni" + "Export Annotations": "Esporta annotazioni", + "Auto Import on File Open": "Importazione automatica all'apertura del file" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 381f60c2..1493be08 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "ハイライトと注釈", "Note": "メモ", "Copied to clipboard": "クリップボードにコピー", - "Export Annotations": "注釈をエクスポート" + "Export Annotations": "注釈をエクスポート", + "Auto Import on File Open": "ファイルを開くと自動インポート" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 965127e3..5e7f9b89 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "하이라이트 및 주석", "Note": "노트", "Copied to clipboard": "클립보드에 복사", - "Export Annotations": "주석 내보내기" + "Export Annotations": "주석 내보내기", + "Auto Import on File Open": "파일 열 때 자동 가져오기" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index a09e9f1f..41b099bb 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Zaznaczenia i adnotacje", "Note": "Notatka", "Copied to clipboard": "Skopiowano do schowka", - "Export Annotations": "Eksportuj adnotacje" + "Export Annotations": "Eksportuj adnotacje", + "Auto Import on File Open": "Automatyczne importowanie przy otwieraniu pliku" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 12c0bf8f..0b308e48 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Destaques e Anotações", "Note": "Nota", "Copied to clipboard": "Copiado para a área de transferência", - "Export Annotations": "Exportar Anotações" + "Export Annotations": "Exportar Anotações", + "Auto Import on File Open": "Importação Automática ao Abrir Arquivo" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 615d6827..9d3f6238 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Выделения и аннотации", "Note": "Заметка", "Copied to clipboard": "Скопировано в буфер обмена", - "Export Annotations": "Экспортировать аннотации" + "Export Annotations": "Экспортировать аннотации", + "Auto Import on File Open": "Автоматический импорт при открытии файла" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 79c490fc..d2a33741 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Vurgular ve Notlar", "Note": "Not", "Copied to clipboard": "Panoya kopyalandı", - "Export Annotations": "Notları Dışa Aktar" + "Export Annotations": "Notları Dışa Aktar", + "Auto Import on File Open": "Dosya Açıldığında Otomatik İçe Aktar" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 571ba7b6..56b6e4e5 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Виділення та анотації", "Note": "Примітка", "Copied to clipboard": "Скопійовано в буфер обміну", - "Export Annotations": "Експортувати анотації" + "Export Annotations": "Експортувати анотації", + "Auto Import on File Open": "Автоматичний імпорт при відкритті файлу" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 7bee7350..c31f628a 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "Điểm nổi bật & Chú thích", "Note": "Ghi chú", "Copied to clipboard": "Đã sao chép vào bảng ghi", - "Export Annotations": "Xuất chú thích" + "Export Annotations": "Xuất chú thích", + "Auto Import on File Open": "Tự động nhập khi mở tệp" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 3d91f1af..577eaea7 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "划线和笔记", "Note": "笔记", "Copied to clipboard": "已复制到剪贴板", - "Export Annotations": "导出笔记" + "Export Annotations": "导出笔记", + "Auto Import on File Open": "打开文件时自动导入" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 6c5e43d5..5a7a135c 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -258,5 +258,6 @@ "Highlights & Annotations": "高亮和筆記", "Note": "筆記", "Copied to clipboard": "已複製到剪貼板", - "Export Annotations": "匯出筆記" + "Export Annotations": "匯出筆記", + "Auto Import on File Open": "打開文件時自動導入" } diff --git a/apps/readest-app/src/app/library/components/SettingsMenu.tsx b/apps/readest-app/src/app/library/components/SettingsMenu.tsx index 4069ffb9..62ec83dd 100644 --- a/apps/readest-app/src/app/library/components/SettingsMenu.tsx +++ b/apps/readest-app/src/app/library/components/SettingsMenu.tsx @@ -6,7 +6,7 @@ import { PiUserCircleCheck } from 'react-icons/pi'; import { MdCheck } from 'react-icons/md'; import { setAboutDialogVisible } from '@/components/AboutWindow'; -import { hasUpdater, isWebAppPlatform } from '@/services/environment'; +import { hasUpdater, isTauriAppPlatform, isWebAppPlatform } from '@/services/environment'; import { DOWNLOAD_READEST_URL } from '@/services/constants'; import { useAuth } from '@/context/AuthContext'; import { useEnv } from '@/context/EnvContext'; @@ -33,6 +33,9 @@ const SettingsMenu: React.FC = ({ setIsDropdownOpen }) => { const [isAutoUpload, setIsAutoUpload] = useState(settings.autoUpload); const [isAutoCheckUpdates, setIsAutoCheckUpdates] = useState(settings.autoCheckUpdates); const [isScreenWakeLock, setIsScreenWakeLock] = useState(settings.screenWakeLock); + const [isAutoImportBooksOnOpen, setIsAutoImportBooksOnOpen] = useState( + settings.autoImportBooksOnOpen, + ); const showAboutReadest = () => { setAboutDialogVisible(true); @@ -74,6 +77,13 @@ const SettingsMenu: React.FC = ({ setIsDropdownOpen }) => { } }; + const toggleAutoImportBooksOnOpen = () => { + settings.autoImportBooksOnOpen = !settings.autoImportBooksOnOpen; + setSettings(settings); + saveSettings(envConfig, settings); + setIsAutoImportBooksOnOpen(settings.autoImportBooksOnOpen); + }; + const toggleAutoCheckUpdates = () => { settings.autoCheckUpdates = !settings.autoCheckUpdates; setSettings(settings); @@ -150,6 +160,13 @@ const SettingsMenu: React.FC = ({ setIsDropdownOpen }) => { icon={isAutoUpload ? : undefined} onClick={toggleAutoUploadBooks} /> + {isTauriAppPlatform() && !appService?.isMobile && ( + : undefined} + onClick={toggleAutoImportBooksOnOpen} + /> + )} {hasUpdater() && ( { + const settings = await appService.loadSettings(); const bookIds: string[] = []; for (const file of openWithFiles) { console.log('Open with book:', file); try { - const book = await appService.importBook(file, libraryBooks); + const temp = !settings.autoImportBooksOnOpen; + const book = await appService.importBook(file, libraryBooks, true, true, false, temp); if (book) { bookIds.push(book.hash); } diff --git a/apps/readest-app/src/hooks/useUICSS.ts b/apps/readest-app/src/hooks/useUICSS.ts index 1a481906..e0d9ffa3 100644 --- a/apps/readest-app/src/hooks/useUICSS.ts +++ b/apps/readest-app/src/hooks/useUICSS.ts @@ -12,7 +12,7 @@ export const useUICSS = (bookKey: string, viewSettings: ViewSettings) => { styleElement.remove(); } - const rawCSS = viewSettings.userStylesheet; + const rawCSS = viewSettings.userStylesheet || ''; const newStyleEl = document.createElement('style'); newStyleEl.textContent = rawCSS.replace('foliate-view', `#foliate-view-${bookKey}`); document.head.appendChild(newStyleEl); diff --git a/apps/readest-app/src/services/appService.ts b/apps/readest-app/src/services/appService.ts index 21ee82a3..32b1eef0 100644 --- a/apps/readest-app/src/services/appService.ts +++ b/apps/readest-app/src/services/appService.ts @@ -132,6 +132,7 @@ export abstract class BaseAppService implements AppService { saveBook: boolean = true, saveCover: boolean = true, overwrite: boolean = false, + transient: boolean = false, ): Promise { try { let loadedBook: BookDoc; @@ -163,7 +164,7 @@ export abstract class BaseAppService implements AppService { const hash = await partialMD5(fileobj); const existingBook = books.filter((b) => b.hash === hash)[0]; if (existingBook) { - if (existingBook.deletedAt) { + if (!transient) { existingBook.deletedAt = null; } existingBook.updatedAt = Date.now(); @@ -176,6 +177,7 @@ export abstract class BaseAppService implements AppService { author: formatAuthors(loadedBook.metadata.author, loadedBook.metadata.language), createdAt: existingBook ? existingBook.createdAt : Date.now(), uploadedAt: existingBook ? existingBook.uploadedAt : null, + deletedAt: transient ? Date.now() : null, downloadedAt: Date.now(), updatedAt: Date.now(), }; diff --git a/apps/readest-app/src/services/constants.ts b/apps/readest-app/src/services/constants.ts index 29ec38b4..e0a82f2e 100644 --- a/apps/readest-app/src/services/constants.ts +++ b/apps/readest-app/src/services/constants.ts @@ -35,6 +35,7 @@ export const DEFAULT_SYSTEM_SETTINGS: Partial = { autoUpload: true, autoCheckUpdates: true, screenWakeLock: true, + autoImportBooksOnOpen: false, lastSyncedAtBooks: 0, lastSyncedAtConfigs: 0, diff --git a/apps/readest-app/src/types/settings.ts b/apps/readest-app/src/types/settings.ts index ef26700e..5b19d4d3 100644 --- a/apps/readest-app/src/types/settings.ts +++ b/apps/readest-app/src/types/settings.ts @@ -24,6 +24,7 @@ export interface SystemSettings { autoUpload: boolean; autoCheckUpdates: boolean; screenWakeLock: boolean; + autoImportBooksOnOpen: boolean; lastSyncedAtBooks: number; lastSyncedAtConfigs: number; diff --git a/apps/readest-app/src/types/system.ts b/apps/readest-app/src/types/system.ts index ce1e06f5..cf9f56ea 100644 --- a/apps/readest-app/src/types/system.ts +++ b/apps/readest-app/src/types/system.ts @@ -48,6 +48,7 @@ export interface AppService { saveBook?: boolean, saveCover?: boolean, overwrite?: boolean, + transient?: boolean, ): Promise; deleteBook(book: Book, includingUploaded?: boolean): Promise; uploadBook(book: Book, onProgress?: ProgressHandler): Promise;