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 { 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 { books, settings, setSettings, setConfig, getFoliateView } = useReaderStore(); const { isFontLayoutSettingsGlobal } = useReaderStore(); const bookState = books[bookKey]!; const config = bookState.config!; const view = getFoliateView(bookKey); const [defaultFontSize, setDefaultFontSize] = useState(config.viewSettings!.defaultFontSize!); const [minFontSize, setMinFontSize] = useState(config.viewSettings!.minimumFontSize!); const [overrideFont, setOverrideFont] = useState(config.viewSettings!.overrideFont!); const [defaultFont, setDefaultFont] = useState(config.viewSettings!.defaultFont!); const [serifFont, setSerifFont] = useState(config.viewSettings!.serifFont!); const [sansSerifFont, setSansSerifFont] = useState(config.viewSettings!.sansSerifFont!); const [monospaceFont, setMonospaceFont] = useState(config.viewSettings!.monospaceFont!); useEffect(() => { config.viewSettings!.defaultFont = defaultFont; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.defaultFont = defaultFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [defaultFont]); useEffect(() => { config.viewSettings!.defaultFontSize = defaultFontSize; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.defaultFontSize = defaultFontSize; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [defaultFontSize]); useEffect(() => { config.viewSettings!.minimumFontSize = minFontSize; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.minimumFontSize = minFontSize; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [minFontSize]); useEffect(() => { config.viewSettings!.serifFont = serifFont; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.serifFont = serifFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [serifFont]); useEffect(() => { config.viewSettings!.sansSerifFont = sansSerifFont; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.sansSerifFont = sansSerifFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [sansSerifFont]); useEffect(() => { config.viewSettings!.monospaceFont = monospaceFont; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.monospaceFont = monospaceFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [monospaceFont]); useEffect(() => { config.viewSettings!.overrideFont = overrideFont; setConfig(bookKey, config); if (isFontLayoutSettingsGlobal) { settings.globalViewSettings.overrideFont = overrideFont; setSettings(settings); } view?.renderer.setStyles?.(getStyles(config)); }, [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;