@abtnode/webapp 1.7.15 → 1.7.16
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.
- package/blocklet.js +4 -4
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +6 -6
- package/build/index.html +1 -1
- package/build/{precache-manifest.75ccdfe1beea8a294a566b342de457a1.js → precache-manifest.111eaabd1a806e634fb3b7f27cdbfad5.js} +5 -5
- package/build/service-worker.js +1 -1
- package/build/static/js/20.6e0ae300.chunk.js +2 -0
- package/build/static/js/20.6e0ae300.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.596d5bc7.js → runtime-main.9c757117.js} +2 -2
- package/build/static/js/{runtime-main.596d5bc7.js.map → runtime-main.9c757117.js.map} +1 -1
- package/package.json +1 -1
- package/build/static/js/20.ca430cdf.chunk.js +0 -2
- package/build/static/js/20.ca430cdf.chunk.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(this["webpackJsonp@abtnode/webapp"]=this["webpackJsonp@abtnode/webapp"]||[]).push([[20],{1192:function(e,t,n){"use strict";n.d(t,"e",(function(){return O})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return N})),n.d(t,"d",(function(){return R})),n.d(t,"c",(function(){return T}));var a=n(19),r=n.n(a),l=n(32),c=n(1193),o=n.n(c),i=n(1359),s=n.n(i),u=n(1360),d=n.n(u),m=n(1361),p=n(1362),f=n.n(p),b=n(155),h=n.n(b),g=n(1228),k=n.n(g),v=n(552),E=function(e){return function(e){for(var t=window.atob(e),n=new Uint8Array(t.length),a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n.buffer}(Object(v.toDataURL)(e,{size:200}).replace(/^[^,]*,/,""))};function O(e){return e.replace(/[\s/@_]/g,"-").replace(/[^a-zA-Z0-9_-]/g,"").replace(/(^[-\s]+)|([-\s]+$)/g,"").toLowerCase()}function w(e,t){var n=s()(o()(t.meta),(function(e){return null!==e}));return n.name=e,n.did=k()(e),n.logo="logo.png",n.interfaces.forEach((function(e){e.services||delete e.services})),t.children.forEach((function(e){e.dynamic&&e.bundleSource&&n.children.push({name:e.meta.name,source:e.bundleSource,title:e.meta.title,mountPoint:e.mountPoint})})),n.environments=(t.configs||[]).map((function(e){return{name:e.key,description:"Automatically generated when exporting",required:!!e.required,secure:!!e.secure,default:e.secure?"":e.value||""}})),n.capabilities.component=!1,n}var x=function(e){return"Copyright \xa9 2022 ".concat(e||"","\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.")},j=".DS_Store\n.blocklet",y="name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n Deploy:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repo\n uses: actions/checkout@v2\n\n - name: Blocklet workflow\n uses: blocklet/action-workflow@v1\n with:\n skip-upload: true\n skip-deploy: true\n bundle-command: blocklet bundle --create-release\n github-token: ${{ secrets.GITHUB_TOKEN }}";function N(e){return B.apply(this,arguments)}function B(){return(B=Object(l.a)(r.a.mark((function e(t){var n,a,l,c,o,i,s=arguments;return r.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=s.length>1&&void 0!==s[1]?s[1]:{},a=n.holder,l="".concat(t.name.split("/").pop()),c="# ".concat(t.title,"\n\n## Introduction\n\n").concat(t.description),o=new d.a,(i=o.folder(l)).file("blocklet.yml",m.a.dump(t)),i.file("blocklet.md",c),i.file("README.md",c),i.file("logo.png",E(t.did)),i.file("LICENSE",x(a)),i.file(".gitignore",j),i.folder("screenshots").file(".gitkeep",""),i.folder(".github").folder("workflows").file("main.yml",y),e.next=15,new Promise((function(e,t){o.generateAsync({type:"blob"}).then((function(t){f()(t,"".concat(l,".zip")),e()})).catch((function(e){t(e)}))}));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var R=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=t.routing.adminPath,r=n?encodeURIComponent(h()(window.location.origin,a)):h()(window.location.origin,a),l=h()(null===t||void 0===t?void 0:t.blockletRegistry,"/api/blocklets/".concat(e.did,"/blocklet.json"));return{serverUrl:r,metaUrl:l}},T=function(e,t){var n=R(e,t),a=n.metaUrl,r=n.serverUrl,l=new URL(h()(r,"/launch-blocklet/agreement"));return l.searchParams.set("blocklet_meta_url",a),l.searchParams.set("from",window.location.href),l.href}},1228:function(e,t,n){(function(t){var a=n(1207).types,r=n(1172).toHex,l=n(1368).fromPublicKey;e.exports=function(e){var n=r(t.from("string"===typeof e?e.trim():e));return l(n,{role:a.RoleType.ROLE_ANY})}}).call(this,n(760).Buffer)},1257:function(e,t){},1258:function(e,t){},1259:function(e,t){},1260:function(e,t){},1261:function(e,t){},1265:function(e,t){},1266:function(e,t){},1267:function(e,t){},1268:function(e,t){},1271:function(e,t){},1272:function(e,t){},1331:function(e,t,n){e.exports=n.p+"static/media/logo.3f75f557.svg"},1647:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=s;var a=o(n(0)),r=o(n(26)),l=o(n(8)),c=["children"];function o(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function s(e){var t=e.children,n=i(e,c);return a.default.createElement(u,n,t)}s.propTypes={children:l.default.any.isRequired};var u=r.default.div.withConfig({displayName:"content-layout__Container",componentId:"sc-panu44-0"})(["display:flex;flex-direction:column;align-items:center;width:100%;height:100%;.header{text-align:center;}.body{display:flex;flex-direction:column;align-items:center;margin-top:30px;width:100%;min-height:200px;flex:1;","{padding:24px;}","{padding:0 16px 16px;}}.footer{display:flex;justify-content:center;","{padding-bottom:34px;}","{margin-top:auto;padding-bottom:10px;}}"],(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("sm")}),(function(e){return e.theme.breakpoints.down("md")}))},2077:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return mt}));var a,r,l,c=n(29),o=n(111),i=n(19),s=n.n(i),u=n(32),d=n(0),m=n.n(d),p=n(41),f=n(1653),b=n(155),h=n.n(b),g=n(542),k=n.n(g),v=n(621),E=n(26),O=n(33),w=n(2029),x=n.n(w),j=n(1518),y=n(704),N=n.n(y),B=n(2031),R=n.n(B),T=n(2032),I=n.n(T),S=n(2033),A=n.n(S),U=n(2034),L=n.n(U),C=n(703),F=n.n(C),P=n(40),_=n(551),D=E.default.div(a||(a=Object(c.a)(["\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n"]))),M=n(1316),H=n.n(M),z=n(178),W=n(1379),G=n.n(W),Y=n(89),V=n.n(Y),q=n(1647),K=n.n(q),J=n(92),$=n.n(J);var X=E.default.a(r||(r=Object(c.a)(["\n display: block;\n height: 36px;\n color: ",";\n"])),(function(e){return e.theme.palette.primary.main})),Z=Object(E.default)(K.a)(l||(l=Object(c.a)(["\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n "," {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ",";\n }\n"])),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return"error"===e.variant?e.theme.palette.error.main:e.theme.palette.success.main})),Q=function(e){var t=e.blocklet,n=Object(O.useLocaleContext)().t,a=Object(P.c)().info,r=Object(_.a)(),l=decodeURIComponent(r.get("accessUrl")||"");return H()(t)?m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null)):m.a.createElement(Z,null,m.a.createElement("div",{className:"body"},m.a.createElement(G.a,{variant:"success",title:Object(z.getDisplayName)(t,!0),subTitle:n("launchBlocklet.installSuccess",{serverName:a.name}),footer:m.a.createElement(X,{href:l,rel:"noreferrer","data-cy":"open-blocklet"},n("common.open"))})))},ee=n(11),te=n(90),ne=n(564),ae=n.n(ne),re=n(1248),le=n.n(re),ce=n(2036),oe=n.n(ce),ie=n(1178),se=n.n(ie),ue=n(724),de=n(1370),me=n.n(de),pe=n(182),fe=n.n(pe),be=n(545),he=n.n(be),ge=n(543),ke=n.n(ge),ve=n(51),Ee=n(1648),Oe=n.n(Ee),we=n(154),xe=n.n(we),je=n(2039),ye=n.n(je),Ne=n(596),Be=n(66),Re=n(110),Te=n(1192),Ie=n(204),Se=n(135),Ae=n.n(Se),Ue=["children"];function Le(e){var t=e.children,n=Object(Ie.a)(e,Ue);return m.a.createElement(Ae.a,Object.assign({variant:"contained",color:"primary"},n),t)}var Ce=m.a.forwardRef((function(e,t){return m.a.createElement(Le,Object.assign({},e,{forwardedRef:t}))})),Fe=n(8),Pe=n.n(Fe),_e=n(443),De=n.n(_e);function Me(e){var t=e.blocklet,n=e.blockletMetaUrl,a=t.meta,r=a.did,l=a.logo;return l?m.a.createElement(De.a,{src:Object(Re.l)({did:r,logoPath:l,baseUrl:new URL(n).origin}),width:64,size:"contain",placeholder:"application logo"}):m.a.createElement(ke.a,{did:r,size:64})}function He(e){var t=e.onCancel,n=e.onUpgrade,a=Object(O.useLocaleContext)().t;return m.a.createElement(G.a,{variant:"info",title:a("launchBlocklet.newVersion"),subTitle:a("launchBlocklet.newVersionDesc"),footer:m.a.createElement(m.a.Fragment,null,m.a.createElement(Ce,{onClick:t,variant:"outlined"},a("launchBlocklet.later")),m.a.createElement(Ce,{onClick:n,style:{marginLeft:24}},a("launchBlocklet.upgradeNow")))})}Me.propTypes={blocklet:Pe.a.object.isRequired,blockletMetaUrl:Pe.a.string.isRequired},He.defaultProps={onCancel:function(){},onUpgrade:function(){}};var ze,We,Ge,Ye,Ve=n(1331),qe=n.n(Ve),Ke=n(35);var Je,$e,Xe=E.default.a(ze||(ze=Object(c.a)(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ",";\n"])),(function(e){return e.theme.palette.primary.main})),Ze=E.default.div(We||(We=Object(c.a)(["\n color: #1dc1c7;\n"]))),Qe=Object(E.default)(K.a)(Ge||(Ge=Object(c.a)(["\n .body {\n align-items: center;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n "," {\n margin: 25px 24px 0;\n }\n }\n\n .status-icon {\n width: 48px;\n height: 48px;\n }\n\n .status-title {\n margin-top: 16px;\n text-align: center;\n font-size: 24px;\n line-height: 28px;\n }\n\n .status-desc {\n text-align: center;\n margin-top: 16px;\n color: #999999;\n font-size: 16px;\n line-height: 28px;\n }\n .launch-page-header {\n transition: all ease 0.3s;\n &.header-hide {\n opacity: 0;\n }\n }\n .result-footer {\n overflow: visible;\n }\n"])),(function(e){return e.theme.breakpoints.down("md")})),et=E.default.div(Ye||(Ye=Object(c.a)(["\n .msg-before {\n display: inline-block;\n color: #aaa;\n font-size: 14px;\n margin-right: 6px;\n }\n"]))),tt=function(e){var t=e.blocklet,n=Object(_.a)(),a=Object(p.k)(),r=Object(E.useTheme)(),l=Object(v.a)(r.breakpoints.down("md")),c=se()("skip-blocklet-setup",!1),i=Object(ee.a)(c,1)[0],f=n.get("blocklet_meta_url"),b=new URL(f).origin,h=function(e){var t=Object(d.useState)(""),n=Object(ee.a)(t,2),a=n[0],r=n[1],l=Object(d.useRef)(null);l.current=e;var c=function(e){return function(t){t.meta.did===l.current.meta.did&&e(t)}};return Object(Ke.b)(ve.BlockletEvents.added,c((function(){return r("added")}))),Object(Ke.b)(ve.BlockletEvents.installed,c((function(){return r("installed")}))),Object(Ke.b)(ve.BlockletEvents.statusChange,c((function(e){switch(e.status){case ve.BlockletStatus.downloading:r("downloading");break;case ve.BlockletStatus.installing:r("installing")}}))),Object(Ke.b)(ve.BlockletEvents.installFailed,c((function(){r("installFailed")}))),Object(Ke.b)(ve.BlockletEvents.downloadFailed,c((function(){r("downloadFailed")}))),a}(t),g=Object(P.c)(),w=g.api,x=g.info,j=g.loading,y=Object(O.useLocaleContext)(),N=y.t,B=y.locale,R=Object(Be.c)().session,T=Object(d.useState)(!1),I=Object(ee.a)(T,2),S=I[0],A=I[1],U=Object(d.useState)(!1),L=Object(ee.a)(U,2),C=L[0],F=L[1],D=Object(d.useState)({meta:null,loading:!0,error:null}),M=Object(ee.a)(D,2),W=M[0],Y=M[1],q=Object(d.useState)({exists:t.isInstalled,status:"launchBlocklet.installing",upgradeAvailable:null,blocklet:null,error:null,errorAction:t.isInstalled?"view":"retry"}),K=Object(ee.a)(q,2),J=K[0],X=K[1],Z=Object(d.useState)(""),Q=Object(ee.a)(Z,2),ne=Q[0],re=Q[1],ce=new URL(window.location.href).searchParams.get("from");if(Object(d.useEffect)((function(){(function(){var e=Object(u.a)(s.a.mark((function e(){var n,a,r;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t&&t.meta){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,w.getBlocklet({input:{did:t.meta.did}});case 5:if(n=e.sent,a=n.blocklet,Y((function(e){return Object(o.a)(Object(o.a)({},e),{},{loading:!1})})),a){e.next=10;break}return e.abrupt("return");case 10:if(!le.a.gt(t.meta.version,a.meta.version)){e.next=16;break}return r=a.environments.find((function(e){return"BLOCKLET_APP_ID"===e.key})),e.next=14,Ie(a,{appDid:r?r.value:"",did:a.meta.did,currentVersion:a.meta.version,version:t.meta.version});case 14:e.next=18;break;case 16:return e.next=18,Ie(a);case 18:e.next=24;break;case 20:e.prev=20,e.t0=e.catch(2),console.error("error fetch blocklet info",e.t0),Y((function(e){return Object(o.a)(Object(o.a)({},e),{},{loading:!1})}));case 24:case"end":return e.stop()}}),e,null,[[2,20]])})));return function(){return e.apply(this,arguments)}})()()}),[t]),"installFailed"!==h&&"downloadFailed"!==h||(F(!1),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.".concat(h)}))),H()(t)||j)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));var ie=Object(z.getDisplayName)(t,!0),de=null,pe=function(){var e=Object(u.a)(s.a.mark((function e(){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(R.user&&(R.user.permissions||[]).includes("mutate_blocklet"))||!t.isFree){e.next=8;break}return F(!0),X(Object(o.a)(Object(o.a)({},J),{},{error:""})),e.next=6,w.installBlocklet({input:{url:f}}).catch((function(e){xe.a.error(e.message),console.error("install blocklet failed",e)}));case 6:return de=Ue(),e.abrupt("return");case 8:A(!0);case 9:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),be=function(e){X(Object(o.a)(Object(o.a)({},J),{},{status:"launchBlocklet.redirecting"})),clearInterval(de),setTimeout((function(){!function(e){var t="/blocklets/".concat(e.meta.did,"/configuration"),r="/launch-blocklet/complete?status=installed&name=".concat(encodeURIComponent(ie),"&accessUrl=").concat(encodeURIComponent(t),"&blocklet_meta_url=").concat(f),l=n.get("from");l&&(r+="from=".concat(l)),a.push(r)}(e)}),1500)},ge=function(){var e=Object(u.a)(s.a.mark((function e(n){var a,r,l,c;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.interfaces.map((function(e){return e.url})),e.next=3,Object(Re.k)(r);case 3:if(l=e.sent,!H()(l)&&!i){e.next=7;break}return be(n),e.abrupt("return");case 7:X(Object(o.a)(Object(o.a)({},J),{},{status:"launchBlocklet.redirecting"})),clearInterval(de),(c=new URL(l)).searchParams.set("serverUrl",null===(a=Object(Te.d)(t,x))||void 0===a?void 0:a.serverUrl),"running"!==n.status&&c.searchParams.set("__start__","1"),re(c.href),setTimeout((function(){window.location.href=c.href}),1500);case 14:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),Ee=function(){var e=Object(u.a)(s.a.mark((function e(t){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:setTimeout(Object(u.a)(s.a.mark((function e(){var n;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.getBlocklet({input:{did:t.meta.did}});case 2:if("installed"!==(n=e.sent).blocklet.status){e.next=8;break}return e.next=6,Ie(n.blocklet);case 6:e.next=9;break;case 8:de=Ue();case 9:case"end":return e.stop()}}),e)}))),1500);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),we=function(e,t){return X(Object(o.a)(Object(o.a)({},J),{},{error:e,errorAction:t}))},je=function(e,t){if(!t)return["stopped","stopping"].includes(e.status)?(F(!1),void X((function(e){return Object(o.a)(Object(o.a)({},e),{},{exists:!0})}))):["error","corrupted"].includes(e.status)?(F(!1),void X((function(e){return Object(o.a)(Object(o.a)({},e),{},{exists:!0,error:"launchBlocklet.error.installedButError",errorAction:"view"})}))):void("running"!==e.status?"installed"===e.status&&ge(e):ge(e));!function(e,t){F(!1),X((function(e){return Object(o.a)(Object(o.a)({},e),{},{upgradeAvailable:t})}))}(0,t)},Ie=function(){var e=Object(u.a)(s.a.mark((function e(t,n){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=4;break}return F(!1),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.launchFailed"})),e.abrupt("return");case 4:X(Object(o.a)(Object(o.a)({},J),{},{blocklet:t})),je(t,n);case 6:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),Se=function(){var e=Object(u.a)(s.a.mark((function e(t,n){var a;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,a={did:t.meta.did,version:n.version,registryUrl:b},F(!0),X(Object(o.a)(Object(o.a)({},J),{},{status:"common.upgrading"})),e.next=6,w.upgradeBlocklet({input:a});case 6:e.next=12;break;case 8:e.prev=8,e.t0=e.catch(0),xe.a.error(e.t0.message),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.upgradeFailed"}));case 12:case"end":return e.stop()}}),e,null,[[0,8]])})));return function(t,n){return e.apply(this,arguments)}}(),Ae=oe()(Object(u.a)(s.a.mark((function e(){var n,a,r;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.getBlocklet({input:{did:t.meta.did}});case 2:if(n=e.sent,a=n.blocklet){e.next=9;break}return clearInterval(de),F(!1),we("launchBlocklet.error.startFailed","retry"),e.abrupt("return");case 9:r=ve.BlockletStatus[a.status],[ve.BlockletStatus.error,ve.BlockletStatus.corrupted].includes(r)&&(F(!1),clearInterval(de),we("launchBlocklet.error.startFailed","view")),ve.BlockletStatus.installed===r&&(clearInterval(de),Ee(a)),[ve.BlockletStatus.stopped,ve.BlockletStatus.running].includes(r)&&Ie(a);case 13:case"end":return e.stop()}}),e)}))),2e3),Ue=function(){return setInterval(Ae,2e3)},Le=function(){var e=Object(u.a)(s.a.mark((function e(t,n){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return localStorage.setItem("__sst",n(t.sessionToken)),e.next=3,R.refresh();case 3:F(!0),A(!1),de=Ue();case 6:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();if(W.error)return m.a.createElement(k.a,{variant:"icon",type:"error"},W.error.message);if(W.loading)return m.a.createElement("div",{style:{marginTop:"100px",textAlign:"center",width:"100%"}},m.a.createElement(V.a,null));var Fe="/";window.env&&window.env.apiPrefix&&(Fe=window.env.apiPrefix);var Pe={view:m.a.createElement(Ce,{className:"bottom-button",component:te.Link,to:"/blocklets/".concat(t.meta.did,"/overview"),fullWidth:l,"data-cy":"view-blocklet",color:"primary",variant:"contained"},N("launchBlocklet.viewApplication")),retry:m.a.createElement(ue.a,{display:"flex",flexDirection:"column"},m.a.createElement(Ce,{className:"bottom-button","data-cy":"retry-install",disabled:S,fullWidth:l,onClick:pe},S&&m.a.createElement(V.a,{size:[16,10]}),N("common.retry")),ce&&m.a.createElement(Ce,{style:{marginTop:24},variant:"text",className:"bottom-button","data-cy":"go-back",disabled:S,fullWidth:l,onClick:function(){window.location.href=ce}},N("common.back")))};if(!C&&J.upgradeAvailable)return m.a.createElement(Qe,null,m.a.createElement(He,{onCancel:function(){return e=J.blocklet,void ge(e);var e},onUpgrade:function(){return Se(J.blocklet,J.upgradeAvailable)}}));if(!C&&J.exists)return m.a.createElement(Qe,null,m.a.createElement(G.a,{variant:"info",title:ie,subTitle:N("launchBlocklet.error.installedButStopped"),footer:Pe.view}));if(J.error)return m.a.createElement(Qe,null,m.a.createElement(G.a,{variant:"error",title:ie,subTitle:N(J.error,{appName:ie,serverName:x.name}),footer:Pe[J.errorAction]}));var _e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"1/5"),N("launchBlocklet.waiting.verifying"))};switch(h){case"downloading":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"2/5"),N("launchBlocklet.waiting.downloading"))};break;case"installing":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"3/5"),N("launchBlocklet.waiting.extracting"))};break;case"installed":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"4/5"),N("launchBlocklet.waiting.installing"))}}return m.a.createElement(Qe,null,!J.upgradeAvailable&&m.a.createElement("div",{className:"header"},m.a.createElement(Oe.a,{className:"launch-page-header ".concat(ne?"header-hide":""),title:N(C?"launchBlocklet.start":"common.launch"),subTitle:C?"":N("launchBlocklet.subTitle",{appName:ie,serverName:x.name})})),m.a.createElement("div",{className:"body"},!C&&m.a.createElement("div",{className:"illustrations"},m.a.createElement("div",{className:"ills-block ills-block-left"},m.a.createElement("div",{className:"ills-block-inner"},m.a.createElement(Me,{className:"i-icon",blocklet:t,blockletMetaUrl:f}),m.a.createElement("div",{className:"i-name"},ie))),m.a.createElement(me.a,{className:"arrow-icon"}),m.a.createElement("div",{className:"ills-block ills-block-right"},m.a.createElement("div",{className:"ills-block-inner"},m.a.createElement("img",{width:"64",height:"64",src:qe.a,alt:""}),m.a.createElement("div",{className:"i-name"},x.name),m.a.createElement(he.a,{size:12,prepend:m.a.createElement(ke.a,{did:x.did,size:12,style:{marginRight:4}})},x.did)))),!C&&!J.exists&&m.a.createElement(Ce,{className:"bottom-button","data-cy":"start-launch",disabled:S,onClick:pe},S&&m.a.createElement(V.a,{size:[16,10]}),N("common.next")),C&&!ne&&m.a.createElement(Ze,null,m.a.createElement(ye.a,Object.assign({},_e,{increaseSpeed:.3,messageLoop:!1}))),C&&!!ne&&m.a.createElement(G.a,{variant:ne?"success":"loading",title:ne?ie:"",subTitle:ne?N("launchBlocklet.installSuccess",{serverName:x.name}):N(J.status,{appName:ie,serverName:x.name}),footer:ne?m.a.createElement(Xe,{href:ne,rel:"noreferrer","data-cy":"open-blocklet"},m.a.createElement(V.a,{size:[16,10],style:{marginRight:14}})," ",N("common.redirecting")):"",style:{marginBottom:34}})),m.a.createElement(fe.a,{open:S,popup:!0,className:"connect",action:"launch-".concat(t.isFree?"free":"paid","-blocklet-by-").concat(Object(Ne.getServerAuthMethod)(x)),checkFn:ae.a.create({baseURL:Fe}).get,checkTimeout:6e5,socketUrl:w.socketUrl,webWalletUrl:Object(Re.s)(x),onSuccess:Le,onClose:function(){return A(!1)},locale:B,messages:{title:"".concat(N("launchBlocklet.dialog.title")),scan:t.isFree?N("launchBlocklet.dialog.freeDescription"):N("launchBlocklet.dialog.nonFreeDescription"),confirm:N("launchBlocklet.dialog.confirm"),success:N("launchBlocklet.dialog.success")},extraParams:{blockletMetaUrl:f}}))},nt=n(2046),at=n.n(nt),rt=n(2047),lt=n.n(rt);function ct(e){var t=Object.assign({},e);return m.a.createElement("div",Object.assign({},t,{style:{width:"100%"}}),m.a.createElement("h3",null,"End User License Agreement for Application"),m.a.createElement("p",null,"Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28"),m.a.createElement("p",null,"BLOCKLET SERVER LICENSE AGREEMENT"),m.a.createElement("p",null,"\u6682\u65e0"))}function ot(e){var t=e.blocklet,n=Object(p.k)(),a=Object(d.useState)(null),r=Object(ee.a)(a,2),l=r[0],c=r[1],o=Object(d.useState)(null),i=Object(ee.a)(o,2),f=i[0],b=i[1],h=Object(d.useState)(!1),g=Object(ee.a)(h,2),v=g[0],E=g[1],w=Object(O.useLocaleContext)(),x=w.t,j=w.locale,y=Object(P.c)(),N=y.info,B=y.api,R=t.isRunning,T=Object(d.useMemo)((function(){return H()(t)||v}),[t,v]);if(Object(d.useEffect)((function(){R&&function(){var e=Object(u.a)(s.a.mark((function e(){var n,a,r,l,o;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,E(!0),e.next=4,B.getBlocklet({input:{did:t.meta.did}});case 4:return n=e.sent,a=n.blocklet,r=a.interfaces.map((function(e){return e.url})),e.next=9,Object(Re.k)(r);case 9:if((l=e.sent)||!H()(l)){e.next=13;break}return c(null),e.abrupt("return");case 13:o=new URL(l),c(o.href),e.next=20;break;case 17:e.prev=17,e.t0=e.catch(0),b(e.t0.message);case 20:return e.prev=20,E(!1),e.finish(20);case 23:case"end":return e.stop()}}),e,null,[[0,17,20,23]])})));return function(){return e.apply(this,arguments)}}()()}),[t]),f)return m.a.createElement($.a,{relative:"parent"},m.a.createElement("div",null,m.a.createElement(k.a,{style:{wordBreak:"break-all"},variant:"icon",type:"error"},f)));if(T)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));var I=t.meta,S={data:I};if(!I)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));if(t.isInstalled){var A=l?"alreadyRunning":"alreadyInstalled";return m.a.createElement(G.a,{variant:"info",title:x("common.reminder"),subTitle:x("launchBlocklet.".concat(A),{name:Object(z.getDisplayName)(t,!0)}),footer:m.a.createElement(dt,null,m.a.createElement(Ce,{"data-cy":"view-blocklet",component:te.Link,to:"/blocklets/".concat(t.meta.did,"/overview"),variant:l?"outlined":"contained",color:"primary"},x("launchBlocklet.viewApplication")),l&&m.a.createElement(Ce,{className:"last-button",href:l,"data-cy":"open-blocklet"},x("common.open")))})}return N?m.a.createElement(ut,null,m.a.createElement(Oe.a,{title:x("launchBlocklet.introduction"),subTitle:x("launchBlocklet.welcome")}),m.a.createElement("div",{className:"app-content"},m.a.createElement("div",{className:"agreement"},m.a.createElement("div",{className:"agreement-content"},m.a.createElement(lt.a,{blockletMeta:S,locale:j})))),m.a.createElement("div",{className:"button-container","data-cy":"agree-all"},m.a.createElement(at.a,{onContinue:function(){n.push("/launch-blocklet/install".concat(window.location.search))},description:m.a.createElement(ct,null),texts:{listenName:x("launchBlocklet.license"),buttonNext:x("launchBlocklet.next")}}))):m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null))}var it,st,ut=E.default.div(Je||(Je=Object(c.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 34px 24px 24px;\n "," {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ",";\n border-radius: 12px;\n\n "," {\n margin-top: 24px;\n }\n\n "," {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n "," {\n padding: 0 24px;\n }\n\n "," {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n "," {\n padding-right: 24px;\n margin-left: auto;\n }\n "," {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n"])),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.palette.grey[100]}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")})),dt=E.default.div($e||($e=Object(c.a)(["\n .MuiButton-root {\n "," {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ","px;\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.spacing(2)}));function mt(){var e=Object(v.a)((function(e){return e.breakpoints.down("md")})),t=Object(p.n)().path,n=Object(O.useLocaleContext)(),a=n.t,r=n.locale,l=Object(_.a)(),c=Object(P.c)(),i=c.api,d=c.info,b=!!l.get("from_launcher"),g=Object(Re.s)(d),E=(l.get("blocklet_meta_url")||"").trim();E=decodeURIComponent(E);var w=Object(f.a)(Object(u.a)(s.a.mark((function e(){var t,n,r,l,c;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(E){e.next=2;break}throw new Error(a("common.invalidParam"));case 2:return e.next=4,i.getBlockletMetaFromUrl({input:{url:E,checkPrice:!0}});case 4:if(t=e.sent,n=t.meta,r=t.isFree,l=t.isInstalled,c=t.isRunning,n){e.next=11;break}throw new Error(a("launchBlocklet.error.loadMetaFailed"));case 11:return e.abrupt("return",{meta:n,isFree:r,isInstalled:l,isRunning:c});case 12:case"end":return e.stop()}}),e)}))));if(w.error)return m.a.createElement(D,null,m.a.createElement("div",null,m.a.createElement(k.a,{style:{width:"100%",wordBreak:"break-all"},variant:"icon",type:"error"},w.error.message)));var y=w.value||{},B=y.meta,T=y.isFree,S=h()(Object(Re.r)(),t),U=[{key:"agreement",name:a("launchBlocklet.introduction"),path:h()(S,"agreement")},{key:"install",name:a("launchBlocklet.launch"),path:h()(S,"install")},{key:"setup",name:a("launchBlocklet.setup"),path:h()(S,"complete")}],C=m.a.createElement(ft,null,m.a.createElement(F.a,{logo:e?m.a.createElement(I.a,{width:"32",height:"32"}):m.a.createElement(A.a,{width:"128",height:"48"})}));return b&&(U.splice(0,1),C=m.a.createElement(ft,null,m.a.createElement(F.a,{logo:e?m.a.createElement(I.a,{width:"32",height:"32"}):m.a.createElement(A.a,{width:"128",height:"48"}),previousData:{logo:e?m.a.createElement(R.a,{width:"32",height:"32"}):m.a.createElement(L.a,{width:"145",height:"48"})}}))),B&&(B.registryUrl=new URL(E).origin),m.a.createElement(j.StepProvider,{steps:U},m.a.createElement(x.a,{locale:r,blockletMeta:Object(o.a)(Object(o.a)({},B),{},{isFree:T}),navLogo:C,headerEndAddons:m.a.createElement(N.a,{webWalletUrl:g,SessionContext:Be.a}),pcWidth:"80%",logoUrl:B&&B.logo?Object(Re.l)({did:B.did,baseUrl:B.registryUrl,logoPath:B.logo}):null},m.a.createElement(pt,null,m.a.createElement(p.g,null,m.a.createElement(p.c,{exact:!0,path:t,to:"".concat(t,"/agreement").concat(window.location.search)}),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/agreement")},m.a.createElement(ot,{blocklet:w.value||{},loading:w.loading})),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/install")},m.a.createElement(tt,{blocklet:w.value||{}})),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/complete")},m.a.createElement(Q,{blocklet:w.value||{}}))))))}var pt=E.default.div(it||(it=Object(c.a)(["\n padding-top: 34px;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n"]))),ft=E.default.div(st||(st=Object(c.a)(["\n margin-top: -1px;\n"])))}}]);
|
|
2
|
-
//# sourceMappingURL=20.ca430cdf.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["components/blocklet/util.js","../../../blocklet/meta/lib/did.js","assets/logo.svg","../../ux/lib/launch-blocklet/content-layout.js","components/launch-blocklet/center.js","components/launch-blocklet/step-complete.js","components/launch-blocklet/button.js","components/launch-blocklet/app-logo.js","components/launch-blocklet/status/upgrade-available.js","components/launch-blocklet/step-install.js","components/launch-blocklet/agreement-app.js","components/launch-blocklet/step-agreement.js","pages/launch-blocklet/index.js"],"names":["getLogo","did","base64","bufStr","window","atob","bytes","Uint8Array","length","i","charCodeAt","buffer","base64ToArrayBuffer","toDataURL","size","replace","getNameByTitle","title","toLowerCase","genExportedMeta","name","blocklet","meta","pickBy","cloneDeep","x","toBlockletDid","logo","interfaces","forEach","services","children","child","dynamic","bundleSource","push","source","mountPoint","environments","configs","map","key","description","required","secure","default","value","capabilities","component","license","holder","Gitignore","GithubAction","downloadExportedSource","a","folderName","split","pop","readme","zip","JSZip","folder","file","yaml","dump","Promise","resolve","reject","generateAsync","type","then","content","saveAs","catch","err","getLaunchURL","info","encodeURI","adminPath","routing","serverUrl","encodeURIComponent","joinURL","location","origin","metaUrl","blockletRegistry","getLaunchAgreementUrl","url","URL","searchParams","set","href","types","require","toHex","fromPublicKey","module","exports","pk","Buffer","from","trim","role","RoleType","ROLE_ANY","Object","defineProperty","ContentLayout","_react","_interopRequireDefault","_styledComponents","_propTypes","_excluded","obj","__esModule","_objectWithoutProperties","excluded","target","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","prototype","propertyIsEnumerable","call","_ref","props","createElement","Container","propTypes","any","isRequired","div","withConfig","displayName","componentId","theme","breakpoints","up","down","Center","styled","Link","palette","primary","main","variant","error","success","Complete","t","useLocaleContext","useNodeContext","query","useQuery","accessUrl","decodeURIComponent","get","isEmpty","relative","className","getDisplayName","subTitle","serverName","footer","rel","data-cy","WrappedButton","color","React","forwardRef","ref","forwardedRef","AppLogo","blockletMetaUrl","logoPath","src","getBlockletLogoUrl","baseUrl","width","placeholder","Upgrade","onCancel","onUpgrade","onClick","style","marginLeft","PropTypes","object","string","defaultProps","LinkEle","WaiterContainer","MessageDiv","Install","history","useHistory","useTheme","isBreakpointsDownSm","useMediaQuery","useLocalStorage","skipSetup","blockletRegistryUrl","waiterState","blockletData","useState","setWaiterState","useRef","current","createTargetHandler","handler","b","useSubscription","BlockletEvents","added","installed","statusChange","e","status","BlockletStatus","downloading","installing","installFailed","downloadFailed","useWaiterState","api","loading","locale","session","useSessionContext","openAuth","setOpenAuth","launching","setLaunching","blockletState","setBlockletState","exists","isInstalled","upgradeAvailable","errorAction","launchState","setLaunchState","nextAccessUrl","setNextAccessUrl","fromUrl","useEffect","getBlocklet","input","pre","semver","gt","version","appDidEnv","find","handleLaunchState","appDid","currentVersion","console","onMount","intervalId","handleLaunchStart","user","permissions","includes","isFree","installBlocklet","Toast","message","poll","visitOverview","clearInterval","setTimeout","nextUrl","redirectToBlockletOverview","visitBlocklet","urls","getAccessibleUrl","handleInstalled","result","handleError","handleBlockletExisted","handleUpgradeAvailable","handleUpgrade","registryUrl","upgradeBlocklet","checkBlockletStatus","throttle","statusCode","corrupted","stopped","running","setInterval","handleConnectSuccess","decrypt","localStorage","setItem","sessionToken","refresh","marginTop","textAlign","baseURL","env","apiPrefix","errorActions","view","to","fullWidth","retry","Box","display","flexDirection","disabled","appName","waiterData","height","serverLogo","alt","prepend","marginRight","increaseSpeed","messageLoop","marginBottom","open","popup","action","getServerAuthMethod","checkFn","axios","create","checkTimeout","socketUrl","webWalletUrl","getWebWalletUrl","onSuccess","onClose","messages","scan","confirm","extraParams","AgreementApp","Agreement","setAccessUrl","setError","accessUrlLoading","setAccessUrlLoading","isRunning","useMemo","accessUrlTmp","wordBreak","data","blockletMeta","already","ButtonWrap","onContinue","search","texts","listenName","buttonNext","grey","spacing","BlockletLauncher","isMobile","path","useRouteMatch","fromLauncher","state","useAsync","Error","getBlockletMetaFromUrl","checkPrice","basePath","joinUrl","getPathPrefix","steps","navLogo","LogoContainer","splice","previousData","headerEndAddons","SessionContext","pcWidth","logoUrl","Content","exact"],"mappings":"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","file":"static/js/20.ca430cdf.chunk.js","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport pickBy from 'lodash/pickBy';\nimport JSZip from 'jszip';\nimport yaml from 'js-yaml';\nimport saveAs from 'file-saver';\nimport joinURL from 'url-join';\n\nimport toBlockletDid from '@blocklet/meta/lib/did';\n\nimport { toDataURL } from '@arcblock/did-motif';\n\nconst base64ToArrayBuffer = base64 => {\n const bufStr = window.atob(base64);\n const bytes = new Uint8Array(bufStr.length);\n for (let i = 0; i < bufStr.length; i++) {\n bytes[i] = bufStr.charCodeAt(i);\n }\n return bytes.buffer;\n};\n\nconst getLogo = did => {\n const url = toDataURL(did, { size: 200 });\n const base64 = url.replace(/^[^,]*,/, '');\n return base64ToArrayBuffer(base64);\n};\n\nexport function getNameByTitle(title) {\n return title\n .replace(/[\\s/@_]/g, '-')\n .replace(/[^a-zA-Z0-9_-]/g, '')\n .replace(/(^[-\\s]+)|([-\\s]+$)/g, '')\n .toLowerCase();\n}\n\nexport function genExportedMeta(name, blocklet) {\n const meta = pickBy(cloneDeep(blocklet.meta), x => x !== null);\n\n meta.name = name;\n meta.did = toBlockletDid(name);\n meta.logo = 'logo.png';\n\n meta.interfaces.forEach(x => {\n // filter null or undefined\n if (!x.services) {\n delete x.services;\n }\n });\n\n blocklet.children.forEach(child => {\n if (child.dynamic && child.bundleSource) {\n meta.children.push({\n name: child.meta.name,\n source: child.bundleSource,\n title: child.meta.title,\n mountPoint: child.mountPoint,\n });\n }\n });\n\n meta.environments = (blocklet.configs || []).map(x => ({\n name: x.key,\n description: 'Automatically generated when exporting',\n required: !!x.required,\n secure: !!x.secure,\n default: x.secure ? '' : x.value || '',\n }));\n\n meta.capabilities.component = false;\n\n return meta;\n}\n\nconst license = holder => `Copyright © 2022 ${holder || ''}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`;\n\nconst Gitignore = `.DS_Store\n.blocklet`;\n\nconst GithubAction = `name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n Deploy:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repo\n uses: actions/checkout@v2\n\n - name: Blocklet workflow\n uses: blocklet/action-workflow@v1\n with:\n skip-upload: true\n skip-deploy: true\n bundle-command: blocklet bundle --create-release\n github-token: \\${{ secrets.GITHUB_TOKEN }}`;\n\nexport async function downloadExportedSource(meta, { holder } = {}) {\n const folderName = `${meta.name.split('/').pop()}`;\n const readme = `# ${meta.title}\\n\\n## Introduction\\n\\n${meta.description}`;\n\n const zip = new JSZip();\n const folder = zip.folder(folderName);\n folder.file('blocklet.yml', yaml.dump(meta));\n folder.file('blocklet.md', readme);\n folder.file('README.md', readme);\n folder.file('logo.png', getLogo(meta.did));\n folder.file('LICENSE', license(holder));\n folder.file('.gitignore', Gitignore);\n folder.folder('screenshots').file('.gitkeep', '');\n folder.folder('.github').folder('workflows').file('main.yml', GithubAction);\n await new Promise((resolve, reject) => {\n zip\n .generateAsync({ type: 'blob' })\n .then(content => {\n saveAs(content, `${folderName}.zip`);\n resolve();\n })\n .catch(err => {\n reject(err);\n });\n });\n}\nexport const getLaunchURL = (meta, info, encodeURI = false) => {\n const adminPath = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';\n const serverUrl = encodeURI\n ? encodeURIComponent(joinURL(window.location.origin, adminPath))\n : joinURL(window.location.origin, adminPath);\n const metaUrl = joinURL(info?.blockletRegistry, `/api/blocklets/${meta.did}/blocklet.json`);\n return { serverUrl, metaUrl };\n};\nexport const getLaunchAgreementUrl = (meta, info) => {\n const { metaUrl, serverUrl } = getLaunchURL(meta, info);\n\n const url = new URL(joinURL(serverUrl, '/launch-blocklet/agreement'));\n url.searchParams.set('blocklet_meta_url', metaUrl);\n url.searchParams.set('from', window.location.href);\n return url.href;\n};\n","const { types } = require('@ocap/mcrypto');\nconst { toHex } = require('@ocap/util');\nconst { fromPublicKey } = require('@arcblock/did');\n\nconst toBlockletDid = (name) => {\n const pk = toHex(Buffer.from(typeof name === 'string' ? name.trim() : name));\n return fromPublicKey(pk, { role: types.RoleType.ROLE_ANY });\n};\n\nmodule.exports = toBlockletDid;\n","module.exports = __webpack_public_path__ + \"static/media/logo.3f75f557.svg\";","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ContentLayout;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _styledComponents = _interopRequireDefault(require(\"styled-components\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nconst _excluded = [\"children\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ContentLayout(_ref) {\n let {\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/_react.default.createElement(Container, props, children);\n}\n\nContentLayout.propTypes = {\n children: _propTypes.default.any.isRequired\n};\n\nconst Container = _styledComponents.default.div.withConfig({\n displayName: \"content-layout__Container\",\n componentId: \"sc-panu44-0\"\n})([\"display:flex;flex-direction:column;align-items:center;width:100%;height:100%;.header{text-align:center;}.body{display:flex;flex-direction:column;align-items:center;margin-top:30px;width:100%;min-height:200px;flex:1;\", \"{padding:24px;}\", \"{padding:0 16px 16px;}}.footer{display:flex;justify-content:center;\", \"{padding-bottom:34px;}\", \"{margin-top:auto;padding-bottom:10px;}}\"], props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'));","import styled from 'styled-components';\n\nconst Center = styled.div`\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport default Center;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nfunction Complete({ blocklet }) {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const query = useQuery();\n const accessUrl = decodeURIComponent(query.get('accessUrl') || '');\n\n if (isEmpty(blocklet)) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n return (\n <Container>\n <div className=\"body\">\n <ResultMessage\n variant=\"success\"\n title={getDisplayName(blocklet, true)}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n <Link href={accessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n {t('common.open')}\n </Link>\n }\n />\n </div>\n </Container>\n );\n}\n\nconst Link = styled.a`\n display: block;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst Container = styled(ContentLayout)`\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n ${props => {\n return props.theme.breakpoints.down('md');\n }} {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ${props => (props.variant === 'error' ? props.theme.palette.error.main : props.theme.palette.success.main)};\n }\n`;\n\nComplete.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nexport default Complete;\n","import React from 'react';\nimport Button from '@arcblock/ux/lib/Button';\nimport PropTypes from 'prop-types';\n\nfunction WrappedButton({ children, ...props }) {\n return (\n <Button variant=\"contained\" color=\"primary\" {...props}>\n {children}\n </Button>\n );\n}\n\nWrappedButton.propTypes = {\n children: PropTypes.any.isRequired,\n};\n\nexport default React.forwardRef((props, ref) => <WrappedButton {...props} forwardedRef={ref} />);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Img from '@arcblock/ux/lib/Img';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getBlockletLogoUrl } from '../../libs/util';\n\nexport default function AppLogo({ blocklet, blockletMetaUrl }) {\n const { did, logo: logoPath } = blocklet.meta;\n\n let content;\n\n if (logoPath) {\n content = (\n <Img\n src={getBlockletLogoUrl({\n did,\n logoPath,\n baseUrl: new URL(blockletMetaUrl).origin,\n })}\n width={64}\n size=\"contain\"\n placeholder=\"application logo\"\n />\n );\n } else {\n content = <Avatar did={did} size={64} />;\n }\n\n return content;\n}\n\nAppLogo.propTypes = {\n blocklet: PropTypes.object.isRequired,\n blockletMetaUrl: PropTypes.string.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Button from '../button';\n\nexport default function Upgrade({ onCancel, onUpgrade }) {\n const { t } = useLocaleContext();\n\n return (\n <ResultMessage\n variant=\"info\"\n title={t('launchBlocklet.newVersion')}\n subTitle={t('launchBlocklet.newVersionDesc')}\n footer={\n <>\n <Button onClick={onCancel} variant=\"outlined\">\n {t('launchBlocklet.later')}\n </Button>\n <Button onClick={onUpgrade} style={{ marginLeft: 24 }}>\n {t('launchBlocklet.upgradeNow')}\n </Button>\n </>\n }\n />\n );\n}\n\nUpgrade.propTypes = {\n onCancel: PropTypes.func,\n onUpgrade: PropTypes.func,\n};\n\nUpgrade.defaultProps = {\n onCancel: () => {},\n onUpgrade: () => {},\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useHistory, Link } from 'react-router-dom';\nimport axios from 'axios';\nimport semver from 'semver';\nimport isEmpty from 'lodash/isEmpty';\nimport PropTypes from 'prop-types';\nimport styled, { useTheme } from 'styled-components';\nimport throttle from 'lodash/throttle';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\nimport { useMediaQuery } from '@mui/material';\nimport Box from '@mui/material/Box';\nimport ArrowForward from '@mui/icons-material/ArrowForward';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Center from '@arcblock/ux/lib/Center';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport { BlockletStatus, BlockletEvents } from '@blocklet/meta/lib/constants';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Toast from '@abtnode/ux/lib/toast';\nimport AnimationWaiter from '@arcblock/ux/lib/AnimationWaiter';\nimport { getServerAuthMethod } from '@abtnode/auth/lib/util/get-auth-method';\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport { getWebWalletUrl, getAccessibleUrl } from '../../libs/util';\nimport { getLaunchURL } from '../blocklet/util';\nimport useQuery from '../../hooks/query';\nimport Button from './button';\nimport AppLogo from './app-logo';\nimport StatusUpgrade from './status/upgrade-available';\nimport serverLogo from '../../assets/logo.svg';\nimport { useSubscription } from '../../libs/ws';\n\n// TODO: 当前state应该可以替换掉下面的 blockletState 和 launchState\nconst useWaiterState = blockletData => {\n const [waiterState, setWaiterState] = useState('');\n const blocklet = useRef(null);\n blocklet.current = blockletData;\n\n const createTargetHandler = handler => {\n return b => {\n if (b.meta.did === blocklet.current.meta.did) {\n handler(b);\n }\n };\n };\n\n useSubscription(\n BlockletEvents.added,\n createTargetHandler(() => setWaiterState('added'))\n );\n useSubscription(\n BlockletEvents.installed,\n createTargetHandler(() => setWaiterState('installed'))\n );\n\n useSubscription(\n BlockletEvents.statusChange,\n createTargetHandler(e => {\n switch (e.status) {\n case BlockletStatus.downloading:\n setWaiterState('downloading');\n break;\n case BlockletStatus.installing:\n setWaiterState('installing');\n break;\n default:\n }\n })\n );\n\n useSubscription(\n BlockletEvents.installFailed,\n createTargetHandler(() => {\n setWaiterState('installFailed');\n })\n );\n useSubscription(\n BlockletEvents.downloadFailed,\n createTargetHandler(() => {\n setWaiterState('downloadFailed');\n })\n );\n\n return waiterState;\n};\n\nfunction Install({ blocklet }) {\n const query = useQuery();\n const history = useHistory();\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('md'));\n const [skipSetup] = useLocalStorage('skip-blocklet-setup', false);\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const blockletRegistryUrl = new URL(blockletMetaUrl).origin;\n const waiterState = useWaiterState(blocklet);\n\n const { api, info, loading } = useNodeContext();\n const { t, locale } = useLocaleContext();\n const { session } = useSessionContext();\n\n const [openAuth, setOpenAuth] = useState(false);\n const [launching, setLaunching] = useState(false);\n const [blockletState, setBlockletState] = useState({ meta: null, loading: true, error: null });\n const [launchState, setLaunchState] = useState({\n exists: blocklet.isInstalled,\n status: 'launchBlocklet.installing',\n upgradeAvailable: null,\n blocklet: null,\n error: null,\n errorAction: blocklet.isInstalled ? 'view' : 'retry',\n });\n const [nextAccessUrl, setNextAccessUrl] = useState('');\n // 当前安装过程中的状态\n const fromUrl = new URL(window.location.href).searchParams.get('from');\n\n useEffect(() => {\n const onMount = async () => {\n if (!blocklet || !blocklet.meta) {\n return;\n }\n try {\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n setBlockletState(pre => ({ ...pre, loading: false }));\n if (!b) {\n return;\n }\n\n if (semver.gt(blocklet.meta.version, b.meta.version)) {\n const appDidEnv = b.environments.find(e => e.key === 'BLOCKLET_APP_ID');\n await handleLaunchState(b, {\n appDid: appDidEnv ? appDidEnv.value : '',\n did: b.meta.did,\n currentVersion: b.meta.version,\n version: blocklet.meta.version,\n });\n } else {\n await handleLaunchState(b);\n }\n } catch (err) {\n console.error('error fetch blocklet info', err);\n setBlockletState(pre => ({ ...pre, loading: false }));\n }\n };\n onMount();\n }, [blocklet]); // eslint-disable-line\n\n if (waiterState === 'installFailed' || waiterState === 'downloadFailed') {\n setLaunching(false);\n setLaunchState({ ...launchState, error: `launchBlocklet.error.${waiterState}` });\n }\n\n if (isEmpty(blocklet) || loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const name = getDisplayName(blocklet, true);\n let intervalId = null;\n\n const redirectToBlockletOverview = b => {\n const accessUrl = `/blocklets/${b.meta.did}/configuration`;\n let nextUrl = `/launch-blocklet/complete?status=installed&name=${encodeURIComponent(\n name\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`;\n\n const from = query.get('from');\n if (from) {\n nextUrl += `from=${from}`;\n }\n history.push(nextUrl);\n };\n\n const handleLaunchStart = async () => {\n const isAuthorized = session.user && (session.user.permissions || []).includes('mutate_blocklet');\n if (isAuthorized && blocklet.isFree) {\n setLaunching(true);\n setLaunchState({ ...launchState, error: '' });\n\n await api\n .installBlocklet({\n input: { url: blockletMetaUrl },\n })\n .catch(err => {\n Toast.error(err.message);\n console.error('install blocklet failed', err);\n });\n\n intervalId = poll();\n return;\n }\n\n setOpenAuth(true);\n };\n\n const visitOverview = b => {\n setLaunchState({ ...launchState, status: 'launchBlocklet.redirecting' });\n clearInterval(intervalId);\n setTimeout(() => {\n redirectToBlockletOverview(b);\n }, 1500);\n };\n\n const visitBlocklet = async b => {\n const urls = b.interfaces.map(x => x.url);\n const accessUrl = await getAccessibleUrl(urls);\n\n if (isEmpty(accessUrl) || skipSetup) {\n visitOverview(b);\n return;\n }\n\n setLaunchState({ ...launchState, status: 'launchBlocklet.redirecting' });\n clearInterval(intervalId);\n\n const url = new URL(accessUrl);\n // install blocklet 并跳转到 blocklet setup 界面时携带 serverUrl 查询参数\n url.searchParams.set('serverUrl', getLaunchURL(blocklet, info)?.serverUrl);\n\n if (b.status !== 'running') {\n url.searchParams.set('__start__', '1');\n }\n\n setNextAccessUrl(url.href);\n\n setTimeout(() => {\n window.location.href = url.href;\n }, 1500);\n };\n\n const handleInstalled = async b => {\n setTimeout(async () => {\n const result = await api.getBlocklet({ input: { did: b.meta.did } });\n if (result.blocklet.status === 'installed') {\n await handleLaunchState(result.blocklet);\n } else {\n intervalId = poll();\n }\n }, 1500);\n };\n\n const handleErrored = () => {\n setLaunching(false);\n setLaunchState(pre => ({\n ...pre,\n exists: true,\n error: 'launchBlocklet.error.installedButError',\n errorAction: 'view',\n }));\n };\n\n const handleUpgradeAvailable = (b, upgradeAvailable) => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, upgradeAvailable }));\n };\n\n const handleStopped = () => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, exists: true }));\n };\n\n const handleError = (error, errorAction) => setLaunchState({ ...launchState, error, errorAction });\n\n const handleBlockletExisted = (b, upgradeAvailable) => {\n if (upgradeAvailable) {\n handleUpgradeAvailable(b, upgradeAvailable);\n return;\n }\n\n if (['stopped', 'stopping'].includes(b.status)) {\n handleStopped(b);\n return;\n }\n\n if (['error', 'corrupted'].includes(b.status)) {\n handleErrored(b);\n return;\n }\n\n if (b.status === 'running') {\n visitBlocklet(b);\n return;\n }\n\n if (b.status === 'installed') {\n visitBlocklet(b);\n }\n };\n\n const handleLaunchState = async (b, upgradeAvailable) => {\n if (!b) {\n setLaunching(false);\n setLaunchState({ ...launchState, error: 'launchBlocklet.error.launchFailed' });\n return;\n }\n\n setLaunchState({ ...launchState, blocklet: b });\n handleBlockletExisted(b, upgradeAvailable);\n };\n\n const handleCancelUpgrade = b => {\n visitBlocklet(b);\n };\n\n const handleUpgrade = async (b, upgradeAvailable) => {\n try {\n const input = {\n did: b.meta.did,\n version: upgradeAvailable.version,\n registryUrl: blockletRegistryUrl,\n };\n\n setLaunching(true);\n setLaunchState({ ...launchState, status: 'common.upgrading' });\n await api.upgradeBlocklet({ input });\n } catch (error) {\n Toast.error(error.message);\n setLaunchState({ ...launchState, error: 'launchBlocklet.error.upgradeFailed' });\n }\n };\n\n const checkBlockletStatus = throttle(async () => {\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n\n if (!b) {\n clearInterval(intervalId);\n setLaunching(false);\n handleError('launchBlocklet.error.startFailed', 'retry');\n return;\n }\n\n const statusCode = BlockletStatus[b.status];\n\n if ([BlockletStatus.error, BlockletStatus.corrupted].includes(statusCode)) {\n setLaunching(false);\n clearInterval(intervalId);\n handleError('launchBlocklet.error.startFailed', 'view');\n }\n\n if (BlockletStatus.installed === statusCode) {\n clearInterval(intervalId);\n handleInstalled(b);\n }\n\n if ([BlockletStatus.stopped, BlockletStatus.running].includes(statusCode)) {\n handleLaunchState(b);\n }\n }, 2000);\n\n const poll = () => setInterval(checkBlockletStatus, 2000);\n\n const handleConnectSuccess = async (result, decrypt) => {\n localStorage.setItem('__sst', decrypt(result.sessionToken));\n await session.refresh();\n\n setLaunching(true);\n setOpenAuth(false);\n\n intervalId = poll();\n };\n\n const handleClose = () => setOpenAuth(false);\n\n if (blockletState.error) {\n return (\n <Alert variant=\"icon\" type=\"error\">\n {blockletState.error.message}\n </Alert>\n );\n }\n\n if (blockletState.loading) {\n return (\n <div style={{ marginTop: '100px', textAlign: 'center', width: '100%' }}>\n <Spinner />\n </div>\n );\n }\n\n let baseURL = '/';\n if (window.env && window.env.apiPrefix) {\n baseURL = window.env.apiPrefix;\n }\n\n const errorActions = {\n view: (\n <Button\n className=\"bottom-button\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n fullWidth={isBreakpointsDownSm}\n data-cy=\"view-blocklet\"\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n ),\n retry: (\n <Box display=\"flex\" flexDirection=\"column\">\n <Button\n className=\"bottom-button\"\n data-cy=\"retry-install\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.retry')}\n </Button>\n {fromUrl && (\n <Button\n style={{ marginTop: 24 }}\n variant=\"text\"\n className=\"bottom-button\"\n data-cy=\"go-back\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={() => {\n window.location.href = fromUrl;\n }}>\n {t('common.back')}\n </Button>\n )}\n </Box>\n ),\n };\n\n if (!launching && launchState.upgradeAvailable) {\n return (\n <Container>\n <StatusUpgrade\n onCancel={() => handleCancelUpgrade(launchState.blocklet)}\n onUpgrade={() => handleUpgrade(launchState.blocklet, launchState.upgradeAvailable)}\n />\n </Container>\n );\n }\n\n if (!launching && launchState.exists) {\n return (\n <Container>\n <ResultMessage\n variant=\"info\"\n title={name}\n subTitle={t('launchBlocklet.error.installedButStopped')}\n footer={errorActions.view}\n />\n </Container>\n );\n }\n\n if (launchState.error) {\n return (\n <Container>\n <ResultMessage\n variant=\"error\"\n title={name}\n subTitle={t(launchState.error, { appName: name, serverName: info.name })}\n footer={errorActions[launchState.errorAction]}\n />\n </Container>\n );\n }\n\n let waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">1/5</span>\n {t('launchBlocklet.waiting.verifying')}\n </MessageDiv>\n ),\n };\n\n switch (waiterState) {\n case 'downloading':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">2/5</span>\n {t('launchBlocklet.waiting.downloading')}\n </MessageDiv>\n ),\n };\n break;\n case 'installing':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">3/5</span>\n {t('launchBlocklet.waiting.extracting')}\n </MessageDiv>\n ),\n };\n break;\n case 'installed':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">4/5</span>\n {t('launchBlocklet.waiting.installing')}\n </MessageDiv>\n ),\n };\n break;\n default:\n }\n\n return (\n <Container>\n {!launchState.upgradeAvailable && (\n <div className=\"header\">\n <PageHeader\n className={`launch-page-header ${nextAccessUrl ? 'header-hide' : ''}`}\n title={launching ? t('launchBlocklet.start') : t('common.launch')}\n subTitle={launching ? '' : t('launchBlocklet.subTitle', { appName: name, serverName: info.name })}\n />\n </div>\n )}\n <div className=\"body\">\n {!launching && (\n <div className=\"illustrations\">\n <div className=\"ills-block ills-block-left\">\n <div className=\"ills-block-inner\">\n <AppLogo className=\"i-icon\" blocklet={blocklet} blockletMetaUrl={blockletMetaUrl} />\n <div className=\"i-name\">{name}</div>\n </div>\n </div>\n <ArrowForward className=\"arrow-icon\" />\n <div className=\"ills-block ills-block-right\">\n <div className=\"ills-block-inner\">\n <img width=\"64\" height=\"64\" src={serverLogo} alt=\"\" />\n <div className=\"i-name\">{info.name}</div>\n <DidAddress size={12} prepend={<Avatar did={info.did} size={12} style={{ marginRight: 4 }} />}>\n {info.did}\n </DidAddress>\n </div>\n </div>\n </div>\n )}\n {!launching && !launchState.exists && (\n <Button className=\"bottom-button\" data-cy=\"start-launch\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.next')}\n </Button>\n )}\n {launching && !nextAccessUrl && (\n <WaiterContainer>\n <AnimationWaiter {...waiterData} increaseSpeed={0.3} messageLoop={false} />\n </WaiterContainer>\n )}\n {launching && !!nextAccessUrl && (\n <ResultMessage\n variant={nextAccessUrl ? 'success' : 'loading'}\n title={nextAccessUrl ? name : ''}\n subTitle={\n nextAccessUrl\n ? t('launchBlocklet.installSuccess', { serverName: info.name })\n : t(launchState.status, { appName: name, serverName: info.name })\n }\n footer={\n nextAccessUrl ? (\n <LinkEle href={nextAccessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n <Spinner size={[16, 10]} style={{ marginRight: 14 }} /> {t('common.redirecting')}\n </LinkEle>\n ) : (\n ''\n )\n }\n style={{ marginBottom: 34 }}\n />\n )}\n </div>\n <Connect\n open={openAuth}\n popup\n className=\"connect\"\n action={`launch-${blocklet.isFree ? 'free' : 'paid'}-blocklet-by-${getServerAuthMethod(info)}`}\n checkFn={axios.create({ baseURL }).get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={getWebWalletUrl(info)}\n onSuccess={handleConnectSuccess}\n onClose={handleClose}\n locale={locale}\n messages={{\n title: `${t('launchBlocklet.dialog.title')}`,\n scan: blocklet.isFree\n ? t('launchBlocklet.dialog.freeDescription')\n : t('launchBlocklet.dialog.nonFreeDescription'),\n confirm: t('launchBlocklet.dialog.confirm'),\n success: t('launchBlocklet.dialog.success'),\n }}\n extraParams={{ blockletMetaUrl }}\n />\n </Container>\n );\n}\n\nInstall.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst LinkEle = styled.a`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst WaiterContainer = styled.div`\n color: #1dc1c7;\n`;\n\nconst Container = styled(ContentLayout)`\n .body {\n align-items: center;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n ${props => props.theme.breakpoints.down('md')} {\n margin: 25px 24px 0;\n }\n }\n\n .status-icon {\n width: 48px;\n height: 48px;\n }\n\n .status-title {\n margin-top: 16px;\n text-align: center;\n font-size: 24px;\n line-height: 28px;\n }\n\n .status-desc {\n text-align: center;\n margin-top: 16px;\n color: #999999;\n font-size: 16px;\n line-height: 28px;\n }\n .launch-page-header {\n transition: all ease 0.3s;\n &.header-hide {\n opacity: 0;\n }\n }\n .result-footer {\n overflow: visible;\n }\n`;\n\nconst MessageDiv = styled.div`\n .msg-before {\n display: inline-block;\n color: #aaa;\n font-size: 14px;\n margin-right: 6px;\n }\n`;\n\nexport default Install;\n","import React from 'react';\n\nexport default function AgreementApp({ ...props }) {\n return (\n <div {...props} style={{ width: '100%' }}>\n <h3>End User License Agreement for Application</h3>\n <p>Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28</p>\n <p>BLOCKLET SERVER LICENSE AGREEMENT</p>\n <p>暂无</p>\n </div>\n );\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useHistory, Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport ServerEula from '@blocklet/launcher-layout/lib/wizard/server-eula';\nimport WizardDesc from '@blocklet/launcher-layout/lib/wizard/wizard-desc';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport isEmpty from 'lodash/isEmpty';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport { useNodeContext } from '../../contexts/node';\nimport AgreementApp from './agreement-app';\nimport { getAccessibleUrl } from '../../libs/util';\nimport Button from './button';\n\n// TODO: 加载 Blocklet 定义的 Agreement\nexport default function Agreement({ blocklet }) {\n const history = useHistory();\n const [accessUrl, setAccessUrl] = useState(null);\n const [error, setError] = useState(null);\n const [accessUrlLoading, setAccessUrlLoading] = useState(false);\n const { t, locale } = useLocaleContext();\n const { info, api } = useNodeContext();\n const { isRunning } = blocklet;\n const loading = useMemo(() => isEmpty(blocklet) || accessUrlLoading, [blocklet, accessUrlLoading]);\n\n const clickNext = () => {\n history.push(`/launch-blocklet/install${window.location.search}`);\n };\n\n useEffect(() => {\n const onMount = async () => {\n try {\n setAccessUrlLoading(true);\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n const urls = b.interfaces.map(x => x.url);\n const accessUrlTmp = await getAccessibleUrl(urls);\n if (!accessUrlTmp && isEmpty(accessUrlTmp)) {\n setAccessUrl(null);\n return;\n }\n const url = new URL(accessUrlTmp);\n setAccessUrl(url.href);\n } catch (err) {\n setError(err.message);\n } finally {\n setAccessUrlLoading(false);\n }\n };\n if (isRunning) {\n onMount();\n }\n // eslint-disable-next-line\n }, [blocklet]);\n\n if (error) {\n return (\n <Center relative=\"parent\">\n <div>\n <Alert style={{ wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {error}\n </Alert>\n </div>\n </Center>\n );\n }\n\n if (loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const data = blocklet.meta;\n const blockletMeta = { data };\n\n if (!data) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (blocklet.isInstalled) {\n const already = accessUrl ? 'alreadyRunning' : 'alreadyInstalled';\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t(`launchBlocklet.${already}`, { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n <Button\n data-cy=\"view-blocklet\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n variant={accessUrl ? 'outlined' : 'contained'}\n color=\"primary\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n {accessUrl && (\n <Button className=\"last-button\" href={accessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if (!info) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n return (\n <Container>\n <PageHeader title={t('launchBlocklet.introduction')} subTitle={t('launchBlocklet.welcome')} />\n <div className=\"app-content\">\n <div className=\"agreement\">\n <div className=\"agreement-content\">\n <WizardDesc blockletMeta={blockletMeta} locale={locale} />\n </div>\n </div>\n </div>\n <div className=\"button-container\" data-cy=\"agree-all\">\n <ServerEula\n onContinue={clickNext}\n description={<AgreementApp />}\n texts={{\n listenName: t('launchBlocklet.license'),\n buttonNext: t('launchBlocklet.next'),\n }}\n />\n </div>\n </Container>\n );\n}\n\nAgreement.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 34px 24px 24px;\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ${props => props.theme.palette.grey['100']};\n border-radius: 12px;\n\n ${props => props.theme.breakpoints.up('md')} {\n margin-top: 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 0 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n ${props => props.theme.breakpoints.up('md')} {\n padding-right: 24px;\n margin-left: auto;\n }\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)}px;\n }\n`;\n","import React from 'react';\nimport { useRouteMatch, Switch, Route, Redirect } from 'react-router-dom';\nimport { useAsync } from 'react-use';\nimport joinUrl from 'url-join';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport styled from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Layout from '@blocklet/launcher-layout';\nimport { StepProvider } from '@blocklet/launcher-layout/lib/context/step';\nimport HeaderAddon from '@abtnode/ux/lib/layout/addon';\nimport LauncherLogoNotext from '@arcblock/icons/lib/LauncherLogoNotext';\nimport ServerLogoNotext from '@arcblock/icons/lib/ServerLogoNotext';\nimport ServerLogo from '@arcblock/icons/lib/ServerLogo';\nimport LauncherLogo from '@arcblock/icons/lib/LauncherLogo';\nimport NavLogo from '@abtnode/ux/lib/nav-logo';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nimport Center from '../../components/launch-blocklet/center';\nimport Complete from '../../components/launch-blocklet/step-complete';\nimport Install from '../../components/launch-blocklet/step-install';\nimport Agreement from '../../components/launch-blocklet/step-agreement';\nimport { getBlockletLogoUrl, getPathPrefix, getWebWalletUrl } from '../../libs/util';\nimport { SessionContext } from '../../contexts/session';\n\n// TODO: add skeleton here\nexport default function BlockletLauncher() {\n const isMobile = useMediaQuery(theme => theme.breakpoints.down('md'));\n const { path } = useRouteMatch();\n const { t, locale } = useLocaleContext();\n const query = useQuery();\n const { api, info } = useNodeContext();\n const fromLauncher = !!query.get('from_launcher');\n const webWalletUrl = getWebWalletUrl(info);\n\n let url = (query.get('blocklet_meta_url') || '').trim();\n url = decodeURIComponent(url);\n\n const state = useAsync(async () => {\n if (!url) {\n throw new Error(t('common.invalidParam'));\n }\n\n const { meta, isFree, isInstalled, isRunning } = await api.getBlockletMetaFromUrl({\n input: { url, checkPrice: true },\n });\n if (!meta) {\n throw new Error(t('launchBlocklet.error.loadMetaFailed'));\n }\n\n return { meta, isFree, isInstalled, isRunning };\n });\n\n if (state.error) {\n return (\n <Center>\n <div>\n <Alert style={{ width: '100%', wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {state.error.message}\n </Alert>\n </div>\n </Center>\n );\n }\n\n const { meta, isFree } = state.value || {};\n const basePath = joinUrl(getPathPrefix(), path);\n const steps = [\n {\n key: 'agreement',\n name: t('launchBlocklet.introduction'),\n path: joinUrl(basePath, 'agreement'),\n },\n {\n key: 'install',\n name: t('launchBlocklet.launch'),\n path: joinUrl(basePath, 'install'),\n },\n {\n key: 'setup',\n name: t('launchBlocklet.setup'),\n path: joinUrl(basePath, 'complete'),\n },\n ];\n\n let navLogo = (\n <LogoContainer>\n <NavLogo\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n />\n </LogoContainer>\n );\n\n // 从launcher 代表已经同意了 blocklet agreement\n if (fromLauncher) {\n steps.splice(0, 1);\n\n navLogo = (\n <LogoContainer>\n <NavLogo\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n previousData={{\n logo: !isMobile ? <LauncherLogo width=\"145\" height=\"48\" /> : <LauncherLogoNotext width=\"32\" height=\"32\" />,\n }}\n />\n </LogoContainer>\n );\n }\n\n if (meta) {\n meta.registryUrl = new URL(url).origin;\n }\n\n return (\n <StepProvider steps={steps}>\n <Layout\n locale={locale}\n blockletMeta={{ ...meta, isFree }}\n navLogo={navLogo}\n headerEndAddons={<HeaderAddon webWalletUrl={webWalletUrl} SessionContext={SessionContext} />}\n pcWidth=\"80%\"\n logoUrl={\n meta && meta.logo\n ? getBlockletLogoUrl({\n did: meta.did,\n baseUrl: meta.registryUrl,\n logoPath: meta.logo,\n })\n : null\n }>\n <Content>\n <Switch>\n <Redirect exact path={path} to={`${path}/agreement${window.location.search}`} />\n <Route exact path={`${path}/agreement`}>\n <Agreement blocklet={state.value || {}} loading={state.loading} />\n </Route>\n <Route exact path={`${path}/install`}>\n <Install blocklet={state.value || {}} />\n </Route>\n <Route exact path={`${path}/complete`}>\n <Complete blocklet={state.value || {}} />\n </Route>\n </Switch>\n </Content>\n </Layout>\n </StepProvider>\n );\n}\n\nconst Content = styled.div`\n padding-top: 34px;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n`;\n\nconst LogoContainer = styled.div`\n margin-top: -1px;\n`;\n"],"sourceRoot":""}
|