refactor: Optimize font loading by removing unnecessary async/await and streamline language handling
This commit is contained in:
@@ -26,7 +26,7 @@ export function UserPreferencesProvider({ children }: { children: ReactNode }) {
|
|||||||
const fetchPreferences = async () => {
|
const fetchPreferences = async () => {
|
||||||
if (!isAuthenticated || !user) {
|
if (!isAuthenticated || !user) {
|
||||||
const browserLang = detectBrowserLanguage()
|
const browserLang = detectBrowserLanguage()
|
||||||
await loadFontsForLanguage(browserLang)
|
loadFontsForLanguage(browserLang)
|
||||||
setIsLoading(false)
|
setIsLoading(false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -42,10 +42,8 @@ export function UserPreferencesProvider({ children }: { children: ReactNode }) {
|
|||||||
setHasAliyunKey(keyVerification.valid)
|
setHasAliyunKey(keyVerification.valid)
|
||||||
|
|
||||||
const lang = prefs.language || detectBrowserLanguage()
|
const lang = prefs.language || detectBrowserLanguage()
|
||||||
await Promise.all([
|
loadFontsForLanguage(lang)
|
||||||
i18n.changeLanguage(lang),
|
await i18n.changeLanguage(lang)
|
||||||
loadFontsForLanguage(lang),
|
|
||||||
])
|
|
||||||
|
|
||||||
const cacheKey = `user_preferences_${user.id}`
|
const cacheKey = `user_preferences_${user.id}`
|
||||||
localStorage.setItem(cacheKey, JSON.stringify(prefs))
|
localStorage.setItem(cacheKey, JSON.stringify(prefs))
|
||||||
@@ -56,11 +54,11 @@ export function UserPreferencesProvider({ children }: { children: ReactNode }) {
|
|||||||
const cachedPrefs = JSON.parse(cached)
|
const cachedPrefs = JSON.parse(cached)
|
||||||
setPreferences(cachedPrefs)
|
setPreferences(cachedPrefs)
|
||||||
if (cachedPrefs.language) {
|
if (cachedPrefs.language) {
|
||||||
await loadFontsForLanguage(cachedPrefs.language)
|
loadFontsForLanguage(cachedPrefs.language)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const browserLang = detectBrowserLanguage()
|
const browserLang = detectBrowserLanguage()
|
||||||
await loadFontsForLanguage(browserLang)
|
loadFontsForLanguage(browserLang)
|
||||||
setPreferences({ default_backend: 'aliyun', onboarding_completed: false })
|
setPreferences({ default_backend: 'aliyun', onboarding_completed: false })
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -98,10 +96,8 @@ export function UserPreferencesProvider({ children }: { children: ReactNode }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const changeLanguage = async (lang: 'zh-CN' | 'zh-TW' | 'en-US' | 'ja-JP' | 'ko-KR') => {
|
const changeLanguage = async (lang: 'zh-CN' | 'zh-TW' | 'en-US' | 'ja-JP' | 'ko-KR') => {
|
||||||
await Promise.all([
|
loadFontsForLanguage(lang)
|
||||||
i18n.changeLanguage(lang),
|
await i18n.changeLanguage(lang)
|
||||||
loadFontsForLanguage(lang),
|
|
||||||
])
|
|
||||||
await updatePreferences({ language: lang })
|
await updatePreferences({ language: lang })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,11 +85,11 @@ function createFontFace(config: FontConfig): FontFace {
|
|||||||
return new FontFace(config.name, `url(${config.file}) format('woff2')`, descriptors)
|
return new FontFace(config.name, `url(${config.file}) format('woff2')`, descriptors)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function loadFontsForLanguage(language: Language): Promise<void> {
|
export function loadFontsForLanguage(language: Language): void {
|
||||||
const configs = fontConfigs[language]
|
const configs = fontConfigs[language]
|
||||||
if (!configs) return
|
if (!configs) return
|
||||||
|
|
||||||
const loadPromises = configs.map(async (config) => {
|
configs.forEach((config) => {
|
||||||
const fontKey = `${config.name}-${config.file}`
|
const fontKey = `${config.name}-${config.file}`
|
||||||
|
|
||||||
if (loadedFonts.has(fontKey)) {
|
if (loadedFonts.has(fontKey)) {
|
||||||
@@ -98,15 +98,12 @@ export async function loadFontsForLanguage(language: Language): Promise<void> {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const fontFace = createFontFace(config)
|
const fontFace = createFontFace(config)
|
||||||
await fontFace.load()
|
|
||||||
document.fonts.add(fontFace)
|
document.fonts.add(fontFace)
|
||||||
loadedFonts.add(fontKey)
|
loadedFonts.add(fontKey)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn(`Failed to load font ${config.file}:`, error)
|
console.warn(`Failed to register font ${config.file}:`, error)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
await Promise.all(loadPromises)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function detectBrowserLanguage(): Language {
|
export function detectBrowserLanguage(): Language {
|
||||||
@@ -141,13 +138,11 @@ export function preloadBaseFont(): void {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const fontFace = createFontFace(baseConfig)
|
try {
|
||||||
fontFace.load()
|
const fontFace = createFontFace(baseConfig)
|
||||||
.then(() => {
|
document.fonts.add(fontFace)
|
||||||
document.fonts.add(fontFace)
|
loadedFonts.add(fontKey)
|
||||||
loadedFonts.add(fontKey)
|
} catch (error) {
|
||||||
})
|
console.warn('Failed to register base font:', error)
|
||||||
.catch((error) => {
|
}
|
||||||
console.warn('Failed to preload base font:', error)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user