import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import NumberInput from './NumberInput'; import FontDropdown from './FontDropDown'; import { MONOSPACE_FONTS, SANS_SERIF_FONTS, SERIF_FONTS } from '@/services/constants'; import { useReaderStore } from '@/store/readerStore'; import { useSettingsStore } from '@/store/settingsStore'; import { useTranslation } from '@/hooks/useTranslation'; import { useTheme } from '@/hooks/useTheme'; import { getStyles } from '@/utils/style'; interface FontFaceProps { className?: string; family: string; label: string; options: string[]; selected: string; onSelect: (option: string) => void; } const fontFamilyOptions = ['Serif', 'Sans-serif']; const handleFontFaceFont = (option: string, family: string) => { return `'${option}', ${family}`; }; const FontFace = ({ className, family, label, options, selected, onSelect }: FontFaceProps) => (
{label}
); const FontPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { const _ = useTranslation(); const { settings, isFontLayoutSettingsGlobal, setSettings } = useSettingsStore(); const { getView, getViewSettings, setViewSettings } = useReaderStore(); const view = getView(bookKey); const viewSettings = getViewSettings(bookKey)!; const { themeCode } = useTheme(); const [defaultFontSize, setDefaultFontSize] = useState(viewSettings.defaultFontSize!); const [minFontSize, setMinFontSize] = useState(viewSettings.minimumFontSize!); const [overrideFont, setOverrideFont] = useState(viewSettings.overrideFont!); const [defaultFont, setDefaultFont] = useState(viewSettings.defaultFont!); const [serifFont, setSerifFont] = useState(viewSettings.serifFont!); const [sansSerifFont, setSansSerifFont] = useState(viewSettings.sansSerifFont!); const [monospaceFont, setMonospaceFont] = useState(viewSettings.monospaceFont!); useEffect(() => { viewSettings.defaultFont = defaultFont; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.defaultFont = defaultFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultFont]); useEffect(() => { viewSettings.defaultFontSize = defaultFontSize; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.defaultFontSize = defaultFontSize; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultFontSize]); useEffect(() => { viewSettings.minimumFontSize = minFontSize; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.minimumFontSize = minFontSize; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [minFontSize]); useEffect(() => { viewSettings.serifFont = serifFont; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.serifFont = serifFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [serifFont]); useEffect(() => { viewSettings.sansSerifFont = sansSerifFont; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.sansSerifFont = sansSerifFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [sansSerifFont]); useEffect(() => { viewSettings.monospaceFont = monospaceFont; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.monospaceFont = monospaceFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [monospaceFont]); useEffect(() => { viewSettings.overrideFont = overrideFont; setViewSettings(bookKey, viewSettings); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.overrideFont = overrideFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(viewSettings, themeCode)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [overrideFont]); const handleFontFamilyFont = (option: string) => { switch (option) { case 'Serif': return `'${serifFont}', serif`; case 'Sans-serif': return `'${sansSerifFont}', sans-serif`; case 'Monospace': return `'${monospaceFont}', monospace`; default: return ''; } }; return (

{_('Font Size')}

{_('Font Family')}

{_('Default Font')}
{_('Override Publisher Font')} setOverrideFont(!overrideFont)} />

{_('Font Face')}

); }; export default FontPanel;