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 { RELOAD_BEFREE_SAVED_TIMEOUT_MS } from '@/services/constants'; import { SettingsPanelPanelProp } from './SettingsDialog'; import { useResetViewSettings } from '../../hooks/useResetSettings'; import NumberInput from './NumberInput'; const ControlPanel: React.FC = ({ bookKey, onRegisterReset }) => { 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!); const resetToDefaults = useResetViewSettings(); const handleReset = () => { resetToDefaults({ scrolled: setScrolledMode, continuousScroll: setIsContinuousScroll, scrollingOverlap: setScrollingOverlap, volumeKeysToFlip: setVolumeKeysToFlip, disableClick: setIsDisableClick, swapClickArea: setSwapClickArea, animated: setAnimated, allowScript: setAllowScript, }); }; useEffect(() => { onRegisterReset(handleReset); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); 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(), RELOAD_BEFREE_SAVED_TIMEOUT_MS); // 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;