|
@@ -1,4 +1,4 @@
|
|
|
-import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
|
|
|
|
|
+import { createContext, useCallback, useContext, useLayoutEffect, useMemo, useState } from 'react';
|
|
|
import type { ReactNode } from 'react';
|
|
import type { ReactNode } from 'react';
|
|
|
import { theme as antdTheme } from 'antd';
|
|
import { theme as antdTheme } from 'antd';
|
|
|
import type { ThemeConfig } from 'antd';
|
|
import type { ThemeConfig } from 'antd';
|
|
@@ -13,14 +13,18 @@ function readBool(key: string, fallback: boolean): boolean {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function applyDom(isDark: boolean, isUltra: boolean) {
|
|
function applyDom(isDark: boolean, isUltra: boolean) {
|
|
|
- document.body.setAttribute('class', isDark ? 'dark' : 'light');
|
|
|
|
|
|
|
+ document.body.classList.remove('dark', 'light');
|
|
|
|
|
+ document.body.classList.add(isDark ? 'dark' : 'light');
|
|
|
if (isUltra) {
|
|
if (isUltra) {
|
|
|
document.documentElement.setAttribute('data-theme', 'ultra-dark');
|
|
document.documentElement.setAttribute('data-theme', 'ultra-dark');
|
|
|
} else {
|
|
} else {
|
|
|
document.documentElement.removeAttribute('data-theme');
|
|
document.documentElement.removeAttribute('data-theme');
|
|
|
}
|
|
}
|
|
|
const msg = document.getElementById('message');
|
|
const msg = document.getElementById('message');
|
|
|
- if (msg) msg.className = isDark ? 'dark' : 'light';
|
|
|
|
|
|
|
+ if (msg) {
|
|
|
|
|
+ msg.classList.remove('dark', 'light');
|
|
|
|
|
+ msg.classList.add(isDark ? 'dark' : 'light');
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// module load so the document is in the right theme before React mounts.
|
|
// module load so the document is in the right theme before React mounts.
|
|
@@ -158,7 +162,7 @@ export function ThemeProvider({ children }: { children: ReactNode }) {
|
|
|
const [isDark, setIsDark] = useState<boolean>(initialDark);
|
|
const [isDark, setIsDark] = useState<boolean>(initialDark);
|
|
|
const [isUltra, setIsUltra] = useState<boolean>(initialUltra);
|
|
const [isUltra, setIsUltra] = useState<boolean>(initialUltra);
|
|
|
|
|
|
|
|
- useEffect(() => {
|
|
|
|
|
|
|
+ useLayoutEffect(() => {
|
|
|
applyDom(isDark, isUltra);
|
|
applyDom(isDark, isUltra);
|
|
|
localStorage.setItem(STORAGE_DARK, String(isDark));
|
|
localStorage.setItem(STORAGE_DARK, String(isDark));
|
|
|
localStorage.setItem(STORAGE_ULTRA, String(isUltra));
|
|
localStorage.setItem(STORAGE_ULTRA, String(isUltra));
|