@abtnode/ux 1.16.25-next-bc2f4c63 → 1.16.26-beta-e0056285

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.
Files changed (85) hide show
  1. package/es/analytics/disk.js +8 -11
  2. package/es/analytics/memory.js +1 -2
  3. package/es/analytics/runtime.js +1 -2
  4. package/es/analytics/traffic.js +1 -2
  5. package/es/blocklet/actions.js +11 -1
  6. package/es/blocklet/component/add-component-core.js +8 -0
  7. package/es/blocklet/component/component-cell.js +2 -1
  8. package/es/blocklet/component/select-store.js +8 -4
  9. package/es/blocklet/disk-info.js +1 -1
  10. package/es/blocklet/icons.js +3 -1
  11. package/es/blocklet/overview.js +13 -7
  12. package/es/blocklet/publish/connect-store-list.js +62 -0
  13. package/es/blocklet/publish/create-release.js +192 -49
  14. package/es/blocklet/publish/index.js +0 -4
  15. package/es/blocklet/publish/project-list.js +133 -29
  16. package/es/blocklet/publish/release-list.js +19 -5
  17. package/es/blocklet/publish/resource.js +46 -34
  18. package/es/blocklet/publish/select-components.js +3 -3
  19. package/es/blocklet/router/rule-list.js +2 -1
  20. package/es/locales/ar.js +23 -10
  21. package/es/locales/de.js +22 -9
  22. package/es/locales/en.js +21 -10
  23. package/es/locales/es.js +22 -9
  24. package/es/locales/fr.js +22 -9
  25. package/es/locales/hi.js +22 -9
  26. package/es/locales/i18n.db +0 -0
  27. package/es/locales/id.js +23 -10
  28. package/es/locales/ja.js +23 -10
  29. package/es/locales/ko.js +23 -10
  30. package/es/locales/pt.js +22 -9
  31. package/es/locales/ru.js +22 -9
  32. package/es/locales/th.js +22 -9
  33. package/es/locales/vi.js +23 -10
  34. package/es/locales/zh-tw.js +22 -9
  35. package/es/locales/zh.js +27 -14
  36. package/es/store/add.js +1 -0
  37. package/es/store/delete.js +9 -4
  38. package/es/store/item.js +233 -36
  39. package/es/team/members/connections.js +2 -1
  40. package/es/team/members/member.js +2 -1
  41. package/es/util/index.js +8 -8
  42. package/lib/analytics/disk.js +7 -10
  43. package/lib/analytics/memory.js +5 -6
  44. package/lib/analytics/runtime.js +1 -2
  45. package/lib/analytics/traffic.js +2 -3
  46. package/lib/blocklet/actions.js +14 -2
  47. package/lib/blocklet/component/add-component-core.js +4 -1
  48. package/lib/blocklet/component/component-cell.js +2 -1
  49. package/lib/blocklet/component/select-store.js +8 -4
  50. package/lib/blocklet/disk-info.js +2 -2
  51. package/lib/blocklet/icons.js +3 -1
  52. package/lib/blocklet/overview.js +13 -7
  53. package/lib/blocklet/publish/connect-store-list.js +72 -0
  54. package/lib/blocklet/publish/create-release.js +194 -47
  55. package/lib/blocklet/publish/index.js +0 -4
  56. package/lib/blocklet/publish/project-list.js +133 -29
  57. package/lib/blocklet/publish/release-list.js +19 -5
  58. package/lib/blocklet/publish/resource.js +45 -33
  59. package/lib/blocklet/publish/select-components.js +3 -3
  60. package/lib/blocklet/router/rule-list.js +2 -1
  61. package/lib/locales/ar.js +23 -10
  62. package/lib/locales/de.js +22 -9
  63. package/lib/locales/en.js +21 -10
  64. package/lib/locales/es.js +22 -9
  65. package/lib/locales/fr.js +22 -9
  66. package/lib/locales/hi.js +22 -9
  67. package/lib/locales/i18n.db +0 -0
  68. package/lib/locales/id.js +23 -10
  69. package/lib/locales/ja.js +23 -10
  70. package/lib/locales/ko.js +23 -10
  71. package/lib/locales/pt.js +22 -9
  72. package/lib/locales/ru.js +22 -9
  73. package/lib/locales/th.js +22 -9
  74. package/lib/locales/vi.js +23 -10
  75. package/lib/locales/zh-tw.js +22 -9
  76. package/lib/locales/zh.js +27 -14
  77. package/lib/store/add.js +1 -0
  78. package/lib/store/delete.js +9 -4
  79. package/lib/store/item.js +233 -37
  80. package/lib/team/members/connections.js +2 -1
  81. package/lib/team/members/member.js +2 -1
  82. package/lib/util/index.js +14 -13
  83. package/package.json +17 -17
  84. package/es/blocklet/publish/create-project.js +0 -205
  85. package/lib/blocklet/publish/create-project.js +0 -215
