From d81629b72a3786d0ed3ac106398e66be87e5c26a Mon Sep 17 00:00:00 2001 From: chrox Date: Fri, 8 Nov 2024 19:33:37 +0100 Subject: [PATCH] Refactor ReaderStore --- .../src/app/reader/components/BookGrid.tsx | 36 +-- .../app/reader/components/BookmarkToggler.tsx | 14 +- .../app/reader/components/FoliateViewer.tsx | 15 +- .../src/app/reader/components/FooterBar.tsx | 20 +- .../src/app/reader/components/PageInfo.tsx | 9 +- .../app/reader/components/ReaderContent.tsx | 38 +-- .../src/app/reader/components/ViewMenu.tsx | 10 +- .../reader/components/annotator/Annotator.tsx | 12 +- .../reader/components/settings/FontPanel.tsx | 9 +- .../components/settings/LayoutPanel.tsx | 9 +- .../reader/components/settings/MiscPanel.tsx | 13 +- .../reader/components/sidebar/BookMenu.tsx | 4 +- .../components/sidebar/BooknoteView.tsx | 13 +- .../app/reader/components/sidebar/SideBar.tsx | 21 +- .../app/reader/components/sidebar/TOCView.tsx | 8 +- .../src/app/reader/hooks/useBookShortcuts.ts | 6 +- .../src/app/reader/hooks/useBooks.ts | 8 +- apps/readest-app/src/helpers/shortcuts.ts | 2 +- apps/readest-app/src/services/appService.ts | 1 + apps/readest-app/src/store/readerStore.ts | 258 +++++++++--------- apps/readest-app/src/utils/toc.ts | 12 + 21 files changed, 263 insertions(+), 255 deletions(-) diff --git a/apps/readest-app/src/app/reader/components/BookGrid.tsx b/apps/readest-app/src/app/reader/components/BookGrid.tsx index 93582d9e..445e1a88 100644 --- a/apps/readest-app/src/app/reader/components/BookGrid.tsx +++ b/apps/readest-app/src/app/reader/components/BookGrid.tsx @@ -1,25 +1,24 @@ import React from 'react'; -import { BookState, useReaderStore } from '@/store/readerStore'; - +import { useReaderStore } from '@/store/readerStore'; import FoliateViewer from './FoliateViewer'; import getGridTemplate from '@/utils/grid'; import SectionInfo from './SectionInfo'; import HeaderBar from './HeaderBar'; import FooterBar from './FooterBar'; -import PageInfo from './PageInfo'; +import PageInfoView from './PageInfo'; import Ribbon from './Ribbon'; import SettingsDialog from './settings/SettingsDialog'; import Annotator from './annotator/Annotator'; interface BookGridProps { bookKeys: string[]; - bookStates: BookState[]; onCloseBook: (bookKey: string) => void; } -const BookGrid: React.FC = ({ bookKeys, bookStates, onCloseBook }) => { - const { isSideBarPinned, isSideBarVisible, sideBarWidth, bookmarkRibbons } = useReaderStore(); +const BookGrid: React.FC = ({ bookKeys, onCloseBook }) => { + const { isSideBarPinned, isSideBarVisible, sideBarWidth } = useReaderStore(); + const { getConfig, getProgress, getBookData, getViewState } = useReaderStore(); const { isFontLayoutSettingsDialogOpen, setFontLayoutSettingsDialogOpen } = useReaderStore(); const gridWidth = isSideBarPinned && isSideBarVisible ? `calc(100% - ${sideBarWidth})` : '100%'; const gridTemplate = getGridTemplate(bookKeys.length, window.innerWidth / window.innerHeight); @@ -33,12 +32,15 @@ const BookGrid: React.FC = ({ bookKeys, bookStates, onCloseBook } gridTemplateRows: gridTemplate.rows, }} > - {bookStates.map((bookState, index) => { - const bookKey = bookKeys[index]!; - const isBookmarked = bookmarkRibbons[bookKey]; - const { book, config, progress, bookDoc } = bookState; - if (!book || !config || !progress || !bookDoc) return null; - const { section, pageinfo, tocLabel: chapter } = progress; + {bookKeys.map((bookKey) => { + const bookData = getBookData(bookKey); + const config = getConfig(bookKey); + const progress = getProgress(bookKey); + const { book, bookDoc } = bookData || {}; + if (!book || !config || !bookDoc) return null; + + const isBookmarked = getViewState(bookKey)?.ribbonVisible; + const { section, pageinfo, tocLabel: chapter } = progress || {}; const marginGap = `${config.viewSettings!.gapPercent}%`; return ( @@ -51,18 +53,18 @@ const BookGrid: React.FC = ({ bookKeys, bookStates, onCloseBook } 2} + isHoveredAnim={bookKeys.length > 2} onCloseBook={onCloseBook} onSetSettingsDialogOpen={setFontLayoutSettingsDialogOpen} /> - + {config.viewSettings!.scrolled ? null : ( <> - diff --git a/apps/readest-app/src/app/reader/components/BookmarkToggler.tsx b/apps/readest-app/src/app/reader/components/BookmarkToggler.tsx index 98488c05..f0fbda26 100644 --- a/apps/readest-app/src/app/reader/components/BookmarkToggler.tsx +++ b/apps/readest-app/src/app/reader/components/BookmarkToggler.tsx @@ -12,11 +12,10 @@ interface BookmarkTogglerProps { const BookmarkToggler: React.FC = ({ bookKey }) => { const { envConfig } = useEnv(); - const { books, settings, saveConfig, updateBooknotes, setBookmarkRibbonVisibility } = - useReaderStore(); - const bookState = books[bookKey]!; - const config = bookState.config!; - const progress = bookState.progress!; + const { settings, saveConfig, updateBooknotes } = useReaderStore(); + const { getConfig, getProgress, setBookmarkRibbonVisibility } = useReaderStore(); + const config = getConfig(bookKey)!; + const progress = getProgress(bookKey)!; const [isBookmarked, setIsBookmarked] = useState(false); @@ -56,7 +55,8 @@ const BookmarkToggler: React.FC = ({ bookKey }) => { }; useEffect(() => { - const { location: cfi, booknotes = [] } = config; + const { booknotes = [] } = config || {}; + const { location: cfi } = progress || {}; if (!cfi) return; const start = CFI.collapse(cfi); @@ -66,7 +66,7 @@ const BookmarkToggler: React.FC = ({ bookKey }) => { .some((item) => CFI.compare(start, item.cfi) * CFI.compare(end, item.cfi) <= 0); setIsBookmarked(locationBookmarked); setBookmarkRibbonVisibility(bookKey, locationBookmarked); - }, [config]); + }, [config, progress]); return ( - {pageinfo ? `${Math.round(progressFraction * 100)}%` : ''} + {pageinfoValid ? `${Math.round(progressFraction * 100)}%` : ''} handleProgressChange(e)} />