| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import { createContext, useContext, useEffect, useState } from 'react'
- import { DirectionProvider as RdxDirProvider } from '@radix-ui/react-direction'
- 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
- interface DirectionContextType {
- defaultDir: Direction
- dir: Direction
- setDir: (dir: Direction) => void
- resetDir: () => void
- }
- const DirectionContext = createContext<DirectionContextType>({
- defaultDir: DEFAULT_DIRECTION,
- dir: DEFAULT_DIRECTION,
- setDir: () => {},
- resetDir: () => {},
- })
- export function DirectionProvider({ children }: { children: React.ReactNode }) {
- const [dir, _setDir] = useState<Direction>(
- () => (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 (
- <DirectionContext
- value={{
- defaultDir: DEFAULT_DIRECTION,
- dir,
- setDir,
- resetDir,
- }}
- >
- <RdxDirProvider dir={dir}>{children}</RdxDirProvider>
- </DirectionContext>
- )
- }
- // 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
- }
|