@@ -21,15 +21,18 @@ var _DeleteOutline = _interopRequireDefault(require("@mui/icons-material/DeleteO
21
21
  var _InputAdornment = _interopRequireDefault(require("@mui/material/InputAdornment"));
22
22
  var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
23
23
  var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
24
+ var _Connect = _interopRequireDefault(require("@arcblock/did-connect/lib/Connect"));
24
25
  var _context = require("@arcblock/ux/lib/Locale/context");
25
26
  var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
26
27
  var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
27
28
  var _Empty = _interopRequireDefault(require("@arcblock/ux/lib/Empty"));
28
29
  var _Tabs = _interopRequireDefault(require("@arcblock/ux/lib/Tabs"));
30
+ var _Dialog2 = _interopRequireDefault(require("@arcblock/ux/lib/Dialog"));
29
31
  var _Alert = _interopRequireDefault(require("@arcblock/ux/lib/Alert"));
30
32
  var _constant = require("@blocklet/constant");
31
33
  var _constant2 = require("@abtnode/constant");
32
34
  var _bundleAvatar = _interopRequireDefault(require("../bundle-avatar"));
35
+ var _session = require("../../contexts/session");
33
36
  var _node = require("../../contexts/node");
34
37
  var _blocklet = require("../../contexts/blocklet");
35
38
  var _emptySpinner = _interopRequireDefault(require("../../empty-spinner"));
@@ -37,6 +40,7 @@ var _clickToCopy = _interopRequireDefault(require("../../click-to-copy"));
37
40
  var _util = require("../../util");
38
41
  var _resource = _interopRequireDefault(require("./resource"));
39
42
  var _selectComponents = _interopRequireDefault(require("./select-components"));
43
+ var _connectStoreList = _interopRequireDefault(require("./connect-store-list"));
40
44
  var _jsxRuntime = require("react/jsx-runtime");
41
45
  var _window$env, _templateObject;
42
46
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -121,13 +125,14 @@ const addComponentTabs = _ref => {
121
125
  });
122
126
  };
