import React, { useEffect, useState } from 'react'; import { useEnv } from '@/context/EnvContext'; import { useReaderStore } from '@/store/readerStore'; import { useDeviceControlStore } from '@/store/deviceStore'; import { useTranslation } from '@/hooks/useTranslation'; import { useBookDataStore } from '@/store/bookDataStore'; import { getStyles } from '@/utils/style'; import { getMaxInlineSize } from '@/utils/config'; import { saveViewSettings } from '../../utils/viewSettingsHelper'; import NumberInput from './NumberInput'; const ControlPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { const _ = useTranslation(); const { envConfig, appService } = useEnv(); const { getView, getViewSettings } = useReaderStore(); const { getBookData } = useBookDataStore(); const { acquireVolumeKeyInterception, releaseVolumeKeyInterception } = useDeviceControlStore(); const bookData = getBookData(bookKey)!; const viewSettings = getViewSettings(bookKey)!; const [isScrolledMode, setScrolledMode] = useState(viewSettings.scrolled!); const [isContinuousScroll, setIsContinuousScroll] = useState(viewSettings.continuousScroll!); const [scrollingOverlap, setScrollingOverlap] = useState(viewSettings.scrollingOverlap!); const [volumeKeysToFlip, setVolumeKeysToFlip] = useState(viewSettings.volumeKeysToFlip!); const [isDisableClick, setIsDisableClick] = useState(viewSettings.disableClick!); const [swapClickArea, setSwapClickArea] = useState(viewSettings.swapClickArea!); const [animated, setAnimated] = useState(viewSettings.animated!); const [allowScript, setAllowScript] = useState(viewSettings.allowScript!); useEffect(() => { if (isScrolledMode === viewSettings.scrolled) return; saveViewSettings(envConfig, bookKey, 'scrolled', isScrolledMode); getView(bookKey)?.renderer.setAttribute('flow', isScrolledMode ? 'scrolled' : 'paginated'); getView(bookKey)?.renderer.setAttribute( 'max-inline-size', `${getMaxInlineSize(viewSettings)}px`, ); getView(bookKey)?.renderer.setStyles?.(getStyles(viewSettings!)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isScrolledMode]); useEffect(() => { saveViewSettings(envConfig, bookKey, 'continuousScroll', isContinuousScroll, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isContinuousScroll]); useEffect(() => { if (scrollingOverlap === viewSettings.scrollingOverlap) return; saveViewSettings(envConfig, bookKey, 'scrollingOverlap', scrollingOverlap, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [scrollingOverlap]); useEffect(() => { saveViewSettings(envConfig, bookKey, 'volumeKeysToFlip', volumeKeysToFlip, false, false); if (appService?.isMobileApp) { if (volumeKeysToFlip) { acquireVolumeKeyInterception(); } else { releaseVolumeKeyInterception(); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [volumeKeysToFlip]); useEffect(() => { saveViewSettings(envConfig, bookKey, 'disableClick', isDisableClick, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isDisableClick]); useEffect(() => { saveViewSettings(envConfig, bookKey, 'swapClickArea', swapClickArea, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [swapClickArea]); useEffect(() => { saveViewSettings(envConfig, bookKey, 'animated', animated, false, false); if (animated) { getView(bookKey)?.renderer.setAttribute('animated', ''); } else { getView(bookKey)?.renderer.removeAttribute('animated'); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [animated]); useEffect(() => { if (viewSettings.allowScript === allowScript) return; saveViewSettings(envConfig, bookKey, 'allowScript', allowScript, true, false); setTimeout(() => window.location.reload(), 100); // eslint-disable-next-line react-hooks/exhaustive-deps }, [allowScript]); return (

{_('Scroll')}

{_('Scrolled Mode')} setScrolledMode(!isScrolledMode)} />
{_('Continuous Scroll')} setIsContinuousScroll(!isContinuousScroll)} />

{_('Click')}

{_('Clicks for Page Flip')} setIsDisableClick(!isDisableClick)} />
{_('Swap Clicks Area')} setSwapClickArea(!swapClickArea)} />
{appService?.isMobileApp && (
{_('Volume Keys for Page Flip')} setVolumeKeysToFlip(!volumeKeysToFlip)} />
)}

{_('Animation')}

{_('Paging Animation')} setAnimated(!animated)} />

{_('Security')}

{_('Allow JavaScript')} {_('Enable only if you trust the file.')}
setAllowScript(!allowScript)} />
); }; export default ControlPanel;