@blocklet/ui-react 2.9.52 → 2.9.53

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.
Files changed (104) hide show
  1. package/es/@types/index.d.ts +3 -5
  2. package/es/Dashboard/index.d.ts +5 -6
  3. package/es/Dashboard/index.js +5 -5
  4. package/es/Footer/index.js +2 -2
  5. package/es/Header/index.js +5 -5
  6. package/es/UserCenter/components/notification.js +1 -1
  7. package/es/UserCenter/components/passport.js +1 -2
  8. package/es/UserCenter/components/privacy.js +1 -1
  9. package/es/UserCenter/components/settings.js +9 -1
  10. package/es/UserCenter/components/storage/connect-to.d.ts +1 -1
  11. package/es/UserCenter/components/storage/connect-to.js +9 -3
  12. package/es/UserCenter/components/storage/delete.d.ts +1 -1
  13. package/es/UserCenter/components/storage/delete.js +4 -1
  14. package/es/UserCenter/components/storage/item.js +1 -1
  15. package/es/UserCenter/components/user-center.d.ts +2 -2
  16. package/es/UserCenter/components/user-center.js +15 -6
  17. package/es/UserCenter/libs/locales.d.ts +2 -0
  18. package/es/UserCenter/libs/locales.js +2 -0
  19. package/es/UserSessions/components/user-session-info.d.ts +6 -0
  20. package/es/UserSessions/components/user-session-info.js +58 -0
  21. package/es/UserSessions/components/user-sessions.d.ts +9 -0
  22. package/es/UserSessions/components/user-sessions.js +255 -0
  23. package/es/UserSessions/index.d.ts +1 -0
  24. package/es/UserSessions/index.js +1 -0
  25. package/es/UserSessions/libs/locales.d.ts +52 -0
  26. package/es/UserSessions/libs/locales.js +52 -0
  27. package/es/UserSessions/libs/utils.d.ts +2 -0
  28. package/es/UserSessions/libs/utils.js +73 -0
  29. package/es/blocklets.js +6 -6
  30. package/es/common/header-addons.d.ts +3 -4
  31. package/es/common/header-addons.js +4 -4
  32. package/es/contexts/config-user-space.js +2 -2
  33. package/es/index.d.ts +1 -0
  34. package/es/index.js +1 -0
  35. package/es/types.d.ts +2 -2
  36. package/es/types.js +2 -2
  37. package/lib/@types/index.d.ts +3 -5
  38. package/lib/Dashboard/index.d.ts +5 -6
  39. package/lib/Dashboard/index.js +4 -4
  40. package/lib/Footer/index.js +1 -1
  41. package/lib/Header/index.js +4 -4
  42. package/lib/UserCenter/components/notification.js +1 -1
  43. package/lib/UserCenter/components/passport.js +1 -2
  44. package/lib/UserCenter/components/privacy.js +1 -1
  45. package/lib/UserCenter/components/settings.js +10 -1
  46. package/lib/UserCenter/components/storage/connect-to.d.ts +1 -1
  47. package/lib/UserCenter/components/storage/connect-to.js +3 -3
  48. package/lib/UserCenter/components/storage/delete.d.ts +1 -1
  49. package/lib/UserCenter/components/storage/item.js +1 -1
  50. package/lib/UserCenter/components/user-center.d.ts +2 -2
  51. package/lib/UserCenter/components/user-center.js +20 -10
  52. package/lib/UserCenter/libs/locales.d.ts +2 -0
  53. package/lib/UserCenter/libs/locales.js +2 -0
  54. package/lib/UserSessions/components/user-session-info.d.ts +6 -0
  55. package/lib/UserSessions/components/user-session-info.js +68 -0
  56. package/lib/UserSessions/components/user-sessions.d.ts +9 -0
  57. package/lib/UserSessions/components/user-sessions.js +282 -0
  58. package/lib/UserSessions/index.d.ts +1 -0
  59. package/lib/UserSessions/index.js +13 -0
  60. package/lib/UserSessions/libs/locales.d.ts +52 -0
  61. package/lib/UserSessions/libs/locales.js +58 -0
  62. package/lib/UserSessions/libs/utils.d.ts +2 -0
  63. package/lib/UserSessions/libs/utils.js +80 -0
  64. package/lib/blocklets.js +6 -6
  65. package/lib/common/header-addons.d.ts +3 -4
  66. package/lib/common/header-addons.js +3 -3
  67. package/lib/contexts/config-user-space.js +1 -1
  68. package/lib/index.d.ts +1 -0
  69. package/lib/index.js +12 -0
  70. package/lib/types.d.ts +2 -2
  71. package/lib/types.js +3 -3
  72. package/package.json +14 -6
  73. package/src/@types/index.ts +3 -5
  74. package/src/Dashboard/index.jsx +7 -3
  75. package/src/Footer/index.jsx +2 -2
  76. package/src/Header/index.jsx +5 -3
  77. package/src/Icon/index.jsx +1 -0
  78. package/src/UserCenter/components/notification.tsx +2 -2
  79. package/src/UserCenter/components/passport.tsx +1 -2
  80. package/src/UserCenter/components/privacy.tsx +1 -1
  81. package/src/UserCenter/components/settings.tsx +15 -2
  82. package/src/UserCenter/components/storage/connect-to.tsx +17 -11
  83. package/src/UserCenter/components/storage/delete.tsx +8 -2
  84. package/src/UserCenter/components/storage/item.tsx +2 -3
  85. package/src/UserCenter/components/storage/preview-nft.tsx +1 -1
  86. package/src/UserCenter/components/user-center.tsx +21 -14
  87. package/src/UserCenter/components/webhook-item.tsx +1 -1
  88. package/src/UserCenter/libs/locales.ts +2 -0
  89. package/src/UserSessions/components/user-session-info.tsx +52 -0
  90. package/src/UserSessions/components/user-sessions.tsx +276 -0
  91. package/src/UserSessions/index.tsx +1 -0
  92. package/src/UserSessions/libs/locales.ts +52 -0
  93. package/src/UserSessions/libs/utils.ts +82 -0
  94. package/src/blocklets.js +6 -6
  95. package/src/common/header-addons.jsx +2 -2
  96. package/src/contexts/config-user-space.tsx +12 -11
  97. package/src/index.ts +1 -0
  98. package/src/{UserCenter/libs → libs}/client.ts +1 -0
  99. package/src/libs/spaces.tsx +2 -2
  100. package/src/types.js +2 -2
  101. /package/es/{UserCenter/libs → libs}/client.d.ts +0 -0
  102. /package/es/{UserCenter/libs → libs}/client.js +0 -0
  103. /package/lib/{UserCenter/libs → libs}/client.d.ts +0 -0
  104. /package/lib/{UserCenter/libs → libs}/client.js +0 -0
