/* 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 { DirectionProvider as BaseDirectionProvider } from '@base-ui/react/direction-provider' import { createContext, useContext, useEffect, useState } from 'react' import { getCookie, setCookie, removeCookie } from '@/lib/cookies' export type Direction = 'ltr' | 'rtl' const DEFAULT_DIRECTION = 'ltr' const DIRECTION_COOKIE_NAME = 'dir' const DIRECTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 // 1 year type DirectionContextType = { defaultDir: Direction dir: Direction setDir: (dir: Direction) => void resetDir: () => void } const DirectionContext = createContext(null) export function DirectionProvider({ children }: { children: React.ReactNode }) { const [dir, _setDir] = useState( () => (getCookie(DIRECTION_COOKIE_NAME) as Direction) || DEFAULT_DIRECTION ) useEffect(() => { const htmlElement = document.documentElement htmlElement.setAttribute('dir', dir) }, [dir]) const setDir = (dir: Direction) => { _setDir(dir) setCookie(DIRECTION_COOKIE_NAME, dir, DIRECTION_COOKIE_MAX_AGE) } const resetDir = () => { _setDir(DEFAULT_DIRECTION) removeCookie(DIRECTION_COOKIE_NAME) } return ( {children} ) } // eslint-disable-next-line react-refresh/only-export-components export function useDirection() { const context = useContext(DirectionContext) if (!context) { throw new Error('useDirection must be used within a DirectionProvider') } return context }