123
127
  const pickParams = (release, app) => {
124
- const params = (0, _pick.default)(release, ['blockletVersion', 'blockletTitle', 'blockletDescription', 'blockletLogo', 'blockletIntroduction', 'blockletScreenshots', 'blockletComponents', 'note']);
128
+ const params = (0, _pick.default)(release, ['blockletVersion', 'blockletTitle', 'blockletDescription', 'blockletLogo', 'blockletIntroduction', 'blockletScreenshots', 'blockletComponents', 'publishedStoreIds', 'note']);
125
129
  params.blockletScreenshots || (params.blockletScreenshots = []);
130
+ params.publishedStoreIds || (params.publishedStoreIds = []);
126
131
  if (!params.blockletComponents) {
127
132
  params.blockletComponents = (app.children || []).map(x => ({
128
133
  did: x.meta.did,
129
- included: true,
130
- required: true
134
+ included: false,
135
+ required: false
131
136
  }));
132
137
  } else {
133
138
  params.blockletComponents = params.blockletComponents.map(x => _objectSpread(_objectSpread({}, x), {}, {
@@ -137,17 +142,21 @@ const pickParams = (release, app) => {
137
142
  return params;
138
143
  };
139
144
  function CreateRelease(_ref2) {
140
- var _tabs$, _params$blockletIntro, _params$note;
145
+ var _tabs$, _params$blockletIntro, _params$note, _params$blockletCompo3;
141
146
  let rest = Object.assign({}, (_objectDestructuringEmpty(_ref2), _ref2));
142
147
  const navigate = (0, _reactRouterDom.useNavigate)();
143
148
  const {
144
149
  projectId,
145
150
  releaseId: inputReleaseId,
146
- componentDid
151
+ componentDid = ''
147
152
  } = (0, _reactRouterDom.useParams)();
148
153
  const {
149
- t
154
+ t,
155
+ locale
150
156
  } = (0, _context.useLocaleContext)();
157
+ const {
158
+ api: sessionApi
159
+ } = (0, _session.useSessionContext)();
151
160
  const {
152
161
  blocklet
153
162
  } = (0, _blocklet.useBlockletContext)();
@@ -161,10 +170,15 @@ function CreateRelease(_ref2) {
161
170
  } = (0, _node.useNodeContext)();
162
171
  const uploaderLogoRef = (0, _react.useRef)(null);
163
172
  const uploaderScreenshotRef = (0, _react.useRef)(null);
164
- const [projectType, setProjectType] = (0, _react.useState)();
165
173
  const [installResourceTip, setInstallResourceTip] = (0, _react.useState)();
174
+ const [openConnect, setOpenConnect] = (0, _react.useState)(false);
175
+ const [showStoreDialog, setShowStoreDialog] = (0, _react.useState)(false);
166
176
  const releaseId = inputReleaseId === 'create' ? '' : inputReleaseId;
167
177
  const mode = inputReleaseId === 'create' ? 'create' : 'edit';
178
+ const projectType = (0, _react.useMemo)(() => {
179
+ var _params$blockletCompo;
180
+ return params !== null && params !== void 0 && (_params$blockletCompo = params.blockletComponents) !== null && _params$blockletCompo !== void 0 && _params$blockletCompo.some(x => x.included) ? 'pack' : 'resource';
181
+ }, [params === null || params === void 0 ? void 0 : params.blockletComponents]);
168
182
  const tabs = [];
169
183
  const resourceComponents = ((blocklet === null || blocklet === void 0 ? void 0 : blocklet.children) || []).filter(x => {
170
184
  var _x$meta$resource;
@@ -181,10 +195,18 @@ function CreateRelease(_ref2) {
181
195
  const [tab, setTab] = (0, _react.useState)((_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.value);
182
196
  const isPublished = (release === null || release === void 0 ? void 0 : release.status) === 'published';
183
197
  const readOnly = isPublished;
184
- const getProject = function getProject() {
185
- let {
186
- typeOnly
187
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
198
+ const getProject = () => {
199
+ if (projectId === _constant2.UNOWNED_DID) {
200
+ setParams({
201
+ blockletVersion: '1.0.0',
202
+ blockletTitle: ''
203
+ });
204
+ return;
205
+ }
206
+ if (!projectId) {
207
+ _Toast.default.error(t('blocklet.publish.errorTip.noDid'));
208
+ return;
209
+ }
188
210
  api.getProject({
189
211
  input: {
190
212
  did: blocklet.meta.did,
@@ -193,17 +215,16 @@ function CreateRelease(_ref2) {
193
215
  }).then(res => {
194
216
  setLoading(false);
195
217
  const data = res.project || {};
196
- if (typeOnly) {
197
- setProjectType(data.type);
198
- return;
199
- }
200
218
  if (!data.blockletVersion) {
201
219
  data.blockletVersion = '1.0.0';
202
220
  } else if (_semver.default.valid(data.blockletVersion)) {
203
221
  data.blockletVersion = _semver.default.inc(data.blockletVersion, 'patch');
204
222
  }
205
- setParams(pickParams(data, blocklet));
206
- setProjectType(data.type);
223
+ const theParams = pickParams(data, blocklet);
224
+ if (theParams.blockletTitle === projectId.slice(0, 8)) {
225
+ theParams.blockletTitle = '';
226
+ }
227
+ setParams(theParams);
207
228
  }).catch(err => {
208
229
  setLoading(false);
209
230
  _Toast.default.error((0, _util.formatError)(err));
@@ -232,19 +253,17 @@ function CreateRelease(_ref2) {
232
253
  return;
233
254
  }
234
255
  getRelease();
235
- getProject({
236
- typeOnly: true
237
- });
238
256
  }
239
257
  if (mode === 'create') {
240
258
  getProject();
241
259
  }
242
260
  // eslint-disable-next-line react-hooks/exhaustive-deps
243
261
  }, [mode, releaseId]);
244
- (0, _react.useEffect)(() => {
245
- getData();
246
- }, [getData]);
247
262
  const onRelease = status => {
263
+ if (!projectId || projectId === _constant2.UNOWNED_DID) {
264
+ _Toast.default.error(t('blocklet.publish.errorTip.noDid'));
265
+ return;
266
+ }
248
267
  const errors = validateParams(params, status, t);
249
268
  if (errors) {
250
269
  _Toast.default.error(errors.map(x => x.message).join('; '));
@@ -266,11 +285,7 @@ function CreateRelease(_ref2) {
266
285
  _params.blockletDescription = (_params.blockletDescription || '').trim();
267
286
  _params.blockletIntroduction = (_params.blockletIntroduction || '').trim();
268
287
  _params.note = (_params.note || '').trim();
269
- if (projectType === 'pack') {
270
- _params.blockletComponents = (_params.blockletComponents || []).filter(x => x.included).map(x => (0, _pick.default)(x, ['did', 'required'])).map(JSON.stringify);
271
- } else {
272
- delete _params.blockletComponents;
273
- }
288
+ _params.blockletComponents = (_params.blockletComponents || []).filter(x => x.included).map(x => (0, _pick.default)(x, ['did', 'required'])).map(JSON.stringify);
274
289
  setCreateLoading(status);
275
290
  setLoading(true);
276
291
  api.createRelease({
@@ -309,12 +324,98 @@ function CreateRelease(_ref2) {
309
324
  }
310
325
  });
311
326
  };
327
+ const handleDidConnectShow = e => {
328
+ e.preventDefault();
329
+ e.stopPropagation();
330
+ if (!params.blockletTitle) {
331
+ setParamsErrTip({
332
+ blockletTitle: t('blocklet.publish.errorTip.noTitle')
333
+ });
334
+ _Toast.default.error(t('blocklet.publish.errorTip.noTitle'));
335
+ return;
336
+ }
337
+ if (!projectId || projectId === _constant2.UNOWNED_DID) {
338
+ setOpenConnect(true);
339
+ }
340
+ };
341
+ const handleDidConnectClose = () => {
342
+ setOpenConnect(false);
343
+ };
344
+ const handleChangeSelectedComponents = data => {
345
+ setParams({
346
+ blockletComponents: data
347
+ });
348
+ };
349
+ const handleCreateBlockletDidError = err => {
350
+ _Toast.default.error(err.message);
351
+ setOpenConnect(false);
352
+ };
353
+ const handleCreate = nextProjectDid => {
354
+ var _params$blockletCompo2;
355
+ if (!nextProjectDid) {
356
+ _Toast.default.error(t('blocklet.publish.errorTip.noDid'));
357
+ return;
358
+ }
359
+ setLoading(true);
360
+ api.createProject({
361
+ input: {
362
+ did: blocklet.meta.did,
363
+ blockletTitle: params.blockletTitle || nextProjectDid.slice(0, 9),
364
+ blockletDid: nextProjectDid,
365
+ type: ((_params$blockletCompo2 = params.blockletComponents) === null || _params$blockletCompo2 === void 0 ? void 0 : _params$blockletCompo2.length) > 0 ? 'pack' : 'resource',
366
+ componentDid
367
+ }
368
+ }).then(() => {
369
+ setLoading(false);
370
+ navigate(window.location.pathname.replace("".concat(_constant2.UNOWNED_DID, "/create"), "".concat(nextProjectDid, "/create")), {
371
+ replace: true
372
+ });
373
+ }).catch(err => {
374
+ setLoading(false);
375
+ _Toast.default.error(err.message);
376
+ });
377
+ };
378
+ const handleCreateBlockletDidSuccess = result => {
379
+ var _result$blockletWalle;
380
+ const did = result === null || result === void 0 || (_result$blockletWalle = result.blockletWallet) === null || _result$blockletWalle === void 0 ? void 0 : _result$blockletWalle.address;
381
+ if (!did) {
382
+ _Toast.default.error('Empty Blocklet DID');
383
+ } else {
384
+ handleCreate(did);
385
+ }
386
+ setOpenConnect(false);
387
+ };
388
+ (0, _react.useEffect)(() => {
389
+ getData();
390
+ }, [getData]);
312
391
  if (!params && loading) {
313
392
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_emptySpinner.default, {});
314
393
  }
315
394
  if (!params) {
316
395
  return null;
317
396
  }
397
+ const connect = openConnect ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Connect.default, {
398
+ open: true,
399
+ popup: true,
400
+ onClose: handleDidConnectClose,
401
+ action: "gen-blocklet-key-pair",
402
+ locale: locale,
403
+ checkFn: sessionApi.get,
404
+ saveConnect: false,
405
+ forceConnected: false,
406
+ checkTimeout: 5 * 60 * 1000,
407
+ onSuccess: handleCreateBlockletDidSuccess,
408
+ onError: handleCreateBlockletDidError,
409
+ extraParams: {
410
+ did: blocklet.meta.did
411
+ },
412
+ messages: {
413
+ title: t('blocklet.publish.connect.title'),
414
+ scan: t('blocklet.publish.connect.scan'),
415
+ confirm: t('blocklet.publish.connect.confirm'),
416
+ success: t('blocklet.publish.connect.success')
417
+ }
418
+ }) : null;
318
419
  const uploadLogoPrefix = "".concat(_constant2.WELLKNOWN_SERVICE_PATH_PREFIX, "/api/project/").concat(blocklet.meta.did, "/").concat(projectId, "/logo/upload");
319
420
  const uploadScreenshotPrefix = "".concat(_constant2.WELLKNOWN_SERVICE_PATH_PREFIX, "/api/project/").concat(blocklet.meta.did, "/").concat(projectId, "/screenshot/upload");
320
421
  const logoUrl = params !== null && params !== void 0 && params.blockletLogo ? "".concat(uploadLogoPrefix, "/").concat(params.blockletLogo) : "".concat(_constant2.WELLKNOWN_SERVICE_PATH_PREFIX, "/static/images/logo.png");
@@ -325,7 +426,7 @@ function CreateRelease(_ref2) {
325
426
  error: paramsErrTip.blockletResource,
326
427
  app: blocklet,
327
428
  component: item,
328
- projectId: projectId,
429
+ projectId: projectId === _constant2.UNOWNED_DID ? '' : projectId,
329
430
  release: _objectSpread(_objectSpread({}, release), {}, {
330
431
  id: releaseId
331
432
  }),
@@ -374,7 +475,7 @@ function CreateRelease(_ref2) {
374
475
  marginRight: 8
375
476
  },
376
477
  onClick: () => setInstallResourceTip(blockletMetaUrl),
377
- children: t('common.install')
478
+ children: t('blocklet.publish.copyInstallUrl')
378
479
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dialog.default, {
379
480
  fullWidth: true,
380
481
  maxWidth: "sm",
@@ -414,7 +515,7 @@ function CreateRelease(_ref2) {
414
515
  }
415
516
  }
416
517
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Main, _objectSpread(_objectSpread({}, rest), {}, {
417
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
518
+ children: [connect, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
418
519
  className: "sticky-header",
419
520
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Breadcrumbs.default, {
420
521
  className: "breadcrumbs",
@@ -448,6 +549,9 @@ function CreateRelease(_ref2) {
448
549
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
449
550
  variant: "contained",
450
551
  disabled: loading || createLoading,
552
+ style: {
553
+ marginRight: 12
554
+ },
451
555
  onClick: () => onRelease(_constant.PROJECT.RELEASE_STATUS.published),
452
556
  children: [createLoading === _constant.PROJECT.RELEASE_STATUS.published && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
453
557
  size: 14,
@@ -459,23 +563,24 @@ function CreateRelease(_ref2) {
459
563
  })]
460
564
  }), isPublished && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
461
565
  children: [installButton, /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
462
- variant: "contained",
566
+ variant: "outlined",
567
+ style: {
568
+ marginRight: 12
569
+ },
463
570
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
464
571
  href: (0, _urlJoin.default)("".concat(_constant2.WELLKNOWN_SERVICE_PATH_PREFIX, "/api/project/").concat(blocklet.meta.did, "/").concat(projectId, "/").concat(releaseId, "/download/").concat((release.files || [])[0])),
465
572
  children: t('common.download')
466
573
  })
574
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
575
+ variant: "contained",
576
+ onClick: () => setShowStoreDialog(true),
577
+ children: t('common.uploadToStore')
467
578
  })]
468
579
  })]
469
580
  })]
470
581
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
471
- children: [projectType === 'pack' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Alert.default, {
472
- type: "info",
473
- style: {
474
- width: '100%'
475
- },
476
- children: t('blocklet.publish.packTip')
477
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
478
- pt: 3
582
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
583
+ pt: 5
479
584
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
480
585
  display: "flex",
481
586
  className: "section",
@@ -509,6 +614,31 @@ function CreateRelease(_ref2) {
509
614
  },
510
615
  error: !!paramsErrTip.blockletTitle,
511
616
  helperText: paramsErrTip.blockletTitle || ''
617
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
618
+ required: true,
619
+ label: "Blocklet DID",
620
+ fullWidth: true,
621
+ readonly: true,
622
+ disabled: projectId !== _constant2.UNOWNED_DID,
623
+ autoComplete: "off",
624
+ variant: "outlined",
625
+ onClick: handleDidConnectShow,
626
+ onInput: handleDidConnectShow,
627
+ InputProps: {
628
+ 'data-cy': 'export-blocklet-did',
629
+ endAdornment: projectId === _constant2.UNOWNED_DID && /*#__PURE__*/(0, _jsxRuntime.jsx)(_InputAdornment.default, {
630
+ position: "end",
631
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
632
+ onClick: handleDidConnectShow,
633
+ children: t('common.create')
634
+ })
635
+ })
636
+ },
637
+ helperText: "",
638
+ value: projectId === _constant2.UNOWNED_DID ? '' : projectId,
639
+ sx: {
640
+ mt: 3
641
+ }
512
642
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, {
513
643
  label: "Blocklet ".concat(t('common.description')),
514
644
  placeholder: "Blocklet ".concat(t('common.description')),
@@ -795,7 +925,7 @@ function CreateRelease(_ref2) {
795
925
  children: resourceContent
796
926
  })]
797
927
  })]
798
- }), projectType === 'pack' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
928
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
799
929
  display: "flex",
800
930
  mt: 3,
801
931
  className: "section full-width",
@@ -812,15 +942,32 @@ function CreateRelease(_ref2) {
812
942
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_selectComponents.default, {
813
943
  disabled: loading || readOnly,
814
944
  app: blocklet,
815
- value: params.blockletComponents,
816
- onChange: data => {
817
- setParams({
818
- blockletComponents: data
819
- });
820
- }
945
+ value: params.blockletComponents || [],
946
+ onChange: handleChangeSelectedComponents
821
947
  })
822
948
  })]
