@abtnode/webapp 1.6.21 → 1.6.22
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/README.md +8 -0
- package/blocklet.js +9 -9
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +20 -20
- package/build/index.html +1 -1
- package/build/{precache-manifest.bb40ca7060118e6294a11143b5925873.js → precache-manifest.1307cc8850971081e70fdec51fd865a3.js} +18 -18
- package/build/service-worker.js +1 -1
- package/build/static/js/16.29ff8823.chunk.js +2 -0
- package/build/static/js/16.29ff8823.chunk.js.map +1 -0
- package/build/static/js/19.792be34a.chunk.js +2 -0
- package/build/static/js/19.792be34a.chunk.js.map +1 -0
- package/build/static/js/24.34e707e0.chunk.js +2 -0
- package/build/static/js/24.34e707e0.chunk.js.map +1 -0
- package/build/static/js/{7.8da1bf38.chunk.js → 7.5c8e7c53.chunk.js} +3 -3
- package/build/static/js/{7.8da1bf38.chunk.js.LICENSE.txt → 7.5c8e7c53.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/7.5c8e7c53.chunk.js.map +1 -0
- package/build/static/js/9.6f93f882.chunk.js +3 -0
- package/build/static/js/{9.48cc9dac.chunk.js.LICENSE.txt → 9.6f93f882.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/9.6f93f882.chunk.js.map +1 -0
- package/build/static/js/main.0aaea1be.chunk.js +2 -0
- package/build/static/js/main.0aaea1be.chunk.js.map +1 -0
- package/build/static/js/runtime-main.5d59c7da.js +2 -0
- package/build/static/js/{runtime-main.f51e8093.js.map → runtime-main.5d59c7da.js.map} +1 -1
- package/package.json +1 -1
- package/build/static/js/16.317138b4.chunk.js +0 -2
- package/build/static/js/16.317138b4.chunk.js.map +0 -1
- package/build/static/js/19.d154b681.chunk.js +0 -2
- package/build/static/js/19.d154b681.chunk.js.map +0 -1
- package/build/static/js/24.a5f785c7.chunk.js +0 -2
- package/build/static/js/24.a5f785c7.chunk.js.map +0 -1
- package/build/static/js/7.8da1bf38.chunk.js.map +0 -1
- package/build/static/js/9.48cc9dac.chunk.js +0 -3
- package/build/static/js/9.48cc9dac.chunk.js.map +0 -1
- package/build/static/js/main.7a635cb3.chunk.js +0 -2
- package/build/static/js/main.7a635cb3.chunk.js.map +0 -1
- package/build/static/js/runtime-main.f51e8093.js +0 -2
|
@@ -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"],"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","BlockletPurchase","meta","mode","onCancel","installOpts","useLocaleContext","t","locale","useNodeContext","info","gql","api","useSessionContext","classes","action","setAction","step","setStep","webWalletUrl","getWebWalletUrl","onSelect","act","a","onNext","payload","type","blockletDid","registryUrl","blockletRegistry","startSession","input","data","JSON","stringify","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","tabPanel","map","x","button","key","selected","onClick","color","colors","primary","main","fontSize","secondary","rounded","disabled","variant","marginTop","component","message","getMessage","defaultProps","rootDid","mountPoint","forwardRef","InstallOrUpgrade","showPay","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","permission","hasPermission","push","configs","some","required","value","marginLeft","Stats","stats","useContext","LocaleContext","downloads","Div","name","star","styled","Typography","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","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"],"mappings":"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","file":"static/js/24.34e707e0.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, installOpts }) {\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 let payload;\n if (installOpts && installOpts.type === 'component') {\n payload = { ...installOpts, blockletDid: meta.did, action };\n } else {\n payload = { registryUrl: info.blockletRegistry, blockletDid: meta.did, action };\n }\n\n const { session: initial } = await gql.startSession({ input: { data: JSON.stringify(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 cb.searchParams.set('did', meta.did);\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 installOpts: PropTypes.object,\n};\n\nBlockletPurchase.defaultProps = {\n installOpts: {\n // blocklet: install blocklet. component: install blocklet component\n type: 'blocklet',\n\n // component install params\n rootDid: '',\n mountPoint: '',\n url: '',\n },\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';\nimport { ActionButton } from '@arcblock/ux/lib/Blocklet';\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({ showPay, 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 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 <ActionButton>\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 </ActionButton>\n\n {installed && requirePurchase && showPay && (\n <Typography component=\"small\" style={{ fontSize: 12, color: '#666', marginLeft: 4 }}>\n {t('blocklet.status.purchased')}\n </Typography>\n )}\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 showPay: PropTypes.bool,\n registryUrl: PropTypes.string.isRequired,\n};\n\nInstallOrUpgrade.defaultProps = {\n lastVersion: '',\n showPay: true,\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 {htmlAst ? renderAst(htmlAst) : t('store.detail.empty')}\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 showPay={false}\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 }\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"],"sourceRoot":""}
|