dashboard fix
This commit is contained in:
@@ -1351,6 +1351,16 @@ function normalizeLanguage(value: string | null | undefined): DashboardLanguage
|
||||
return value === 'fr' || value === 'ar' || value === 'en' ? value : 'en'
|
||||
}
|
||||
|
||||
function detectBrowserLanguage(): DashboardLanguage | null {
|
||||
if (typeof navigator === 'undefined') return null
|
||||
const langs = Array.from(navigator.languages ?? [navigator.language])
|
||||
for (const lang of langs) {
|
||||
const code = lang.split('-')[0].toLowerCase()
|
||||
if (code === 'fr' || code === 'ar' || code === 'en') return code as DashboardLanguage
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
export function DashboardI18nProvider({
|
||||
children,
|
||||
initialLanguage = 'en',
|
||||
@@ -1361,12 +1371,19 @@ export function DashboardI18nProvider({
|
||||
const [language, setLanguage] = useState<DashboardLanguage>(initialLanguage)
|
||||
const [theme, setTheme] = useState<DashboardTheme>('light')
|
||||
const themeInitialized = useRef(false)
|
||||
// Skip the very first write so we don't overwrite a stored preference with the
|
||||
// server-resolved initialLanguage before the read effect has a chance to apply it.
|
||||
const skipFirstLangWrite = useRef(true)
|
||||
|
||||
useEffect(() => {
|
||||
const stored = readScopedPreference(SHARED_LANGUAGE_KEY, [DASHBOARD_LANGUAGE_KEY])
|
||||
if (stored === null) return
|
||||
const next = normalizeLanguage(stored)
|
||||
if (next !== language) setLanguage(next)
|
||||
if (stored !== null) {
|
||||
const next = normalizeLanguage(stored)
|
||||
if (next !== language) setLanguage(next)
|
||||
} else {
|
||||
const detected = detectBrowserLanguage()
|
||||
if (detected && detected !== language) setLanguage(detected)
|
||||
}
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
@@ -1384,6 +1401,10 @@ export function DashboardI18nProvider({
|
||||
useEffect(() => {
|
||||
document.documentElement.lang = language
|
||||
document.documentElement.dir = language === 'ar' ? 'rtl' : 'ltr'
|
||||
if (skipFirstLangWrite.current) {
|
||||
skipFirstLangWrite.current = false
|
||||
return
|
||||
}
|
||||
writeScopedPreference(SHARED_LANGUAGE_KEY, language, [DASHBOARD_LANGUAGE_KEY])
|
||||
document.cookie = `${SHARED_LANGUAGE_COOKIE}=${language}; path=/; max-age=31536000; samesite=lax`
|
||||
document.cookie = `${DASHBOARD_LANGUAGE_KEY}=${language}; path=/; max-age=31536000; samesite=lax`
|
||||
@@ -1407,10 +1428,17 @@ export function DashboardI18nProvider({
|
||||
const scopedLanguage = readCurrentUserScopedPreference(SHARED_LANGUAGE_KEY)
|
||||
const scopedTheme = readCurrentUserScopedPreference(SHARED_THEME_KEY)
|
||||
|
||||
if (scopedLanguage && normalizeLanguage(scopedLanguage) !== language) {
|
||||
setLanguage(normalizeLanguage(scopedLanguage))
|
||||
if (scopedLanguage) {
|
||||
// Employee has a stored preference — apply it.
|
||||
const next = normalizeLanguage(scopedLanguage)
|
||||
if (next !== language) setLanguage(next)
|
||||
} else {
|
||||
writeScopedPreference(SHARED_LANGUAGE_KEY, language, [DASHBOARD_LANGUAGE_KEY])
|
||||
// No scoped pref yet (new login). Promote any base preference that was set
|
||||
// before login (e.g., language selected on the sign-up page) to the scoped key.
|
||||
const baseLang = readScopedPreference(SHARED_LANGUAGE_KEY, [DASHBOARD_LANGUAGE_KEY])
|
||||
const langToWrite = baseLang ? normalizeLanguage(baseLang) : language
|
||||
if (langToWrite !== language) setLanguage(langToWrite)
|
||||
writeScopedPreference(SHARED_LANGUAGE_KEY, langToWrite, [DASHBOARD_LANGUAGE_KEY])
|
||||
}
|
||||
|
||||
if (scopedTheme === 'light' || scopedTheme === 'medium' || scopedTheme === 'dark') {
|
||||
|
||||
Reference in New Issue
Block a user