refactor: Optimize font loading by removing unnecessary async/await and streamline language handling

This commit is contained in:
2026-02-06 18:51:00 +08:00
parent 8f5cfd8093
commit 27c8925f7d
2 changed files with 17 additions and 26 deletions

View File

@@ -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 })
} }

View File

@@ -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
} }
try {
const fontFace = createFontFace(baseConfig) const fontFace = createFontFace(baseConfig)
fontFace.load()
.then(() => {
document.fonts.add(fontFace) document.fonts.add(fontFace)
loadedFonts.add(fontKey) loadedFonts.add(fontKey)
}) } catch (error) {
.catch((error) => { console.warn('Failed to register base font:', error)
console.warn('Failed to preload base font:', error) }
})
} }