/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { createContext, useContext, useEffect, useState } from 'react' import { fonts } from '@/config/fonts' import { getCookie, setCookie, removeCookie } from '@/lib/cookies' type Font = (typeof fonts)[number] const FONT_COOKIE_NAME = 'font' const FONT_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 // 1 year type FontContextType = { font: Font setFont: (font: Font) => void resetFont: () => void } const FontContext = createContext(null) export function FontProvider({ children }: { children: React.ReactNode }) { const [font, _setFont] = useState(() => { const savedFont = getCookie(FONT_COOKIE_NAME) return fonts.includes(savedFont as Font) ? (savedFont as Font) : fonts[0] }) useEffect(() => { const applyFont = (font: string) => { const root = document.documentElement root.classList.forEach((cls) => { if (cls.startsWith('font-')) root.classList.remove(cls) }) root.classList.add(`font-${font}`) } applyFont(font) }, [font]) const setFont = (font: Font) => { setCookie(FONT_COOKIE_NAME, font, FONT_COOKIE_MAX_AGE) _setFont(font) } const resetFont = () => { removeCookie(FONT_COOKIE_NAME) _setFont(fonts[0]) } return ( {children} ) } // eslint-disable-next-line react-refresh/only-export-components export const useFont = () => { const context = useContext(FontContext) if (!context) { throw new Error('useFont must be used within a FontProvider') } return context }