@blocklet/launcher-workflow 1.5.65 → 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.
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ConfirmDialog;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
13
+
14
+ var _Dialog = _interopRequireDefault(require("@material-ui/core/Dialog"));
15
+
16
+ var _DialogActions = _interopRequireDefault(require("@material-ui/core/DialogActions"));
17
+
18
+ var _DialogContent = _interopRequireDefault(require("@material-ui/core/DialogContent"));
19
+
20
+ var _DialogContentText = _interopRequireDefault(require("@material-ui/core/DialogContentText"));
21
+
22
+ var _DialogTitle = _interopRequireDefault(require("@material-ui/core/DialogTitle"));
23
+
24
+ var _useTheme = _interopRequireDefault(require("@material-ui/core/styles/useTheme"));
25
+
26
+ var _useMediaQuery = _interopRequireDefault(require("@material-ui/core/useMediaQuery"));
27
+
28
+ var _locale = require("../contexts/locale");
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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); }
33
+
34
+ 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; }
35
+
36
+ function ConfirmDialog(_ref) {
37
+ let {
38
+ title,
39
+ description,
40
+ cancel,
41
+ confirm,
42
+ color,
43
+ params: initialParams,
44
+ onCancel,
45
+ onConfirm
46
+ } = _ref;
47
+ const {
48
+ t
49
+ } = (0, _react.useContext)(_locale.LocaleContext);
50
+ const [params, setParams] = (0, _react.useState)(initialParams);
51
+ const theme = (0, _useTheme.default)();
52
+ const isBreakpointsDownSm = (0, _useMediaQuery.default)(theme.breakpoints.down('sm'));
53
+
54
+ const onCallback = cb => {
55
+ if (typeof cb === 'function') {
56
+ cb(params);
57
+ }
58
+ };
59
+
60
+ return /*#__PURE__*/_react.default.createElement(_Dialog.default, {
61
+ open: true,
62
+ fullScreen: isBreakpointsDownSm
63
+ }, /*#__PURE__*/_react.default.createElement(_DialogTitle.default, null, typeof title === 'function' ? title() : title), /*#__PURE__*/_react.default.createElement(_DialogContent.default, null, /*#__PURE__*/_react.default.createElement(_DialogContentText.default, null, typeof description === 'function' ? description(params, setParams) : description)), /*#__PURE__*/_react.default.createElement(_DialogActions.default, {
64
+ style: {
65
+ padding: '8px 24px 24px'
66
+ }
67
+ }, /*#__PURE__*/_react.default.createElement(_Button.default, {
68
+ onClick: () => onCallback(onCancel),
69
+ color: "default",
70
+ rounded: true
71
+ }, cancel || t('common.cancel')), /*#__PURE__*/_react.default.createElement(_Button.default, {
72
+ onClick: () => onCallback(onConfirm),
73
+ color: color,
74
+ variant: "outlined",
75
+ autoFocus: true,
76
+ rounded: true
77
+ }, confirm || t('common.confirm'))));
78
+ }
79
+
80
+ ConfirmDialog.propTypes = {
81
+ title: _propTypes.default.any.isRequired,
82
+ description: _propTypes.default.any.isRequired,
83
+ // can be a function that renders different content based on params
84
+ cancel: _propTypes.default.string,
85
+ color: _propTypes.default.string,
86
+ confirm: _propTypes.default.string,
87
+ params: _propTypes.default.object,
88
+ // This object holds states managed in the dialog
89
+ onCancel: _propTypes.default.func,
90
+ onConfirm: _propTypes.default.func.isRequired
91
+ };
92
+ ConfirmDialog.defaultProps = {
93
+ onCancel: () => {},
94
+ cancel: '',
95
+ confirm: '',
96
+ color: 'danger',
97
+ params: {}
98
+ };
@@ -9,12 +9,12 @@ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactRouterDom = require("react-router-dom");
11
11
 
12
- var _reactUse = require("react-use");
13
-
14
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
13
 
16
14
  var _lodash = _interopRequireDefault(require("lodash.get"));
17
15
 
16
+ var _useInterval = _interopRequireDefault(require("react-use/lib/useInterval"));
17
+
18
18
  var _lodash2 = _interopRequireDefault(require("lodash.throttle"));
19
19
 
20
20
  var _styledComponents = _interopRequireDefault(require("styled-components"));
@@ -121,7 +121,7 @@ function OperationPage(_ref) {
121
121
  };
