@abtnode/webapp 1.6.9 → 1.6.13
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 +56 -56
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +20 -20
- package/build/index.html +1 -1
- package/build/{precache-manifest.d77c71fa590027f941a9b90889c41ebc.js → precache-manifest.3f2f324f896d80671d77a0418c17d1c4.js} +18 -18
- package/build/service-worker.js +1 -1
- package/build/static/js/11.f9ceb4b3.chunk.js +2 -0
- package/build/static/js/11.f9ceb4b3.chunk.js.map +1 -0
- package/build/static/js/19.fc33fa61.chunk.js +2 -0
- package/build/static/js/19.fc33fa61.chunk.js.map +1 -0
- package/build/static/js/{22.cdd3d1a4.chunk.js → 22.0f55f82b.chunk.js} +2 -2
- package/build/static/js/22.0f55f82b.chunk.js.map +1 -0
- package/build/static/js/{23.4208ebea.chunk.js → 23.32485069.chunk.js} +2 -2
- package/build/static/js/23.32485069.chunk.js.map +1 -0
- package/build/static/js/{28.9b1197ca.chunk.js → 28.40163b1b.chunk.js} +2 -2
- package/build/static/js/28.40163b1b.chunk.js.map +1 -0
- package/build/static/js/8.27e60ccf.chunk.js +3 -0
- package/build/static/js/{8.8084d3ca.chunk.js.LICENSE.txt → 8.27e60ccf.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/8.27e60ccf.chunk.js.map +1 -0
- package/build/static/js/main.9098ab8e.chunk.js +2 -0
- package/build/static/js/main.9098ab8e.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.278e8ea4.js → runtime-main.a7211655.js} +2 -2
- package/build/static/js/{runtime-main.278e8ea4.js.map → runtime-main.a7211655.js.map} +1 -1
- package/package.json +1 -1
- package/build/static/js/11.ec811533.chunk.js +0 -2
- package/build/static/js/11.ec811533.chunk.js.map +0 -1
- package/build/static/js/19.b0298325.chunk.js +0 -2
- package/build/static/js/19.b0298325.chunk.js.map +0 -1
- package/build/static/js/22.cdd3d1a4.chunk.js.map +0 -1
- package/build/static/js/23.4208ebea.chunk.js.map +0 -1
- package/build/static/js/28.9b1197ca.chunk.js.map +0 -1
- package/build/static/js/8.8084d3ca.chunk.js +0 -3
- package/build/static/js/8.8084d3ca.chunk.js.map +0 -1
- package/build/static/js/main.ce53947b.chunk.js +0 -2
- package/build/static/js/main.ce53947b.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["hooks/blocklet-purchase.js","components/blocklet/purchase.js","components/blocklet/install.js","components/blocklet/stats.js","components/code.js","components/render-ast.js","pages/store/detail.js","../../../blocklet/meta/lib/util.js"],"names":["useBlockletPurchase","did","query","useQuery","history","useHistory","useLocalStorage","sessionId","setSessionId","useState","hasCompleted","setCompleted","session","setSession","doRedirect","URL","window","location","href","pathname","searchParams","prefix","env","apiPrefix","get","replace","hasPurchased","useSubscription","BlockletEvents","purchaseChange","e","includes","status","setTimeout","useEffect","id","useStyles","makeStyles","dialogAuth","padding","textAlign","marginBottom","iconRoot","minWidth","forwardRef","meta","mode","onCancel","useLocaleContext","t","locale","useNodeContext","info","gql","api","useSessionContext","classes","action","setAction","step","setStep","webWalletUrl","getWebWalletUrl","onSelect","act","a","onNext","payload","JSON","stringify","blockletDid","registryUrl","blockletRegistry","startSession","input","data","initial","cb","delete","set","callback","encodeURIComponent","nw","joinURL","nextWorkflow","url","nftFactory","onClose","options","title","description","popup","open","className","checkFn","checkTimeout","socketUrl","extraParams","sid","onSuccess","showDownload","messages","scan","confirm","success","disableBackdropClick","disableEscapeKeyDown","fullWidth","style","List","tabPanel","map","x","ListItem","button","key","selected","onClick","ListItemIcon","color","colors","primary","main","fontSize","ListItemText","secondary","rounded","disabled","variant","marginTop","Typography","component","message","getMessage","InstallOrUpgrade","lastVersion","buttonText","rest","enqueueSnackbar","useSnackbar","useBlockletContext","state","find","d","installed","useMemo","installedVersion","version","requirePurchase","isFreeBlocklet","loading","setLoading","showPurchaseDialog","setShowPurchaseDialog","loadingText","isInstalling","needUpgrade","gt","btnTxt","upgrade","purchase","install","showInstallBtn","onAction","preventDefault","stopPropagation","fn","formatError","autoHideDuration","console","error","InstallButton","size","Boolean","data-cy","marginRight","defaultProps","permission","hasPermission","push","configs","some","required","value","marginLeft","Stats","stats","useContext","LocaleContext","downloads","Div","name","star","styled","CodeBlock","propTypes","children","PropTypes","node","isRequired","components","pre","Array","isArray","props","code","language","split","pop","alert","Alert","p","h2","h3","h4","h5","h6","RehypeReact","createElement","Tag","BlockletStoreDetail","useParams","setLastVersion","currentRegistry","blockletRegistryList","useAsyncRetry","getBlockletMeta","onSubmit","blocklet","retry","content","priceList","formatFactoryPrice","keywords","htmlAst","screenshots","author","documentation","repository","community","support","lastPublishedAt","changeImgSrc","forEach","child","tagName","properties","src","startsWith","srcSet","item","length","titleInfo","join","type","keyword","Grid","container","spacing","xs","md","lazyLoad","showNav","showThumbnails","showPlayButton","showFullscreenButton","showBullets","items","original","formatRegistryScreenshotPath","thumbnail","PostContent","renderAst","formatPerson","parseRegistryUrl","target","formatToDatetime","formatTimeFromNow","Breadcrumbs","separator","aria-label","to","codeFont","div","theme","palette","text","breakpoints","values","sm","require","forEachBlocklet","parallel","sync","tasks","Promise","all","module","exports","payment","price","every","isDeletableBlocklet","config","environments","isAuthServiceEnabled","s","getRequiredMissingConfigs","missingConfigs","y","wipeSensitiveData","secure","configObj","environmentObj"],"mappings":"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","file":"static/js/23.32485069.chunk.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nimport { BlockletEvents } from '@blocklet/meta/lib/constants';\n\nimport useQuery from './query';\nimport { useSubscription } from '../libs/ws';\n\nexport default function useBlockletPurchase(did) {\n const query = useQuery();\n const history = useHistory();\n const [sessionId, setSessionId] = useLocalStorage(`sid:blocklet:purchase:${did}`);\n const [hasCompleted, setCompleted] = useState(false);\n const [session, setSession] = useState(null);\n\n const doRedirect = () => {\n const { pathname, searchParams } = new URL(window.location.href);\n const prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n if (searchParams.get('sid')) {\n setSessionId('');\n history.replace(pathname.replace(prefix, '/'));\n }\n };\n\n const hasPurchased = !!(query.get('assetDid') && sessionId && query.get('sid') === sessionId);\n\n useSubscription(BlockletEvents.purchaseChange, e => {\n if (e.did === did) {\n setSession(e.session);\n\n if (['declined', 'confirmed', 'error'].includes(e.session.status)) {\n setCompleted(true);\n setTimeout(doRedirect, 2000);\n }\n }\n });\n\n useEffect(() => {\n if (session && session.id !== sessionId) {\n setSessionId(session.id);\n }\n }, [session]); // eslint-disable-line\n\n return {\n hasCompleted,\n hasPurchased,\n session,\n setSession,\n doRedirect,\n };\n}\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { forwardRef, useState } from 'react';\nimport joinURL from 'url-join';\nimport PropTypes from 'prop-types';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Typography from '@material-ui/core/Typography';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\n\nimport IconPurchase from '@material-ui/icons/ShoppingCart';\nimport IconVerify from '@material-ui/icons/VerifiedUser';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport colors from '@arcblock/ux/lib/Colors';\n\nimport { useSessionContext } from '../../contexts/session';\nimport { useNodeContext } from '../../contexts/node';\nimport { getWebWalletUrl } from '../../libs/util';\nimport useBlockletPurchase from '../../hooks/blocklet-purchase';\n\nconst useStyles = makeStyles(() => ({\n dialogAuth: {\n padding: '0 0 24px !important',\n '& .auth-title': {\n textAlign: 'center !important',\n marginBottom: '4px !important',\n },\n '& .auth-tip--scan': {\n textAlign: 'center !important',\n },\n },\n iconRoot: {\n minWidth: 48,\n },\n}));\n\nfunction BlockletPurchase({ meta, mode, onCancel }) {\n const { t, locale } = useLocaleContext();\n const { info, api: gql } = useNodeContext();\n const { api } = useSessionContext();\n const classes = useStyles();\n const [action, setAction] = useState(mode !== 'both' ? mode : '');\n const [step, setStep] = useState(mode !== 'both' ? 2 : 1);\n const { session, setSession, hasCompleted, doRedirect } = useBlockletPurchase(meta.did);\n\n const webWalletUrl = getWebWalletUrl(info);\n const prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n\n const onSelect = async act => {\n if (act === action) {\n return;\n }\n\n setAction(act);\n };\n\n const onNext = async () => {\n if (!action) {\n return;\n }\n if (step === 2) {\n return;\n }\n\n // Start a new session and persist session id to local storage\n const payload = JSON.stringify({ blockletDid: meta.did, registryUrl: info.blockletRegistry, action });\n const { session: initial } = await gql.startSession({ input: { data: payload } });\n setSession(initial);\n\n setStep(2);\n\n if (action === 'purchase') {\n setTimeout(async () => {\n const cb = new URL(window.location.href);\n cb.searchParams.delete('assetDid');\n cb.searchParams.set('sid', initial.id);\n cb.searchParams.set('locale', locale);\n const callback = encodeURIComponent(cb.href);\n\n const nw = new URL(window.location.href);\n nw.pathname = joinURL(prefix, '/api/did/verify-purchase/token');\n nw.searchParams.set('sid', initial.id);\n nw.searchParams.set('locale', locale);\n nw.searchParams.set('autoConnect', 'false');\n const { data } = await api.get(nw.href);\n const nextWorkflow = encodeURIComponent(data.url);\n\n window.location.href = joinURL(\n info.blockletRegistry,\n `/store/purchase/${meta.nftFactory}?cb=${callback}&nw=${nextWorkflow}`\n );\n }, 100);\n }\n };\n\n const onClose = () => {\n doRedirect();\n onCancel();\n setStep(1);\n };\n\n const onVerifySuccess = () => {\n setTimeout(onCancel, 2000);\n };\n\n const options = [\n {\n action: 'purchase',\n title: t('store.purchase.purchase.title'),\n description: t('store.purchase.purchase.description'),\n },\n {\n action: 'verify',\n title: t('store.purchase.verify.title'),\n description: t('store.purchase.verify.description'),\n },\n ];\n\n const getMessage = () => {\n if (session) {\n if (session.status === 'confirmed') {\n return t('store.purchase.confirmed');\n }\n if (session.status === 'declined') {\n return t('store.purchase.declined');\n }\n if (session.status === 'error') {\n return session.message;\n }\n }\n\n return t('store.purchase.waiting');\n };\n\n if (step === 2 && action === 'verify' && session) {\n return (\n <DidConnect\n popup\n open\n className={classes.dialogAuth}\n action=\"verify-purchase\"\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n extraParams={{ locale, sid: session.id }}\n onSuccess={onVerifySuccess}\n onClose={onClose}\n showDownload={false}\n locale={locale}\n messages={{\n title: t('store.purchase.auth.title'),\n scan: t('store.purchase.auth.scan'),\n confirm: t('store.purchase.auth.confirm'),\n success: t('store.purchase.auth.success'),\n }}\n />\n );\n }\n\n return (\n <Dialog\n title={action && step === 2 ? t(`store.purchase.${action}.title`) : t('store.purchase.title')}\n disableBackdropClick\n disableEscapeKeyDown\n open\n fullWidth\n onClose={onClose}>\n {step === 1 && (\n <div style={{ marginBottom: 16 }}>\n <List className={classes.tabPanel}>\n {options.map(x => (\n <ListItem button key={x.action} selected={action === x.action} onClick={() => onSelect(x.action)}>\n <ListItemIcon className={classes.iconRoot}>\n {x.action === 'purchase' ? (\n <IconPurchase\n style={{ color: action === 'purchase' ? colors.primary.main : '#AAA', fontSize: 32 }}\n />\n ) : (\n <IconVerify style={{ color: action === 'verify' ? colors.primary.main : '#AAA', fontSize: 32 }} />\n )}\n </ListItemIcon>\n <ListItemText primary={x.title} secondary={x.description} />\n </ListItem>\n ))}\n </List>\n <Button\n rounded\n fullWidth\n disabled={!action}\n variant=\"contained\"\n color=\"primary\"\n style={{ marginTop: 16 }}\n onClick={onNext}>\n {t('common.next')}\n </Button>\n </div>\n )}\n {step === 2 && action === 'purchase' && (\n <div style={{ textAlign: 'center' }}>\n {!hasCompleted && <Spinner />}\n <Typography component=\"p\">{getMessage()}</Typography>\n </div>\n )}\n </Dialog>\n );\n}\n\nBlockletPurchase.propTypes = {\n meta: PropTypes.object.isRequired,\n mode: PropTypes.oneOf(['both', 'verify']).isRequired,\n onCancel: PropTypes.func.isRequired,\n};\n\nexport default forwardRef(BlockletPurchase);\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useHistory } from 'react-router-dom';\nimport { isFreeBlocklet } from '@blocklet/meta/lib/util';\nimport { useSnackbar } from 'notistack';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { gt } from 'semver';\n\nimport { useBlockletContext } from '../../contexts/blocklets';\nimport { isInstalling, formatError } from '../../libs/util';\nimport useBlockletPurchase from '../../hooks/blocklet-purchase';\nimport Permission from '../permission';\nimport PurchaseDialog from './purchase';\n\nexport default function InstallOrUpgrade({ meta, lastVersion, buttonText, registryUrl, ...rest }) {\n const { enqueueSnackbar } = useSnackbar();\n const { t } = useLocaleContext();\n const history = useHistory();\n\n const { api, data: installedBlocklets } = useBlockletContext();\n const state = installedBlocklets.find(d => d.meta.did === meta.did) || {};\n\n const installed = useMemo(() => !!state.status, [state.status]);\n const installedVersion = useMemo(() => (installed ? state.meta?.version : null), [installed, state.meta]);\n const requirePurchase = isFreeBlocklet(meta) === false;\n\n const [loading, setLoading] = useState(false);\n const { hasPurchased } = useBlockletPurchase(meta.did);\n const [showPurchaseDialog, setShowPurchaseDialog] = useState(false);\n\n const loadingText = useMemo(() => {\n if (loading) {\n if (installed) {\n return t('blocklet.status.upgrading');\n }\n if (requirePurchase) {\n return t('blocklet.status.purchasing');\n }\n return t('blocklet.status.waiting');\n }\n if (isInstalling(state.status)) return t(`common.${state.status}`);\n return '';\n }, [loading, state.status, installed, t, requirePurchase]);\n\n const needUpgrade = useMemo(() => {\n if (!lastVersion || !installedVersion) {\n return false;\n }\n\n if (lastVersion) {\n if (gt(lastVersion, installedVersion)) {\n return true;\n }\n }\n\n return false;\n }, [lastVersion, installedVersion]);\n\n const btnTxt = useMemo(() => {\n if (needUpgrade) return buttonText.upgrade;\n if (installed) return buttonText.open;\n if (requirePurchase) return buttonText.purchase;\n return buttonText.install;\n }, [installed, needUpgrade, requirePurchase, buttonText]);\n\n // only installed without upgrade show open button\n const showInstallBtn = useMemo(() => !(installed && !needUpgrade), [installed, needUpgrade]);\n\n const onAction = async e => {\n e.preventDefault();\n e.stopPropagation();\n\n try {\n setLoading(true);\n // The purchase dialog should only show on install\n if (!installed && requirePurchase) {\n setShowPurchaseDialog(true);\n return;\n }\n\n const fn = !installed ? 'installBlocklet' : 'upgradeBlocklet';\n await api[fn]({ input: { did: meta.did, registryUrl } });\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 5000, variant: 'error' });\n console.error('Blocklet installed failed', err);\n } finally {\n setLoading(false);\n }\n };\n\n const InstallButton = ({ disabled }) => (\n <Button\n key={meta.did}\n onClick={onAction}\n size=\"small\"\n disabled={Boolean(loadingText || disabled)}\n variant=\"contained\"\n color=\"primary\"\n data-cy=\"install-blocklet\"\n rounded\n {...rest}>\n {loadingText ? (\n <>\n <Spinner size={[16, 10]} style={{ marginRight: 3 }} />\n {loadingText}\n </>\n ) : (\n btnTxt\n )}\n </Button>\n );\n\n InstallButton.propTypes = {\n disabled: PropTypes.bool,\n };\n\n InstallButton.defaultProps = {\n disabled: false,\n };\n\n const getTab = d => {\n if (d) {\n return (d.configs || []).some(x => x.required && !x.value) ? 'configuration' : 'overview';\n }\n\n return 'overview';\n };\n\n const onGoDetail = e => {\n e.preventDefault();\n e.stopPropagation();\n history.push(`/blocklets/${meta.did}/${getTab(state)}`);\n };\n\n const onCancelPurchase = () => {\n setLoading(false);\n setShowPurchaseDialog(false);\n };\n\n return (\n <>\n <div>\n {showInstallBtn ? (\n <Permission permission=\"mutate_blocklet\">\n {hasPermission => <InstallButton disabled={!hasPermission} />}\n </Permission>\n ) : (\n <Button\n rounded\n className=\"action-button\"\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n disabled={Boolean(loadingText)}\n data-cy=\"open-blocklet\"\n onClick={onGoDetail}>\n {loadingText ? (\n <>\n <Spinner size={[16, 10]} style={{ marginRight: 3 }} />\n {loadingText}\n </>\n ) : (\n btnTxt\n )}\n </Button>\n )}\n\n {installed && requirePurchase && (\n <Typography component=\"small\" style={{ fontSize: 12, color: '#666', marginLeft: 4 }}>\n {t('blocklet.status.purchased')}\n </Typography>\n )}\n </div>\n {((hasPurchased && !installed) || showPurchaseDialog) && (\n <PurchaseDialog meta={meta} mode={hasPurchased ? 'purchase' : 'both'} onCancel={onCancelPurchase} />\n )}\n </>\n );\n}\n\nInstallOrUpgrade.propTypes = {\n meta: PropTypes.object.isRequired,\n lastVersion: PropTypes.string,\n buttonText: PropTypes.shape({\n purchase: PropTypes.string.isRequired,\n open: PropTypes.string.isRequired,\n install: PropTypes.string.isRequired,\n upgrade: PropTypes.string.isRequired,\n }).isRequired,\n registryUrl: PropTypes.string.isRequired,\n};\n\nInstallOrUpgrade.defaultProps = {\n lastVersion: '',\n};\n","import React, { useContext } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport Typography from '@material-ui/core/Typography';\nimport Icon from '@arcblock/ux/lib/Icon';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function Stats({ stats, ...rest }) {\n const { t } = useContext(LocaleContext);\n stats.downloads = stats.downloads || 0;\n return (\n <Div component=\"p\" {...rest}>\n {\n <span className=\"blocklet__stat\" title={t('blocklet.list.download')}>\n <Icon name=\"arrow-to-bottom\" size={14} className=\"blocklet__stat__icon\" />\n {stats.downloads}\n </span>\n }\n {/* star 暂未开放 */}\n {!!stats.star && (\n <span className=\"blocklet__stat\" title={t('blocklet.list.star')}>\n <Icon name=\"heart\" size={14} className=\"blocklet__stat__icon\" />\n {stats.star}\n </span>\n )}\n </Div>\n );\n}\n\nStats.propTypes = {\n stats: PropTypes.object.isRequired,\n};\n\nconst Div = styled(Typography)`\n .blocklet__stat {\n margin-right: 16px;\n font-size: 14px;\n font-weight: 500;\n color: #999;\n &:last-child {\n // 理论上需要设置成0,但视觉效果不是很好,加上了一个小的间距\n margin-right: 5px;\n }\n\n .blocklet__stat__icon {\n margin-right: 4px;\n color: inherit !important;\n }\n }\n`;\n","/* eslint-disable react/prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport CodeBlock from '@arcblock/ux/lib/CodeBlock';\n\nexport default function CodeBlockWrapper({ children }) {\n if (!Array.isArray(get(children, '[0].props.children'))) {\n return null;\n }\n\n const {\n className,\n children: [code],\n } = children[0].props;\n const language = (className || '').split('-').pop();\n\n if (!code) {\n return null;\n }\n\n return <CodeBlock language={language || 'shell'} code={code} />;\n}\n\nCodeBlock.propTypes = {\n children: PropTypes.node.isRequired,\n};\n","/* eslint-disable operator-linebreak */\nimport React from 'react';\nimport RehypeReact from 'rehype-react';\n\nimport Typography from '@material-ui/core/Typography';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport CodeBlock from './code';\n\nconst components = {\n pre: CodeBlock,\n alert: Alert,\n p: props => <Typography variant=\"body1\" {...props} />,\n h2: props => <Typography variant=\"h3\" {...props} />,\n h3: props => <Typography variant=\"h4\" {...props} />,\n h4: props => <Typography variant=\"h5\" {...props} />,\n h5: props => <Typography variant=\"h5\" {...props} />,\n h6: props => <Typography variant=\"h6\" {...props} />,\n};\n\nfunction createElement(component, props, children) {\n const Tag =\n (components && component && components[component]) || // Get component from map if present\n component || // Otherwise just the string\n 'div'; // Default to div\n\n // And return the formed component\n return <Tag {...props}>{children}</Tag>;\n}\n\nexport default new RehypeReact({ createElement }).Compiler;\n","/* eslint-disable operator-linebreak */\n/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/jsx-no-target-blank */\nimport React, { useMemo, useState } from 'react';\nimport styled from 'styled-components';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { useParams, Link } from 'react-router-dom';\nimport joinURL from 'url-join';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\nimport Grid from '@material-ui/core/Grid';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport ImageGallery from 'react-image-gallery';\n\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { isFreeBlocklet } from '@blocklet/meta/lib/util';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport 'github-markdown-css/github-markdown.css';\nimport 'react-image-gallery/styles/css/image-gallery.css';\n\nimport Stats from '../../components/blocklet/stats';\nimport renderAst from '../../components/render-ast';\nimport InstallOrUpgrade from '../../components/blocklet/install';\n\nimport { useNodeContext } from '../../contexts/node';\nimport {\n formatError,\n formatFactoryPrice,\n formatPerson,\n formatRegistryScreenshotPath,\n formatTimeFromNow,\n formatToDatetime,\n parseRegistryUrl,\n} from '../../libs/util';\n\nconst changeImgSrc = (children, blockletRegistry) => {\n children.forEach(child => {\n if (\n child.tagName &&\n child.tagName === 'img' &&\n child.properties &&\n child.properties.src &&\n !child.properties.src.startsWith('http')\n ) {\n child.properties.src = joinURL(blockletRegistry, `/${child.properties.src}`);\n if (child.properties.srcSet && Array.isArray(child.properties.srcSet)) {\n child.properties.srcSet = child.properties.srcSet.map(item => {\n if (!item.startsWith('http')) {\n return joinURL(blockletRegistry, item);\n }\n return item;\n });\n }\n }\n if (child.children && Array.isArray(child.children) && child.children.length > 0) {\n changeImgSrc(child.children, blockletRegistry);\n }\n });\n};\n\nexport default function BlockletStoreDetail() {\n const { did } = useParams();\n const { api, info } = useNodeContext();\n const { t } = useLocaleContext();\n const [lastVersion, setLastVersion] = useState([]);\n\n const currentRegistry = info.blockletRegistryList.find(x => x.selected);\n\n const state = useAsyncRetry(async () => {\n const { meta } = await api.getBlockletMeta({ input: { did, registryUrl: info.blockletRegistry } });\n\n setLastVersion(meta.version);\n\n return meta;\n });\n\n const onSubmit = async ({ action, version, blocklet }) => {\n try {\n const fn = action === 'install' ? 'installBlocklet' : 'upgradeBlocklet';\n await api[fn]({ input: { did: blocklet.did, version } });\n state.retry();\n } catch (err) {\n console.error(`Blocklet ${action} failed`, err);\n }\n };\n\n let content = null;\n const priceList = useMemo(() => formatFactoryPrice(state.value), [state.value]);\n if (state.value) {\n const {\n name,\n version,\n keywords,\n htmlAst,\n stats,\n screenshots = [],\n author,\n documentation,\n repository,\n community,\n support,\n title,\n lastPublishedAt,\n color = 'primary',\n } = state.value;\n\n if (htmlAst && htmlAst.children && Array.isArray(htmlAst.children)) {\n changeImgSrc(htmlAst.children, info.blockletRegistry);\n }\n\n const titleInfo = title || name;\n content = (\n <Div color={color}>\n <div className=\"meta\">\n <Typography component=\"h2\" variant=\"h2\" className=\"title\">\n {titleInfo}\n <span className=\"payment\">\n <span className=\"payment__price\">\n {isFreeBlocklet(state.value)\n ? t('common.free')\n : priceList.map(item => `${item.value} ${item.name}`).join(' + ')}\n </span>\n <span className=\"payment__tip\">\n {isFreeBlocklet(state.value) ? 'This blocklet is free to use' : 'You need to pay to use this blocklet'}\n </span>\n </span>\n </Typography>\n <Stats stats={stats} className=\"blocklet__stats\" />\n <Typography component=\"p\" className=\"tags\">\n <Tag className=\"tag\" type=\"reverse\">\n v{version}\n </Tag>\n {Array.isArray(keywords) &&\n keywords.length > 0 &&\n keywords.map(keyword => (\n <Tag className=\"tag\" key={keyword}>\n {keyword}\n </Tag>\n ))}\n </Typography>\n </div>\n <div className=\"markdown-body\">\n <Grid container spacing={4}>\n {screenshots.length > 0 ? (\n <Grid item xs={12} md={8}>\n <ImageGallery\n lazyLoad\n showNav={false}\n showThumbnails\n showPlayButton={false}\n showFullscreenButton={false}\n showBullets\n items={screenshots.map(x => ({\n original: joinURL(info.blockletRegistry, formatRegistryScreenshotPath(did, x)),\n thumbnail: joinURL(info.blockletRegistry, formatRegistryScreenshotPath(did, x)),\n }))}\n />\n </Grid>\n ) : (\n <Grid item xs={12} md={8}>\n <PostContent component=\"div\" className=\"content-wrapper post-content\">\n {renderAst(htmlAst)}\n </PostContent>\n </Grid>\n )}\n <Grid item xs={12} md={4}>\n <InstallOrUpgrade\n meta={state.value}\n lastVersion={lastVersion}\n onSubmit={onSubmit}\n className=\"action-button\"\n buttonText={{\n purchase: t('store.detail.purchase', { name: titleInfo }),\n open: t('store.detail.open', { name: titleInfo }),\n install: t('store.detail.install', { name: titleInfo }),\n upgrade: t('store.detail.upgrade', { name: titleInfo }),\n }}\n registryUrl={currentRegistry.url}\n />\n <Typography component=\"ul\" className=\"meta-info\">\n {!!author && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.author')}</span>\n <span className=\"info-row__value\">{formatPerson(author)}</span>\n </li>\n )}\n {!!repository && !!repository.url && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.repository')}</span>\n <a\n href={parseRegistryUrl(repository.url)}\n target=\"_blank\"\n className=\"info-row__value\"\n title={repository.type}>\n {parseRegistryUrl(repository.url)}\n </a>\n </li>\n )}\n {!!community && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.community')}</span>\n <a href={community} target=\"_blank\" className=\"info-row__value\">\n {community}\n </a>\n </li>\n )}\n {!!documentation && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.documentation')}</span>\n <a href={documentation} target=\"_blank\" className=\"info-row__value\">\n {documentation}\n </a>\n </li>\n )}\n {!!support && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.support')}</span>\n <a href={`mailto:${support}`} target=\"_blank\" className=\"info-row__value\">\n {support}\n </a>\n </li>\n )}\n {lastPublishedAt && (\n <li className=\"meta-info__row\">\n <span className=\"info-row__key\">{t('common.lastPublishedAt')}</span>\n <span className=\"info-row__value\" title={formatToDatetime(lastPublishedAt)}>\n {formatTimeFromNow(lastPublishedAt)}\n </span>\n </li>\n )}\n </Typography>\n </Grid>\n </Grid>\n {screenshots.length > 0 && (\n <PostContent component=\"div\" className=\"content-wrapper post-content\">\n {renderAst(htmlAst)}\n </PostContent>\n )}\n </div>\n </Div>\n );\n } else if (state.error) {\n content = (\n <Alert type=\"error\" variant=\"icon\">\n {formatError(state.error)}\n </Alert>\n );\n } else {\n content = <Spinner />;\n }\n\n return (\n <main>\n <Breadcrumbs separator=\"›\" aria-label=\"breadcrumb\" className=\"page-breadcrumb\">\n <Link color=\"secondary\" to=\"/store\">\n <Typography color=\"secondary\">{t('common.store')}</Typography>\n </Link>\n <Typography color=\"textPrimary\">{currentRegistry.name}</Typography>\n <Typography color=\"textPrimary\">{t('common.detail')}</Typography>\n </Breadcrumbs>\n {content}\n </main>\n );\n}\n\nconst codeFont = 'source-code-pro, Menlo, Monaco, Consolas, Courier New, monospace !important';\nconst Div = styled.div`\n margin: 24px 0;\n\n .title {\n font-size: 40px;\n font-weight: bold;\n color: ${props => props.theme.palette.text.primary};\n margin-bottom: 10px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n }\n }\n\n .payment {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n margin-top: 16px;\n align-items: flex-start;\n }\n\n .payment__price {\n margin-bottom: 8px;\n color: ${props => props.theme.palette.primary.main};\n }\n\n .payment__tip {\n font-size: 14px;\n color: ${props => props.theme.palette.text.primary};\n font-weight: normal;\n }\n }\n\n .blocklet__stats {\n margin-bottom: 16px;\n }\n\n .tags {\n margin: 16px 0 48px;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n margin-bottom: 32px;\n }\n\n .tag {\n margin-right: 8px;\n text-transform: capitalize;\n &:last-of-type {\n margin-right: 0;\n }\n }\n }\n\n .action-button {\n width: 100%;\n padding: 8px 22px;\n border-radius: 0 !important;\n }\n\n .meta-info {\n list-style: none;\n padding: 0;\n margin: 24px 0;\n\n .meta-info__row {\n display: flex;\n line-height: 2;\n }\n\n .info-row__key {\n width: 130px;\n flex-shrink: 0;\n font-weight: 500;\n }\n .info-row__value {\n white-space: break-word;\n word-break: break-all;\n }\n }\n\n .sidebar-buttons {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .use-button {\n width: 100%;\n }\n\n .image-gallery {\n .image-gallery-thumbnail.active {\n border-color: ${props => props.theme.palette.primary.main};\n }\n .image-gallery-bullets .image-gallery-bullet {\n border-color: ${props => props.theme.palette.primary.main};\n box-shadow: none;\n }\n .image-gallery-bullets .image-gallery-bullet.active {\n background-color: ${props => props.theme.palette.primary.main};\n }\n .image-gallery-slide {\n .image-gallery-image {\n display: flex;\n justify-content: center;\n img {\n max-height: 600px !important;\n width: auto;\n margin: 0 auto;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n height: auto;\n max-height: auto;\n }\n }\n }\n }\n }\n\n .markdown-body .highlight pre,\n .markdown-body pre {\n background-color: #222;\n border-radius: 5px;\n }\n .markdown-body code {\n font-family: ${codeFont};\n }\n .markdown-body pre code {\n color: #fff;\n font-size: 14px;\n font-family: ${codeFont};\n }\n\n .markdown-body h1,\n .markdown-body h2,\n .markdown-body h3,\n .markdown-body h4,\n .markdown-body h5,\n .markdown-body h6 {\n font-weight: 600;\n line-height: 1.25;\n margin-bottom: 16px;\n margin-top: 24px;\n border-bottom: none;\n }\n\n .markdown-body .CodeMirror pre {\n background: #f6f8fa !important;\n }\n\n .markdown-body .anchor {\n display: none;\n }\n`;\n\nconst PostContent = styled(Typography)`\n width: 100%;\n word-wrap: break-word;\n word-break: break-word;\n line-height: 1.5em;\n\n .alert-content {\n max-width: 100%;\n p:last-of-type {\n margin-bottom: 0;\n }\n }\n\n iframe {\n width: 100% !important;\n }\n\n a {\n color: ${props => props.theme.palette.primary.main};\n }\n`;\n","/* eslint-disable no-await-in-loop */\nconst get = require('lodash/get');\n\nconst forEachBlocklet = (blocklet, cb, { parallel = false, sync } = {}) => {\n // sync\n if (sync) {\n cb(blocklet);\n if (blocklet.children) {\n for (const child of blocklet.children) {\n cb(child);\n }\n }\n return null;\n }\n\n // serial\n if (!parallel) {\n return (async () => {\n await cb(blocklet);\n if (blocklet.children) {\n for (const child of blocklet.children) {\n await cb(child);\n }\n }\n return null;\n })();\n }\n\n // parallel\n const tasks = [];\n tasks.push(cb(blocklet));\n if (blocklet.children) {\n for (const child of blocklet.children) {\n tasks.push(cb(child));\n }\n }\n return Promise.all(tasks);\n};\n\nconst isAuthServiceEnabled = (blocklet) => {\n const interfaces = get(blocklet, 'meta.interfaces') || [];\n const isRootEnabled = interfaces.some((x) => {\n const services = get(x, 'services') || [];\n return services.some((s) => s.name === '@abtnode/auth-service');\n });\n\n if (isRootEnabled) {\n return true;\n }\n\n const children = get(blocklet, 'children') || [];\n for (const child of children) {\n if (isAuthServiceEnabled(child)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst getRequiredMissingConfigs = (blocklet) => {\n const missingConfigs = [];\n const configs = blocklet.configs || [];\n configs.forEach((item) => {\n if (item.required && !item.value) {\n missingConfigs.push({ did: blocklet.meta.did, key: item.key });\n }\n });\n\n // eslint-disable-next-line no-restricted-syntax\n for (const child of blocklet.children || []) {\n const childConfigs = child.configs || [];\n // configProp does not exist in root blocklet config\n // or value of configProp in root blocklet config is empty.\n childConfigs.forEach((x) => {\n if (x.required && !x.value && !configs.some((y) => y.key === x.key && y.value)) {\n missingConfigs.push({ did: child.meta.did, key: x.key });\n }\n });\n }\n\n return missingConfigs;\n};\n\nconst isFreeBlocklet = (meta) => {\n if (!meta.payment) {\n return true;\n }\n\n const priceList = (meta.payment.price || []).map((x) => x.value || 0);\n return priceList.every((x) => x === 0);\n};\n\nconst wipeSensitiveData = (blocklet) => {\n if (!blocklet) {\n return blocklet;\n }\n\n forEachBlocklet(\n blocklet,\n (d) => {\n (d.configs || []).forEach((x) => {\n if (x.secure) {\n x.value = x.value ? '__encrypted__' : '';\n }\n });\n (d.environments || []).forEach((x) => {\n if (['BLOCKLET_APP_SK'].includes(x.key)) {\n x.value = '__encrypted__';\n }\n });\n\n delete blocklet.configObj;\n delete blocklet.environmentObj;\n },\n { sync: true }\n );\n\n return blocklet;\n};\n\nconst isDeletableBlocklet = (blocklet) => {\n if (!blocklet) {\n return false;\n }\n\n const config = blocklet.environments.find((x) => x.key === 'BLOCKLET_DELETABLE');\n if (!config) {\n return true;\n }\n\n return config.value === 'yes';\n};\n\nmodule.exports = {\n isFreeBlocklet,\n isDeletableBlocklet,\n forEachBlocklet,\n isAuthServiceEnabled,\n getRequiredMissingConfigs,\n wipeSensitiveData,\n};\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(this["webpackJsonp@abtnode/webapp"]=this["webpackJsonp@abtnode/webapp"]||[]).push([[28],{1536:function(e,n,t){"use strict";t.r(n),t.d(n,"default",(function(){return nn}));var a,r=t(32),c=t(11),l=t.n(c),o=t(19),i=t(0),s=t.n(i),u=t(30),m=t(1249),p=t(5),d=t.n(p),f=t(105),b=t.n(f),h=t(14),v=t(339),g=t.n(v),k=t(22),x=t(1509),E=t(50),j=t.n(E),O=t(493),w=t.n(O),y=t(29),N=t(357),B=t(63),_=t(960),C=t.n(_),U=t(117),F=["children"];function L(e){var n=e.children,t=Object(U.a)(e,F);return s.a.createElement(S,t,n)}var S=h.default.div(a||(a=Object(r.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .header {\n text-align: center;\n }\n\n .body {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 30px;\n width: 100%;\n min-height: 200px;\n\n "," {\n padding: 24px;\n }\n\n "," {\n flex: 1;\n padding: 0 16px 16px;\n }\n }\n\n .footer {\n display: flex;\n justify-content: center;\n\n "," {\n padding-bottom: 34px;\n }\n\n "," {\n margin-top: auto;\n padding-bottom: 10px;\n }\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.up("sm")}),(function(e){return e.theme.breakpoints.down("sm")})),A=t(102),M=t.n(A),R=["children"];function D(e){var n=e.children,t=Object(U.a)(e,R);return s.a.createElement(M.a,Object.assign({rounded:!0,variant:"contained",color:"primary"},t),n)}var T,z=s.a.forwardRef((function(e,n){return s.a.createElement(D,Object.assign({},e,{forwardedRef:n}))}));var I=Object(h.default)(L)(T||(T=Object(r.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 margin-top: 70px;\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("sm")}),(function(e){return"error"===e.variant?e.theme.palette.error.main:e.theme.palette.success.main})),P=function(e){var n=e.blockletMeta,t=Object(k.useLocaleContext)().t,a=Object(y.c)().info,r=Object(N.a)(),c=decodeURIComponent(r.get("accessUrl")||"");return s.a.createElement(I,null,s.a.createElement(B.a,{component:"h5",variant:"h5"},t("launchBlocklet.complete")),s.a.createElement("div",{className:"body"},s.a.createElement(C.a,{className:"circle_icon"}),s.a.createElement(B.a,{className:"app-info_desc",component:"span"},t("launchBlocklet.installSuccess",{appName:n?n.title:"",serverName:a.name}))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{href:c,className:"bottom-button"},t("common.open"))))},q=t(57),W=t(13),K=t(59),V=t(275),J=t.n(V),G=t(990),H=t.n(G),Q=t(324),X=t(1074),Y=t.n(X),Z=t(148),$=t.n(Z),ee=t(1513),ne=t.n(ee),te=t(955),ae=t(40),re=t(879),ce=t(64),le=t(23),oe=t(95),ie=t(271),se=t.n(ie);function ue(e){var n=e.blockletMeta,t=e.blockletMetaUrl;return s.a.createElement(se.a,{src:Object(ce.q)({did:n.did,logoPath:n.logo,baseUrl:new URL(t).origin}),width:64,size:"contain",placeholder:"application logo"})}var me,pe,de=t(1514),fe=t.n(de);function be(e){var n=e.onCancel,t=e.onUpgrade,a=Object(k.useLocaleContext)().t;return s.a.createElement(s.a.Fragment,null,s.a.createElement(he,{className:"body"},s.a.createElement("div",{className:"upgrade-wrapper"},s.a.createElement(fe.a,{className:"upgrade-wrapper_icon"})),s.a.createElement("div",{className:"status_title"},a("launchBlocklet.newVersion")),s.a.createElement("div",{className:"status_desc"},a("launchBlocklet.newVersionDesc"))),s.a.createElement(ve,{className:"footer"},s.a.createElement(z,{onClick:n,variant:"outlined"},a("launchBlocklet.later")),s.a.createElement(z,{className:"upgrade-button",onClick:t},a("launchBlocklet.upgradeNow"))))}be.defaultProps={onCancel:function(){},onUpgrade:function(){}};var he=Object(h.default)(L)(me||(me=Object(r.a)(["\n .upgrade-wrapper {\n background-color: #4f6af6;\n border-radius: 50%;\n padding: 5px;\n width: 48px;\n height: 48px;\n\n .upgrade-wrapper_icon {\n color: white;\n width: 100%;\n height: 100%;\n }\n }\n"]))),ve=h.default.div(pe||(pe=Object(r.a)(["\n .upgrade-button {\n margin-left: 24px;\n }\n"]))),ge=t(991),ke=t.n(ge);function xe(e){var n=e.did,t=Object(k.useLocaleContext)().t,a=Object(h.useTheme)(),r=Object(Q.a)(a.breakpoints.down("sm"));return s.a.createElement(s.a.Fragment,null,s.a.createElement("div",{className:"body"},s.a.createElement(ke.a,{className:"status_icon"}),s.a.createElement("div",{className:"status_title"},t("launchBlocklet.error.installedButStopped"))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{style:{width:"300px"},className:"footer-item",component:K.Link,to:"/blocklets/".concat(n,"/overview"),fullWidth:r,rounded:!0,color:"primary",variant:"contained"},t("launchBlocklet.viewApplication"))))}var Ee,je=t(1040),Oe=t.n(je),we=t(1515),ye=t.n(we);function Ne(e){var n=e.message,t=e.actions,a=Object(k.useLocaleContext)().t;return s.a.createElement(s.a.Fragment,null,s.a.createElement(Ce,{className:"body"},s.a.createElement(ye.a,{className:"status_icon status_error"}),s.a.createElement("div",{className:"status_title status_error"},Oe()(a("common.failed"))),s.a.createElement("div",{className:"status_desc"},n)),t&&s.a.createElement("div",{className:"footer"},t))}var Be,_e,Ce=h.default.div(Ee||(Ee=Object(r.a)(["\n .status_error {\n color: #f16e6e;\n }\n"]))),Ue="abtnode_launch_blocklet_key",Fe=function(){return localStorage.getItem(Ue)};var Le,Se=h.default.div(Be||(Be=Object(r.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n color: #4f6af6;\n\n .spinner {\n color: inherit !important;\n }\n\n .text {\n font-size: 20px;\n margin-top: 24px;\n }\n"]))),Ae=Object(h.default)(L)(_e||(_e=Object(r.a)(["\n .body {\n margin-bottom: 50px;\n justify-content: center;\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-bottom: 80px;\n width: 100%;\n }\n\n .ills_block {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n .i_icon {\n width: 64px;\n height: 64px;\n }\n\n .i_name {\n margin-top: 32px;\n font-weight: 500;\n font-size: 18px;\n color: #222222;\n }\n\n .i_sub_name {\n color: #999999;\n }\n }\n\n "," {\n .ills_block {\n flex: 1;\n flex-shrink: 0;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #d3e7fe;\n margin: 25px 40px 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"])),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.down("sm")})),Me=function(e){var n=e.blockletMeta,t=Object(y.c)(),a=t.api,r=t.info,c=Object(k.useLocaleContext)(),m=c.t,p=c.locale,d=Object(i.useState)(!1),f=Object(W.a)(d,2),b=f[0],v=f[1],x=Object(i.useState)(!1),E=Object(W.a)(x,2),O=E[0],w=E[1],_=Object(i.useState)({existed:!1,status:m("launchBlocklet.installing"),upgradeAvailable:null,blocklet:null,error:null}),C=Object(W.a)(_,2),U=C[0],F=C[1],L=Object(h.useTheme)(),S=Object(Q.a)(L.breakpoints.down("sm")),A=Object(u.k)(),M=Object(i.useState)({meta:null,loading:!0,error:null}),R=Object(W.a)(M,2),D=R[0],T=R[1],I=Object(N.a)().get("blocklet_meta_url"),P=new URL(I).origin,V=null;Object(i.useEffect)((function(){return function(){V&&V.isConnected()&&V.disconnect()}}),[V]);var G=function(e){var n="/blocklets/".concat(e.meta.did,"/configuration");A.push("/launch-blocklet/complete?status=installed&name=".concat(encodeURIComponent(e.meta.title),"&accessUrl=").concat(encodeURIComponent(n),"&blocklet_meta_url=").concat(I))},X=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:F(Object(q.a)(Object(q.a)({},U),{},{status:m("blocklet.status.installed")})),Object(te.getRequiredMissingConfigs)(n).length>0&&setTimeout((function(){G(n)}),1500);case 2:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),Z=function(){var e=Object(o.a)(l.a.mark((function e(n){var t,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=n.interfaces.find((function(e){return new URL(e.url).hostname.endsWith(r.didDomain)})),a="",t&&(a=t.url),F(Object(q.a)(Object(q.a)({},U),{},{status:"".concat(m("blocklet.status.running"),", ").concat(m("common.redirecting"))})),setTimeout((function(){A.push("/launch-blocklet/complete?name=".concat(encodeURIComponent(Object(ce.r)(n.meta)),"&accessUrl=").concat(encodeURIComponent(a),"&blocklet_meta_url=").concat(I))}),1500);case 5:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ee=function(){var e=Object(o.a)(l.a.mark((function e(n){var t,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=Object(oe.a)(Fe()),e.next=3,t.getBlocklet({input:{did:n.meta.did}});case 3:return a=e.sent,e.next=6,de(a.blocklet);case 6:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ie=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return w((function(e){return Object(q.a)(Object(q.a)({},e),{},{error:new Error(m("launchBlocklet.error.startFailed"))})})),e.next=3,X(n);case 3:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),se=function(e){return function(){F(Object(q.a)(Object(q.a)({},U),{},{error:new Error(e)}))}},me=function(e){return function(t){t.meta.did===n.did&&e(t)}},pe=function(e,n){if(!n)return["stopped","stopping"].includes(e.status)?(w(!1),void F((function(e){return Object(q.a)(Object(q.a)({},e),{},{existed:!0})}))):["error","corrupted"].includes(e.status)?(w(!1),void F((function(e){return Object(q.a)(Object(q.a)({},e),{},{existed:!0,error:new Error(m("launchBlocklet.error.installedButError"))})}))):void("running"!==e.status?"installed"===e.status&&X(e):Z(e));!function(e,n){w(!1),F((function(e){return Object(q.a)(Object(q.a)({},e),{},{upgradeAvailable:n})}))}(0,n)},de=function(){var e=Object(o.a)(l.a.mark((function e(n,t){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n){e.next=4;break}return w(!1),F(Object(q.a)(Object(q.a)({},U),{},{error:new Error(m("launchBlocklet.error.launchFailed"))})),e.abrupt("return");case 4:F(Object(q.a)(Object(q.a)({},U),{},{blocklet:n})),pe(n,t);case 6:case"end":return e.stop()}}),e)})));return function(n,t){return e.apply(this,arguments)}}(),fe=function(){var e=Object(o.a)(l.a.mark((function e(n,t){var r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r={did:n.meta.did,version:t.version,registryUrl:P},w(!0),F(Object(q.a)(Object(q.a)({},U),{},{status:m("common.upgrading")})),e.next=6,a.upgradeBlocklet({input:r});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(0),F(Object(q.a)(Object(q.a)({},U),{},{error:new Error(m("launchBlocklet.error.upgradeFailed"))}));case 11:case"end":return e.stop()}}),e,null,[[0,8]])})));return function(n,t){return e.apply(this,arguments)}}(),he=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(V=Object(le.a)(n)).connect(),V.on(ae.BlockletEvents.installed,me(ee)),V.on(ae.BlockletEvents.started,me(ee)),V.on(ae.BlockletEvents.startFailed,me(ie)),V.on(ae.BlockletEvents.downloadFailed,me(se(m("launchBlocklet.error.downloadFailed")))),V.on(ae.BlockletEvents.installFailed,me(se(m("launchBlocklet.error.installFailed"))));case 7:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ve=function(){var e=Object(o.a)(l.a.mark((function e(t){var a,r,c,o;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.sessionToken,r=t.upgradeAvailable,l=a,localStorage.setItem(Ue,l),e.next=4,he(a);case 4:return w(!0),v(!1),c=Object(oe.a)(a),e.next=9,c.getBlocklet({input:{did:n.did}});case 9:return o=e.sent,e.next=12,de(o.blocklet,r);case 12:case"end":return e.stop()}var l}),e)})));return function(n){return e.apply(this,arguments)}}();if(Object(i.useEffect)((function(){(function(){var e=Object(o.a)(l.a.mark((function e(){var t,a,r,c,o;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(t=Fe())){e.next=27;break}return e.prev=3,a=Object(oe.a)(t),e.next=7,a.getBlocklet({input:{did:n.did}});case 7:if(r=e.sent,c=r.blocklet,he(t),!c){e.next=20;break}if(w(!0),!H.a.gt(n.version,c.meta.version)){e.next=18;break}return o=c.environments.find((function(e){return"BLOCKLET_APP_ID"===e.key})),e.next=16,de(c,{appDid:o?o.value:"",did:c.meta.did,currentVersion:c.meta.version,version:n.version});case 16:e.next=20;break;case 18:return e.next=20,de(c);case 20:return T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1})})),e.abrupt("return");case 24:e.prev=24,e.t0=e.catch(3),localStorage.removeItem(Ue);case 27:T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1})})),e.next=34;break;case 30:e.prev=30,e.t1=e.catch(0),console.error(e.t1),T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1,error:new Error(m("launchBlocklet.error.loadMetaFailed"))})}));case 34:case"end":return e.stop()}}),e,null,[[0,30],[3,24]])})));return function(){return e.apply(this,arguments)}})()()}),[]),D.error)return s.a.createElement(g.a,{variant:"icon",type:"error"},D.error.message);if(D.loading)return s.a.createElement("div",{style:{marginTop:"100px",textAlign:"center",width:"100%"}},s.a.createElement(j.a,null));var ge="/";window.env&&window.env.apiPrefix&&(ge=window.env.apiPrefix);var ke=n.did,Ee=n.isFree;return!O&&U.upgradeAvailable?s.a.createElement(Ae,null,s.a.createElement(be,{onCancel:function(){var e;"running"!==(e=U.blocklet).status?G(e):Z(e)},onUpgrade:function(){return fe(U.blocklet,U.upgradeAvailable)}})):!O&&U.existed?s.a.createElement(Ae,null,s.a.createElement(xe,{did:n.did})):U.error?s.a.createElement(Ae,null,s.a.createElement(Ne,{message:U.error.message,actions:s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.retry"))})):s.a.createElement(Ae,null,!U.upgradeAvailable&&s.a.createElement("div",{className:"header"},s.a.createElement(B.a,{component:"h5",variant:"h5"},m(O?"launchBlocklet.start":"common.launch")),s.a.createElement(B.a,{color:"textSecondary"},m(O?"launchBlocklet.installingSubTitle":"launchBlocklet.subTitle",{appName:n.title,serverName:r.name}))),s.a.createElement("div",{className:"body"},!O&&!U.error&&s.a.createElement("div",{className:"illustrations"},s.a.createElement("div",{className:"ills_block"},s.a.createElement(ue,{className:"i_icon",blockletMeta:n,blockletMetaUrl:I}),s.a.createElement("div",{className:"i_name"},n.title)),s.a.createElement(Y.a,{className:"arrow-icon"}),s.a.createElement("div",{className:"ills_block"},s.a.createElement(ne.a,{className:"i_icon",color:"#BFBFBF"}),s.a.createElement("div",{className:"i_name"},r.name))),!O&&!U.existed&&s.a.createElement(re.a,{smDown:!0},s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.install"))),O&&!U.error&&s.a.createElement(Se,null,s.a.createElement(j.a,{className:"spinner"}),s.a.createElement("div",{className:"text"},U.status))),s.a.createElement("div",{className:"footer"},!O&&U.existed&&s.a.createElement(z,{className:"footer-item bottom-button",component:K.Link,to:"/blocklets/".concat(ke,"/overview"),fullWidth:S,rounded:!0,color:"primary",variant:"contained"},m("launchBlocklet.viewApplication")),!O&&!U.existed&&s.a.createElement(re.a,{mdUp:!0},s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.install")))),s.a.createElement($.a,{open:b,popup:!0,className:"connect",action:Ee?"launch-free-blocklet":"launch-paid-blocklet",checkFn:J.a.create({baseURL:ge}).get,checkTimeout:6e5,socketUrl:a.socketUrl,webWalletUrl:Object(ce.x)(r),onSuccess:ve,onClose:function(){return v(!1)},locale:p,messages:{title:"".concat(m("launchBlocklet.authDialog.title")),scan:m(Ee?"launchBlocklet.authDialog.freeDescription":"launchBlocklet.authDialog.nonFreeDescription"),confirm:m("launchBlocklet.authDialog.confirm"),success:m("launchBlocklet.authDialog.success")},extraParams:{blockletMetaUrl:I}}))},Re=t(374),De=t(973),Te=t.n(De),ze=t(389);function Ie(e){var n=Object.assign({},e);return s.a.createElement("div",Object.assign({},n,{style:{width:"100%"}}),s.a.createElement("h3",null,"End User License Agreement for Application"),s.a.createElement("p",null,"Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28"),s.a.createElement("p",null,"BLOCKLET SERVER LICENSE AGREEMENT"),s.a.createElement("p",null,"\u6682\u65e0"))}function Pe(){var e,n=Object(u.k)(),t=Object(i.useState)("application"),a=Object(W.a)(t,2),r=a[0],c=a[1],l=Object(k.useLocaleContext)().t,o=new Map([["application",{label:l("launchBlocklet.appLicenseName"),value:"application",component:Ie}],["abtnode",{label:l("launchBlocklet.abtnodeLicenseName"),value:"abtnode",component:ze.a}]]),m=[],p=Object(Re.a)(o.values());try{for(p.s();!(e=p.n()).done;){var d=e.value;m.push({label:d.label,value:d.value})}}catch(b){p.e(b)}finally{p.f()}var f=o.get(r).component;return s.a.createElement(Ke,null,s.a.createElement(B.a,{component:"h5",variant:"h5"},l("launchBlocklet.agreement")),s.a.createElement("div",{className:"body"},s.a.createElement(Te.a,{tabs:m,current:r,onChange:c}),s.a.createElement("div",{className:"agreement"},s.a.createElement("div",{className:"agreement_content"},s.a.createElement(f,{style:{width:"100%"}})))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{className:"bottom-button",onClick:function(){n.push("/launch-blocklet/install".concat(window.location.search))}},l("launchBlocklet.agreeAll"))))}var qe,We,Ke=Object(h.default)(L)(Le||(Le=Object(r.a)(["\n .body {\n justify-content: center;\n }\n .agreement {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 300px;\n border: 1px solid #f0f0f0;\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 overflow-y: auto;\n\n "," {\n padding: 0 24px;\n }\n\n "," {\n padding: 0 16px;\n }\n }\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")})),Ve=h.default.div(qe||(qe=Object(r.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"]))),Je=t(532),Ge=t.n(Je),He=t(938),Qe=t.n(He);var Xe,Ye=Object(h.default)(L)(We||(We=Object(r.a)(["\n .app-desc {\n text-align: center;\n margin-top: 40px;\n\n .app-desc_name {\n font-weight: 500;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .app-desc_author {\n margin-top: 8px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n }\n }\n\n .price {\n margin-top: 40px;\n color: #222222;\n text-align: center;\n\n .price-value {\n font-size: 36px;\n line-height: 42px;\n }\n\n .price-symbol {\n margin-left: 8px;\n font-size: 18px;\n line-height: 21px;\n }\n }\n"]))),Ze=function(e){var n=e.blockletMeta,t=Object(i.useState)(!1),a=Object(W.a)(t,2),r=a[0],c=a[1],l=Object(u.k)(),o=Object(N.a)(),m=Object(y.c)().info,p=Object(k.useLocaleContext)().t,d=o.get("blocklet_meta_url"),f=new URL(d).origin,h=function(){l.push("/launch-blocklet/agreement".concat(window.location.search))},v=[];return n.isFree||(v=Object(ce.h)(n)),s.a.createElement(Ye,null,s.a.createElement("div",{className:"header"},s.a.createElement(B.a,{component:"h5",variant:"h5"},p("launchBlocklet.purchaseApp")),s.a.createElement(B.a,{color:"textSecondary",style:{marginTop:"8px"}},p("launchBlocklet.appInfoDesc"))),s.a.createElement("div",{className:"body"},s.a.createElement(ue,{blockletMetaUrl:d,blockletMeta:n}),s.a.createElement("div",{className:"app-desc"},s.a.createElement("div",{className:"app-desc_name"},n.title),s.a.createElement("div",{className:"app-desc_author"},p("launchBlocklet.author",{author:Ge()(n,"author.name")}))),!n.isFree&&s.a.createElement("div",{className:"price"},v.map((function(e,n){return s.a.createElement(s.a.Fragment,{key:e.name},s.a.createElement("div",{style:{display:"flex",alignItems:"center"}},s.a.createElement("span",{className:"price-value"},e.value),s.a.createElement("span",{className:"price-symbol"},e.name)),n<v.length-1&&s.a.createElement(Qe.a,{style:{margin:"11px auto"},fontSize:"18px"}))})))),s.a.createElement("div",{className:"footer"},n.isFree&&s.a.createElement(M.a,{style:{marginTop:"80px"},className:"bottom-button",rounded:!0,color:"primary",variant:"contained",onClick:h},p("launchBlocklet.nextStep")),!n.isFree&&s.a.createElement("div",{style:{marginTop:"80px"}},s.a.createElement(M.a,{variant:"outlined",rounded:!0,color:"primary",onClick:function(){return h()}},p("launchBlocklet.purchased")),s.a.createElement(M.a,{style:{marginLeft:"20px"},rounded:!0,color:"primary",variant:"contained",onClick:function(){c(!0)}},p("launchBlocklet.purchase")))),s.a.createElement($.a,{open:r,popup:!0,baseUrl:f,action:"acquire-asset",checkFn:J.a.create({baseURL:b()(f,"/store")}).get,onSuccess:function(){c(!1),h()},onClose:function(){c(!1)},checkTimeout:3e5,extraParams:{factory:n.nftFactory},webWalletUrl:Object(ce.x)(m),disableClose:!0,showDownload:!1,messages:{title:"\u8d2d\u4e70 ".concat(n.title),scan:"\u4f7f\u7528 DID \u94b1\u5305\u626b\u7801",confirm:"\u5728\u60a8\u7684 DID \u94b1\u5305\u4e0a\u786e\u8ba4",success:"\u6210\u529f"}}))};function $e(){var e=Object(u.n)().path,n=Object(k.useLocaleContext)(),t=n.t,a=n.locale,r=Object(N.a)(),c=Object(y.c)().api,i=(r.get("blocklet_meta_url")||"").trim();i=decodeURIComponent(i);var p=Object(m.a)(Object(o.a)(l.a.mark((function e(){var n,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i){e.next=2;break}throw new Error(t("common.invalidParam"));case 2:return e.next=4,c.getBlockletMetaFromUrl({input:{url:i,checkPrice:!0}});case 4:if(n=e.sent,a=n.meta){e.next=8;break}throw new Error(t("launchBlocklet.error.loadMetaFailed"));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)}))));if(p.loading)return s.a.createElement(Ve,null,s.a.createElement(j.a,null));if(p.error)return s.a.createElement(Ve,null,s.a.createElement("div",null,s.a.createElement(g.a,{style:{width:"100%",wordBreak:"break-all"},variant:"icon",type:"error"},p.error.message)));var d=p.value,f=d.isFree?"".concat(e,"/agreement"):"".concat(e,"/purchase-app");f="".concat(f).concat(window.location.search);var h=b()(Object(ce.w)(),e),v=[{key:"app-info",name:t("launchBlocklet.purchaseApp"),path:b()(h,"purchase-app"),optional:!0},{key:"agreement",name:t("launchBlocklet.agreement"),path:b()(h,"agreement")},{key:"install",name:t("launchBlocklet.launch"),path:b()(h,"install")},{key:"complete",name:t("launchBlocklet.complete"),path:b()(h,"complete")}];return d.registryUrl=new URL(i).origin,s.a.createElement(x.StepProvider,{steps:v},s.a.createElement(x.Layout,{locale:a,blockletMeta:d,headerEndAddons:s.a.createElement(s.a.Fragment,null,s.a.createElement(w.a,{size:26,showText:!1,className:"locale-addon"})),logoUrl:Object(ce.q)({did:d.did,baseUrl:d.registryUrl,logoPath:d.logo})},s.a.createElement(en,null,s.a.createElement(u.g,null,s.a.createElement(u.c,{exact:!0,path:e,to:f}),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/purchase-app")},s.a.createElement(Ze,{blockletMeta:d})),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/agreement")},s.a.createElement(Pe,null)),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/install")},s.a.createElement(Me,{blockletMeta:d})),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/complete")},s.a.createElement(P,{blockletMeta:d}))))))}d.a.object.isRequired;var en=h.default.div(Xe||(Xe=Object(r.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 width: 300px;\n }\n"])));function nn(){return s.a.createElement($e,null)}},955:function(e,n,t){var a=t(11),r=t(262),c=t(966),l=t(532),o=function(e,n){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=t.parallel,o=void 0!==l&&l,i=t.sync;if(i){if(n(e),e.children){var s,u=c(e.children);try{for(u.s();!(s=u.n()).done;){var m=s.value;n(m)}}catch(h){u.e(h)}finally{u.f()}}return null}if(!o)return r(a.mark((function t(){var r,l,o;return a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n(e);case 2:if(!e.children){t.next=20;break}r=c(e.children),t.prev=4,r.s();case 6:if((l=r.n()).done){t.next=12;break}return o=l.value,t.next=10,n(o);case 10:t.next=6;break;case 12:t.next=17;break;case 14:t.prev=14,t.t0=t.catch(4),r.e(t.t0);case 17:return t.prev=17,r.f(),t.finish(17);case 20:return t.abrupt("return",null);case 21:case"end":return t.stop()}}),t,null,[[4,14,17,20]])})))();var p=[];if(p.push(n(e)),e.children){var d,f=c(e.children);try{for(f.s();!(d=f.n()).done;){var b=d.value;p.push(n(b))}}catch(h){f.e(h)}finally{f.f()}}return Promise.all(p)};e.exports={isFreeBlocklet:function(e){return!e.payment||(e.payment.price||[]).map((function(e){return e.value||0})).every((function(e){return 0===e}))},forEachBlocklet:o,isAuthServiceEnabled:function e(n){if((l(n,"meta.interfaces")||[]).some((function(e){return(l(e,"services")||[]).some((function(e){return"@abtnode/auth-service"===e.name}))})))return!0;var t,a=l(n,"children")||[],r=c(a);try{for(r.s();!(t=r.n()).done;){if(e(t.value))return!0}}catch(o){r.e(o)}finally{r.f()}return!1},getRequiredMissingConfigs:function(e){var n=[],t=e.configs||[];t.forEach((function(t){t.required&&!t.value&&n.push({did:e.meta.did,key:t.key})}));var a,r=c(e.children||[]);try{var l=function(){var e=a.value;(e.configs||[]).forEach((function(a){!a.required||a.value||t.some((function(e){return e.key===a.key&&e.value}))||n.push({did:e.meta.did,key:a.key})}))};for(r.s();!(a=r.n()).done;)l()}catch(o){r.e(o)}finally{r.f()}return n},wipeSensitiveData:function(e){return e?(o(e,(function(n){(n.configs||[]).forEach((function(e){e.secure&&(e.value=e.value?"__encrypted__":"")})),(n.environments||[]).forEach((function(e){["BLOCKLET_APP_SK"].includes(e.key)&&(e.value="__encrypted__")})),delete e.configObj,delete e.environmentObj}),{sync:!0}),e):e}}}}]);
|
|
2
|
-
//# sourceMappingURL=28.
|
|
1
|
+
(this["webpackJsonp@abtnode/webapp"]=this["webpackJsonp@abtnode/webapp"]||[]).push([[28],{1536:function(e,n,t){"use strict";t.r(n),t.d(n,"default",(function(){return nn}));var a,r=t(32),c=t(11),l=t.n(c),o=t(19),i=t(0),s=t.n(i),u=t(30),m=t(1249),d=t(5),p=t.n(d),f=t(105),b=t.n(f),h=t(14),v=t(339),g=t.n(v),k=t(22),x=t(1509),E=t(50),j=t.n(E),O=t(493),w=t.n(O),y=t(29),B=t(357),N=t(63),_=t(960),C=t.n(_),U=t(117),L=["children"];function F(e){var n=e.children,t=Object(U.a)(e,L);return s.a.createElement(S,t,n)}var S=h.default.div(a||(a=Object(r.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .header {\n text-align: center;\n }\n\n .body {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 30px;\n width: 100%;\n min-height: 200px;\n\n "," {\n padding: 24px;\n }\n\n "," {\n flex: 1;\n padding: 0 16px 16px;\n }\n }\n\n .footer {\n display: flex;\n justify-content: center;\n\n "," {\n padding-bottom: 34px;\n }\n\n "," {\n margin-top: auto;\n padding-bottom: 10px;\n }\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.up("sm")}),(function(e){return e.theme.breakpoints.down("sm")})),A=t(102),D=t.n(A),M=["children"];function R(e){var n=e.children,t=Object(U.a)(e,M);return s.a.createElement(D.a,Object.assign({rounded:!0,variant:"contained",color:"primary"},t),n)}var T,z=s.a.forwardRef((function(e,n){return s.a.createElement(R,Object.assign({},e,{forwardedRef:n}))}));var I=Object(h.default)(F)(T||(T=Object(r.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 margin-top: 70px;\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("sm")}),(function(e){return"error"===e.variant?e.theme.palette.error.main:e.theme.palette.success.main})),P=function(e){var n=e.blockletMeta,t=Object(k.useLocaleContext)().t,a=Object(y.c)().info,r=Object(B.a)(),c=decodeURIComponent(r.get("accessUrl")||"");return s.a.createElement(I,null,s.a.createElement(N.a,{component:"h5",variant:"h5"},t("launchBlocklet.complete")),s.a.createElement("div",{className:"body"},s.a.createElement(C.a,{className:"circle_icon"}),s.a.createElement(N.a,{className:"app-info_desc",component:"span"},t("launchBlocklet.installSuccess",{appName:n?n.title:"",serverName:a.name}))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{href:c,className:"bottom-button"},t("common.open"))))},q=t(57),W=t(13),K=t(59),V=t(275),J=t.n(V),G=t(990),H=t.n(G),Q=t(324),X=t(1074),Y=t.n(X),Z=t(148),$=t.n(Z),ee=t(1513),ne=t.n(ee),te=t(955),ae=t(40),re=t(879),ce=t(64),le=t(23),oe=t(95),ie=t(271),se=t.n(ie);function ue(e){var n=e.blockletMeta,t=e.blockletMetaUrl;return s.a.createElement(se.a,{src:Object(ce.q)({did:n.did,logoPath:n.logo,baseUrl:new URL(t).origin}),width:64,size:"contain",placeholder:"application logo"})}var me,de,pe=t(1514),fe=t.n(pe);function be(e){var n=e.onCancel,t=e.onUpgrade,a=Object(k.useLocaleContext)().t;return s.a.createElement(s.a.Fragment,null,s.a.createElement(he,{className:"body"},s.a.createElement("div",{className:"upgrade-wrapper"},s.a.createElement(fe.a,{className:"upgrade-wrapper_icon"})),s.a.createElement("div",{className:"status_title"},a("launchBlocklet.newVersion")),s.a.createElement("div",{className:"status_desc"},a("launchBlocklet.newVersionDesc"))),s.a.createElement(ve,{className:"footer"},s.a.createElement(z,{onClick:n,variant:"outlined"},a("launchBlocklet.later")),s.a.createElement(z,{className:"upgrade-button",onClick:t},a("launchBlocklet.upgradeNow"))))}be.defaultProps={onCancel:function(){},onUpgrade:function(){}};var he=Object(h.default)(F)(me||(me=Object(r.a)(["\n .upgrade-wrapper {\n background-color: #4f6af6;\n border-radius: 50%;\n padding: 5px;\n width: 48px;\n height: 48px;\n\n .upgrade-wrapper_icon {\n color: white;\n width: 100%;\n height: 100%;\n }\n }\n"]))),ve=h.default.div(de||(de=Object(r.a)(["\n .upgrade-button {\n margin-left: 24px;\n }\n"]))),ge=t(991),ke=t.n(ge);function xe(e){var n=e.did,t=Object(k.useLocaleContext)().t,a=Object(h.useTheme)(),r=Object(Q.a)(a.breakpoints.down("sm"));return s.a.createElement(s.a.Fragment,null,s.a.createElement("div",{className:"body"},s.a.createElement(ke.a,{className:"status_icon"}),s.a.createElement("div",{className:"status_title"},t("launchBlocklet.error.installedButStopped"))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{style:{width:"300px"},className:"footer-item",component:K.Link,to:"/blocklets/".concat(n,"/overview"),fullWidth:r,rounded:!0,color:"primary",variant:"contained"},t("launchBlocklet.viewApplication"))))}var Ee,je=t(1040),Oe=t.n(je),we=t(1515),ye=t.n(we);function Be(e){var n=e.message,t=e.actions,a=Object(k.useLocaleContext)().t;return s.a.createElement(s.a.Fragment,null,s.a.createElement(Ce,{className:"body"},s.a.createElement(ye.a,{className:"status_icon status_error"}),s.a.createElement("div",{className:"status_title status_error"},Oe()(a("common.failed"))),s.a.createElement("div",{className:"status_desc"},n)),t&&s.a.createElement("div",{className:"footer"},t))}var Ne,_e,Ce=h.default.div(Ee||(Ee=Object(r.a)(["\n .status_error {\n color: #f16e6e;\n }\n"]))),Ue="abtnode_launch_blocklet_key",Le=function(){return localStorage.getItem(Ue)};var Fe,Se=h.default.div(Ne||(Ne=Object(r.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n color: #4f6af6;\n\n .spinner {\n color: inherit !important;\n }\n\n .text {\n font-size: 20px;\n margin-top: 24px;\n }\n"]))),Ae=Object(h.default)(F)(_e||(_e=Object(r.a)(["\n .body {\n margin-bottom: 50px;\n justify-content: center;\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-bottom: 80px;\n width: 100%;\n }\n\n .ills_block {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n .i_icon {\n width: 64px;\n height: 64px;\n }\n\n .i_name {\n margin-top: 32px;\n font-weight: 500;\n font-size: 18px;\n color: #222222;\n }\n\n .i_sub_name {\n color: #999999;\n }\n }\n\n "," {\n .ills_block {\n flex: 1;\n flex-shrink: 0;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #d3e7fe;\n margin: 25px 40px 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"])),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.down("sm")})),De=function(e){var n=e.blockletMeta,t=Object(y.c)(),a=t.api,r=t.info,c=Object(k.useLocaleContext)(),m=c.t,d=c.locale,p=Object(i.useState)(!1),f=Object(W.a)(p,2),b=f[0],v=f[1],x=Object(i.useState)(!1),E=Object(W.a)(x,2),O=E[0],w=E[1],_=Object(i.useState)({existed:!1,status:m("launchBlocklet.installing"),upgradeAvailable:null,blocklet:null,error:null}),C=Object(W.a)(_,2),U=C[0],L=C[1],F=Object(h.useTheme)(),S=Object(Q.a)(F.breakpoints.down("sm")),A=Object(u.k)(),D=Object(i.useState)({meta:null,loading:!0,error:null}),M=Object(W.a)(D,2),R=M[0],T=M[1],I=Object(B.a)().get("blocklet_meta_url"),P=new URL(I).origin,V=null;Object(i.useEffect)((function(){return function(){V&&V.isConnected()&&V.disconnect()}}),[V]);var G=function(e){var n="/blocklets/".concat(e.meta.did,"/configuration");A.push("/launch-blocklet/complete?status=installed&name=".concat(encodeURIComponent(e.meta.title),"&accessUrl=").concat(encodeURIComponent(n),"&blocklet_meta_url=").concat(I))},X=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:L(Object(q.a)(Object(q.a)({},U),{},{status:m("blocklet.status.installed")})),Object(te.getRequiredMissingConfigs)(n).length>0&&setTimeout((function(){G(n)}),1500);case 2:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),Z=function(){var e=Object(o.a)(l.a.mark((function e(n){var t,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=n.interfaces.find((function(e){return new URL(e.url).hostname.endsWith(r.didDomain)})),a="",t&&(a=t.url),L(Object(q.a)(Object(q.a)({},U),{},{status:"".concat(m("blocklet.status.running"),", ").concat(m("common.redirecting"))})),setTimeout((function(){A.push("/launch-blocklet/complete?name=".concat(encodeURIComponent(Object(ce.r)(n.meta)),"&accessUrl=").concat(encodeURIComponent(a),"&blocklet_meta_url=").concat(I))}),1500);case 5:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ee=function(){var e=Object(o.a)(l.a.mark((function e(n){var t,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=Object(oe.a)(Le()),e.next=3,t.getBlocklet({input:{did:n.meta.did}});case 3:return a=e.sent,e.next=6,pe(a.blocklet);case 6:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ie=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return w((function(e){return Object(q.a)(Object(q.a)({},e),{},{error:new Error(m("launchBlocklet.error.startFailed"))})})),e.next=3,X(n);case 3:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),se=function(e){return function(){L(Object(q.a)(Object(q.a)({},U),{},{error:new Error(e)}))}},me=function(e){return function(t){t.meta.did===n.did&&e(t)}},de=function(e,n){if(!n)return["stopped","stopping"].includes(e.status)?(w(!1),void L((function(e){return Object(q.a)(Object(q.a)({},e),{},{existed:!0})}))):["error","corrupted"].includes(e.status)?(w(!1),void L((function(e){return Object(q.a)(Object(q.a)({},e),{},{existed:!0,error:new Error(m("launchBlocklet.error.installedButError"))})}))):void("running"!==e.status?"installed"===e.status&&X(e):Z(e));!function(e,n){w(!1),L((function(e){return Object(q.a)(Object(q.a)({},e),{},{upgradeAvailable:n})}))}(0,n)},pe=function(){var e=Object(o.a)(l.a.mark((function e(n,t){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n){e.next=4;break}return w(!1),L(Object(q.a)(Object(q.a)({},U),{},{error:new Error(m("launchBlocklet.error.launchFailed"))})),e.abrupt("return");case 4:L(Object(q.a)(Object(q.a)({},U),{},{blocklet:n})),de(n,t);case 6:case"end":return e.stop()}}),e)})));return function(n,t){return e.apply(this,arguments)}}(),fe=function(){var e=Object(o.a)(l.a.mark((function e(n,t){var r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r={did:n.meta.did,version:t.version,registryUrl:P},w(!0),L(Object(q.a)(Object(q.a)({},U),{},{status:m("common.upgrading")})),e.next=6,a.upgradeBlocklet({input:r});case 6:e.next=11;break;case 8:e.prev=8,e.t0=e.catch(0),L(Object(q.a)(Object(q.a)({},U),{},{error:new Error(m("launchBlocklet.error.upgradeFailed"))}));case 11:case"end":return e.stop()}}),e,null,[[0,8]])})));return function(n,t){return e.apply(this,arguments)}}(),he=function(){var e=Object(o.a)(l.a.mark((function e(n){return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(V=Object(le.a)(n)).connect(),V.on(ae.BlockletEvents.installed,me(ee)),V.on(ae.BlockletEvents.started,me(ee)),V.on(ae.BlockletEvents.startFailed,me(ie)),V.on(ae.BlockletEvents.downloadFailed,me(se(m("launchBlocklet.error.downloadFailed")))),V.on(ae.BlockletEvents.installFailed,me(se(m("launchBlocklet.error.installFailed"))));case 7:case"end":return e.stop()}}),e)})));return function(n){return e.apply(this,arguments)}}(),ve=function(){var e=Object(o.a)(l.a.mark((function e(t){var a,r,c,o;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.sessionToken,r=t.upgradeAvailable,l=a,localStorage.setItem(Ue,l),e.next=4,he(a);case 4:return w(!0),v(!1),c=Object(oe.a)(a),e.next=9,c.getBlocklet({input:{did:n.did}});case 9:return o=e.sent,e.next=12,pe(o.blocklet,r);case 12:case"end":return e.stop()}var l}),e)})));return function(n){return e.apply(this,arguments)}}();if(Object(i.useEffect)((function(){(function(){var e=Object(o.a)(l.a.mark((function e(){var t,a,r,c,o;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(t=Le())){e.next=27;break}return e.prev=3,a=Object(oe.a)(t),e.next=7,a.getBlocklet({input:{did:n.did}});case 7:if(r=e.sent,c=r.blocklet,he(t),!c){e.next=20;break}if(w(!0),!H.a.gt(n.version,c.meta.version)){e.next=18;break}return o=c.environments.find((function(e){return"BLOCKLET_APP_ID"===e.key})),e.next=16,pe(c,{appDid:o?o.value:"",did:c.meta.did,currentVersion:c.meta.version,version:n.version});case 16:e.next=20;break;case 18:return e.next=20,pe(c);case 20:return T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1})})),e.abrupt("return");case 24:e.prev=24,e.t0=e.catch(3),localStorage.removeItem(Ue);case 27:T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1})})),e.next=34;break;case 30:e.prev=30,e.t1=e.catch(0),console.error(e.t1),T((function(e){return Object(q.a)(Object(q.a)({},e),{},{loading:!1,error:new Error(m("launchBlocklet.error.loadMetaFailed"))})}));case 34:case"end":return e.stop()}}),e,null,[[0,30],[3,24]])})));return function(){return e.apply(this,arguments)}})()()}),[]),R.error)return s.a.createElement(g.a,{variant:"icon",type:"error"},R.error.message);if(R.loading)return s.a.createElement("div",{style:{marginTop:"100px",textAlign:"center",width:"100%"}},s.a.createElement(j.a,null));var ge="/";window.env&&window.env.apiPrefix&&(ge=window.env.apiPrefix);var ke=n.did,Ee=n.isFree;return!O&&U.upgradeAvailable?s.a.createElement(Ae,null,s.a.createElement(be,{onCancel:function(){var e;"running"!==(e=U.blocklet).status?G(e):Z(e)},onUpgrade:function(){return fe(U.blocklet,U.upgradeAvailable)}})):!O&&U.existed?s.a.createElement(Ae,null,s.a.createElement(xe,{did:n.did})):U.error?s.a.createElement(Ae,null,s.a.createElement(Be,{message:U.error.message,actions:s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.retry"))})):s.a.createElement(Ae,null,!U.upgradeAvailable&&s.a.createElement("div",{className:"header"},s.a.createElement(N.a,{component:"h5",variant:"h5"},m(O?"launchBlocklet.start":"common.launch")),s.a.createElement(N.a,{color:"textSecondary"},m(O?"launchBlocklet.installingSubTitle":"launchBlocklet.subTitle",{appName:n.title,serverName:r.name}))),s.a.createElement("div",{className:"body"},!O&&!U.error&&s.a.createElement("div",{className:"illustrations"},s.a.createElement("div",{className:"ills_block"},s.a.createElement(ue,{className:"i_icon",blockletMeta:n,blockletMetaUrl:I}),s.a.createElement("div",{className:"i_name"},n.title)),s.a.createElement(Y.a,{className:"arrow-icon"}),s.a.createElement("div",{className:"ills_block"},s.a.createElement(ne.a,{className:"i_icon",color:"#BFBFBF"}),s.a.createElement("div",{className:"i_name"},r.name))),!O&&!U.existed&&s.a.createElement(re.a,{smDown:!0},s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.install"))),O&&!U.error&&s.a.createElement(Se,null,s.a.createElement(j.a,{className:"spinner"}),s.a.createElement("div",{className:"text"},U.status))),s.a.createElement("div",{className:"footer"},!O&&U.existed&&s.a.createElement(z,{className:"footer-item bottom-button",component:K.Link,to:"/blocklets/".concat(ke,"/overview"),fullWidth:S,rounded:!0,color:"primary",variant:"contained"},m("launchBlocklet.viewApplication")),!O&&!U.existed&&s.a.createElement(re.a,{mdUp:!0},s.a.createElement(z,{className:"bottom-button",disabled:b,fullWidth:S,onClick:function(){return v(!0)}},b&&s.a.createElement(j.a,{size:[16,10]}),m("common.install")))),s.a.createElement($.a,{open:b,popup:!0,className:"connect",action:Ee?"launch-free-blocklet":"launch-paid-blocklet",checkFn:J.a.create({baseURL:ge}).get,checkTimeout:6e5,socketUrl:a.socketUrl,webWalletUrl:Object(ce.x)(r),onSuccess:ve,onClose:function(){return v(!1)},locale:d,messages:{title:"".concat(m("launchBlocklet.authDialog.title")),scan:m(Ee?"launchBlocklet.authDialog.freeDescription":"launchBlocklet.authDialog.nonFreeDescription"),confirm:m("launchBlocklet.authDialog.confirm"),success:m("launchBlocklet.authDialog.success")},extraParams:{blockletMetaUrl:I}}))},Me=t(374),Re=t(973),Te=t.n(Re),ze=t(389);function Ie(e){var n=Object.assign({},e);return s.a.createElement("div",Object.assign({},n,{style:{width:"100%"}}),s.a.createElement("h3",null,"End User License Agreement for Application"),s.a.createElement("p",null,"Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28"),s.a.createElement("p",null,"BLOCKLET SERVER LICENSE AGREEMENT"),s.a.createElement("p",null,"\u6682\u65e0"))}function Pe(){var e,n=Object(u.k)(),t=Object(i.useState)("application"),a=Object(W.a)(t,2),r=a[0],c=a[1],l=Object(k.useLocaleContext)().t,o=new Map([["application",{label:l("launchBlocklet.appLicenseName"),value:"application",component:Ie}],["abtnode",{label:l("launchBlocklet.abtnodeLicenseName"),value:"abtnode",component:ze.a}]]),m=[],d=Object(Me.a)(o.values());try{for(d.s();!(e=d.n()).done;){var p=e.value;m.push({label:p.label,value:p.value})}}catch(b){d.e(b)}finally{d.f()}var f=o.get(r).component;return s.a.createElement(Ke,null,s.a.createElement(N.a,{component:"h5",variant:"h5"},l("launchBlocklet.agreement")),s.a.createElement("div",{className:"body"},s.a.createElement(Te.a,{tabs:m,current:r,onChange:c}),s.a.createElement("div",{className:"agreement"},s.a.createElement("div",{className:"agreement_content"},s.a.createElement(f,{style:{width:"100%"}})))),s.a.createElement("div",{className:"footer"},s.a.createElement(z,{className:"bottom-button",onClick:function(){n.push("/launch-blocklet/install".concat(window.location.search))}},l("launchBlocklet.agreeAll"))))}var qe,We,Ke=Object(h.default)(F)(Fe||(Fe=Object(r.a)(["\n .body {\n justify-content: center;\n }\n .agreement {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 300px;\n border: 1px solid #f0f0f0;\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 overflow-y: auto;\n\n "," {\n padding: 0 24px;\n }\n\n "," {\n padding: 0 16px;\n }\n }\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("sm")})),Ve=h.default.div(qe||(qe=Object(r.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"]))),Je=t(532),Ge=t.n(Je),He=t(938),Qe=t.n(He);var Xe,Ye=Object(h.default)(F)(We||(We=Object(r.a)(["\n .app-desc {\n text-align: center;\n margin-top: 40px;\n\n .app-desc_name {\n font-weight: 500;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .app-desc_author {\n margin-top: 8px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n }\n }\n\n .price {\n margin-top: 40px;\n color: #222222;\n text-align: center;\n\n .price-value {\n font-size: 36px;\n line-height: 42px;\n }\n\n .price-symbol {\n margin-left: 8px;\n font-size: 18px;\n line-height: 21px;\n }\n }\n"]))),Ze=function(e){var n=e.blockletMeta,t=Object(i.useState)(!1),a=Object(W.a)(t,2),r=a[0],c=a[1],l=Object(u.k)(),o=Object(B.a)(),m=Object(y.c)().info,d=Object(k.useLocaleContext)().t,p=o.get("blocklet_meta_url"),f=new URL(p).origin,h=function(){l.push("/launch-blocklet/agreement".concat(window.location.search))},v=[];return n.isFree||(v=Object(ce.h)(n)),s.a.createElement(Ye,null,s.a.createElement("div",{className:"header"},s.a.createElement(N.a,{component:"h5",variant:"h5"},d("launchBlocklet.purchaseApp")),s.a.createElement(N.a,{color:"textSecondary",style:{marginTop:"8px"}},d("launchBlocklet.appInfoDesc"))),s.a.createElement("div",{className:"body"},s.a.createElement(ue,{blockletMetaUrl:p,blockletMeta:n}),s.a.createElement("div",{className:"app-desc"},s.a.createElement("div",{className:"app-desc_name"},n.title),s.a.createElement("div",{className:"app-desc_author"},d("launchBlocklet.author",{author:Ge()(n,"author.name")}))),!n.isFree&&s.a.createElement("div",{className:"price"},v.map((function(e,n){return s.a.createElement(s.a.Fragment,{key:e.name},s.a.createElement("div",{style:{display:"flex",alignItems:"center"}},s.a.createElement("span",{className:"price-value"},e.value),s.a.createElement("span",{className:"price-symbol"},e.name)),n<v.length-1&&s.a.createElement(Qe.a,{style:{margin:"11px auto"},fontSize:"18px"}))})))),s.a.createElement("div",{className:"footer"},n.isFree&&s.a.createElement(D.a,{style:{marginTop:"80px"},className:"bottom-button",rounded:!0,color:"primary",variant:"contained",onClick:h},d("launchBlocklet.nextStep")),!n.isFree&&s.a.createElement("div",{style:{marginTop:"80px"}},s.a.createElement(D.a,{variant:"outlined",rounded:!0,color:"primary",onClick:function(){return h()}},d("launchBlocklet.purchased")),s.a.createElement(D.a,{style:{marginLeft:"20px"},rounded:!0,color:"primary",variant:"contained",onClick:function(){c(!0)}},d("launchBlocklet.purchase")))),s.a.createElement($.a,{open:r,popup:!0,baseUrl:f,action:"acquire-asset",checkFn:J.a.create({baseURL:b()(f,"/store")}).get,onSuccess:function(){c(!1),h()},onClose:function(){c(!1)},checkTimeout:3e5,extraParams:{factory:n.nftFactory},webWalletUrl:Object(ce.x)(m),disableClose:!0,showDownload:!1,messages:{title:"\u8d2d\u4e70 ".concat(n.title),scan:"\u4f7f\u7528 DID \u94b1\u5305\u626b\u7801",confirm:"\u5728\u60a8\u7684 DID \u94b1\u5305\u4e0a\u786e\u8ba4",success:"\u6210\u529f"}}))};function $e(){var e=Object(u.n)().path,n=Object(k.useLocaleContext)(),t=n.t,a=n.locale,r=Object(B.a)(),c=Object(y.c)().api,i=(r.get("blocklet_meta_url")||"").trim();i=decodeURIComponent(i);var d=Object(m.a)(Object(o.a)(l.a.mark((function e(){var n,a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i){e.next=2;break}throw new Error(t("common.invalidParam"));case 2:return e.next=4,c.getBlockletMetaFromUrl({input:{url:i,checkPrice:!0}});case 4:if(n=e.sent,a=n.meta){e.next=8;break}throw new Error(t("launchBlocklet.error.loadMetaFailed"));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)}))));if(d.loading)return s.a.createElement(Ve,null,s.a.createElement(j.a,null));if(d.error)return s.a.createElement(Ve,null,s.a.createElement("div",null,s.a.createElement(g.a,{style:{width:"100%",wordBreak:"break-all"},variant:"icon",type:"error"},d.error.message)));var p=d.value,f=p.isFree?"".concat(e,"/agreement"):"".concat(e,"/purchase-app");f="".concat(f).concat(window.location.search);var h=b()(Object(ce.w)(),e),v=[{key:"app-info",name:t("launchBlocklet.purchaseApp"),path:b()(h,"purchase-app"),optional:!0},{key:"agreement",name:t("launchBlocklet.agreement"),path:b()(h,"agreement")},{key:"install",name:t("launchBlocklet.launch"),path:b()(h,"install")},{key:"complete",name:t("launchBlocklet.complete"),path:b()(h,"complete")}];return p.registryUrl=new URL(i).origin,s.a.createElement(x.StepProvider,{steps:v},s.a.createElement(x.Layout,{locale:a,blockletMeta:p,headerEndAddons:s.a.createElement(s.a.Fragment,null,s.a.createElement(w.a,{size:26,showText:!1,className:"locale-addon"})),logoUrl:Object(ce.q)({did:p.did,baseUrl:p.registryUrl,logoPath:p.logo})},s.a.createElement(en,null,s.a.createElement(u.g,null,s.a.createElement(u.c,{exact:!0,path:e,to:f}),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/purchase-app")},s.a.createElement(Ze,{blockletMeta:p})),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/agreement")},s.a.createElement(Pe,null)),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/install")},s.a.createElement(De,{blockletMeta:p})),s.a.createElement(u.d,{exact:!0,path:"".concat(e,"/complete")},s.a.createElement(P,{blockletMeta:p}))))))}p.a.object.isRequired;var en=h.default.div(Xe||(Xe=Object(r.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 width: 300px;\n }\n"])));function nn(){return s.a.createElement($e,null)}},955:function(e,n,t){var a=t(11),r=t(262),c=t(966),l=t(532),o=function(e,n){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=t.parallel,o=void 0!==l&&l,i=t.sync;if(i){if(n(e),e.children){var s,u=c(e.children);try{for(u.s();!(s=u.n()).done;){var m=s.value;n(m)}}catch(h){u.e(h)}finally{u.f()}}return null}if(!o)return r(a.mark((function t(){var r,l,o;return a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n(e);case 2:if(!e.children){t.next=20;break}r=c(e.children),t.prev=4,r.s();case 6:if((l=r.n()).done){t.next=12;break}return o=l.value,t.next=10,n(o);case 10:t.next=6;break;case 12:t.next=17;break;case 14:t.prev=14,t.t0=t.catch(4),r.e(t.t0);case 17:return t.prev=17,r.f(),t.finish(17);case 20:return t.abrupt("return",null);case 21:case"end":return t.stop()}}),t,null,[[4,14,17,20]])})))();var d=[];if(d.push(n(e)),e.children){var p,f=c(e.children);try{for(f.s();!(p=f.n()).done;){var b=p.value;d.push(n(b))}}catch(h){f.e(h)}finally{f.f()}}return Promise.all(d)};e.exports={isFreeBlocklet:function(e){return!e.payment||(e.payment.price||[]).map((function(e){return e.value||0})).every((function(e){return 0===e}))},isDeletableBlocklet:function(e){if(!e)return!1;var n=e.environments.find((function(e){return"BLOCKLET_DELETABLE"===e.key}));return!n||"yes"===n.value},forEachBlocklet:o,isAuthServiceEnabled:function e(n){if((l(n,"meta.interfaces")||[]).some((function(e){return(l(e,"services")||[]).some((function(e){return"@abtnode/auth-service"===e.name}))})))return!0;var t,a=l(n,"children")||[],r=c(a);try{for(r.s();!(t=r.n()).done;){if(e(t.value))return!0}}catch(o){r.e(o)}finally{r.f()}return!1},getRequiredMissingConfigs:function(e){var n=[],t=e.configs||[];t.forEach((function(t){t.required&&!t.value&&n.push({did:e.meta.did,key:t.key})}));var a,r=c(e.children||[]);try{var l=function(){var e=a.value;(e.configs||[]).forEach((function(a){!a.required||a.value||t.some((function(e){return e.key===a.key&&e.value}))||n.push({did:e.meta.did,key:a.key})}))};for(r.s();!(a=r.n()).done;)l()}catch(o){r.e(o)}finally{r.f()}return n},wipeSensitiveData:function(e){return e?(o(e,(function(n){(n.configs||[]).forEach((function(e){e.secure&&(e.value=e.value?"__encrypted__":"")})),(n.environments||[]).forEach((function(e){["BLOCKLET_APP_SK"].includes(e.key)&&(e.value="__encrypted__")})),delete e.configObj,delete e.environmentObj}),{sync:!0}),e):e}}}}]);
|
|
2
|
+
//# sourceMappingURL=28.40163b1b.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/launch-blocklet/content-layout.js","components/launch-blocklet/button.js","components/launch-blocklet/complete.js","components/launch-blocklet/app-logo.js","components/launch-blocklet/status/upgrade-available.js","components/launch-blocklet/status/not-running.js","components/launch-blocklet/status/error.js","components/launch-blocklet/install.js","components/launch-blocklet/agreement-app.js","components/launch-blocklet/agreement.js","components/launch-blocklet/center.js","pages/launch-blocklet/purchase-app.js","pages/launch-blocklet/index.js","../../../blocklet/meta/lib/util.js"],"names":["ContentLayout","children","props","Container","styled","div","theme","breakpoints","up","down","WrappedButton","rounded","variant","color","React","forwardRef","ref","forwardedRef","palette","error","main","success","Complete","blockletMeta","t","useLocaleContext","info","useNodeContext","query","useQuery","accessUrl","decodeURIComponent","get","Typography","component","className","appName","title","serverName","name","href","AppLogo","blockletMetaUrl","src","getBlockletLogoUrl","did","logoPath","logo","baseUrl","URL","origin","width","size","placeholder","Upgrade","onCancel","onUpgrade","Body","Footer","onClick","defaultProps","NotRunning","useTheme","isBreakpointsDownSm","useMediaQuery","style","Link","to","fullWidth","Error","message","actions","capitalize","SESSION_KEY","getSessionToken","localStorage","getItem","Waiting","Install","api","locale","useState","openAuth","setOpenAuth","launching","setLaunching","existed","status","upgradeAvailable","blocklet","launchState","setLaunchState","history","useHistory","meta","loading","blockletState","setBlockletState","blockletRegistryUrl","wsClient","useEffect","isConnected","disconnect","redirectToBlockletOverview","push","encodeURIComponent","handleInstalled","a","getRequiredMissingConfigs","length","setTimeout","handleRunningBlocklet","blockletInterface","interfaces","find","item","url","hostname","endsWith","didDomain","getBlockletName","handleSuccessEvent","nodeClient","createNewClient","getBlocklet","input","result","handleLaunchState","handleStartFailed","pre","createLaunchFailedHandler","errorMessage","createBlockletEventHandler","handler","handleBlockletExisted","includes","handleUpgradeAvailable","handleUpgrade","version","registryUrl","upgradeBlocklet","handleAuthorized","sessionToken","createWsClient","connect","on","BlockletEvents","installed","started","startFailed","downloadFailed","installFailed","handleConnectSuccess","value","setItem","token","semver","gt","appDidEnv","environments","e","key","appDid","currentVersion","removeItem","console","func","type","marginTop","textAlign","window","env","apiPrefix","isFree","b","disabled","Hidden","smDown","mdUp","open","popup","action","checkFn","axios","create","baseURL","checkTimeout","socketUrl","webWalletUrl","getWebWalletUrl","onSuccess","onClose","messages","scan","confirm","extraParams","AgreementApp","Agreement","currentTab","setCurrentTab","tabMap","Map","label","AgreementNode","tabs","values","TabContent","Content","current","onChange","location","search","Center","AppInfo","pay","setPay","toNextStep","priceList","formatFactoryPrice","author","map","index","Fragment","display","alignItems","margin","fontSize","marginLeft","joinUrl","factory","nftFactory","disableClose","showDownload","Launcher","path","useRouteMatch","trim","state","useAsync","getBlockletMetaFromUrl","checkPrice","wordBreak","firstPageUrl","basePath","getPathPrefix","steps","optional","headerEndAddons","showText","logoUrl","exact","PropTypes","object","isRequired","BlockletLauncher","require","forEachBlocklet","cb","parallel","sync","child","tasks","Promise","all","module","exports","isFreeBlocklet","payment","price","x","every","isDeletableBlocklet","config","isAuthServiceEnabled","some","s","missingConfigs","configs","forEach","required","y","wipeSensitiveData","d","secure","configObj","environmentObj"],"mappings":"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","file":"static/js/28.40163b1b.chunk.js","sourcesContent":["import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nexport default function ContentLayout({ children, ...props }) {\n return <Container {...props}>{children}</Container>;\n}\n\nContentLayout.propTypes = {\n children: PropTypes.any.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 .header {\n text-align: center;\n }\n\n .body {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 30px;\n width: 100%;\n min-height: 200px;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 24px;\n }\n\n ${props => props.theme.breakpoints.down('sm')} {\n flex: 1;\n padding: 0 16px 16px;\n }\n }\n\n .footer {\n display: flex;\n justify-content: center;\n\n ${props => props.theme.breakpoints.up('sm')} {\n padding-bottom: 34px;\n }\n\n ${props => props.theme.breakpoints.down('sm')} {\n margin-top: auto;\n padding-bottom: 10px;\n }\n }\n`;\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 rounded 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 styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { Typography } from '@material-ui/core';\nimport CheckCircle from '@material-ui/icons/CheckCircle';\nimport { useNodeContext } from '../../contexts/node';\n\nimport useQuery from '../../hooks/query';\nimport ContentLayout from './content-layout';\nimport Button from './button';\n\nfunction Complete({ blockletMeta }) {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const query = useQuery();\n const accessUrl = decodeURIComponent(query.get('accessUrl') || '');\n\n return (\n <Container>\n <Typography component=\"h5\" variant=\"h5\">\n {t('launchBlocklet.complete')}\n </Typography>\n <div className=\"body\">\n <CheckCircle className=\"circle_icon\" />\n <Typography className=\"app-info_desc\" component=\"span\">\n {t('launchBlocklet.installSuccess', {\n appName: blockletMeta ? blockletMeta.title : '',\n serverName: info.name,\n })}\n </Typography>\n </div>\n <div className=\"footer\">\n <Button href={accessUrl} className=\"bottom-button\">\n {t('common.open')}\n </Button>\n </div>\n </Container>\n );\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 margin-top: 70px;\n text-align: center;\n }\n\n ${props => {\n return props.theme.breakpoints.down('sm');\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 blockletMeta: PropTypes.object.isRequired,\n};\n\nexport default Complete;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Img from '@arcblock/ux/lib/Img';\nimport { getBlockletLogoUrl } from '../../libs/util';\n\nexport default function AppLogo({ blockletMeta, blockletMetaUrl }) {\n return (\n <Img\n src={getBlockletLogoUrl({\n did: blockletMeta.did,\n logoPath: blockletMeta.logo,\n baseUrl: new URL(blockletMetaUrl).origin,\n })}\n width={64}\n size=\"contain\"\n placeholder=\"application logo\"\n />\n );\n}\n\nAppLogo.propTypes = {\n blockletMeta: PropTypes.object.isRequired,\n blockletMetaUrl: PropTypes.string.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport AutorenewIcon from '@material-ui/icons/AutorenewOutlined';\nimport Button from '../button';\nimport ContentLayout from '../content-layout';\n\nexport default function Upgrade({ onCancel, onUpgrade }) {\n const { t } = useLocaleContext();\n return (\n <>\n <Body className=\"body\">\n <div className=\"upgrade-wrapper\">\n <AutorenewIcon className=\"upgrade-wrapper_icon\" />\n </div>\n <div className=\"status_title\">{t('launchBlocklet.newVersion')}</div>\n <div className=\"status_desc\">{t('launchBlocklet.newVersionDesc')}</div>\n </Body>\n <Footer className=\"footer\">\n <Button onClick={onCancel} variant=\"outlined\">\n {t('launchBlocklet.later')}\n </Button>\n <Button className=\"upgrade-button\" onClick={onUpgrade}>\n {t('launchBlocklet.upgradeNow')}\n </Button>\n </Footer>\n </>\n );\n}\n\nUpgrade.propTypes = {\n onCancel: PropTypes.func,\n onUpgrade: PropTypes.func,\n};\n\nUpgrade.defaultProps = {\n onCancel: () => {},\n onUpgrade: () => {},\n};\n\nconst Body = styled(ContentLayout)`\n .upgrade-wrapper {\n background-color: #4f6af6;\n border-radius: 50%;\n padding: 5px;\n width: 48px;\n height: 48px;\n\n .upgrade-wrapper_icon {\n color: white;\n width: 100%;\n height: 100%;\n }\n }\n`;\n\nconst Footer = styled.div`\n .upgrade-button {\n margin-left: 24px;\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { useTheme } from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport Button from '../button';\n\nexport default function NotRunning({ did }) {\n const { t } = useLocaleContext();\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n\n return (\n <>\n <div className=\"body\">\n <WarningIcon className=\"status_icon\" />\n <div className=\"status_title\">{t('launchBlocklet.error.installedButStopped')}</div>\n </div>\n <div className=\"footer\">\n <Button\n style={{ width: '300px' }}\n className=\"footer-item\"\n component={Link}\n to={`/blocklets/${did}/overview`}\n fullWidth={isBreakpointsDownSm}\n rounded\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n </div>\n </>\n );\n}\n\nNotRunning.propTypes = {\n did: PropTypes.string.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport capitalize from 'lodash/capitalize';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport styled from 'styled-components';\n\nexport default function Error({ message, actions }) {\n const { t } = useLocaleContext();\n\n return (\n <>\n <Body className=\"body\">\n <CancelIcon className=\"status_icon status_error\" />\n <div className=\"status_title status_error\">{capitalize(t('common.failed'))}</div>\n <div className=\"status_desc\">{message}</div>\n </Body>\n {actions && <div className=\"footer\">{actions}</div>}\n </>\n );\n}\n\nError.propTypes = {\n actions: PropTypes.any.isRequired,\n message: PropTypes.string.isRequired,\n};\n\nconst Body = styled.div`\n .status_error {\n color: #f16e6e;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport { useHistory, Link } from 'react-router-dom';\nimport axios from 'axios';\nimport semver from 'semver';\nimport PropTypes from 'prop-types';\nimport styled, { useTheme } from 'styled-components';\nimport { Typography, useMediaQuery } from '@material-ui/core';\nimport ArrowForward from '@material-ui/icons/ArrowForward';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport ABTNodeIcon from '@arcblock/icons/lib/ABTNode';\nimport { getRequiredMissingConfigs } from '@blocklet/meta/lib/util';\nimport { BlockletEvents } from '@blocklet/meta/lib/constants';\nimport Hidden from '@material-ui/core/Hidden';\nimport { useNodeContext } from '../../contexts/node';\nimport { getBlockletName, getWebWalletUrl } from '../../libs/util';\nimport { create as createWsClient } from '../../libs/ws';\nimport { create as createNewClient } from '../../libs/node';\nimport useQuery from '../../hooks/query';\nimport Button from './button';\nimport ContentLayout from './content-layout';\nimport AppLogo from './app-logo';\nimport StatusUpgrade from './status/upgrade-available';\nimport StatusNotRunning from './status/not-running';\nimport StatusError from './status/error';\n\nconst SESSION_KEY = 'abtnode_launch_blocklet_key';\nconst getSessionToken = () => localStorage.getItem(SESSION_KEY);\nconst setSessionToken = value => localStorage.setItem(SESSION_KEY, value);\nconst clearSessionToken = () => localStorage.removeItem(SESSION_KEY);\n\nfunction Install({ blockletMeta }) {\n const { api, info } = useNodeContext();\n const { t, locale } = useLocaleContext();\n const [openAuth, setOpenAuth] = useState(false);\n const [launching, setLaunching] = useState(false);\n const [launchState, setLaunchState] = useState({\n existed: false,\n status: t('launchBlocklet.installing'),\n upgradeAvailable: null,\n blocklet: null,\n error: null,\n });\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n const history = useHistory();\n const [blockletState, setBlockletState] = useState({\n meta: null,\n loading: true,\n error: null,\n });\n const query = useQuery();\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const blockletRegistryUrl = new URL(blockletMetaUrl).origin;\n let wsClient = null;\n\n useEffect(() => {\n return () => {\n if (wsClient && wsClient.isConnected()) {\n wsClient.disconnect();\n }\n };\n }, [wsClient]);\n\n const redirectToBlockletOverview = blocklet => {\n const accessUrl = `/blocklets/${blocklet.meta.did}/configuration`;\n history.push(\n `/launch-blocklet/complete?status=installed&name=${encodeURIComponent(\n blocklet.meta.title\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`\n );\n };\n\n const handleInstalled = async blocklet => {\n setLaunchState({ ...launchState, status: t('blocklet.status.installed') });\n\n if (getRequiredMissingConfigs(blocklet).length > 0) {\n setTimeout(() => {\n redirectToBlockletOverview(blocklet);\n }, 1500);\n }\n };\n\n const handleRunningBlocklet = async blocklet => {\n const blockletInterface = blocklet.interfaces.find(item => {\n const urlObj = new URL(item.url);\n return urlObj.hostname.endsWith(info.didDomain);\n });\n\n let accessUrl = '';\n if (blockletInterface) {\n accessUrl = blockletInterface.url;\n }\n\n setLaunchState({\n ...launchState,\n status: `${t('blocklet.status.running')}, ${t('common.redirecting')}`,\n });\n\n setTimeout(() => {\n history.push(\n `/launch-blocklet/complete?name=${encodeURIComponent(\n getBlockletName(blocklet.meta)\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`\n );\n }, 1500);\n };\n\n const handleSuccessEvent = async blocklet => {\n const nodeClient = createNewClient(getSessionToken());\n const result = await nodeClient.getBlocklet({ input: { did: blocklet.meta.did } });\n\n await handleLaunchState(result.blocklet);\n };\n\n const handleErrored = () => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, existed: true, error: new Error(t('launchBlocklet.error.installedButError')) }));\n };\n\n const handleUpgradeAvailable = (blocklet, upgradeAvailable) => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, upgradeAvailable }));\n };\n\n const handleStopped = () => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, existed: true }));\n };\n\n const handleStartFailed = async blocklet => {\n setLaunching(pre => ({ ...pre, error: new Error(t('launchBlocklet.error.startFailed')) }));\n await handleInstalled(blocklet);\n };\n\n const createLaunchFailedHandler = errorMessage => () => {\n setLaunchState({\n ...launchState,\n error: new Error(errorMessage),\n });\n };\n\n const createBlockletEventHandler = handler => blocklet => {\n if (blocklet.meta.did === blockletMeta.did) {\n handler(blocklet);\n }\n };\n\n const handleBlockletExisted = (blocklet, upgradeAvailable) => {\n if (upgradeAvailable) {\n handleUpgradeAvailable(blocklet, upgradeAvailable);\n return;\n }\n\n if (['stopped', 'stopping'].includes(blocklet.status)) {\n handleStopped(blocklet);\n return;\n }\n\n if (['error', 'corrupted'].includes(blocklet.status)) {\n handleErrored(blocklet);\n return;\n }\n\n if (blocklet.status === 'running') {\n handleRunningBlocklet(blocklet);\n return;\n }\n\n if (blocklet.status === 'installed') {\n handleInstalled(blocklet);\n }\n };\n\n const handleLaunchState = async (blocklet, upgradeAvailable) => {\n if (!blocklet) {\n setLaunching(false);\n setLaunchState({ ...launchState, error: new Error(t('launchBlocklet.error.launchFailed')) });\n return;\n }\n\n setLaunchState({ ...launchState, blocklet });\n handleBlockletExisted(blocklet, upgradeAvailable);\n };\n\n const handleCancelUpgrade = b => {\n if (b.status === 'running') {\n handleRunningBlocklet(b);\n return;\n }\n\n redirectToBlockletOverview(b);\n };\n\n const handleUpgrade = async (blocklet, upgradeAvailable) => {\n try {\n const input = {\n did: blocklet.meta.did,\n version: upgradeAvailable.version,\n registryUrl: blockletRegistryUrl,\n };\n\n setLaunching(true);\n setLaunchState({ ...launchState, status: t('common.upgrading') });\n await api.upgradeBlocklet({ input });\n } catch (error) {\n setLaunchState({ ...launchState, error: new Error(t('launchBlocklet.error.upgradeFailed')) });\n }\n };\n\n const handleAuthorized = async sessionToken => {\n wsClient = createWsClient(sessionToken);\n wsClient.connect();\n\n wsClient.on(BlockletEvents.installed, createBlockletEventHandler(handleSuccessEvent));\n wsClient.on(BlockletEvents.started, createBlockletEventHandler(handleSuccessEvent));\n wsClient.on(BlockletEvents.startFailed, createBlockletEventHandler(handleStartFailed));\n\n wsClient.on(\n BlockletEvents.downloadFailed,\n createBlockletEventHandler(createLaunchFailedHandler(t('launchBlocklet.error.downloadFailed')))\n );\n wsClient.on(\n BlockletEvents.installFailed,\n createBlockletEventHandler(createLaunchFailedHandler(t('launchBlocklet.error.installFailed')))\n );\n };\n\n const handleConnectSuccess = async ({ sessionToken, upgradeAvailable }) => {\n setSessionToken(sessionToken);\n await handleAuthorized(sessionToken);\n setLaunching(true);\n setOpenAuth(false);\n\n // 上面的事件成功订阅之前,Blocklet 可能已经安装成功了,所以这里重新获取一下 Blocklet 的状态,确保状态是正确的\n const nodeClient = createNewClient(sessionToken);\n const result = await nodeClient.getBlocklet({ input: { did: blockletMeta.did } });\n await handleLaunchState(result.blocklet, upgradeAvailable);\n };\n\n const handleClose = () => setOpenAuth(false);\n\n useEffect(() => {\n const func = async () => {\n try {\n const token = getSessionToken();\n if (token) {\n // 这里是为了校验 token 是否依然有效\n try {\n const nodeClient = createNewClient(token);\n const { blocklet } = await nodeClient.getBlocklet({ input: { did: blockletMeta.did } });\n\n handleAuthorized(token);\n\n if (blocklet) {\n setLaunching(true);\n if (semver.gt(blockletMeta.version, blocklet.meta.version)) {\n const appDidEnv = blocklet.environments.find(e => e.key === 'BLOCKLET_APP_ID');\n await handleLaunchState(blocklet, {\n appDid: appDidEnv ? appDidEnv.value : '',\n did: blocklet.meta.did,\n currentVersion: blocklet.meta.version,\n version: blockletMeta.version,\n });\n } else {\n await handleLaunchState(blocklet);\n }\n }\n\n setBlockletState(pre => ({ ...pre, loading: false }));\n return;\n } catch (error) {\n clearSessionToken();\n }\n }\n\n setBlockletState(pre => ({ ...pre, loading: false }));\n } catch (error) {\n console.error(error);\n setBlockletState(pre => ({\n ...pre,\n loading: false,\n error: new Error(t('launchBlocklet.error.loadMetaFailed')),\n }));\n }\n };\n\n func();\n }, []); // eslint-disable-line\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 { did, isFree } = blockletMeta;\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.existed) {\n return (\n <Container>\n <StatusNotRunning did={blockletMeta.did} />\n </Container>\n );\n }\n\n if (launchState.error) {\n return (\n <Container>\n <StatusError\n message={launchState.error.message}\n actions={\n <Button\n className=\"bottom-button\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={() => setOpenAuth(true)}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.retry')}\n </Button>\n }\n />\n </Container>\n );\n }\n\n return (\n <Container>\n {!launchState.upgradeAvailable && (\n <div className=\"header\">\n <Typography component=\"h5\" variant=\"h5\">\n {launching ? t('launchBlocklet.start') : t('common.launch')}\n </Typography>\n <Typography color=\"textSecondary\">\n {launching\n ? t('launchBlocklet.installingSubTitle', { appName: blockletMeta.title, serverName: info.name })\n : t('launchBlocklet.subTitle', { appName: blockletMeta.title, serverName: info.name })}\n </Typography>\n </div>\n )}\n <div className=\"body\">\n {!launching && !launchState.error && (\n <div className=\"illustrations\">\n <div className=\"ills_block\">\n <AppLogo className=\"i_icon\" blockletMeta={blockletMeta} blockletMetaUrl={blockletMetaUrl} />\n <div className=\"i_name\">{blockletMeta.title}</div>\n </div>\n <ArrowForward className=\"arrow-icon\" />\n <div className=\"ills_block\">\n <ABTNodeIcon className=\"i_icon\" color=\"#BFBFBF\" />\n <div className=\"i_name\">{info.name}</div>\n </div>\n </div>\n )}\n {!launching && !launchState.existed && (\n <Hidden smDown>\n <Button\n className=\"bottom-button\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={() => setOpenAuth(true)}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.install')}\n </Button>\n </Hidden>\n )}\n {launching && !launchState.error && (\n <Waiting>\n <Spinner className=\"spinner\" />\n <div className=\"text\">{launchState.status}</div>\n </Waiting>\n )}\n </div>\n <div className=\"footer\">\n {!launching && launchState.existed && (\n <Button\n className=\"footer-item bottom-button\"\n component={Link}\n to={`/blocklets/${did}/overview`}\n fullWidth={isBreakpointsDownSm}\n rounded\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n )}\n {!launching && !launchState.existed && (\n <Hidden mdUp>\n <Button\n className=\"bottom-button\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={() => setOpenAuth(true)}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.install')}\n </Button>\n </Hidden>\n )}\n </div>\n <Connect\n open={openAuth}\n popup\n className=\"connect\"\n action={isFree ? 'launch-free-blocklet' : 'launch-paid-blocklet'}\n checkFn={axios.create({ baseURL: 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.authDialog.title')}`,\n scan: isFree\n ? t('launchBlocklet.authDialog.freeDescription')\n : t('launchBlocklet.authDialog.nonFreeDescription'),\n confirm: t('launchBlocklet.authDialog.confirm'),\n success: t('launchBlocklet.authDialog.success'),\n }}\n extraParams={{ blockletMetaUrl }}\n />\n </Container>\n );\n}\n\nInstall.propTypes = {\n blockletMeta: PropTypes.object.isRequired,\n};\n\nconst Waiting = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n color: #4f6af6;\n\n .spinner {\n color: inherit !important;\n }\n\n .text {\n font-size: 20px;\n margin-top: 24px;\n }\n`;\n\nconst Container = styled(ContentLayout)`\n .body {\n margin-bottom: 50px;\n justify-content: center;\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-bottom: 80px;\n width: 100%;\n }\n\n .ills_block {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n .i_icon {\n width: 64px;\n height: 64px;\n }\n\n .i_name {\n margin-top: 32px;\n font-weight: 500;\n font-size: 18px;\n color: #222222;\n }\n\n .i_sub_name {\n color: #999999;\n }\n }\n\n ${props => props.theme.breakpoints.down('sm')} {\n .ills_block {\n flex: 1;\n flex-shrink: 0;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #d3e7fe;\n margin: 25px 40px 0;\n ${props => props.theme.breakpoints.down('sm')} {\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`;\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, { useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { Typography } from '@material-ui/core';\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from './button';\nimport AgreementNode from '../node/eula-content'; // eslint-disable-line\nimport AgreementApp from './agreement-app';\nimport ContentLayout from './content-layout';\n\nexport default function Agreement() {\n const history = useHistory();\n const [currentTab, setCurrentTab] = useState('application');\n const { t } = useLocaleContext();\n // TODO: 加载 Blocklet 定义的 Agreement\n\n const handleAgree = () => {\n history.push(`/launch-blocklet/install${window.location.search}`);\n };\n\n const tabMap = new Map([\n [\n 'application',\n {\n label: t('launchBlocklet.appLicenseName'),\n value: 'application',\n component: AgreementApp,\n },\n ],\n [\n 'abtnode',\n {\n label: t('launchBlocklet.abtnodeLicenseName'),\n value: 'abtnode',\n component: AgreementNode,\n },\n ],\n ]);\n\n const tabs = [];\n for (const value of tabMap.values()) {\n tabs.push({\n label: value.label,\n value: value.value,\n });\n }\n\n const TabContent = tabMap.get(currentTab).component;\n\n return (\n <Content>\n <Typography component=\"h5\" variant=\"h5\">\n {t('launchBlocklet.agreement')}\n </Typography>\n <div className=\"body\">\n <Tabs tabs={tabs} current={currentTab} onChange={setCurrentTab} />\n <div className=\"agreement\">\n <div className=\"agreement_content\">\n <TabContent style={{ width: '100%' }} />\n </div>\n </div>\n </div>\n <div className=\"footer\">\n <Button className=\"bottom-button\" onClick={handleAgree}>\n {t('launchBlocklet.agreeAll')}\n </Button>\n </div>\n </Content>\n );\n}\n\nconst Content = styled(ContentLayout)`\n .body {\n justify-content: center;\n }\n .agreement {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 300px;\n border: 1px solid #f0f0f0;\n border-radius: 12px;\n\n ${props => props.theme.breakpoints.up('md')} {\n margin-top: 24px;\n }\n\n ${props => props.theme.breakpoints.down('sm')} {\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 overflow-y: auto;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 0 24px;\n }\n\n ${props => props.theme.breakpoints.down('sm')} {\n padding: 0 16px;\n }\n }\n }\n`;\n","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, { useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport axios from 'axios';\nimport get from 'lodash/get';\nimport joinUrl from 'url-join';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Typography } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport Button from '@arcblock/ux/lib/Button';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { formatFactoryPrice, getWebWalletUrl } from '../../libs/util';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\nimport ContentLayout from '../../components/launch-blocklet/content-layout';\nimport AppLogo from '../../components/launch-blocklet/app-logo';\n\nfunction AppInfo({ blockletMeta }) {\n const [pay, setPay] = useState(false);\n const history = useHistory();\n const query = useQuery();\n const { info } = useNodeContext();\n const { t } = useLocaleContext();\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const registryUrl = new URL(blockletMetaUrl).origin;\n\n const handleStartPay = () => {\n setPay(true);\n };\n\n const toNextStep = () => {\n history.push(`/launch-blocklet/agreement${window.location.search}`);\n };\n\n const handlePaySuccess = () => {\n setPay(false);\n toNextStep();\n };\n\n const handleAlreadyPurchased = () => toNextStep();\n\n const handleClose = () => {\n setPay(false);\n };\n\n let priceList = [];\n if (!blockletMeta.isFree) {\n priceList = formatFactoryPrice(blockletMeta);\n }\n\n return (\n <Container>\n <div className=\"header\">\n <Typography component=\"h5\" variant=\"h5\">\n {t('launchBlocklet.purchaseApp')}\n </Typography>\n <Typography color=\"textSecondary\" style={{ marginTop: '8px' }}>\n {t('launchBlocklet.appInfoDesc')}\n </Typography>\n </div>\n <div className=\"body\">\n <AppLogo blockletMetaUrl={blockletMetaUrl} blockletMeta={blockletMeta} />\n <div className=\"app-desc\">\n <div className=\"app-desc_name\">{blockletMeta.title}</div>\n <div className=\"app-desc_author\">\n {t('launchBlocklet.author', { author: get(blockletMeta, 'author.name') })}\n </div>\n </div>\n {!blockletMeta.isFree && (\n <div className=\"price\">\n {priceList.map((item, index) => (\n <React.Fragment key={item.name}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span className=\"price-value\">{item.value}</span>\n <span className=\"price-symbol\">{item.name}</span>\n </div>\n {index < priceList.length - 1 && <AddIcon style={{ margin: '11px auto' }} fontSize=\"18px\" />}\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n <div className=\"footer\">\n {blockletMeta.isFree && (\n <Button\n style={{ marginTop: '80px' }}\n className=\"bottom-button\"\n rounded\n color=\"primary\"\n variant=\"contained\"\n onClick={toNextStep}>\n {t('launchBlocklet.nextStep')}\n </Button>\n )}\n {!blockletMeta.isFree && (\n <div style={{ marginTop: '80px' }}>\n <Button variant=\"outlined\" rounded color=\"primary\" onClick={handleAlreadyPurchased}>\n {t('launchBlocklet.purchased')}\n </Button>\n <Button style={{ marginLeft: '20px' }} rounded color=\"primary\" variant=\"contained\" onClick={handleStartPay}>\n {t('launchBlocklet.purchase')}\n </Button>\n </div>\n )}\n </div>\n <Connect\n open={pay}\n popup\n baseUrl={registryUrl}\n action=\"acquire-asset\"\n checkFn={axios.create({ baseURL: joinUrl(registryUrl, '/store') }).get}\n onSuccess={handlePaySuccess}\n onClose={handleClose}\n checkTimeout={60 * 5000}\n extraParams={{ factory: blockletMeta.nftFactory }}\n webWalletUrl={getWebWalletUrl(info)}\n disableClose\n showDownload={false}\n messages={{\n title: `购买 ${blockletMeta.title}`,\n scan: '使用 DID 钱包扫码',\n confirm: '在您的 DID 钱包上确认',\n success: '成功',\n }}\n />\n </Container>\n );\n}\n\nAppInfo.propTypes = {\n blockletMeta: PropTypes.object.isRequired,\n};\n\nconst Container = styled(ContentLayout)`\n .app-desc {\n text-align: center;\n margin-top: 40px;\n\n .app-desc_name {\n font-weight: 500;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .app-desc_author {\n margin-top: 8px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n }\n }\n\n .price {\n margin-top: 40px;\n color: #222222;\n text-align: center;\n\n .price-value {\n font-size: 36px;\n line-height: 42px;\n }\n\n .price-symbol {\n margin-left: 8px;\n font-size: 18px;\n line-height: 21px;\n }\n }\n`;\n\nexport default AppInfo;\n","import React from 'react';\nimport { useRouteMatch, useHistory, Switch, Route, Redirect } from 'react-router-dom';\nimport { useAsync } from 'react-use';\nimport PropTypes from 'prop-types';\nimport joinUrl from 'url-join';\nimport styled from 'styled-components';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { StepProvider, Layout } from '@arcblock/abt-launcher';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport LocaleSelector from '@arcblock/ux/lib/Locale/selector';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nimport Complete from '../../components/launch-blocklet/complete';\nimport Install from '../../components/launch-blocklet/install';\nimport Agreement from '../../components/launch-blocklet/agreement';\nimport Center from '../../components/launch-blocklet/center';\nimport AppInfo from './purchase-app';\nimport { getBlockletLogoUrl, getPathPrefix } from '../../libs/util';\n\nfunction RedirectPage({ blockletMeta }) {\n const { path } = useRouteMatch();\n const history = useHistory();\n const query = window.location.search;\n\n if (blockletMeta.isFree) {\n history.push(`${path}/agreement${query}`);\n return null;\n }\n\n history.push(`${path}/agreement${query}`);\n return null;\n}\n\nRedirectPage.propTypes = {\n blockletMeta: PropTypes.object.isRequired,\n};\n\nfunction Launcher() {\n const { path } = useRouteMatch();\n const { t, locale } = useLocaleContext();\n const query = useQuery();\n const { api } = useNodeContext();\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 } = await api.getBlockletMetaFromUrl({ input: { url, checkPrice: true } });\n if (!meta) {\n throw new Error(t('launchBlocklet.error.loadMetaFailed'));\n }\n\n return meta;\n });\n\n if (state.loading) {\n return (\n <Center>\n <Spinner />\n </Center>\n );\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 blockletMeta = state.value;\n let firstPageUrl = blockletMeta.isFree ? `${path}/agreement` : `${path}/purchase-app`;\n firstPageUrl = `${firstPageUrl}${window.location.search}`;\n const basePath = joinUrl(getPathPrefix(), path);\n\n const steps = [\n {\n key: 'app-info',\n name: t('launchBlocklet.purchaseApp'),\n path: joinUrl(basePath, 'purchase-app'),\n optional: true,\n },\n {\n key: 'agreement',\n name: t('launchBlocklet.agreement'),\n path: joinUrl(basePath, 'agreement'),\n },\n {\n key: 'install',\n name: t('launchBlocklet.launch'),\n path: joinUrl(basePath, 'install'),\n },\n {\n key: 'complete',\n name: t('launchBlocklet.complete'),\n path: joinUrl(basePath, 'complete'),\n },\n ];\n blockletMeta.registryUrl = new URL(url).origin;\n\n return (\n <StepProvider steps={steps}>\n <Layout\n locale={locale}\n blockletMeta={blockletMeta}\n headerEndAddons={\n <>\n <LocaleSelector size={26} showText={false} className=\"locale-addon\" />\n </>\n }\n logoUrl={getBlockletLogoUrl({\n did: blockletMeta.did,\n baseUrl: blockletMeta.registryUrl,\n logoPath: blockletMeta.logo,\n })}>\n <Content>\n <Switch>\n <Redirect exact path={path} to={firstPageUrl} />\n <Route exact path={`${path}/purchase-app`}>\n <AppInfo blockletMeta={blockletMeta} />\n </Route>\n <Route exact path={`${path}/agreement`}>\n <Agreement />\n </Route>\n <Route exact path={`${path}/install`}>\n <Install blockletMeta={blockletMeta} />\n </Route>\n <Route exact path={`${path}/complete`}>\n <Complete blockletMeta={blockletMeta} />\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 width: 300px;\n }\n`;\n\nexport default function BlockletLauncher() {\n return <Launcher />;\n}\n","/* eslint-disable no-await-in-loop */\nconst get = require('lodash/get');\n\nconst forEachBlocklet = (blocklet, cb, { parallel = false, sync } = {}) => {\n // sync\n if (sync) {\n cb(blocklet);\n if (blocklet.children) {\n for (const child of blocklet.children) {\n cb(child);\n }\n }\n return null;\n }\n\n // serial\n if (!parallel) {\n return (async () => {\n await cb(blocklet);\n if (blocklet.children) {\n for (const child of blocklet.children) {\n await cb(child);\n }\n }\n return null;\n })();\n }\n\n // parallel\n const tasks = [];\n tasks.push(cb(blocklet));\n if (blocklet.children) {\n for (const child of blocklet.children) {\n tasks.push(cb(child));\n }\n }\n return Promise.all(tasks);\n};\n\nconst isAuthServiceEnabled = (blocklet) => {\n const interfaces = get(blocklet, 'meta.interfaces') || [];\n const isRootEnabled = interfaces.some((x) => {\n const services = get(x, 'services') || [];\n return services.some((s) => s.name === '@abtnode/auth-service');\n });\n\n if (isRootEnabled) {\n return true;\n }\n\n const children = get(blocklet, 'children') || [];\n for (const child of children) {\n if (isAuthServiceEnabled(child)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst getRequiredMissingConfigs = (blocklet) => {\n const missingConfigs = [];\n const configs = blocklet.configs || [];\n configs.forEach((item) => {\n if (item.required && !item.value) {\n missingConfigs.push({ did: blocklet.meta.did, key: item.key });\n }\n });\n\n // eslint-disable-next-line no-restricted-syntax\n for (const child of blocklet.children || []) {\n const childConfigs = child.configs || [];\n // configProp does not exist in root blocklet config\n // or value of configProp in root blocklet config is empty.\n childConfigs.forEach((x) => {\n if (x.required && !x.value && !configs.some((y) => y.key === x.key && y.value)) {\n missingConfigs.push({ did: child.meta.did, key: x.key });\n }\n });\n }\n\n return missingConfigs;\n};\n\nconst isFreeBlocklet = (meta) => {\n if (!meta.payment) {\n return true;\n }\n\n const priceList = (meta.payment.price || []).map((x) => x.value || 0);\n return priceList.every((x) => x === 0);\n};\n\nconst wipeSensitiveData = (blocklet) => {\n if (!blocklet) {\n return blocklet;\n }\n\n forEachBlocklet(\n blocklet,\n (d) => {\n (d.configs || []).forEach((x) => {\n if (x.secure) {\n x.value = x.value ? '__encrypted__' : '';\n }\n });\n (d.environments || []).forEach((x) => {\n if (['BLOCKLET_APP_SK'].includes(x.key)) {\n x.value = '__encrypted__';\n }\n });\n\n delete blocklet.configObj;\n delete blocklet.environmentObj;\n },\n { sync: true }\n );\n\n return blocklet;\n};\n\nconst isDeletableBlocklet = (blocklet) => {\n if (!blocklet) {\n return false;\n }\n\n const config = blocklet.environments.find((x) => x.key === 'BLOCKLET_DELETABLE');\n if (!config) {\n return true;\n }\n\n return config.value === 'yes';\n};\n\nmodule.exports = {\n isFreeBlocklet,\n isDeletableBlocklet,\n forEachBlocklet,\n isAuthServiceEnabled,\n getRequiredMissingConfigs,\n wipeSensitiveData,\n};\n"],"sourceRoot":""}
|