diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 3c8181f0..98634517 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -32,6 +32,11 @@ jobs: build_web_app: runs-on: ubuntu-latest + strategy: + matrix: + config: + - platform: 'web' + - platform: 'tauri' steps: - uses: actions/checkout@v4 with: @@ -54,6 +59,13 @@ jobs: pnpm install && pnpm setup-pdfjs - name: build the web App + if: matrix.config.platform == 'web' working-directory: apps/readest-app run: | - pnpm build-check + pnpm build-web && pnpm check:all + + - name: build the Tauri App + if: matrix.config.platform == 'tauri' + working-directory: apps/readest-app + run: | + pnpm build && pnpm check:all diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 27328e6f..6b32f350 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -467,5 +467,7 @@ "Fiction, Science, History": "خيال، علوم، تاريخ", "Select Cover Image": "اختر صورة الغلاف", "Open Book in New Window": "فتح الكتاب في نافذة جديدة", - "Voices for {{lang}}": "الأصوات لـ {{lang}}" + "Voices for {{lang}}": "الأصوات لـ {{lang}}", + "Yandex Translate": "ترجمة Yandex", + "YYYY or YYYY-MM-DD": "YYYY أو YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 40c51754..840e6c03 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -451,5 +451,7 @@ "Fiction, Science, History": "Belletristik, Wissenschaft, Geschichte", "Select Cover Image": "Coverbild auswählen", "Open Book in New Window": "Buch in neuem Fenster öffnen", - "Voices for {{lang}}": "Stimmen für {{lang}}" + "Voices for {{lang}}": "Stimmen für {{lang}}", + "Yandex Translate": "Yandex Übersetzer", + "YYYY or YYYY-MM-DD": "YYYY oder YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 38237673..eeb85864 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -451,5 +451,7 @@ "Fiction, Science, History": "Μυθοπλασία, Επιστήμη, Ιστορία", "Select Cover Image": "Επιλέξτε εικόνα εξωφύλλου", "Open Book in New Window": "Άνοιγμα βιβλίου σε νέο παράθυρο", - "Voices for {{lang}}": "Φωνές για {{lang}}" + "Voices for {{lang}}": "Φωνές για {{lang}}", + "Yandex Translate": "Μετάφραση Yandex", + "YYYY or YYYY-MM-DD": "YYYY ή YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 62fac3ed..15b2d13e 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -455,5 +455,7 @@ "Fiction, Science, History": "Ficción, Ciencia, Historia", "Select Cover Image": "Seleccionar imagen de portada", "Open Book in New Window": "Abre el libro en una nueva ventana", - "Voices for {{lang}}": "Voces para {{lang}}" + "Voices for {{lang}}": "Voces para {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "YYYY o YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 7d14d6c0..8824dc89 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -455,5 +455,7 @@ "Fiction, Science, History": "Fiction, Science, Histoire", "Select Cover Image": "Sélectionner l'image de couverture", "Open Book in New Window": "Ouvrir dans une nouvelle fenêtre", - "Voices for {{lang}}": "Voix pour {{lang}}" + "Voices for {{lang}}": "Voix pour {{lang}}", + "Yandex Translate": "Yandex Traduction", + "YYYY or YYYY-MM-DD": "YYYY ou YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 1a1f9f80..f9bbd01a 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -451,5 +451,7 @@ "Fiction, Science, History": "काल्पनिक, विज्ञान, इतिहास", "Select Cover Image": "कवर इमेज चुनें", "Open Book in New Window": "नई विंडो में पुस्तक खोलें", - "Voices for {{lang}}": "{{lang}} के लिए आवाज़ें" + "Voices for {{lang}}": "{{lang}} के लिए आवाज़ें", + "Yandex Translate": "यांडेक्स अनुवाद", + "YYYY or YYYY-MM-DD": "YYYY या YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 98b9ad75..20d60e38 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "Fiksi, Sains, Sejarah", "Select Cover Image": "Pilihan Gambar Sampul", "Open Book in New Window": "Buka Buku di Jendela Baru", - "Voices for {{lang}}": "Suara untuk {{lang}}" + "Voices for {{lang}}": "Suara untuk {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "YYYY atau YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index a6697631..ab64aff6 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -455,5 +455,7 @@ "Fiction, Science, History": "Narrativa, Scienza, Storia", "Select Cover Image": "Seleziona immagine di copertina", "Open Book in New Window": "Apri libro in una nuova finestra", - "Voices for {{lang}}": "Voci per {{lang}}" + "Voices for {{lang}}": "Voci per {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "AAAA o AAAA-MM-GG" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index f8a1a9c4..9120045b 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "小説、科学、歴史", "Select Cover Image": "表紙画像を選択", "Open Book in New Window": "新しいウィンドウで本を開く", - "Voices for {{lang}}": "{{lang}}の音声" + "Voices for {{lang}}": "{{lang}}の音声", + "Yandex Translate": "Yandex翻訳", + "YYYY or YYYY-MM-DD": "YYYYまたはYYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 2763edfd..0008a05f 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "소설, 과학, 역사", "Select Cover Image": "표지 이미지 선택", "Open Book in New Window": "새 창에서 책 열기", - "Voices for {{lang}}": "{{lang}}의 음성" + "Voices for {{lang}}": "{{lang}}의 음성", + "Yandex Translate": "Yandex 번역", + "YYYY or YYYY-MM-DD": "YYYY 또는 YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 50935446..57135404 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -451,5 +451,7 @@ "Fiction, Science, History": "Fictie, Wetenschap, Geschiedenis", "Select Cover Image": "Selecteer omslagafbeelding", "Open Book in New Window": "Open boek in nieuw venster", - "Voices for {{lang}}": "Stemmen voor {{lang}}" + "Voices for {{lang}}": "Stemmen voor {{lang}}", + "Yandex Translate": "Yandex Vertalen", + "YYYY or YYYY-MM-DD": "YYYY of YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 8e1bb4c8..3db86e5f 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -459,5 +459,7 @@ "Fiction, Science, History": "Beletrystyka, Nauka, Historia", "Select Cover Image": "Zaznacz obraz okładki", "Open Book in New Window": "Otwórz książkę w nowym oknie", - "Voices for {{lang}}": "{{lang}} Głosy" + "Voices for {{lang}}": "{{lang}} Głosy", + "Yandex Translate": "Yandex Tłumacz", + "YYYY or YYYY-MM-DD": "YYYY lub YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index b8a1b682..a9a08531 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -455,5 +455,7 @@ "Fiction, Science, History": "Ficção, Ciência, História", "Select Cover Image": "Selecionar imagem da capa", "Open Book in New Window": "Abrir livro em nova janela", - "Voices for {{lang}}": "Vozes para {{lang}}" + "Voices for {{lang}}": "Vozes para {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "YYYY ou YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 863c8797..811b1101 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -459,5 +459,7 @@ "Fiction, Science, History": "Художественная литература, Наука, История", "Select Cover Image": "Выбрать изображение обложки", "Open Book in New Window": "Открыть книгу в новом окне", - "Voices for {{lang}}": "Голоса для {{lang}}" + "Voices for {{lang}}": "Голоса для {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "YYYY или YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index da8f0b74..099d13ca 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "นิยาย, วิทยาศาสตร์, ประวัติศาสตร์", "Select Cover Image": "เลือกภาพปก", "Open Book in New Window": "เปิดหนังสือในหน้าต่างใหม่", - "Voices for {{lang}}": "เสียงสำหรับ {{lang}}" + "Voices for {{lang}}": "เสียงสำหรับ {{lang}}", + "Yandex Translate": "Yandex Translate", + "YYYY or YYYY-MM-DD": "YYYY หรือ YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index f6ab0390..89112e50 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -451,5 +451,7 @@ "Fiction, Science, History": "Kurgu, Bilim, Tarih", "Select Cover Image": "Kapak Resmi Seç", "Open Book in New Window": "Kitabı Yeni Pencerede Aç", - "Voices for {{lang}}": "{{lang}} için Sesler" + "Voices for {{lang}}": "{{lang}} için Sesler", + "Yandex Translate": "Yandex Çeviri", + "YYYY or YYYY-MM-DD": "YYYY veya YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 5c32ea03..4efd183b 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -459,5 +459,7 @@ "Fiction, Science, History": "Художня література, Наукова фантастика, Історія", "Select Cover Image": "Оберіть зображення обкладинки", "Open Book in New Window": "Відкрити книгу в новому вікні", - "Voices for {{lang}}": "Голоси для {{lang}}" + "Voices for {{lang}}": "Голоси для {{lang}}", + "Yandex Translate": "Yandex Перекладач", + "YYYY or YYYY-MM-DD": "YYYY або YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 5c2a0577..a8b43de8 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -446,6 +446,8 @@ "Open Library": "Open Library", "Fiction, Science, History": "Tiểu thuyết, Khoa học, Lịch sử", "Select Cover Image": "Chọn ảnh bìa", - "Open Book in New Window": "Open Sách trong Cửa sổ Mới", - "Voices for {{lang}}": "Giọng nói cho {{lang}}" + "Open Book in New Window": "Mở Sách trong Cửa sổ Mới", + "Voices for {{lang}}": "Giọng nói cho {{lang}}", + "Yandex Translate": "Yandex Dịch", + "YYYY or YYYY-MM-DD": "YYYY hoặc YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 351ebd19..5a461cfe 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "小说,科学,历史", "Select Cover Image": "选择封面图片", "Open Book in New Window": "在新窗口中打开书籍", - "Voices for {{lang}}": "{{lang}} 的语音" + "Voices for {{lang}}": "{{lang}} 的语音", + "Yandex Translate": "Yandex 翻译", + "YYYY or YYYY-MM-DD": "YYYY 或 YYYY-MM-DD" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index f64ffdb7..f96e4250 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -447,5 +447,7 @@ "Fiction, Science, History": "小說,科學,歷史", "Select Cover Image": "選擇封面圖片", "Open Book in New Window": "在新視窗中打開書籍", - "Voices for {{lang}}": "{{lang}} 的語音" + "Voices for {{lang}}": "{{lang}} 的語音", + "Yandex Translate": "Yandex 翻譯", + "YYYY or YYYY-MM-DD": "YYYY 或 YYYY-MM-DD" } diff --git a/apps/readest-app/src/app/library/components/Bookshelf.tsx b/apps/readest-app/src/app/library/components/Bookshelf.tsx index 46f52fd7..726fa632 100644 --- a/apps/readest-app/src/app/library/components/Bookshelf.tsx +++ b/apps/readest-app/src/app/library/components/Bookshelf.tsx @@ -179,6 +179,7 @@ const Bookshelf: React.FC = ({ }; const openBookDetails = () => { + handleSetSelectMode(false); const book = libraryBooks.find((book) => book.hash === selectedBooks[0]); if (book) { handleShowDetailsBook(book); diff --git a/apps/readest-app/src/app/library/components/BookshelfItem.tsx b/apps/readest-app/src/app/library/components/BookshelfItem.tsx index 6db07be0..cd1bec69 100644 --- a/apps/readest-app/src/app/library/components/BookshelfItem.tsx +++ b/apps/readest-app/src/app/library/components/BookshelfItem.tsx @@ -1,4 +1,5 @@ import clsx from 'clsx'; +import { useCallback } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { navigateToLibrary, navigateToReader, showReaderWindow } from '@/utils/nav'; import { useEnv } from '@/context/EnvContext'; @@ -8,8 +9,9 @@ import { useTranslation } from '@/hooks/useTranslation'; import { useLongPress } from '@/hooks/useLongPress'; import { Menu, MenuItem } from '@tauri-apps/api/menu'; import { revealItemInDir } from '@tauri-apps/plugin-opener'; -import { getOSPlatform } from '@/utils/misc'; import { getLocalBookFilename } from '@/utils/book'; +import { getOSPlatform } from '@/utils/misc'; +import { throttle } from '@/utils/throttle'; import { LibraryCoverFitType, LibraryViewModeType } from '@/types/settings'; import { BOOK_UNGROUPED_ID, BOOK_UNGROUPED_NAME } from '@/services/constants'; import { FILE_REVEAL_LABELS, FILE_REVEAL_PLATFORMS } from '@/utils/os'; @@ -138,28 +140,36 @@ const BookshelfItem: React.FC = ({ return true; }; - const handleBookClick = async (book: Book) => { - if (isSelectMode) { - toggleSelection(book.hash); - } else { - if (!(await makeBookAvailable(book))) return; - if (appService?.hasWindow && settings.openBookInNewWindow) { - showReaderWindow(appService, [book.hash]); + const handleBookClick = useCallback( + async (book: Book) => { + if (isSelectMode) { + toggleSelection(book.hash); } else { - navigateToReader(router, [book.hash]); + if (!(await makeBookAvailable(book))) return; + if (appService?.hasWindow && settings.openBookInNewWindow) { + showReaderWindow(appService, [book.hash]); + } else { + navigateToReader(router, [book.hash]); + } } - } - }; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [isSelectMode, settings.openBookInNewWindow, appService], + ); - const handleGroupClick = (group: BooksGroup) => { - if (isSelectMode) { - toggleSelection(group.id); - } else { - const params = new URLSearchParams(searchParams?.toString()); - params.set('group', group.id); - navigateToLibrary(router, `${params.toString()}`); - } - }; + const handleGroupClick = useCallback( + (group: BooksGroup) => { + if (isSelectMode) { + toggleSelection(group.id); + } else { + const params = new URLSearchParams(searchParams?.toString()); + params.set('group', group.id); + navigateToLibrary(router, `${params.toString()}`); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [isSelectMode, searchParams], + ); const bookContextMenuHandler = async (book: Book) => { if (!appService?.hasContextMenu) return; @@ -241,8 +251,9 @@ const BookshelfItem: React.FC = ({ menu.popup(); }; - const { pressing, handlers } = useLongPress({ - onLongPress: async () => { + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleSelectItem = useCallback( + throttle(() => { if (!isSelectMode) { handleSetSelectMode(true); } @@ -251,22 +262,56 @@ const BookshelfItem: React.FC = ({ } else { toggleSelection((item as BooksGroup).id); } - }, - onTap: () => { + }, 100), + [isSelectMode], + ); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleOpenItem = useCallback( + throttle(() => { + if (isSelectMode) { + handleSelectItem(); + return; + } if ('format' in item) { handleBookClick(item as Book); } else { handleGroupClick(item as BooksGroup); } - }, - onContextMenu: () => { + }, 100), + [handleSelectItem, handleBookClick, handleGroupClick], + ); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleContextMenu = useCallback( + throttle(() => { if ('format' in item) { bookContextMenuHandler(item as Book); } else { groupContextMenuHandler(item as BooksGroup); } + }, 100), + [], + ); + + const { pressing, handlers } = useLongPress( + { + onLongPress: () => { + handleSelectItem(); + }, + onTap: () => { + handleOpenItem(); + }, + onContextMenu: () => { + if (appService?.hasContextMenu) { + handleContextMenu(); + } else if (appService?.isAndroidApp) { + handleSelectItem(); + } + }, }, - }); + [isSelectMode, handleSelectItem, handleOpenItem, handleContextMenu], + ); return (
@@ -275,6 +320,7 @@ const BookshelfItem: React.FC = ({ 'group', mode === 'grid' && 'sm:hover:bg-base-300/50 flex h-full flex-col px-0 py-4 sm:px-4', mode === 'list' && 'border-base-300 flex flex-col border-b py-2', + appService?.isMobileApp && 'no-context-menu', pressing ? (mode === 'grid' ? 'scale-95' : 'scale-98') : 'scale-100', )} style={{ diff --git a/apps/readest-app/src/components/BookCover.tsx b/apps/readest-app/src/components/BookCover.tsx index 7c050509..7f34dbed 100644 --- a/apps/readest-app/src/components/BookCover.tsx +++ b/apps/readest-app/src/components/BookCover.tsx @@ -48,10 +48,7 @@ const BookCover: React.FC = ({ return (
{coverFit === 'crop' ? ( = ({ field: 'published', label: _('Publication Date'), value: metadata.published || '', - placeholder: 'YYYY or YYYY-MM-DD', + placeholder: _('YYYY or YYYY-MM-DD'), }, { field: 'language', @@ -178,9 +178,12 @@ const BookDetailEdit: React.FC = ({ let files; if (isTauriAppPlatform()) { files = (await selectImageFileTauri()) as string[]; - if (files.length > 0) { + if (appService && files.length > 0) { metadata.coverImageFile = files[0]!; - metadata.coverImageUrl = appService?.fs.getURL(files[0]!); + const tempName = 'cover-temp.png'; + const cachePrefix = appService.fs.getPrefix('Cache'); + await appService.fs.copyFile(files[0]!, tempName, 'Cache'); + metadata.coverImageUrl = await appService.fs.getURL(`${cachePrefix}/${tempName}`); setNewCoverImageUrl(metadata.coverImageUrl!); } } else { @@ -196,7 +199,10 @@ const BookDetailEdit: React.FC = ({
-
+
= ({ )} title={_('Change cover image')} > - + {_('Replace')} diff --git a/apps/readest-app/src/components/metadata/BookDetailView.tsx b/apps/readest-app/src/components/metadata/BookDetailView.tsx index 6c11c7e3..0923ed38 100644 --- a/apps/readest-app/src/components/metadata/BookDetailView.tsx +++ b/apps/readest-app/src/components/metadata/BookDetailView.tsx @@ -100,7 +100,7 @@ const BookDetailView: React.FC = ({
{_('Published')}

- {formatDate(metadata.published) || _('Unknown')} + {formatDate(metadata.published, true) || _('Unknown')}

diff --git a/apps/readest-app/src/hooks/useLongPress.ts b/apps/readest-app/src/hooks/useLongPress.ts index 5b332e1c..f722d3c3 100644 --- a/apps/readest-app/src/hooks/useLongPress.ts +++ b/apps/readest-app/src/hooks/useLongPress.ts @@ -21,14 +21,17 @@ interface UseLongPressResult { }; } -export const useLongPress = ({ - onTap, - onLongPress, - onContextMenu, - onCancel, - threshold = 500, - moveThreshold = 10, -}: UseLongPressOptions): UseLongPressResult => { +export const useLongPress = ( + { + onTap, + onLongPress, + onContextMenu, + onCancel, + threshold = 500, + moveThreshold = 10, + }: UseLongPressOptions, + deps: React.DependencyList, +): UseLongPressResult => { const [pressing, setPressing] = useState(false); const timerRef = useRef(); const startPosRef = useRef<{ x: number; y: number } | null>(null); @@ -114,15 +117,17 @@ export const useLongPress = ({ e.stopPropagation(); onContextMenu(); } + reset(); }, - [onContextMenu], + [onContextMenu, reset], ); useEffect(() => { return () => { clearTimeout(timerRef.current); }; - }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, deps); return { pressing, diff --git a/apps/readest-app/src/utils/book.ts b/apps/readest-app/src/utils/book.ts index c4bbb7d9..1c8e666d 100644 --- a/apps/readest-app/src/utils/book.ts +++ b/apps/readest-app/src/utils/book.ts @@ -123,7 +123,7 @@ export const getPrimaryLanguage = (lang: string | string[] | undefined) => { return Array.isArray(lang) ? lang[0] : lang; }; -export const formatDate = (date: string | number | Date | null | undefined) => { +export const formatDate = (date: string | number | Date | null | undefined, isUTC = false) => { if (!date) return; const userLang = getUserLang(); try { @@ -131,6 +131,7 @@ export const formatDate = (date: string | number | Date | null | undefined) => { year: 'numeric', month: 'long', day: 'numeric', + timeZone: isUTC ? 'UTC' : undefined, }); } catch { return;