122
122
 
123
123
  const poll = (0, _lodash2.default)(getInstanceStatus, 5000);
124
- (0, _reactUse.useInterval)(poll, launchState.status === STATUS.launching && nftId ? 5000 : null);
124
+ (0, _useInterval.default)(poll, launchState.status === STATUS.launching && nftId ? 5000 : null);
125
125
  (0, _react.useEffect)(() => {
126
126
  if (!nftId) {
127
127
  return;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ServerEula;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _useLocalStorage = _interopRequireDefault(require("react-use/lib/useLocalStorage"));
15
+
16
+ var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
17
+
18
+ var _CheckCircleRounded = _interopRequireDefault(require("@material-ui/icons/CheckCircleRounded"));
19
+
20
+ var _CheckCircleOutlineRounded = _interopRequireDefault(require("@material-ui/icons/CheckCircleOutlineRounded"));
21
+
22
+ var _FormLabel = _interopRequireDefault(require("@material-ui/core/FormLabel"));
23
+
24
+ var _Spinner = _interopRequireDefault(require("@arcblock/ux/lib/Spinner"));
25
+
26
+ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
27
+
28
+ var _server = _interopRequireDefault(require("@arcblock/license/lib/server"));
29
+
30
+ var _locale = require("../contexts/locale");
31
+
32
+ var _confirm = _interopRequireDefault(require("./confirm"));
33
+
34
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
+
36
+ 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); }
37
+
38
+ 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; }
39
+
40
+ /* eslint-disable react/jsx-wrap-multilines */
41
+ function ServerEula(_ref) {
42
+ let {
43
+ onContinue,
44
+ nextDisabled,
45
+ launching
46
+ } = _ref;
47
+ const [agreed, setAgreed] = (0, _useLocalStorage.default)('server-eula-checked', false);
48
+ const [open, setOpen] = (0, _react.useState)(false);
49
+ const {
50
+ t
51
+ } = (0, _react.useContext)(_locale.LocaleContext);
52
+
53
+ const handleChecked = () => setAgreed(x => !x);
54
+
55
+ const handleOpen = () => setOpen(x => !x);
56
+
57
+ const handleCancel = () => setOpen(false);
58
+
59
+ const handleConfirm = () => {
60
+ setAgreed(true);
61
+ setOpen(false);
62
+ };
63
+
64
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Div, null, /*#__PURE__*/_react.default.createElement("div", {
65
+ className: "eula-checkbox"
66
+ }, /*#__PURE__*/_react.default.createElement(_Checkbox.default, {
67
+ checked: agreed,
68
+ onChange: handleChecked,
69
+ color: "primary",
70
+ checkedIcon: /*#__PURE__*/_react.default.createElement(_CheckCircleRounded.default, null),
71
+ icon: /*#__PURE__*/_react.default.createElement(_CheckCircleOutlineRounded.default, null)
72
+ }), /*#__PURE__*/_react.default.createElement(_FormLabel.default, {
73
+ className: "eula-trigger",
74
+ onClick: handleOpen
75
+ }, t('license.footer'))), /*#__PURE__*/_react.default.createElement(_Button.default, {
76
+ disabled: !agreed || nextDisabled,
77
+ color: "primary",
78
+ variant: "contained",
79
+ className: "next-button",
80
+ onClick: onContinue
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, {
84
+ title: t('license.title'),
85
+ description: /*#__PURE__*/_react.default.createElement(_server.default, {
86
+ className: "eula-content"
87
+ }),
88
+ color: "primary",
89
+ onCancel: handleCancel,
90
+ onConfirm: handleConfirm
91
+ }));
92
+ }
93
+
94
+ ServerEula.propTypes = {
95
+ onContinue: _propTypes.default.func.isRequired,
96
+ nextDisabled: _propTypes.default.bool,
97
+ launching: _propTypes.default.bool
98
+ };
99
+ ServerEula.defaultProps = {
100
+ nextDisabled: false,
101
+ launching: false
102
+ };
103
+
104
+ const Div = _styledComponents.default.div.withConfig({
105
+ displayName: "server-eula__Div",
106
+ componentId: "sc-16uy00s-0"
107
+ })(["width:90%;max-width:450px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;@media (max-width:", "px){flex-direction:column;}.eula-checkbox{display:flex;align-items:center;.eula-trigger{cursor:pointer;font-size:14px;&:hover{color:", ";}}}.next-button{width:120px;}"], props => props.theme.breakpoints.values.sm, props => props.theme.palette.primary.main);
@@ -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
@@ -17,11 +17,14 @@ module.exports = {
17
17
  next: 'Next',
18
18
  purchase: 'Purchase',
19
19
  redeem: 'Redeem',
20
- redirecting: 'Redirecting'
20
+ redirecting: 'Redirecting',
21
+ cancel: 'Cancel',
22
+ confirm: 'Confirm',
23
+ launching: 'Launching'
21
24
  },
