@arcblock/ux 2.13.16 → 2.13.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,14 +3,16 @@ import { type PaletteMode } from '@mui/material';
3
3
  import { LocaleProviderProps } from '../Locale/context';
4
4
  import { ThemeProviderProps } from '../Theme/theme-provider';
5
5
  import { type UserThemeOptions, type ThemeConfig } from '../Theme';
6
+ type Prefer = 'light' | 'dark' | 'system';
6
7
  export interface ConfigContextType {
7
8
  mode: PaletteMode;
9
+ prefer?: Prefer;
8
10
  themeOptions: UserThemeOptions;
9
11
  toggleMode: () => void;
10
12
  }
11
13
  export interface ConfigProviderProps extends Omit<LocaleProviderProps, 'translations'>, Omit<ThemeProviderProps, 'theme'> {
12
14
  children: ReactNode;
13
- prefer?: PaletteMode;
15
+ prefer?: Prefer;
14
16
  theme?: UserThemeOptions | ((config: ThemeConfig) => UserThemeOptions);
15
17
  disableBlockletTheme?: boolean;
16
18
  translations?: Record<string, any>;
@@ -24,6 +26,7 @@ export declare namespace ConfigProvider {
24
26
  }
25
27
  export declare function useConfig(): {
26
28
  mode: PaletteMode;
29
+ prefer?: Prefer;
27
30
  themeOptions: UserThemeOptions;
28
31
  toggleMode: () => void;
29
32
  locale: import("../type").Locale;
@@ -35,3 +38,4 @@ export declare function useConfig(): {
35
38
  }[];
36
39
  theme: import("@mui/material").Theme;
37
40
  };
41
+ export {};
@@ -6,6 +6,20 @@ import { ThemeProvider as EmotionThemeProvider } from '@emotion/react';
6
6
  import { LocaleProvider, useLocaleContext } from '../Locale/context';
7
7
  import ThemeProvider from '../Theme/theme-provider';
8
8
  import { createTheme, getDefaultThemePrefer, lazyThemeConfig, useTheme } from '../Theme';
9
+ const resolveMode = prefer => {
10
+ if (prefer) {
11
+ if (prefer === 'system') {
12
+ // 取系统默认
13
+ return getDefaultThemePrefer({
14
+ theme: {
15
+ prefer: 'system'
16
+ }
17
+ });
18
+ }
19
+ return prefer;
20
+ }
21
+ return getDefaultThemePrefer();
22
+ };
9
23
  const ConfigContext = /*#__PURE__*/createContext({});
10
24
  /**
11
25
  * 集中化配置
@@ -24,12 +38,7 @@ export function ConfigProvider({
24
38
  languages,
25
39
  onLoadingTranslation
26
40
  }) {
27
- const [mode, setMode] = useState(() => {
28
- if (prefer) {
29
- return prefer;
30
- }
31
- return getDefaultThemePrefer();
32
- });
41
+ const [mode, setMode] = useState(() => resolveMode(prefer));
33
42
  const _themeOptions = useMemo(() => {
34
43
  let result = {};
35
44
  const getThemeConfig = lazyThemeConfig(mode);
@@ -60,13 +69,14 @@ export function ConfigProvider({
60
69
  const config = useMemo(() => ({
61
70
  mode,
62
71
  themeOptions: _themeOptions,
63
- toggleMode
64
- }), [mode, _themeOptions, toggleMode]);
72
+ toggleMode,
73
+ prefer
74
+ }), [mode, prefer, _themeOptions, toggleMode]);
65
75
 
66
76
  // change prefer manually
67
77
  useEffect(() => {
68
78
  if (prefer) {
69
- setMode(prefer);
79
+ setMode(resolveMode(prefer));
70
80
  }
71
81
  }, [prefer, setMode]);
72
82
  return /*#__PURE__*/_jsx(ConfigContext.Provider, {
@@ -6,7 +6,8 @@ import { useConfig } from './config-provider';
6
6
  export default function ThemeModeToggle() {
7
7
  const {
8
8
  mode,
9
- toggleMode
9
+ toggleMode,
10
+ prefer
10
11
  } = useConfig();
11
12
  if (!toggleMode) {
12
13
  if (process.env.NODE_ENV !== 'production') {
@@ -14,8 +15,13 @@ export default function ThemeModeToggle() {
14
15
  }
15
16
  return null;
16
17
  }
17
- return /*#__PURE__*/_jsx(IconButton, {
18
- onClick: toggleMode,
19
- children: mode === 'light' ? /*#__PURE__*/_jsx(Brightness2OutlinedIcon, {}) : /*#__PURE__*/_jsx(LightModeOutlinedIcon, {})
20
- });
18
+
19
+ // 跟随系统才显示切换
20
+ if (prefer === 'system' || window.blocklet?.theme?.prefer === 'system') {
21
+ return /*#__PURE__*/_jsx(IconButton, {
22
+ onClick: toggleMode,
23
+ children: mode === 'light' ? /*#__PURE__*/_jsx(Brightness2OutlinedIcon, {}) : /*#__PURE__*/_jsx(LightModeOutlinedIcon, {})
24
+ });
25
+ }
26
+ return null;
21
27
  }
@@ -24,7 +24,10 @@ export default function UserInfo({
24
24
  return translate(translations, key, locale, 'en', data);
25
25
  });
26
26
  const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')), 64);
27
- const currentRole = useCreation(() => session.user?.passports?.find(item => item.name === session.user.role), [session?.user?.passports, session?.user?.role]);
27
+ const currentRole = useCreation(() => {
28
+ // FIXME: @zhanghan 感觉应该把 name 的判断去掉?
29
+ return session.user?.passports?.find(item => item.name === session.user.role || item.role === session.user.role);
30
+ }, [session?.user?.passports, session?.user?.role]);
28
31
  const hasBindWallet = useCreation(() => {
29
32
  return getWallet(session?.user);
30
33
  }, [session?.user]);
@@ -11,7 +11,11 @@ export declare function collectFontFamilies(obj?: {
11
11
  fontFamily?: string;
12
12
  }, fontSet?: Set<string>): Set<string>;
13
13
  export declare function loadFonts(fonts: string[]): Promise<boolean>;
14
- export declare function getDefaultThemePrefer(): PaletteMode;
14
+ export declare function getDefaultThemePrefer(meta?: {
15
+ theme: {
16
+ prefer: 'light' | 'dark' | 'system';
17
+ };
18
+ }): PaletteMode;
15
19
  export declare function createDefaultThemeOptions(mode?: PaletteMode): ThemeOptions;
16
20
  export interface UserThemeOptions extends ThemeOptions {
17
21
  disableBlockletTheme?: boolean;
@@ -63,8 +63,8 @@ export function loadFonts(fonts) {
63
63
  }
64
64
 
65
65
  // 获取默认主题偏好
66
- export function getDefaultThemePrefer() {
67
- const prefer = window.blocklet?.theme?.prefer;
66
+ export function getDefaultThemePrefer(meta) {
67
+ const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
68
68
  if (prefer === 'system') {
69
69
  // 本地缓存
70
70
  const localPrefer = localStorage.getItem(BLOCKLET_THEME_PREFER_KEY);
package/lib/type.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Theme, PaletteMode } from '@mui/material';
1
+ import type { Theme } from '@mui/material';
2
2
  import type { LiteralUnion } from 'type-fest';
3
3
 
4
4
  export type $TSFixMe = any;
@@ -26,7 +26,7 @@ export type Blocklet = {
26
26
  mode: string;
27
27
  tenantMode: 'single' | 'multiple';
28
28
  theme: {
29
- prefer?: PaletteMode | 'system';
29
+ prefer?: 'light' | 'dark' | 'system';
30
30
  light: Theme;
31
31
  dark: Theme;
32
32
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/ux",
3
- "version": "2.13.16",
3
+ "version": "2.13.18",
4
4
  "description": "Common used react components for arcblock products",
5
5
  "keywords": [
6
6
  "react",
@@ -71,14 +71,14 @@
71
71
  "react": ">=18.2.0",
72
72
  "react-router-dom": ">=6.22.3"
73
73
  },
74
- "gitHead": "ccf3113f17409f98eb34b43a18f532effef9bd9b",
74
+ "gitHead": "7bb88b45cd68de7eb079b590d0d73fd41d303917",
75
75
  "dependencies": {
76
76
  "@arcblock/did-motif": "^1.1.13",
77
- "@arcblock/icons": "^2.13.16",
78
- "@arcblock/nft-display": "^2.13.16",
79
- "@arcblock/react-hooks": "^2.13.16",
77
+ "@arcblock/icons": "^2.13.18",
78
+ "@arcblock/nft-display": "^2.13.18",
79
+ "@arcblock/react-hooks": "^2.13.18",
80
80
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
81
- "@blocklet/theme": "^2.13.16",
81
+ "@blocklet/theme": "^2.13.18",
82
82
  "@fontsource/roboto": "~5.1.1",
83
83
  "@fontsource/ubuntu-mono": "^5.0.18",
84
84
  "@iconify-icons/logos": "^1.2.36",
@@ -14,19 +14,34 @@ import {
14
14
  type ThemeConfig,
15
15
  } from '../Theme';
16
16
 
17
+ type Prefer = 'light' | 'dark' | 'system';
18
+
17
19
  export interface ConfigContextType {
18
20
  mode: PaletteMode;
21
+ prefer?: Prefer;
19
22
  themeOptions: UserThemeOptions;
20
23
  toggleMode: () => void;
21
24
  }
22
25
 
26
+ const resolveMode = (prefer?: Prefer): PaletteMode => {
27
+ if (prefer) {
28
+ if (prefer === 'system') {
29
+ // 取系统默认
30
+ return getDefaultThemePrefer({ theme: { prefer: 'system' } });
31
+ }
32
+ return prefer;
33
+ }
34
+
35
+ return getDefaultThemePrefer();
36
+ };
37
+
23
38
  const ConfigContext = createContext<ConfigContextType>({} as ConfigContextType);
24
39
 
25
40
  export interface ConfigProviderProps
26
41
  extends Omit<LocaleProviderProps, 'translations'>,
27
42
  Omit<ThemeProviderProps, 'theme'> {
28
43
  children: ReactNode;
29
- prefer?: PaletteMode;
44
+ prefer?: Prefer;
30
45
  theme?: UserThemeOptions | ((config: ThemeConfig) => UserThemeOptions);
31
46
  disableBlockletTheme?: boolean;
32
47
  translations?: Record<string, any>;
@@ -49,13 +64,7 @@ export function ConfigProvider({
49
64
  languages,
50
65
  onLoadingTranslation,
51
66
  }: ConfigProviderProps) {
52
- const [mode, setMode] = useState<PaletteMode>(() => {
53
- if (prefer) {
54
- return prefer;
55
- }
56
-
57
- return getDefaultThemePrefer();
58
- });
67
+ const [mode, setMode] = useState<PaletteMode>(() => resolveMode(prefer));
59
68
 
60
69
  const _themeOptions = useMemo(() => {
61
70
  let result: ThemeOptions = {};
@@ -90,14 +99,15 @@ export function ConfigProvider({
90
99
  mode,
91
100
  themeOptions: _themeOptions,
92
101
  toggleMode,
102
+ prefer,
93
103
  }),
94
- [mode, _themeOptions, toggleMode]
104
+ [mode, prefer, _themeOptions, toggleMode]
95
105
  );
96
106
 
97
107
  // change prefer manually
98
108
  useEffect(() => {
99
109
  if (prefer) {
100
- setMode(prefer);
110
+ setMode(resolveMode(prefer));
101
111
  }
102
112
  }, [prefer, setMode]);
103
113
 
@@ -4,7 +4,7 @@ import Brightness2OutlinedIcon from '@mui/icons-material/Brightness2Outlined';
4
4
  import { useConfig } from './config-provider';
5
5
 
6
6
  export default function ThemeModeToggle() {
7
- const { mode, toggleMode } = useConfig();
7
+ const { mode, toggleMode, prefer } = useConfig();
8
8
 
9
9
  if (!toggleMode) {
10
10
  if (process.env.NODE_ENV !== 'production') {
@@ -14,9 +14,14 @@ export default function ThemeModeToggle() {
14
14
  return null;
15
15
  }
16
16
 
17
- return (
18
- <IconButton onClick={toggleMode}>
19
- {mode === 'light' ? <Brightness2OutlinedIcon /> : <LightModeOutlinedIcon />}
20
- </IconButton>
21
- );
17
+ // 跟随系统才显示切换
18
+ if (prefer === 'system' || window.blocklet?.theme?.prefer === 'system') {
19
+ return (
20
+ <IconButton onClick={toggleMode}>
21
+ {mode === 'light' ? <Brightness2OutlinedIcon /> : <LightModeOutlinedIcon />}
22
+ </IconButton>
23
+ );
24
+ }
25
+
26
+ return null;
22
27
  }
@@ -36,10 +36,12 @@ export default function UserInfo({
36
36
  return translate(translations, key, locale, 'en', data);
37
37
  });
38
38
  const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')), 64);
39
- const currentRole = useCreation(
40
- () => session.user?.passports?.find((item: $TSFixMe) => item.name === session.user.role),
41
- [session?.user?.passports, session?.user?.role]
42
- );
39
+ const currentRole = useCreation(() => {
40
+ // FIXME: @zhanghan 感觉应该把 name 的判断去掉?
41
+ return session.user?.passports?.find(
42
+ (item: $TSFixMe) => item.name === session.user.role || item.role === session.user.role
43
+ );
44
+ }, [session?.user?.passports, session?.user?.role]);
43
45
 
44
46
  const hasBindWallet = useCreation(() => {
45
47
  return getWallet(session?.user);
@@ -6,7 +6,6 @@ import { deepmerge } from '@mui/utils';
6
6
  import pick from 'lodash/pick';
7
7
  import webfontloader from 'webfontloader';
8
8
  import { BLOCKLET_THEME_LIGHT, BLOCKLET_THEME_DARK, DEFAULT_FONTS, BLOCKLET_THEME_PREFER_KEY } from '@blocklet/theme';
9
-
10
9
  import { cleanedObj, deepmergeAll } from '../Util';
11
10
 
12
11
  // 默认只加载最基本的 roboto latin 字体
@@ -73,8 +72,8 @@ export function loadFonts(fonts: string[]) {
73
72
  }
74
73
 
75
74
  // 获取默认主题偏好
76
- export function getDefaultThemePrefer(): PaletteMode {
77
- const prefer = window.blocklet?.theme?.prefer;
75
+ export function getDefaultThemePrefer(meta?: { theme: { prefer: 'light' | 'dark' | 'system' } }): PaletteMode {
76
+ const prefer = Object.assign({}, window.blocklet, meta).theme?.prefer;
78
77
 
79
78
  if (prefer === 'system') {
80
79
  // 本地缓存
package/src/type.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Theme, PaletteMode } from '@mui/material';
1
+ import type { Theme } from '@mui/material';
2
2
  import type { LiteralUnion } from 'type-fest';
3
3
 
4
4
  export type $TSFixMe = any;
@@ -26,7 +26,7 @@ export type Blocklet = {
26
26
  mode: string;
27
27
  tenantMode: 'single' | 'multiple';
28
28
  theme: {
29
- prefer?: PaletteMode | 'system';
29
+ prefer?: 'light' | 'dark' | 'system';
30
30
  light: Theme;
31
31
  dark: Theme;
32
32
  };