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)} />