@@ -0,0 +1,82 @@
1
+ const RESERVED_IP = 'Reserved IP';
2
+ const IP_REGION_CACHE = 'ip-region-cache';
3
+
4
+ async function getIpRegionFromIpApi(ip: string): Promise<string> {
5
+ const url = `https://ipapi.co/${ip}/json/`;
6
+ const result = await fetch(url);
7
+ const data = await result.json();
8
+
9
+ let region = '';
10
+ if (data.error) {
11
+ if (data.reserved) {
12
+ region = RESERVED_IP;
13
+ }
14
+ } else {
15
+ region = [data.country_name, data.region, data.city].filter(Boolean).join('/');
16
+ }
17
+ return region;
18
+ }
19
+ async function getIpRegionFromIpSb(ip: string): Promise<string> {
20
+ const url = `https://api.ip.sb/geoip/${ip}`;
21
+ const result = await fetch(url);
22
+ const data = await result.json();
23
+
24
+ let region = '';
25
+ if (data.error) {
26
+ if (data.reserved) {
27
+ region = RESERVED_IP;
28
+ }
29
+ } else {
30
+ region = [data.country, data.region, data.city].filter(Boolean).join('/');
31
+ }
32
+ return region;
33
+ }
34
+
35
+ export async function ip2Region(ip: string): Promise<string> {
36
+ let region = '';
37
+ let ipRegionCache: Record<string, string> = {};
38
+ try {
39
+ const tmpCache = localStorage.getItem(IP_REGION_CACHE);
40
+ if (tmpCache) {
41
+ ipRegionCache = JSON.parse(tmpCache);
42
+ }
43
+ } catch {
44
+ ipRegionCache = {};
45
+ }
46
+ if (ipRegionCache[ip]) {
47
+ region = ipRegionCache[ip];
48
+ } else {
49
+ try {
50
+ region = await getIpRegionFromIpSb(ip);
51
+ } catch {
52
+ console.warn('Fail to get ip region from ip.sb');
53
+ }
54
+
55
+ if (!region) {
56
+ try {
57
+ region = await getIpRegionFromIpApi(ip);
58
+ } catch {
59
+ console.warn('Fail to get ip region from ip-api.co');
60
+ }
61
+ }
62
+ }
63
+
64
+ if (region) {
65
+ // NOTICE: 为了防止 cache 过大,将在 size 超过 100 时,删除最旧的数据
66
+ const ipList = Object.keys(ipRegionCache);
67
+ if (ipList.length > 100) {
68
+ delete ipRegionCache[ipList[0]];
69
+ }
70
+ if (ipRegionCache[ip]) {
71
+ delete ipRegionCache[ip];
72
+ }
73
+ ipRegionCache[ip] = region;
74
+ localStorage.setItem(IP_REGION_CACHE, JSON.stringify(ipRegionCache));
75
+ }
76
+ return region;
77
+ }
78
+
79
+ // eslint-disable-next-line require-await
80
+ export async function batchIp2Region(ips: string[]): Promise<string[]> {
81
+ return Promise.all(ips.map((ip) => ip2Region(ip)));
82
+ }
package/src/blocklets.js CHANGED
@@ -28,30 +28,30 @@ export const getLocalizedNavigation = (navigation, locale = 'en') => {
28
28
  return navigation;
29
29
  }
