From 3e99e68327b2cf1e7548409da66a36ef7975fab0 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Nov 2024 14:05:46 +0100 Subject: [PATCH] Refactor useBooksManager and make it reusable --- .../{BookGrid.tsx => BooksGrid.tsx} | 6 +-- .../app/reader/components/ReaderContent.tsx | 41 +++++++++++---- .../reader/components/sidebar/BookMenu.tsx | 7 +-- .../app/reader/components/sidebar/Header.tsx | 5 +- .../app/reader/components/sidebar/SideBar.tsx | 4 +- .../src/app/reader/hooks/useBookShortcuts.ts | 13 ++--- .../hooks/{useBooks.ts => useBooksManager.ts} | 51 +++++-------------- apps/readest-app/src/helpers/shortcuts.ts | 4 +- apps/readest-app/src/store/readerStore.ts | 4 ++ 9 files changed, 65 insertions(+), 70 deletions(-) rename apps/readest-app/src/app/reader/components/{BookGrid.tsx => BooksGrid.tsx} (95%) rename apps/readest-app/src/app/reader/hooks/{useBooks.ts => useBooksManager.ts} (59%) diff --git a/apps/readest-app/src/app/reader/components/BookGrid.tsx b/apps/readest-app/src/app/reader/components/BooksGrid.tsx similarity index 95% rename from apps/readest-app/src/app/reader/components/BookGrid.tsx rename to apps/readest-app/src/app/reader/components/BooksGrid.tsx index d69d59e5..2c8e9b76 100644 --- a/apps/readest-app/src/app/reader/components/BookGrid.tsx +++ b/apps/readest-app/src/app/reader/components/BooksGrid.tsx @@ -11,12 +11,12 @@ import Ribbon from './Ribbon'; import SettingsDialog from './settings/SettingsDialog'; import Annotator from './annotator/Annotator'; -interface BookGridProps { +interface BooksGridProps { bookKeys: string[]; onCloseBook: (bookKey: string) => void; } -const BookGrid: React.FC = ({ bookKeys, onCloseBook }) => { +const BooksGrid: React.FC = ({ bookKeys, onCloseBook }) => { const { getConfig, getProgress, getBookData, getViewState, getViewSettings } = useReaderStore(); const { isFontLayoutSettingsDialogOpen, setFontLayoutSettingsDialogOpen } = useReaderStore(); const gridTemplate = getGridTemplate(bookKeys.length, window.innerWidth / window.innerHeight); @@ -78,4 +78,4 @@ const BookGrid: React.FC = ({ bookKeys, onCloseBook }) => { ); }; -export default BookGrid; +export default BooksGrid; diff --git a/apps/readest-app/src/app/reader/components/ReaderContent.tsx b/apps/readest-app/src/app/reader/components/ReaderContent.tsx index 985ea041..3258ec7f 100644 --- a/apps/readest-app/src/app/reader/components/ReaderContent.tsx +++ b/apps/readest-app/src/app/reader/components/ReaderContent.tsx @@ -1,27 +1,48 @@ 'use client'; import * as React from 'react'; -import { useRouter } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useEnv } from '@/context/EnvContext'; import { useReaderStore } from '@/store/readerStore'; import { SystemSettings } from '@/types/settings'; +import { uniqueId } from '@/utils/misc'; +import useBooksManager from '../hooks/useBooksManager'; +import useBookShortcuts from '../hooks/useBookShortcuts'; import Spinner from '@/components/Spinner'; import SideBar from './sidebar/SideBar'; -import useBooks from '../hooks/useBooks'; -import BookGrid from './BookGrid'; -import useBookShortcuts from '../hooks/useBookShortcuts'; import Notebook from './notebook/Notebook'; +import BooksGrid from './BooksGrid'; const ReaderContent: React.FC<{ settings: SystemSettings }> = ({ settings }) => { const router = useRouter(); + const searchParams = useSearchParams(); const { envConfig } = useEnv(); - const { bookKeys, dismissBook, getNextBookKey, openSplitView } = useBooks(); - const { sideBarBookKey, getView, getConfig, setSideBarBookKey } = useReaderStore(); - const { getBookData, getViewState, clearViewState, saveConfig, saveSettings } = useReaderStore(); + const { bookKeys, dismissBook, getNextBookKey } = useBooksManager(); + const { sideBarBookKey, getView, getConfig, saveConfig, saveSettings, setSideBarBookKey } = + useReaderStore(); + const { setBookKeys, getBookData, initViewState, getViewState, clearViewState } = + useReaderStore(); - useBookShortcuts({ sideBarBookKey, bookKeys, openSplitView, getNextBookKey }); + useBookShortcuts({ sideBarBookKey, bookKeys }); + + React.useEffect(() => { + const initialIds = (searchParams.get('ids') || '').split(',').filter(Boolean); + const initialBookKeys = initialIds.map((id) => `${id}-${uniqueId()}`); + setBookKeys(initialBookKeys); + const uniqueIds = new Set(); + console.log('Initialize books', initialBookKeys); + initialBookKeys.forEach((key, index) => { + const id = key.split('-')[0]!; + const isPrimary = !uniqueIds.has(id); + uniqueIds.add(id); + if (!getViewState(key)) { + initViewState(envConfig, id, key, isPrimary); + if (index === 0) setSideBarBookKey(key); + } + }); + }, []); const saveConfigAndCloseBook = (bookKey: string) => { getView(bookKey)?.close(); @@ -70,8 +91,8 @@ const ReaderContent: React.FC<{ settings: SystemSettings }> = ({ settings }) => return (
- - + +
); diff --git a/apps/readest-app/src/app/reader/components/sidebar/BookMenu.tsx b/apps/readest-app/src/app/reader/components/sidebar/BookMenu.tsx index a8922545..0a93a041 100644 --- a/apps/readest-app/src/app/reader/components/sidebar/BookMenu.tsx +++ b/apps/readest-app/src/app/reader/components/sidebar/BookMenu.tsx @@ -1,13 +1,14 @@ import React from 'react'; +import useBooksManager from '../../hooks/useBooksManager'; interface BookMenuProps { - openSplitView: () => void; setIsDropdownOpen?: (isOpen: boolean) => void; } -const BookMenu: React.FC = ({ openSplitView, setIsDropdownOpen }) => { +const BookMenu: React.FC = ({ setIsDropdownOpen }) => { + const { openParallelView } = useBooksManager(); const handleOpenSplitView = () => { - openSplitView(); + openParallelView(); setIsDropdownOpen?.(false); }; const handleReloadPage = () => { diff --git a/apps/readest-app/src/app/reader/components/sidebar/Header.tsx b/apps/readest-app/src/app/reader/components/sidebar/Header.tsx index 9a096e2f..906eead3 100644 --- a/apps/readest-app/src/app/reader/components/sidebar/Header.tsx +++ b/apps/readest-app/src/app/reader/components/sidebar/Header.tsx @@ -11,9 +11,8 @@ import BookMenu from './BookMenu'; const SidebarHeader: React.FC<{ isPinned: boolean; onGoToLibrary: () => void; - onOpenSplitView: () => void; handleTogglePin: () => void; -}> = ({ isPinned, onGoToLibrary, onOpenSplitView, handleTogglePin }) => { +}> = ({ isPinned, onGoToLibrary, handleTogglePin }) => { const { isTrafficLightVisible } = useTrafficLight(); return (
} > - +