949
+ }), projectType === 'pack' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Alert.default, {
950
+ type: "info",
951
+ style: {
952
+ width: '100%'
953
+ },
954
+ children: t('blocklet.publish.packTip')
823
955
  })]
956
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dialog2.default, {
957
+ title: t('common.connectToStore'),
958
+ disableEscapeKeyDown: true,
959
+ disablePortal: false,
960
+ fullWidth: true,
961
+ open: showStoreDialog,
962
+ onClose: () => setShowStoreDialog(false),
963
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_connectStoreList.default, {
964
+ blocklet: blocklet,
965
+ releaseType: ((_params$blockletCompo3 = params.blockletComponents) === null || _params$blockletCompo3 === void 0 ? void 0 : _params$blockletCompo3.length) > 0 ? 'pack' : 'resource',
966
+ projectId: projectId,
967
+ releaseId: releaseId,
968
+ onPublish: getRelease,
969
+ publishedStoreIds: release === null || release === void 0 ? void 0 : release.publishedStoreIds
970
+ })
824
971
  })]
825
972
  }));
826
973
  }
@@ -11,7 +11,6 @@ var _styled = _interopRequireDefault(require("@emotion/styled"));
11
11
  var _Box = _interopRequireDefault(require("@mui/material/Box"));
12
12
  var _blocklet = require("../../contexts/blocklet");
