@blocklet/launcher-workflow 1.9.12 → 1.9.14

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.
@@ -29,7 +29,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
29
29
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
30
30
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
31
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
32
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
32
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
34
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
33
35
  const STATUS = {
34
36
  waiting: 0,
35
37
  // 未使用
@@ -76,7 +78,11 @@ function OperationPage(_ref) {
76
78
  }
77
79
  } = await api.get("/public/instances/".concat(nftId, "/status"));
78
80
  if (instance.status >= _constant.INSTANCE_STATUS.running) {
79
- const url = (0, _util.getLaunchBlockletUrl)(instance.serverUrl, blockletMetaUrl, locale);
81
+ const url = (0, _util.getLaunchBlockletUrl)({
82
+ serverUrl: instance.serverUrl,
83
+ blockletMetaUrl,
84
+ locale
85
+ });
80
86
  setIsDone(true);
81
87
  setTimeout(() => {
82
88
  setLaunchState(pre => _objectSpread(_objectSpread({}, pre), {}, {
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = PrepareServerless;
7
+ var _react = require("react");
8
+ var _reactRouterDom = require("react-router-dom");
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _useAsync = _interopRequireDefault(require("react-use/lib/useAsync"));
11
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
12
+ var _pageHeader = _interopRequireDefault(require("@blocklet/launcher-layout/lib/page-header"));
13
+ var _ServerLogoNotext = _interopRequireDefault(require("@arcblock/icons/lib/ServerLogoNotext"));
14
+ var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
15
+ var _locale = require("../contexts/locale");
16
+ var _util = require("../util");
17
+ var _request = _interopRequireDefault(require("../contexts/request"));
18
+ var _jsxRuntime = require("react/jsx-runtime");
19
+ var _templateObject;
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
22
+ function PrepareServerless(_ref) {
23
+ let {
24
+ nftId
25
+ } = _ref;
26
+ const {
27
+ t,
28
+ locale
29
+ } = (0, _react.useContext)(_locale.LocaleContext);
30
+ const {
31
+ api
32
+ } = (0, _request.default)();
33
+ const [searchParams] = (0, _reactRouterDom.useSearchParams)();
34
+ const state = (0, _useAsync.default)(async () => {
35
+ const {
36
+ data: {
37
+ instance
38
+ }
39
+ } = await api.post("/serverless/".concat(nftId, "/allocate"));
40
+ setTimeout(() => {
41
+ window.location = (0, _util.getLaunchBlockletUrl)({
42
+ serverUrl: instance.serverUrl,
43
+ blockletMetaUrl: searchParams.get('blocklet_meta_url'),
44
+ locale,
45
+ launchType: 'serverless',
46
+ nftId
47
+ });
48
+ }, 3000);
49
+ });
50
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Container, {
51
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_pageHeader.default, {
52
+ title: t('prepare.serverless.title'),
53
+ onClickBack: ""
54
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
55
+ className: "page-body",
56
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
57
+ className: "page-logo",
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ServerLogoNotext.default, {
59
+ style: {
60
+ width: 48,
61
+ height: 48
62
+ }
63
+ })
64
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
65
+ className: "content",
66
+ children: [state.loading && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
67
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
68
+ size: "3.5rem"
69
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
70
+ className: "description",
71
+ children: t('prepare.serverless.preparing')
72
+ })]
73
+ }), !state.loading && !state.error && t('prepare.serverless.prepared'), state.error && t('prepare.serverless.prepareFailed')]
74
+ })]
75
+ })]
76
+ });
77
+ }
78
+ const Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n\n .page-logo {\n display: flex;\n justify-content: center;\n margin-top: 62px;\n ", " {\n margin-top: 48px;\n }\n }\n\n .page-body {\n .content {\n display: flex;\n align-items: center;\n flex-direction: column;\n text-align: center;\n margin-top: 64px;\n\n .loading-description {\n margin-top: 8px;\n }\n }\n }\n"])), props => props.theme.breakpoints.down('md'));
79
+ PrepareServerless.propTypes = {
80
+ nftId: _propTypes.default.string.isRequired
81
+ };
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = PrepareStandard;
7
+ var _react = require("react");
8
+ var _reactRouterDom = require("react-router-dom");
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
11
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
12
+ var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
13
+ var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
14
+ var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
15
+ var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
16
+ var _constant = require("@blocklet/launcher-util/lib/constant");
17
+ var _server = _interopRequireDefault(require("@arcblock/license/lib/server"));
18
+ var _serverEula = _interopRequireDefault(require("@blocklet/launcher-layout/lib/wizard/server-eula"));
19
+ var _pageHeader = _interopRequireDefault(require("@blocklet/launcher-layout/lib/page-header"));
20
+ var _ServerLogoNotext = _interopRequireDefault(require("@arcblock/icons/lib/ServerLogoNotext"));
21
+ var _request = _interopRequireDefault(require("../contexts/request"));
22
+ var _locale = require("../contexts/locale");
23
+ var _router = _interopRequireWildcard(require("../contexts/router"));
24
+ var _query = _interopRequireDefault(require("../hooks/query"));
25
+ var _util = require("../util");
26
+ var _jsxRuntime = require("react/jsx-runtime");
27
+ var _templateObject;
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
34
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
35
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
36
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
37
+ function PrepareStandard(_ref) {
38
+ let {
39
+ nftId
40
+ } = _ref;
41
+ const {
42
+ t
43
+ } = (0, _react.useContext)(_locale.LocaleContext);
44
+ const [name, setName] = (0, _react.useState)('');
45
+ const [description, setDescription] = (0, _react.useState)('');
46
+ const [formError, setFormError] = (0, _react.useState)({
47
+ name: '',
48
+ description: ''
49
+ });
50
+ const routerPrefix = (0, _router.usePrefix)();
51
+ const disabledBack = (0, _router.useDisabledBack)();
52
+ const [launching, setLaunching] = (0, _react.useState)(false);
53
+ const [showLaunchInstanceDialog, setShowLaunchInstanceDialog] = (0, _react.useState)(false);
54
+ const navigate = (0, _reactRouterDom.useNavigate)();
55
+ const {
56
+ create: createRequest,
57
+ api
58
+ } = (0, _request.default)();
59
+ const query = (0, _query.default)();
60
+ const handleInput = id => e => {
61
+ if (id === 'name') {
62
+ setName(e.target.value);
63
+ }
64
+ if (id === 'description') {
65
+ setDescription(e.target.value);
66
+ }
67
+ validate();
68
+ };
69
+ const isRedeem = nftId === _constant.REDEEM_NFT_ID;
70
+ const headerScope = isRedeem ? 'redeem' : 'prepare';
71
+ const validate = () => {
72
+ let isError = false;
73
+ if (name.length > _constant.INSTANCE_MAX_NAME_LENGTH) {
74
+ isError = true;
75
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
76
+ name: t('launchPrepare.formError.nameExceed', {
77
+ length: _constant.INSTANCE_MAX_NAME_LENGTH
78
+ })
79
+ }));
80
+ } else {
81
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
82
+ name: ''
83
+ }));
84
+ }
85
+ if (description.length > _constant.INSTANCE_MAX_DESC_LENGTH) {
86
+ isError = true;
87
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
88
+ description: t('launchPrepare.formError.descriptionExceed', {
89
+ length: _constant.INSTANCE_MAX_DESC_LENGTH
90
+ })
91
+ }));
92
+ } else {
93
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
94
+ description: ''
95
+ }));
96
+ }
97
+ return isError;
98
+ };
99
+ const handleLaunch = async () => {
100
+ setLaunching(true);
101
+ if (validate()) {
102
+ return;
103
+ }
104
+ if (isRedeem) {
105
+ setShowLaunchInstanceDialog(true);
106
+ return;
107
+ }
108
+ try {
109
+ const {
110
+ status
111
+ } = await api.post('/instances/launch', {
112
+ nftId,
113
+ name,
114
+ description
115
+ }, {
116
+ params: {
117
+ launchType: query.get('launchType')
118
+ }
119
+ });
120
+ if (status !== 202) {
121
+ _Toast.default.error(t('launch.error.launchFailed'));
122
+ return;
123
+ }
124
+ handleAuthSuccess({
125
+ nftId
126
+ });
127
+ } catch (err) {
128
+ const errDesc = (0, _util.getAPIResponseError)(err);
129
+ if (errDesc === 'Unauthorized') {
130
+ _Toast.default.error(t('launchPrepare.error.loginFirst'));
131
+ } else {
132
+ _Toast.default.error(errDesc);
133
+ }
134
+ } finally {
135
+ setLaunching(false);
136
+ }
137
+ };
138
+
139
+ // eslint-disable-next-line no-shadow
140
+ const handleAuthSuccess = _ref2 => {
141
+ let {
142
+ nftId
143
+ } = _ref2;
144
+ navigate((0, _router.default)(routerPrefix, "/in-progress/".concat(nftId).concat(window.location.search)));
145
+ };
146
+ const handleCloseAuthDialog = () => {
147
+ setLaunching(false);
148
+ setShowLaunchInstanceDialog(false);
149
+ };
150
+ const clickBack = () => {
151
+ navigate(-1);
152
+ };
153
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
154
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Container, {
155
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_pageHeader.default, {
156
+ title: t("".concat(headerScope, ".title")),
157
+ subTitle: t("".concat(headerScope, ".subTitle")),
158
+ onClickBack: headerScope === 'redeem' && !disabledBack.includes('prepare') ? clickBack : ''
159
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
160
+ className: "page-body",
161
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
162
+ className: "page-logo",
163
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ServerLogoNotext.default, {
164
+ style: {
165
+ width: 48,
166
+ height: 48
167
+ }
168
+ })
169
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
170
+ className: "inputs",
171
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_FormControl.default, {
172
+ className: "input-item",
173
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
174
+ id: "name",
175
+ variant: "outlined",
176
+ label: t('common.name'),
177
+ onChange: handleInput('name'),
178
+ value: name,
179
+ labelwidth: 0,
180
+ autoFocus: true
181
+ }), formError.name && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormHelperText.default, {
182
+ children: formError.name
183
+ })]
184
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_FormControl.default, {
185
+ className: "input-item",
186
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
187
+ id: "description",
188
+ variant: "outlined",
189
+ label: t('common.description'),
190
+ onChange: handleInput('description'),
191
+ value: description,
192
+ labelwidth: 0
193
+ }), formError.description && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormHelperText.default, {
194
+ children: formError.description
195
+ })]
196
+ })]
197
+ })]
198
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
199
+ className: "botton-container",
200
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_serverEula.default, {
201
+ onContinue: handleLaunch,
202
+ nextDisabled: !name.trim() || !description.trim() || launching,
203
+ launching: launching,
204
+ description: /*#__PURE__*/(0, _jsxRuntime.jsx)(_server.default, {
205
+ className: "eula-content"
206
+ }),
207
+ texts: {
208
+ listenName: t('license.title'),
209
+ launchingText: t('common.launching'),
210
+ buttonNext: t('license.footer')
211
+ }
212
+ })
213
+ })]
214
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Connect.default, {
215
+ open: showLaunchInstanceDialog,
216
+ popup: true,
217
+ action: "launch-instance",
218
+ checkFn: createRequest().get,
219
+ onSuccess: handleAuthSuccess,
220
+ onClose: handleCloseAuthDialog,
221
+ checkTimeout: 60 * 5000,
222
+ extraParams: {
223
+ nftId,
224
+ name,
225
+ description
226
+ },
227
+ disableClose: true,
228
+ showDownload: false,
229
+ messages: {
230
+ title: t('redeem.dialog.title'),
231
+ scan: t('redeem.dialog.scan'),
232
+ confirm: t('redeem.dialog.confirm'),
233
+ success: t('redeem.dialog.success')
234
+ }
235
+ })]
236
+ });
237
+ }
238
+ const Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n\n .page-logo {\n display: flex;\n justify-content: center;\n margin-top: 62px;\n ", " {\n margin-top: 48px;\n }\n }\n\n .inputs {\n display: flex;\n align-items: center;\n flex-direction: column;\n text-align: center;\n }\n .input-item {\n margin-top: 24px;\n width: 90%;\n max-width: 460px;\n font-size: 14px;\n input,\n textarea {\n font-size: 14px;\n }\n }\n .botton-container {\n width: 100%;\n margin: 24px auto;\n max-width: 460px;\n text-align: center;\n }\n"])), props => props.theme.breakpoints.down('md'));
239
+ PrepareStandard.propTypes = {
240
+ nftId: _propTypes.default.string.isRequired
241
+ };
@@ -16,7 +16,9 @@ var _jsxRuntime = require("react/jsx-runtime");
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
18
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
21
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
20
22
  _axios.default.defaults.timeout = 200000;
