@blocklet/did-space-react 1.0.22 → 1.0.23

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.
@@ -12,6 +12,7 @@ const axios = require('axios');
12
12
  const ahooks = require('ahooks');
13
13
  const semver = require('semver');
14
14
  const constants = require('@did-space/core/constants');
15
+ const session = require('../../context/session.js');
15
16
  const _package = require('../../package.json.js');
16
17
  const constants$1 = require('../../libs/constants.js');
17
18
  const useMobile = require('../../hooks/use-mobile.js');
@@ -27,6 +28,18 @@ const spaceDisconnect = require('../../icons/space-disconnect.svg.js');
27
28
  const spaceConnectError = require('../../icons/space-connect-error.svg.js');
28
29
 
29
30
  const expectVersion = `${_package.version}`;
31
+ function getIncompatibleUpgradeUrl({ spaceInfo, session, spaceUrl }) {
32
+ const shouldBeUpgradeDIDSpaces = !spaceInfo.version || semver.major(spaceInfo.version) !== semver.major(expectVersion) && semver.lt(spaceInfo.version, expectVersion) && spaceInfo.isSiteAdmin;
33
+ if (shouldBeUpgradeDIDSpaces) {
34
+ return ufo.joinURL(new URL(spaceUrl).origin, ".well-known/service/admin/components");
35
+ }
36
+ const isCurrentSiteAdmin = ["admin", "owner"].includes(session?.user?.role || "");
37
+ const shouldBeUpgradeApp = spaceInfo.version && semver.major(spaceInfo.version) !== semver.major(expectVersion) && semver.lt(expectVersion, spaceInfo.version) && isCurrentSiteAdmin;
38
+ if (shouldBeUpgradeApp) {
39
+ return ufo.joinURL(window.location.origin, ".well-known/service/admin/components");
40
+ }
41
+ return null;
42
+ }
30
43
  function Status({
31
44
  spaceUrl,
32
45
  status,
@@ -39,6 +52,7 @@ function Status({
39
52
  const { t, locale } = useLocale();
40
53
  const iconStyle = { marginRight: "4px" };
41
54
  const spaceGuideUrl = ufo.withQuery(ufo.joinURL(spaceUrl, "overview"), { guide: 1 });
55
+ const { session: session$1 } = session.useSessionContext();
42
56
  const statusConfig = ahooks.useCreation(
43
57
  () => ({
44
58
  // 加载中
@@ -60,8 +74,12 @@ function Status({
60
74
  [locale]
61
75
  );
62
76
  const spaceVersion = React.useMemo(() => spaceInfo?.version, [spaceInfo]);
63
- const errorStatusConfig = ahooks.useCreation(
64
- () => ({
77
+ const errorStatusConfig = ahooks.useCreation(() => {
78
+ if (!spaceInfo) {
79
+ return {};
80
+ }
81
+ const incompatibleUpgradeUrl = getIncompatibleUpgradeUrl({ spaceInfo, session: session$1, spaceUrl });
82
+ return {
65
83
  // 未知的网络错误(如超时)
66
84
  [constants.SPACE_CONNECT_ERROR_CODE.NETWORK_ERROR]: {
67
85
  icon: /* @__PURE__ */ jsxRuntime.jsx(spaceConnectError, { style: iconStyle }),
@@ -93,23 +111,24 @@ function Status({
93
111
  text: /* @__PURE__ */ jsxRuntime.jsx(ErrorLink, { title: t("storage.spaces.error.corsBlocked"), url: ufo.withQuery(constants$1.fixCorsErrorPageUrl, { locale }) })
94
112
  },
95
113
  // Space 版本不兼容
96
- [constants.SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE]: {
97
- icon: /* @__PURE__ */ jsxRuntime.jsx(spaceConnectError, { style: iconStyle }),
98
- text: /* @__PURE__ */ jsxRuntime.jsx(
99
- ErrorLink,
100
- {
101
- title: t("storage.spaces.error.incompatible", {
102
- spaceVersion: spaceVersion || " < 0.5.77",
103
- // version 字段是在 0.5.77 版本添加的
104
- expectVersion
105
- }),
106
- url: ufo.joinURL(new URL(spaceUrl).origin, ".well-known/service/admin/components")
107
- }
108
- )
114
+ ...incompatibleUpgradeUrl && {
115
+ [constants.SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE]: {
116
+ icon: /* @__PURE__ */ jsxRuntime.jsx(spaceConnectError, { style: iconStyle }),
117
+ text: /* @__PURE__ */ jsxRuntime.jsx(
118
+ ErrorLink,
119
+ {
120
+ title: t("storage.spaces.error.incompatible", {
121
+ spaceVersion: spaceInfo.version || " < 0.5.77",
122
+ // version 字段是在 0.5.77 版本添加的
123
+ expectVersion
124
+ }),
125
+ url: incompatibleUpgradeUrl
126
+ }
127
+ )
128
+ }
109
129
  }
110
- }),
111
- [locale, spaceVersion]
112
- );
130
+ };
131
+ }, [locale, spaceVersion]);
113
132
  const { icon, text } = status === index.DIDSpaceStatus.UNAVAILABLE ? errorStatusConfig[errorCode] : statusConfig[status];
114
133
  React.useEffect(() => {
115
134
  const handleVisibilityChange = () => {
@@ -167,6 +186,7 @@ function DIDSpaceConnection({
167
186
  }) {
168
187
  const isMobile = useMobile();
169
188
  const { t } = useLocale();
189
+ const { session: session$1 } = session.useSessionContext();
170
190
  let isCompact = compat;
171
191
  if (isUndefined(isCompact)) {
172
192
  isCompact = isMobile;
@@ -202,9 +222,8 @@ function DIDSpaceConnection({
202
222
  }
203
223
  } else if (spaceInfo) {
204
224
  spaceName = spaceInfo.name;
205
- const spaceVersion = spaceInfo.version;
206
- const isIncompatible = !spaceVersion || semver.major(expectVersion) !== semver.major(spaceVersion);
207
- if (isIncompatible) {
225
+ const incompatibleUpgradeUrl = getIncompatibleUpgradeUrl({ spaceInfo, session: session$1, spaceUrl });
226
+ if (incompatibleUpgradeUrl) {
208
227
  spaceStatus.current = index.DIDSpaceStatus.UNAVAILABLE;
209
228
  errorCode = constants.SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE;
210
229
  } else if (!isAvailable) {
@@ -0,0 +1,4 @@
1
+ import type { SessionContext as SessionContextType } from '@arcblock/did-connect/lib/types';
2
+ declare const SessionProvider: any, SessionContext: any, SessionConsumer: any, withSession: any;
3
+ declare function useSessionContext(): SessionContextType;
4
+ export { SessionProvider, SessionContext, SessionConsumer, useSessionContext, withSession };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const React = require('react');
4
+ const Session = require('@arcblock/did-connect/lib/Session');
5
+
6
+ const { SessionProvider, SessionContext, SessionConsumer, withSession } = Session.createAuthServiceSessionContext();
7
+ function useSessionContext() {
8
+ const info = React.useContext(SessionContext);
9
+ return info;
10
+ }
11
+
12
+ exports.SessionConsumer = SessionConsumer;
13
+ exports.SessionContext = SessionContext;
14
+ exports.SessionProvider = SessionProvider;
15
+ exports.useSessionContext = useSessionContext;
16
+ exports.withSession = withSession;
@@ -5,6 +5,7 @@ export type SpaceInfo = {
5
5
  ownerDid: string;
6
6
  isAvailable: boolean;
7
7
  errorCode: number;
8
+ isSiteAdmin: boolean;
8
9
  };
9
10
  export default function useSpaceInfo({ endpoint, deps }: {
10
11
  endpoint: string;
@@ -26,7 +26,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
26
26
  rawVersion,
27
27
  rawOwnerDid,
28
28
  rawAvailable,
29
- rawErrorCode
29
+ rawErrorCode,
30
+ rawIsSiteAdmin
30
31
  ] = [
31
32
  headers["x-space-name"],
32
33
  headers["x-subscription-id"],
@@ -37,7 +38,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
37
38
  headers["x-space-version"],
38
39
  headers["x-space-owner-did"],
39
40
  headers["x-space-is-available"],
40
- headers["x-error-code"]
41
+ headers["x-error-code"],
42
+ headers["x-is-site-admin"]
41
43
  ];
42
44
  const name = rawName ? decodeURIComponent(rawName) : "";
43
45
  if (rawAvailable === void 0 || rawErrorCode === void 0) {
@@ -48,7 +50,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
48
50
  subscriptionId: rawSubscriptionId,
49
51
  ownerDid: rawOwnerDid || "",
50
52
  isAvailable,
51
- errorCode: isAvailable ? 0 : constants.SPACE_CONNECT_ERROR_CODE.UNAUTHORIZED
53
+ errorCode: isAvailable ? 0 : constants.SPACE_CONNECT_ERROR_CODE.UNAUTHORIZED,
54
+ isSiteAdmin: rawIsSiteAdmin === "true"
52
55
  };
53
56
  }
54
57
  return {
@@ -57,7 +60,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
57
60
  subscriptionId: rawSubscriptionId,
58
61
  ownerDid: rawOwnerDid,
59
62
  isAvailable: rawAvailable === "true",
60
- errorCode: parseInt(rawErrorCode, 10)
63
+ errorCode: parseInt(rawErrorCode, 10),
64
+ isSiteAdmin: rawIsSiteAdmin === "true"
61
65
  };
62
66
  },
63
67
  {
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
2
 
3
- const version = "1.0.22";
3
+ const version = "1.0.23";
4
4
 
5
5
  exports.version = version;
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import isUndefined from 'lodash/isUndefined';
3
- import { withQuery, joinURL } from 'ufo';
3
+ import { joinURL, withQuery } from 'ufo';
4
4
  import { Box, Stack, Tooltip, Link, Skeleton } from '@mui/material';
5
5
  import OpenInNewIcon from '@mui/icons-material/OpenInNew';
6
6
  import DidAddress from '@arcblock/ux/lib/DID';
@@ -10,6 +10,7 @@ import { AxiosError } from 'axios';
10
10
  import { useCreation } from 'ahooks';
11
11
  import semver from 'semver';
12
12
  import { SPACE_CONNECT_ERROR_CODE } from '@did-space/core/constants';
13
+ import { useSessionContext } from '../../context/session.js';
13
14
  import { version } from '../../package.json.js';
14
15
  import { fixCorsErrorPageUrl } from '../../libs/constants.js';
15
16
  import useMobile from '../../hooks/use-mobile.js';
@@ -25,6 +26,18 @@ import SvgSpaceDisconnect from '../../icons/space-disconnect.svg.js';
25
26
  import SvgSpaceConnectError from '../../icons/space-connect-error.svg.js';
26
27
 
27
28
  const expectVersion = `${version}`;
29
+ function getIncompatibleUpgradeUrl({ spaceInfo, session, spaceUrl }) {
30
+ const shouldBeUpgradeDIDSpaces = !spaceInfo.version || semver.major(spaceInfo.version) !== semver.major(expectVersion) && semver.lt(spaceInfo.version, expectVersion) && spaceInfo.isSiteAdmin;
31
+ if (shouldBeUpgradeDIDSpaces) {
32
+ return joinURL(new URL(spaceUrl).origin, ".well-known/service/admin/components");
33
+ }
34
+ const isCurrentSiteAdmin = ["admin", "owner"].includes(session?.user?.role || "");
35
+ const shouldBeUpgradeApp = spaceInfo.version && semver.major(spaceInfo.version) !== semver.major(expectVersion) && semver.lt(expectVersion, spaceInfo.version) && isCurrentSiteAdmin;
36
+ if (shouldBeUpgradeApp) {
37
+ return joinURL(window.location.origin, ".well-known/service/admin/components");
38
+ }
39
+ return null;
40
+ }
28
41
  function Status({
29
42
  spaceUrl,
30
43
  status,
@@ -37,6 +50,7 @@ function Status({
37
50
  const { t, locale } = useLocale();
38
51
  const iconStyle = { marginRight: "4px" };
39
52
  const spaceGuideUrl = withQuery(joinURL(spaceUrl, "overview"), { guide: 1 });
53
+ const { session } = useSessionContext();
40
54
  const statusConfig = useCreation(
41
55
  () => ({
42
56
  // 加载中
@@ -58,8 +72,12 @@ function Status({
58
72
  [locale]
59
73
  );
60
74
  const spaceVersion = useMemo(() => spaceInfo?.version, [spaceInfo]);
61
- const errorStatusConfig = useCreation(
62
- () => ({
75
+ const errorStatusConfig = useCreation(() => {
76
+ if (!spaceInfo) {
77
+ return {};
78
+ }
79
+ const incompatibleUpgradeUrl = getIncompatibleUpgradeUrl({ spaceInfo, session, spaceUrl });
80
+ return {
63
81
  // 未知的网络错误(如超时)
64
82
  [SPACE_CONNECT_ERROR_CODE.NETWORK_ERROR]: {
65
83
  icon: /* @__PURE__ */ jsx(SvgSpaceConnectError, { style: iconStyle }),
@@ -91,23 +109,24 @@ function Status({
91
109
  text: /* @__PURE__ */ jsx(ErrorLink, { title: t("storage.spaces.error.corsBlocked"), url: withQuery(fixCorsErrorPageUrl, { locale }) })
92
110
  },
93
111
  // Space 版本不兼容
94
- [SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE]: {
95
- icon: /* @__PURE__ */ jsx(SvgSpaceConnectError, { style: iconStyle }),
96
- text: /* @__PURE__ */ jsx(
97
- ErrorLink,
98
- {
99
- title: t("storage.spaces.error.incompatible", {
100
- spaceVersion: spaceVersion || " < 0.5.77",
101
- // version 字段是在 0.5.77 版本添加的
102
- expectVersion
103
- }),
104
- url: joinURL(new URL(spaceUrl).origin, ".well-known/service/admin/components")
105
- }
106
- )
112
+ ...incompatibleUpgradeUrl && {
113
+ [SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE]: {
114
+ icon: /* @__PURE__ */ jsx(SvgSpaceConnectError, { style: iconStyle }),
115
+ text: /* @__PURE__ */ jsx(
116
+ ErrorLink,
117
+ {
118
+ title: t("storage.spaces.error.incompatible", {
119
+ spaceVersion: spaceInfo.version || " < 0.5.77",
120
+ // version 字段是在 0.5.77 版本添加的
121
+ expectVersion
122
+ }),
123
+ url: incompatibleUpgradeUrl
124
+ }
125
+ )
126
+ }
107
127
  }
108
- }),
109
- [locale, spaceVersion]
110
- );
128
+ };
129
+ }, [locale, spaceVersion]);
111
130
  const { icon, text } = status === DIDSpaceStatus.UNAVAILABLE ? errorStatusConfig[errorCode] : statusConfig[status];
112
131
  useEffect(() => {
113
132
  const handleVisibilityChange = () => {
@@ -165,6 +184,7 @@ function DIDSpaceConnection({
165
184
  }) {
166
185
  const isMobile = useMobile();
167
186
  const { t } = useLocale();
187
+ const { session } = useSessionContext();
168
188
  let isCompact = compat;
169
189
  if (isUndefined(isCompact)) {
170
190
  isCompact = isMobile;
@@ -200,9 +220,8 @@ function DIDSpaceConnection({
200
220
  }
201
221
  } else if (spaceInfo) {
202
222
  spaceName = spaceInfo.name;
203
- const spaceVersion = spaceInfo.version;
204
- const isIncompatible = !spaceVersion || semver.major(expectVersion) !== semver.major(spaceVersion);
205
- if (isIncompatible) {
223
+ const incompatibleUpgradeUrl = getIncompatibleUpgradeUrl({ spaceInfo, session, spaceUrl });
224
+ if (incompatibleUpgradeUrl) {
206
225
  spaceStatus.current = DIDSpaceStatus.UNAVAILABLE;
207
226
  errorCode = SPACE_CONNECT_ERROR_CODE.INCOMPATIBLE;
208
227
  } else if (!isAvailable) {
@@ -0,0 +1,4 @@
1
+ import type { SessionContext as SessionContextType } from '@arcblock/did-connect/lib/types';
2
+ declare const SessionProvider: any, SessionContext: any, SessionConsumer: any, withSession: any;
3
+ declare function useSessionContext(): SessionContextType;
4
+ export { SessionProvider, SessionContext, SessionConsumer, useSessionContext, withSession };
@@ -0,0 +1,10 @@
1
+ import { useContext } from 'react';
2
+ import { createAuthServiceSessionContext } from '@arcblock/did-connect/lib/Session';
3
+
4
+ const { SessionProvider, SessionContext, SessionConsumer, withSession } = createAuthServiceSessionContext();
5
+ function useSessionContext() {
6
+ const info = useContext(SessionContext);
7
+ return info;
8
+ }
9
+
10
+ export { SessionConsumer, SessionContext, SessionProvider, useSessionContext, withSession };
@@ -5,6 +5,7 @@ export type SpaceInfo = {
5
5
  ownerDid: string;
6
6
  isAvailable: boolean;
7
7
  errorCode: number;
8
+ isSiteAdmin: boolean;
8
9
  };
9
10
  export default function useSpaceInfo({ endpoint, deps }: {
10
11
  endpoint: string;
@@ -24,7 +24,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
24
24
  rawVersion,
25
25
  rawOwnerDid,
26
26
  rawAvailable,
27
- rawErrorCode
27
+ rawErrorCode,
28
+ rawIsSiteAdmin
28
29
  ] = [
29
30
  headers["x-space-name"],
30
31
  headers["x-subscription-id"],
@@ -35,7 +36,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
35
36
  headers["x-space-version"],
36
37
  headers["x-space-owner-did"],
37
38
  headers["x-space-is-available"],
38
- headers["x-error-code"]
39
+ headers["x-error-code"],
40
+ headers["x-is-site-admin"]
39
41
  ];
40
42
  const name = rawName ? decodeURIComponent(rawName) : "";
41
43
  if (rawAvailable === void 0 || rawErrorCode === void 0) {
@@ -46,7 +48,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
46
48
  subscriptionId: rawSubscriptionId,
47
49
  ownerDid: rawOwnerDid || "",
48
50
  isAvailable,
49
- errorCode: isAvailable ? 0 : SPACE_CONNECT_ERROR_CODE.UNAUTHORIZED
51
+ errorCode: isAvailable ? 0 : SPACE_CONNECT_ERROR_CODE.UNAUTHORIZED,
52
+ isSiteAdmin: rawIsSiteAdmin === "true"
50
53
  };
51
54
  }
52
55
  return {
@@ -55,7 +58,8 @@ function useSpaceInfo({ endpoint, deps = [] }) {
55
58
  subscriptionId: rawSubscriptionId,
56
59
  ownerDid: rawOwnerDid,
57
60
  isAvailable: rawAvailable === "true",
58
- errorCode: parseInt(rawErrorCode, 10)
61
+ errorCode: parseInt(rawErrorCode, 10),
62
+ isSiteAdmin: rawIsSiteAdmin === "true"
59
63
  };
60
64
  },
61
65
  {
@@ -1,3 +1,3 @@
1
- const version = "1.0.22";
1
+ const version = "1.0.23";
2
2
 
3
3
  export { version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/did-space-react",
3
- "version": "1.0.22",
3
+ "version": "1.0.23",
4
4
  "description": "Reusable react components for did space",
5
5
  "keywords": [
6
6
  "react",
@@ -80,8 +80,8 @@
80
80
  }
81
81
  },
82
82
  "dependencies": {
83
- "@arcblock/did": "^1.19.12",
84
- "@did-space/core": "^1.0.22",
83
+ "@arcblock/did": "^1.19.14",
84
+ "@did-space/core": "^1.0.23",
85
85
  "@mui/icons-material": "^5.16.14",
86
86
  "@mui/lab": "^5.0.0-alpha.175",
87
87
  "@mui/material": "^5.16.14",
@@ -109,9 +109,9 @@
109
109
  "access": "public"
110
110
  },
111
111
  "devDependencies": {
112
- "@arcblock/did-connect": "^2.11.48",
112
+ "@arcblock/did-connect": "^2.12.2",
113
113
  "@arcblock/eslint-config-ts": "^0.3.3",
114
- "@arcblock/ux": "^2.11.48",
114
+ "@arcblock/ux": "^2.12.2",
115
115
  "@babel/cli": "^7.26.4",
116
116
  "@babel/core": "^7.26.9",
117
117
  "@babel/preset-env": "^7.26.9",
@@ -142,7 +142,7 @@
142
142
  "react-dom": "^18.3.1",
143
143
  "rollup-plugin-node-builtins": "^2.1.2",
144
144
  "storybook": "^7.6.20",
145
- "type-fest": "^4.35.0",
145
+ "type-fest": "^4.37.0",
146
146
  "typescript": "~5.5.4",
147
147
  "unbuild": "^2.0.0",
148
148
  "vite": "^5.4.14",
@@ -150,5 +150,5 @@
150
150
  "vite-plugin-node-polyfills": "^0.22.0",
151
151
  "vitest": "^3.0.7"
152
152
  },
153
- "gitHead": "85bf211785c4557570799a40f2835ce815fed1da"
153
+ "gitHead": "5acb89e1a50068f22591441260e265ca87d86687"
154
154
  }