13
13
  var _projectList = _interopRequireDefault(require("./project-list"));
14
- var _createProject = _interopRequireDefault(require("./create-project"));
15
14
  var _releaseList = _interopRequireDefault(require("./release-list"));
16
15
  var _createRelease = _interopRequireDefault(require("./create-release"));
17
16
  var _jsxRuntime = require("react/jsx-runtime");
@@ -57,9 +56,6 @@ function BlockletPublish(_ref) {
57
56
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
58
57
  path: "/",
59
58
  element: /*#__PURE__*/(0, _jsxRuntime.jsx)(_projectList.default, {})
60
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
61
- path: "/create",
62
- element: /*#__PURE__*/(0, _jsxRuntime.jsx)(_createProject.default, {})
63
59
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
64
60
  path: "/:projectId",
65
61
  element: /*#__PURE__*/(0, _jsxRuntime.jsx)(_releaseList.default, {})
@@ -7,15 +7,22 @@ exports.default = ProjectList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactRouterDom = require("react-router-dom");
9
9
  var _styled = _interopRequireDefault(require("@emotion/styled"));
10
+ var _urlJoin = _interopRequireDefault(require("url-join"));
10
11
  var _context = require("@arcblock/ux/lib/Locale/context");
11
12
  var _Box = _interopRequireDefault(require("@mui/material/Box"));
13
+ var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
12
14
  var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
15
+ var _LibraryAdd = _interopRequireDefault(require("@mui/icons-material/LibraryAdd"));
13
16
  var _Delete = _interopRequireDefault(require("@mui/icons-material/Delete"));
17
+ var _InstallDesktop = _interopRequireDefault(require("@mui/icons-material/InstallDesktop"));
18
+ var _Download = _interopRequireDefault(require("@mui/icons-material/Download"));
19
+ var _constant = require("@abtnode/constant");
14
20
  var _Datatable = _interopRequireDefault(require("@arcblock/ux/lib/Datatable"));
15
21
  var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
16
22
  var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
17
23
  var _Tag = _interopRequireDefault(require("@arcblock/ux/lib/Tag"));
18
24
  var _RelativeTime = _interopRequireDefault(require("@arcblock/ux/lib/RelativeTime"));
25
+ var _material = require("@mui/material");
19
26
  var _blocklet = require("../../contexts/blocklet");
20
27
  var _node = require("../../contexts/node");
21
28
  var _emptySpinner = _interopRequireDefault(require("../../empty-spinner"));
@@ -23,13 +30,15 @@ var _didAddress = _interopRequireDefault(require("../../did-address"));
23
30
  var _confirm = _interopRequireDefault(require("../../confirm"));
24
31
  var _bundleAvatar = _interopRequireDefault(require("../bundle-avatar"));
25
32
  var _jsxRuntime = require("react/jsx-runtime");
26
- var _templateObject;
33
+ var _window$env, _templateObject;
27
34
  /* eslint-disable react/no-unstable-nested-components */
28
35
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
36
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
30
37
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
38
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
39
+ const serverEndpoint = (_window$env = window.env) === null || _window$env === void 0 ? void 0 : _window$env.serverEndpoint;
32
40
  function ProjectList() {
41
+ const navigate = (0, _reactRouterDom.useNavigate)();
33
42
  const {
34
43
  t,
35
44
  locale
@@ -61,6 +70,11 @@ function ProjectList() {
61
70
  _Toast.default.error(err.message);
62
71
  });
63
72
  };
73
+ const handleNewBlocklet = () => {
74
+ navigate("".concat(_constant.UNOWNED_DID, "/create"), {
75
+ replace: true
76
+ });
77
+ };
64
78
  const onDeleteProject = project => {
65
79
  setDeleteConfirm(project);
66
80
  };
@@ -87,7 +101,15 @@ function ProjectList() {
87
101
  }, []); // eslint-disable-line react-hooks/exhaustive-deps
