import React, { useState, useEffect } from 'react'; import clsx from 'clsx'; import { MdOutlinePushPin, MdPushPin, MdToc, MdEditNote, MdBookmarkBorder, MdOutlineMenu, } from 'react-icons/md'; import { GiBookshelf } from 'react-icons/gi'; import { CiSearch } from 'react-icons/ci'; import { BookState, DEFAULT_BOOK_STATE, useReaderStore } from '@/store/readerStore'; import Dropdown from '@/components/Dropdown'; import BookCard from './BookCard'; import TOCView from './TOCView'; import BookMenu from './BookMenu'; const MIN_SIDEBAR_WIDTH = 0.15; const MAX_SIDEBAR_WIDTH = 0.45; const SideBar: React.FC<{ bookKey: string; width: string; isVisible: boolean; isPinned: boolean; onSetVisibility: (visibility: boolean) => void; onTogglePin: () => void; onResize: (newWidth: string) => void; onGoToLibrary: () => void; onOpenSplitView: () => void; }> = ({ bookKey, width, isPinned, isVisible, onTogglePin, onSetVisibility, onResize, onGoToLibrary, onOpenSplitView, }) => { const [activeTab, setActiveTab] = useState('toc'); const { books } = useReaderStore(); const [bookState, setBookState] = useState(null); const [currentHref, setCurrentHref] = useState(null); useEffect(() => { if (!books) return; const bookState = books[bookKey] || DEFAULT_BOOK_STATE; const { config } = bookState; setBookState(bookState); setCurrentHref(config?.href || null); }, [bookKey]); const handleClickOverlay = () => { onSetVisibility(false); }; const handleMouseDown = (e: React.MouseEvent) => { e.preventDefault(); document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); }; const handleMouseMove = (e: MouseEvent) => { const newWidthPx = e.clientX; const width = `${Math.round((newWidthPx / window.innerWidth) * 10000) / 100}%`; const minWidthPx = MIN_SIDEBAR_WIDTH * window.innerWidth; const maxWidthPx = MAX_SIDEBAR_WIDTH * window.innerWidth; if (newWidthPx >= minWidthPx && newWidthPx <= maxWidthPx) { onResize(width); } }; const handleMouseUp = () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; if (!bookState || !bookState.book || !bookState.bookDoc) { return null; } const { book, bookDoc } = bookState; return isVisible ? (
} >
{activeTab === 'toc' && bookDoc!.toc && ( )} {activeTab === 'annotations' &&
Annotations
} {activeTab === 'bookmarks' &&
Bookmarks
}
{['toc', 'annotations', 'bookmarks'].map((tab) => ( ))}
{!isPinned && (
handleClickOverlay()} /> )}
) : null; }; export default SideBar;