import React, { useCallback, useEffect, useState } from 'react'; import { ALargeSmall, AArrowDown, AArrowUp } from 'lucide-react'; // Constants for better maintainability const TEXT_SIZE_OPTIONS = ['small', 'medium', 'large'] as const; type TextSizeOption = (typeof TEXT_SIZE_OPTIONS)[number]; const TEXT_SIZE_STORAGE_KEY = 'bogam-text-size'; const DEFAULT_SIZE: TextSizeOption = 'small'; const TEXT_SIZE_CLASS_PREFIX = 'text-size'; // UI component constants const TOGGLE_GROUP_CLASS = 'toggle-group inline-flex h-10 items-center rounded-md border bg-background p-1 text-muted-foreground w-full'; const TOGGLE_BUTTON_CLASS = 'flex-1 inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ' + 'ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ' + 'focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50'; const LOADING_PLACEHOLDER = ; export function TextSizeToggle() { const [textSize, setTextSize] = useState(DEFAULT_SIZE); const [mounted, setMounted] = useState(false); // Initialize font size state once mounted useEffect(() => { setMounted(true); const storedPreferredTextSize = localStorage.getItem(TEXT_SIZE_STORAGE_KEY); // Validate stored preference against allowed options if ( storedPreferredTextSize && TEXT_SIZE_OPTIONS.includes(storedPreferredTextSize as TextSizeOption) ) { setTextSize(storedPreferredTextSize as TextSizeOption); } }, []); // Memoize the size application function for performance const updateArticleTextSize = useCallback(() => { const root = document.documentElement; // Generate all possible size classes const allSizeClasses = TEXT_SIZE_OPTIONS.map(size => `${TEXT_SIZE_CLASS_PREFIX}-${size}`); // Remove existing size classes root.classList.remove(...allSizeClasses); // Add the selected size class root.classList.add(`${TEXT_SIZE_CLASS_PREFIX}-${textSize}`); }, [textSize]); // Apply size changes when component mounts or textSize changes useEffect(() => { if (!mounted) return; // Apply size immediately updateArticleTextSize(); // Save preference to localStorage localStorage.setItem(TEXT_SIZE_STORAGE_KEY, textSize); }, [textSize, mounted, updateArticleTextSize]); // Handle text size change with type safety const handleTextSizeChange = (newSize: TextSizeOption) => { setTextSize(newSize); }; // Early return for SSR if (!mounted) { return LOADING_PLACEHOLDER; } return (
); }