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 { useSettingsStore } from '@/store/settingsStore'; import { useResetViewSettings } from '@/hooks/useResetSettings'; import { useEinkMode } from '@/hooks/useEinkMode'; import { getStyles } from '@/utils/style'; import { saveAndReload } from '@/utils/reload'; import { getMaxInlineSize } from '@/utils/config'; import { saveSysSettings, saveViewSettings } from '@/helpers/settings'; import { SettingsPanelPanelProp } from './SettingsDialog'; import NumberInput from './NumberInput'; const ControlPanel: React.FC = ({ bookKey, onRegisterReset }) => { const _ = useTranslation(); const { envConfig, appService } = useEnv(); const { getView, getViewSettings } = useReaderStore(); const { getBookData } = useBookDataStore(); const { settings } = useSettingsStore(); const { applyEinkMode } = useEinkMode(); const { acquireVolumeKeyInterception, releaseVolumeKeyInterception } = useDeviceControlStore(); const bookData = getBookData(bookKey); const viewSettings = getViewSettings(bookKey) || settings.globalViewSettings; 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 [isDisableDoubleClick, setIsDisableDoubleClick] = useState(viewSettings.disableDoubleClick); const [animated, setAnimated] = useState(viewSettings.animated); const [isEink, setIsEink] = useState(viewSettings.isEink); const [autoScreenBrightness, setAutoScreenBrightness] = useState(settings.autoScreenBrightness); 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, isEink: setIsEink, 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, 'disableDoubleClick', isDisableDoubleClick, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isDisableDoubleClick]); 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(() => { saveViewSettings(envConfig, bookKey, 'isEink', isEink, false, false); if (isEink) { getView(bookKey)?.renderer.setAttribute('eink', ''); } else { getView(bookKey)?.renderer.removeAttribute('eink'); } applyEinkMode(isEink); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isEink]); useEffect(() => { if (autoScreenBrightness === settings.autoScreenBrightness) return; saveSysSettings(envConfig, 'autoScreenBrightness', autoScreenBrightness); // eslint-disable-next-line react-hooks/exhaustive-deps }, [autoScreenBrightness]); useEffect(() => { if (viewSettings.allowScript === allowScript) return; saveViewSettings(envConfig, bookKey, 'allowScript', allowScript, true, false); saveAndReload(); // 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)} />
{_('Disable Double Click')} setIsDisableDoubleClick(!isDisableDoubleClick)} />
{appService?.isMobileApp && (
{_('Volume Keys for Page Flip')} setVolumeKeysToFlip(!volumeKeysToFlip)} />
)}

{_('Animation')}

{_('Paging Animation')} setAnimated(!animated)} />
{appService?.isMobileApp && (

{_('Device')}

{appService?.isAndroidApp && (
{_('E-Ink Mode')} setIsEink(!isEink)} />
)}
{_('Auto Screen Brightness')} setAutoScreenBrightness(!autoScreenBrightness)} />
)}

{_('Security')}

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