import { useState, useEffect } from 'react' import { Button } from './ui' import { t } from '@/lib/i18n' import { getReadingModeSettings, saveReadingModeSettings, type ReadingModeSettings } from '@/lib/readingModePreferences' const DEFAULT_SETTINGS: ReadingModeSettings = { maxWidth: 'medium', fontSize: 'medium', lineHeight: 'normal', } interface ReadingModeProps { children: React.ReactNode className?: string } function useReadingModeState(): { isActive: boolean setIsActive: (value: boolean) => void settings: ReadingModeSettings setSettings: (settings: ReadingModeSettings) => void } { const [isActive, setIsActive] = useState(false) const [settings, setSettings] = useState(DEFAULT_SETTINGS) useEffect(() => { const load = async (): Promise => { try { const saved = await getReadingModeSettings() if (saved !== null) { setSettings(saved) } } catch (error) { console.error('Error loading reading mode settings:', error) } } void load() }, []) useEffect(() => { if (isActive) { const save = async (): Promise => { try { await saveReadingModeSettings(settings) } catch (error) { console.error('Error saving reading mode settings:', error) } } void save() } }, [isActive, settings]) return { isActive, setIsActive, settings, setSettings } } export function ReadingMode({ children, className = '' }: ReadingModeProps): React.ReactElement { const { isActive, setIsActive, settings, setSettings } = useReadingModeState() const readingModeClasses = isActive ? getReadingModeClasses(settings) : '' const containerClasses = isActive ? `reading-mode ${readingModeClasses}` : '' return (
setIsActive(!isActive)} /> {isActive && ( )}
{children}
) } function ReadingModeToggle({ isActive, onToggle }: { isActive: boolean; onToggle: () => void }): React.ReactElement { return ( ) } function ReadingModeControls({ settings, onSettingsChange, }: { settings: ReadingModeSettings onSettingsChange: (settings: ReadingModeSettings) => void }): React.ReactElement { return (
) } function WidthControl({ settings, onSettingsChange, }: { settings: ReadingModeSettings onSettingsChange: (settings: ReadingModeSettings) => void }): React.ReactElement { const widths: ReadingModeSettings['maxWidth'][] = ['narrow', 'medium', 'wide', 'full'] return (
{widths.map((width) => ( ))}
) } function FontSizeControl({ settings, onSettingsChange, }: { settings: ReadingModeSettings onSettingsChange: (settings: ReadingModeSettings) => void }): React.ReactElement { const sizes: ReadingModeSettings['fontSize'][] = ['small', 'medium', 'large', 'xlarge'] return (
{sizes.map((size) => ( ))}
) } function LineHeightControl({ settings, onSettingsChange, }: { settings: ReadingModeSettings onSettingsChange: (settings: ReadingModeSettings) => void }): React.ReactElement { const heights: ReadingModeSettings['lineHeight'][] = ['tight', 'normal', 'relaxed'] return (
{heights.map((height) => ( ))}
) } function getReadingModeClasses(settings: ReadingModeSettings): string { const widthClasses: Record = { narrow: 'max-w-2xl', medium: 'max-w-3xl', wide: 'max-w-5xl', full: 'max-w-full', } const fontSizeClasses: Record = { small: 'text-sm', medium: 'text-base', large: 'text-lg', xlarge: 'text-xl', } const lineHeightClasses: Record = { tight: 'leading-tight', normal: 'leading-normal', relaxed: 'leading-relaxed', } return `${widthClasses[settings.maxWidth]} ${fontSizeClasses[settings.fontSize]} ${lineHeightClasses[settings.lineHeight]} mx-auto` }