88
102
 
89
103
  if (!projects && loading) {
90
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_emptySpinner.default, {});
104
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
105
+ sx: {
106
+ display: 'flex',
107
+ justifyContent: 'center',
108
+ alignItems: 'center',
109
+ marginTop: '40px'
110
+ },
111
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_emptySpinner.default, {})
112
+ });
91
113
  }
92
114
  if (!projects) {
93
115
  return null;
@@ -112,12 +134,10 @@ function ProjectList() {
112
134
  mb: 3
113
135
  },
114
136
  children: t('blocklet.publish.createBlockletTip')
115
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Link, {
116
- to: "create",
117
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
118
- variant: "contained",
119
- children: t('blocklet.publish.createBlocklet')
120
- })
137
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
138
+ onClick: handleNewBlocklet,
139
+ variant: "contained",
140
+ children: t('blocklet.publish.createBlocklet')
121
141
  })]
122
142
  });
123
143
  }
@@ -202,34 +222,118 @@ function ProjectList() {
202
222
  options: {
203
223
  customBodyRenderLite: rawIndex => {
204
224
  const project = projects[rawIndex];
205
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
225
+ let installUrl = '';
226
+ let downloadUrl = '';
227
+ if (project.lastReleaseId) {
228
+ const blockletMetaUrl = (0, _urlJoin.default)(serverEndpoint, "/api/project/".concat(blocklet.meta.did, "/").concat(project.id, "/").concat(project.lastReleaseId, "/release/blocklet.json"));
229
+ const url = new URL(serverEndpoint);
230
+ url.pathname = (0, _urlJoin.default)(url.pathname, '/launch-blocklet/agreement');
231
+ url.searchParams.set('blocklet_meta_url', blockletMetaUrl);
232
+ installUrl = url.href;
233
+ downloadUrl = (0, _urlJoin.default)("".concat(_constant.WELLKNOWN_SERVICE_PATH_PREFIX, "/api/project/").concat(blocklet.meta.did, "/").concat(project.id, "/").concat(project.lastReleaseId, "/download/").concat((project.lastReleaseFiles || [])[0]));
234
+ }
235
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
206
236
  display: "flex",
207
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
208
- color: "error",
209
- "aria-label": "delete",
210
- onClick: () => onDeleteProject(project),
211
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {
212
- sx: {
213
- fontSize: 18
214
- }
237
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Link, {
238
+ to: "".concat(project.id, "/create"),
239
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
240
+ title: t('blocklet.publish.createRelease'),
241
+ placement: "top",
242
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
243
+ color: "primary",
244
+ "aria-label": "create",
245
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LibraryAdd.default, {
246
+ sx: {
247
+ fontSize: 18
248
+ }
249
+ })
250
+ })
251
+ })
252
+ }), !!project.lastReleaseId && project.type === 'pack' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
253
+ title: t('blocklet.publish.install', {
254
+ name: project.blockletTitle
255
+ }),
256
+ placement: "top",
257
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
258
+ color: "secondary",
259
+ "aria-label": "create",
260
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
261
+ style: {
262
+ display: 'flex'
263
+ },
264
+ href: installUrl,
265
+ target: "_blank",
266
+ rel: "noreferrer",
267
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_InstallDesktop.default, {
268
+ sx: {
269
+ fontSize: 18
270
+ }
271
+ })
272
+ })
273
+ })
274
+ }), !!project.lastReleaseId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
275
+ title: t('blocklet.publish.download', {
276
+ name: project.blockletTitle
277
+ }),
278
+ placement: "top",
279
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
280
+ color: "primary",
281
+ "aria-label": "create",
282
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
283
+ style: {
284
+ display: 'flex'
285
+ },
286
+ href: downloadUrl,
287
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Download.default, {
288
+ sx: {
289
+ fontSize: 18
290
+ }
291
+ })
292
+ })
293
+ })
294
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
295
+ title: t('blocklet.publish.delete', {
296
+ name: project.blockletTitle
297
+ }),
298
+ placement: "top",
299
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
300
+ color: "primary",
301
+ "aria-label": "delete",
302
+ onClick: () => onDeleteProject(project),
303
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {
304
+ sx: {
305
+ fontSize: 18
306
+ }
307
+ })
215
308
  })
216
- })
309
+ })]
217
310
  });
218
311
  }
219
312
  }
220
313
  }].filter(Boolean);
221
314
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Main, {
222
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
223
- sx: {
224
- textAlign: 'right'
225
- },
226
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Link, {
227
- to: "create",
228
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
229
- variant: "contained",
230
- children: t('blocklet.publish.createBlocklet')
231
- })
232
- })
315
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
316
+ display: "flex",
317
+ justifyContent: "space-between",
318
+ alignItems: "center",
319
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
320
+ sx: {
321
+ fontSize: '1.2rem',
322
+ fontWeight: 'bold'
323
+ },
324
+ children: t('blocklet.publish.productListTitle')
325
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
326
+ onClick: handleNewBlocklet,
327
+ variant: "contained",
328
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {
329
+ style: {
330
+ fontSize: '1.3em',
331
+ marginRight: 4
332
+ }
333
+ }), t('blocklet.publish.createBlocklet')]
334
+ })]
335
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
336
+ mt: 3
233
337
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Datatable.default, {
234
338
  className: "main-table",
235
339
  locale: locale,