@blocklet/launcher-workflow 1.5.67 → 1.5.68

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.
@@ -21,6 +21,8 @@ var _CheckCircleOutlineRounded = _interopRequireDefault(require("@material-ui/ic
21
21
 
22
22
  var _FormLabel = _interopRequireDefault(require("@material-ui/core/FormLabel"));
23
23
 
24
+ var _Spinner = _interopRequireDefault(require("@arcblock/ux/lib/Spinner"));
25
+
24
26
  var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
25
27
 
26
28
  var _server = _interopRequireDefault(require("@arcblock/license/lib/server"));
@@ -39,7 +41,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
39
41
  function ServerEula(_ref) {
40
42
  let {
41
43
  onContinue,
42
- nextDisabled
44
+ nextDisabled,
45
+ launching
43
46
  } = _ref;
44
47
  const [agreed, setAgreed] = (0, _useLocalStorage.default)('server-eula-checked', false);
45
48
  const [open, setOpen] = (0, _react.useState)(false);
@@ -75,7 +78,9 @@ function ServerEula(_ref) {
75
78
  variant: "contained",
76
79
  className: "next-button",
77
80
  onClick: onContinue
78
- }, t('common.next'))), open && /*#__PURE__*/_react.default.createElement(_confirm.default, {
81
+ }, launching ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Spinner.default, {
82
+ size: 14
83
+ }), t('common.launching')) : t('common.next'))), open && /*#__PURE__*/_react.default.createElement(_confirm.default, {
79
84
  title: t('license.title'),
80
85
  description: /*#__PURE__*/_react.default.createElement(_server.default, {
81
86
  className: "eula-content"
@@ -88,10 +93,12 @@ function ServerEula(_ref) {
88
93
 
89
94
  ServerEula.propTypes = {
90
95
  onContinue: _propTypes.default.func.isRequired,
91
- nextDisabled: _propTypes.default.bool
96
+ nextDisabled: _propTypes.default.bool,
97
+ launching: _propTypes.default.bool
92
98
  };
93
99
  ServerEula.defaultProps = {
94
- nextDisabled: false
100
+ nextDisabled: false,
101
+ launching: false
95
102
  };
96
103
 
97
104
  const Div = _styledComponents.default.div.withConfig({
@@ -18,6 +18,8 @@ var _urlJoin = _interopRequireDefault(require("url-join"));
18
18
 
19
19
  var _session = require("./session");
20
20
 
21
+ var _locale = require("./locale");
22
+
21
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
24
 
23
25
  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); }
@@ -44,6 +46,9 @@ function RequestProvider(_ref) {
44
46
  const {
45
47
  session
46
48
  } = (0, _session.useSessionContext)();
49
+ const {
50
+ locale
51
+ } = (0, _locale.useLocaleContext)();
47
52
 
48
53
  const privateRequest = _axios.default.create({
49
54
  baseURL
@@ -51,6 +56,12 @@ function RequestProvider(_ref) {
51
56
 
52
57
  privateRequest.interceptors.request.use(config => {
53
58
  config.url = (0, _urlJoin.default)('/api', config.url);
59
+
60
+ if (!config.params) {
61
+ config.params = {};
62
+ }
63
+
64
+ config.params.locale = locale;
54
65
  return config;
55
66
  });
56
67
  privateRequest.interceptors.response.use(response => response, err => {
package/lib/index.js CHANGED
@@ -77,11 +77,11 @@ function Stripe(_ref2) {
77
77
  } = _ref2,
78
78
  rest = _objectWithoutProperties(_ref2, _excluded);
79
79
 
80
- return /*#__PURE__*/_react.default.createElement(_request.RequestProvider, {
81
- baseURL: baseURL
82
- }, /*#__PURE__*/_react.default.createElement(_locale.LocaleProvider, {
80
+ return /*#__PURE__*/_react.default.createElement(_locale.LocaleProvider, {
83
81
  translations: _locales.translations,
84
82
  locale: locale
83
+ }, /*#__PURE__*/_react.default.createElement(_request.RequestProvider, {
84
+ baseURL: baseURL
85
85
  }, /*#__PURE__*/_react.default.createElement(_checkout.default, rest)));
86
86
  }
87
87
 
@@ -101,11 +101,11 @@ function Launcher(_ref3) {
101
101
  locale,
102
102
  baseURL
103
103
  } = _ref3;
104
- return /*#__PURE__*/_react.default.createElement(_request.RequestProvider, {
105
- baseURL: baseURL
106
- }, /*#__PURE__*/_react.default.createElement(_locale.LocaleProvider, {
104
+ return /*#__PURE__*/_react.default.createElement(_locale.LocaleProvider, {
107
105
  translations: _locales.translations,
108
106
  locale: locale
107
+ }, /*#__PURE__*/_react.default.createElement(_request.RequestProvider, {
108
+ baseURL: baseURL
109
109
  }, /*#__PURE__*/_react.default.createElement(LaunchContent, {
110
110
  Route: Route,
111
111
  routerPrefix: routerPrefix,
package/lib/locales/en.js CHANGED
@@ -19,7 +19,8 @@ module.exports = {
19
19
  redeem: 'Redeem',
20
20
  redirecting: 'Redirecting',
21
21
  cancel: 'Cancel',
22
- confirm: 'Confirm'
22
+ confirm: 'Confirm',
23
+ launching: 'Launching'
23
24
  },
24
25
  plan: {
25
26
  title: 'Select Blocklet Server Plan',
package/lib/locales/zh.js CHANGED
@@ -17,7 +17,8 @@ module.exports = {
17
17
  purchase: '购买',
18
18
  redirecting: '跳转中',
19
19
  cancel: '取消',
20
- confirm: '同意'
20
+ confirm: '同意',
21
+ launching: '启动中'
21
22
  },
22
23
  plan: {
23
24
  title: '创建节点',
package/lib/prepare.js CHANGED
@@ -11,6 +11,8 @@ var _reactRouterDom = require("react-router-dom");
11
11
 
12
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
 
14
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
15
+
14
16
  var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
15
17
 
16
18
  var _utils = require("@arcblock/did-connect/lib/utils");
@@ -33,6 +35,8 @@ var _locale = require("./contexts/locale");
33
35
 
34
36
  var _router = _interopRequireWildcard(require("./contexts/router"));
35
37
 
38
+ var _util = require("./util");
39
+
36
40
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
41
 
38
42
  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); }
@@ -80,8 +84,6 @@ BlockletServerIcon.defaultProps = {
80
84
  fill: "none",
81
85
  xmlns: "http://www.w3.org/2000/svg"
82
86
  };
83
- const MAX_NAME_LENGTH = 30;
84
- const MAX_DESC_LENGTH = 50;
85
87
 
86
88
  function PreparePage() {
87
89
  const {
@@ -89,18 +91,21 @@ function PreparePage() {
89
91
  } = (0, _react.useContext)(_locale.LocaleContext);
90
92
  const [name, setName] = (0, _react.useState)('');
91
93
  const [description, setDescription] = (0, _react.useState)('');
92
- const [error, setError] = (0, _react.useState)({
94
+ const [formError, setFormError] = (0, _react.useState)({
93
95
  name: '',
94
96
  description: ''
95
97
  });
96
98
  const routerPrefix = (0, _router.usePrefix)();
99
+ const [launching, setLaunching] = (0, _react.useState)(false);
100
+ const [error, setError] = (0, _react.useState)('');
97
101
  const [showLaunchInstanceDialog, setShowLaunchInstanceDialog] = (0, _react.useState)(false);
98
102
  const {
99
103
  nftId
100
104
  } = (0, _reactRouterDom.useParams)();
101
105
  const history = (0, _reactRouterDom.useHistory)();
102
106
  const {
103
- create: createRequest
107
+ create: createRequest,
108
+ api
104
109
  } = (0, _request.default)();
105
110
 
106
111
  const handleInput = id => e => {
@@ -115,31 +120,34 @@ function PreparePage() {
115
120
  validate();
116
121
  };
117
122
 
123
+ const isRedeem = nftId === _launcherConstant.REDEEM_NFT_ID;
124
+ const headerScope = isRedeem ? 'redeem' : 'prepare';
125
+
118
126
  const validate = () => {
119
127
  let isError = false;
120
128
 
121
- if (name.length > MAX_NAME_LENGTH) {
129
+ if (name.length > _launcherConstant.INSTANCE_MAX_NAME_LENGTH) {
122
130
  isError = true;
123
- setError(value => _objectSpread(_objectSpread({}, value), {}, {
124
- name: t('launchPrepare.error.nameExceed', {
125
- length: MAX_NAME_LENGTH
131
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
132
+ name: t('launchPrepare.formError.nameExceed', {
133
+ length: _launcherConstant.INSTANCE_MAX_NAME_LENGTH
126
134
  })
127
135
  }));
128
136
  } else {
129
- setError(value => _objectSpread(_objectSpread({}, value), {}, {
137
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
130
138
  name: ''
131
139
  }));
132
140
  }
133
141
 
134
- if (description.length > MAX_DESC_LENGTH) {
142
+ if (description.length > _launcherConstant.INSTANCE_MAX_DESC_LENGTH) {
135
143
  isError = true;
136
- setError(value => _objectSpread(_objectSpread({}, value), {}, {
137
- description: t('launchPrepare.error.descriptionExceed', {
138
- length: MAX_DESC_LENGTH
144
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
145
+ description: t('launchPrepare.formError.descriptionExceed', {
146
+ length: _launcherConstant.INSTANCE_MAX_DESC_LENGTH
139
147
  })
140
148
  }));
141
149
  } else {
142
- setError(value => _objectSpread(_objectSpread({}, value), {}, {
150
+ setFormError(value => _objectSpread(_objectSpread({}, value), {}, {
143
151
  description: ''
144
152
  }));
145
153
  }
@@ -147,12 +155,40 @@ function PreparePage() {
147
155
  return isError;
148
156
  };
149
157
 
150
- const handleLaunch = () => {
158
+ const handleLaunch = async () => {
159
+ setLaunching(true);
160
+
151
161
  if (validate()) {
152
162
  return;
153
163
  }
154
164
 
155
- setShowLaunchInstanceDialog(true);
165
+ if (isRedeem) {
166
+ setShowLaunchInstanceDialog(true);
167
+ return;
168
+ }
169
+
170
+ try {
171
+ const {
172
+ status
173
+ } = await api.post('/instances/launch', {
174
+ nftId,
175
+ name,
176
+ description
177
+ });
178
+
179
+ if (status !== 202) {
180
+ setError(t('launch.error.launchFailed'));
181
+ return;
182
+ }
183
+
184
+ handleAuthSuccess({
185
+ nftId
186
+ });
187
+ } catch (err) {
188
+ setError((0, _util.getAPIResponseError)(err));
189
+ } finally {
190
+ setLaunching(false);
191
+ }
156
192
  }; // eslint-disable-next-line no-shadow
157
193
 
158
194
 
@@ -163,11 +199,11 @@ function PreparePage() {
163
199
  history.push((0, _router.default)(routerPrefix, "/in-progress/".concat(nftId).concat(window.location.search)));
164
200
  };
165
201
 
166
- const handleCloseAuthDialog = () => setShowLaunchInstanceDialog(false);
202
+ const handleCloseAuthDialog = () => {
203
+ setLaunching(false);
204
+ setShowLaunchInstanceDialog(false);
205
+ };
167
206
 
168
- const isRedeem = nftId === _launcherConstant.REDEEM_NFT_ID;
169
- const headerScope = isRedeem ? 'redeem' : 'prepare';
170
- const buttonScope = isRedeem ? 'redeem' : 'launch';
171
207
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Container, null, /*#__PURE__*/_react.default.createElement(_pageHeader.default, {
172
208
  title: t("".concat(headerScope, ".title")),
173
209
  subTitle: t("".concat(headerScope, ".subTitle"))
@@ -179,7 +215,7 @@ function PreparePage() {
179
215
  className: "inputs"
180
216
  }, /*#__PURE__*/_react.default.createElement(_FormControl.default, {
181
217
  className: "input-item",
182
- error: !!error.name
218
+ formError: !!formError.name
183
219
  }, /*#__PURE__*/_react.default.createElement(_TextField.default, {
184
220
  id: "name",
185
221
  variant: "outlined",
@@ -188,24 +224,25 @@ function PreparePage() {
188
224
  value: name,
189
225
  labelWidth: 0,
190
226
  autoFocus: true
191
- }), error.name && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, error.name)), /*#__PURE__*/_react.default.createElement(_FormControl.default, {
227
+ }), formError.name && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, formError.name)), /*#__PURE__*/_react.default.createElement(_FormControl.default, {
192
228
  className: "input-item",
193
- error: !!error.description
229
+ formError: !!formError.description
194
230
  }, /*#__PURE__*/_react.default.createElement(_TextField.default, {
195
231
  id: "description",
196
232
  variant: "outlined",
197
233
  label: t('common.description'),
198
- error: !!error.desc,
234
+ formError: !!formError.desc,
199
235
  onChange: handleInput('description'),
200
236
  multiline: true,
201
237
  maxRows: 5,
202
238
  value: description,
203
239
  labelWidth: 0
204
- }), error.description && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, error.description)))), /*#__PURE__*/_react.default.createElement("div", {
240
+ }), formError.description && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, formError.description)))), /*#__PURE__*/_react.default.createElement("div", {
205
241
  className: "botton-container"
206
242
  }, /*#__PURE__*/_react.default.createElement(_serverEula.default, {
207
243
  onContinue: handleLaunch,
208
- nextDisabled: !name.trim() || !description.trim()
244
+ nextDisabled: !name.trim() || !description.trim() || launching,
245
+ launching: launching
209
246
  }))), /*#__PURE__*/_react.default.createElement(_Connect.default, {
210
247
  open: showLaunchInstanceDialog,
211
248
  popup: true,
@@ -223,11 +260,15 @@ function PreparePage() {
223
260
  disableClose: true,
224
261
  showDownload: false,
225
262
  messages: {
226
- title: t("".concat(buttonScope, ".dialog.title")),
227
- scan: t("".concat(buttonScope, ".dialog.scan")),
228
- confirm: t("".concat(buttonScope, ".dialog.confirm")),
229
- success: t("".concat(buttonScope, ".dialog.success"))
263
+ title: t('redeem.dialog.title'),
264
+ scan: t('redeem.dialog.scan'),
265
+ confirm: t('redeem.dialog.confirm'),
266
+ success: t('redeem.dialog.success')
230
267
  }
268
+ }), error && /*#__PURE__*/_react.default.createElement(_Toast.default, {
269
+ message: error,
270
+ variant: "error",
271
+ onClose: () => setError('')
231
272
  }));
232
273
  }
233
274
 
package/lib/purchase.js CHANGED
@@ -15,6 +15,8 @@ var _lodash = _interopRequireDefault(require("lodash.get"));
15
15
 
16
16
  var _styledComponents = _interopRequireDefault(require("styled-components"));
17
17
 
18
+ var _jsCookie = _interopRequireDefault(require("js-cookie"));
19
+
18
20
  var _Coins = require("@styled-icons/remix-fill/Coins");
19
21
 
20
22
  var _util = require("@ocap/util");
@@ -160,8 +162,12 @@ function PurchasePage() {
160
162
 
161
163
  const handlePaid = _ref => {
162
164
  let {
163
- nftId
165
+ nftId,
166
+ launchToken
164
167
  } = _ref;
168
+
169
+ _jsCookie.default.set('launch-token', launchToken);
170
+
165
171
  const url = "/prepare/".concat(nftId).concat(window.location.search);
166
172
  history.push((0, _router.default)(routerPrefix, url));
167
173
  };
package/lib/util.js CHANGED
@@ -3,11 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.getAPIResponseError = void 0;
6
7
  exports.getBlockletMetaUrl = getBlockletMetaUrl;
7
8
  exports.loadURL = exports.getLaunchBlockletUrl = void 0;
8
9
 
9
10
  var _urlJoin = _interopRequireDefault(require("url-join"));
10
11
 
12
+ var _lodash = _interopRequireDefault(require("lodash.get"));
13
+
11
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
15
 
13
16
  function getBlockletMetaUrl(registry, did) {
@@ -30,6 +33,10 @@ const getLaunchBlockletUrl = (serverUrl, blockletMetaUrl, locale) => {
30
33
 
31
34
  exports.getLaunchBlockletUrl = getLaunchBlockletUrl;
32
35
 
36
+ const getAPIResponseError = error => (0, _lodash.default)(error, 'response.data.error', '') || error.message;
37
+
38
+ exports.getAPIResponseError = getAPIResponseError;
39
+
33
40
  const loadURL = url => new Promise(resolve => {
34
41
  let timer;
35
42
  const iframe = document.createElement('iframe');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/launcher-workflow",
3
- "version": "1.5.67",
3
+ "version": "1.5.68",
4
4
  "description": "Purchase components for Launcher UI",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -41,8 +41,8 @@
41
41
  "@arcblock/icons": "^1.16.49",
42
42
  "@arcblock/license": "^1.16.49",
43
43
  "@arcblock/ux": "^1.16.49",
44
- "@blocklet/launcher-constant": "1.5.67",
45
- "@blocklet/launcher-layout": "1.5.67",
44
+ "@blocklet/launcher-constant": "1.5.68",
45
+ "@blocklet/launcher-layout": "1.5.68",
46
46
  "@material-ui/core": "^4.12.3",
47
47
  "@material-ui/icons": "^4.11.2",
48
48
  "@material-ui/lab": "^4.0.0-alpha.60",
@@ -52,6 +52,7 @@
52
52
  "@styled-icons/remix-fill": "^10.18.0",
53
53
  "axios": "^0.26.0",
54
54
  "flat": "^5.0.2",
55
+ "js-cookie": "^3.0.1",
55
56
  "lodash.get": "^4.4.2",
56
57
  "lodash.throttle": "^4.1.1",
57
58
  "prop-types": "^15.8.1",
@@ -68,5 +69,5 @@
68
69
  "babel-plugin-inline-react-svg": "^2.0.1",
69
70
  "babel-plugin-styled-components": "^1.10.7"
70
71
  },
71
- "gitHead": "148ece1f7072a00dac0ef077e8e96b4460cc6381"
72
+ "gitHead": "70a65ca42b47efb86e93b8495ce6db35d4360cff"
72
73
  }