feat: add LocaleProvider and hooks for managing locale and timezone settings
This commit is contained in:
70
src/components/LocaleProvider.tsx
Normal file
70
src/components/LocaleProvider.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user