@blocklet/ui-react 2.9.52 → 2.9.54
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.
- package/es/@types/index.d.ts +3 -5
- package/es/Dashboard/index.d.ts +5 -6
- package/es/Dashboard/index.js +5 -5
- package/es/Footer/index.js +2 -2
- package/es/Header/index.js +5 -5
- package/es/UserCenter/components/notification.js +1 -1
- package/es/UserCenter/components/passport.js +1 -2
- package/es/UserCenter/components/privacy.js +1 -1
- package/es/UserCenter/components/settings.js +9 -1
- package/es/UserCenter/components/storage/connect-to.d.ts +1 -1
- package/es/UserCenter/components/storage/connect-to.js +9 -3
- package/es/UserCenter/components/storage/delete.d.ts +1 -1
- package/es/UserCenter/components/storage/delete.js +4 -1
- package/es/UserCenter/components/storage/item.js +1 -1
- package/es/UserCenter/components/user-center.d.ts +2 -2
- package/es/UserCenter/components/user-center.js +15 -6
- package/es/UserCenter/libs/locales.d.ts +2 -0
- package/es/UserCenter/libs/locales.js +2 -0
- package/es/UserSessions/components/user-session-info.d.ts +6 -0
- package/es/UserSessions/components/user-session-info.js +58 -0
- package/es/UserSessions/components/user-sessions.d.ts +9 -0
- package/es/UserSessions/components/user-sessions.js +255 -0
- package/es/UserSessions/index.d.ts +1 -0
- package/es/UserSessions/index.js +1 -0
- package/es/UserSessions/libs/locales.d.ts +52 -0
- package/es/UserSessions/libs/locales.js +52 -0
- package/es/UserSessions/libs/utils.d.ts +2 -0
- package/es/UserSessions/libs/utils.js +73 -0
- package/es/blocklets.js +6 -6
- package/es/common/header-addons.d.ts +3 -4
- package/es/common/header-addons.js +4 -4
- package/es/contexts/config-user-space.js +2 -2
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/types.d.ts +2 -2
- package/es/types.js +2 -2
- package/lib/@types/index.d.ts +3 -5
- package/lib/Dashboard/index.d.ts +5 -6
- package/lib/Dashboard/index.js +4 -4
- package/lib/Footer/index.js +1 -1
- package/lib/Header/index.js +4 -4
- package/lib/UserCenter/components/notification.js +1 -1
- package/lib/UserCenter/components/passport.js +1 -2
- package/lib/UserCenter/components/privacy.js +1 -1
- package/lib/UserCenter/components/settings.js +10 -1
- package/lib/UserCenter/components/storage/connect-to.d.ts +1 -1
- package/lib/UserCenter/components/storage/connect-to.js +3 -3
- package/lib/UserCenter/components/storage/delete.d.ts +1 -1
- package/lib/UserCenter/components/storage/item.js +1 -1
- package/lib/UserCenter/components/user-center.d.ts +2 -2
- package/lib/UserCenter/components/user-center.js +20 -10
- package/lib/UserCenter/libs/locales.d.ts +2 -0
- package/lib/UserCenter/libs/locales.js +2 -0
- package/lib/UserSessions/components/user-session-info.d.ts +6 -0
- package/lib/UserSessions/components/user-session-info.js +68 -0
- package/lib/UserSessions/components/user-sessions.d.ts +9 -0
- package/lib/UserSessions/components/user-sessions.js +282 -0
- package/lib/UserSessions/index.d.ts +1 -0
- package/lib/UserSessions/index.js +13 -0
- package/lib/UserSessions/libs/locales.d.ts +52 -0
- package/lib/UserSessions/libs/locales.js +58 -0
- package/lib/UserSessions/libs/utils.d.ts +2 -0
- package/lib/UserSessions/libs/utils.js +80 -0
- package/lib/blocklets.js +6 -6
- package/lib/common/header-addons.d.ts +3 -4
- package/lib/common/header-addons.js +3 -3
- package/lib/contexts/config-user-space.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +12 -0
- package/lib/types.d.ts +2 -2
- package/lib/types.js +3 -3
- package/package.json +14 -6
- package/src/@types/index.ts +3 -5
- package/src/Dashboard/index.jsx +7 -3
- package/src/Footer/index.jsx +2 -2
- package/src/Header/index.jsx +5 -3
- package/src/Icon/index.jsx +1 -0
- package/src/UserCenter/components/notification.tsx +2 -2
- package/src/UserCenter/components/passport.tsx +1 -2
- package/src/UserCenter/components/privacy.tsx +1 -1
- package/src/UserCenter/components/settings.tsx +15 -2
- package/src/UserCenter/components/storage/connect-to.tsx +17 -11
- package/src/UserCenter/components/storage/delete.tsx +8 -2
- package/src/UserCenter/components/storage/item.tsx +2 -3
- package/src/UserCenter/components/storage/preview-nft.tsx +1 -1
- package/src/UserCenter/components/user-center.tsx +21 -14
- package/src/UserCenter/components/webhook-item.tsx +1 -1
- package/src/UserCenter/libs/locales.ts +2 -0
- package/src/UserSessions/components/user-session-info.tsx +52 -0
- package/src/UserSessions/components/user-sessions.tsx +276 -0
- package/src/UserSessions/index.tsx +1 -0
- package/src/UserSessions/libs/locales.ts +52 -0
- package/src/UserSessions/libs/utils.ts +82 -0
- package/src/blocklets.js +6 -6
- package/src/common/header-addons.jsx +2 -2
- package/src/contexts/config-user-space.tsx +12 -11
- package/src/index.ts +1 -0
- package/src/{UserCenter/libs → libs}/client.ts +1 -0
- package/src/libs/spaces.tsx +2 -2
- package/src/types.js +2 -2
- /package/es/{UserCenter/libs → libs}/client.d.ts +0 -0
- /package/es/{UserCenter/libs → libs}/client.js +0 -0
- /package/lib/{UserCenter/libs → libs}/client.d.ts +0 -0
- /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,
|
|
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[
|
|
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,
|
|
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',
|
|
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',
|
|
50
|
+
url.searchParams.set('locale', _locale);
|
|
51
51
|
return url.pathname + url.search;
|
|
52
52
|
}
|
|
53
53
|
if (typeof link === 'object') {
|
|
54
|
-
return link[
|
|
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 {
|
|
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) =>
|
|
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
package/src/libs/spaces.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { joinURL } from
|
|
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
|
|
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
|
|
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
|