@blocklet/launcher-workflow 1.5.18

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,78 @@
1
+ "use strict";
2
+
3
+ module.exports = {
4
+ common: {
5
+ paymentMethod: '付款方式',
6
+ serverType: '节点信息',
7
+ paying: '支付中',
8
+ pay: '支付',
9
+ name: '名称',
10
+ description: '描述',
11
+ retry: '重试',
12
+ launch: '启动',
13
+ next: '下一步',
14
+ redeem: '兑换',
15
+ purchase: '购买'
16
+ },
17
+ plan: {
18
+ title: '创建节点',
19
+ subTitle: '请选择节点类型和支付方式',
20
+ loadListFailed: '加载节点类型列表出错',
21
+ paymentCredit: {
22
+ status: {
23
+ unpaid: '支付中',
24
+ paid: '支付完成, 等待订单完成',
25
+ completed: '已完成,跳转中',
26
+ expired: '订单已过期'
27
+ }
28
+ },
29
+ useCrypto: 'ABT 支付',
30
+ useFiat: '信用卡支付'
31
+ },
32
+ prepare: {
33
+ title: '命名节点',
34
+ subTitle: '请输入要创建的节点名称和描述'
35
+ },
36
+ launch: {
37
+ title: '创建节点',
38
+ invalidFftId: '无效的购买凭证',
39
+ launchApp: '启动应用',
40
+ launching: '节点正在启动中, 大约需要 5 分钟',
41
+ launched: '节点已启动',
42
+ launchSuccess: '创建节点成功',
43
+ launchBlockletTip: '点击下面的按钮启动应用',
44
+ loadStatusFailed: '加载实例状态失败',
45
+ waitingForLaunching: '节点正在启动中,大约需要 5 分钟',
46
+ accessServer: '访问节点',
47
+ dialog: {
48
+ title: '创建节点',
49
+ scan: '用您的 DID 钱包扫描下面的二维码',
50
+ confirm: '在您的 DID 钱包上确认',
51
+ success: '正在启动'
52
+ },
53
+ error: {
54
+ launchFailed: '节点启动失败',
55
+ launchFailedDescription: '您可以点击下面按钮重试',
56
+ notFound: '没有正在启动的节点',
57
+ notFoundDescription: '您可以点击下面按钮启动节点'
58
+ }
59
+ },
60
+ redeem: {
61
+ title: '启动节点',
62
+ subTitle: '为你的节点起个名字吧',
63
+ dialog: {
64
+ title: '兑换节点',
65
+ scan: '用您的 DID 钱包扫描下面的二维码,提供 NFT',
66
+ confirm: '在您的 DID 钱包上确认',
67
+ success: '兑换成功'
68
+ }
69
+ },
70
+ addServer: {
71
+ purchase: {
72
+ title: '创建节点',
73
+ scan: '用您的 DID 钱包扫描下面的二维码',
74
+ confirm: '在您的 DID 钱包上确认',
75
+ success: '支付成功'
76
+ }
77
+ }
78
+ };
package/lib/prepare.js ADDED
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = PreparePage;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _reactRouterDom = require("react-router-dom");
11
+
12
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
13
+
14
+ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
15
+
16
+ var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
17
+
18
+ var _utils = require("@arcblock/did-connect/lib/utils");
19
+
20
+ var _TextField = _interopRequireDefault(require("@material-ui/core/TextField"));
21
+
22
+ var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl"));
23
+
24
+ var _FormHelperText = _interopRequireDefault(require("@material-ui/core/FormHelperText"));
25
+
26
+ var _pageHeader = _interopRequireDefault(require("./components/page-header"));
27
+
28
+ var _request = _interopRequireDefault(require("./contexts/request"));
29
+
30
+ var _locale = require("./contexts/locale");
31
+
32
+ var _constant = require("./constant");
33
+
34
+ var _router = _interopRequireWildcard(require("./contexts/router"));
35
+
36
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
+
38
+ 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); }
39
+
40
+ 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; }
41
+
42
+ 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; }
43
+
44
+ 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; }
45
+
46
+ 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; }
47
+
48
+ var BlockletServerIcon = function BlockletServerIcon(props) {
49
+ return /*#__PURE__*/_react.default.createElement("svg", props, /*#__PURE__*/_react.default.createElement("path", {
50
+ fillRule: "evenodd",
51
+ clipRule: "evenodd",
52
+ d: "M2 4.9A1.1 1.1 0 0 1 3.1 6v12c0 .195.084.463.404.799.326.342.849.7 1.579 1.024C6.54 20.471 8.632 20.9 11 20.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.604.404-.8V6a1.1 1.1 0 0 1 2.2 0v12c0 .911-.42 1.696-1.01 2.317-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.466-6.81-1.266-.899-.4-1.694-.903-2.28-1.518C1.32 19.695.9 18.91.9 18V6A1.1 1.1 0 0 1 2 4.9Z",
53
+ fill: "#BFBFBF"
54
+ }), /*#__PURE__*/_react.default.createElement("path", {
55
+ fillRule: "evenodd",
56
+ clipRule: "evenodd",
57
+ d: "M2 10.9A1.1 1.1 0 0 1 3.1 12c0 .194.084.463.404.799.326.342.849.7 1.579 1.024C6.54 14.471 8.632 14.9 11 14.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.604.404-.8a1.1 1.1 0 0 1 2.2 0c0 .911-.42 1.696-1.01 2.317-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.466-6.81-1.266-.899-.4-1.694-.903-2.28-1.518C1.32 13.695.9 12.91.9 12A1.1 1.1 0 0 1 2 10.9Z",
58
+ fill: "#BFBFBF"
59
+ }), /*#__PURE__*/_react.default.createElement("path", {
60
+ fillRule: "evenodd",
61
+ clipRule: "evenodd",
62
+ d: "M3.504 5.2c-.32.337-.404.605-.404.8 0 .195.084.463.404.799.326.342.849.7 1.579 1.024C6.54 8.471 8.632 8.9 11 8.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.604.404-.8 0-.194-.084-.462-.404-.798-.326-.342-.849-.7-1.579-1.025C15.46 3.53 13.368 3.1 11 3.1s-4.46.429-5.917 1.076c-.73.325-1.253.683-1.579 1.025Zm.686-3.034C5.99 1.366 8.398.9 11 .9c2.602 0 5.01.466 6.81 1.266.899.4 1.694.903 2.28 1.518.59.621 1.01 1.406 1.01 2.316 0 .91-.42 1.695-1.01 2.316-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.466-6.81-1.266-.899-.4-1.694-.903-2.28-1.518C1.32 7.695.9 6.91.9 6c0-.91.42-1.695 1.01-2.316.586-.615 1.381-1.119 2.28-1.518ZM24 24.9a1.1 1.1 0 0 1 1.1 1.1v12c0 .194.084.463.404.799.326.342.849.7 1.579 1.024C28.54 40.471 30.632 40.9 33 40.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.605.404-.8V26a1.1 1.1 0 0 1 2.2 0v12c0 .911-.42 1.696-1.01 2.317-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.467-6.81-1.266-.899-.4-1.694-.903-2.28-1.518-.59-.621-1.01-1.406-1.01-2.316V26a1.1 1.1 0 0 1 1.1-1.1Z",
63
+ fill: "#BFBFBF"
64
+ }), /*#__PURE__*/_react.default.createElement("path", {
65
+ fillRule: "evenodd",
66
+ clipRule: "evenodd",
67
+ d: "M24 30.9a1.1 1.1 0 0 1 1.1 1.1c0 .194.084.463.404.799.326.342.849.7 1.579 1.024C28.54 34.471 30.632 34.9 33 34.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.605.404-.8a1.1 1.1 0 0 1 2.2 0c0 .911-.42 1.696-1.01 2.317-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.467-6.81-1.266-.899-.4-1.694-.903-2.28-1.518-.59-.621-1.01-1.406-1.01-2.316a1.1 1.1 0 0 1 1.1-1.1Z",
68
+ fill: "#BFBFBF"
69
+ }), /*#__PURE__*/_react.default.createElement("path", {
70
+ fillRule: "evenodd",
71
+ clipRule: "evenodd",
72
+ d: "M25.504 25.2c-.32.337-.404.605-.404.8 0 .195.084.463.404.799.326.342.849.7 1.579 1.024C28.54 28.471 30.632 28.9 33 28.9s4.46-.429 5.917-1.077c.73-.324 1.253-.682 1.579-1.024.32-.336.404-.604.404-.8 0-.194-.084-.462-.404-.798-.326-.342-.849-.7-1.579-1.025C37.46 23.53 35.368 23.1 33 23.1s-4.46.428-5.917 1.076c-.73.325-1.253.683-1.579 1.025Zm.686-3.034c1.8-.8 4.208-1.266 6.81-1.266 2.602 0 5.01.466 6.81 1.266.899.4 1.694.903 2.28 1.518.59.621 1.01 1.405 1.01 2.316 0 .91-.42 1.695-1.01 2.316-.586.615-1.381 1.119-2.28 1.518-1.8.8-4.208 1.266-6.81 1.266-2.602 0-5.01-.466-6.81-1.266-.899-.4-1.694-.903-2.28-1.518-.59-.621-1.01-1.406-1.01-2.316 0-.91.42-1.695 1.01-2.316.586-.615 1.381-1.119 2.28-1.518ZM28.9 4A1.1 1.1 0 0 1 30 2.9h6A5.1 5.1 0 0 1 41.1 8v6a1.1 1.1 0 0 1-2.2 0V8A2.9 2.9 0 0 0 36 5.1h-6A1.1 1.1 0 0 1 28.9 4ZM4 28.9A1.1 1.1 0 0 1 5.1 30v6A2.9 2.9 0 0 0 8 38.9h6a1.1 1.1 0 0 1 0 2.2H8A5.1 5.1 0 0 1 2.9 36v-6A1.1 1.1 0 0 1 4 28.9Z",
73
+ fill: "#BFBFBF"
74
+ }));
75
+ };
76
+
77
+ BlockletServerIcon.defaultProps = {
78
+ width: "46",
79
+ height: "46",
80
+ fill: "none",
81
+ xmlns: "http://www.w3.org/2000/svg"
82
+ };
83
+ const MAX_NAME_LENGTH = 30;
84
+ const MAX_DESC_LENGTH = 50;
85
+
86
+ function PreparePage() {
87
+ const {
88
+ t
89
+ } = (0, _react.useContext)(_locale.LocaleContext);
90
+ const [name, setName] = (0, _react.useState)('');
91
+ const [description, setDescription] = (0, _react.useState)('');
92
+ const [error, setError] = (0, _react.useState)({
93
+ name: '',
94
+ description: ''
95
+ });
96
+ const routerPrefix = (0, _router.usePrefix)();
97
+ const [showLaunchInstanceDialog, setShowLaunchInstanceDialog] = (0, _react.useState)(false);
98
+ const {
99
+ nftId
100
+ } = (0, _reactRouterDom.useParams)();
101
+ const history = (0, _reactRouterDom.useHistory)();
102
+ const {
103
+ create: createRequest
104
+ } = (0, _request.default)();
105
+
106
+ const handleInput = id => e => {
107
+ if (id === 'name') {
108
+ setName(e.target.value);
109
+ }
110
+
111
+ if (id === 'description') {
112
+ setDescription(e.target.value);
113
+ }
114
+
115
+ validate();
116
+ };
117
+
118
+ const validate = () => {
119
+ let isError = false;
120
+
121
+ if (name.length > MAX_NAME_LENGTH) {
122
+ isError = true;
123
+ setError(value => _objectSpread(_objectSpread({}, value), {}, {
124
+ name: t('launchPrepare.error.nameExceed', {
125
+ length: MAX_NAME_LENGTH
126
+ })
127
+ }));
128
+ } else {
129
+ setError(value => _objectSpread(_objectSpread({}, value), {}, {
130
+ name: ''
131
+ }));
132
+ }
133
+
134
+ if (description.length > MAX_DESC_LENGTH) {
135
+ isError = true;
136
+ setError(value => _objectSpread(_objectSpread({}, value), {}, {
137
+ description: t('launchPrepare.error.descriptionExceed', {
138
+ length: MAX_DESC_LENGTH
139
+ })
140
+ }));
141
+ } else {
142
+ setError(value => _objectSpread(_objectSpread({}, value), {}, {
143
+ description: ''
144
+ }));
145
+ }
146
+
147
+ return isError;
148
+ };
149
+
150
+ const handleLaunch = () => {
151
+ if (validate()) {
152
+ return;
153
+ }
154
+
155
+ setShowLaunchInstanceDialog(true);
156
+ }; // eslint-disable-next-line no-shadow
157
+
158
+
159
+ const handleAuthSuccess = _ref => {
160
+ let {
161
+ nftId
162
+ } = _ref;
163
+ history.push((0, _router.default)(routerPrefix, "/in-progress/".concat(nftId).concat(window.location.search)));
164
+ };
165
+
166
+ const handleCloseAuthDialog = () => setShowLaunchInstanceDialog(false);
167
+
168
+ const isRedeem = nftId === _constant.REDEEM_NFT_ID;
169
+ const headerScope = isRedeem ? 'redeem' : 'prepare';
170
+ const buttonScope = isRedeem ? 'redeem' : 'launch';
171
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Container, null, /*#__PURE__*/_react.default.createElement(_pageHeader.default, {
172
+ title: t("".concat(headerScope, ".title")),
173
+ subTitle: t("".concat(headerScope, ".subTitle"))
174
+ }), /*#__PURE__*/_react.default.createElement("div", {
175
+ className: "page-body"
176
+ }, /*#__PURE__*/_react.default.createElement("div", {
177
+ className: "page-logo"
178
+ }, /*#__PURE__*/_react.default.createElement(BlockletServerIcon, null)), /*#__PURE__*/_react.default.createElement("div", {
179
+ className: "inputs"
180
+ }, /*#__PURE__*/_react.default.createElement(_FormControl.default, {
181
+ className: "input-item",
182
+ error: !!error.name
183
+ }, /*#__PURE__*/_react.default.createElement(_TextField.default, {
184
+ id: "name",
185
+ variant: "outlined",
186
+ label: t('common.name'),
187
+ onChange: handleInput('name'),
188
+ value: name,
189
+ labelWidth: 0,
190
+ autoFocus: true
191
+ }), error.name && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, error.name)), /*#__PURE__*/_react.default.createElement(_FormControl.default, {
192
+ className: "input-item",
193
+ error: !!error.description
194
+ }, /*#__PURE__*/_react.default.createElement(_TextField.default, {
195
+ id: "description",
196
+ variant: "outlined",
197
+ label: t('common.description'),
198
+ error: !!error.desc,
199
+ onChange: handleInput('description'),
200
+ multiline: true,
201
+ maxRows: 5,
202
+ value: description,
203
+ labelWidth: 0
204
+ }), error.description && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, null, error.description)))), /*#__PURE__*/_react.default.createElement("div", {
205
+ className: "page-footer"
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, {
216
+ open: showLaunchInstanceDialog,
217
+ popup: true,
218
+ action: "launch-instance",
219
+ checkFn: createRequest().get,
220
+ onSuccess: handleAuthSuccess,
221
+ onClose: handleCloseAuthDialog,
222
+ checkTimeout: 60 * 5000,
223
+ extraParams: {
224
+ nftId,
225
+ name,
226
+ description
227
+ },
228
+ webWalletUrl: (0, _utils.getWebWalletUrl)(),
229
+ disableClose: true,
230
+ showDownload: false,
231
+ 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"))
236
+ }
237
+ }));
238
+ }
239
+
240
+ const Container = _styledComponents.default.div.withConfig({
241
+ displayName: "prepare__Container",
242
+ componentId: "sc-1ddofcz-0"
243
+ })(["display:flex;flex-direction:column;width:100%;height:100%;.page-logo{display:flex;justify-content:center;margin-top:80px;}.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;}}@media (max-width:640px){.page-footer{margin-top:auto;}}"]);
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _reactRouterDom = require("react-router-dom");
11
+
12
+ var _reactUse = require("react-use");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash.get"));
15
+
16
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
17
+
18
+ var _util = require("@ocap/util");
19
+
20
+ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
21
+
22
+ var _Spinner = _interopRequireDefault(require("@arcblock/ux/lib/Spinner"));
23
+
24
+ var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
25
+
26
+ var _utils = require("@arcblock/did-connect/lib/utils");
27
+
28
+ var _compactLayout = _interopRequireDefault(require("@blocklet/launcher-layout/lib/compact-layout"));
29
+
30
+ var _Alert = _interopRequireDefault(require("@material-ui/lab/Alert"));
31
+
32
+ var _plan = _interopRequireDefault(require("./components/plan"));
33
+
34
+ var _paymentType = _interopRequireDefault(require("./components/payment-type"));
35
+
36
+ var _pageHeader = _interopRequireDefault(require("./components/page-header"));
37
+
38
+ var _checkout = _interopRequireDefault(require("./components/stripe/checkout"));
39
+
40
+ var _query = _interopRequireDefault(require("./hooks/query"));
41
+
42
+ var _locale = require("./contexts/locale");
43
+
44
+ var _session = require("./contexts/session");
45
+
46
+ var _constant = require("./constant");
47
+
48
+ var _request = _interopRequireDefault(require("./contexts/request"));
49
+
50
+ var _router = _interopRequireWildcard(require("./contexts/router"));
51
+
52
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
53
+
54
+ 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); }
55
+
56
+ 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; }
57
+
58
+ const formatTokenPrice = token => "".concat((0, _util.fromUnitToToken)(token.value, token.decimal), " ").concat(token.symbol);
59
+
60
+ const formatFiatPrice = price => "".concat(price.unit).concat(price.value);
61
+
62
+ function PurchasePage() {
63
+ const {
64
+ api,
65
+ create: createRequest
66
+ } = (0, _request.default)();
67
+ const query = (0, _query.default)();
68
+ const history = (0, _reactRouterDom.useHistory)();
69
+ const [plan, setPlan] = (0, _react.useState)(null);
70
+ const {
71
+ session
72
+ } = (0, _session.useSessionContext)();
73
+ const {
74
+ t,
75
+ locale
76
+ } = (0, _locale.useLocaleContext)();
77
+ const [paying, setPaying] = (0, _react.useState)(false);
78
+ const [paymentInfo, setPaymentInfo] = (0, _react.useState)(null);
79
+ const [paymentType, setPaymentType] = (0, _react.useState)('crypto');
80
+ const routerPrefix = (0, _router.usePrefix)();
81
+ const userDid = query.get('userDid') || (0, _lodash.default)(session, 'user.did');
82
+ const isEmbed = !!query.get('blocklet_meta_url');
83
+ (0, _react.useEffect)(() => {
84
+ if (!session.loading && paymentType === 'fiat' && !userDid) {
85
+ session.login();
86
+ } // eslint-disable-next-line
87
+
88
+ }, [paymentType, userDid]);
89
+ const paymentTypes = [{
90
+ name: 'crypto'
91
+ }, {
92
+ name: 'fiat'
93
+ }];
94
+ const plansState = (0, _reactUse.useAsync)(async () => {
95
+ const {
96
+ data
97
+ } = await api.get('/plans');
98
+ const plans = (data || []).map(item => {
99
+ item.prices = {
100
+ crypto: formatTokenPrice(item.prices.crypto),
101
+ fiat: formatFiatPrice(item.prices.fiat)
102
+ };
103
+ return item;
104
+ }).sort((itemX, itemY) => itemX.weight - itemY.weight);
105
+ return {
106
+ plans
107
+ };
108
+ });
109
+ (0, _react.useEffect)(() => {
110
+ if (plansState.loading === false) {
111
+ setPaymentType('crypto');
112
+
113
+ if (plansState.value) {
114
+ const {
115
+ plans
116
+ } = plansState.value;
117
+
118
+ if (plans.length > 0) {
119
+ selectPlan(plans[0]);
120
+ }
121
+ }
122
+ }
123
+ }, [plansState.loading, plansState.value]);
124
+
125
+ if (plansState.loading) {
126
+ return /*#__PURE__*/_react.default.createElement(Center, null, /*#__PURE__*/_react.default.createElement(_Spinner.default, null));
127
+ }
128
+
129
+ if (plansState.error) {
130
+ console.error('load plans error', plansState.error);
131
+ return /*#__PURE__*/_react.default.createElement(_Alert.default, {
132
+ severity: "error"
133
+ }, t('plan.loadListFailed'));
134
+ }
135
+
136
+ const {
137
+ plans
138
+ } = plansState.value;
139
+
140
+ const handleAuthSuccess = _ref => {
141
+ let {
142
+ nftId
143
+ } = _ref;
144
+ const url = "/prepare/".concat(nftId).concat(window.location.search);
145
+ history.push((0, _router.default)(routerPrefix, url));
146
+ };
147
+
148
+ const handleCloseAuthDialog = () => {
149
+ setPaying(false);
150
+ };
151
+
152
+ const selectPaymentType = value => {
153
+ setPaymentType(value);
154
+ };
155
+
156
+ const selectPlan = value => {
157
+ setPlan(value);
158
+ };
159
+
160
+ const getPurchaseParams = () => {
161
+ const obj = {
162
+ planId: plan ? plan._id : null,
163
+ userDid
164
+ };
165
+ const params = {};
166
+ Object.keys(obj).forEach(key => {
167
+ if (obj[key] !== undefined && obj[key] !== null) {
168
+ params[key] = obj[key];
169
+ }
170
+ });
171
+ return params;
172
+ };
173
+
174
+ const handleCancelPay = () => {
175
+ setPaying(false);
176
+ setPaymentInfo(null);
177
+ };
178
+
179
+ const handlePay = async payment => {
180
+ if (!userDid) {
181
+ session.login();
182
+ return;
183
+ }
184
+
185
+ const params = getPurchaseParams();
186
+
187
+ if (!params.planId) {
188
+ return;
189
+ }
190
+
191
+ setPaying(true);
192
+
193
+ if (payment === 'crypto') {
194
+ return;
195
+ }
196
+
197
+ if (payment === 'fiat') {
198
+ try {
199
+ const {
200
+ data
201
+ } = await api.post("/pay/stripe/intent?locale=".concat(locale, "&userDid=").concat(userDid), params);
202
+ setPaymentInfo({
203
+ orderId: data.orderId,
204
+ clientSecret: data.clientSecret
205
+ });
206
+ } catch (error) {
207
+ console.error(error);
208
+ setPaying(false);
209
+ }
210
+ }
211
+ };
212
+
213
+ const handleRedeem = () => {
214
+ handleAuthSuccess({
215
+ nftId: _constant.REDEEM_NFT_ID
216
+ });
217
+ };
218
+
219
+ const PayButton = () => /*#__PURE__*/_react.default.createElement(_Button.default, {
220
+ onClick: () => handlePay(paymentType),
221
+ disabled: paying,
222
+ rounded: true,
223
+ variant: "contained",
224
+ color: "primary"
225
+ }, paying && /*#__PURE__*/_react.default.createElement(_Spinner.default, {
226
+ size: 14
227
+ }), paying ? t('common.paying') : t('common.purchase'));
228
+
229
+ const RedeemButton = () => /*#__PURE__*/_react.default.createElement(_Button.default, {
230
+ onClick: () => handleRedeem(),
231
+ rounded: true,
232
+ variant: "outlined",
233
+ color: "primary",
234
+ style: {
235
+ marginLeft: '24px'
236
+ }
237
+ }, t('common.redeem'));
238
+
239
+ return /*#__PURE__*/_react.default.createElement(Container, null, isEmbed && /*#__PURE__*/_react.default.createElement(_pageHeader.default, {
240
+ title: t('plan.title'),
241
+ subTitle: t('plan.subTitle')
242
+ }), /*#__PURE__*/_react.default.createElement("div", {
243
+ className: "page-body body"
244
+ }, /*#__PURE__*/_react.default.createElement("div", {
245
+ className: "page-body-article"
246
+ }, /*#__PURE__*/_react.default.createElement(_compactLayout.default, {
247
+ bottom: /*#__PURE__*/_react.default.createElement("div", {
248
+ className: "button-container"
249
+ }, /*#__PURE__*/_react.default.createElement(PayButton, null), /*#__PURE__*/_react.default.createElement(RedeemButton, null))
250
+ }, !isEmbed && /*#__PURE__*/_react.default.createElement(_pageHeader.default, {
251
+ title: t('plan.title'),
252
+ subTitle: t('plan.subTitle')
253
+ }), /*#__PURE__*/_react.default.createElement("div", {
254
+ className: "select-payment"
255
+ }, /*#__PURE__*/_react.default.createElement("div", {
256
+ className: "select-title"
257
+ }, t('common.paymentMethod')), /*#__PURE__*/_react.default.createElement("div", {
258
+ className: "select-row",
259
+ style: {
260
+ flexWrap: 'nowrap'
261
+ }
262
+ }, paymentTypes.map(item => /*#__PURE__*/_react.default.createElement(_paymentType.default, {
263
+ key: item.name,
264
+ className: "".concat(paymentType === item.name ? 'selected' : ''),
265
+ type: item.name,
266
+ onClick: () => selectPaymentType(item.name)
267
+ })))), /*#__PURE__*/_react.default.createElement("div", {
268
+ className: "select-plan small-select-plan-".concat(plans.length)
269
+ }, /*#__PURE__*/_react.default.createElement("div", {
270
+ className: "select-title"
271
+ }, t('common.serverType')), /*#__PURE__*/_react.default.createElement("div", {
272
+ className: "selector-container"
273
+ }, plans.map(item => /*#__PURE__*/_react.default.createElement(_plan.default, {
274
+ key: item._id,
275
+ paymentType: paymentType,
276
+ onClick: () => selectPlan(item),
277
+ className: "select-body-item ".concat(plan && plan._id === item._id ? 'selected' : ''),
278
+ data: item
279
+ }))))))), /*#__PURE__*/_react.default.createElement(_Connect.default, {
280
+ open: paying && paymentType === 'crypto',
281
+ popup: true,
282
+ action: "purchase",
283
+ checkFn: createRequest().get,
284
+ onSuccess: handleAuthSuccess,
285
+ onClose: handleCloseAuthDialog,
286
+ checkTimeout: 60 * 5000,
287
+ extraParams: getPurchaseParams(),
288
+ webWalletUrl: (0, _utils.getWebWalletUrl)(),
289
+ showDownload: false,
290
+ messages: {
291
+ title: t('purchase.dialog.title'),
292
+ scan: t('purchase.dialog.scan'),
293
+ confirm: t('purchase.dialog.confirm'),
294
+ success: t('purchase.dialog.success')
295
+ }
296
+ }), paymentInfo && /*#__PURE__*/_react.default.createElement(_checkout.default, {
297
+ clientSecret: paymentInfo.clientSecret,
298
+ orderId: paymentInfo.orderId,
299
+ userDid: userDid,
300
+ onPaid: handleAuthSuccess,
301
+ onCancel: handleCancelPay
302
+ }));
303
+ }
304
+
305
+ const Center = _styledComponents.default.div.withConfig({
306
+ displayName: "purchase__Center",
307
+ componentId: "sc-1knmtel-0"
308
+ })(["display:flex;justify-content:center;align-items:center;height:100%;"]);
309
+
310
+ const Container = _styledComponents.default.div.withConfig({
311
+ displayName: "purchase__Container",
312
+ componentId: "sc-1knmtel-1"
313
+ })(["display:flex;flex-direction:column;width:100%;height:100%;.select-payment{padding-top:40px;}.select-plan{margin:40px auto 0;&.small-select-plan-2{max-width:780px;}&.small-select-plan-1{max-width:460px;}}.select-title{text-align:center;font-size:16px;color:", ";}.page-body{position:relative;flex:1;padding:0 24px;margin-top:0;}.page-body-article{position:absolute;left:24px;top:0;width:calc(100% - 48px);height:100%;overflow-y:auto;}.select-row{display:flex;margin-top:18px;justify-content:center;flex-wrap:wrap;> div{margin-left:12px;margin-right:12px;}}.selector-container{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:24px;margin-top:18px;}.button-container{display:flex;justify-content:center;align-items:center;margin-top:24px;padding-bottom:16px;> button{width:200px;}}.select-body-item{cursor:pointer;transition:background-color ease 0.2s,border ease 0.2s;}@media screen and (max-width:600px){.select-title{text-align:left;}.select-row{flex-direction:column;> div{margin-bottom:24px;margin-right:0;margin-left:0;&:last-child{margin-bottom:0;}}}.page-body{padding:0 24px;}}.selected{border-color:", ";cursor:default;}"], props => props.theme.palette.grey[900], props => props.theme.palette.primary.main);
314
+
315
+ var _default = (0, _reactRouterDom.withRouter)(PurchasePage);
316
+
317
+ exports.default = _default;
package/lib/util.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getBlockletMetaUrl = getBlockletMetaUrl;
7
+ exports.getLaunchBlockletUrl = void 0;
8
+
9
+ var _urlJoin = _interopRequireDefault(require("url-join"));
10
+
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+
13
+ function getBlockletMetaUrl(registry, did) {
14
+ return (0, _urlJoin.default)(registry, "/api/blocklets/".concat(did, "/blocklet.json?source=webapp"));
15
+ }
16
+
17
+ const getLaunchBlockletUrl = (serverUrl, blockletMetaUrl, locale) => {
18
+ if (!blockletMetaUrl) {
19
+ return serverUrl;
20
+ }
21
+
22
+ let result = (0, _urlJoin.default)(serverUrl, "/launch-blocklet?blocklet_meta_url=".concat(encodeURIComponent(blockletMetaUrl)));
23
+
24
+ if (locale) {
25
+ result += "&locale=".concat(locale);
26
+ }
27
+
28
+ return result;
29
+ };
30
+
31
+ exports.getLaunchBlockletUrl = getLaunchBlockletUrl;