feat: add LocaleProvider and hooks for managing locale and timezone settings
Some checks failed
Frontend CI / lint (push) Failing after 19s
Frontend CI / build (push) Has been skipped

This commit is contained in:
JSC
2025-08-15 19:19:05 +02:00
parent 32140d7b5a
commit cd654b8777
6 changed files with 182 additions and 9 deletions

View File

@@ -0,0 +1,70 @@
import { type Locale, LocaleProviderContext } from '@/contexts/LocaleContext'
import { getSupportedTimezones } from '@/lib/utils/locale'
import { useEffect, useState } from 'react'
type LocaleProviderProps = {
children: React.ReactNode
defaultLocale?: Locale
defaultTimezone?: string
localeStorageKey?: string
timezoneStorageKey?: string
}
export function LocaleProvider({
children,
defaultLocale = 'fr-FR',
defaultTimezone = 'Europe/Paris',
localeStorageKey = 'locale',
timezoneStorageKey = 'timezone',
...props
}: LocaleProviderProps) {
const [locale, setLocaleState] = useState<Locale>(() => {
const stored = localStorage.getItem(localeStorageKey) as Locale
const validLocale = stored && ['en-US', 'fr-FR'].includes(stored) ? stored : defaultLocale
// Set default in localStorage if not present
if (!stored) {
localStorage.setItem(localeStorageKey, defaultLocale)
}
return validLocale
})
const [timezone, setTimezoneState] = useState<string>(() => {
const stored = localStorage.getItem(timezoneStorageKey)
const supportedTimezones = getSupportedTimezones()
const validTimezone = stored && supportedTimezones.includes(stored) ? stored : defaultTimezone
// Set default in localStorage if not present
if (!stored) {
localStorage.setItem(timezoneStorageKey, defaultTimezone)
}
return validTimezone
})
useEffect(() => {
// Set document language attribute for accessibility
document.documentElement.lang = locale.split('-')[0]
}, [locale])
const value = {
locale,
timezone,
setLocale: (newLocale: Locale) => {
localStorage.setItem(localeStorageKey, newLocale)
setLocaleState(newLocale)
},
setTimezone: (newTimezone: string) => {
localStorage.setItem(timezoneStorageKey, newTimezone)
setTimezoneState(newTimezone)
},
}
return (
<LocaleProviderContext.Provider {...props} value={value}>
{children}
</LocaleProviderContext.Provider>
)
}