diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index 38fc6762..4baab54d 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -29,6 +29,8 @@ "release-macos-universial-appstore": "dotenv -e .env.tauri.local -e .env.apple-appstore.local -- bash scripts/release-mac-appstore.sh" }, "dependencies": { + "@aws-sdk/client-s3": "^3.735.0", + "@aws-sdk/s3-request-presigner": "^3.735.0", "@ducanh2912/next-pwa": "^10.2.9", "@fabianlars/tauri-plugin-oauth": "2", "@supabase/auth-ui-react": "^0.4.7", @@ -55,6 +57,7 @@ "i18next-browser-languagedetector": "^8.0.2", "i18next-http-backend": "^3.0.1", "js-md5": "^0.8.3", + "jwt-decode": "^4.0.0", "next": "15.1.0", "posthog-js": "^1.205.0", "react": "19.0.0", diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index edfc85ed..d4e991ee 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -93,11 +93,11 @@ "Save": "Speichern", "Scrolled Mode": "Scroll-Modus", "Search": "Suchen", - "Search books...": "Bücher suchen...", + "Search Books...": "Bücher suchen...", "Search...": "Suchen...", "Select Book": "Buch auswählen", - "Select books": "Bücher auswählen", - "Select multiple books": "Mehrere Bücher auswählen", + "Select Books": "Bücher auswählen", + "Select Multiple Books": "Mehrere Bücher auswählen", "Sepia": "Sepia", "Serif Font": "Serifenschrift", "Show Book Details": "Buchdetails anzeigen", @@ -138,5 +138,11 @@ "Already the latest version": "Bereits die neueste Version", "Book Details": "Buchdetails", "From Local File": "Aus lokaler Datei", - "TOC": "Inhaltsverzeichnis" + "TOC": "Inhaltsverzeichnis", + "Book uploaded: {{title}}": "Buch hochgeladen: {{title}}", + "Failed to upload book: {{title}}": "Fehler beim Hochladen des Buches: {{title}}", + "Book downloaded: {{title}}": "Buch heruntergeladen: {{title}}", + "Failed to download book: {{title}}": "Fehler beim Herunterladen des Buches: {{title}}", + "Upload Book": "Buch hochladen", + "Auto Upload Books to Cloud": "Bücher automatisch in die Cloud hochladen" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 827f8e8a..3a65c3af 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -93,11 +93,11 @@ "Save": "Αποθήκευση", "Scrolled Mode": "Λειτουργία κύλισης", "Search": "Αναζήτηση", - "Search books...": "Αναζήτηση βιβλίων...", + "Search Books...": "Αναζήτηση βιβλίων...", "Search...": "Αναζήτηση...", "Select Book": "Επιλογή βιβλίου", - "Select books": "Επιλογή βιβλίων", - "Select multiple books": "Επιλογή πολλαπλών βιβλίων", + "Select Books": "Επιλογή βιβλίων", + "Select Multiple Books": "Επιλογή πολλαπλών βιβλίων", "Sepia": "Σέπια", "Serif Font": "Γραμματοσειρά Serif", "Show Book Details": "Εμφάνιση λεπτομερειών βιβλίου", @@ -138,5 +138,11 @@ "Already the latest version": "Ήδη η τελευταία έκδοση", "Book Details": "Λεπτομέρειες βιβλίου", "From Local File": "Από τοπικό αρχείο", - "TOC": "Πίνακας περιεχομένων" + "TOC": "Πίνακας περιεχομένων", + "Book uploaded: {{title}}": "Το βιβλίο με τίτλο {{title}} ανέβηκε", + "Failed to upload book: {{title}}": "Αποτυχία ανέβασμα βιβλίου: {{title}}", + "Book downloaded: {{title}}": "Το βιβλίο με τίτλο {{title}} κατέβηκε", + "Failed to download book: {{title}}": "Αποτυχία λήψης βιβλίου: {{title}}", + "Upload Book": "Ανέβασμα βιβλίου", + "Auto Upload Books to Cloud": "Αυτόματο ανέβασμα βιβλίων στο cloud" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index b2a11482..2fd132ed 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -93,11 +93,11 @@ "Save": "Guardar", "Scrolled Mode": "Modo desplazamiento", "Search": "Buscar", - "Search books...": "Buscar libros...", + "Search Books...": "Buscar libros...", "Search...": "Buscar...", "Select Book": "Seleccionar libro", - "Select books": "Seleccionar libros", - "Select multiple books": "Seleccionar varios libros", + "Select Books": "Seleccionar libros", + "Select Multiple Books": "Seleccionar varios libros", "Sepia": "Sepia", "Serif Font": "Fuente serif", "Show Book Details": "Mostrar detalles del libro", @@ -138,5 +138,11 @@ "Already the latest version": "Ya es la última versión", "Book Details": "Detalles del libro", "From Local File": "Desde archivo local", - "TOC": "Índice" + "TOC": "Índice", + "Book uploaded: {{title}}": "Libro subido: {{title}}", + "Failed to upload book: {{title}}": "Error al subir libro: {{title}}", + "Book downloaded: {{title}}": "Libro descargado: {{title}}", + "Failed to download book: {{title}}": "Error al descargar libro: {{title}}", + "Upload Book": "Subir libro", + "Auto Upload Books to Cloud": "Subir libros automáticamente a la nube" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 1c3b2389..68a9fe6c 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -93,11 +93,11 @@ "Save": "Enregistrer", "Scrolled Mode": "Mode défilement", "Search": "Rechercher", - "Search books...": "Rechercher des livres...", + "Search Books...": "Rechercher des livres...", "Search...": "Rechercher...", "Select Book": "Sélectionner un livre", - "Select books": "Sélectionner des livres", - "Select multiple books": "Sélectionner plusieurs livres", + "Select Books": "Sélectionner des livres", + "Select Multiple Books": "Sélectionner plusieurs livres", "Sepia": "Sépia", "Serif Font": "Police avec empattement", "Show Book Details": "Afficher les détails du livre", @@ -138,5 +138,11 @@ "Already the latest version": "Déjà la dernière version", "Book Details": "Détails du livre", "From Local File": "Depuis un fichier local", - "TOC": "Table des matières" + "TOC": "Table des matières", + "Book uploaded: {{title}}": "Livre téléchargé : {{title}}", + "Failed to upload book: {{title}}": "Échec du téléchargement du livre : {{title}}", + "Book downloaded: {{title}}": "Livre téléchargé : {{title}}", + "Failed to download book: {{title}}": "Échec du téléchargement du livre : {{title}}", + "Upload Book": "Télécharger un livre", + "Auto Upload Books to Cloud": "Télécharger automatiquement les livres dans le cloud" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 2e20d352..5f5a4918 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -93,11 +93,11 @@ "Save": "सहेजें", "Scrolled Mode": "स्क्रॉल मोड", "Search": "खोजें", - "Search books...": "पुस्तकें खोजें...", + "Search Books...": "पुस्तकें खोजें...", "Search...": "खोजें...", "Select Book": "पुस्तक चुनें", - "Select books": "पुस्तकें चुनें", - "Select multiple books": "कई पुस्तकें चुनें", + "Select Books": "पुस्तकें चुनें", + "Select Multiple Books": "कई पुस्तकें चुनें", "Sepia": "सेपिया", "Serif Font": "सेरिफ फ़ॉन्ट", "Show Book Details": "पुस्तक विवरण दिखाएं", @@ -138,5 +138,11 @@ "Already the latest version": "पहले से ही नवीनतम संस्करण", "Book Details": "पुस्तक विवरण", "From Local File": "स्थानीय फ़ाइल से", - "TOC": "सामग्री" + "TOC": "सामग्री", + "Book uploaded: {{title}}": "पुस्तक अपलोड की गई: {{title}}", + "Failed to upload book: {{title}}": "पुस्तक अपलोड करने में विफल: {{title}}", + "Book downloaded: {{title}}": "पुस्तक डाउनलोड की गई: {{title}}", + "Failed to download book: {{title}}": "पुस्तक डाउनलोड करने में विफल: {{title}}", + "Upload Book": "पुस्तक अपलोड करें", + "Auto Upload Books to Cloud": "पुस्तकें बादल में स्वचालित रूप से अपलोड करें" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 3a8ea047..81db118a 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -93,11 +93,11 @@ "Save": "Simpan", "Scrolled Mode": "Mode Gulir", "Search": "Cari", - "Search books...": "Cari buku...", + "Search Books...": "Cari buku...", "Search...": "Cari...", "Select Book": "Pilih Buku", - "Select books": "Pilih buku", - "Select multiple books": "Pilih beberapa buku", + "Select Books": "Pilih buku", + "Select Multiple Books": "Pilih beberapa buku", "Sepia": "Sepia", "Serif Font": "Font Serif", "Show Book Details": "Tampilkan Detail Buku", @@ -138,5 +138,11 @@ "Already the latest version": "Sudah versi terbaru", "Book Details": "Detail Buku", "From Local File": "Dari file lokal", - "TOC": "Daftar Isi" + "TOC": "Daftar Isi", + "Book uploaded: {{title}}": "Buku diunggah: {{title}}", + "Failed to upload book: {{title}}": "Gagal mengunggah buku: {{title}}", + "Book downloaded: {{title}}": "Buku diunduh: {{title}}", + "Failed to download book: {{title}}": "Gagal mengunduh buku: {{title}}", + "Upload Book": "Unggah Buku", + "Auto Upload Books to Cloud": "Unggah Buku Otomatis ke Cloud" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 2f4b399b..8d24e765 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -93,11 +93,11 @@ "Save": "Salva", "Scrolled Mode": "Modalità scorrimento", "Search": "Cerca", - "Search books...": "Cerca libri...", + "Search Books...": "Cerca libri...", "Search...": "Cerca...", "Select Book": "Seleziona libro", - "Select books": "Seleziona libri", - "Select multiple books": "Seleziona più libri", + "Select Books": "Seleziona libri", + "Select Multiple Books": "Seleziona più libri", "Sepia": "Seppia", "Serif Font": "Font serif", "Show Book Details": "Mostra dettagli libro", @@ -138,5 +138,11 @@ "Already the latest version": "Già l'ultima versione", "Book Details": "Dettagli libro", "From Local File": "Da file locale", - "TOC": "Sommario" + "TOC": "Sommario", + "Book uploaded: {{title}}": "Libro caricato: {{title}}", + "Failed to upload book: {{title}}": "Caricamento libro non riuscito: {{title}}", + "Book downloaded: {{title}}": "Libro scaricato: {{title}}", + "Failed to download book: {{title}}": "Download libro non riuscito: {{title}}", + "Upload Book": "Carica libro", + "Auto Upload Books to Cloud": "Carica libri automaticamente su cloud" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 424d0c0b..80be321c 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -93,11 +93,11 @@ "Save": "保存", "Scrolled Mode": "スクロールモード", "Search": "検索", - "Search books...": "書籍を検索...", + "Search Books...": "書籍を検索...", "Search...": "検索...", "Select Book": "書籍を選択", - "Select books": "書籍を選択", - "Select multiple books": "複数の書籍を選択", + "Select Books": "書籍を選択", + "Select Multiple Books": "複数の書籍を選択", "Sepia": "セピア", "Serif Font": "明朝体", "Show Book Details": "書籍の詳細を表示", @@ -138,5 +138,11 @@ "Already the latest version": "すでに最新バージョン", "Book Details": "書籍の詳細", "From Local File": "ローカルファイルから", - "TOC": "目次" + "TOC": "目次", + "Book uploaded: {{title}}": "書籍がアップロードされました:{{title}}", + "Failed to upload book: {{title}}": "書籍のアップロードに失敗しました:{{title}}", + "Book downloaded: {{title}}": "書籍がダウンロードされました:{{title}}", + "Failed to download book: {{title}}": "書籍のダウンロードに失敗しました:{{title}}", + "Upload Book": "書籍をアップロード", + "Auto Upload Books to Cloud": "書籍を自動的にクラウドにアップロード" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index b33eeb22..72f93d0d 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -93,11 +93,11 @@ "Save": "저장", "Scrolled Mode": "스크롤 모드", "Search": "검색", - "Search books...": "책 검색...", + "Search Books...": "책 검색...", "Search...": "검색...", "Select Book": "책 선택", - "Select books": "책 선택", - "Select multiple books": "여러 책 선택", + "Select Books": "책 선택", + "Select Multiple Books": "여러 책 선택", "Sepia": "세피아", "Serif Font": "세리프체", "Show Book Details": "책 세부 정보 표시", @@ -138,5 +138,11 @@ "Already the latest version": "이미 최신 버전", "Book Details": "책 세부 정보", "From Local File": "로컬 파일에서", - "TOC": "목차" + "TOC": "목차", + "Book uploaded: {{title}}": "책 업로드됨: {{title}}", + "Failed to upload book: {{title}}": "책 업로드 실패: {{title}}", + "Book downloaded: {{title}}": "책 다운로드됨: {{title}}", + "Failed to download book: {{title}}": "책 다운로드 실패: {{title}}", + "Upload Book": "책 업로드", + "Auto Upload Books to Cloud": "책 자동으로 클라우드에 업로드" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 0c501e4f..79ddfe63 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -93,11 +93,11 @@ "Save": "Zapisz", "Scrolled Mode": "Tryb przewijania", "Search": "Szukaj", - "Search books...": "Szukaj książek...", + "Search Books...": "Szukaj książek...", "Search...": "Szukaj...", "Select Book": "Wybierz książkę", - "Select books": "Wybierz książki", - "Select multiple books": "Wybierz wiele książek", + "Select Books": "Wybierz książki", + "Select Multiple Books": "Wybierz wiele książek", "Sepia": "Sepia", "Serif Font": "Czcionka szeryfowa", "Show Book Details": "Pokaż szczegóły książki", @@ -138,5 +138,11 @@ "Already the latest version": "Już najnowsza wersja", "Book Details": "Szczegóły książki", "From Local File": "Z pliku lokalnego", - "TOC": "Spis treści" + "TOC": "Spis treści", + "Book uploaded: {{title}}": "Książka przesłana: {{title}}", + "Failed to upload book: {{title}}": "Nie udało się przesłać książki: {{title}}", + "Book downloaded: {{title}}": "Książka pobrana: {{title}}", + "Failed to download book: {{title}}": "Nie udało się pobrać książki: {{title}}", + "Upload Book": "Prześlij książkę", + "Auto Upload Books to Cloud": "Automatycznie przesyłaj książki do chmury" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 683733d1..cb91efb8 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -93,11 +93,11 @@ "Save": "Salvar", "Scrolled Mode": "Modo de Rolagem", "Search": "Buscar", - "Search books...": "Procurar livros...", + "Search Books...": "Procurar livros...", "Search...": "Pesquisar...", "Select Book": "Selecionar Livro", - "Select books": "Selecionar livros", - "Select multiple books": "Selecionar múltiplos livros", + "Select Books": "Selecionar livros", + "Select Multiple Books": "Selecionar múltiplos livros", "Sepia": "Sépia", "Serif Font": "Fonte Serif", "Show Book Details": "Mostrar Detalhes do Livro", @@ -138,5 +138,11 @@ "Already the latest version": "Já é a versão mais recente", "Book Details": "Detalhes do Livro", "From Local File": "Do arquivo local", - "TOC": "Índice" + "TOC": "Índice", + "Book uploaded: {{title}}": "Livro enviado: {{title}}", + "Failed to upload book: {{title}}": "Falha ao enviar livro: {{title}}", + "Book downloaded: {{title}}": "Livro baixado: {{title}}", + "Failed to download book: {{title}}": "Falha ao baixar livro: {{title}}", + "Upload Book": "Enviar Livro", + "Auto Upload Books to Cloud": "Enviar Livros para a Nuvem Automaticamente" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 985f10e2..7bf89e78 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -93,11 +93,11 @@ "Save": "Сохранить", "Scrolled Mode": "Режим прокрутки", "Search": "Поиск", - "Search books...": "Поиск книг...", + "Search Books...": "Поиск книг...", "Search...": "Поиск...", "Select Book": "Выбрать книгу", - "Select books": "Выбрать книги", - "Select multiple books": "Выбрать несколько книг", + "Select Books": "Выбрать книги", + "Select Multiple Books": "Выбрать несколько книг", "Sepia": "Сепия", "Serif Font": "Шрифт с засечками", "Show Book Details": "Показать детали книги", @@ -138,5 +138,11 @@ "Already the latest version": "Уже последняя версия", "Book Details": "Детали книги", "From Local File": "Из локального файла", - "TOC": "Содержание" + "TOC": "Содержание", + "Book uploaded: {{title}}": "Книга загружена: {{title}}", + "Failed to upload book: {{title}}": "Не удалось загрузить книгу: {{title}}", + "Book downloaded: {{title}}": "Книга скачана: {{title}}", + "Failed to download book: {{title}}": "Не удалось скачать книгу: {{title}}", + "Upload Book": "Загрузить книгу", + "Auto Upload Books to Cloud": "Автоматическая загрузка книг в облако" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 76050d16..55460828 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -93,11 +93,11 @@ "Save": "Kaydet", "Scrolled Mode": "Kaydırma Modu", "Search": "Ara", - "Search books...": "Kitap ara...", + "Search Books...": "Kitap ara...", "Search...": "Ara...", "Select Book": "Kitap Seç", - "Select books": "Kitapları seç", - "Select multiple books": "Birden fazla kitap seç", + "Select Books": "Kitapları seç", + "Select Multiple Books": "Birden fazla kitap seç", "Sepia": "Sepya", "Serif Font": "Serif Yazı Tipi", "Show Book Details": "Kitap Detaylarını Göster", @@ -138,5 +138,11 @@ "Already the latest version": "Zaten en son sürüm", "Book Details": "Kitap Detayları", "From Local File": "Yerel dosyadan", - "TOC": "İçindekiler" + "TOC": "İçindekiler", + "Book uploaded: {{title}}": "Kitap yüklendi: {{title}}", + "Failed to upload book: {{title}}": "Kitap yüklenemedi: {{title}}", + "Book downloaded: {{title}}": "Kitap indirildi: {{title}}", + "Failed to download book: {{title}}": "Kitap indirilemedi: {{title}}", + "Upload Book": "Kitap Yükle", + "Auto Upload Books to Cloud": "Kitapları Otomatik Olarak Buluta Yükle" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 90de76cb..1aa530a3 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -93,11 +93,11 @@ "Save": "Зберегти", "Scrolled Mode": "Режим прокрутки", "Search": "Пошук", - "Search books...": "Шукати книги...", + "Search Books...": "Шукати книги...", "Search...": "Пошук...", "Select Book": "Вибрати книгу", - "Select books": "Вибрати книги", - "Select multiple books": "Вибрати кілька книг", + "Select Books": "Вибрати книги", + "Select Multiple Books": "Вибрати кілька книг", "Sepia": "Сепія", "Serif Font": "Шрифт із засічками", "Show Book Details": "Показати деталі книги", @@ -138,5 +138,11 @@ "Already the latest version": "Вже остання версія", "Book Details": "Деталі книги", "From Local File": "З локального файлу", - "TOC": "Зміст" + "TOC": "Зміст", + "Book uploaded: {{title}}": "Книгу завантажено: {{title}}", + "Failed to upload book: {{title}}": "Не вдалося завантажити книгу: {{title}}", + "Book downloaded: {{title}}": "Книгу завантажено: {{title}}", + "Failed to download book: {{title}}": "Не вдалося завантажити книгу: {{title}}", + "Upload Book": "Завантажити книгу", + "Auto Upload Books to Cloud": "Автоматично завантажувати книги в хмару" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index a45c9ed6..991cc924 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -93,11 +93,11 @@ "Save": "Lưu", "Scrolled Mode": "Chế độ cuộn", "Search": "Tìm kiếm", - "Search books...": "Tìm kiếm sách...", + "Search Books...": "Tìm kiếm sách...", "Search...": "Tìm kiếm...", "Select Book": "Chọn sách", - "Select books": "Chọn sách", - "Select multiple books": "Chọn nhiều sách", + "Select Books": "Chọn sách", + "Select Multiple Books": "Chọn nhiều sách", "Sepia": "Nâu cổ", "Serif Font": "Phông chữ có chân", "Show Book Details": "Hiển thị chi tiết sách", @@ -138,5 +138,11 @@ "Already the latest version": "Đã là phiên bản mới nhất", "Book Details": "Chi tiết sách", "From Local File": "Từ tệp địa phương", - "TOC": "Mục lục" + "TOC": "Mục lục", + "Book uploaded: {{title}}": "Sách đã tải lên: {{title}}", + "Failed to upload book: {{title}}": "Không thể tải lên sách: {{title}}", + "Book downloaded: {{title}}": "Sách đã tải về: {{title}}", + "Failed to download book: {{title}}": "Không thể tải về sách: {{title}}", + "Upload Book": "Tải lên sách", + "Auto Upload Books to Cloud": "Tự động tải sách lên đám mây" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index cd30eae8..b5cec4cb 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -93,11 +93,11 @@ "Save": "保存", "Scrolled Mode": "滚动模式", "Search": "搜索", - "Search books...": "搜索书籍...", + "Search Books...": "搜索书籍...", "Search...": "搜索...", "Select Book": "选择书籍", - "Select books": "选择书籍", - "Select multiple books": "选择多本书籍", + "Select Books": "选择书籍", + "Select Multiple Books": "选择多本书籍", "Sepia": "旧韵", "Serif Font": "衬线字体", "Show Book Details": "显示书籍详情", @@ -138,5 +138,11 @@ "Already the latest version": "已经是最新版本", "Book Details": "书籍详情", "From Local File": "从本地文件导入", - "TOC": "目录" + "TOC": "目录", + "Book uploaded: {{title}}": "书籍已上传:{{title}}", + "Failed to upload book: {{title}}": "上传书籍失败:{{title}}", + "Book downloaded: {{title}}": "书籍已下载:{{title}}", + "Failed to download book: {{title}}": "下载书籍失败:{{title}}", + "Upload Book": "上传书籍", + "Auto Upload Books to Cloud": "自动上传书籍到云端" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 1bd12ad2..7d52c350 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -93,11 +93,11 @@ "Save": "保存", "Scrolled Mode": "滾動模式", "Search": "搜索", - "Search books...": "搜索書籍...", + "Search Books...": "搜索書籍...", "Search...": "搜索...", "Select Book": "選擇書籍", - "Select books": "選擇書籍", - "Select multiple books": "選擇多本書籍", + "Select Books": "選擇書籍", + "Select Multiple Books": "選擇多本書籍", "Sepia": "舊韻", "Serif Font": "襯線字體", "Show Book Details": "顯示書籍詳情", @@ -138,5 +138,11 @@ "Already the latest version": "已經是最新版本", "Book Details": "書籍詳情", "From Local File": "從本地文件導入", - "TOC": "目錄" + "TOC": "目錄", + "Book uploaded: {{title}}": "書籍已上傳:{{title}}", + "Failed to upload book: {{title}}": "書籍上傳失敗:{{title}}", + "Book downloaded: {{title}}": "書籍已下載:{{title}}", + "Failed to download book: {{title}}": "書籍下載失敗:{{title}}", + "Upload Book": "上傳書籍", + "Auto Upload Books to Cloud": "自動上傳書籍到雲端" } diff --git a/apps/readest-app/src/app/library/components/BookItem.tsx b/apps/readest-app/src/app/library/components/BookItem.tsx new file mode 100644 index 00000000..09e2fcfe --- /dev/null +++ b/apps/readest-app/src/app/library/components/BookItem.tsx @@ -0,0 +1,122 @@ +import clsx from 'clsx'; +import Image from 'next/image'; +import { MdCheckCircle, MdCheckCircleOutline } from 'react-icons/md'; +import { CiCircleMore } from 'react-icons/ci'; +import { LiaCloudUploadAltSolid, LiaCloudDownloadAltSolid } from 'react-icons/lia'; +import { useResponsiveSize } from '@/hooks/useResponsiveSize'; +import { isWebAppPlatform } from '@/services/environment'; +import ReadingProgress from './ReadingProgress'; +import { Book } from '@/types/book'; + +interface BookItemProps { + book: Book; + isSelectMode: boolean; + selectedBooks: string[]; + clickedBookHash: string | null; + handleBookClick: (book: Book) => void; + handleBookUpload: (book: Book) => void; + handleBookDownload: (book: Book) => void; + showBookDetailsModal: (book: Book) => void; + bookContextMenuHandler: (book: Book, e: React.MouseEvent) => void; +} + +const BookItem: React.FC = ({ + book, + isSelectMode, + selectedBooks, + clickedBookHash, + handleBookClick, + handleBookUpload, + handleBookDownload, + showBookDetailsModal, + bookContextMenuHandler, +}) => { + const iconSize15 = useResponsiveSize(15); + + return ( +
+
handleBookClick(book)}> +
+ {book.title} { + (e.target as HTMLImageElement).style.display = 'none'; + (e.target as HTMLImageElement).nextElementSibling?.classList.remove('invisible'); + }} + /> +
+ {book.title} +
+ {(selectedBooks.includes(book.hash) || clickedBookHash === book.hash) && ( +
+ )} + {isSelectMode && ( +
+ {selectedBooks.includes(book.hash) ? ( + + ) : ( + + )} +
+ )} +
+
+
+
+