30
30
  // eslint-disable-next-line no-shadow
31
- const getTitle = (title, locale) => {
31
+ const getTitle = (title, _locale) => {
32
32
  if (typeof title === 'string') {
33
33
  return title;
34
34
  }
35
35
  if (typeof title === 'object') {
36
- return title[locale] || title?.en || title?.zh;
36
+ return title[_locale] || title?.en || title?.zh;
37
37
  }
38
38
  return title;
39
39
  };
40
40
  // eslint-disable-next-line no-shadow
41
- const getLink = (link, locale) => {
41
+ const getLink = (link, _locale) => {
42
42
  if (typeof link === 'string') {
43
43
  // http[s] 开头的 url
44
44
  if (isUrl(link)) {
45
45
  const url = new URL(link);
46
- url.searchParams.set('locale', locale);
46
+ url.searchParams.set('locale', _locale);
47
47
  return url.href;
48
48
  }
49
49
  const url = new URL(link, window.location.origin);
50
- url.searchParams.set('locale', locale);
50
+ url.searchParams.set('locale', _locale);
51
51
  return url.pathname + url.search;
52
52
  }
53
53
  if (typeof link === 'object') {
54
- return link[locale] || link?.en || link?.zh;
54
+ return link[_locale] || link?.en || link?.zh;
55
55
  }
56
56
  return link;
57
57
  };
@@ -9,7 +9,7 @@ import SessionUser from '@arcblock/ux/lib/SessionUser';
9
9
  import SessionBlocklet from '@arcblock/ux/lib/SessionBlocklet';
10
10
  import LocaleSelector from '@arcblock/ux/lib/Locale/selector';
11
11
  import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
12
- import { sessionManagerProps } from '../types';
12
+ import { SessionManagerProps } from '../types';
13
13
  import { getLocalizedNavigation, filterNavByRole } from '../blocklets';
14
14
 
15
15
  // eslint-disable-next-line no-shadow
@@ -81,7 +81,7 @@ HeaderAddons.propTypes = {
81
81
  // - PropTypes.func: 可以把自定义 addons 插在 session-manager 或 locale-selector (如果存在的话) 前/中/后
82
82
  // - PropTypes.node: 将 addons 原样传给 UX Header 组件
83
83
  addons: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),
84
- sessionManagerProps,
84
+ sessionManagerProps: SessionManagerProps,
85
85
  };
86
86
 
87
87
  HeaderAddons.defaultProps = {
@@ -1,7 +1,7 @@
1
1
  import { createContext, useContext, useMemo, useState, useEffect } from 'react';
2
- import { SessionContext as TSessionContext } from '../@types';
3
2
  import { SessionContext } from '@arcblock/did-connect/lib/Session';
4
3
 
4
+ import { SessionContext as TSessionContext } from '../@types';
5
5
 
6
6
  export interface SpaceGateway {
7
7
  did: string;
@@ -12,13 +12,13 @@ export interface SpaceGateway {
12
12
 
13
13
  export interface SettingStorageEndpoint {
14
14
  (endpoint: string | undefined): void | Promise<void>;
15
- }
15
+ }
16
16
 
17
17
  interface ConfigUserSpaceContextType {
18
18
  loading: boolean;
19
19
  spaceGateway: SpaceGateway | undefined;
20
20
  deleteSpaceGateway: (spaceGateway: SpaceGateway) => Promise<void>;
21
- updateSpaceGateway: (updateSpaceGateway: SpaceGateway) => Promise<void>;
21
+ updateSpaceGateway: (updateSpaceGateway: SpaceGateway) => Promise<void>;
22
22
  storageEndpoint: string;
23
23
  settingStorageEndpoint: SettingStorageEndpoint;
24
24
  hasStorageEndpoint: boolean;
@@ -27,9 +27,9 @@ interface ConfigUserSpaceContextType {
27
27
  const ConfigUserSpaceContext = createContext<ConfigUserSpaceContextType>({} as ConfigUserSpaceContextType);
28
28
  const { Provider, Consumer } = ConfigUserSpaceContext;
29
29
 
30
- function ConfigUserSpaceProvider({ children }: {children: React.ReactNode }) {
30
+ function ConfigUserSpaceProvider({ children }: { children: React.ReactNode }) {
31
31
  const [loading] = useState(false);
32
- const {session} = useContext<TSessionContext>(SessionContext);
32
+ const { session } = useContext<TSessionContext>(SessionContext);
33
33
  const { user } = session;
34
34
 
35
35
  const [spaceGateway, setSpaceGateway] = useState<SpaceGateway | undefined>();
@@ -38,13 +38,17 @@ function ConfigUserSpaceProvider({ children }: {children: React.ReactNode }) {
38
38
  }, [user?.didSpace]);
39
39
 
40
40
  useEffect(() => {
41
- setSpaceGateway(user?.didSpace as SpaceGateway)
42
- }, [user?.didSpace])
41
+ setSpaceGateway(user?.didSpace as SpaceGateway);
42
+ }, [user?.didSpace]);
43
43
 
44
+ // eslint-disable-next-line require-await
44
45
  const deleteSpaceGateway = async (): Promise<void> => {
45
46
  setSpaceGateway(undefined);
46
47
  };
47
-
48
+
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
50
+ const settingStorageEndpoint = (endpoint: string | undefined) => {};
51
+
48
52
  const updateSpaceGateway = async (x: SpaceGateway) => {
49
53
  setSpaceGateway(x);
50
54
  session.refresh();
@@ -52,9 +56,6 @@ function ConfigUserSpaceProvider({ children }: {children: React.ReactNode }) {
52
56
  await settingStorageEndpoint(x.endpoint);
53
57
  };
54
58
 
55
-
56
- const settingStorageEndpoint = (endpoint: string | undefined) => {};
57
-
58
59
  const hasStorageEndpoint = Boolean(storageEndpoint && spaceGateway);
59
60
 
60
61
  return (
package/src/index.ts CHANGED
@@ -11,3 +11,4 @@ export { default as ComponentInstaller } from './ComponentInstaller';
11
11
  // @ts-ignore
12
12
  export { default as useComponentInstaller } from './ComponentInstaller/use-component-installed';
13
13
  export * from './UserCenter';
14
+ export * from './UserSessions';
@@ -1,3 +1,4 @@
1
1
  import { BlockletSDK } from '@blocklet/js-sdk';
2
2
 
3
+ // eslint-disable-next-line import/prefer-default-export
3
4
  export const client = new BlockletSDK();
@@ -1,4 +1,4 @@
1
- import { joinURL } from "ufo";
1
+ import { joinURL } from 'ufo';
2
2
 
3
3
  export function getSpaceNftDisplayUrlFromEndpoint(endpoint: string): string {
4
4
  const prefix = endpoint.replace(/\/api\/space\/.+/, '');
@@ -7,4 +7,4 @@ export function getSpaceNftDisplayUrlFromEndpoint(endpoint: string): string {
7
7
  const spaceDid = strArray.at(-4);
8
8
 
9
9
  return joinURL(prefix, `/api/space/nft/display?spaceDid=${spaceDid}`);
10
- }
10
+ }
package/src/types.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
2
  import PropTypes from 'prop-types';
3
3
 
4
- export const blockletMetaProps = PropTypes.shape({
4
+ export const BlockletMetaProps = PropTypes.shape({
5
5
  appLogo: PropTypes.node,
6
6
  appName: PropTypes.string,
7
7
  theme: PropTypes.shape({
@@ -24,7 +24,7 @@ export const blockletMetaProps = PropTypes.shape({
24
24
  ),
25
25
  });
26
26
 
27
- export const sessionManagerProps = PropTypes.shape({
27
+ export const SessionManagerProps = PropTypes.shape({
28
28
  showText: PropTypes.bool,
29
29
  showRole: PropTypes.bool,
30
30
  switchDid: PropTypes.bool,
File without changes
File without changes
File without changes
File without changes