direction-context.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { createContext, useContext, useEffect, useState } from 'react'
  2. import { DirectionProvider as RdxDirProvider } from '@radix-ui/react-direction'
  3. type Direction = 'ltr' | 'rtl'
  4. const DirectionContext = createContext<{
  5. dir: Direction
  6. setDir: (dir: Direction) => void
  7. }>({
  8. dir: 'ltr',
  9. setDir: () => {},
  10. })
  11. export function DirectionProvider({ children }: { children: React.ReactNode }) {
  12. const [dir, _setDir] = useState<Direction>(
  13. () => (localStorage.getItem('dir') as Direction) || 'ltr'
  14. )
  15. useEffect(() => {
  16. const htmlElement = document.documentElement
  17. htmlElement.setAttribute('dir', dir)
  18. }, [dir])
  19. const setDir = (dir: Direction) => {
  20. _setDir(dir)
  21. localStorage.setItem('dir', dir)
  22. }
  23. return (
  24. <DirectionContext value={{ dir, setDir }}>
  25. <RdxDirProvider dir={dir}>{children}</RdxDirProvider>
  26. </DirectionContext>
  27. )
  28. }
  29. // eslint-disable-next-line react-refresh/only-export-components
  30. export function useDirection() {
  31. const context = useContext(DirectionContext)
  32. if (!context) {
  33. throw new Error('useDirection must be used within a DirectionContext')
  34. }
  35. return context
  36. }