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 (
);
};
export default FontPanel;