diff --git a/src/composables/useDark.ts b/src/composables/useDark.ts index 8e1494a4..47d6c568 100644 --- a/src/composables/useDark.ts +++ b/src/composables/useDark.ts @@ -1,6 +1,9 @@ import { usePreferredDark } from '@vueuse/core' import { settings } from '~/logic' +import { runWhenIdle } from '~/utils/lazyLoad' +import { setCookie } from '~/utils/main' +import { executeTimes } from '~/utils/timer' export function useDark() { const isPreferredDark = usePreferredDark() @@ -12,6 +15,7 @@ export function useDark() { return currentSystemColorScheme.value }) const isDark = computed(() => currentAppColorScheme.value === 'dark') + let themeChangeTimer: NodeJS.Timeout | null = null // Watch for changes in the 'settings.value.theme' variable and add the 'dark' class to the 'mainApp' element // to prevent some Unocss dark-specific styles from failing to take effect @@ -23,18 +27,46 @@ export function useDark() { { immediate: true }, ) + onMounted(() => { + // Because some shadow dom may not be loaded when the page has already loaded, we need to wait until the page is idle + runWhenIdle(() => { + if (isDark.value) { + setCookie('theme_style', 'dark', 365 * 10) + // TODO: find a better way implement this + themeChangeTimer = executeTimes(() => { + window.dispatchEvent(new CustomEvent('global.themeChange', { detail: 'dark' })) + }, 10, 500) + } + else { + setCookie('theme_style', 'light', 365 * 10) + themeChangeTimer = executeTimes(() => { + window.dispatchEvent(new CustomEvent('global.themeChange', { detail: 'light' })) + }, 10, 500) + } + }) + }) + /** * Watch for changes in the 'settings.value.theme' variable and add the 'dark' class to the 'mainApp' element * to prevent some Unocss dark-specific styles from failing to take effect */ function setAppAppearance() { + if (themeChangeTimer) + clearInterval(themeChangeTimer) + if (isDark.value) { document.querySelector('#bewly')?.classList.add('dark') document.documentElement.classList.add('dark') + + setCookie('theme_style', 'dark', 365 * 10) + window.dispatchEvent(new CustomEvent('global.themeChange', { detail: 'dark' })) } else { document.querySelector('#bewly')?.classList.remove('dark') document.documentElement.classList.remove('dark') + + setCookie('theme_style', 'light', 365 * 10) + window.dispatchEvent(new CustomEvent('global.themeChange', { detail: 'light' })) } } diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 0417431c..6455bb7e 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -743,4 +743,6 @@ --Si8: #c8ced6; --Si9: #dce0e5; --Si10: #f0f2f4; + + --bg1_rgb: #1d1628; } diff --git a/src/utils/timer.ts b/src/utils/timer.ts new file mode 100644 index 00000000..22b34941 --- /dev/null +++ b/src/utils/timer.ts @@ -0,0 +1,14 @@ +export function executeTimes(fn: () => void | Promise, times: number, interval: number = 1000) { + let count = 0 + let timer: NodeJS.Timeout + // eslint-disable-next-line prefer-const + timer = setInterval(async () => { + await fn() + count++ + if (count >= times) { + clearInterval(timer) + } + }, interval) + + return timer +}