22
25
  plan: {
23
- title: 'Select Blocklet Server Type',
24
- subTitle: 'Please select payment method and Blocklet Server type',
26
+ title: 'Select Blocklet Server Plan',
27
+ subTitle: 'Select payment method and plan',
25
28
  loadListFailed: 'Plan list load error',
26
29
  paymentCredit: {
27
30
  status: {
@@ -35,9 +38,13 @@ module.exports = {
35
38
  useFiat: 'Credit Card',
36
39
  noPlan: 'No blocklet server available for purchase'
37
40
  },
41
+ license: {
42
+ title: 'End User License Agreement',
43
+ footer: 'I agree to the Blocklet Server EULA'
44
+ },
38
45
  prepare: {
39
46
  title: 'Naming Blocklet Server',
40
- subTitle: 'Please enter the name and description of the Blocklet Server'
47
+ subTitle: 'Please enter server name and description, they will appear in your server passport'
41
48
  },
42
49
  launch: {
43
50
  title: 'Create Blocklet Server',
@@ -71,7 +78,7 @@ module.exports = {
71
78
  },
72
79
  redeem: {
73
80
  title: 'Redeem Blocklet Server',
74
- subTitle: 'Name and describe the Blocklet Server you are going to redeem',
81
+ subTitle: 'Name the blocklet server you are going to redeem, the name will exist on server passport',
75
82
  dialog: {
76
83
  title: 'Redeem Blocklet Server',
77
84
  scan: 'Scan the QR code below with your DID wallet to complete redeem',
package/lib/locales/zh.js CHANGED
@@ -12,10 +12,13 @@ module.exports = {
12
12
  description: '描述',
13
13
  retry: '重试',
14
14
  launch: '启动',
15
- next: '下一步',
15
+ next: '继续',
16
16
  redeem: '兑换',
17
17
  purchase: '购买',
18
- redirecting: '跳转中'
18
+ redirecting: '跳转中',
19
+ cancel: '取消',
20
+ confirm: '同意',
21
+ launching: '启动中'
19
22
  },
20
23
  plan: {
21
24
  title: '创建节点',
@@ -33,9 +36,13 @@ module.exports = {
33
36
  useFiat: '信用卡支付',
34
37
  noPlan: '没有可购买的节点类型'
35
38
  },
39
+ license: {
40
+ title: '节点用户协议',
41
+ footer: '我已经阅读并同意节点的用户协议'
42
+ },
36
43
  prepare: {
37
44
  title: '命名节点',
38
- subTitle: '请输入要创建的节点名称和描述'
45
+ subTitle: '请输入要创建的节点名称和描述,它们将显示在您的节点通行证中'
39
46
  },
40
47
  launch: {
41
48
  title: '创建节点',
@@ -69,7 +76,7 @@ module.exports = {
69
76
  },
70
77
  redeem: {
71
78
  title: '启动节点',
72
- subTitle: '为你的节点起个名字吧',
79
+ subTitle: '为你的节点起个名字吧,节点名字将会打印在节点通行证上',
73
80
  dialog: {
74
81
  title: '兑换节点',
75
82
  scan: '用您的 DID 钱包扫描下面的二维码,提供 NFT',
package/lib/prepare.js CHANGED
@@ -11,7 +11,7 @@ var _reactRouterDom = require("react-router-dom");
11
11
 
12
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
 
14
- var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
14
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
15
15
 
16
16
  var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
17
17
 
@@ -27,12 +27,16 @@ var _launcherConstant = require("@blocklet/launcher-constant");
27
27
 
28
28
  var _pageHeader = _interopRequireDefault(require("./components/page-header"));
29
29
 
30
+ var _serverEula = _interopRequireDefault(require("./components/server-eula"));
31
+
30
32
  var _request = _interopRequireDefault(require("./contexts/request"));
31
33
 
32
34
  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,31 +224,26 @@ 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
- }, /*#__PURE__*/_react.default.createElement(_Button.default, {
207
- disabled: !name.trim() || !description.trim(),
208
- style: {
209
- width: 300
210
- },
211
- color: "primary",
212
- variant: "contained",
213
- rounded: true,
214
- onClick: handleLaunch
215
- }, t('common.next')))), /*#__PURE__*/_react.default.createElement(_Connect.default, {
242
+ }, /*#__PURE__*/_react.default.createElement(_serverEula.default, {
243
+ onContinue: handleLaunch,
244
+ nextDisabled: !name.trim() || !description.trim() || launching,
245
+ launching: launching
246
+ }))), /*#__PURE__*/_react.default.createElement(_Connect.default, {
216
247
  open: showLaunchInstanceDialog,
217
248
  popup: true,
218
249
  action: "launch-instance",
@@ -229,15 +260,19 @@ function PreparePage() {
229
260
  disableClose: true,
230
261
  showDownload: false,
231
262
  messages: {
232
- title: t("".concat(buttonScope, ".dialog.title")),
233
- scan: t("".concat(buttonScope, ".dialog.scan")),
234
- confirm: t("".concat(buttonScope, ".dialog.confirm")),
235
- 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')
236
267
  }
268
+ }), error && /*#__PURE__*/_react.default.createElement(_Toast.default, {
269
+ message: error,
270
+ variant: "error",
271
+ onClose: () => setError('')
237
272
  }));
238
273
  }
239
274
 
240
275
  const Container = _styledComponents.default.div.withConfig({
241
276
  displayName: "prepare__Container",
242
277
  componentId: "sc-1ddofcz-0"
243
- })(["display:flex;flex-direction:column;width:100%;height:100%;.page-logo{display:flex;justify-content:center;margin-top:62px;", "{margin-top:48px;}}.inputs{display:flex;align-items:center;flex-direction:column;text-align:center;}.input-item{margin-top:24px;width:90%;max-width:343px;font-size:14px;input,textarea{font-size:14px;}}.botton-container{margin-top:24px;text-align:center;}"], props => props.theme.breakpoints.down('sm'));
278
+ })(["display:flex;flex-direction:column;width:100%;height:100%;.page-logo{display:flex;justify-content:center;margin-top:62px;", "{margin-top:48px;}}.inputs{display:flex;align-items:center;flex-direction:column;text-align:center;}.input-item{margin-top:24px;width:90%;max-width:450px;font-size:14px;input,textarea{font-size:14px;}}.botton-container{margin-top:24px;text-align:center;}"], props => props.theme.breakpoints.down('sm'));
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.65",
3
+ "version": "1.5.68",
4
4
  "description": "Purchase components for Launcher UI",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -39,9 +39,10 @@
39
39
  "dependencies": {
40
40
  "@arcblock/did-connect": "^1.16.49",
41
41
  "@arcblock/icons": "^1.16.49",
42
+ "@arcblock/license": "^1.16.49",
42
43
  "@arcblock/ux": "^1.16.49",
43
- "@blocklet/launcher-constant": "1.5.65",
44
- "@blocklet/launcher-layout": "1.5.65",
44
+ "@blocklet/launcher-constant": "1.5.68",
45
+ "@blocklet/launcher-layout": "1.5.68",
45
46
  "@material-ui/core": "^4.12.3",
46
47
  "@material-ui/icons": "^4.11.2",
47
48
  "@material-ui/lab": "^4.0.0-alpha.60",
@@ -51,6 +52,7 @@
51
52
  "@styled-icons/remix-fill": "^10.18.0",
52
53
  "axios": "^0.26.0",
53
54
  "flat": "^5.0.2",
55
+ "js-cookie": "^3.0.1",
54
56
  "lodash.get": "^4.4.2",
55
57
  "lodash.throttle": "^4.1.1",
56
58
  "prop-types": "^15.8.1",
@@ -67,5 +69,5 @@
67
69
  "babel-plugin-inline-react-svg": "^2.0.1",
68
70
  "babel-plugin-styled-components": "^1.10.7"
69
71
  },
70
- "gitHead": "f0d418d80249fc4d18fe2fd8481bd64a1010d4f4"
72
+ "gitHead": "70a65ca42b47efb86e93b8495ce6db35d4360cff"
71
73
  }