21
23
  const RequestContext = /*#__PURE__*/(0, _react.createContext)();
22
24
  const {
package/lib/locales/en.js CHANGED
@@ -29,7 +29,13 @@ module.exports = {
29
29
  },
30
30
  prepare: {
31
31
  title: 'Naming Blocklet Server',
32
- subTitle: 'Please enter server name and description, they will appear in your server passport'
32
+ subTitle: 'Please enter server name and description, they will appear in your server passport',
33
+ serverless: {
34
+ title: 'Preparing Instance',
35
+ preparing: 'Preparing...',
36
+ prepared: 'Instance ready, redrectring...',
37
+ prepareFailed: 'Prepare for instance failure!'
38
+ }
33
39
  },
34
40
  launch: {
35
41
  title: 'Createing Blocklet Server',
@@ -86,5 +92,14 @@ module.exports = {
86
92
  error: {
87
93
  loginFirst: 'Please login first'
88
94
  }
95
+ },
96
+ purchase: {
97
+ dialog: {
98
+ title: 'Purchase Blocklet Server NFT',
99
+ scan: 'Scan the QR code below with your DID wallet to complete purchase',
100
+ confirm: 'Confirm on your DID Wallet',
101
+ success: 'Purchase Success'
102
+ },
103
+ purchaseServerlessSuccess: 'The purchase of no service is successful and you can go ahead and install Blocklet'
89
104
  }
90
105
  };
package/lib/locales/zh.js CHANGED
@@ -29,7 +29,13 @@ module.exports = {
29
29
  },
30
30
  prepare: {
31
31
  title: '命名节点',
32
- subTitle: '请输入要创建的节点名称和描述,它们将显示在您的节点通行证中'
32
+ subTitle: '请输入要创建的节点名称和描述,它们将显示在您的节点通行证中',
33
+ serverless: {
34
+ title: '正在准备实例',
35
+ preparing: '准备实例中...',
36
+ prepared: '已准备好实例,跳转中...',
37
+ prepareFailed: '准备实例失败!'
38
+ }
33
39
  },
34
40
  launch: {
35
41
  title: '创建节点',
@@ -86,5 +92,14 @@ module.exports = {
86
92
  error: {
87
93
  loginFirst: '请先登录'
88
94
  }
95
+ },
96
+ purchase: {
97
+ dialog: {
98
+ title: '购买 Blocklet Server NFT',
99
+ scan: '用您的 DID 钱包扫描下面的二维码完成购买',
100
+ confirm: '在您的 DID 钱包上确认',
101
+ success: '支付成功'
102
+ },
103
+ purchaseServerlessSuccess: '购买无服务成功,您可以去安装 Blocklet'
89
104
  }
90
105
  };
package/lib/prepare.js CHANGED
@@ -4,232 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = PreparePage;
7
- var _react = require("react");
8
7
  var _reactRouterDom = require("react-router-dom");
9
- var _styled = _interopRequireDefault(require("@emotion/styled"));
10
- var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
11
- var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
12
- var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
13
- var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
14
- var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
15
- var _constant = require("@blocklet/launcher-util/lib/constant");
16
- var _server = _interopRequireDefault(require("@arcblock/license/lib/server"));
17
- var _serverEula = _interopRequireDefault(require("@blocklet/launcher-layout/lib/wizard/server-eula"));
18
- var _pageHeader = _interopRequireDefault(require("@blocklet/launcher-layout/lib/page-header"));
19
- var _ServerLogoNotext = _interopRequireDefault(require("@arcblock/icons/lib/ServerLogoNotext"));
20
- var _request = _interopRequireDefault(require("./contexts/request"));
21
- var _locale = require("./contexts/locale");
22
- var _router = _interopRequireWildcard(require("./contexts/router"));
23
- var _query = _interopRequireDefault(require("./hooks/query"));
24
- var _util = require("./util");
8
+ var _prepareServerless = _interopRequireDefault(require("./components/prepare-serverless"));
9
+ var _prepareStandard = _interopRequireDefault(require("./components/prepare-standard"));
25
10
  var _jsxRuntime = require("react/jsx-runtime");
26
- var _templateObject;
27
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
28
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
- function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
31
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
32
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
12
  function PreparePage() {
35
- const {
36
- t
37
- } = (0, _react.useContext)(_locale.LocaleContext);
38
- const [name, setName] = (0, _react.useState)('');
39
- const [description, setDescription] = (0, _react.useState)('');
40
- const [formError, setFormError] = (0, _react.useState)({
41
- name: '',
42
- description: ''
43
- });
44
- const routerPrefix = (0, _router.usePrefix)();
45
- const disabledBack = (0, _router.useDisabledBack)();
46
- const [launching, setLaunching] = (0, _react.useState)(false);
47
- const [showLaunchInstanceDialog, setShowLaunchInstanceDialog] = (0, _react.useState)(false);
48
13
  const {
49
14
  nftId
50
15
  } = (0, _reactRouterDom.useParams)();
51
- const navigate = (0, _reactRouterDom.useNavigate)();
52
- const {
53
- create: createRequest,
54
- api
55
- } = (0, _request.default)();
56
- const query = (0, _query.default)();
57
- const handleInput = id => e => {
58
- if (id === 'name') {
59
- setName(e.target.value);
60
- }
61
- if (id === 'description') {
62
- setDescription(e.target.value);
63
- }
64
- validate();
65
- };
66
- const isRedeem = nftId === _constant.REDEEM_NFT_ID;
67
- const headerScope = isRedeem ? 'redeem' : 'prepare';
68
- const validate = () => {
69
- let isError = false;
70
- if (name.length > _constant.INSTANCE_MAX_NAME_LENGTH) {
71
- isError = true;
72
- setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
73
- name: t('launchPrepare.formError.nameExceed', {
74
- length: _constant.INSTANCE_MAX_NAME_LENGTH
75
- })
76
- }));
77
- } else {
78
- setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
79
- name: ''
80
- }));
81
- }
82
- if (description.length > _constant.INSTANCE_MAX_DESC_LENGTH) {
83
- isError = true;
84
- setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
85
- description: t('launchPrepare.formError.descriptionExceed', {
86
- length: _constant.INSTANCE_MAX_DESC_LENGTH
87
- })
88
- }));
89
- } else {
90
- setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
91
- description: ''
92
- }));
93
- }
94
- return isError;
95
- };
96
- const handleLaunch = async () => {
97
- setLaunching(true);
98
- if (validate()) {
99
- return;
100
- }
101
- if (isRedeem) {
102
- setShowLaunchInstanceDialog(true);
103
- return;
104
- }
105
- try {
106
- const {
107
- status
108
- } = await api.post('/instances/launch', {
109
- nftId,
110
- name,
111
- description
112
- }, {
113
- params: {
114
- launchType: query.get('launchType')
115
- }
116
- });
117
- if (status !== 202) {
118
- _Toast.default.error(t('launch.error.launchFailed'));
119
- return;
120
- }
121
- handleAuthSuccess({
122
- nftId
123
- });
124
- } catch (err) {
125
- const errDesc = (0, _util.getAPIResponseError)(err);
126
- if (errDesc === 'Unauthorized') {
127
- _Toast.default.error(t('launchPrepare.error.loginFirst'));
128
- } else {
129
- _Toast.default.error(errDesc);
130
- }
131
- } finally {
132
- setLaunching(false);
133
- }
134
- };
135
-
136
- // eslint-disable-next-line no-shadow
137
- const handleAuthSuccess = _ref => {
138
- let {
139
- nftId
140
- } = _ref;
141
- navigate((0, _router.default)(routerPrefix, "/in-progress/".concat(nftId).concat(window.location.search)));
142
- };
143
- const handleCloseAuthDialog = () => {
144
- setLaunching(false);
145
- setShowLaunchInstanceDialog(false);
146
- };
147
- const clickBack = () => {
148
- navigate(-1);
149
- };
150
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
151
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(Container, {
152
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_pageHeader.default, {
153
- title: t("".concat(headerScope, ".title")),
154
- subTitle: t("".concat(headerScope, ".subTitle")),
155
- onClickBack: headerScope === 'redeem' && !disabledBack.includes('prepare') ? clickBack : ''
156
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
157
- className: "page-body",
158
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
159
- className: "page-logo",
160
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ServerLogoNotext.default, {
161
- style: {
162
- width: 48,
163
- height: 48
164
- }
165
- })
166
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
167
- className: "inputs",
168
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_FormControl.default, {
169
- className: "input-item",
170
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
171
- id: "name",
172
- variant: "outlined",
173
- label: t('common.name'),
174
- onChange: handleInput('name'),
175
- value: name,
176
- labelwidth: 0,
177
- autoFocus: true
178
- }), formError.name && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormHelperText.default, {
179
- children: formError.name
180
- })]
181
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_FormControl.default, {
182
- className: "input-item",
183
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
184
- id: "description",
185
- variant: "outlined",
186
- label: t('common.description'),
187
- onChange: handleInput('description'),
188
- value: description,
189
- labelwidth: 0
190
- }), formError.description && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormHelperText.default, {
191
- children: formError.description
192
- })]
193
- })]
194
- })]
195
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
196
- className: "botton-container",
197
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_serverEula.default, {
198
- onContinue: handleLaunch,
199
- nextDisabled: !name.trim() || !description.trim() || launching,
200
- launching: launching,
201
- description: /*#__PURE__*/(0, _jsxRuntime.jsx)(_server.default, {
202
- className: "eula-content"
203
- }),
204
- texts: {
205
- listenName: t('license.title'),
206
- launchingText: t('common.launching'),
207
- buttonNext: t('license.footer')
208
- }
209
- })
210
- })]
211
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Connect.default, {
212
- open: showLaunchInstanceDialog,
213
- popup: true,
214
- action: "launch-instance",
215
- checkFn: createRequest().get,
216
- onSuccess: handleAuthSuccess,
217
- onClose: handleCloseAuthDialog,
218
- checkTimeout: 60 * 5000,
219
- extraParams: {
220
- nftId,
221
- name,
222
- description
223
- },
224
- disableClose: true,
225
- showDownload: false,
226
- messages: {
227
- title: t('redeem.dialog.title'),
228
- scan: t('redeem.dialog.scan'),
229
- confirm: t('redeem.dialog.confirm'),
230
- success: t('redeem.dialog.success')
231
- }
232
- })]
16
+ const [searchParams] = (0, _reactRouterDom.useSearchParams)();
17
+ const launchType = searchParams.get('launchType');
18
+ if (launchType === 'serverless') {
19
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_prepareServerless.default, {
20
+ nftId: nftId
21
+ });
22
+ }
23
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_prepareStandard.default, {
24
+ nftId: nftId
233
25
  });
