mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-22 19:52:14 +08:00
* chore(frontend): expand Knip reports * chore: remove unused Mihomo changelog sync script * refactor: remove unused value exports * refactor: remove unused type exports * refactor: remove circular route dependencies * chore(frontend): move Knip scope to config * chore(i18n): remove stale portable update message
107 lines
2.7 KiB
TypeScript
107 lines
2.7 KiB
TypeScript
import { getVergeConfig } from './cmds'
|
|
import {
|
|
cacheLanguage,
|
|
getCachedLanguage,
|
|
initializeLanguage,
|
|
resolveLanguage,
|
|
} from './i18n'
|
|
|
|
let vergeConfigCache: IVergeConfig | null | undefined
|
|
|
|
const detectSystemTheme = (): 'light' | 'dark' => {
|
|
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
|
|
return 'light'
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
? 'dark'
|
|
: 'light'
|
|
}
|
|
|
|
const getThemeModeFromWindow = (): IVergeConfig['theme_mode'] | undefined => {
|
|
if (typeof window === 'undefined') return undefined
|
|
const mode = (
|
|
window as typeof window & {
|
|
__VERGE_INITIAL_THEME_MODE?: unknown
|
|
}
|
|
).__VERGE_INITIAL_THEME_MODE
|
|
if (mode === 'light' || mode === 'dark' || mode === 'system') {
|
|
return mode
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
export const resolveThemeMode = (
|
|
vergeConfig?: IVergeConfig | null,
|
|
): 'light' | 'dark' => {
|
|
const initialMode = vergeConfig?.theme_mode ?? getThemeModeFromWindow()
|
|
if (initialMode === 'dark' || initialMode === 'light') {
|
|
return initialMode
|
|
}
|
|
return detectSystemTheme()
|
|
}
|
|
|
|
export const setPreloadConfig = (config: IVergeConfig | null) => {
|
|
vergeConfigCache = config
|
|
}
|
|
|
|
export const getPreloadConfig = () => vergeConfigCache
|
|
|
|
const preloadConfig = async () => {
|
|
try {
|
|
const config = await getVergeConfig()
|
|
setPreloadConfig(config)
|
|
return config
|
|
} catch (error) {
|
|
console.warn('[preload.ts] Failed to read Verge config:', error)
|
|
setPreloadConfig(null)
|
|
return null
|
|
}
|
|
}
|
|
|
|
const preloadLanguage = async (
|
|
vergeConfig?: IVergeConfig | null,
|
|
loadConfig: () => Promise<IVergeConfig | null> = preloadConfig,
|
|
) => {
|
|
const cachedLanguage = getCachedLanguage()
|
|
if (cachedLanguage) {
|
|
return cachedLanguage
|
|
}
|
|
|
|
let resolvedConfig = vergeConfig
|
|
|
|
if (resolvedConfig === undefined) {
|
|
try {
|
|
resolvedConfig = await loadConfig()
|
|
} catch (error) {
|
|
console.warn(
|
|
'[preload.ts] Failed to read language from Verge config:',
|
|
error,
|
|
)
|
|
resolvedConfig = null
|
|
}
|
|
}
|
|
|
|
const languageFromConfig = resolvedConfig?.language
|
|
if (languageFromConfig) {
|
|
const resolved = resolveLanguage(languageFromConfig)
|
|
cacheLanguage(resolved)
|
|
return resolved
|
|
}
|
|
|
|
const browserLanguage = resolveLanguage(
|
|
typeof navigator !== 'undefined' ? navigator.language : undefined,
|
|
)
|
|
cacheLanguage(browserLanguage)
|
|
return browserLanguage
|
|
}
|
|
|
|
export const preloadAppData = async () => {
|
|
const configPromise = preloadConfig()
|
|
const initialLanguage = await preloadLanguage(undefined, () => configPromise)
|
|
const [config] = await Promise.all([
|
|
configPromise,
|
|
initializeLanguage(initialLanguage),
|
|
])
|
|
const initialThemeMode = resolveThemeMode(config)
|
|
return { initialThemeMode }
|
|
}
|