+ {book.title} +

+
+
+ {book.progress && } + {isWebAppPlatform() && ( +
+ + +
+ )} +
+
+
+ ); +}; + +export default BookItem; diff --git a/apps/readest-app/src/app/library/components/Bookshelf.tsx b/apps/readest-app/src/app/library/components/Bookshelf.tsx index ebfa41d8..41de25eb 100644 --- a/apps/readest-app/src/app/library/components/Bookshelf.tsx +++ b/apps/readest-app/src/app/library/components/Bookshelf.tsx @@ -1,14 +1,9 @@ import clsx from 'clsx'; import * as React from 'react'; -import { useEffect, useRef, useState } from 'react'; -import { PiPlus } from 'react-icons/pi'; -import { MdDelete, MdOpenInNew } from 'react-icons/md'; -import { MdCheckCircle, MdCheckCircleOutline } from 'react-icons/md'; -import { CiCircleMore } from 'react-icons/ci'; - import { useRouter, useSearchParams } from 'next/navigation'; -import Image from 'next/image'; - +import { useEffect, useRef, useState } from 'react'; +import { MdDelete, MdOpenInNew } from 'react-icons/md'; +import { PiPlus } from 'react-icons/pi'; import { Menu, MenuItem } from '@tauri-apps/api/menu'; import { revealItemInDir } from '@tauri-apps/plugin-opener'; import { Book, BooksGroup } from '@/types/book'; @@ -16,17 +11,17 @@ import { useEnv } from '@/context/EnvContext'; import { useLibraryStore } from '@/store/libraryStore'; import { useSettingsStore } from '@/store/settingsStore'; import { useTranslation } from '@/hooks/useTranslation'; -import { useResponsiveSize } from '@/hooks/useResponsiveSize'; import { navigateToReader } from '@/utils/nav'; import { getOSPlatform } from '@/utils/misc'; import { getFilename } from '@/utils/book'; import { FILE_REVEAL_LABELS, FILE_REVEAL_PLATFORMS } from '@/utils/os'; -import { isTauriAppPlatform, isWebAppPlatform } from '@/services/environment'; +import { isTauriAppPlatform } from '@/services/environment'; import Alert from '@/components/Alert'; import Spinner from '@/components/Spinner'; import BookDetailModal from '@/components/BookDetailModal'; -import ReadingProgress from './ReadingProgress'; +import BookItem from './BookItem'; +import GroupItem from './GroupItem'; type BookshelfItem = Book | BooksGroup; @@ -57,16 +52,24 @@ const generateBookshelfItems = (books: Book[]): BookshelfItem[] => { interface BookshelfProps { libraryBooks: Book[]; isSelectMode: boolean; - onImportBooks: () => void; + handleImportBooks: () => void; + handleBookUpload: (book: Book) => void; + handleBookDownload: (book: Book) => void; } -const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImportBooks }) => { +const Bookshelf: React.FC = ({ + libraryBooks, + isSelectMode, + handleImportBooks, + handleBookUpload, + handleBookDownload, +}) => { const _ = useTranslation(); const router = useRouter(); const searchParams = useSearchParams(); const { envConfig, appService } = useEnv(); const { settings } = useSettingsStore(); - const { deleteBook } = useLibraryStore(); + const { updateBook } = useLibraryStore(); const [loading, setLoading] = useState(false); const [selectedBooks, setSelectedBooks] = useState([]); const [showDeleteAlert, setShowDeleteAlert] = useState(false); @@ -74,7 +77,6 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp const [importBookUrl] = useState(searchParams?.get('url') || ''); const isImportingBook = useRef(false); const [showDetailsBook, setShowDetailsBook] = useState(null); - const iconSize15 = useResponsiveSize(15); const showBookDetailsModal = (book: Book) => { setShowDetailsBook(book); @@ -111,14 +113,23 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp const bookshelfItems = generateBookshelfItems(libraryBooks); - const handleBookClick = (id: string) => { + const handleBookClick = async (book: Book) => { + if (book.uploadedAt && !book.downloadedAt) { + setLoading(true); + try { + await appService?.downloadBook(book); + updateBook(envConfig, book); + } finally { + setLoading(false); + } + } if (isSelectMode) { - toggleSelection(id); + toggleSelection(book.hash); } else { - setClickedImage(id); + setClickedImage(book.hash); setTimeout(() => setClickedImage(null), 300); setTimeout(() => setLoading(true), 200); - navigateToReader(router, [id]); + navigateToReader(router, [book.hash]); } }; @@ -137,7 +148,7 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp for (const selectedBook of selectedBooks) { const book = libraryBooks.find((b) => b.hash === selectedBook); if (book) { - deleteBook(envConfig, book); + updateBook(envConfig, book, true); } } setSelectedBooks([]); @@ -158,7 +169,7 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp const openBookMenuItem = await MenuItem.new({ text: isSelectMode ? _('Select Book') : _('Open Book'), action: async () => { - handleBookClick(book.hash); + handleBookClick(book); }, }); const showBookInFinderMenuItem = await MenuItem.new({ @@ -174,16 +185,23 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp showBookDetailsModal(book); }, }); + const uploadBookMenuItem = await MenuItem.new({ + text: _('Upload Book'), + action: async () => { + handleBookUpload(book); + }, + }); const deleteBookMenuItem = await MenuItem.new({ text: _('Delete'), action: async () => { - deleteBook(envConfig, book); + updateBook(envConfig, book, true); }, }); const menu = await Menu.new(); menu.append(openBookMenuItem); menu.append(showBookDetailsMenuItem); menu.append(showBookInFinderMenuItem); + menu.append(uploadBookMenuItem); menu.append(deleteBookMenuItem); menu.popup(); }; @@ -198,137 +216,40 @@ const Bookshelf: React.FC = ({ libraryBooks, isSelectMode, onImp >
{'format' in item ? ( -
-
handleBookClick(item.hash)} - > -
- {item.title} { - (e.target as HTMLImageElement).style.display = 'none'; - (e.target as HTMLImageElement).nextElementSibling?.classList.remove( - 'invisible', - ); - }} - /> -
- {item.title} -
- {(selectedBooks.includes(item.hash) || clickedImage === item.hash) && ( -
- )} - {isSelectMode && ( -
- {selectedBooks.includes(item.hash) ? ( - - ) : ( - - )} -
- )} -
-
-
-
-

- {(item as Book).title} -

-
- {item.progress && ( -
- - {isWebAppPlatform() && ( - - )} -
- )} - {!item.progress && isWebAppPlatform() && ( -
- -
- )} -
-
+ ) : ( -
- {(item as BooksGroup).books.map((book) => ( -
-
- {book.title -
-
-

{book.title}

-

{book.author}

- -
-
- ))} -

{(item as BooksGroup).name}

-
+ )}
))} - {bookshelfItems.length > 0 && (
)} {selectedBooks.length > 0 && ( -
+
- - -
+ + + +
+ } + > + +