234
- }
235
- const Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n\n .page-logo {\n display: flex;\n justify-content: center;\n margin-top: 62px;\n ", " {\n margin-top: 48px;\n }\n }\n\n .inputs {\n display: flex;\n align-items: center;\n flex-direction: column;\n text-align: center;\n }\n .input-item {\n margin-top: 24px;\n width: 90%;\n max-width: 460px;\n font-size: 14px;\n input,\n textarea {\n font-size: 14px;\n }\n }\n .botton-container {\n width: 100%;\n margin: 24px auto;\n max-width: 460px;\n text-align: center;\n }\n"])), props => props.theme.breakpoints.down('md'));
26
+ }
package/lib/purchase.js CHANGED
@@ -26,6 +26,7 @@ var _query = _interopRequireDefault(require("./hooks/query"));
26
26
  var _locale = require("./contexts/locale");
27
27
  var _session = require("./contexts/session");
28
28
  var _router = _interopRequireWildcard(require("./contexts/router"));
29
+ var _util = require("./util");
29
30
  var _jsxRuntime = require("react/jsx-runtime");
30
31
  var _templateObject;
31
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -54,6 +55,7 @@ function PurchasePage(_ref) {
54
55
  const routerPrefix = (0, _router.usePrefix)();
55
56
  const [planLoaded, setPlanLoaded] = (0, _react.useState)(false);
56
57
  const isMobile = (0, _useMediaQuery.default)(theme => theme.breakpoints.down('md'));
58
+ const [searchParams] = (0, _reactRouterDom.useSearchParams)();
57
59
  const userDid = query.get('userDid') || (0, _lodash.default)(session, 'user.did');
58
60
  const isEmbed = !!query.get('blocklet_meta_url');
59
61
  (0, _react.useEffect)(() => {
@@ -62,7 +64,7 @@ function PurchasePage(_ref) {
62
64
  }
63
65
  // eslint-disable-next-line
64
66
  }, [paymentMethod, userDid]);
65
- const handlePaid = (_ref2, decrypt) => {
67
+ const handlePaid = async (_ref2, decrypt) => {
66
68
  let {
67
69
  nftId,
68
70
  launchToken
@@ -70,8 +72,22 @@ function PurchasePage(_ref) {
70
72
  if (launchToken) {
71
73
  _jsCookie.default.set('launch-token', decrypt(launchToken));
72
74
  }
73
- const url = "/prepare/".concat(nftId).concat(window.location.search);
74
- navigate((0, _router.default)(routerPrefix, url));
75
+ if (nftId !== _constant.REDEEM_NFT_ID) {
76
+ const nftState = await (0, _util.getAsset)(window.blocklet.CHAIN_HOST, nftId);
77
+ if ((nftState.tags || []).includes(_constant.NFT_TYPE_SERVERLESS)) {
78
+ if (!isEmbed) {
79
+ _Toast.default.success(t('purchase.purchaseServerlessSuccess'));
80
+ setPaying(false);
81
+ return;
82
+ }
83
+ searchParams.set('launchType', 'serverless');
84
+ }
85
+ }
86
+ navigate({
87
+ pathname: (0, _router.default)(routerPrefix, "/prepare/".concat(nftId)),
88
+ search: searchParams.toString()
89
+ });
90
+ setPaying(false);
75
91
  };
76
92
  const getPurchaseParams = () => {
77
93
  const obj = {
package/lib/util.js CHANGED
@@ -3,23 +3,37 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getAPIResponseError = void 0;
6
+ exports.getAsset = exports.getAPIResponseError = void 0;
7
7
  exports.getBlockletMetaUrl = getBlockletMetaUrl;
8
8
  exports.loadURL = exports.getLaunchBlockletUrl = void 0;
9
9
  var _urlJoin = _interopRequireDefault(require("url-join"));
10
10
  var _lodash = _interopRequireDefault(require("lodash.get"));
11
+ var _axios = _interopRequireDefault(require("axios"));
11
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
13
  function getBlockletMetaUrl(registry, did) {
13
14
  return (0, _urlJoin.default)(registry, "/api/blocklets/".concat(did, "/blocklet.json?source=webapp"));
14
15
  }
15
- const getLaunchBlockletUrl = (serverUrl, blockletMetaUrl, locale) => {
16
+ const getLaunchBlockletUrl = _ref => {
17
+ let {
18
+ serverUrl,
19
+ blockletMetaUrl,
20
+ locale,
21
+ launchType,
22
+ nftId
23
+ } = _ref;
16
24
  if (!blockletMetaUrl) {
17
25
  return serverUrl;
18
26
  }
19
- let result = (0, _urlJoin.default)(serverUrl, "/launch-blocklet/install?blocklet_meta_url=".concat(encodeURIComponent(blockletMetaUrl), "&from_launcher=true&from=").concat(encodeURIComponent(window.location.href)));
27
+ let result = (0, _urlJoin.default)(serverUrl, "/launch-blocklet/install?blocklet_meta_url=".concat(encodeURIComponent(blockletMetaUrl), "&fromLauncher=true&from=").concat(encodeURIComponent(window.location.href)));
28
+ if (launchType) {
29
+ result += "&launchType=".concat(launchType);
30
+ }
20
31
  if (locale) {
21
32
  result += "&locale=".concat(locale);
22
33
  }
34
+ if (nftId) {
35
+ result += "&nftId=".concat(nftId);
36
+ }
23
37
  return result;
24
38
  };
25
39
  exports.getLaunchBlockletUrl = getLaunchBlockletUrl;
@@ -49,4 +63,22 @@ const loadURL = url => new Promise(resolve => {
49
63
  document.body.appendChild(iframe);
50
64
  timer = setTimeout(done, 5000);
51
65
  });
52
- exports.loadURL = loadURL;
66
+ exports.loadURL = loadURL;
67
+ const getAsset = async (chainHost, address) => {
68
+ const url = (0, _urlJoin.default)(new URL(chainHost).origin, '/api/gql/');
69
+ const result = await _axios.default.create().post(url, JSON.stringify({
70
+ query: "{\n getAssetState(address: \"".concat(address, "\") {\n state {\n address\n data {\n typeUrl\n value\n }\n display {\n type\n content\n }\n issuer\n owner\n parent\n tags\n }\n }\n }")
71
+ }), {
72
+ headers: {
73
+ 'Content-Type': 'application/json',
74
+ Accept: 'application/json'
75
+ },
76
+ timeout: 60 * 1000
77
+ });
78
+ const state = (0, _lodash.default)(result, 'data.data.getAssetState.state');
79
+ if (state && state.data.typeUrl === 'json') {
80
+ state.data.value = JSON.parse(state.data.value);
81
+ }
82
+ return state;
83
+ };
84
+ exports.getAsset = getAsset;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/launcher-workflow",
3
- "version": "1.9.12",
3
+ "version": "1.9.14",
4
4
  "description": "Purchase components for Launcher UI",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -36,19 +36,19 @@
36
36
  "react": ">=18.1.0"
37
37
  },
38
38
  "dependencies": {
39
- "@arcblock/did-connect": "^2.4.52",
40
- "@arcblock/icons": "^2.4.52",
41
- "@arcblock/license": "^2.4.52",
42
- "@arcblock/ux": "^2.4.52",
43
- "@blocklet/launcher-layout": "1.9.12",
44
- "@blocklet/launcher-util": "1.9.12",
45
- "@blocklet/launcher-ux": "1.9.12",
46
- "@did-pay/react": "^1.9.22",
39
+ "@arcblock/did-connect": "^2.4.55",
40
+ "@arcblock/icons": "^2.4.55",
41
+ "@arcblock/license": "^2.4.55",
42
+ "@arcblock/ux": "^2.4.55",
43
+ "@blocklet/launcher-layout": "1.9.14",
44
+ "@blocklet/launcher-util": "1.9.14",
45
+ "@blocklet/launcher-ux": "1.9.14",
46
+ "@did-pay/react": "^1.9.27",
47
47
  "@emotion/react": "^11.10.5",
48
48
  "@emotion/styled": "^11.10.5",
49
- "@mui/icons-material": "^5.10.14",
50
- "@mui/material": "^5.10.14",
51
- "@ocap/util": "^1.18.17",
49
+ "@mui/icons-material": "^5.10.16",
50
+ "@mui/material": "^5.10.16",
51
+ "@ocap/util": "^1.18.23",
52
52
  "@stripe/react-stripe-js": "^1.15.0",
53
53
  "@stripe/stripe-js": "^1.44.1",
54
54
  "axios": "^0.26.1",
@@ -58,16 +58,16 @@
58
58
  "lodash.throttle": "^4.1.1",
59
59
  "prop-types": "^15.8.1",
60
60
  "react-lottie-player": "^1.5.0",
61
- "react-router-dom": "^6.4.3",
61
+ "react-router-dom": "^6.4.4",
62
62
  "react-use": "^17.4.0",
63
63
  "url-join": "^4.0.1"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@babel/cli": "^7.19.3",
67
- "@babel/core": "^7.20.2",
67
+ "@babel/core": "^7.20.5",
68
68
  "@babel/preset-env": "^7.20.2",
69
69
  "@babel/preset-react": "^7.18.6",
70
70
  "babel-plugin-inline-react-svg": "^2.0.1"
71
71
  },
72
- "gitHead": "372c626232cb048751025e09b41c36a4ef42156d"
72
+ "gitHead": "c1ec0f49e1af14f6b461ce8b8fdb9a5cd9f3e3ef"
73
73
  }