You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.5 KiB
54 lines
1.5 KiB
import { createContext, useContext, useEffect, useState } from 'react' |
|
import storage from '@/services/local-storage.service' |
|
import { TFontSize } from '@/types' |
|
|
|
type FontSizeContextType = { |
|
fontSize: TFontSize |
|
setFontSize: (fontSize: TFontSize) => void |
|
} |
|
|
|
const FontSizeContext = createContext<FontSizeContextType | undefined>(undefined) |
|
|
|
export const useFontSize = () => { |
|
const context = useContext(FontSizeContext) |
|
if (!context) { |
|
throw new Error('useFontSize must be used within a FontSizeProvider') |
|
} |
|
return context |
|
} |
|
|
|
export function FontSizeProvider({ children }: { children: React.ReactNode }) { |
|
const [fontSize, setFontSizeState] = useState<TFontSize>(storage.getFontSize()) |
|
|
|
useEffect(() => { |
|
// Apply font size to CSS root |
|
const root = document.documentElement |
|
|
|
// Remove old font size classes |
|
root.classList.remove('font-size-small', 'font-size-medium', 'font-size-large') |
|
|
|
// Add new font size class |
|
root.classList.add(`font-size-${fontSize}`) |
|
|
|
// Also set CSS variable for content font size |
|
const sizes = { |
|
small: '0.875rem', |
|
medium: '1rem', |
|
large: '1.125rem' |
|
} |
|
|
|
root.style.setProperty('--content-font-size', sizes[fontSize]) |
|
}, [fontSize]) |
|
|
|
const setFontSize = (newFontSize: TFontSize) => { |
|
storage.setFontSize(newFontSize) |
|
setFontSizeState(newFontSize) |
|
} |
|
|
|
return ( |
|
<FontSizeContext.Provider value={{ fontSize, setFontSize }}> |
|
{children} |
|
</FontSizeContext.Provider> |
|
) |
|
} |
|
|
|
|