@arcblock/ux 2.12.22 → 2.12.24

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.
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Children, cloneElement, useEffect, useRef, forwardRef, useLayoutEffect, isValidElement } from 'react';
3
+ import { ClickAwayListener } from '@mui/material';
3
4
  import clsx from 'clsx';
4
5
  import { MoreHoriz as MoreHorizIcon, ExpandMore as ExpandMoreIcon, Menu as MenuIcon } from '@mui/icons-material';
5
6
  import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
@@ -300,8 +301,8 @@ export const Sub = /*#__PURE__*/forwardRef(({
300
301
  'navmenu-item--inline': isInlineMode
301
302
  }, rest.className);
302
303
 
303
- // inline mode 时使用 click 事件控制收缩/伸展子菜单
304
- const props = isInlineMode ? {
304
+ // 统一使用 click 事件控制收缩/伸展子菜单
305
+ const props = {
305
306
  onClick: () => {
306
307
  if (openedIds?.includes(id)) {
307
308
  close?.(id);
@@ -309,15 +310,12 @@ export const Sub = /*#__PURE__*/forwardRef(({
309
310
  open?.(id);
310
311
  }
311
312
  }
312
- } : {
313
- onMouseEnter: () => open?.(id),
314
- onMouseLeave: () => close?.(id)
315
313
  };
316
314
  // inline mode, 避免点击子菜单项时触发父菜单的 open/close
317
315
  const containerProps = isInlineMode ? {
318
316
  onClick: e => e.stopPropagation()
319
317
  } : {};
320
- return /*#__PURE__*/_jsxs(NavMenuSub, {
318
+ const menu = /*#__PURE__*/_jsxs(NavMenuSub, {
321
319
  ...rest,
322
320
  className: classes,
323
321
  ...props,
@@ -351,6 +349,13 @@ export const Sub = /*#__PURE__*/forwardRef(({
351
349
  })
352
350
  })]
353
351
  });
352
+ if (!isInlineMode) {
353
+ return menu;
354
+ }
355
+ return /*#__PURE__*/_jsx(ClickAwayListener, {
356
+ onClickAway: () => close?.(id),
357
+ children: menu
358
+ });
354
359
  });
355
360
  Sub.displayName = 'NavMenu.Sub';
356
361
  NavMenu.Item = Item;
@@ -162,13 +162,6 @@ export default function PhoneInput({
162
162
  sx: mergeSx({
163
163
  '& .MuiInputBase-input': {
164
164
  padding: 1
165
- },
166
- '& .MuiFormHelperText-root': {
167
- position: 'absolute',
168
- bottom: 0,
169
- left: 0,
170
- transform: 'translateY(100%)',
171
- margin: 0
172
165
  }
173
166
  }, props.sx // 这里传入的可能是一个数组或一个对象
174
167
  ),
@@ -1,7 +1,9 @@
1
+ import { type BoxProps } from '@mui/material';
1
2
  import type { Locale } from '../type';
2
- export interface SessionBlockletProps {
3
+ export interface SessionBlockletProps extends Omit<BoxProps, 'onClick' | 'onMouseEnter' | 'onMouseLeave'> {
3
4
  session: Record<string, any>;
4
5
  locale?: Locale;
5
6
  size?: number;
7
+ popperType?: 'hover' | 'click';
6
8
  }
7
- export default function SessionBlocklet({ session, locale, size }: SessionBlockletProps): import("react/jsx-runtime").JSX.Element | null;
9
+ export default function SessionBlocklet({ session, locale, size, popperType, sx, ...rest }: SessionBlockletProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef } from 'react';
3
3
  import { Box, ClickAwayListener, Fade, IconButton, List, ListItem, ListItemButton, Paper, Popper, Typography } from '@mui/material';
4
4
  import { Icon } from '@iconify/react';
@@ -13,7 +13,10 @@ import { getTranslation } from '../Util';
13
13
  export default function SessionBlocklet({
14
14
  session,
15
15
  locale = 'zh',
16
- size = 24
16
+ size = 24,
17
+ popperType = 'click',
18
+ sx,
19
+ ...rest
17
20
  }) {
18
21
  const blocklet = window?.blocklet || {};
19
22
  const sessionMenuList = (blocklet.navigation || []
@@ -37,14 +40,27 @@ export default function SessionBlocklet({
37
40
  const onTogglePopper = useMemoizedFn((value = !currentState.open) => {
38
41
  currentState.open = value;
39
42
  });
43
+ const handleEventProps = popperType === 'hover' ? {
44
+ onMouseEnter: () => onTogglePopper(true),
45
+ onMouseLeave: () => onTogglePopper(false)
46
+ } : {
47
+ onClick: () => onTogglePopper()
48
+ };
40
49
  if (sessionMenuList.length === 0 || !session?.user) {
41
50
  return null;
42
51
  }
43
- return /*#__PURE__*/_jsxs(_Fragment, {
52
+ return /*#__PURE__*/_jsxs(Box, {
53
+ sx: {
54
+ display: 'inline-flex',
55
+ alignItems: 'center',
56
+ justifyContent: 'center',
57
+ ...sx
58
+ },
59
+ ...rest,
60
+ ...handleEventProps,
44
61
  children: [/*#__PURE__*/_jsx(IconButton, {
45
62
  size: "medium",
46
63
  ref: popperAnchorRef,
47
- onClick: () => onTogglePopper(),
48
64
  children: /*#__PURE__*/_jsx(Icon, {
49
65
  icon: DashboardOutlineRoundedIcon,
50
66
  fontSize: size,
@@ -1,10 +1,12 @@
1
+ import { type BoxProps } from '@mui/material';
1
2
  import type { Locale, Session } from '../../type';
2
- export interface LoggedInProps {
3
+ export interface LoggedInProps extends Omit<BoxProps, 'onClick' | 'onMouseEnter' | 'onMouseLeave'> {
3
4
  session: Session;
4
5
  dark?: false | true;
5
6
  onBindWallet?: () => void;
6
7
  isBlocklet?: true | false;
7
8
  locale?: Locale;
8
9
  size?: number;
10
+ popperType?: 'hover' | 'click';
9
11
  }
10
- export default function LoggedIn({ session, dark, onBindWallet, isBlocklet, locale, size, }: LoggedInProps): import("react/jsx-runtime").JSX.Element;
12
+ export default function LoggedIn({ session, dark, onBindWallet, isBlocklet, locale, size, popperType, sx, ...rest }: LoggedInProps): import("react/jsx-runtime").JSX.Element;
@@ -30,7 +30,10 @@ export default function LoggedIn({
30
30
  onBindWallet = noop,
31
31
  isBlocklet = true,
32
32
  locale = 'en',
33
- size = 24
33
+ size = 24,
34
+ popperType = 'click',
35
+ sx,
36
+ ...rest
34
37
  }) {
35
38
  const t = useMemoizedFn((key, data = {}) => {
36
39
  return translate(translations, key, locale, 'en', data);
@@ -45,6 +48,12 @@ export default function LoggedIn({
45
48
  const onTogglePopper = useMemoizedFn((value = !currentState.open) => {
46
49
  currentState.open = value;
47
50
  });
51
+ const handleEventProps = popperType === 'hover' ? {
52
+ onMouseEnter: () => onTogglePopper(true),
53
+ onMouseLeave: () => onTogglePopper(false)
54
+ } : {
55
+ onClick: () => onTogglePopper()
56
+ };
48
57
 
49
58
  // base64 img maybe have some blank char, need encodeURIComponent to transform it
50
59
  const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')));
@@ -97,10 +106,17 @@ export default function LoggedIn({
97
106
  Copy(link);
98
107
  Toast.success(t('inviteCopied'));
99
108
  });
100
- return /*#__PURE__*/_jsxs(_Fragment, {
109
+ return /*#__PURE__*/_jsxs(Box, {
110
+ sx: {
111
+ display: 'inline-flex',
112
+ alignItems: 'center',
113
+ justifyContent: 'center',
114
+ ...sx
115
+ },
116
+ ...rest,
117
+ ...handleEventProps,
101
118
  children: [/*#__PURE__*/_jsx(IconButton, {
102
119
  ref: popperAnchorRef,
103
- onClick: () => onTogglePopper(),
104
120
  size: "medium",
105
121
  "data-cy": "sessionManager-logout-popup",
106
122
  className: "arc-session-user-logged-in",
@@ -129,7 +145,7 @@ export default function LoggedIn({
129
145
  onClickAway: e => {
130
146
  e.preventDefault();
131
147
  e.stopPropagation();
132
- onTogglePopper(false);
148
+ currentState.open = false;
133
149
  },
134
150
  children: /*#__PURE__*/_jsx(Fade, {
135
151
  ...TransitionProps,
@@ -4,5 +4,6 @@ export interface SessionUserProps {
4
4
  onBindWallet?: () => void;
5
5
  locale?: Locale;
6
6
  size?: number;
7
+ popperType?: 'hover' | 'click';
7
8
  }
8
- export default function SessionUser({ session, onBindWallet, locale, size }: SessionUserProps): import("react/jsx-runtime").JSX.Element;
9
+ export default function SessionUser({ session, onBindWallet, locale, size, popperType, }: SessionUserProps): import("react/jsx-runtime").JSX.Element;
@@ -7,7 +7,8 @@ export default function SessionUser({
7
7
  session,
8
8
  onBindWallet = noop,
9
9
  locale = 'en',
10
- size = 24
10
+ size = 24,
11
+ popperType = 'click'
11
12
  }) {
12
13
  const isBlocklet = useCreation(() => {
13
14
  return !!globalThis?.blocklet;
@@ -18,7 +19,8 @@ export default function SessionUser({
18
19
  session: session,
19
20
  onBindWallet: onBindWallet,
20
21
  locale: locale,
21
- size: size
22
+ size: size,
23
+ popperType: popperType
22
24
  });
23
25
  }
24
26
  return /*#__PURE__*/_jsx(UnLogin, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/ux",
3
- "version": "2.12.22",
3
+ "version": "2.12.24",
4
4
  "description": "Common used react components for arcblock products",
5
5
  "keywords": [
6
6
  "react",
@@ -68,12 +68,12 @@
68
68
  "react": ">=18.2.0",
69
69
  "react-router-dom": ">=6.22.3"
70
70
  },
71
- "gitHead": "f6f7c7949553c8c3e66516f13f768264f480b5d6",
71
+ "gitHead": "1b60545e5fe97a4efa0515e7b6c02439b5dac919",
72
72
  "dependencies": {
73
73
  "@arcblock/did-motif": "^1.1.13",
74
- "@arcblock/icons": "^2.12.22",
75
- "@arcblock/nft-display": "^2.12.22",
76
- "@arcblock/react-hooks": "^2.12.22",
74
+ "@arcblock/icons": "^2.12.24",
75
+ "@arcblock/nft-display": "^2.12.24",
76
+ "@arcblock/react-hooks": "^2.12.24",
77
77
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
78
78
  "@fontsource/inter": "^5.0.16",
79
79
  "@fontsource/ubuntu-mono": "^5.0.18",
@@ -1,5 +1,5 @@
1
1
  import { Children, cloneElement, useEffect, useRef, forwardRef, useLayoutEffect, isValidElement } from 'react';
2
- import { type SxProps } from '@mui/material';
2
+ import { ClickAwayListener, type SxProps } from '@mui/material';
3
3
  import clsx from 'clsx';
4
4
  import { MoreHoriz as MoreHorizIcon, ExpandMore as ExpandMoreIcon, Menu as MenuIcon } from '@mui/icons-material';
5
5
  import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
@@ -371,29 +371,19 @@ export const Sub = forwardRef<HTMLLIElement, SubProps>(
371
371
  rest.className
372
372
  );
373
373
 
374
- // inline mode 时使用 click 事件控制收缩/伸展子菜单
375
- const props = isInlineMode
376
- ? {
377
- onClick: () => {
378
- if (openedIds?.includes(id)) {
379
- close?.(id);
380
- } else {
381
- open?.(id);
382
- }
383
- },
374
+ // 统一使用 click 事件控制收缩/伸展子菜单
375
+ const props = {
376
+ onClick: () => {
377
+ if (openedIds?.includes(id)) {
378
+ close?.(id);
379
+ } else {
380
+ open?.(id);
384
381
  }
385
- : {
386
- onMouseEnter: () => open?.(id),
387
- onMouseLeave: () => close?.(id),
388
- };
382
+ },
383
+ };
389
384
  // inline mode, 避免点击子菜单项时触发父菜单的 open/close
390
- const containerProps = isInlineMode
391
- ? {
392
- onClick: (e: React.MouseEvent) => e.stopPropagation(),
393
- }
394
- : {};
395
-
396
- return (
385
+ const containerProps = isInlineMode ? { onClick: (e: React.MouseEvent) => e.stopPropagation() } : {};
386
+ const menu = (
397
387
  <NavMenuSub {...rest} className={classes} {...props} ref={ref} $activeTextColor={activeTextColor}>
398
388
  {icon && <span className="navmenu-item__icon">{icon}</span>}
399
389
  <div className="navmenu-item__content">
@@ -414,6 +404,12 @@ export const Sub = forwardRef<HTMLLIElement, SubProps>(
414
404
  </SubContainer>
415
405
  </NavMenuSub>
416
406
  );
407
+
408
+ if (!isInlineMode) {
409
+ return menu;
410
+ }
411
+
412
+ return <ClickAwayListener onClickAway={() => close?.(id)}>{menu}</ClickAwayListener>;
417
413
  }
418
414
  );
419
415
  Sub.displayName = 'NavMenu.Sub';
@@ -164,13 +164,6 @@ export default function PhoneInput({
164
164
  '& .MuiInputBase-input': {
165
165
  padding: 1,
166
166
  },
167
- '& .MuiFormHelperText-root': {
168
- position: 'absolute',
169
- bottom: 0,
170
- left: 0,
171
- transform: 'translateY(100%)',
172
- margin: 0,
173
- },
174
167
  },
175
168
  props.sx as any // 这里传入的可能是一个数组或一个对象
176
169
  )}
@@ -1,6 +1,7 @@
1
1
  import { useRef } from 'react';
2
2
  import {
3
3
  Box,
4
+ type BoxProps,
4
5
  ClickAwayListener,
5
6
  Fade,
6
7
  IconButton,
@@ -23,13 +24,21 @@ import SessionPermission from '../SessionPermission';
23
24
  import { getTranslation } from '../Util';
24
25
  import type { Locale } from '../type';
25
26
 
26
- export interface SessionBlockletProps {
27
+ export interface SessionBlockletProps extends Omit<BoxProps, 'onClick' | 'onMouseEnter' | 'onMouseLeave'> {
27
28
  session: Record<string, any>;
28
29
  locale?: Locale;
29
30
  size?: number;
31
+ popperType?: 'hover' | 'click';
30
32
  }
31
33
 
32
- export default function SessionBlocklet({ session, locale = 'zh', size = 24 }: SessionBlockletProps) {
34
+ export default function SessionBlocklet({
35
+ session,
36
+ locale = 'zh',
37
+ size = 24,
38
+ popperType = 'click',
39
+ sx,
40
+ ...rest
41
+ }: SessionBlockletProps) {
33
42
  const blocklet = window?.blocklet || {};
34
43
  const sessionMenuList = (blocklet.navigation || [])
35
44
  // HACK 过滤掉默认插入的 /sessionManager 菜单
@@ -54,14 +63,21 @@ export default function SessionBlocklet({ session, locale = 'zh', size = 24 }: S
54
63
  const onTogglePopper = useMemoizedFn((value = !currentState.open) => {
55
64
  currentState.open = value;
56
65
  });
66
+ const handleEventProps =
67
+ popperType === 'hover'
68
+ ? { onMouseEnter: () => onTogglePopper(true), onMouseLeave: () => onTogglePopper(false) }
69
+ : { onClick: () => onTogglePopper() };
57
70
 
58
71
  if (sessionMenuList.length === 0 || !session?.user) {
59
72
  return null;
60
73
  }
61
74
 
62
75
  return (
63
- <>
64
- <IconButton size="medium" ref={popperAnchorRef} onClick={() => onTogglePopper()}>
76
+ <Box
77
+ sx={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', ...sx }}
78
+ {...rest}
79
+ {...handleEventProps}>
80
+ <IconButton size="medium" ref={popperAnchorRef}>
65
81
  <Icon icon={DashboardOutlineRoundedIcon} fontSize={size} style={{ transform: 'scale(1.08)' }} />
66
82
  </IconButton>
67
83
  <Popper
@@ -172,6 +188,6 @@ export default function SessionBlocklet({ session, locale = 'zh', size = 24 }: S
172
188
  </ClickAwayListener>
173
189
  )}
174
190
  </Popper>
175
- </>
191
+ </Box>
176
192
  );
177
193
  }
@@ -38,13 +38,14 @@ const getInviteLink = (inviter: string) => {
38
38
  return url.toString();
39
39
  };
40
40
 
41
- export interface LoggedInProps {
41
+ export interface LoggedInProps extends Omit<BoxProps, 'onClick' | 'onMouseEnter' | 'onMouseLeave'> {
42
42
  session: Session;
43
43
  dark?: false | true;
44
44
  onBindWallet?: () => void;
45
45
  isBlocklet?: true | false;
46
46
  locale?: Locale;
47
47
  size?: number;
48
+ popperType?: 'hover' | 'click';
48
49
  }
49
50
 
50
51
  export default function LoggedIn({
@@ -54,6 +55,9 @@ export default function LoggedIn({
54
55
  isBlocklet = true,
55
56
  locale = 'en',
56
57
  size = 24,
58
+ popperType = 'click',
59
+ sx,
60
+ ...rest
57
61
  }: LoggedInProps) {
58
62
  const t = useMemoizedFn((key, data = {}) => {
59
63
  return translate(translations, key, locale, 'en', data);
@@ -68,6 +72,10 @@ export default function LoggedIn({
68
72
  const onTogglePopper = useMemoizedFn((value = !currentState.open) => {
69
73
  currentState.open = value;
70
74
  });
75
+ const handleEventProps =
76
+ popperType === 'hover'
77
+ ? { onMouseEnter: () => onTogglePopper(true), onMouseLeave: () => onTogglePopper(false) }
78
+ : { onClick: () => onTogglePopper() };
71
79
 
72
80
  // base64 img maybe have some blank char, need encodeURIComponent to transform it
73
81
  const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')));
@@ -127,10 +135,12 @@ export default function LoggedIn({
127
135
  });
128
136
 
129
137
  return (
130
- <>
138
+ <Box
139
+ sx={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', ...sx }}
140
+ {...rest}
141
+ {...handleEventProps}>
131
142
  <IconButton
132
143
  ref={popperAnchorRef}
133
- onClick={() => onTogglePopper()}
134
144
  size="medium"
135
145
  data-cy="sessionManager-logout-popup"
136
146
  className="arc-session-user-logged-in"
@@ -151,7 +161,7 @@ export default function LoggedIn({
151
161
  onClickAway={(e) => {
152
162
  e.preventDefault();
153
163
  e.stopPropagation();
154
- onTogglePopper(false);
164
+ currentState.open = false;
155
165
  }}>
156
166
  <Fade {...TransitionProps} timeout={350}>
157
167
  <Paper
@@ -220,7 +230,7 @@ export default function LoggedIn({
220
230
  </ClickAwayListener>
221
231
  )}
222
232
  </Popper>
223
- </>
233
+ </Box>
224
234
  );
225
235
  }
226
236
 
@@ -10,16 +10,30 @@ export interface SessionUserProps {
10
10
  onBindWallet?: () => void;
11
11
  locale?: Locale;
12
12
  size?: number;
13
+ popperType?: 'hover' | 'click';
13
14
  }
14
15
 
15
- export default function SessionUser({ session, onBindWallet = noop, locale = 'en', size = 24 }: SessionUserProps) {
16
+ export default function SessionUser({
17
+ session,
18
+ onBindWallet = noop,
19
+ locale = 'en',
20
+ size = 24,
21
+ popperType = 'click',
22
+ }: SessionUserProps) {
16
23
  const isBlocklet = useCreation(() => {
17
24
  return !!globalThis?.blocklet;
18
25
  }, []);
19
26
 
20
27
  if (session.user) {
21
28
  return (
22
- <LoggedIn isBlocklet={isBlocklet} session={session} onBindWallet={onBindWallet} locale={locale} size={size} />
29
+ <LoggedIn
30
+ isBlocklet={isBlocklet}
31
+ session={session}
32
+ onBindWallet={onBindWallet}
33
+ locale={locale}
34
+ size={size}
35
+ popperType={popperType}
36
+ />
23
37
  );
24
38
  }
25
39
  return <UnLogin session={session} locale={locale} size={size} />;