All files / src/contexts LocaleContext.tsx

100% Statements 34/34
83.33% Branches 10/12
100% Functions 2/2
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 621x                   1x                       1x   1x 11x   11x 11x 11x 1x 1x 1x 11x   11x 2x 2x 11x   11x 11x 11x 11x   11x 11x 11x 11x 11x 11x 11x   11x 11x   1x 12x 12x 12x 12x  
import {
  createContext,
  useCallback,
  useContext,
  useEffect,
  useMemo,
  useState,
  type ReactNode,
} from 'react';
 
import {
  detectInitialLocale,
  getCurrentLocale,
  setCurrentLocale,
  type Locale,
} from '@/i18n';
 
interface LocaleContextValue {
  locale: Locale;
  setLocale: (locale: Locale) => Promise<void>;
}
 
const LocaleContext = createContext<LocaleContextValue | null>(null);
 
export function LocaleProvider({ children }: { children: ReactNode }) {
  const [locale, setLocaleState] = useState<Locale>(() => getCurrentLocale());
 
  useEffect(() => {
    const initialLocale = detectInitialLocale();
    if (initialLocale !== locale) {
      setLocaleState(initialLocale);
      void setCurrentLocale(initialLocale);
    }
  }, [locale]);
 
  const handleSetLocale = useCallback(async (nextLocale: Locale) => {
    await setCurrentLocale(nextLocale);
    setLocaleState(nextLocale);
  }, []);
 
  useEffect(() => {
    if (typeof document === 'undefined') return;
    document.documentElement.lang = locale === 'tr' ? 'tr' : 'en';
  }, [locale]);
 
  const value = useMemo(
    () => ({
      locale,
      setLocale: handleSetLocale,
    }),
    [handleSetLocale, locale],
  );
 
  return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;
}
 
export function useLocale(): LocaleContextValue {
  const value = useContext(LocaleContext);
  if (!value) throw new Error('useLocale must be used within LocaleProvider');
  return value;
}