import clsx from 'clsx'; import React, { useEffect } from 'react'; import { useState } from 'react'; import { BiMoon, BiSun } from 'react-icons/bi'; import { TbSunMoon } from 'react-icons/tb'; import { MdZoomOut, MdZoomIn, MdCheck } from 'react-icons/md'; import MenuItem from '@/components/MenuItem'; import { useReaderStore } from '@/store/readerStore'; import { useTheme, ThemeMode } from '@/hooks/useTheme'; import { getStyles } from '@/utils/style'; interface ViewMenuProps { bookKey: string; setIsDropdownOpen?: (open: boolean) => void; onSetSettingsDialogOpen: (open: boolean) => void; } const ViewMenu: React.FC = ({ bookKey, setIsDropdownOpen, onSetSettingsDialogOpen, }) => { const { getView, getViewSettings, setViewSettings } = useReaderStore(); const viewSettings = getViewSettings(bookKey); const { themeMode, isDarkMode, themeCode, updateThemeMode } = useTheme(); const [isScrolledMode, setScrolledMode] = useState(viewSettings!.scrolled); const [isInvertedColors, setInvertedColors] = useState(viewSettings!.invert); const [zoomLevel, setZoomLevel] = useState(viewSettings!.zoomLevel!); const zoomIn = () => setZoomLevel((prev) => Math.min(prev + 10, 200)); const zoomOut = () => setZoomLevel((prev) => Math.max(prev - 10, 50)); const resetZoom = () => setZoomLevel(100); const toggleScrolledMode = () => setScrolledMode(!isScrolledMode); const toggleInvertedColors = () => setInvertedColors(!isInvertedColors); const openFontLayoutMenu = () => { setIsDropdownOpen?.(false); onSetSettingsDialogOpen(true); }; const cycleThemeMode = () => { const nextMode: ThemeMode = themeMode === 'auto' ? 'light' : themeMode === 'light' ? 'dark' : 'auto'; updateThemeMode(nextMode); }; useEffect(() => { getView(bookKey)?.renderer.setStyles?.(getStyles(viewSettings!, themeCode)); }, [themeCode]); useEffect(() => { getView(bookKey)?.renderer.setAttribute('flow', isScrolledMode ? 'scrolled' : 'paginated'); viewSettings!.scrolled = isScrolledMode; setViewSettings(bookKey, viewSettings!); }, [isScrolledMode]); useEffect(() => { document.body.classList.toggle('invert', isInvertedColors); getView(bookKey)?.renderer.setStyles?.(getStyles(viewSettings!, themeCode)); }, [isInvertedColors]); useEffect(() => { const view = getView(bookKey); if (!view) return; // FIXME: zoom level is not working in paginated mode if (viewSettings?.scrolled) { view.renderer.setStyles?.(getStyles(viewSettings!, themeCode)); } viewSettings!.zoomLevel = zoomLevel; setViewSettings(bookKey, viewSettings!); }, [zoomLevel]); return (

: undefined} onClick={toggleScrolledMode} />
) : themeMode === 'light' ? ( ) : ( ) } onClick={cycleThemeMode} /> : undefined} onClick={toggleInvertedColors} disabled={!isDarkMode} />
); }; export default ViewMenu;