@abtnode/webapp 1.6.10 → 1.6.14
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 +18 -18
- package/build/index.html +1 -1
- package/build/{precache-manifest.4ebb2e70b7f40bbffcb9c15b4a0a3567.js → precache-manifest.8160f7a6905012f6d2b9083c688c5273.js} +16 -16
- package/build/service-worker.js +1 -1
- package/build/static/js/{15.da775437.chunk.js → 15.403af260.chunk.js} +1 -1
- package/build/static/js/{15.da775437.chunk.js.map → 15.403af260.chunk.js.map} +1 -1
- package/build/static/js/19.41a7de9e.chunk.js +2 -0
- package/build/static/js/19.41a7de9e.chunk.js.map +1 -0
- package/build/static/js/6.0f4641da.chunk.js +3 -0
- package/build/static/js/{6.573ea107.chunk.js.LICENSE.txt → 6.0f4641da.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/6.0f4641da.chunk.js.map +1 -0
- package/build/static/js/8.b76851ef.chunk.js +3 -0
- package/build/static/js/{8.378ea0cc.chunk.js.LICENSE.txt → 8.b76851ef.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{8.378ea0cc.chunk.js.map → 8.b76851ef.chunk.js.map} +1 -1
- package/build/static/js/main.3a4f2117.chunk.js +2 -0
- package/build/static/js/main.3a4f2117.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.eb2b4e6c.js → runtime-main.75ac0b98.js} +2 -2
- package/build/static/js/{runtime-main.eb2b4e6c.js.map → runtime-main.75ac0b98.js.map} +1 -1
- package/package.json +1 -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/6.573ea107.chunk.js +0 -3
- package/build/static/js/6.573ea107.chunk.js.map +0 -1
- package/build/static/js/8.378ea0cc.chunk.js +0 -3
- package/build/static/js/main.11941b8b.chunk.js +0 -2
- package/build/static/js/main.11941b8b.chunk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../mocks/lib/jspdf.js","components/router/rule/action/config-routing-rule.js","components/passport-tag.js","components/blocklet/service-tags.js","components/blocklet/interface.js","components/router/rule/domain-status.js","components/router/rule/action/add-domain-alias.js","components/router/rule/action/add-rule.js","components/router/rule/action/update-domain-security.js","components/router/rule/action/delete-domain-alias.js","components/router/rule/action/update-rule.js","components/router/rule/action/delete-rule.js","components/switch-control.js","components/notifications/leave-page-prompt.js","components/node/form.js","components/settings/basic.js","components/access-key/create.js","components/access-key/confirm.js","components/access-key/delete.js","components/access-key/update.js","components/settings/access-key.js","components/webhook/delete.js","components/settings/webhook.js","components/danger-zone.js","components/node/upgrade/confirm.js","components/node/upgrade/check.js","components/settings/about.js","components/router/rule/action/add-domain.js","components/router/rule/action/delete-domain.js","components/router/rule/action/update-domain.js","components/router/rule/action/index.js","components/router/rule/item.js","components/router/router-setting.js","components/router/rule/action/update-cert/nginx.js","components/router/rule/action/delete-cert.js","components/router/rule/action/detail-cert.js","components/router/rule/action/matched-sites.js","components/router/cert-setting.js","pages/settings/index.js","hooks/mobile-width.js","components/confirm.js","components/click-to-copy.js","components/table-icons.js","components/table.js","components/blocklet/status.js","components/dot.js","components/router/rule/action/utils/index.js","components/tag.js","components/delete-confirm.js","hooks/persistent-sort.js","contexts/domain-status.js"],"names":["module","exports","ConfigRoutingRule","params","blocklets","setParams","setError","serviceTypes","t","useLocaleContext","redirectCodesMap","302","301","sortedBlocklets","sortBy","x","meta","name","getParamsOnBlockletChange","did","blocklet","find","webInterface","get","type","BLOCKLET_INTERFACE_TYPE_WEB","getWebInterface","selected","port","ports","internal","pathPrefix","prefix","BLOCKLET_DYNAMIC_PATH_PREFIX","getParamsFromInterface","interfaceName","useEffect","ROUTING_RULE_TYPES","BLOCKLET","__disableConfirm","select","label","autoComplete","variant","data-cy","fullWidth","value","onChange","e","target","style","marginBottom","SelectProps","map","key","version","marginLeft","status","length","REDIRECT","redirectCode","Object","keys","code","autoFocus","url","helperText","trim","defaultProps","NONE","PassportTag","props","passport","onDelete","rest","Tag","title","className","onClick","styled","span","useStyles","makeStyles","tooltip","maxWidth","ServiceTags","classes","Array","isArray","services","upperCase","replace","content","config","entries","d","join","String","filter","sort","a","b","aKey","bKey","localeCompare","Tooltip","interactive","paddingRight","Flex","flexShrink","width","textAlign","marginRight","margin","cursor","fill","div","BlockletInterface","useContext","LocaleContext","locale","interfaces","EmptyTipOut","to","checkIsWildcardDomain","encodeWildcardDomain","Container","href","appendParams","Certificate","certificate","React","useState","anchorEl","setAnchorEl","node","useNodeContext","handlePopoverClose","open","Boolean","aria-owns","undefined","onMouseEnter","event","currentTarget","onMouseLeave","color","fontSize","id","pointerEvents","anchorOrigin","vertical","horizontal","transformOrigin","onClose","disableRestoreFocus","display","src","alt","maxHeight","component","fontWeight","domain","formatToDate","validFrom","validTo","DomainStatus","filters","useDomainStatusContext","shouldCheckDomainStatus","window","location","hostname","domainIcon","httpsIcon","isHttps","matchedCert","dns","resolved","ip","items","propTypes","PropTypes","string","isRequired","array","AddDomainAlias","onActivate","children","actions","useRoutingContext","loading","setLoading","confirmSetting","setConfirmSetting","DOMAIN_FOR_DEFAULT_SITE","onConfirm","addDomainAlias","onEnter","confirm","formatError","setting","description","inputProps","errMsg","validateDomain","onKeyPress","preventDefault","cancel","onCancel","onMenuItemClick","stopPropagation","size","AddRule","onRuleAdded","validateRule","err","rule","from","addRule","disable","validateResult","validatePathPrefix","getInitialBlockletDid","UpdateDomainSecurity","corsAllowedOrigins","isSpecialDomain","text","endsWith","BLOCKLET_SITE_GROUP_SUFFIX","updateSite","split","DeleteDomainAlias","domainAlias","deleteDomainAlias","console","error","rounded","edge","UpdateRule","parent","updateRule","DeleteRule","siteId","deleteRule","keyName","confirmPlaceholder","withStyles","theme","root","height","padding","spacing","switchBase","transform","palette","common","white","backgroundColor","opacity","border","thumb","track","borderRadius","grey","transition","transitions","create","checked","focusVisible","Switch","focusVisibleClassName","disableRipple","RouterPrompt","confirmPrompt","setConfirmPrompt","onPromptDialogCancel","onPromptDialogConfirm","env","apiPrefix","history","push","pathname","substring","reload","Div","message","args","settings","breakpoints","values","sm","initDefaultValues","info","webWalletUrl","diskAlertThreshold","ConfigForm","onSaved","submit","disabled","useForm","defaultValues","register","handleSubmit","errors","formState","reset","warning","setWarning","autoUpgrade","setAutoUpgrade","enableWelcomePage","setEnableWelcomePage","setCurrent","w","isDirty","onSubmit","data","getClient","updateNodeInfo","input","result","sleep","noValidate","Typography","permission","hasPermission","TextField","placeholder","inputRef","validate","onFocus","min","max","FormControlLabel","control","marginTop","BasicSettings","refresh","setMessage","silent","Box","mb","CreateAccessKey","remark","onCreate","client","roles","RBAC_CONFIG","ROLES","OWNER","createAccessKey","res","FormControl","InputLabel","Select","r","MenuItem","ConfirmAccessKey","accessKeyId","accessKeySecret","setChecked","hideAccessSecret","setHideAccessSecret","disableBackdropClick","disableEscapeKeyDown","showCloseButton","aria-labelledby","Bold","Item","Label","Checkbox","labelPlacement","DeleteAccessKey","formatTime","time","deleteAccessKey","formatToDatetime","timeAge","format","Date","formatLocale","UpdateAccessKey","onUpdate","updateAccessKey","AccessKey","api","confirmInfo","setConfirmInfo","state","useAsyncRetry","getAccessKeys","response","list","usePersistentSort","sortDirections","onSortChange","columns","field","defaultSort","render","p","whiteSpace","createdAt","lastUsedAt","sorting","align","item","retry","severity","show","icons","tableIcons","options","emptyRowsWhenPaging","actionsColumnIndex","tableLayout","maxBodyHeight","pageSize","onOrderChange","localization","body","emptyDataSourceMessage","deleteWebHook","HookSetting","enqueueSnackbar","useSnackbar","buttonAnchorRef","useRef","defaultConfig","setDefaultConfig","setOpen","Promise","all","getWebHooks","getWebhookSenders","webhooks","senders","createWebHook","autoHideDuration","onSetWebHook","inputList","Main","index","Form","defaultValue","required","trimValue","checkInputByType","some","webhookIcon","onSendTestNotification","rowInfo","webhookId","sendTestMessage","desc","alignItems","Number","SendIconInfo","ref","preOpen","Popper","current","disablePortal","placement","zIndex","Paper","ClickAwayListener","onClickAway","contains","ListItemText","primary","secondary","SendIcon","DangerItem","gutterBottom","DangerZone","ConfirmUpgrade","nextVersion","upgradeNodeVersion","UpgradeCheck","onDone","showCancel","onCheck","checkNodeVersion","IconButton","aria-label","About","useHistory","nodeInfo","extra","getNodeEnv","assign","rows","nodeOwner","os","docker","gitpod","blockletEngines","visible","available","forEach","displayName","can","my","justifyContent","flexDirection","showText","ml","valueComponent","nameWidth","mt","AddDomain","bInterface","rules","addSite","setValue","validateSite","URL","searchParams","DeleteDomain","deleteSite","UpdateDomain","RuleItemAction","isProtected","mouseDown","onMouseDown","Menu","keepMounted","getContentAnchorEl","RedirectRule","toUrl","scheme","tmpToUrl","isUrl","NoneRule","RuleItem","useBlockletContext","domainsStatus","depth","ruleId","initialExpand","expand","domainAliases","setExpand","IconComponent","NodeIcon","DomainIcon","RuleIcon","DomainLink","primaryDomain","DASHBOARD","routing","adminPath","DomainElement","rel","ItemDiv","button","disableGutters","ListItemIcon","flex","ListItemSecondaryAction","Collapse","in","List","disablePadding","internalLink","DAEMON","dashboard","isHealthy","healthyTip","domainStatus","divider","paddingBottom","paddingLeft","wordBreak","ListItem","RouterPage","sites","allDomains","y","domains","main","md","lg","readFile","file","resolve","reject","reader","FileReader","readAsText","onload","onerror","UpdateNginxCert","onRefresh","mode","restProps","keyFile","setKeyFile","pemFile","setPemFile","certSource","setCertSource","public","watch","submitUpload","pem","addNginxHttpsCert","privateKey","updateNginxHttpsCert","certSources","upload","lets_encrypt","issueLetsEncryptCert","source","Error","Upload","onDropRejected","files","useDropzone","accept","multiple","maxSize","onDrop","acceptedFiles","getPemRootProps","getRootProps","getPemInputProps","getInputProps","getKeyRootProps","getKeyInputProps","LetsEncrypt","minWidth","DialogContentText","RadioGroup","Radio","onBlur","tName","DeleteCert","refreshRoutingContext","deleteNginxHttpsCert","DetailCert","useTheme","certBasicRows","matchedSites","s","updatedAt","certInfoRows","moment","duration","humanize","row","Divider","MatchedSites","showMore","setShowMore","listStyle","slice","isExpired","expiresTime","ExpiresCell","Math","ceil","TableCellInfoRow","icon","TableCellContainer","Status","CertificateManager","getCertificates","certificates","nowrap","isPublic","noWrap","Set","search","pageSizeOptions","headerStyle","Settings","NodeContext","useParams","tab","tabs","renders","basic","accesskey","AccessKeySettings","integration","WebHookSetting","about","router","RouterSettings","cert","CertSetting","TabComponent","newTab","scrollButtons","useMobileWidth","useMediaQuery","down","ConfirmDialog","initialParams","changeLocale","onCallback","cb","isBreakpointsDownSm","StyledDialog","fullScreen","DialogTitle","DialogContent","Alert","DialogActions","Dialog","ClickToCopy","tip","copiedTip","Add","Check","Delete","Edit","Clear","DetailPanel","NextPage","Filter","FirstPage","LastPage","PreviousPage","Search","ResetSearch","SortArrow","Export","ThirdStateCheck","ViewColumn","TableStyle","colors","BlockletStatus","colorMap","added","waiting","downloading","downloaded","installing","installed","starting","running","stopping","stopped","upgrading","restarting","corrupted","inProgress","isInProgress","statusTxt","success","Dot","validateRuleByServiceType","localeContext","DEFAULT_IP_DNS_DOMAIN_SUFFIX","suffix","fromDid","CancelConfirm","dangerouslySetInnerHTML","__html","inputVal","initialDirections","useLocalStorage","setSortDirections","columnIndex","directionValue","newSortDirections","DomainStatusContext","createContext","Provider","Consumer","DomainStatusProvider","setStatus","useSubscription","pre","getDomainStatus","checkDomains","JSON","stringify"],"mappings":"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","file":"static/js/15.da775437.chunk.js","sourcesContent":["module.exports = {};\n","/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport sortBy from 'lodash/sortBy';\nimport get from 'lodash/get';\n\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX, BLOCKLET_INTERFACE_TYPE_WEB } from '@blocklet/meta/lib/constants';\n\nimport BlockletStatus from '../../../blocklet/status';\n\nconst getWebInterface = blocklet => {\n const list = get(blocklet, 'meta.interfaces') || [];\n return list.find(x => x.type === BLOCKLET_INTERFACE_TYPE_WEB);\n};\n\nexport default function ConfigRoutingRule({ params, blocklets, setParams, setError, serviceTypes }) {\n const { t } = useLocaleContext();\n\n const redirectCodesMap = {\n 302: t('common.redirectTemporary'),\n 301: t('common.redirectPermanently'),\n };\n\n const sortedBlocklets = sortBy(blocklets, x => x.meta.name);\n\n const getParamsFromInterface = (blocklet, selected) => {\n if (!selected) {\n return {};\n }\n\n let { port } = blocklet;\n if (selected && blocklet.ports && selected.port) {\n if (blocklet.ports[selected.port]) {\n port = blocklet.ports[selected.port];\n }\n if (blocklet.ports[selected.port.internal]) {\n port = blocklet.ports[selected.port.internal];\n }\n }\n\n // When the blocklet interface can only be mounted at a fixed path\n let { pathPrefix } = params;\n if (selected && selected.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX) {\n pathPrefix = selected.prefix;\n }\n\n return { port, pathPrefix };\n };\n\n const getParamsOnBlockletChange = did => {\n const blocklet = sortedBlocklets.find(x => x.meta.did === did);\n const webInterface = getWebInterface(blocklet);\n\n return { ...getParamsFromInterface(blocklet, webInterface), interfaceName: webInterface ? webInterface.name : '' };\n };\n\n useEffect(() => {\n if (!params.interfaceName && params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n setParams({ ...params, ...getParamsOnBlockletChange(params.did), __disableConfirm: false });\n }\n }, []); // eslint-disable-line\n\n return (\n <>\n <TextField\n select\n label={t('router.domain.add.type')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"type\"\n data-cy=\"domain-add-type\"\n fullWidth\n value={params.type}\n onChange={e => {\n setError('');\n setParams({ ...params, type: e.target.value, __disableConfirm: false });\n }}\n style={{ marginBottom: 32 }}\n SelectProps={{}}>\n {serviceTypes.map(({ name, value }) => (\n <MenuItem key={value} value={value}>\n {name}\n </MenuItem>\n ))}\n </TextField>\n {params.type === ROUTING_RULE_TYPES.BLOCKLET && (\n <>\n <TextField\n select\n label={t('router.domain.add.blocklet')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"did\"\n data-cy=\"domain-blocklet-select\"\n fullWidth\n value={params.did}\n onChange={e => {\n setParams({\n ...params,\n ...getParamsOnBlockletChange(e.target.value),\n did: e.target.value,\n __disableConfirm: false,\n });\n }}\n style={{ marginBottom: 32 }}>\n {sortedBlocklets.map(x => (\n <MenuItem key={x.meta.did} value={x.meta.did}>\n {`${x.meta.name} v${x.meta.version}`}\n <span style={{ marginLeft: 8 }}>\n <BlockletStatus status={x.status} />\n </span>\n </MenuItem>\n ))}\n {blocklets.length === 0 && (\n <MenuItem key=\"empty\" value=\"\">\n {t('common.empty')}\n </MenuItem>\n )}\n </TextField>\n </>\n )}\n {params.type === ROUTING_RULE_TYPES.REDIRECT && [\n <TextField\n select\n label={t('router.domain.add.redirect')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"type\"\n fullWidth\n value={params.redirectCode}\n onChange={e => setParams({ ...params, redirectCode: e.target.value })}\n style={{ marginBottom: 32 }}\n SelectProps={{}}>\n {Object.keys(redirectCodesMap).map(code => (\n <MenuItem key={code} value={code}>\n {`${redirectCodesMap[code]} - ${code}`}\n </MenuItem>\n ))}\n </TextField>,\n <TextField\n label={t('common.redirectUrl')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"url\"\n data-cy=\"redirect-url-input\"\n fullWidth\n autoFocus\n value={params.url}\n helperText={t('router.urlHelperText')}\n style={{ marginBottom: 32 }}\n onChange={e => {\n setParams({ ...params, url: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('router.validation.redirectUrlRequired'));\n } else {\n setError('');\n }\n }}\n />,\n ]}\n </>\n );\n}\n\nConfigRoutingRule.propTypes = {\n params: PropTypes.object,\n blocklets: PropTypes.array,\n serviceTypes: PropTypes.array,\n setParams: PropTypes.func,\n setError: PropTypes.func,\n};\n\nConfigRoutingRule.defaultProps = {\n params: {},\n blocklets: [],\n serviceTypes: [\n { name: 'Blocklet', value: ROUTING_RULE_TYPES.BLOCKLET },\n { name: 'Redirect', value: ROUTING_RULE_TYPES.REDIRECT },\n { name: 'Default - User will see the 404 page', value: ROUTING_RULE_TYPES.NONE },\n ],\n setParams: () => {},\n setError: () => {},\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nexport default function PassportTag(props) {\n const { passport, onDelete, ...rest } = props;\n return (\n <Tag {...rest}>\n {passport.title || passport.name}{' '}\n {!!onDelete && <CloseIcon data-cy=\"delete-issuance\" className=\"delete\" onClick={onDelete} />}\n </Tag>\n );\n}\n\nPassportTag.propTypes = {\n passport: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nPassportTag.defaultProps = {\n onDelete: null,\n};\n\nconst Tag = styled.span`\n display: inline-flex;\n padding: 2px 8px;\n background: #4f6af6;\n border-radius: 4px;\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n color: #fff;\n align-items: center;\n .delete {\n font-size: 1em;\n margin-left: 6px;\n cursor: pointer;\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport upperCase from 'lodash/upperCase';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport DidLogo from '@arcblock/icons/lib/DidLogo';\n\nconst useStyles = makeStyles(() => ({\n tooltip: {\n maxWidth: 'none',\n },\n}));\n\nexport default function ServiceTags({ meta }) {\n const classes = useStyles();\n if (!meta || !Array.isArray(meta.services)) {\n return null;\n }\n\n return meta.services.map(x => {\n const name = upperCase(x.name.replace(/^@abtnode\\//, '').replace(/-service$/, ''));\n const formatValue = value => (Array.isArray(value) ? value.join(', ') : String(value));\n\n let content = [];\n if (x.config) {\n content = Object.entries(x.config)\n .map(d => {\n d[1] = formatValue(d[1]);\n return d;\n })\n .filter(d => d[1])\n .sort((a, b) => {\n const aKey = a[0] || '';\n const bKey = b[0] || '';\n\n return aKey.localeCompare(bKey);\n });\n }\n\n return (\n <Tooltip\n interactive\n classes={{ tooltip: classes.tooltip }}\n title={\n // eslint-disable-next-line react/jsx-wrap-multilines\n <div style={{ paddingRight: 20 }}>\n {content.map(([key, value]) => (\n <Flex>\n <div style={{ flexShrink: 0, width: 150, textAlign: 'right', marginRight: 10 }}>{`${key}:`}</div>\n <div>{value}</div>\n </Flex>\n ))}\n </div>\n }>\n <Tag style={{ margin: '0 4px', cursor: 'pointer' }} type=\"success\">\n {name === 'AUTH' && <DidLogo style={{ marginRight: 4, fill: 'rgb(91, 144, 37)' }} />}\n {name}\n </Tag>\n </Tooltip>\n );\n });\n}\n\nServiceTags.propTypes = {\n meta: PropTypes.object.isRequired,\n};\n\nconst Flex = styled.div`\n display: flex;\n margin: 4px 0;\n`;\n","import React, { useContext } from 'react';\nimport { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport ExternalLink from '@material-ui/core/Link';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { BLOCKLET_INTERFACE_TYPE_WEB } from '@blocklet/meta/lib/constants';\n\nimport { appendParams, checkIsWildcardDomain, encodeWildcardDomain } from '../../libs/util';\nimport ServiceTags from './service-tags';\n\nexport default function BlockletInterface({ blocklet, ...props }) {\n const { t, locale } = useContext(LocaleContext);\n\n if (blocklet.status !== 'running') {\n return null;\n }\n\n // eslint-disable-next-line no-nested-ternary\n const webInterface = (blocklet.interfaces || []).find(x => x.type === BLOCKLET_INTERFACE_TYPE_WEB);\n\n if (!webInterface) {\n return (\n <EmptyTipOut>\n {t('blocklet.urlEmptyTip')}\n <Link to={`/router/rules?fromDid=${blocklet.meta.did}`} className=\"interface-link\">\n {t('blocklet.goToAddRule')}\n </Link>\n </EmptyTipOut>\n );\n }\n\n const { name, url } = webInterface;\n\n if (checkIsWildcardDomain(url)) {\n return encodeWildcardDomain(url, locale);\n }\n\n return (\n <Container {...props}>\n <Flex>\n <ExternalLink href={appendParams(url, { locale })} target=\"_blank\" className=\"blocklet-interface\">\n {t('common.open')}\n </ExternalLink>\n <ServiceTags meta={blocklet.meta.interfaces.find(x => x.name === name)} />\n </Flex>\n </Container>\n );\n}\n\nBlockletInterface.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Flex = styled.div`\n display: flex;\n margin: 4px 0;\n`;\n\nconst EmptyTipOut = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Container = styled.div`\n .blocklet-interface {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n white-space: nowrap;\n\n img {\n margin-right: 4px;\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport HttpsIcon from '@material-ui/icons/Https';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Popover from '@material-ui/core/Popover';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport VerifiedDot from '../../dot';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useDomainStatusContext } from '../../../contexts/domain-status';\nimport { formatToDate, shouldCheckDomainStatus, checkIsWildcardDomain } from '../../../libs/util';\n\nfunction Certificate({ certificate }) {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const node = useNodeContext();\n const { t } = useLocaleContext();\n\n const handlePopoverOpen = event => {\n setAnchorEl(event.currentTarget);\n };\n\n const handlePopoverClose = () => {\n setAnchorEl(null);\n };\n\n const open = Boolean(anchorEl);\n\n return (\n <>\n <HttpsIcon\n aria-owns={open ? 'mouse-over-popover' : undefined}\n onMouseEnter={handlePopoverOpen}\n onMouseLeave={handlePopoverClose}\n style={{ color: '#44cdc6', fontSize: 20, marginLeft: 8, cursor: 'pointer' }}\n />\n <Popover\n id=\"mouse-over-popover\"\n style={{ pointerEvents: 'none' }}\n open={open}\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n onClose={handlePopoverClose}\n disableRestoreFocus>\n <Card>\n <CardContent style={{ display: 'flex' }}>\n <div>\n <img\n src={`${node.prefix}/https-certificate-icon.png`}\n alt=\"certificate icon\"\n style={{ maxHeight: '100%', maxWidth: '100%' }}\n />\n </div>\n <Typography component=\"div\" style={{ marginLeft: '16px' }}>\n <Typography component=\"div\" style={{ fontWeight: 'bolder' }}>\n {certificate.domain}\n </Typography>\n <Typography component=\"div\">\n {`${t('common.issuer')}: ${get(certificate, 'issuer.commonName', '')}`}\n </Typography>\n <Typography component=\"div\">\n {`${t('router.cert.issuedOn')}: ${formatToDate(certificate.validFrom)}`}\n </Typography>\n <Typography component=\"div\">\n {`${t('router.cert.expiryOn')}: ${formatToDate(certificate.validTo)}`}\n </Typography>\n </Typography>\n </CardContent>\n </Card>\n </Popover>\n </>\n );\n}\n\nCertificate.propTypes = {\n certificate: PropTypes.object,\n};\n\nCertificate.defaultProps = {\n certificate: {},\n};\n\nexport default function DomainStatus(props) {\n const { name, type, filters } = props;\n const { t } = useLocaleContext();\n const { status } = useDomainStatusContext();\n\n if (type !== 'domain') {\n return null;\n }\n\n if (!shouldCheckDomainStatus(name)) {\n return null;\n }\n\n if (name === window.location.hostname) {\n return null;\n }\n\n let domainIcon = null;\n let httpsIcon = null;\n\n const { isHttps, matchedCert } = status[name] || {};\n\n if (!checkIsWildcardDomain(name)) {\n const { dns: { resolved, ip } = {} } = status[name] || {};\n if (resolved || ip === '127.0.0.1') {\n domainIcon = (\n <Tooltip title={t('router.domain.verify.ok')}>\n <VerifiedDot color=\"success\" />\n </Tooltip>\n );\n } else {\n domainIcon = (\n <Tooltip title={t('router.domain.verify.notResolved')}>\n <VerifiedDot color=\"error\" />\n </Tooltip>\n );\n }\n }\n\n if (isHttps) {\n httpsIcon = <Certificate certificate={matchedCert} />;\n } else {\n httpsIcon = (\n <Tooltip title={t('router.domain.https.bad')}>\n <HttpsIcon style={{ color: '#D0021B', fontSize: 20, marginLeft: 8, cursor: 'pointer' }} />\n </Tooltip>\n );\n }\n\n const items = filters.map(x => {\n if (x === 'domain') {\n return domainIcon;\n }\n if (x === 'http') {\n return httpsIcon;\n }\n return null;\n });\n\n return <>{items}</>;\n}\n\nDomainStatus.propTypes = {\n type: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n filters: PropTypes.array,\n};\n\nDomainStatus.defaultProps = {\n filters: ['domain', 'http'],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/CallMerge';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, DOMAIN_FOR_DEFAULT_SITE } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { formatError } from '../../../../libs/util';\nimport { validateDomain } from './utils';\n\nexport default function AddDomainAlias({ id, name, onActivate, children, title }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n // 不允许给默认站点添加 Additional domain\n if (DOMAIN_FOR_DEFAULT_SITE === name) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.addDomainAlias(id, params.domain.trim());\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onEnter = async (params, confirm, setError) => {\n try {\n await confirm(params);\n } catch (err) {\n setError(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n const setting = {\n title: title || t('router.domainAlias.add.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domainAlias.add.domainDescription')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n data-cy=\"add-domain\"\n fullWidth\n autoFocus\n inputProps={{ 'data-cy': 'domain-name-input' }}\n value={params.domain}\n style={{ marginBottom: 32 }}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setParams({ ...params, domain, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n if (errMsg) {\n setError(errMsg);\n } else {\n onEnter(params, onConfirm, setError);\n }\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n domain: '',\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-domain-alias\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domainAlias.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddDomainAlias.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n title: PropTypes.string,\n};\n\nAddDomainAlias.defaultProps = {\n onActivate: () => {},\n children: null,\n title: '',\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Link';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { validateRule, validatePathPrefix, getInitialBlockletDid } from './utils';\nimport ConfigRoutingRule from './config-routing-rule';\n\nexport default function AddRule({ id, blocklets, onActivate = () => {}, onRuleAdded = () => {}, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n const err = await validateRule(params, t);\n if (err) {\n throw err;\n }\n setLoading(true);\n\n const rule = {\n from: {\n pathPrefix: params.pathPrefix.trim(),\n },\n to: {\n type: params.type,\n },\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url.trim();\n rule.to.redirectCode = params.redirectCode;\n }\n\n await actions.addRule(id, rule);\n setConfirmSetting(null);\n setLoading(false);\n onRuleAdded();\n };\n\n const setting = {\n title: t('router.rule.add.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n const validateResult = validateRule(value, t);\n if (validateResult) {\n setParams({ ...value, __disableConfirm: true });\n return;\n }\n\n setParams({ ...value });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.rule.add.pathPrefix')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"pathPrefix\"\n data-cy=\"path-prefix-input\"\n fullWidth\n autoFocus\n helperText={t('router.rule.add.pathPrefixTip')}\n style={{ marginBottom: 32 }}\n value={params.pathPrefix}\n onChange={e => {\n let disable = false;\n const validateResult = validatePathPrefix({\n params: { ...params, pathPrefix: e.target.value },\n blocklets,\n });\n\n setError(validateResult);\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET && validateResult) {\n disable = true;\n }\n\n if (params.type === ROUTING_RULE_TYPES.REDIRECT && !params.url) {\n disable = true;\n }\n\n if (!e.target.value.trim()) {\n disable = true;\n setError(t('router.validation.pathPrefixRequired'));\n }\n if (!disable) {\n setError('');\n }\n setParams({ ...params, pathPrefix: e.target.value, __disableConfirm: disable });\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.rule.add.confirm'),\n cancel: t('common.cancel'),\n params: {\n pathPrefix: '',\n type: ROUTING_RULE_TYPES.BLOCKLET,\n did: getInitialBlockletDid(blocklets),\n port: '',\n interfaceName: '',\n redirectCode: 302,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddRule.propTypes = {\n id: PropTypes.string.isRequired,\n blocklets: PropTypes.array,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n onRuleAdded: PropTypes.func,\n};\n\nAddRule.defaultProps = {\n onActivate: () => {},\n onRuleAdded: () => {},\n children: null,\n blocklets: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { BLOCKLET_SITE_GROUP_SUFFIX } from '@abtnode/constant';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\n\nexport default function UpdateDomainSecurity({ id, name, corsAllowedOrigins, onActivate, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n let text = name;\n if (name.endsWith(BLOCKLET_SITE_GROUP_SUFFIX)) {\n text = `${t('common.the')} Blocklet`;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.updateSite(id, { corsAllowedOrigins: params.corsAllowedOrigins.split(',').map(x => x.trim()) });\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domainSecurity.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domainSecurity.cors.title', { name: text })}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"corsAllowedOrigins\"\n fullWidth\n autoFocus\n value={params.corsAllowedOrigins}\n style={{ marginBottom: 32 }}\n helperText={t('router.domainSecurity.cors.description', { name: text })}\n onChange={e => {\n setParams({ ...params, corsAllowedOrigins: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('router.domainSecurity.cors.domainInvalid'));\n } else {\n setError('');\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n corsAllowedOrigins: Array.isArray(corsAllowedOrigins) ? corsAllowedOrigins.join(', ') : name,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-update-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domainSecurity.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nUpdateDomainSecurity.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n corsAllowedOrigins: PropTypes.string,\n};\n\nUpdateDomainSecurity.defaultProps = {\n onActivate: () => {},\n children: null,\n corsAllowedOrigins: '',\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../../confirm';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nexport default function DeleteDomainAlias(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, domainAlias, onDelete, children } = props;\n const { actions } = useRoutingContext();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await actions.deleteDomainAlias(id, domainAlias);\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: t('router.domainAlias.delete.title'),\n description: t('router.domainAlias.delete.description'),\n confirm: t('common.confirm'),\n onConfirm,\n onCancel,\n };\n\n const onClick = e => {\n e.stopPropagation();\n setConfirmSetting(setting);\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onClick })\n ) : (\n <Button\n rounded\n edge=\"end\"\n onClick={onClick}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\"\n data-cy=\"action-delete-domain-alias\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('router.domainAlias.delete.title')}\n </Button>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteDomainAlias.propTypes = {\n id: PropTypes.string.isRequired,\n domainAlias: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n children: PropTypes.any,\n};\n\nDeleteDomainAlias.defaultProps = {\n onDelete: () => {},\n children: null,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { validateRule, validatePathPrefix, getInitialBlockletDid } from './utils';\nimport ConfigRoutingRule from './config-routing-rule';\n\nexport default function UpdateRule(props) {\n const { id, name, did, parent, blocklets, to, children, onActivate } = props;\n\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n const err = await validateRule(params, t);\n if (err) {\n throw err;\n }\n setLoading(true);\n\n const rule = {\n id,\n from: {\n pathPrefix: params.pathPrefix.trim(),\n },\n to: {\n type: params.type,\n },\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url;\n rule.to.redirectCode = params.redirectCode;\n }\n\n await actions.updateRule(parent.id, rule);\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: t('router.rule.update.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n const validateResult = validateRule(value, t);\n if (validateResult) {\n setParams({ ...value, __disableConfirm: true });\n return;\n }\n setParams({ ...value });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.rule.add.pathPrefix')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"pathPrefix\"\n data-cy=\"path-prefix-input\"\n fullWidth\n autoFocus\n helperText={t('router.rule.add.pathPrefixTip')}\n style={{ marginBottom: 32 }}\n value={params.pathPrefix}\n onChange={e => {\n let disable = false;\n const validateResult = validatePathPrefix({\n params: { ...params, pathPrefix: e.target.value },\n blocklets,\n });\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET && validateResult) {\n disable = true;\n setError(validateResult);\n }\n if (params.type === ROUTING_RULE_TYPES.REDIRECT && !params.url) {\n disable = true;\n }\n if (!e.target.value.trim()) {\n disable = true;\n setError(t('router.validation.pathPrefixRequired'));\n }\n if (!disable) {\n setError('');\n }\n\n setParams({ ...params, pathPrefix: e.target.value, __disableConfirm: disable });\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.rule.update.confirm'),\n cancel: t('router.rule.update.cancel'),\n color: 'primary',\n params: {\n pathPrefix: name === '/' ? name : name.replace(/^\\/+/, '').replace(/\\/+$/, ''),\n type: to.type || ROUTING_RULE_TYPES.BLOCKLET,\n did: did || getInitialBlockletDid(blocklets),\n port: to.port || '',\n interfaceName: to.interfaceName || '',\n redirectCode: to.redirectCode || 302,\n url: to.url || '',\n __disableConfirm: false,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-update-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.update.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nUpdateRule.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n did: PropTypes.string,\n parent: PropTypes.object.isRequired,\n blocklets: PropTypes.array,\n to: PropTypes.object.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nUpdateRule.defaultProps = {\n onActivate: () => {},\n children: null,\n did: '',\n blocklets: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport DelConfirm from '../../../delete-confirm';\n\nexport default function DeleteRule(props) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const {\n id,\n parent: { id: siteId },\n name,\n children,\n onActivate,\n } = props;\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n await actions.deleteRule(siteId, id);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n keyName: name,\n title: t('router.rule.delete.title'),\n description: t('router.rule.delete.description', { name: `<b>${name}</b>` }),\n confirmPlaceholder: t('router.rule.delete.confirm_desc', { name }),\n confirm: t('common.delConfirm'),\n cancel: t('router.rule.delete.cancel'),\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-delete-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.delete.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteRule.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n parent: PropTypes.object.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nDeleteRule.defaultProps = {\n onActivate: () => {},\n children: null,\n};\n","import React from 'react';\n\nimport Switch from '@material-ui/core/Switch';\nimport { withStyles } from '@material-ui/core/styles';\n\nexport default withStyles(theme => ({\n root: {\n width: 42,\n height: 26,\n padding: 0,\n margin: theme.spacing(1),\n },\n switchBase: {\n padding: 1,\n '&$checked': {\n transform: 'translateX(16px)',\n color: theme.palette.common.white,\n '& + $track': {\n backgroundColor: '#52d869',\n opacity: 1,\n border: 'none',\n },\n },\n '&$focusVisible $thumb': {\n color: '#52d869',\n border: '6px solid #fff',\n },\n },\n thumb: {\n width: 24,\n height: 24,\n },\n track: {\n borderRadius: 26 / 2,\n border: `1px solid ${theme.palette.grey[400]}`,\n backgroundColor: theme.palette.grey[50],\n opacity: 1,\n transition: theme.transitions.create(['background-color', 'border']),\n },\n checked: {},\n focusVisible: {},\n}))(({ classes, ...props }) => (\n <Switch\n focusVisibleClassName={classes.focusVisible}\n disableRipple\n classes={{\n root: classes.root,\n switchBase: classes.switchBase,\n thumb: classes.thumb,\n track: classes.track,\n checked: classes.checked,\n }}\n {...props}\n />\n));\n","import React, { useState } from 'react';\nimport { Prompt } from 'react-router-dom';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport history from '../../libs/history';\nimport Confirm from '../confirm';\n\nexport default function RouterPrompt({ confirm }) {\n const [confirmPrompt, setConfirmPrompt] = useState(null);\n const { t } = useLocaleContext();\n\n const onPromptDialogCancel = () => {\n setConfirmPrompt(null);\n };\n\n const onPromptDialogConfirm = async location => {\n if (location) {\n let prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n if (prefix === '/') {\n history.push(`${location.pathname}`);\n } else {\n if (prefix.endsWith('/')) {\n prefix = prefix.substring(0, prefix.length - 1);\n }\n history.push(`${prefix}${location.pathname}`);\n }\n window.location.reload();\n }\n };\n\n const handlePrompt = (location, ...args) => {\n let settings = typeof confirm === 'function' ? confirm(location, ...args) : confirm;\n if (settings) {\n if (typeof settings === 'string') {\n settings = {\n description: settings,\n };\n }\n\n setConfirmPrompt({\n title: t('common.noticeTitle'),\n description: t('common.leavePageTip'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm: () => onPromptDialogConfirm(location),\n onCancel: () => onPromptDialogCancel(),\n ...settings,\n });\n return false;\n }\n return true;\n };\n\n return (\n <Div>\n <Prompt message={handlePrompt} />\n {confirmPrompt && (\n <Confirm\n title={confirmPrompt.title}\n description={confirmPrompt.description}\n confirm={confirmPrompt.confirm}\n cancel={confirmPrompt.cancel}\n params={confirmPrompt.params}\n onConfirm={confirmPrompt.onConfirm}\n onCancel={confirmPrompt.onCancel}\n />\n )}\n </Div>\n );\n}\n\nRouterPrompt.propTypes = {\n confirm: PropTypes.oneOfType([PropTypes.object, PropTypes.string, PropTypes.func]),\n};\n\nRouterPrompt.defaultProps = {\n confirm: null,\n};\n\nconst Div = styled.div`\n margin-bottom: 24px;\n .top-btns-alert {\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n flex-direction: column;\n padding-bottom: 15px;\n padding-right: 20px;\n }\n }\n .top-btns-action {\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n margin-right: 0px;\n }\n }\n`;\n","/* eslint-disable react/jsx-wrap-multilines */\n/* eslint-disable react/jsx-no-duplicate-props */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { useForm } from 'react-hook-form';\n\nimport TextField from '@material-ui/core/TextField';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Typography from '@material-ui/core/Typography';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport SwitchControl from '../switch-control';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { sleep, formatError } from '../../libs/util';\nimport getClient from '../../libs/node';\nimport LeavePagePrompt from '../notifications/leave-page-prompt';\nimport Permission from '../permission';\n\nconst initDefaultValues = info => ({\n name: info.name,\n description: info.description,\n webWalletUrl: info.webWalletUrl,\n diskAlertThreshold: info.diskAlertThreshold,\n});\n\nexport default function ConfigForm({ onSaved, title, submit, disabled, ...rest }) {\n const node = useNodeContext();\n const { t } = useLocaleContext();\n\n const { register, handleSubmit, errors, formState, reset } = useForm({\n defaultValues: initDefaultValues(node.info),\n });\n const [error, setError] = useState('');\n const [warning, setWarning] = useState('');\n const [loading, setLoading] = useState(false);\n const [autoUpgrade, setAutoUpgrade] = useState(node.info.autoUpgrade);\n const [enableWelcomePage, setEnableWelcomePage] = useState(!!node.info.enableWelcomePage);\n const [, setCurrent] = useState(null);\n\n useEffect(() => {\n let w = '';\n if (\n formState.isDirty || // eslint-disable-line\n autoUpgrade !== node.info.autoUpgrade || // eslint-disable-line\n enableWelcomePage !== !!node.info.enableWelcomePage\n ) {\n w = t('setting.unSavedTip');\n }\n setWarning(w);\n }, [t, node, autoUpgrade, enableWelcomePage, formState]);\n\n const onSubmit = async data => {\n setError('');\n setLoading(true);\n try {\n const result = await getClient().updateNodeInfo({\n input: {\n ...data,\n name: data.name.trim(),\n description: data.description.trim(),\n webWalletUrl: data.webWalletUrl.trim(),\n diskAlertThreshold: data.diskAlertThreshold,\n autoUpgrade,\n enableWelcomePage,\n },\n });\n await sleep(1000);\n\n reset(initDefaultValues(result.info));\n\n if (typeof onSaved === 'function') {\n onSaved(result);\n }\n } catch (err) {\n setError(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Div className=\"form-wrapper\" {...rest}>\n <form className=\"form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n {!!title && (\n <Typography component=\"h2\" variant=\"h5\" className=\"stepper-tip\">\n {title}\n </Typography>\n )}\n <Permission permission=\"mutate_node\">\n {hasPermission => (\n <>\n <TextField\n variant=\"outlined\"\n label={t('setting.form.name')}\n placeholder={t('setting.form.namePlaceholder')}\n disabled={loading || !hasPermission}\n data-cy=\"node-name-input\"\n error={errors.name && !!errors.name.message}\n inputRef={register({ validate: value => !!value.trim() || t('setting.form.nameRequired') })}\n inputProps={{ name: 'name', onFocus: () => setCurrent('name') }}\n helperText={errors.name ? errors.name.message : ''}\n margin=\"normal\"\n />\n <TextField\n variant=\"outlined\"\n label={t('setting.form.description')}\n placeholder={t('setting.form.descriptionHolder')}\n disabled={loading || !hasPermission}\n data-cy=\"node-description-input\"\n error={errors.description && !!errors.description.message}\n inputRef={register({ validate: value => !!value.trim() || t('setting.form.descriptionRequired') })}\n inputProps={{ name: 'description', onFocus: () => setCurrent('description') }}\n helperText={errors.description ? errors.description.message : ''}\n margin=\"normal\"\n />\n <TextField\n variant=\"outlined\"\n label={t('setting.form.webWalletUrl')}\n placeholder={t('setting.form.webWalletUrlPlaceholder')}\n disabled={loading || !hasPermission}\n error={errors.webWalletUrl && !!errors.webWalletUrl.message}\n inputRef={register({})}\n inputProps={{ name: 'webWalletUrl', onFocus: () => setCurrent('webWalletUrl') }}\n helperText={errors.webWalletUrl ? errors.webWalletUrl.message : ''}\n margin=\"normal\"\n />\n <TextField\n type=\"number\"\n variant=\"outlined\"\n label={t('setting.form.monitor.diskThreshold')}\n placeholder={t('setting.form.monitor.diskThresholdPlaceholder')}\n disabled={loading || !hasPermission}\n error={errors.diskAlertThreshold && !!errors.diskAlertThreshold.message}\n inputRef={register({})}\n inputProps={{\n name: 'diskAlertThreshold',\n onFocus: () => setCurrent('diskAlertThreshold'),\n min: 1,\n max: 99,\n }}\n helperText={errors.diskAlertThreshold ? errors.diskAlertThreshold.message : ''}\n margin=\"normal\"\n />\n <FormControlLabel\n control={\n <SwitchControl\n checked={autoUpgrade}\n onChange={() => setAutoUpgrade(!autoUpgrade)}\n name=\"autoUpgrade\"\n disabled={!hasPermission}\n />\n }\n style={{ marginTop: 20, marginRight: 0 }}\n label={\n <Typography className=\"auto-upgrade-label\">\n <span>{t('setting.form.upgrade.toggle')}</span>\n <span>\n {autoUpgrade ? (\n <Tag type=\"success\">{t('setting.form.upgrade.enabled')}</Tag>\n ) : (\n <Tag type=\"error\">{t('setting.form.upgrade.disabled')}</Tag>\n )}\n </span>\n </Typography>\n }\n />\n <FormControlLabel\n control={\n <SwitchControl\n checked={enableWelcomePage}\n onChange={() => setEnableWelcomePage(!enableWelcomePage)}\n name=\"enableWelcomePage\"\n disabled={!hasPermission}\n />\n }\n style={{ marginTop: 20, marginRight: 0 }}\n label={\n <Typography className=\"auto-upgrade-label\">\n <span>{t('setting.form.welcome.desc')}</span>\n <span>\n {enableWelcomePage ? (\n <Tag type=\"primary\">{t('setting.form.welcome.enabled')}</Tag>\n ) : (\n <Tag type=\"primary\">{t('setting.form.welcome.disabled')}</Tag>\n )}\n </span>\n </Typography>\n }\n />\n </>\n )}\n </Permission>\n\n {!!warning && (\n <Alert type=\"warning\" variant=\"icon\">\n {warning}\n </Alert>\n )}\n <div className=\"actions\">\n <Permission permission=\"mutate_node\">\n <Button\n rounded\n onClick={handleSubmit(onSubmit)}\n disabled={disabled || loading}\n color=\"primary\"\n variant=\"contained\"\n data-cy=\"submit-btn\"\n className=\"form-submit\">\n {submit} {loading ? <Spinner size={[16, 10]} /> : null}\n </Button>\n </Permission>\n </div>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\" error={error}>\n {error}\n </Alert>\n )}\n </form>\n {warning && <LeavePagePrompt confirm={t('setting.unSavedLeaveTip')} />}\n </Div>\n );\n}\n\nConfigForm.propTypes = {\n onSaved: PropTypes.func.isRequired,\n disabled: PropTypes.bool,\n title: PropTypes.string.isRequired,\n submit: PropTypes.string.isRequired,\n};\n\nConfigForm.defaultProps = {\n disabled: false,\n};\n\nconst Div = styled.div`\n display: flex;\n align-items: flex-start;\n width: 100%;\n max-width: 720px;\n\n .form {\n width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n\n .actions {\n display: flex;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n flex-direction: column;\n width: 100%;\n button {\n width: 100%;\n margin-right: 0;\n }\n }\n }\n\n .form-submit {\n margin-top: 24px;\n margin-right: 32px;\n width: 180px;\n }\n\n .auto-upgrade-label {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n span {\n span {\n height: auto;\n }\n }\n }\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport Box from '@material-ui/core/Box';\nimport Toast from '@arcblock/ux/lib/Toast';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../contexts/node';\nimport ConfigForm from '../node/form';\n\nexport default function BasicSettings() {\n const { refresh } = useNodeContext();\n const [message, setMessage] = useState(null);\n const { t } = useLocaleContext();\n\n // Trigger a background refresh on mount\n useEffect(() => {\n refresh({ silent: true });\n }, []); // eslint-disable-line\n\n const onSaved = () => {\n refresh({ silent: true });\n setMessage({\n content: t('setting.saveSuccess'),\n type: 'success',\n onClose: () => {\n setMessage(null);\n },\n });\n };\n\n return (\n <Div>\n {message && <Toast message={message.content} variant={message.type} onClose={message.onClose} />}\n <Box mb={4}>\n <ConfigForm onSaved={onSaved} submit={t('common.saveChanges')} title=\"\" />\n </Box>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .eula-btn {\n text-decoration-line: underline;\n margin-top: 32px;\n margin-bottom: 32px;\n }\n\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\n max-width: 720px;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { RBAC_CONFIG, ROLES } from '@abtnode/constant';\n\nimport Confirm from '../confirm';\nimport getClient from '../../libs/node';\n\nexport default function CreateAccessKey(props) {\n const { remark, onCreate } = props;\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const client = getClient();\n\n const roles = RBAC_CONFIG.roles.filter(x => x.passport && x.name !== ROLES.OWNER);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n // eslint-disable-next-line no-shadow\n const { remark, passport } = params;\n setLoading(true);\n const res = await client.createAccessKey({\n input: {\n remark: remark.trim(),\n passport,\n },\n });\n const { data } = res;\n onCreate(data);\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: `${t('common.create')} ${t('common.accessKey')}`,\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('setting.accessKey.tip')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"remark\"\n data-cy=\"remark-input\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.remark}\n onChange={e => {\n setParams({\n ...params,\n remark: e.target.value,\n __disableConfirm: !params.passport || !e.target.value.trim(),\n });\n if (!e.target.value.trim()) {\n setError(t('setting.accessKey.remarkInvalid'));\n } else {\n setError('');\n }\n }}\n />\n\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"create-access-key-select-passport\"\n value={params.passport}\n onChange={e => {\n const passport = e.target.value;\n setError(null);\n setParams({\n ...params,\n passport,\n __disableConfirm: !params.remark || !passport,\n });\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}>\n {roles.map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`create-access-key-passport-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n color: 'primary',\n params: {\n remark,\n __disableConfirm: !remark.trim(),\n },\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n variant=\"contained\"\n color=\"primary\"\n data-cy=\"add-access-key-btn\"\n onClick={() => setConfirmSetting(setting)}\n className=\"rule-action\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 16 }} />}\n {t('common.create')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nCreateAccessKey.propTypes = {\n remark: PropTypes.string,\n onCreate: PropTypes.func,\n};\n\nCreateAccessKey.defaultProps = {\n onCreate: () => {},\n remark: '',\n};\n","import React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport ClickToCopy from '../click-to-copy';\n\nexport default function ConfirmAccessKey(props) {\n const { onConfirm, accessKeyId, accessKeySecret } = props;\n const { t } = useContext(LocaleContext);\n const [checked, setChecked] = useState(false);\n const [hideAccessSecret, setHideAccessSecret] = useState(true);\n\n const onChangeSwitch = () => {\n setHideAccessSecret(!hideAccessSecret);\n };\n\n const handleChange = event => {\n setChecked(event.target.checked);\n };\n\n return (\n <Dialog\n title={t('common.createSuccess')}\n fullWidth\n open\n disableBackdropClick\n disableEscapeKeyDown\n onClose={onConfirm}\n showCloseButton={false}\n actions={\n <div>\n <Button\n disabled={!checked}\n onClick={onConfirm}\n color=\"primary\"\n autoFocus\n size=\"small\"\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n rounded>\n {t('common.confirm')}\n </Button>\n </div>\n }\n aria-labelledby=\"simple-dialog-title\">\n <div>\n <Bold>{t('setting.accessKey.saveSecretTip')}</Bold>\n </div>\n <div style={{ marginTop: '20px' }} />\n <Item>\n <Label>Access Key</Label>\n <ClickToCopy>{accessKeyId}</ClickToCopy>\n </Item>\n <Item>\n <Label>Access Secret</Label>\n {hideAccessSecret ? (\n <Button data-cy=\"show-secret-btn\" color=\"primary\" onClick={onChangeSwitch}>\n {t('setting.accessKey.showSecret')}\n </Button>\n ) : (\n <ClickToCopy>{accessKeySecret}</ClickToCopy>\n )}\n </Item>\n <div>\n <FormControlLabel\n value=\"end\"\n disabled={hideAccessSecret}\n control={<Checkbox checked={checked} onChange={handleChange} />}\n label={t('setting.accessKey.iKnow')}\n labelPlacement=\"end\"\n />\n </div>\n </Dialog>\n );\n}\n\nConfirmAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n accessKeySecret: PropTypes.string.isRequired,\n onConfirm: PropTypes.func,\n};\n\nConfirmAccessKey.defaultProps = {\n onConfirm: () => {},\n};\n\nconst Label = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 16px;\n margin-bottom: 8px;\n`;\nconst Item = styled.div`\n margin-bottom: 24px;\n`;\nconst Bold = styled.div`\n font-size: 16px;\n font-weight: bold;\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { format } from 'timeago.js';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { formatLocale, formatToDatetime } from '../../libs/util';\n\nimport DelConfirm from '../delete-confirm';\nimport getClient from '../../libs/node';\n\nexport default function DeleteAccessKey(props) {\n const { t, locale } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { accessKeyId, time, remark, onDelete = () => {} } = props;\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteAccessKey({ input: { accessKeyId } });\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const descData = formatTime => ({\n key: `<b>${accessKeyId}</b>`,\n name: `<b>${remark}</b>`,\n time: formatToDatetime(formatTime),\n timeAge: format(new Date(formatTime), formatLocale(locale)),\n });\n\n const setting = {\n keyName: remark,\n title: t('setting.accessKey.title'),\n description: time\n ? `${t('setting.accessKey.description', descData(time))}`\n : `${t('setting.accessKey.descriptionNoTime', { key: `<b>${accessKeyId}</b>`, name: `<b>${remark}</b>` })}`,\n confirmPlaceholder: t('setting.accessKey.confirm_desc', { name: remark }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n time: PropTypes.string.isRequired,\n remark: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n};\n\nDeleteAccessKey.defaultProps = {\n onDelete: () => {},\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { RBAC_CONFIG, ROLES } from '@abtnode/constant';\n\nimport Confirm from '../confirm';\nimport getClient from '../../libs/node';\n\nexport default function UpdateAccessKey(props) {\n const { accessKeyId, remark, onUpdate, passport } = props;\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const client = getClient();\n\n const roles = RBAC_CONFIG.roles.filter(x => x.passport && x.name !== ROLES.OWNER);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n // eslint-disable-next-line no-shadow\n const { accessKeyId, remark, passport } = params;\n setLoading(true);\n await client.updateAccessKey({\n input: {\n accessKeyId,\n remark: remark.trim(),\n passport,\n },\n });\n onUpdate();\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: `${t('common.update')} ${t('common.accessKey')}`,\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('setting.accessKey.accessKeyId')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"accessKeyId\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.accessKeyId}\n disabled\n />\n <TextField\n label={t('common.remark')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"remark\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.remark}\n onChange={e => {\n setParams({ ...params, remark: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('setting.accessKey.remarkInvalid'));\n } else {\n setError('');\n }\n }}\n />\n\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"update-access-key-select-passport\"\n value={params.passport}\n onChange={e => {\n // eslint-disable-next-line no-shadow\n const passport = e.target.value;\n setError(null);\n setParams({\n ...params,\n passport,\n __disableConfirm: !params.remark || !passport,\n });\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}>\n {roles.map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`update-access-key-passport-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n color: 'primary',\n params: {\n accessKeyId,\n remark,\n passport,\n },\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"primary\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 16 }} />}\n {t('common.update')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nUpdateAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n remark: PropTypes.string,\n passport: PropTypes.string,\n onUpdate: PropTypes.func,\n};\n\nUpdateAccessKey.defaultProps = {\n onUpdate: () => {},\n remark: '',\n passport: '',\n};\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\nimport { useAsyncRetry } from 'react-use';\n\nimport MaterialTable from 'material-table';\nimport Alert from '@material-ui/lab/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { RBAC_CONFIG } from '@abtnode/constant';\n\nimport { formatError, formatToDatetime } from '../../libs/util';\nimport { useNodeContext } from '../../contexts/node';\n\nimport ClickToCopy from '../click-to-copy';\nimport CreateAccessKey from '../access-key/create';\nimport ConfirmAccessKey from '../access-key/confirm';\nimport DeleteAccessKey from '../access-key/delete';\nimport UpdateAccessKey from '../access-key/update';\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\nimport usePersistentSort from '../../hooks/persistent-sort';\nimport Permission from '../permission';\nimport PassportTag from '../passport-tag';\n\nexport default function AccessKey() {\n const { t } = useContext(LocaleContext);\n const { api } = useNodeContext();\n const [confirmInfo, setConfirmInfo] = useState({});\n\n const state = useAsyncRetry(async () => {\n const response = await api.getAccessKeys();\n const { list } = response;\n return list;\n });\n\n const list = state.value || [];\n const { loading, error } = state;\n\n const { sortDirections, onSortChange } = usePersistentSort('access-key', ['', '', '', '']);\n\n const columns = [\n {\n title: t('setting.accessKey.remark'),\n field: 'remark',\n defaultSort: sortDirections[0],\n render: ({ remark }) => remark || 'N/A',\n },\n {\n title: t('setting.accessKey.accessKeyId'),\n field: 'accessKeyId',\n defaultSort: sortDirections[1],\n render: d => <ClickToCopy>{d.accessKeyId}</ClickToCopy>,\n },\n {\n title: t('common.passport'),\n field: 'passport',\n defaultSort: sortDirections[2],\n render: d => {\n const p = RBAC_CONFIG.roles.find(x => x.name === d.passport);\n return <PassportTag passport={{ title: p ? p.title : d.passport }} />;\n },\n },\n {\n title: t('common.created'),\n defaultSort: sortDirections[3],\n type: 'datetime',\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{formatToDatetime(d.createdAt)}</div>,\n },\n {\n title: t('setting.accessKey.lastUsed'),\n field: 'lastUsedAt',\n defaultSort: sortDirections[4],\n type: 'datetime',\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{d.lastUsedAt}</div>,\n },\n\n {\n title: t('common.actions'),\n sorting: false,\n align: 'center',\n render: item => (\n <>\n <UpdateAccessKey {...item} onUpdate={state.retry} />\n <DeleteAccessKey\n accessKeyId={item.accessKeyId}\n time={item.lastUsedAt}\n remark={item.remark || 'N/A'}\n onDelete={state.retry}\n />\n </>\n ),\n },\n ];\n\n if (!list.length && loading) {\n return (\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <Spinner />\n </div>\n );\n }\n if (!list.length && error) {\n return <Alert severity=\"error\">{formatError(error)}</Alert>;\n }\n\n return (\n <Div>\n <div className=\"table-header\">\n <div className=\"search\">\n <Permission permission=\"mutate_node\">\n <CreateAccessKey\n onCreate={data => {\n const { accessKeyId, accessKeySecret } = data;\n setConfirmInfo({\n show: true,\n accessKeyId,\n accessKeySecret,\n });\n }}\n />\n </Permission>\n {confirmInfo.show && (\n <ConfirmAccessKey\n onConfirm={() => {\n state.retry();\n setConfirmInfo({ show: false });\n }}\n {...confirmInfo}\n />\n )}\n </div>\n </div>\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: true,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n pageSize: 100,\n }}\n onOrderChange={onSortChange}\n localization={{\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={list}\n />\n </TableStyle>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .table-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n margin-top: 20px;\n font-size: 14px;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport DelConfirm from '../delete-confirm';\nimport getClient from '../../libs/node';\n\nexport default function DeleteAccessKey(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { item, onDelete = () => {} } = props;\n const { id, title } = item;\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteWebHook({ input: { id } });\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n keyName: id,\n title: t('setting.webhook.delTitle'),\n description: `${t('setting.webhook.description', { name: `<b>${title}</b>`, id: `<b>${id}</b>` })}`,\n confirmPlaceholder: t('setting.webhook.confirm_desc', { name: id }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteAccessKey.propTypes = {\n item: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nDeleteAccessKey.defaultProps = {\n onDelete: () => {},\n};\n","import React, { useContext, useState, useRef } from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Alert from '@material-ui/lab/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport MaterialTable from 'material-table';\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\nimport Paper from '@material-ui/core/Paper';\nimport Popper from '@material-ui/core/Popper';\nimport Button from '@arcblock/ux/lib/Button';\nimport LinkIcon from '@material-ui/icons/Link';\nimport List from '@material-ui/core/MenuList';\nimport ListItem from '@material-ui/core/MenuItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport TextField from '@material-ui/core/TextField';\nimport AddIcon from '@material-ui/icons/Add';\nimport SendIcon from '@material-ui/icons/Send';\nimport { formatError, checkInputByType, formatToDatetime } from '../../libs/util';\n\nimport { useNodeContext } from '../../contexts/node';\nimport Confirm from '../confirm';\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\n\nimport DelButton from '../webhook/delete';\nimport Permission from '../permission';\n\nexport default function HookSetting() {\n const { api, prefix } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { enqueueSnackbar } = useSnackbar();\n const buttonAnchorRef = useRef(null);\n\n const [defaultConfig, setDefaultConfig] = useState([]);\n const [open, setOpen] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const state = useAsyncRetry(async () => {\n const [{ webhooks }, { senders }] = await Promise.all([api.getWebHooks(), api.getWebhookSenders()]);\n\n setDefaultConfig(senders);\n return webhooks;\n });\n const list = state.value || [];\n const { loading, error } = state;\n\n const onToggleWebHook = () => {\n setOpen(preOpen => !preOpen);\n };\n\n const onClosePopper = e => {\n if (buttonAnchorRef.current && buttonAnchorRef.current.contains(e.target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const onConfirm = async data => {\n try {\n await api.createWebHook({ input: data });\n state.retry();\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 4000, variant: 'error' });\n console.error('create webhook error', err);\n }\n setConfirmSetting(null);\n };\n\n const onCancel = () => {\n setConfirmSetting(null);\n };\n\n const onSetWebHook = x => {\n const setting = {\n title: x.title,\n description: (params, setParams, setError) => {\n const setValue = data => {\n setParams({\n list: data,\n __disableConfirm: data.some(item => item.disable),\n });\n };\n\n const inputList = params.list || [];\n return (\n <Main>\n {inputList.map((item, index) => (\n <Form key={item.name}>\n <TextField\n label={item.description}\n autoComplete=\"off\"\n variant=\"outlined\"\n data-cy=\"webhook-input\"\n fullWidth\n autoFocus\n style={{ marginBottom: 16 }}\n value={item.value || item.defaultValue}\n onChange={e => {\n if (item.required) {\n item.disable = true;\n }\n\n const trimValue = e.target.value.trim();\n item.value = trimValue;\n inputList[index] = item;\n\n if (trimValue) {\n if (checkInputByType(item.type, trimValue)) {\n item.disable = false;\n setError('');\n } else {\n item.disable = true;\n setError(t('setting.webhook.requiredError', { type: item.type }));\n }\n } else {\n if (item.required) {\n item.disable = true;\n }\n setError('');\n }\n\n setValue([...inputList]);\n }}\n />\n </Form>\n ))}\n </Main>\n );\n },\n params: {\n list: x.params,\n __disableConfirm: true,\n },\n confirm: t('setting.webhook.add'),\n cancel: t('common.cancel'),\n onConfirm: data => {\n x.params = data.list;\n onConfirm(x);\n },\n onCancel,\n };\n\n setConfirmSetting(setting);\n setOpen(false);\n };\n\n const webhookIcon = d => {\n const isSlack = d.type === 'slack';\n return isSlack ? (\n <img src={`${prefix}/${d.type}.png`} alt=\"icon\" style={{ width: 20, height: 20 }} />\n ) : (\n <LinkIcon />\n );\n };\n\n const onSendTestNotification = async rowInfo => {\n const params = {\n webhookId: rowInfo.id,\n message: 'This is a test notification in order to test the integration',\n };\n await api.sendTestMessage({\n input: params,\n });\n };\n\n const columns = [\n {\n title: t('setting.webhook.columns.description'),\n render: d => {\n const desc = defaultConfig.find(item => item.name === d.name);\n return (\n <div style={{ display: 'flex', alignItems: 'center', whiteSpace: 'nowrap' }}>\n {webhookIcon(d)}\n <div style={{ marginLeft: 10 }}>\n <b>\n {'ID: '}\n {d.id}\n </b>\n <div>{desc ? desc.description : null}</div>\n </div>\n </div>\n );\n },\n },\n {\n title: t('setting.webhook.columns.params'),\n render: d => {\n const params = d.params.map(item => <div>{item.value}</div>);\n return <div style={{ display: 'flex', alignItems: 'center', whiteSpace: 'nowrap' }}>{params}</div>;\n },\n },\n {\n title: t('setting.webhook.columns.createdAt'),\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{formatToDatetime(Number(d.createdAt))}</div>,\n },\n {\n title: t('common.actions'),\n width: '12%',\n align: 'center',\n render: d => {\n const info = defaultConfig.find(item => item.name === d.name) || {};\n return (\n <>\n <DelButton\n item={{ ...d, title: info.title }}\n onDelete={() => {\n state.retry();\n }}\n />\n <Button\n rounded\n size=\"small\"\n color=\"secondary\"\n onClick={() => {\n onSendTestNotification(d);\n }}>\n <SendIconInfo />\n {t('setting.webhook.test')}\n </Button>\n </>\n );\n },\n },\n ];\n\n if (!list.length && loading) {\n return (\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <Spinner />\n </div>\n );\n }\n if (!list.length && error) {\n return <Alert severity=\"error\">{formatError(error)}</Alert>;\n }\n\n return (\n <Main>\n <div className=\"button-addon\">\n <Permission permission=\"mutate_webhook\">\n <Button\n ref={buttonAnchorRef}\n variant=\"contained\"\n size=\"small\"\n color=\"primary\"\n data-cy=\"add-integration\"\n rounded\n onClick={onToggleWebHook}>\n <AddIcon />\n <span style={{ marginLeft: 5 }}>{t('setting.webhook.add')}</span>\n </Button>\n </Permission>\n\n {open && (\n <Popper open anchorEl={buttonAnchorRef.current} disablePortal placement=\"bottom-end\" style={{ zIndex: 11 }}>\n <Paper>\n <ClickAwayListener onClickAway={onClosePopper}>\n <List className=\"add-list\">\n {defaultConfig.map(x => (\n <ListItem\n data-cy={`add-${x.type}`}\n key={x.title}\n alignItems=\"center\"\n onClick={() => onSetWebHook(x)}>\n {webhookIcon(x)}\n <ListItemText\n style={{ marginLeft: 10 }}\n className=\"list-item\"\n primary={x.title}\n secondary={x.description}\n />\n </ListItem>\n ))}\n </List>\n </ClickAwayListener>\n </Paper>\n </Popper>\n )}\n </div>\n\n {confirmSetting && (\n <Confirm\n color=\"primary\"\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: false,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n pageSize: 100,\n }}\n localization={{\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={list}\n />\n </TableStyle>\n </Main>\n );\n}\n\nconst Main = styled.div`\n .button-addon {\n text-align: right;\n }\n\n .add-list {\n width: 420px;\n max-width: calc(100vw - 10px);\n text-align: left;\n background: #fff;\n border-radius: 5px;\n }\n`;\n\nconst Form = styled.div`\n display: flex;\n`;\n\nconst SendIconInfo = styled(SendIcon)`\n font-size: 16px !important;\n margin-right: 3px;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport Typography from '@material-ui/core/Typography';\n\nfunction DangerItem({ title, description, children }) {\n return (\n <Div>\n <Typography component=\"div\" className=\"danger-item-info\">\n <Typography className=\"title\" component=\"h3\" variant=\"h6\" color=\"textPrimary\" gutterBottom>\n {title}\n </Typography>\n <Typography className=\"desc\" component=\"p\" variant=\"body1\" color=\"textSecondary\">\n {description}\n </Typography>\n </Typography>\n <Typography component=\"div\" className=\"danger-item-action\">\n {children}\n </Typography>\n </Div>\n );\n}\n\nDangerItem.propTypes = {\n children: PropTypes.node.isRequired,\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n};\n\nconst Div = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .danger-item-info {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n .title {\n word-break: break-word;\n }\n .desc {\n word-break: break-word;\n }\n }\n\n .danger-item-action {\n width: 160px;\n flex-shrink: 0;\n text-align: right;\n cursor: pointer;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n width: auto;\n margin-left: 10px;\n }\n }\n`;\n\nfunction DangerZone({ children, ...rest }) {\n return <Container {...rest}>{children}</Container>;\n}\n\nconst Container = styled.div`\n border: 1px solid #dedede;\n padding: 16px;\n`;\n\nDangerZone.propTypes = { children: PropTypes.node.isRequired };\n\nexport { DangerZone, DangerItem };\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport ConfirmDialog from '../../confirm';\nimport { DangerZone, DangerItem } from '../../danger-zone';\nimport { useNodeContext } from '../../../contexts/node';\n\nexport default function ConfirmUpgrade() {\n const { t } = useLocaleContext();\n const { info, api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (!info.nextVersion) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n await api.upgradeNodeVersion();\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('setting.form.upgrade.title', { version: info.nextVersion }),\n description: t('setting.form.upgrade.dialog'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <DangerZone className=\"danger-zone\">\n <DangerItem\n title={t('setting.form.upgrade.title', { version: info.nextVersion })}\n description={t('setting.form.upgrade.description')}>\n <Button onClick={() => setConfirmSetting(setting)} color=\"primary\" rounded variant=\"contained\" size=\"large\">\n {loading ? <Spinner size={[16, 10]} style={{ marginRight: 3 }} /> : null}\n {t('setting.form.upgrade.confirm')}\n </Button>\n </DangerItem>\n </DangerZone>\n {confirmSetting && (\n <ConfirmDialog\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport IconButton from '@material-ui/core/IconButton';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport ConfirmDialog from '../../confirm';\nimport { useNodeContext } from '../../../contexts/node';\n\nexport default function UpgradeCheck() {\n const { t } = useLocaleContext();\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onDone = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('setting.form.upgrade.check'),\n description: t('setting.form.upgrade.latest'),\n confirm: t('common.confirm'),\n showCancel: false,\n color: 'primary',\n onConfirm: onDone,\n onCancel: onDone,\n };\n\n const onCheck = async () => {\n try {\n setLoading(true);\n const { version } = await api.checkNodeVersion();\n if (!version) {\n setConfirmSetting(setting);\n }\n } catch (err) {\n console.error(`Failed to check new version: ${err.message}`);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <>\n <IconButton color=\"primary\" aria-label=\"upload picture\" component=\"span\" onClick={onCheck}>\n {loading ? <Spinner size={[16, 10]} style={{ fontSize: 14 }} /> : <RefreshIcon style={{ fontSize: 16 }} />}\n </IconButton>\n {confirmSetting && (\n <ConfirmDialog\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n showCancel={confirmSetting.showCancel}\n color={confirmSetting.color}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport get from 'lodash/get';\n\nimport Box from '@material-ui/core/Box';\nimport Button from '@arcblock/ux/lib/Button';\nimport Logo from '@arcblock/ux/lib/Logo';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nimport { useNodeContext } from '../../contexts/node';\nimport UpgradeConfirm from '../node/upgrade/confirm';\nimport UpgradeCheck from '../node/upgrade/check';\nimport Permission from '../permission';\n\nexport default function About() {\n const history = useHistory();\n const { api, info: nodeInfo } = useNodeContext();\n const { t } = useLocaleContext();\n const extra = useAsyncRetry(async () => {\n const res = await api.getNodeEnv();\n return Object.assign({}, res.info || {});\n });\n\n const rows = [];\n\n rows.push(\n ...[\n { name: t('dashboard.nodeDid'), value: <DidAddress>{nodeInfo.did}</DidAddress> },\n { name: t('dashboard.ownerDid'), value: <DidAddress>{nodeInfo.nodeOwner.did}</DidAddress> },\n ]\n );\n\n if (extra.value) {\n rows.push(\n ...[\n { name: `${t('common.os')}`, value: extra.value.os },\n extra.value.docker ? { name: `${t('common.docker')}`, value: <Tag type=\"success\">Yes</Tag> } : null,\n extra.value.gitpod ? { name: `${t('common.gitpod')}`, value: <Tag type=\"success\">Yes</Tag> } : null,\n ].filter(Boolean)\n );\n }\n\n if (Array.isArray(get(extra, 'value.blockletEngines', null))) {\n extra.value.blockletEngines\n .filter(e => e.visible && e.available)\n .forEach(e => {\n rows.push({\n name: e.displayName,\n value: e.version,\n });\n });\n }\n\n return (\n <Permission permission=\"mutate_node\">\n {can => (\n <Box\n component={Div}\n my={6}\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n flexDirection=\"column\">\n <Box display=\"flex\" alignItems=\"center\">\n <Box width={50} height={50}>\n <Logo showText={false} style={{ width: '100%', height: '100%', transform: 'scale(1)' }} />\n </Box>\n <Box ml={2}>\n <h2 style={{ margin: 0 }}>{nodeInfo.name}</h2>\n <p style={{ margin: 0, color: '#888' }}>{nodeInfo.description}</p>\n </Box>\n </Box>\n\n <Box my={3}>{can && <UpgradeConfirm />}</Box>\n\n <InfoRow\n style={{ marginBottom: 4 }}\n valueComponent=\"div\"\n key=\"version\"\n nameWidth={150}\n name={t('common.version')}>\n {nodeInfo.version}\n {can && <UpgradeCheck />}\n </InfoRow>\n\n {rows.map(x => (\n <InfoRow valueComponent=\"div\" key={x.name} nameWidth={150} name={x.name}>\n {x.value}\n </InfoRow>\n ))}\n\n <Box mt={10} style={{ marginLeft: -8 }}>\n <Button\n className=\"eula-btn\"\n onClick={() => {\n history.push('/eula');\n }}>\n {t('common.goEULA')}\n </Button>\n </Box>\n </Box>\n )}\n </Permission>\n );\n}\n\nconst Div = styled.div`\n .eula-btn {\n text-decoration-line: underline;\n margin-top: 32px;\n margin-bottom: 32px;\n }\n\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\n max-width: 720px;\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport AddIcon from '@material-ui/icons/Public';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX } from '@blocklet/meta/lib/constants';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useRoutingContext } from '../../../../contexts/routing';\nimport { useNodeContext } from '../../../../contexts/node';\n\nimport Confirm from '../../../confirm';\nimport ConfigRoutingRule from './config-routing-rule';\nimport { validateSite, getInitialBlockletDid, validateDomain } from './utils';\n\nexport default function AddDomain({ blocklets, onActivate = () => {}, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const { info } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n // add an empty rule when the type is default\n const rule = {\n from: {\n pathPrefix: '/',\n },\n to: {\n type: params.type,\n },\n };\n const data = {\n domain: params.domain.trim() === info.ip ? '' : params.domain.trim(),\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n // If the blocklet can not be served on dynamic path prefix, we need to update `rule.from.pathPrefix`\n const blocklet = blocklets.find(x => x.meta.did === params.did);\n const bInterface = get(blocklet, 'meta.interfaces', []).find(x => x.name === params.interfaceName);\n if (bInterface && bInterface.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX) {\n rule.from.pathPrefix = bInterface.prefix;\n }\n\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n data.rules = [rule];\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url;\n rule.to.redirectCode = params.redirectCode;\n data.rules = [rule];\n }\n\n await actions.addSite(data);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.add.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n // eslint-disable-next-line no-underscore-dangle\n const __disableConfirm = value.__disableConfirm || !!validateSite(value, t);\n\n setParams({ ...value, __disableConfirm });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.domain.add.description')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n fullWidth\n autoFocus\n value={params.domain}\n style={{ marginBottom: 32 }}\n inputProps={{ 'data-cy': 'domain-name-input' }}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setValue({ ...params, domain: e.target.value, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.domain.add.confirm'),\n cancel: t('router.domain.add.cancel'),\n params: {\n domain: '',\n did: getInitialBlockletDid(blocklets),\n port: '',\n interfaceName: '',\n type: ROUTING_RULE_TYPES.BLOCKLET,\n redirectCode: 302,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n useEffect(() => {\n const { searchParams } = new URL(window.location.href);\n const fromDid = searchParams.get('fromDid');\n if (fromDid) {\n setConfirmSetting(setting);\n }\n }, []); // eslint-disable-line\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddDomain.propTypes = {\n blocklets: PropTypes.array,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nAddDomain.defaultProps = {\n onActivate: () => {},\n children: null,\n blocklets: [],\n};\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport DelConfirm from '../../../delete-confirm';\n\nexport default function DeleteDomain(props) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, name } = props;\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n await actions.deleteSite(id);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.delete.title'),\n description: t('router.domain.delete.description', { name: `<b>${name}</b>` }),\n confirmPlaceholder: t('router.domain.delete.confirm_desc', { name }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n keyName: name,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || props.onActivate();\n };\n\n return (\n <>\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-delete-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.delete.title')}\n </MenuItem>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/jsx-curly-newline */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable react/jsx-curly-spacing */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState } from 'react';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\n\nimport { validateDomain } from './utils';\n\nexport default function UpdateDomain({ id, name, onActivate }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.updateSite(id, { domain: params.domain.trim() });\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.update.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domain.update.label')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n fullWidth\n autoFocus\n value={params.domain}\n style={{ marginBottom: 32 }}\n helperText={t('router.domain.update.description')}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setParams({ ...params, domain: e.target.value, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n domain: name,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.update.title')}\n </MenuItem>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/destructuring-assignment */\n/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Menu from '@material-ui/core/Menu';\nimport IconMoreVert from '@material-ui/icons/MoreVert';\nimport IconButton from '@material-ui/core/IconButton';\n\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport AddDomain from './add-domain';\nimport DeleteDomain from './delete-domain';\nimport AddRule from './add-rule';\nimport DeleteRule from './delete-rule';\nimport UpdateRule from './update-rule';\nimport AddDomainAlias from './add-domain-alias';\nimport DeleteDomainAlias from './delete-domain-alias';\nimport UpdateDomainSecurity from './update-domain-security';\nimport UpdateDomain from './update-domain';\n\nexport default function RuleItemAction(props) {\n const [anchorEl, setAnchorEl] = useState(null);\n\n const onOpen = e => {\n e.stopPropagation();\n setAnchorEl(e.currentTarget);\n };\n\n const onClose = e => {\n if (e) {\n e.stopPropagation();\n }\n setAnchorEl(null);\n };\n\n if (props.isProtected || (props.parent && props.parent.isProtected)) {\n return null;\n }\n\n if (props.type === 'domainAlias') {\n return <DeleteDomainAlias key=\"delete-domain-alias\" {...props} onActivate={onClose} />;\n }\n\n const items = [];\n\n if (props.type === 'root') {\n items.push(<AddDomain key=\"add-domain\" {...props} onActivate={onClose} />);\n }\n\n if (props.type === 'domain') {\n items.push(\n <UpdateDomain key=\"update-domain\" {...props} onActivate={onClose} />,\n <AddRule key=\"add-rule\" {...props} onActivate={onClose} onRuleAdded={props.onRuleAdded} />,\n <AddDomainAlias key=\"add-domain-alias\" {...props} onActivate={onClose} />,\n <UpdateDomainSecurity key=\"update-domain-security\" {...props} onActivate={onClose} />,\n <DeleteDomain key=\"delete-domain\" {...props} onActivate={onClose} />\n );\n }\n\n if (props.type === 'rule') {\n items.push(\n <UpdateRule key=\"update-rule\" {...props} onActivate={onClose} />,\n <DeleteRule key=\"delete-rule\" {...props} onActivate={onClose} />\n );\n }\n\n if (props.type === ROUTING_RULE_TYPES.REDIRECT) {\n items.push(<DeleteDomain key=\"delete-domain\" {...props} onActivate={onClose} />);\n }\n\n if (props.type === 'dashboard_domain') {\n items.push(\n <AddRule key=\"add-rule\" {...props} onActivate={onClose} />,\n <UpdateDomainSecurity key=\"update-domain-security\" {...props} onActivate={onClose} />,\n <AddDomainAlias key=\"add-domain-alias\" {...props} onActivate={onClose} />\n );\n }\n\n if (items.length === 0) {\n return null;\n }\n\n const mouseDown = e => {\n e.stopPropagation();\n };\n\n return (\n <div>\n <IconButton onMouseDown={mouseDown} onClick={onOpen} data-cy=\"action-trigger\" rounded>\n <IconMoreVert />\n </IconButton>\n <Menu\n keepMounted\n onMouseDown={mouseDown}\n open={!!anchorEl}\n onClose={onClose}\n getContentAnchorEl={null}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>\n {items}\n </Menu>\n </div>\n );\n}\n\nRuleItemAction.propTypes = {\n blocklet: PropTypes.object,\n onRuleAdded: PropTypes.func,\n};\n\nRuleItemAction.defaultProps = {\n onRuleAdded: () => {},\n blocklet: {},\n};\n","/* eslint-disable no-script-url */\n/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport isUrl from 'is-url';\nimport styled from 'styled-components';\n\nimport OkIcon from '@material-ui/icons/CheckCircle';\nimport BadIcon from '@material-ui/icons/Error';\nimport NodeIcon from '@material-ui/icons/Storage';\nimport DomainIcon from '@material-ui/icons/Public';\nimport RuleIcon from '@material-ui/icons/SubdirectoryArrowRight';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport ExternalLink from '@material-ui/core/Link';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport Collapse from '@material-ui/core/Collapse';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { DASHBOARD, DOMAIN_FOR_DEFAULT_SITE } from '../../../contexts/routing';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport { useNodeContext } from '../../../contexts/node';\n\nimport RuleItemAction from './action';\nimport DomainStatus from './domain-status';\nimport BlockletStatus from '../../blocklet/status';\nimport BlockletInterface from '../../blocklet/interface';\nimport { useDomainStatusContext } from '../../../contexts/domain-status';\nimport Permission from '../../permission';\n\nconst RedirectRule = ({ domain, isHttps, toUrl, interfaces }) => {\n const scheme = isHttps ? 'https' : 'http';\n const { t } = useLocaleContext();\n let tmpToUrl = toUrl;\n if (!isUrl(tmpToUrl)) {\n tmpToUrl = `${scheme}://${domain}${toUrl}`;\n }\n\n const [{ url }] = interfaces;\n\n return (\n <>\n <Typography className=\"arrow-name-middle\">\n {domain !== DOMAIN_FOR_DEFAULT_SITE && (\n <ExternalLink className=\"arrow-name-middle\" href={url} target=\"_blank\">\n {t('common.redirect')}\n </ExternalLink>\n )}\n {domain === DOMAIN_FOR_DEFAULT_SITE && t('common.redirect')}\n </Typography>\n <span className=\"arrow-name-arrow\">⟶</span>\n <ExternalLink key={tmpToUrl} href={tmpToUrl} target=\"_blank\">\n {toUrl}\n </ExternalLink>\n </>\n );\n};\n\nRedirectRule.propTypes = {\n domain: PropTypes.string.isRequired,\n toUrl: PropTypes.string.isRequired,\n isHttps: PropTypes.bool,\n interfaces: PropTypes.array,\n};\n\nRedirectRule.defaultProps = {\n isHttps: false,\n interfaces: [],\n};\n\nconst NoneRule = ({ domain, interfaces }) => {\n const { t } = useLocaleContext();\n const [{ url }] = interfaces;\n\n return (\n <Typography className=\"arrow-name-middle\">\n {domain !== DOMAIN_FOR_DEFAULT_SITE && (\n <ExternalLink key={url} href={url} target=\"_blank\">\n {t('common.page404')}\n </ExternalLink>\n )}\n {domain === DOMAIN_FOR_DEFAULT_SITE && t('common.page404')}\n </Typography>\n );\n};\n\nNoneRule.propTypes = {\n domain: PropTypes.string,\n interfaces: PropTypes.string,\n};\n\nNoneRule.defaultProps = {\n domain: '',\n interfaces: [],\n};\n\nexport default function RuleItem(props) {\n const { t } = useLocaleContext();\n const { data } = useBlockletContext();\n const { info } = useNodeContext();\n const { status: domainsStatus } = useDomainStatusContext();\n\n const blocklets = data.map(x => ({\n meta: {\n did: x.meta.did,\n name: x.meta.title || x.meta.name,\n version: x.meta.version,\n interfaces: x.meta.interfaces,\n },\n port: x.port,\n ports: x.ports,\n status: x.status,\n }));\n\n const {\n type,\n name,\n title,\n items = [],\n depth,\n to,\n interfaces = [],\n id: ruleId,\n expand: initialExpand,\n isProtected,\n pathPrefix,\n parent,\n domainAliases,\n } = props;\n\n const [expand, setExpand] = useState(initialExpand);\n\n const icons = {\n root: NodeIcon,\n domain: DomainIcon,\n rule: RuleIcon,\n };\n\n const IconComponent = icons[type];\n const style = { paddingBottom: 8, paddingLeft: 8 };\n\n if (type === 'domain') {\n if (isProtected) {\n return null;\n }\n\n const DomainLink = ({ domain, primaryDomain, rules }) => {\n let url = `http://${domain}`;\n if (primaryDomain === DASHBOARD) {\n url = `${url}/${info.routing.adminPath.replace(/^\\/+/, '')}`;\n } else if (rules && rules.length && rules[0].pathPrefix) {\n url = `${url}/${rules[0].pathPrefix.replace(/^\\/+/, '')}`;\n }\n\n if (domain !== DASHBOARD) {\n return (\n <DomainElement href={url} target=\"_blank\" rel=\"noreferrer\" onClick={e => e.stopPropagation()}>\n {domain}\n </DomainElement>\n );\n }\n return domain;\n };\n\n DomainLink.propTypes = {\n domain: PropTypes.string.isRequired,\n primaryDomain: PropTypes.string.isRequired,\n rules: PropTypes.array.isRequired,\n };\n\n const onRuleAdded = () => {\n setExpand(true);\n };\n\n return [\n <ItemDiv alignItems=\"flex-start\" button key=\"parent\" disableGutters data-cy=\"rule-domain\">\n <ListItemIcon onClick={() => setExpand(d => !d)}>\n {items.length > 0 && (expand ? <ExpandMoreIcon /> : <ChevronRightIcon />)}\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText\n onClick={() => setExpand(d => !d)}\n className={`rule-name rule-name--depth${depth}`}\n style={{ flex: 1 }}\n secondary={items.length <= 0 ? <span className=\"site-secondary\">{t('router.empty')}</span> : ''}\n primary={\n <>\n <div className=\"site-header\">\n {name === DOMAIN_FOR_DEFAULT_SITE && t('router.defaultSite')}\n {name !== DOMAIN_FOR_DEFAULT_SITE && <DomainLink domain={name} primaryDomain={name} rules={items} />}\n {items.length && !expand ? <span style={{ marginLeft: 5 }}>{`(${items.length} URL)`}</span> : null}\n <span style={{ marginLeft: 12 }} />\n {type === 'domain' && name !== DOMAIN_FOR_DEFAULT_SITE && name !== DASHBOARD && (\n <DomainStatus key={name} type={type} name={name} />\n )}\n </div>\n {(domainAliases || [])\n .filter(item => !item.isProtected && item.value !== name)\n .map(item => {\n const domain = item.value || item;\n return (\n <div key={domain} className=\"site-alias\">\n <DomainLink domain={domain} primaryDomain={name} rules={items} />\n <DomainStatus key={`domain-status-${name}`} type={type} name={domain} />\n {domain !== DASHBOARD && domain !== window.location.hostname && (\n <RuleItemAction\n key={`action-${name}`}\n {...props}\n domainAlias={domain}\n type=\"domainAlias\"\n onRuleAdded={onRuleAdded}\n />\n )}\n </div>\n );\n })}\n </>\n }\n />\n\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction\n blocklets={blocklets}\n key={name}\n {...props}\n onRuleAdded={onRuleAdded}\n type={name === DASHBOARD ? 'dashboard_domain' : type}\n />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>,\n <Collapse key=\"rules\" in={expand}>\n {items.length > 0 && (\n <List key=\"children\" component=\"div\" className={`rule-list rule-list--depth${depth}`} disablePadding>\n {items.map(x => (\n <RuleItem key={x.id} {...x} parent={props} depth={depth + 1} />\n ))}\n </List>\n )}\n </Collapse>,\n ];\n }\n\n // We have no rules: just the root node with no children\n if (type === 'root') {\n return [\n <ItemDiv key=\"root\" disableGutters data-cy=\"rule-root\">\n <ListItemIcon>\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText primary={name} />\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction blocklets={blocklets} {...props} />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>,\n items.length > 0 && (\n <List key=\"children\" component=\"div\" className={`rule-list rule-list--depth${depth}`} disablePadding>\n {items.map(x => (\n <RuleItem expand={!isProtected} key={x.id} {...x} parent={props} depth={depth + 1} />\n ))}\n </List>\n ),\n ];\n }\n\n // Then we must render the leaf node\n let internalLink = `/blocklets/${to.did}/overview`;\n if (to.type === ROUTING_RULE_TYPES.DAEMON) {\n internalLink = '/';\n }\n\n const dashboard = {\n meta: { did: info.did, name: 'Blocklet Server Dashboard', version: info.version },\n status: 'running',\n port: info.port,\n };\n\n const blocklet = to.did === info.did ? dashboard : blocklets.find(x => x.meta.did === to.did);\n const isHealthy = (blocklet && blocklet.status === 'running') || to.type === ROUTING_RULE_TYPES.DAEMON;\n const healthyTip = isHealthy ? t('router.healthy.ok') : t('router.healthy.error');\n\n const domainStatus = domainsStatus[parent.name] || {};\n\n return (\n <ItemDiv className=\"hover-item\" divider key={name} disableGutters style={style} data-cy=\"rule-item\">\n <ListItemIcon className=\"arrow-icon\">\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText\n primary={\n /* eslint-disable-next-line react/jsx-wrap-multilines */\n <Typography component=\"div\" className=\"arrow-name\">\n <Typography style={{ wordBreak: 'break-all' }} className=\"arrow-name-left\">\n {name}\n </Typography>\n <span className=\"arrow-name-arrow\">⟶</span>\n {(to.type === ROUTING_RULE_TYPES.DAEMON || to.type === ROUTING_RULE_TYPES.BLOCKLET) && (\n <>\n {parent.name !== DOMAIN_FOR_DEFAULT_SITE && isHealthy && (\n <BlockletInterface\n className=\"arrow-name-middle\"\n blocklet={{\n interfaces:\n to.type === ROUTING_RULE_TYPES.BLOCKLET\n ? interfaces.filter(x => x.name === to.interfaceName)\n : interfaces,\n ruleId,\n ...(blocklet || {}),\n }}\n />\n )}\n {parent.name === DOMAIN_FOR_DEFAULT_SITE && (\n <Typography component=\"span\" className=\"arrow-name-middle\">\n Blocklet\n </Typography>\n )}\n {!isHealthy && <span className=\"arrow-name-middle\">{t('common.unavailable')}</span>}\n <span className=\"arrow-name-arrow\">⟶</span>\n <Link to={internalLink} className=\"arrow-name-right\">\n <Tooltip title={healthyTip}>\n {isHealthy ? (\n <OkIcon style={{ color: '#44cdc6', fontSize: 20 }} />\n ) : (\n <BadIcon style={{ color: 'red', fontSize: 20 }} />\n )}\n </Tooltip>\n <span>{blocklet ? blocklet.meta.name : title}</span>\n {blocklet && (\n <span style={{ marginLeft: 8 }}>\n <BlockletStatus status={blocklet.status} />\n </span>\n )}\n </Link>\n </>\n )}\n {to.type === ROUTING_RULE_TYPES.REDIRECT && (\n <RedirectRule\n prefix={pathPrefix}\n domain={parent.name}\n toUrl={to.url}\n isHttps={domainStatus.isHttps}\n interfaces={interfaces}\n />\n )}\n {to.type === ROUTING_RULE_TYPES.NONE && <NoneRule interfaces={interfaces} domain={parent.name} />}\n </Typography>\n }\n />\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction blocklets={blocklets} {...props} did={to.did} />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>\n );\n}\n\nRuleItem.propTypes = {\n type: PropTypes.string.isRequired,\n to: PropTypes.object,\n name: PropTypes.string.isRequired,\n title: PropTypes.string,\n id: PropTypes.string,\n items: PropTypes.array,\n parent: PropTypes.object,\n depth: PropTypes.number,\n interfaces: PropTypes.array,\n expand: PropTypes.bool,\n isProtected: PropTypes.bool,\n pathPrefix: PropTypes.string,\n domainAliases: PropTypes.array,\n};\n\nRuleItem.defaultProps = {\n id: '',\n to: {},\n title: '',\n items: [],\n depth: 0,\n parent: {},\n interfaces: [],\n expand: true,\n isProtected: false,\n pathPrefix: '',\n domainAliases: [],\n};\n\nconst ItemDiv = styled(ListItem)`\n .MuiListItemText-root {\n padding-right: 48px;\n }\n .MuiListItemSecondaryAction-root {\n right: 0;\n }\n .site-header {\n display: unset !important;\n vertical-align: middle;\n .MuiSvgIcon-root {\n vertical-align: middle;\n }\n }\n`;\n\nconst DomainElement = styled('a')`\n color: #000;\n white-space: normal;\n word-break: break-all;\n :hover {\n color: rgba(0, 0, 0, 0.6);\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nimport Box from '@material-ui/core/Box';\nimport List from '@material-ui/core/List';\nimport AddIcon from '@material-ui/icons/Add';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useRoutingContext } from '../../contexts/routing';\nimport { useBlockletContext } from '../../contexts/blocklets';\nimport { DomainStatusProvider } from '../../contexts/domain-status';\n\nimport AddDomain from './rule/action/add-domain';\nimport RuleItem from './rule/item';\nimport Permission from '../permission';\n\nexport default function RouterPage() {\n const { sites, allDomains } = useRoutingContext();\n const { data: blocklets } = useBlockletContext();\n const { t } = useLocaleContext();\n\n const list = sites.map(x => {\n const items = x.items.filter(y => !y.isProtected);\n return { ...x, items };\n });\n\n return (\n <DomainStatusProvider domains={allDomains}>\n <Main>\n <Permission permission=\"mutate_router\">\n <Box textAlign=\"right\" mb={1}>\n <AddDomain blocklets={blocklets}>\n {({ open }) => (\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"add-domain-alias\"\n onClick={open}>\n <AddIcon style={{ fontSize: '1.3em', marginRight: 4 }} />\n {t('router.domain.add.title')}\n </Button>\n )}\n </AddDomain>\n </Box>\n </Permission>\n <List component=\"div\" disablePadding>\n {list.map(x => (\n <RuleItem {...x} depth={1} />\n ))}\n </List>\n </Main>\n </DomainStatusProvider>\n );\n}\n\nconst Main = styled.main`\n margin-top: ${props => props.theme.spacing(2)}px;\n min-height: 60vh;\n\n .MuiListItemIcon-root {\n min-width: ${props => props.theme.spacing(4)}px;\n }\n\n .site-header {\n display: flex;\n align-items: center;\n margin-left: ${props => props.theme.spacing(1)}px;\n font-size: 1.2rem;\n }\n\n .site-alias {\n display: flex;\n align-items: center;\n margin-left: ${props => props.theme.spacing(1)}px;\n }\n\n .site-secondary {\n margin-left: ${props => props.theme.spacing(1)}px;\n }\n\n .rule-list--depth1 {\n padding-left: ${props => props.theme.spacing(4)}px;\n }\n\n .rule-list--depth2 {\n padding-left: ${props => props.theme.spacing(5)}px;\n }\n\n .rule-action {\n margin-left: ${props => props.theme.spacing(2)}px;\n }\n\n .rule-name--depth2 span {\n font-weight: bold;\n }\n\n .arrow-name {\n display: flex;\n align-items: center;\n .arrow-name-left {\n width: 400px;\n flex-shrink: 0;\n text-align: left;\n }\n .arrow-name-middle {\n width: 150px;\n flex-shrink: 0;\n text-align: left;\n }\n .arrow-name-arrow {\n width: 40px;\n flex-shrink: 0;\n margin: auto 16px;\n font-size: 24px;\n color: #0000008a;\n }\n .arrow-name-right {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n\n span {\n margin: 0 8px;\n }\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n .rule-list--depth1,\n .rule-list--depth2 {\n padding-left: 0;\n }\n\n .MuiListItem-secondaryAction {\n padding-right: 0;\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.lg}px) {\n .arrow-icon {\n margin-top: 4px;\n align-self: flex-start;\n }\n\n .arrow-name {\n flex-direction: column;\n align-items: flex-start;\n .arrow-name-left {\n width: auto;\n }\n .arrow-name-middle {\n margin: 5px 0;\n }\n .arrow-name-arrow {\n display: none;\n }\n }\n }\n`;\n","/* eslint-disable react/jsx-curly-newline */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\nimport get from 'lodash/get';\nimport { useDropzone } from 'react-dropzone';\nimport { useForm, Controller } from 'react-hook-form';\nimport Box from '@material-ui/core/Box';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Radio from '@material-ui/core/Radio';\nimport RadioGroup from '@material-ui/core/RadioGroup';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useNodeContext } from '../../../../../contexts/node';\nimport { formatError } from '../../../../../libs/util';\n\nconst MAX_FILE_SIZE = 50 * 1024;\n\nconst readFile = file =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file);\n\n reader.onload = () => {\n resolve(reader.result);\n };\n\n reader.onerror = err => reject(err);\n });\n\nexport default function UpdateNginxCert({ certificate = {}, onRefresh, mode, ...restProps }) {\n const { t } = useLocaleContext();\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [keyFile, setKeyFile] = useState();\n const [pemFile, setPemFile] = useState();\n const [open, setOpen] = useState(false);\n const [error, setError] = useState('');\n const [certSource, setCertSource] = useState('upload');\n\n const { register, handleSubmit, errors, control, watch } = useForm({\n defaultValues: {\n name: certificate.name || certificate.domain,\n public: certificate.public || false,\n },\n });\n\n const domain = watch('domain', '');\n const name = watch('name', '');\n\n const onCancel = () => {\n setLoading(false);\n setOpen(false);\n };\n\n const submitUpload = async data => {\n if (mode === 'add') {\n const pem = (await readFile(pemFile)).replace(/\\r\\n/g, '\\n');\n const key = (await readFile(keyFile)).replace(/\\r\\n/g, '\\n');\n await api.addNginxHttpsCert({\n input: {\n name: data.name.trim(),\n public: data.public,\n certificate: pem.split('\\n').join('|'),\n privateKey: key.split('\\n').join('|'),\n },\n });\n } else {\n await api.updateNginxHttpsCert({\n input: {\n id: certificate.id,\n name: data.name.trim(),\n public: data.public,\n },\n });\n }\n };\n\n const submitLetsEncrypt = data => api.issueLetsEncryptCert({ input: { domain: data.domain } });\n\n const certSources = {\n upload: {\n name: t('router.cert.nginx.sourceTypes.upload'),\n value: 'upload',\n onSubmit: submitUpload,\n },\n lets_encrypt: {\n name: t('router.cert.nginx.sourceTypes.lets_encrypt'),\n value: 'lets_encrypt',\n onSubmit: submitLetsEncrypt,\n },\n };\n\n const onSubmit = async data => {\n setLoading(true);\n\n try {\n const source = certSources[certSource];\n if (!source) {\n throw new Error('Invaid certificate source');\n }\n\n await source.onSubmit(data);\n onRefresh();\n setOpen(false);\n } catch (err) {\n setError(formatError(err) || 'unknown error, may be you can check file permission');\n } finally {\n setLoading(false);\n }\n };\n\n const handleAdd = () => {\n setKeyFile(null);\n setPemFile(null);\n setOpen(true);\n setError('');\n };\n\n const handleChangeCertSource = e => {\n setCertSource(e.target.value);\n };\n\n const disableConfirmButton = () => {\n if (loading) {\n return true;\n }\n\n if (certSource === 'upload' && mode === 'update') {\n return !name;\n }\n\n if (certSource === 'upload' && mode === 'add') {\n return !name || !keyFile || !pemFile;\n }\n\n if (certSource === 'lets_encrypt' && !domain) {\n return true;\n }\n\n return false;\n };\n\n const Upload = () => {\n const onDropRejected = files => {\n if (files.length > 0) {\n setError(get(files[0], 'errors[0].message', t('router.cert.add.invalidFile')));\n }\n };\n\n const { getRootProps: getPemRootProps, getInputProps: getPemInputProps } = useDropzone({\n accept: ['.pem', '.crt'],\n multiple: false,\n maxSize: MAX_FILE_SIZE,\n onDropRejected,\n onDrop: acceptedFiles => {\n setPemFile(acceptedFiles[0]);\n },\n });\n\n const { getRootProps: getKeyRootProps, getInputProps: getKeyInputProps } = useDropzone({\n accept: ['.pem', '.key'],\n multiple: false,\n maxSize: MAX_FILE_SIZE,\n onDropRejected,\n onDrop: acceptedFiles => {\n setKeyFile(acceptedFiles[0]);\n },\n });\n\n return (\n <>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.name')}</div>\n <TextField\n fullWidth\n autoFocus\n error={!!errors.name}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"name\"\n className=\"form-item-value\"\n helperText={errors.name && errors.name.message}\n inputRef={register({\n validate: value => !!value.trim() || t('common.requiredErrorText', { name: t('router.cert.name') }),\n })}\n value={name}\n />\n </section>\n {mode === 'add' && (\n <>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.nginx.pem')}</div>\n <div className=\"form-item-value\">\n <div {...getPemRootProps({ className: 'dropzone' })}>\n <input {...getPemInputProps()} data-cy=\"pem-input\" />\n {pemFile && <Typography color=\"secondary\">{pemFile.name}</Typography>}\n {!pemFile && <Typography color=\"secondary\">{t('router.cert.nginx.empty')}</Typography>}\n <Typography component=\"small\" variant=\"body2\" color=\"textSecondary\">\n {t('router.cert.nginx.pemTip')}\n </Typography>\n </div>\n </div>\n </section>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.nginx.key')}</div>\n <div className=\"form-item-value\">\n <div {...getKeyRootProps({ className: 'dropzone' })}>\n <input {...getKeyInputProps()} data-cy=\"key-input\" />\n {keyFile && <Typography color=\"secondary\">{keyFile.name}</Typography>}\n {!keyFile && <Typography color=\"secondary\">{t('router.cert.nginx.empty')}</Typography>}\n <Typography component=\"small\" variant=\"body2\" color=\"textSecondary\">\n {t('router.cert.nginx.keyTip')}\n </Typography>\n </div>\n </div>\n </section>\n </>\n )}\n </>\n );\n };\n\n const LetsEncrypt = () => (\n <>\n <section className=\"form-item\">\n <Alert type=\"success\">{t('router.domainAlias.genLetsEncryptCert.dnsTip')}</Alert>\n </section>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('common.domain')}</div>\n <TextField\n fullWidth\n autoFocus\n error={!!errors.domain}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n className=\"form-item-value\"\n helperText={errors.domain && errors.domain.message}\n inputRef={register({\n validate: value => !!value.trim() || t('common.requiredErrorText', { name: t('common.domain') }),\n })}\n value={domain}\n />\n </section>\n </>\n );\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={handleAdd}\n className=\"rule-action\"\n rounded\n color=\"primary\"\n data-cy=\"add-cert\"\n {...restProps}>\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 16 }} />}\n {t(mode === 'add' ? 'common.add' : 'common.update')}\n </Button>\n {open && (\n <Dialog\n title={t(mode === 'add' ? 'router.cert.nginx.titleAdd' : 'router.cert.nginx.title')}\n open\n onClose={onCancel}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\" data-cy=\"cert-cancel\">\n {t('router.cert.nginx.cancel')}\n </Button>\n <Button\n onClick={handleSubmit(onSubmit)}\n color=\"secondary\"\n size=\"small\"\n disabled={disableConfirmButton()}\n variant=\"contained\"\n autoFocus\n data-cy=\"save-cert\"\n rounded>\n {t('router.cert.nginx.confirm')}\n {loading && <Spinner size={[16, 10]} />}\n </Button>\n </>\n }>\n <form className=\"form\" data-cy=\"cert-form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n <Box minWidth={{ sm: 480 }}>\n <DialogContentText component=\"div\">\n {mode === 'add' && (\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.source')}</div>\n <RadioGroup\n aria-label=\"cert-source\"\n name=\"certSource\"\n value={certSource}\n onChange={handleChangeCertSource}>\n {Object.values(certSources).map(source => (\n <FormControlLabel\n key={source.value}\n value={source.value}\n control={<Radio />}\n label={source.name}\n />\n ))}\n </RadioGroup>\n </section>\n )}\n {certSource === 'upload' && <Upload />}\n {certSource === 'lets_encrypt' && <LetsEncrypt />}\n <section className=\"form-item\" style={{ display: 'flex', alignItems: 'center' }}>\n <Controller\n control={control}\n name=\"public\"\n render={({ onChange, onBlur, value, name: tName }) => (\n <FormControlLabel\n control={\n <Checkbox\n onBlur={onBlur}\n onChange={e => onChange(e.target.checked)}\n checked={value}\n name={tName}\n />\n }\n label={t('router.cert.setPublic')}\n />\n )}\n />\n <Typography color=\"error\" component=\"span\" style={{ fontSize: '0.8em' }}>\n {t('router.cert.setPublicCertHelperText')}\n </Typography>\n </section>\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" style={{ marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </Box>\n </form>\n </Dialog>\n )}\n </>\n );\n}\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../../confirm';\nimport getClient from '../../../../libs/node';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nexport default function DeleteCert(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, onDelete = () => {}, ...restProps } = props;\n const { refresh: refreshRoutingContext } = useRoutingContext();\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteNginxHttpsCert({ input: { id } });\n refreshRoutingContext();\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: t('router.cert.delete.title'),\n description: t('router.cert.delete.description'),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n variant=\"text\"\n color=\"danger\"\n data-cy=\"action-delete-cert\"\n {...restProps}>\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport get from 'lodash/get';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useTheme } from '@material-ui/core/styles';\nimport Button from '@arcblock/ux/lib/Button';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport DetailsIcon from '@material-ui/icons/Details';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\n\nimport { formatToDate, formatToDatetime } from '../../../../libs/util';\n\nexport default function DetailCert(props) {\n const { certificate = {}, ...restProps } = props;\n const { t } = useLocaleContext();\n const [open, setOpen] = useState(false);\n const theme = useTheme();\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const certBasicRows = [\n {\n id: 'matchedSites',\n name: t('router.cert.matchedSites'),\n value: (certificate.matchedSites || []).map(s => (\n <Typography component=\"div\" key={s.id} style={{ fontWeight: 'inherit', fontSize: '1.1rem' }}>\n {s.domain}\n </Typography>\n )),\n },\n {\n id: 'updatedAt',\n name: t('common.updatedAt'),\n value: formatToDatetime(certificate.updatedAt),\n },\n {\n id: 'createdAt',\n name: t('common.createdAt'),\n value: formatToDatetime(certificate.createdAt),\n },\n ];\n\n const certInfoRows = [\n {\n id: 'boundDomains',\n name: t('router.cert.boundDomains'),\n value: (\n <Typography component=\"span\" style={{ fontSize: '1.1rem' }}>\n {(get(certificate, 'sans') || []).join(', ')}\n </Typography>\n ),\n },\n {\n id: 'issuer',\n name: t('common.issuer'),\n value: get(certificate, 'meta.issuer.commonName', ''),\n },\n {\n id: 'fingerprint',\n name: t('common.fingerprint'),\n value: get(certificate, 'meta.fingerprint'),\n },\n {\n id: 'fingerprintAlg',\n name: t('router.cert.fingerprintAlg'),\n value: get(certificate, 'meta.fingerprintAlg'),\n },\n {\n id: 'validityPeriod',\n name: t('router.cert.validityPeriod'),\n value: moment.duration(get(certificate, 'meta.validityPeriod'), 'ms').humanize(),\n },\n { id: 'issuedOn', name: t('router.cert.issuedOn'), value: formatToDate(get(certificate, 'meta.validFrom')) },\n { id: 'expiryOn', name: t('router.cert.expiryOn'), value: formatToDate(get(certificate, 'meta.validTo')) },\n ];\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={() => setOpen(true)}\n size=\"small\"\n className=\"rule-action\"\n variant=\"text\"\n color=\"secondary\"\n data-cy=\"action-view-cert\"\n {...restProps}>\n <DetailsIcon style={{ fontSize: 16 }} />\n {t('common.detail')}\n </Button>\n <Dialog\n title={t('router.cert.detail.title')}\n aria-labelledby=\"certificate details\"\n fullWidth\n open={open}\n showCloseButton={false}\n actions={\n <>\n <Button autoFocus rounded variant=\"contained\" onClick={handleClose} color=\"secondary\">\n {t('common.close')}\n </Button>\n </>\n }>\n <DialogContentText key=\"cert-basic\" component=\"div\" style={{ margin: theme.spacing(2) }}>\n {certBasicRows.map(row => (\n <InfoRow key={row.id} nameWidth={200} valueComponent=\"div\" name={row.name}>\n {row.value}\n </InfoRow>\n ))}\n </DialogContentText>\n <Divider />\n <DialogContentText key=\"cer-info\" component=\"div\" style={{ margin: theme.spacing(2) }}>\n {certInfoRows.map(row => (\n <InfoRow key={row.id} nameWidth={200} valueComponent=\"div\" name={row.name}>\n {row.value}\n </InfoRow>\n ))}\n </DialogContentText>\n <Divider />\n </Dialog>\n </>\n );\n}\n\nDetailCert.propTypes = {\n certificate: PropTypes.object.isRequired,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Typography from '@material-ui/core/Typography';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function MatchedSites(props) {\n const { certificate, style, ...restProps } = props;\n const { t } = useLocaleContext();\n const [showMore, setShowMore] = useState(false);\n\n const sites = certificate.matchedSites || [];\n\n return (\n <Typography\n component=\"ul\"\n {...restProps}\n style={{\n ...style,\n listStyle: 'none',\n }}>\n {(showMore ? sites : sites.slice(0, 4)).map(s => (\n <Typography component=\"li\" key={s.id} style={{ fontSize: '1.1rem' }}>\n {s.domain}\n </Typography>\n ))}\n {sites.length > 4 && (\n <Button\n style={{ border: 'none', padding: '5px 0' }}\n variant=\"outlined\"\n color=\"primary\"\n className=\"button\"\n onClick={() => {\n setShowMore(!showMore);\n }}>\n {showMore ? t('common.collapseAll') : t('common.expandAll')}\n </Button>\n )}\n </Typography>\n );\n}\n\nMatchedSites.propTypes = {\n certificate: PropTypes.object.isRequired,\n style: PropTypes.object,\n};\nMatchedSites.defaultProps = {\n style: {},\n};\n","/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport get from 'lodash/get';\nimport { LocaleContext, useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport MaterialTable from 'material-table';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport InfoIcon from '@material-ui/icons/InfoOutlined';\n\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\nimport getClient from '../../libs/node';\nimport UpdateNginxCert from './rule/action/update-cert/nginx';\nimport DeleteCert from './rule/action/delete-cert';\nimport DetailCert from './rule/action/detail-cert';\nimport MatchedSites from './rule/action/matched-sites';\nimport { formatToDate } from '../../libs/util';\nimport Permission from '../permission';\nimport Tag from '../tag';\n\nconst oneDayTimestamp = 1 * 24 * 60 * 60 * 1000;\n\nconst isExpired = expiresTime => {\n if (!expiresTime) return false;\n const currentTime = +new Date();\n const time = expiresTime - currentTime;\n\n return time <= 0;\n};\n\nconst ExpiresCell = ({ expiresTime }) => {\n const { t } = useContext(LocaleContext);\n\n if (!expiresTime) return null;\n\n const currentTime = +new Date();\n const time = expiresTime - currentTime;\n\n if (isExpired(expiresTime)) {\n return <span style={{ fontSize: '16px', color: 'red', whiteSpace: 'nowrap' }}>{formatToDate(expiresTime)}</span>;\n }\n\n return (\n <span style={{ color: time / oneDayTimestamp < 7 ? '#f90' : '#222', fontSize: '16px', whiteSpace: 'nowrap' }}>\n {formatToDate(expiresTime)}\n <span style={{ marginLeft: 6 }}>\n ({Math.ceil(time / oneDayTimestamp)}\n {t('router.cert.leftDays')})\n </span>\n </span>\n );\n};\nExpiresCell.propTypes = {\n expiresTime: PropTypes.number,\n};\n\nExpiresCell.defaultProps = {\n expiresTime: 0,\n};\n\n// eslint-disable-next-line react/prop-types\nconst TableCellInfoRow = ({ name, value, style = {}, icon, ...props }) => (\n <TableCellContainer style={{ display: 'flex', alignItems: 'center', ...style }} {...props}>\n <span>{name}:</span>\n <span>{value}</span>\n {icon && icon}\n </TableCellContainer>\n);\n\nconst TableCellContainer = styled.div`\n & > span {\n margin: 5px;\n }\n`;\n\nconst Status = ({ status, source, expiresTime }) => {\n const { t } = useLocaleContext();\n\n if (isExpired(expiresTime)) {\n return <Tag type=\"error\">{t('router.cert.expired')}</Tag>;\n }\n\n if (source === 'upload') {\n return <Tag type=\"success\">{t('common.normal')}</Tag>;\n }\n\n if (status === 'error') {\n return <Tag type=\"error\">{t('common.error')}</Tag>;\n }\n\n if (status === 'generated') {\n return <Tag type=\"success\">{t('common.normal')}</Tag>;\n }\n\n return '';\n};\n\nStatus.propTypes = {\n status: PropTypes.string,\n source: PropTypes.string,\n expiresTime: PropTypes.number.isRequired,\n};\n\nStatus.defaultProps = {\n status: '',\n source: '',\n};\n\nexport default function CertificateManager() {\n const { t } = useContext(LocaleContext);\n const client = getClient();\n\n const state = useAsyncRetry(async () => {\n // eslint-disable-next-line no-shadow\n const { certificates } = await client.getCertificates();\n return { certificates };\n });\n\n const onRefresh = () => {\n state.retry();\n };\n\n const columns = [\n {\n title: t('common.certificate'),\n render: row => (\n <>\n {row.name && (\n <TableCellInfoRow\n nowrap\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n name={t('common.name')}\n value={row.name}\n />\n )}\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n name={t('common.issuer')}\n value={get(row, 'meta.issuer.commonName', '')}\n />\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n icon={\n <Tooltip\n title={row.isPublic ? t('router.cert.publicCertHelperText') : t('router.cert.nonPublicCertHelperText')}>\n <InfoIcon style={{ fontSize: '18px' }} color=\"secondary\" />\n </Tooltip>\n }\n name={t('common.isPublic')}\n value={row.public ? t('common.yes') : t('common.no')}\n />\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n icon={\n <Tooltip\n title={\n row.isProtected\n ? t('router.cert.protectedCertHelperText')\n : t('router.cert.unprotectedCertHelperText')\n }>\n <InfoIcon style={{ fontSize: '18px' }} color=\"secondary\" />\n </Tooltip>\n }\n name={t('common.protected')}\n value={row.isProtected ? t('common.yes') : t('common.no')}\n />\n </>\n ),\n },\n {\n title: t('router.cert.boundDomains'),\n render: row => (\n <Typography noWrap component=\"ul\" style={{ listStyle: 'none' }}>\n {[...new Set([...(get(row, 'meta.sans') || []), row.domain])].map(s => (\n <Typography component=\"li\" key={s} style={{ fontSize: '1.1rem' }}>\n {s}\n </Typography>\n ))}\n </Typography>\n ),\n },\n {\n title: t('router.cert.source'),\n render: row => t(`router.cert.sourceTypes.${row.source}`),\n },\n {\n title: t('common.status'),\n render: row => <Status status={row.status} source={row.source} expiresTime={get(row, 'meta.validTo')} />,\n },\n {\n title: t('common.expires'),\n width: 120,\n render: row => <ExpiresCell expiresTime={get(row, 'meta.validTo')} />,\n },\n {\n title: t('router.cert.matchedSites'),\n render: row => <MatchedSites id={row.id} certificate={row} style={{ whiteSpace: 'nowrap' }} />,\n },\n {\n title: t('router.cert.action'),\n align: 'center',\n render: item => {\n const row = item;\n return (\n <Permission permission=\"mutate_router\">\n <>\n {!row.isProtected && (\n <>\n {row.source === 'upload' && (\n <div>\n <UpdateNginxCert mode=\"update\" certificate={row} onRefresh={onRefresh} />\n </div>\n )}\n <div>\n <DeleteCert id={row.id} onDelete={onRefresh} />\n </div>\n </>\n )}\n <div>\n <DetailCert id={row.id} certificate={row} />\n </div>\n </>\n </Permission>\n );\n },\n },\n ];\n\n if (!state.value && state.loading) {\n return <Spinner />;\n }\n\n return (\n <Div>\n <div className=\"table-header\">\n <Permission permission=\"mutate_router\">\n <UpdateNginxCert mode=\"add\" onRefresh={onRefresh} variant=\"contained\" />\n </Permission>\n </div>\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: false,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n search: false,\n pageSize: 1000,\n pageSizeOptions: [1000],\n headerStyle: { fontSize: 18 },\n }}\n localization={{\n body: {\n emptyDataSourceMessage: t('router.cert.table.nodata'),\n },\n }}\n data={state.value.certificates}\n />\n </TableStyle>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n margin-top: 20px;\n }\n\n margin-bottom: 24px;\n .table-cell {\n span {\n font-size: 18px;\n }\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n span {\n font-size: 15px;\n }\n }\n }\n .match-sites-cell,\n .expires-cell {\n min-width: 100px;\n }\n .actions {\n text-align: center;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n .MuiButton-root {\n padding: 6px;\n }\n }\n }\n`;\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useContext } from 'react';\nimport styled from 'styled-components';\nimport { useParams, useHistory } from 'react-router-dom';\n\nimport Typography from '@material-ui/core/Typography';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { NodeContext } from '../../contexts/node';\nimport BasicSettings from '../../components/settings/basic';\nimport AccessKeySettings from '../../components/settings/access-key';\nimport WebHookSetting from '../../components/settings/webhook';\nimport About from '../../components/settings/about';\nimport RouterSettings from '../../components/router/router-setting';\nimport CertSetting from '../../components/router/cert-setting';\n\nexport default function Settings() {\n const history = useHistory();\n const { node } = useContext(NodeContext);\n const { t } = useContext(LocaleContext);\n\n const { tab = 'basic' } = useParams();\n\n const onTabChange = newTab => {\n history.push(`/settings/${newTab}`);\n };\n\n const tabs = [\n { label: t('common.basic'), value: 'basic' },\n { label: t('common.accessKey'), value: 'accesskey' },\n { label: t('router.routerSetting'), value: 'router' },\n { label: t('router.certSetting'), value: 'cert' },\n { label: t('common.webhook'), value: 'integration' },\n { label: t('common.about'), value: 'about' },\n ];\n\n const renders = {\n basic: BasicSettings,\n accesskey: AccessKeySettings,\n integration: WebHookSetting,\n about: About,\n router: RouterSettings,\n cert: CertSetting,\n };\n\n const TabComponent = renders[tab] || renders.basic;\n\n return (\n <Main>\n <Typography component=\"h2\" variant=\"h4\" className=\"page-header\" color=\"textPrimary\">\n {t('common.setting')}\n </Typography>\n <>\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n <div className=\"page-content\">\n <TabComponent node={node} />\n </div>\n </>\n </Main>\n );\n}\n\nconst Main = styled.main`\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .page-content {\n margin-top: 16px;\n }\n`;\n","import { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Alert from '@material-ui/lab/Alert';\nimport useTheme from '@material-ui/core/styles/useTheme';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { formatError } from '../libs/util';\nimport useMobileWidth from '../hooks/mobile-width';\n\nexport default function ConfirmDialog({\n title,\n description,\n showCancel,\n cancel,\n confirm,\n color,\n params: initialParams,\n onCancel,\n onConfirm,\n}) {\n const [params, setParams] = useState(initialParams);\n const [open, setOpen] = useState(true);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t: changeLocale } = useLocaleContext();\n const theme = useTheme();\n\n const onCallback = async cb => {\n if (typeof cb === 'function') {\n setLoading(true);\n try {\n await cb(params);\n setOpen(false);\n } catch (err) {\n setError(formatError(err));\n console.error(err);\n } finally {\n setLoading(false);\n }\n } else {\n setOpen(false);\n }\n };\n\n const t = typeof title === 'function' ? title() : title;\n const d = typeof description === 'function' ? description(params, setParams, setError) : description;\n\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n\n const handleClick = e => {\n e.stopPropagation();\n };\n const { minWidth } = useMobileWidth();\n\n return (\n <StyledDialog onClick={handleClick} fullScreen={isBreakpointsDownSm} open={open} style={{ minWidth }}>\n <DialogTitle>{t}</DialogTitle>\n <DialogContent style={{ minWidth }}>\n <DialogContentText component=\"div\">{d}</DialogContentText>\n {!!error && (\n <Alert severity=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </DialogContent>\n <DialogActions className=\"delete-actions\" style={{ padding: '8px 24px 24px' }}>\n {showCancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onCancel);\n }}\n color=\"default\"\n data-cy=\"cancel-confirm-dialog\"\n rounded\n size=\"small\">\n {cancel || changeLocale('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onConfirm);\n }}\n color={color}\n size=\"small\"\n // eslint-disable-next-line no-underscore-dangle\n disabled={params.__disableConfirm || loading}\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {confirm}\n </Button>\n </DialogActions>\n </StyledDialog>\n );\n}\n\nConfirmDialog.propTypes = {\n title: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n showCancel: PropTypes.bool,\n cancel: PropTypes.string,\n color: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nConfirmDialog.defaultProps = {\n onCancel: () => {},\n showCancel: true,\n cancel: '',\n confirm: 'Confirm',\n color: 'danger',\n params: {},\n};\n\nconst StyledDialog = styled(Dialog)`\n .delete-actions .Mui-disabled {\n color: rgba(0, 0, 0, 0.26) !important;\n box-shadow: none;\n background-color: rgba(0, 0, 0, 0.12) !important;\n }\n`;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport Copy from '@arcblock/ux/lib/ClickToCopy';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function ClickToCopy({ children, ...rest }) {\n const { t } = useContext(LocaleContext);\n return (\n <Copy tip={t('common.copyTip')} copiedTip={t('common.copiedTip')} {...rest}>\n {children}\n </Copy>\n );\n}\n\nClickToCopy.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","import Add from '@material-ui/icons/Add';\nimport Check from '@material-ui/icons/Check';\nimport Delete from '@material-ui/icons/Delete';\nimport Clear from '@material-ui/icons/Clear';\nimport Export from '@material-ui/icons/SaveAlt';\nimport Edit from '@material-ui/icons/Edit';\nimport Filter from '@material-ui/icons/Filter';\nimport FirstPage from '@material-ui/icons/FirstPage';\nimport LastPage from '@material-ui/icons/LastPage';\nimport NextPage from '@material-ui/icons/ChevronRight';\nimport PreviousPage from '@material-ui/icons/ChevronLeft';\nimport Search from '@material-ui/icons/Search';\nimport SortArrow from '@material-ui/icons/ArrowDropDown';\nimport ThirdStateCheck from '@material-ui/icons/Remove';\nimport ViewColumn from '@material-ui/icons/ViewColumn';\n\nexport default {\n Add,\n Check,\n Delete,\n Edit,\n Clear,\n DetailPanel: NextPage,\n Filter,\n FirstPage,\n LastPage,\n NextPage,\n PreviousPage,\n Search,\n ResetSearch: Clear,\n SortArrow,\n Export,\n ThirdStateCheck,\n ViewColumn,\n};\n","import styled from 'styled-components';\n\nconst TableStyle = styled.div`\n .MuiPaper-root {\n box-shadow: none !important;\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n .MuiToolbar-root {\n background: transparent;\n padding-left: 0;\n display: none;\n }\n\n .MuiTableHead-root th {\n min-width: 100px;\n background: transparent;\n }\n\n .MuiTable-root {\n overflow-y: hidden;\n }\n .MuiTableRow-root {\n border: none !important;\n }\n\n .MuiTableCell-root {\n padding-right: 16px;\n &:last-of-type {\n padding-right: 0;\n }\n }\n`;\n\nexport default TableStyle;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Dot from '../dot';\nimport Tag from '../tag';\nimport { isInProgress } from '../../libs/util';\n\nconst colors = {\n yellow: '#FFCF71',\n grey: '#888888',\n};\n\nexport default function BlockletStatus({ status, variant, ...rest }) {\n const { t } = useContext(LocaleContext);\n\n const map = {\n added: 'primary',\n waiting: 'warning',\n downloading: 'warning',\n downloaded: 'primary',\n installing: 'warning',\n installed: 'primary',\n starting: 'warning',\n running: 'success',\n stopping: 'warning',\n stopped: 'reverse',\n error: 'error',\n upgrading: 'warning',\n restarting: 'warning',\n corrupted: 'error',\n };\n\n const colorMap = {\n added: colors.grey,\n waiting: colors.yellow,\n downloading: colors.yellow,\n downloaded: colors.grey,\n installing: colors.yellow,\n installed: colors.grey,\n starting: colors.yellow,\n running: 'success',\n stopping: colors.yellow,\n stopped: colors.grey,\n error: 'error',\n upgrading: colors.yellow,\n restarting: colors.yellow,\n corrupted: 'error',\n };\n\n const inProgress = isInProgress(status);\n\n const statusTxt = t(`blocklet.status.${status}`);\n\n if (variant === 'dot') {\n return (\n <Tooltip title={t('blocklet.statusTip', { status: t(`blocklet.status.${status}`) })}>\n <Dot color={colorMap[status]} {...rest} />\n </Tooltip>\n );\n }\n\n return (\n <Tag type={map[status]} style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {inProgress && <Spinner size={[12, 6]} color=\"inherit\" style={{ marginRight: 5 }} />}\n {statusTxt}\n </Tag>\n );\n}\n\nBlockletStatus.propTypes = {\n status: PropTypes.string.isRequired,\n variant: PropTypes.oneOf(['dot', 'tag']),\n};\n\nBlockletStatus.defaultProps = {\n variant: 'tag',\n};\n","import styled from 'styled-components';\n\nconst color = {\n success: '#3ab39d',\n error: '#D0021B',\n};\n\nconst defaultSize = '10px';\n\nconst Dot = styled.div`\n display: inline-block;\n width: ${props => props.size || defaultSize};\n height: ${props => props.size || defaultSize};\n background: ${props => color[props.color] || props.color || color.success};\n border-radius: 100%;\n`;\n\nexport default Dot;\n","/* eslint-disable import/prefer-default-export */\nimport { ROUTING_RULE_TYPES, DEFAULT_IP_DNS_DOMAIN_SUFFIX } from '@abtnode/constant';\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX } from '@blocklet/meta/lib/constants';\n\nconst validateRuleByServiceType = (params, localeContext) => {\n if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n if (!params.url) {\n return new Error(`${localeContext('router.validation.redirectUrlRequired')}`);\n }\n\n if (!params.redirectCode) {\n return new Error(`redirect ${localeContext('router.validation.redirectCodeRequired')}`);\n }\n } else if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n if (!params.did) {\n return new Error(localeContext('router.validation.didRequired'));\n }\n }\n\n return null;\n};\n\nexport const validateDomain = (domain, localeContext) => {\n if (!domain) {\n return localeContext('router.domain.validate.emptyTip');\n }\n\n if (domain.endsWith(DEFAULT_IP_DNS_DOMAIN_SUFFIX)) {\n return localeContext('router.domain.validate.suffixTip', { suffix: DEFAULT_IP_DNS_DOMAIN_SUFFIX });\n }\n\n return null;\n};\n\n/**\n * form validator of add site(add domain)\n * @param {Object} params form params\n * @param {Function} localeContext error message\n */\nexport const validateSite = (params, localeContext) => {\n const validateResult = validateRuleByServiceType(params, localeContext);\n if (validateResult) {\n return validateResult;\n }\n\n const errMsg = validateDomain(params.domain, localeContext);\n if (errMsg) {\n return new Error(errMsg);\n }\n\n return null;\n};\n\n/**\n * form validator of add_rule and update_rule\n * @param {Object} params form params\n * @param {Function} localeContext error message\n */\nexport const validateRule = (params, localeContext) => {\n const validateResult = validateRuleByServiceType(params, localeContext);\n if (validateResult) {\n return validateResult;\n }\n\n if (!params.pathPrefix.length) {\n return new Error(localeContext('router.validation.pathPrefixCannotBeEmpty'));\n }\n\n if (params.pathPrefix.length > 150) {\n return new Error(localeContext('router.validation.pathPrefixTooLong', { length: 150 }));\n }\n\n return null;\n};\n\nexport const validatePathPrefix = ({ params, blocklets }) => {\n const blocklet = blocklets.find(item => item.meta.did === params.did);\n if (!blocklet) {\n return '';\n }\n\n const selected = blocklet.meta.interfaces.find(x => x.name === params.interfaceName);\n if (!selected) {\n return '';\n }\n\n if (selected.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX && params.pathPrefix !== selected.prefix) {\n return `This blocklet can only be mounted on path prefix ${selected.prefix}`;\n }\n\n return '';\n};\n\n/**\n * get initial blocklet did when add rule / update rule / add domain\n * @param {array} blocklets\n */\nexport const getInitialBlockletDid = blocklets => {\n if (blocklets.length === 0) {\n return '';\n }\n const { searchParams } = new URL(window.location.href);\n const fromDid = searchParams.get('fromDid');\n if (fromDid) {\n const blocklet = blocklets.find(x => x.meta.did === fromDid);\n if (blocklet) {\n return blocklet.meta.did;\n }\n }\n return blocklets[0].meta.did;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport OriTag from '@arcblock/ux/lib/Tag';\n\nexport default function Tag({ children, ...rest }) {\n return (\n <OriTag style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {children}\n </OriTag>\n );\n}\n\nTag.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","/* eslint-disable react/no-danger */\n/* eslint-disable react/prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\n\nimport Alert from '@material-ui/lab/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ClickToCopy from './click-to-copy';\n\nimport Confirm from './confirm';\n\nexport default function CancelConfirm({\n title,\n description,\n confirmPlaceholder,\n cancel,\n confirm,\n params: initialParams,\n onCancel,\n onConfirm,\n keyName,\n}) {\n const { t } = useLocaleContext();\n\n const confirmSetting = {\n title: () => (\n <div>\n {title}\n {` (${keyName})`}\n </div>\n ),\n description: (params, setParams) => {\n const setValue = value => {\n // eslint-disable-next-line no-underscore-dangle\n setParams({ ...value, __disableConfirm: value.__disableConfirm });\n };\n\n return (\n <div>\n <Alert severity=\"warning\" style={{ width: '100%' }}>\n {t('common.notice')}\n </Alert>\n <div style={{ marginTop: 24, marginBottom: 24 }} dangerouslySetInnerHTML={{ __html: description }} />\n <div style={{ marginBottom: 24 }}>\n {t('common.click')}\n {':'}\n <ClickToCopy data-cy=\"click-copy\">{keyName}</ClickToCopy>\n </div>\n <Typography component=\"div\">\n <TextField\n label={confirmPlaceholder}\n autoComplete=\"off\"\n data-cy=\"delete-confirm-input\"\n variant=\"outlined\"\n fullWidth\n autoFocus\n value={params.inputVal}\n onChange={e => {\n setValue({ ...params, inputVal: e.target.value, __disableConfirm: keyName !== e.target.value });\n }}\n />\n </Typography>\n </div>\n );\n },\n confirm,\n cancel,\n onConfirm,\n onCancel,\n params: {\n inputVal: '',\n __disableConfirm: true,\n ...initialParams,\n },\n };\n\n return (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n );\n}\n\nCancelConfirm.propTypes = {\n title: PropTypes.any.isRequired,\n keyName: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n confirmPlaceholder: PropTypes.any.isRequired,\n cancel: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nCancelConfirm.defaultProps = {\n onCancel: () => {},\n cancel: '',\n confirm: 'Confirm',\n params: {},\n};\n","/* eslint-disable no-use-before-define */\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nexport default function usePersistentSort(name, initialDirections) {\n const [sortDirections, setSortDirections] = useLocalStorage(`ps_${name}`, initialDirections);\n\n const onSortChange = (columnIndex, directionValue) => {\n const newSortDirections = directionValue ? new Array(initialDirections.length).fill('') : [...initialDirections];\n\n if (columnIndex > -1) {\n newSortDirections[columnIndex] = directionValue;\n }\n\n setSortDirections(newSortDirections);\n };\n\n return {\n sortDirections, // 当前的排序\n onSortChange, // 给外部的回调,可以更新内部的 sort\n };\n}\n","import React, { useContext, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport getClient from '../libs/node';\nimport { useSubscription } from '../libs/ws';\nimport { shouldCheckDomainStatus } from '../libs/util';\n\nconst DomainStatusContext = React.createContext({});\nconst { Provider, Consumer } = DomainStatusContext;\n\nfunction DomainStatusProvider({ children, domains }) {\n const client = getClient();\n const [status, setStatus] = useState({});\n\n useSubscription('domain.status', data => {\n if (data) {\n setStatus(pre => ({ ...pre, [data.domain]: data }));\n }\n });\n\n const getDomainStatus = async () => {\n if (!Array.isArray(domains)) {\n return;\n }\n\n const tempDomains = domains.filter(domain => shouldCheckDomainStatus(domain));\n if (tempDomains.length > 0) {\n client.checkDomains({\n input: { domains },\n });\n }\n };\n\n useEffect(() => {\n getDomainStatus({ silent: true });\n }, [JSON.stringify(domains)]); // eslint-disable-line\n\n const value = {\n refresh: getDomainStatus,\n api: client,\n };\n\n value.status = status;\n\n return <Provider value={{ status: value }}>{children}</Provider>;\n}\n\nDomainStatusProvider.propTypes = {\n children: PropTypes.object.isRequired,\n domains: PropTypes.array.isRequired,\n};\n\nfunction useDomainStatusContext() {\n const { status } = useContext(DomainStatusContext);\n return status;\n}\n\nexport { DomainStatusContext, DomainStatusProvider, Consumer as DomainStatusConsumer, useDomainStatusContext };\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["../../mocks/lib/jspdf.js","components/router/rule/action/config-routing-rule.js","components/passport-tag.js","components/blocklet/service-tags.js","components/blocklet/interface.js","components/router/rule/domain-status.js","components/router/rule/action/add-domain-alias.js","components/router/rule/action/add-rule.js","components/router/rule/action/update-domain-security.js","components/router/rule/action/delete-domain-alias.js","components/router/rule/action/update-rule.js","components/router/rule/action/delete-rule.js","components/switch-control.js","components/notifications/leave-page-prompt.js","components/node/form.js","components/settings/basic.js","components/access-key/create.js","components/access-key/confirm.js","components/access-key/delete.js","components/access-key/update.js","components/settings/access-key.js","components/webhook/delete.js","components/settings/webhook.js","components/danger-zone.js","components/node/upgrade/confirm.js","components/node/upgrade/check.js","components/settings/about.js","components/router/rule/action/add-domain.js","components/router/rule/action/delete-domain.js","components/router/rule/action/update-domain.js","components/router/rule/action/index.js","components/router/rule/item.js","components/router/router-setting.js","components/router/rule/action/update-cert/nginx.js","components/router/rule/action/delete-cert.js","components/router/rule/action/detail-cert.js","components/router/rule/action/matched-sites.js","components/router/cert-setting.js","pages/settings/index.js","hooks/mobile-width.js","components/confirm.js","components/click-to-copy.js","components/table-icons.js","components/table.js","components/blocklet/status.js","components/dot.js","components/router/rule/action/utils/index.js","components/tag.js","components/delete-confirm.js","hooks/persistent-sort.js","contexts/domain-status.js"],"names":["module","exports","ConfigRoutingRule","params","blocklets","setParams","setError","serviceTypes","t","useLocaleContext","redirectCodesMap","302","301","sortedBlocklets","sortBy","x","meta","name","getParamsOnBlockletChange","did","blocklet","find","webInterface","get","type","BLOCKLET_INTERFACE_TYPE_WEB","getWebInterface","selected","port","ports","internal","pathPrefix","prefix","BLOCKLET_DYNAMIC_PATH_PREFIX","getParamsFromInterface","interfaceName","useEffect","ROUTING_RULE_TYPES","BLOCKLET","__disableConfirm","select","label","autoComplete","variant","data-cy","fullWidth","value","onChange","e","target","style","marginBottom","SelectProps","map","key","version","marginLeft","status","length","REDIRECT","redirectCode","Object","keys","code","autoFocus","url","helperText","trim","defaultProps","NONE","PassportTag","props","passport","onDelete","rest","Tag","title","className","onClick","styled","span","useStyles","makeStyles","tooltip","maxWidth","ServiceTags","classes","Array","isArray","services","upperCase","replace","content","config","entries","d","join","String","filter","sort","a","b","aKey","bKey","localeCompare","Tooltip","interactive","paddingRight","Flex","flexShrink","width","textAlign","marginRight","margin","cursor","fill","div","BlockletInterface","useContext","LocaleContext","locale","interfaces","EmptyTipOut","to","checkIsWildcardDomain","encodeWildcardDomain","Container","href","appendParams","Certificate","certificate","React","useState","anchorEl","setAnchorEl","node","useNodeContext","handlePopoverClose","open","Boolean","aria-owns","undefined","onMouseEnter","event","currentTarget","onMouseLeave","color","fontSize","id","pointerEvents","anchorOrigin","vertical","horizontal","transformOrigin","onClose","disableRestoreFocus","display","src","alt","maxHeight","component","fontWeight","domain","formatToDate","validFrom","validTo","DomainStatus","filters","useDomainStatusContext","shouldCheckDomainStatus","window","location","hostname","domainIcon","httpsIcon","isHttps","matchedCert","dns","resolved","ip","items","propTypes","PropTypes","string","isRequired","array","AddDomainAlias","onActivate","children","actions","useRoutingContext","loading","setLoading","confirmSetting","setConfirmSetting","DOMAIN_FOR_DEFAULT_SITE","onConfirm","addDomainAlias","onEnter","confirm","formatError","setting","description","inputProps","errMsg","validateDomain","onKeyPress","preventDefault","cancel","onCancel","onMenuItemClick","stopPropagation","size","AddRule","onRuleAdded","validateRule","err","rule","from","addRule","disable","validateResult","validatePathPrefix","getInitialBlockletDid","UpdateDomainSecurity","corsAllowedOrigins","isSpecialDomain","text","endsWith","BLOCKLET_SITE_GROUP_SUFFIX","updateSite","split","DeleteDomainAlias","domainAlias","deleteDomainAlias","console","error","rounded","edge","UpdateRule","parent","updateRule","DeleteRule","siteId","deleteRule","keyName","confirmPlaceholder","withStyles","theme","root","height","padding","spacing","switchBase","transform","palette","common","white","backgroundColor","opacity","border","thumb","track","borderRadius","grey","transition","transitions","create","checked","focusVisible","Switch","focusVisibleClassName","disableRipple","RouterPrompt","confirmPrompt","setConfirmPrompt","onPromptDialogCancel","onPromptDialogConfirm","env","apiPrefix","history","push","pathname","substring","reload","Div","message","args","settings","breakpoints","values","sm","initDefaultValues","info","webWalletUrl","diskAlertThreshold","ConfigForm","onSaved","submit","disabled","useForm","defaultValues","register","handleSubmit","errors","formState","reset","warning","setWarning","autoUpgrade","setAutoUpgrade","enableWelcomePage","setEnableWelcomePage","setCurrent","w","isDirty","onSubmit","data","getClient","updateNodeInfo","input","result","sleep","noValidate","Typography","permission","hasPermission","TextField","placeholder","inputRef","validate","onFocus","min","max","FormControlLabel","control","marginTop","BasicSettings","refresh","setMessage","silent","Box","mb","CreateAccessKey","remark","onCreate","client","roles","RBAC_CONFIG","ROLES","OWNER","createAccessKey","res","FormControl","InputLabel","Select","r","MenuItem","ConfirmAccessKey","accessKeyId","accessKeySecret","setChecked","hideAccessSecret","setHideAccessSecret","disableBackdropClick","disableEscapeKeyDown","showCloseButton","aria-labelledby","Bold","Item","Label","Checkbox","labelPlacement","DeleteAccessKey","formatTime","time","deleteAccessKey","formatToDatetime","timeAge","format","Date","formatLocale","UpdateAccessKey","onUpdate","updateAccessKey","AccessKey","api","confirmInfo","setConfirmInfo","state","useAsyncRetry","getAccessKeys","response","list","usePersistentSort","sortDirections","onSortChange","columns","field","defaultSort","render","p","whiteSpace","createdAt","lastUsedAt","sorting","align","item","retry","severity","show","icons","tableIcons","options","emptyRowsWhenPaging","actionsColumnIndex","tableLayout","maxBodyHeight","pageSize","onOrderChange","localization","body","emptyDataSourceMessage","deleteWebHook","HookSetting","enqueueSnackbar","useSnackbar","buttonAnchorRef","useRef","defaultConfig","setDefaultConfig","setOpen","Promise","all","getWebHooks","getWebhookSenders","webhooks","senders","createWebHook","autoHideDuration","onSetWebHook","inputList","Main","index","Form","defaultValue","required","trimValue","checkInputByType","some","webhookIcon","onSendTestNotification","rowInfo","webhookId","sendTestMessage","desc","alignItems","Number","SendIconInfo","ref","preOpen","Popper","current","disablePortal","placement","zIndex","Paper","ClickAwayListener","onClickAway","contains","ListItemText","primary","secondary","SendIcon","DangerItem","gutterBottom","DangerZone","ConfirmUpgrade","nextVersion","upgradeNodeVersion","UpgradeCheck","onDone","showCancel","onCheck","checkNodeVersion","IconButton","aria-label","About","useHistory","nodeInfo","extra","getNodeEnv","assign","rows","nodeOwner","os","docker","gitpod","blockletEngines","visible","available","forEach","displayName","can","my","justifyContent","flexDirection","showText","ml","valueComponent","nameWidth","mt","AddDomain","bInterface","rules","addSite","setValue","validateSite","URL","searchParams","DeleteDomain","deleteSite","UpdateDomain","RuleItemAction","isProtected","mouseDown","onMouseDown","Menu","keepMounted","getContentAnchorEl","RedirectRule","toUrl","scheme","tmpToUrl","isUrl","NoneRule","RuleItem","useBlockletContext","domainsStatus","depth","ruleId","initialExpand","expand","domainAliases","setExpand","IconComponent","NodeIcon","DomainIcon","RuleIcon","DomainLink","primaryDomain","DASHBOARD","routing","adminPath","DomainElement","rel","ItemDiv","button","disableGutters","ListItemIcon","flex","ListItemSecondaryAction","Collapse","in","List","disablePadding","internalLink","DAEMON","dashboard","isHealthy","healthyTip","domainStatus","divider","paddingBottom","paddingLeft","wordBreak","ListItem","RouterPage","sites","allDomains","y","domains","main","md","lg","readFile","file","resolve","reject","reader","FileReader","readAsText","onload","onerror","UpdateNginxCert","onRefresh","mode","restProps","keyFile","setKeyFile","pemFile","setPemFile","certSource","setCertSource","public","watch","submitUpload","pem","addNginxHttpsCert","privateKey","updateNginxHttpsCert","certSources","upload","lets_encrypt","issueLetsEncryptCert","source","Error","Upload","onDropRejected","files","useDropzone","accept","multiple","maxSize","onDrop","acceptedFiles","getPemRootProps","getRootProps","getPemInputProps","getInputProps","getKeyRootProps","getKeyInputProps","LetsEncrypt","minWidth","DialogContentText","RadioGroup","Radio","onBlur","tName","DeleteCert","refreshRoutingContext","deleteNginxHttpsCert","DetailCert","useTheme","certBasicRows","matchedSites","s","updatedAt","certInfoRows","moment","duration","humanize","row","Divider","MatchedSites","showMore","setShowMore","listStyle","slice","isExpired","expiresTime","ExpiresCell","Math","ceil","TableCellInfoRow","icon","TableCellContainer","Status","CertificateManager","getCertificates","certificates","nowrap","isPublic","noWrap","Set","search","pageSizeOptions","headerStyle","Settings","NodeContext","useParams","tab","tabs","renders","basic","accesskey","AccessKeySettings","integration","WebHookSetting","about","router","RouterSettings","cert","CertSetting","TabComponent","newTab","scrollButtons","useMobileWidth","useMediaQuery","down","ConfirmDialog","initialParams","changeLocale","onCallback","cb","isBreakpointsDownSm","StyledDialog","fullScreen","DialogTitle","DialogContent","Alert","DialogActions","Dialog","ClickToCopy","tip","copiedTip","Add","Check","Delete","Edit","Clear","DetailPanel","NextPage","Filter","FirstPage","LastPage","PreviousPage","Search","ResetSearch","SortArrow","Export","ThirdStateCheck","ViewColumn","TableStyle","colors","BlockletStatus","colorMap","added","waiting","downloading","downloaded","installing","installed","starting","running","stopping","stopped","upgrading","restarting","corrupted","inProgress","isInProgress","statusTxt","success","Dot","validateRuleByServiceType","localeContext","DEFAULT_IP_DNS_DOMAIN_SUFFIX","suffix","fromDid","CancelConfirm","dangerouslySetInnerHTML","__html","inputVal","initialDirections","useLocalStorage","setSortDirections","columnIndex","directionValue","newSortDirections","DomainStatusContext","createContext","Provider","Consumer","DomainStatusProvider","setStatus","useSubscription","pre","getDomainStatus","checkDomains","JSON","stringify"],"mappings":"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","file":"static/js/15.403af260.chunk.js","sourcesContent":["module.exports = {};\n","/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport sortBy from 'lodash/sortBy';\nimport get from 'lodash/get';\n\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX, BLOCKLET_INTERFACE_TYPE_WEB } from '@blocklet/meta/lib/constants';\n\nimport BlockletStatus from '../../../blocklet/status';\n\nconst getWebInterface = blocklet => {\n const list = get(blocklet, 'meta.interfaces') || [];\n return list.find(x => x.type === BLOCKLET_INTERFACE_TYPE_WEB);\n};\n\nexport default function ConfigRoutingRule({ params, blocklets, setParams, setError, serviceTypes }) {\n const { t } = useLocaleContext();\n\n const redirectCodesMap = {\n 302: t('common.redirectTemporary'),\n 301: t('common.redirectPermanently'),\n };\n\n const sortedBlocklets = sortBy(blocklets, x => x.meta.name);\n\n const getParamsFromInterface = (blocklet, selected) => {\n if (!selected) {\n return {};\n }\n\n let { port } = blocklet;\n if (selected && blocklet.ports && selected.port) {\n if (blocklet.ports[selected.port]) {\n port = blocklet.ports[selected.port];\n }\n if (blocklet.ports[selected.port.internal]) {\n port = blocklet.ports[selected.port.internal];\n }\n }\n\n // When the blocklet interface can only be mounted at a fixed path\n let { pathPrefix } = params;\n if (selected && selected.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX) {\n pathPrefix = selected.prefix;\n }\n\n return { port, pathPrefix };\n };\n\n const getParamsOnBlockletChange = did => {\n const blocklet = sortedBlocklets.find(x => x.meta.did === did);\n const webInterface = getWebInterface(blocklet);\n\n return { ...getParamsFromInterface(blocklet, webInterface), interfaceName: webInterface ? webInterface.name : '' };\n };\n\n useEffect(() => {\n if (!params.interfaceName && params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n setParams({ ...params, ...getParamsOnBlockletChange(params.did), __disableConfirm: false });\n }\n }, []); // eslint-disable-line\n\n return (\n <>\n <TextField\n select\n label={t('router.domain.add.type')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"type\"\n data-cy=\"domain-add-type\"\n fullWidth\n value={params.type}\n onChange={e => {\n setError('');\n setParams({ ...params, type: e.target.value, __disableConfirm: false });\n }}\n style={{ marginBottom: 32 }}\n SelectProps={{}}>\n {serviceTypes.map(({ name, value }) => (\n <MenuItem key={value} value={value}>\n {name}\n </MenuItem>\n ))}\n </TextField>\n {params.type === ROUTING_RULE_TYPES.BLOCKLET && (\n <>\n <TextField\n select\n label={t('router.domain.add.blocklet')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"did\"\n data-cy=\"domain-blocklet-select\"\n fullWidth\n value={params.did}\n onChange={e => {\n setParams({\n ...params,\n ...getParamsOnBlockletChange(e.target.value),\n did: e.target.value,\n __disableConfirm: false,\n });\n }}\n style={{ marginBottom: 32 }}>\n {sortedBlocklets.map(x => (\n <MenuItem key={x.meta.did} value={x.meta.did}>\n {`${x.meta.name} v${x.meta.version}`}\n <span style={{ marginLeft: 8 }}>\n <BlockletStatus status={x.status} />\n </span>\n </MenuItem>\n ))}\n {blocklets.length === 0 && (\n <MenuItem key=\"empty\" value=\"\">\n {t('common.empty')}\n </MenuItem>\n )}\n </TextField>\n </>\n )}\n {params.type === ROUTING_RULE_TYPES.REDIRECT && [\n <TextField\n select\n label={t('router.domain.add.redirect')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"type\"\n fullWidth\n value={params.redirectCode}\n onChange={e => setParams({ ...params, redirectCode: e.target.value })}\n style={{ marginBottom: 32 }}\n SelectProps={{}}>\n {Object.keys(redirectCodesMap).map(code => (\n <MenuItem key={code} value={code}>\n {`${redirectCodesMap[code]} - ${code}`}\n </MenuItem>\n ))}\n </TextField>,\n <TextField\n label={t('common.redirectUrl')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"url\"\n data-cy=\"redirect-url-input\"\n fullWidth\n autoFocus\n value={params.url}\n helperText={t('router.urlHelperText')}\n style={{ marginBottom: 32 }}\n onChange={e => {\n setParams({ ...params, url: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('router.validation.redirectUrlRequired'));\n } else {\n setError('');\n }\n }}\n />,\n ]}\n </>\n );\n}\n\nConfigRoutingRule.propTypes = {\n params: PropTypes.object,\n blocklets: PropTypes.array,\n serviceTypes: PropTypes.array,\n setParams: PropTypes.func,\n setError: PropTypes.func,\n};\n\nConfigRoutingRule.defaultProps = {\n params: {},\n blocklets: [],\n serviceTypes: [\n { name: 'Blocklet', value: ROUTING_RULE_TYPES.BLOCKLET },\n { name: 'Redirect', value: ROUTING_RULE_TYPES.REDIRECT },\n { name: 'Default - User will see the 404 page', value: ROUTING_RULE_TYPES.NONE },\n ],\n setParams: () => {},\n setError: () => {},\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nexport default function PassportTag(props) {\n const { passport, onDelete, ...rest } = props;\n return (\n <Tag {...rest}>\n {passport.title || passport.name}{' '}\n {!!onDelete && <CloseIcon data-cy=\"delete-issuance\" className=\"delete\" onClick={onDelete} />}\n </Tag>\n );\n}\n\nPassportTag.propTypes = {\n passport: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nPassportTag.defaultProps = {\n onDelete: null,\n};\n\nconst Tag = styled.span`\n display: inline-flex;\n padding: 2px 8px;\n background: #4f6af6;\n border-radius: 4px;\n font-weight: 500;\n font-size: 16px;\n line-height: 22px;\n color: #fff;\n align-items: center;\n .delete {\n font-size: 1em;\n margin-left: 6px;\n cursor: pointer;\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport upperCase from 'lodash/upperCase';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport DidLogo from '@arcblock/icons/lib/DidLogo';\n\nconst useStyles = makeStyles(() => ({\n tooltip: {\n maxWidth: 'none',\n },\n}));\n\nexport default function ServiceTags({ meta }) {\n const classes = useStyles();\n if (!meta || !Array.isArray(meta.services)) {\n return null;\n }\n\n return meta.services.map(x => {\n const name = upperCase(x.name.replace(/^@abtnode\\//, '').replace(/-service$/, ''));\n const formatValue = value => (Array.isArray(value) ? value.join(', ') : String(value));\n\n let content = [];\n if (x.config) {\n content = Object.entries(x.config)\n .map(d => {\n d[1] = formatValue(d[1]);\n return d;\n })\n .filter(d => d[1])\n .sort((a, b) => {\n const aKey = a[0] || '';\n const bKey = b[0] || '';\n\n return aKey.localeCompare(bKey);\n });\n }\n\n return (\n <Tooltip\n interactive\n classes={{ tooltip: classes.tooltip }}\n title={\n // eslint-disable-next-line react/jsx-wrap-multilines\n <div style={{ paddingRight: 20 }}>\n {content.map(([key, value]) => (\n <Flex>\n <div style={{ flexShrink: 0, width: 150, textAlign: 'right', marginRight: 10 }}>{`${key}:`}</div>\n <div>{value}</div>\n </Flex>\n ))}\n </div>\n }>\n <Tag style={{ margin: '0 4px', cursor: 'pointer' }} type=\"success\">\n {name === 'AUTH' && <DidLogo style={{ marginRight: 4, fill: 'rgb(91, 144, 37)' }} />}\n {name}\n </Tag>\n </Tooltip>\n );\n });\n}\n\nServiceTags.propTypes = {\n meta: PropTypes.object.isRequired,\n};\n\nconst Flex = styled.div`\n display: flex;\n margin: 4px 0;\n`;\n","import React, { useContext } from 'react';\nimport { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport ExternalLink from '@material-ui/core/Link';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { BLOCKLET_INTERFACE_TYPE_WEB } from '@blocklet/meta/lib/constants';\n\nimport { appendParams, checkIsWildcardDomain, encodeWildcardDomain } from '../../libs/util';\nimport ServiceTags from './service-tags';\n\nexport default function BlockletInterface({ blocklet, ...props }) {\n const { t, locale } = useContext(LocaleContext);\n\n if (blocklet.status !== 'running') {\n return null;\n }\n\n // eslint-disable-next-line no-nested-ternary\n const webInterface = (blocklet.interfaces || []).find(x => x.type === BLOCKLET_INTERFACE_TYPE_WEB);\n\n if (!webInterface) {\n return (\n <EmptyTipOut>\n {t('blocklet.urlEmptyTip')}\n <Link to={`/router/rules?fromDid=${blocklet.meta.did}`} className=\"interface-link\">\n {t('blocklet.goToAddRule')}\n </Link>\n </EmptyTipOut>\n );\n }\n\n const { name, url } = webInterface;\n\n if (checkIsWildcardDomain(url)) {\n return encodeWildcardDomain(url, locale);\n }\n\n return (\n <Container {...props}>\n <Flex>\n <ExternalLink href={appendParams(url, { locale })} target=\"_blank\" className=\"blocklet-interface\">\n {t('common.open')}\n </ExternalLink>\n <ServiceTags meta={blocklet.meta.interfaces.find(x => x.name === name)} />\n </Flex>\n </Container>\n );\n}\n\nBlockletInterface.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Flex = styled.div`\n display: flex;\n margin: 4px 0;\n`;\n\nconst EmptyTipOut = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Container = styled.div`\n .blocklet-interface {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n white-space: nowrap;\n\n img {\n margin-right: 4px;\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport HttpsIcon from '@material-ui/icons/Https';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Popover from '@material-ui/core/Popover';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport VerifiedDot from '../../dot';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useDomainStatusContext } from '../../../contexts/domain-status';\nimport { formatToDate, shouldCheckDomainStatus, checkIsWildcardDomain } from '../../../libs/util';\n\nfunction Certificate({ certificate }) {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const node = useNodeContext();\n const { t } = useLocaleContext();\n\n const handlePopoverOpen = event => {\n setAnchorEl(event.currentTarget);\n };\n\n const handlePopoverClose = () => {\n setAnchorEl(null);\n };\n\n const open = Boolean(anchorEl);\n\n return (\n <>\n <HttpsIcon\n aria-owns={open ? 'mouse-over-popover' : undefined}\n onMouseEnter={handlePopoverOpen}\n onMouseLeave={handlePopoverClose}\n style={{ color: '#44cdc6', fontSize: 20, marginLeft: 8, cursor: 'pointer' }}\n />\n <Popover\n id=\"mouse-over-popover\"\n style={{ pointerEvents: 'none' }}\n open={open}\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n onClose={handlePopoverClose}\n disableRestoreFocus>\n <Card>\n <CardContent style={{ display: 'flex' }}>\n <div>\n <img\n src={`${node.prefix}/https-certificate-icon.png`}\n alt=\"certificate icon\"\n style={{ maxHeight: '100%', maxWidth: '100%' }}\n />\n </div>\n <Typography component=\"div\" style={{ marginLeft: '16px' }}>\n <Typography component=\"div\" style={{ fontWeight: 'bolder' }}>\n {certificate.domain}\n </Typography>\n <Typography component=\"div\">\n {`${t('common.issuer')}: ${get(certificate, 'issuer.commonName', '')}`}\n </Typography>\n <Typography component=\"div\">\n {`${t('router.cert.issuedOn')}: ${formatToDate(certificate.validFrom)}`}\n </Typography>\n <Typography component=\"div\">\n {`${t('router.cert.expiryOn')}: ${formatToDate(certificate.validTo)}`}\n </Typography>\n </Typography>\n </CardContent>\n </Card>\n </Popover>\n </>\n );\n}\n\nCertificate.propTypes = {\n certificate: PropTypes.object,\n};\n\nCertificate.defaultProps = {\n certificate: {},\n};\n\nexport default function DomainStatus(props) {\n const { name, type, filters } = props;\n const { t } = useLocaleContext();\n const { status } = useDomainStatusContext();\n\n if (type !== 'domain') {\n return null;\n }\n\n if (!shouldCheckDomainStatus(name)) {\n return null;\n }\n\n if (name === window.location.hostname) {\n return null;\n }\n\n let domainIcon = null;\n let httpsIcon = null;\n\n const { isHttps, matchedCert } = status[name] || {};\n\n if (!checkIsWildcardDomain(name)) {\n const { dns: { resolved, ip } = {} } = status[name] || {};\n if (resolved || ip === '127.0.0.1') {\n domainIcon = (\n <Tooltip title={t('router.domain.verify.ok')}>\n <VerifiedDot color=\"success\" />\n </Tooltip>\n );\n } else {\n domainIcon = (\n <Tooltip title={t('router.domain.verify.notResolved')}>\n <VerifiedDot color=\"error\" />\n </Tooltip>\n );\n }\n }\n\n if (isHttps) {\n httpsIcon = <Certificate certificate={matchedCert} />;\n } else {\n httpsIcon = (\n <Tooltip title={t('router.domain.https.bad')}>\n <HttpsIcon style={{ color: '#D0021B', fontSize: 20, marginLeft: 8, cursor: 'pointer' }} />\n </Tooltip>\n );\n }\n\n const items = filters.map(x => {\n if (x === 'domain') {\n return domainIcon;\n }\n if (x === 'http') {\n return httpsIcon;\n }\n return null;\n });\n\n return <>{items}</>;\n}\n\nDomainStatus.propTypes = {\n type: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n filters: PropTypes.array,\n};\n\nDomainStatus.defaultProps = {\n filters: ['domain', 'http'],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/CallMerge';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, DOMAIN_FOR_DEFAULT_SITE } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { formatError } from '../../../../libs/util';\nimport { validateDomain } from './utils';\n\nexport default function AddDomainAlias({ id, name, onActivate, children, title }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n // 不允许给默认站点添加 Additional domain\n if (DOMAIN_FOR_DEFAULT_SITE === name) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.addDomainAlias(id, params.domain.trim());\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onEnter = async (params, confirm, setError) => {\n try {\n await confirm(params);\n } catch (err) {\n setError(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n const setting = {\n title: title || t('router.domainAlias.add.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domainAlias.add.domainDescription')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n data-cy=\"add-domain\"\n fullWidth\n autoFocus\n inputProps={{ 'data-cy': 'domain-name-input' }}\n value={params.domain}\n style={{ marginBottom: 32 }}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setParams({ ...params, domain, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n if (errMsg) {\n setError(errMsg);\n } else {\n onEnter(params, onConfirm, setError);\n }\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n domain: '',\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-domain-alias\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domainAlias.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddDomainAlias.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n title: PropTypes.string,\n};\n\nAddDomainAlias.defaultProps = {\n onActivate: () => {},\n children: null,\n title: '',\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Link';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { validateRule, validatePathPrefix, getInitialBlockletDid } from './utils';\nimport ConfigRoutingRule from './config-routing-rule';\n\nexport default function AddRule({ id, blocklets, onActivate = () => {}, onRuleAdded = () => {}, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n const err = await validateRule(params, t);\n if (err) {\n throw err;\n }\n setLoading(true);\n\n const rule = {\n from: {\n pathPrefix: params.pathPrefix.trim(),\n },\n to: {\n type: params.type,\n },\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url.trim();\n rule.to.redirectCode = params.redirectCode;\n }\n\n await actions.addRule(id, rule);\n setConfirmSetting(null);\n setLoading(false);\n onRuleAdded();\n };\n\n const setting = {\n title: t('router.rule.add.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n const validateResult = validateRule(value, t);\n if (validateResult) {\n setParams({ ...value, __disableConfirm: true });\n return;\n }\n\n setParams({ ...value });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.rule.add.pathPrefix')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"pathPrefix\"\n data-cy=\"path-prefix-input\"\n fullWidth\n autoFocus\n helperText={t('router.rule.add.pathPrefixTip')}\n style={{ marginBottom: 32 }}\n value={params.pathPrefix}\n onChange={e => {\n let disable = false;\n const validateResult = validatePathPrefix({\n params: { ...params, pathPrefix: e.target.value },\n blocklets,\n });\n\n setError(validateResult);\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET && validateResult) {\n disable = true;\n }\n\n if (params.type === ROUTING_RULE_TYPES.REDIRECT && !params.url) {\n disable = true;\n }\n\n if (!e.target.value.trim()) {\n disable = true;\n setError(t('router.validation.pathPrefixRequired'));\n }\n if (!disable) {\n setError('');\n }\n setParams({ ...params, pathPrefix: e.target.value, __disableConfirm: disable });\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.rule.add.confirm'),\n cancel: t('common.cancel'),\n params: {\n pathPrefix: '',\n type: ROUTING_RULE_TYPES.BLOCKLET,\n did: getInitialBlockletDid(blocklets),\n port: '',\n interfaceName: '',\n redirectCode: 302,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddRule.propTypes = {\n id: PropTypes.string.isRequired,\n blocklets: PropTypes.array,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n onRuleAdded: PropTypes.func,\n};\n\nAddRule.defaultProps = {\n onActivate: () => {},\n onRuleAdded: () => {},\n children: null,\n blocklets: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { BLOCKLET_SITE_GROUP_SUFFIX } from '@abtnode/constant';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\n\nexport default function UpdateDomainSecurity({ id, name, corsAllowedOrigins, onActivate, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n let text = name;\n if (name.endsWith(BLOCKLET_SITE_GROUP_SUFFIX)) {\n text = `${t('common.the')} Blocklet`;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.updateSite(id, { corsAllowedOrigins: params.corsAllowedOrigins.split(',').map(x => x.trim()) });\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domainSecurity.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domainSecurity.cors.title', { name: text })}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"corsAllowedOrigins\"\n fullWidth\n autoFocus\n value={params.corsAllowedOrigins}\n style={{ marginBottom: 32 }}\n helperText={t('router.domainSecurity.cors.description', { name: text })}\n onChange={e => {\n setParams({ ...params, corsAllowedOrigins: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('router.domainSecurity.cors.domainInvalid'));\n } else {\n setError('');\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n corsAllowedOrigins: Array.isArray(corsAllowedOrigins) ? corsAllowedOrigins.join(', ') : name,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-update-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domainSecurity.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nUpdateDomainSecurity.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n corsAllowedOrigins: PropTypes.string,\n};\n\nUpdateDomainSecurity.defaultProps = {\n onActivate: () => {},\n children: null,\n corsAllowedOrigins: '',\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../../confirm';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nexport default function DeleteDomainAlias(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, domainAlias, onDelete, children } = props;\n const { actions } = useRoutingContext();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await actions.deleteDomainAlias(id, domainAlias);\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: t('router.domainAlias.delete.title'),\n description: t('router.domainAlias.delete.description'),\n confirm: t('common.confirm'),\n onConfirm,\n onCancel,\n };\n\n const onClick = e => {\n e.stopPropagation();\n setConfirmSetting(setting);\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onClick })\n ) : (\n <Button\n rounded\n edge=\"end\"\n onClick={onClick}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\"\n data-cy=\"action-delete-domain-alias\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('router.domainAlias.delete.title')}\n </Button>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteDomainAlias.propTypes = {\n id: PropTypes.string.isRequired,\n domainAlias: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n children: PropTypes.any,\n};\n\nDeleteDomainAlias.defaultProps = {\n onDelete: () => {},\n children: null,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\nimport { validateRule, validatePathPrefix, getInitialBlockletDid } from './utils';\nimport ConfigRoutingRule from './config-routing-rule';\n\nexport default function UpdateRule(props) {\n const { id, name, did, parent, blocklets, to, children, onActivate } = props;\n\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n const err = await validateRule(params, t);\n if (err) {\n throw err;\n }\n setLoading(true);\n\n const rule = {\n id,\n from: {\n pathPrefix: params.pathPrefix.trim(),\n },\n to: {\n type: params.type,\n },\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url;\n rule.to.redirectCode = params.redirectCode;\n }\n\n await actions.updateRule(parent.id, rule);\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: t('router.rule.update.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n const validateResult = validateRule(value, t);\n if (validateResult) {\n setParams({ ...value, __disableConfirm: true });\n return;\n }\n setParams({ ...value });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.rule.add.pathPrefix')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"pathPrefix\"\n data-cy=\"path-prefix-input\"\n fullWidth\n autoFocus\n helperText={t('router.rule.add.pathPrefixTip')}\n style={{ marginBottom: 32 }}\n value={params.pathPrefix}\n onChange={e => {\n let disable = false;\n const validateResult = validatePathPrefix({\n params: { ...params, pathPrefix: e.target.value },\n blocklets,\n });\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET && validateResult) {\n disable = true;\n setError(validateResult);\n }\n if (params.type === ROUTING_RULE_TYPES.REDIRECT && !params.url) {\n disable = true;\n }\n if (!e.target.value.trim()) {\n disable = true;\n setError(t('router.validation.pathPrefixRequired'));\n }\n if (!disable) {\n setError('');\n }\n\n setParams({ ...params, pathPrefix: e.target.value, __disableConfirm: disable });\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.rule.update.confirm'),\n cancel: t('router.rule.update.cancel'),\n color: 'primary',\n params: {\n pathPrefix: name === '/' ? name : name.replace(/^\\/+/, '').replace(/\\/+$/, ''),\n type: to.type || ROUTING_RULE_TYPES.BLOCKLET,\n did: did || getInitialBlockletDid(blocklets),\n port: to.port || '',\n interfaceName: to.interfaceName || '',\n redirectCode: to.redirectCode || 302,\n url: to.url || '',\n __disableConfirm: false,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-update-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.update.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nUpdateRule.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n did: PropTypes.string,\n parent: PropTypes.object.isRequired,\n blocklets: PropTypes.array,\n to: PropTypes.object.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nUpdateRule.defaultProps = {\n onActivate: () => {},\n children: null,\n did: '',\n blocklets: [],\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nimport DelConfirm from '../../../delete-confirm';\n\nexport default function DeleteRule(props) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const {\n id,\n parent: { id: siteId },\n name,\n children,\n onActivate,\n } = props;\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n await actions.deleteRule(siteId, id);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n keyName: name,\n title: t('router.rule.delete.title'),\n description: t('router.rule.delete.description', { name: `<b>${name}</b>` }),\n confirmPlaceholder: t('router.rule.delete.confirm_desc', { name }),\n confirm: t('common.delConfirm'),\n cancel: t('router.rule.delete.cancel'),\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-delete-rule\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.rule.delete.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteRule.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n parent: PropTypes.object.isRequired,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nDeleteRule.defaultProps = {\n onActivate: () => {},\n children: null,\n};\n","import React from 'react';\n\nimport Switch from '@material-ui/core/Switch';\nimport { withStyles } from '@material-ui/core/styles';\n\nexport default withStyles(theme => ({\n root: {\n width: 42,\n height: 26,\n padding: 0,\n margin: theme.spacing(1),\n },\n switchBase: {\n padding: 1,\n '&$checked': {\n transform: 'translateX(16px)',\n color: theme.palette.common.white,\n '& + $track': {\n backgroundColor: '#52d869',\n opacity: 1,\n border: 'none',\n },\n },\n '&$focusVisible $thumb': {\n color: '#52d869',\n border: '6px solid #fff',\n },\n },\n thumb: {\n width: 24,\n height: 24,\n },\n track: {\n borderRadius: 26 / 2,\n border: `1px solid ${theme.palette.grey[400]}`,\n backgroundColor: theme.palette.grey[50],\n opacity: 1,\n transition: theme.transitions.create(['background-color', 'border']),\n },\n checked: {},\n focusVisible: {},\n}))(({ classes, ...props }) => (\n <Switch\n focusVisibleClassName={classes.focusVisible}\n disableRipple\n classes={{\n root: classes.root,\n switchBase: classes.switchBase,\n thumb: classes.thumb,\n track: classes.track,\n checked: classes.checked,\n }}\n {...props}\n />\n));\n","import React, { useState } from 'react';\nimport { Prompt } from 'react-router-dom';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport history from '../../libs/history';\nimport Confirm from '../confirm';\n\nexport default function RouterPrompt({ confirm }) {\n const [confirmPrompt, setConfirmPrompt] = useState(null);\n const { t } = useLocaleContext();\n\n const onPromptDialogCancel = () => {\n setConfirmPrompt(null);\n };\n\n const onPromptDialogConfirm = async location => {\n if (location) {\n let prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n if (prefix === '/') {\n history.push(`${location.pathname}`);\n } else {\n if (prefix.endsWith('/')) {\n prefix = prefix.substring(0, prefix.length - 1);\n }\n history.push(`${prefix}${location.pathname}`);\n }\n window.location.reload();\n }\n };\n\n const handlePrompt = (location, ...args) => {\n let settings = typeof confirm === 'function' ? confirm(location, ...args) : confirm;\n if (settings) {\n if (typeof settings === 'string') {\n settings = {\n description: settings,\n };\n }\n\n setConfirmPrompt({\n title: t('common.noticeTitle'),\n description: t('common.leavePageTip'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm: () => onPromptDialogConfirm(location),\n onCancel: () => onPromptDialogCancel(),\n ...settings,\n });\n return false;\n }\n return true;\n };\n\n return (\n <Div>\n <Prompt message={handlePrompt} />\n {confirmPrompt && (\n <Confirm\n title={confirmPrompt.title}\n description={confirmPrompt.description}\n confirm={confirmPrompt.confirm}\n cancel={confirmPrompt.cancel}\n params={confirmPrompt.params}\n onConfirm={confirmPrompt.onConfirm}\n onCancel={confirmPrompt.onCancel}\n />\n )}\n </Div>\n );\n}\n\nRouterPrompt.propTypes = {\n confirm: PropTypes.oneOfType([PropTypes.object, PropTypes.string, PropTypes.func]),\n};\n\nRouterPrompt.defaultProps = {\n confirm: null,\n};\n\nconst Div = styled.div`\n margin-bottom: 24px;\n .top-btns-alert {\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n flex-direction: column;\n padding-bottom: 15px;\n padding-right: 20px;\n }\n }\n .top-btns-action {\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n margin-right: 0px;\n }\n }\n`;\n","/* eslint-disable react/jsx-wrap-multilines */\n/* eslint-disable react/jsx-no-duplicate-props */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { useForm } from 'react-hook-form';\n\nimport TextField from '@material-ui/core/TextField';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Typography from '@material-ui/core/Typography';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport SwitchControl from '../switch-control';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { sleep, formatError } from '../../libs/util';\nimport getClient from '../../libs/node';\nimport LeavePagePrompt from '../notifications/leave-page-prompt';\nimport Permission from '../permission';\n\nconst initDefaultValues = info => ({\n name: info.name,\n description: info.description,\n webWalletUrl: info.webWalletUrl,\n diskAlertThreshold: info.diskAlertThreshold,\n});\n\nexport default function ConfigForm({ onSaved, title, submit, disabled, ...rest }) {\n const node = useNodeContext();\n const { t } = useLocaleContext();\n\n const { register, handleSubmit, errors, formState, reset } = useForm({\n defaultValues: initDefaultValues(node.info),\n });\n const [error, setError] = useState('');\n const [warning, setWarning] = useState('');\n const [loading, setLoading] = useState(false);\n const [autoUpgrade, setAutoUpgrade] = useState(node.info.autoUpgrade);\n const [enableWelcomePage, setEnableWelcomePage] = useState(!!node.info.enableWelcomePage);\n const [, setCurrent] = useState(null);\n\n useEffect(() => {\n let w = '';\n if (\n formState.isDirty || // eslint-disable-line\n autoUpgrade !== node.info.autoUpgrade || // eslint-disable-line\n enableWelcomePage !== !!node.info.enableWelcomePage\n ) {\n w = t('setting.unSavedTip');\n }\n setWarning(w);\n }, [t, node, autoUpgrade, enableWelcomePage, formState]);\n\n const onSubmit = async data => {\n setError('');\n setLoading(true);\n try {\n const result = await getClient().updateNodeInfo({\n input: {\n ...data,\n name: data.name.trim(),\n description: data.description.trim(),\n webWalletUrl: data.webWalletUrl.trim(),\n diskAlertThreshold: data.diskAlertThreshold,\n autoUpgrade,\n enableWelcomePage,\n },\n });\n await sleep(1000);\n\n reset(initDefaultValues(result.info));\n\n if (typeof onSaved === 'function') {\n onSaved(result);\n }\n } catch (err) {\n setError(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Div className=\"form-wrapper\" {...rest}>\n <form className=\"form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n {!!title && (\n <Typography component=\"h2\" variant=\"h5\" className=\"stepper-tip\">\n {title}\n </Typography>\n )}\n <Permission permission=\"mutate_node\">\n {hasPermission => (\n <>\n <TextField\n variant=\"outlined\"\n label={t('setting.form.name')}\n placeholder={t('setting.form.namePlaceholder')}\n disabled={loading || !hasPermission}\n data-cy=\"node-name-input\"\n error={errors.name && !!errors.name.message}\n inputRef={register({ validate: value => !!value.trim() || t('setting.form.nameRequired') })}\n inputProps={{ name: 'name', onFocus: () => setCurrent('name') }}\n helperText={errors.name ? errors.name.message : ''}\n margin=\"normal\"\n />\n <TextField\n variant=\"outlined\"\n label={t('setting.form.description')}\n placeholder={t('setting.form.descriptionHolder')}\n disabled={loading || !hasPermission}\n data-cy=\"node-description-input\"\n error={errors.description && !!errors.description.message}\n inputRef={register({ validate: value => !!value.trim() || t('setting.form.descriptionRequired') })}\n inputProps={{ name: 'description', onFocus: () => setCurrent('description') }}\n helperText={errors.description ? errors.description.message : ''}\n margin=\"normal\"\n />\n <TextField\n variant=\"outlined\"\n label={t('setting.form.webWalletUrl')}\n placeholder={t('setting.form.webWalletUrlPlaceholder')}\n disabled={loading || !hasPermission}\n error={errors.webWalletUrl && !!errors.webWalletUrl.message}\n inputRef={register({})}\n inputProps={{ name: 'webWalletUrl', onFocus: () => setCurrent('webWalletUrl') }}\n helperText={errors.webWalletUrl ? errors.webWalletUrl.message : ''}\n margin=\"normal\"\n />\n <TextField\n type=\"number\"\n variant=\"outlined\"\n label={t('setting.form.monitor.diskThreshold')}\n placeholder={t('setting.form.monitor.diskThresholdPlaceholder')}\n disabled={loading || !hasPermission}\n error={errors.diskAlertThreshold && !!errors.diskAlertThreshold.message}\n inputRef={register({})}\n inputProps={{\n name: 'diskAlertThreshold',\n onFocus: () => setCurrent('diskAlertThreshold'),\n min: 1,\n max: 99,\n }}\n helperText={errors.diskAlertThreshold ? errors.diskAlertThreshold.message : ''}\n margin=\"normal\"\n />\n <FormControlLabel\n control={\n <SwitchControl\n checked={autoUpgrade}\n onChange={() => setAutoUpgrade(!autoUpgrade)}\n name=\"autoUpgrade\"\n disabled={!hasPermission}\n />\n }\n style={{ marginTop: 20, marginRight: 0 }}\n label={\n <Typography className=\"auto-upgrade-label\">\n <span>{t('setting.form.upgrade.toggle')}</span>\n <span>\n {autoUpgrade ? (\n <Tag type=\"success\">{t('setting.form.upgrade.enabled')}</Tag>\n ) : (\n <Tag type=\"error\">{t('setting.form.upgrade.disabled')}</Tag>\n )}\n </span>\n </Typography>\n }\n />\n <FormControlLabel\n control={\n <SwitchControl\n checked={enableWelcomePage}\n onChange={() => setEnableWelcomePage(!enableWelcomePage)}\n name=\"enableWelcomePage\"\n disabled={!hasPermission}\n />\n }\n style={{ marginTop: 20, marginRight: 0 }}\n label={\n <Typography className=\"auto-upgrade-label\">\n <span>{t('setting.form.welcome.desc')}</span>\n <span>\n {enableWelcomePage ? (\n <Tag type=\"primary\">{t('setting.form.welcome.enabled')}</Tag>\n ) : (\n <Tag type=\"primary\">{t('setting.form.welcome.disabled')}</Tag>\n )}\n </span>\n </Typography>\n }\n />\n </>\n )}\n </Permission>\n\n {!!warning && (\n <Alert type=\"warning\" variant=\"icon\">\n {warning}\n </Alert>\n )}\n <div className=\"actions\">\n <Permission permission=\"mutate_node\">\n <Button\n rounded\n onClick={handleSubmit(onSubmit)}\n disabled={disabled || loading}\n color=\"primary\"\n variant=\"contained\"\n data-cy=\"submit-btn\"\n className=\"form-submit\">\n {submit} {loading ? <Spinner size={[16, 10]} /> : null}\n </Button>\n </Permission>\n </div>\n {!!error && (\n <Alert type=\"error\" variant=\"icon\" error={error}>\n {error}\n </Alert>\n )}\n </form>\n {warning && <LeavePagePrompt confirm={t('setting.unSavedLeaveTip')} />}\n </Div>\n );\n}\n\nConfigForm.propTypes = {\n onSaved: PropTypes.func.isRequired,\n disabled: PropTypes.bool,\n title: PropTypes.string.isRequired,\n submit: PropTypes.string.isRequired,\n};\n\nConfigForm.defaultProps = {\n disabled: false,\n};\n\nconst Div = styled.div`\n display: flex;\n align-items: flex-start;\n width: 100%;\n max-width: 720px;\n\n .form {\n width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n\n .actions {\n display: flex;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n flex-direction: column;\n width: 100%;\n button {\n width: 100%;\n margin-right: 0;\n }\n }\n }\n\n .form-submit {\n margin-top: 24px;\n margin-right: 32px;\n width: 180px;\n }\n\n .auto-upgrade-label {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n span {\n span {\n height: auto;\n }\n }\n }\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport Box from '@material-ui/core/Box';\nimport Toast from '@arcblock/ux/lib/Toast';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../contexts/node';\nimport ConfigForm from '../node/form';\n\nexport default function BasicSettings() {\n const { refresh } = useNodeContext();\n const [message, setMessage] = useState(null);\n const { t } = useLocaleContext();\n\n // Trigger a background refresh on mount\n useEffect(() => {\n refresh({ silent: true });\n }, []); // eslint-disable-line\n\n const onSaved = () => {\n refresh({ silent: true });\n setMessage({\n content: t('setting.saveSuccess'),\n type: 'success',\n onClose: () => {\n setMessage(null);\n },\n });\n };\n\n return (\n <Div>\n {message && <Toast message={message.content} variant={message.type} onClose={message.onClose} />}\n <Box mb={4}>\n <ConfigForm onSaved={onSaved} submit={t('common.saveChanges')} title=\"\" />\n </Box>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .eula-btn {\n text-decoration-line: underline;\n margin-top: 32px;\n margin-bottom: 32px;\n }\n\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\n max-width: 720px;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { RBAC_CONFIG, ROLES } from '@abtnode/constant';\n\nimport Confirm from '../confirm';\nimport getClient from '../../libs/node';\n\nexport default function CreateAccessKey(props) {\n const { remark, onCreate } = props;\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const client = getClient();\n\n const roles = RBAC_CONFIG.roles.filter(x => x.passport && x.name !== ROLES.OWNER);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n // eslint-disable-next-line no-shadow\n const { remark, passport } = params;\n setLoading(true);\n const res = await client.createAccessKey({\n input: {\n remark: remark.trim(),\n passport,\n },\n });\n const { data } = res;\n onCreate(data);\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: `${t('common.create')} ${t('common.accessKey')}`,\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('setting.accessKey.tip')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"remark\"\n data-cy=\"remark-input\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.remark}\n onChange={e => {\n setParams({\n ...params,\n remark: e.target.value,\n __disableConfirm: !params.passport || !e.target.value.trim(),\n });\n if (!e.target.value.trim()) {\n setError(t('setting.accessKey.remarkInvalid'));\n } else {\n setError('');\n }\n }}\n />\n\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"create-access-key-select-passport\"\n value={params.passport}\n onChange={e => {\n const passport = e.target.value;\n setError(null);\n setParams({\n ...params,\n passport,\n __disableConfirm: !params.remark || !passport,\n });\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}>\n {roles.map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`create-access-key-passport-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n color: 'primary',\n params: {\n remark,\n __disableConfirm: !remark.trim(),\n },\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n variant=\"contained\"\n color=\"primary\"\n data-cy=\"add-access-key-btn\"\n onClick={() => setConfirmSetting(setting)}\n className=\"rule-action\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 16 }} />}\n {t('common.create')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nCreateAccessKey.propTypes = {\n remark: PropTypes.string,\n onCreate: PropTypes.func,\n};\n\nCreateAccessKey.defaultProps = {\n onCreate: () => {},\n remark: '',\n};\n","import React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport ClickToCopy from '../click-to-copy';\n\nexport default function ConfirmAccessKey(props) {\n const { onConfirm, accessKeyId, accessKeySecret } = props;\n const { t } = useContext(LocaleContext);\n const [checked, setChecked] = useState(false);\n const [hideAccessSecret, setHideAccessSecret] = useState(true);\n\n const onChangeSwitch = () => {\n setHideAccessSecret(!hideAccessSecret);\n };\n\n const handleChange = event => {\n setChecked(event.target.checked);\n };\n\n return (\n <Dialog\n title={t('common.createSuccess')}\n fullWidth\n open\n disableBackdropClick\n disableEscapeKeyDown\n onClose={onConfirm}\n showCloseButton={false}\n actions={\n <div>\n <Button\n disabled={!checked}\n onClick={onConfirm}\n color=\"primary\"\n autoFocus\n size=\"small\"\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n rounded>\n {t('common.confirm')}\n </Button>\n </div>\n }\n aria-labelledby=\"simple-dialog-title\">\n <div>\n <Bold>{t('setting.accessKey.saveSecretTip')}</Bold>\n </div>\n <div style={{ marginTop: '20px' }} />\n <Item>\n <Label>Access Key</Label>\n <ClickToCopy>{accessKeyId}</ClickToCopy>\n </Item>\n <Item>\n <Label>Access Secret</Label>\n {hideAccessSecret ? (\n <Button data-cy=\"show-secret-btn\" color=\"primary\" onClick={onChangeSwitch}>\n {t('setting.accessKey.showSecret')}\n </Button>\n ) : (\n <ClickToCopy>{accessKeySecret}</ClickToCopy>\n )}\n </Item>\n <div>\n <FormControlLabel\n value=\"end\"\n disabled={hideAccessSecret}\n control={<Checkbox checked={checked} onChange={handleChange} />}\n label={t('setting.accessKey.iKnow')}\n labelPlacement=\"end\"\n />\n </div>\n </Dialog>\n );\n}\n\nConfirmAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n accessKeySecret: PropTypes.string.isRequired,\n onConfirm: PropTypes.func,\n};\n\nConfirmAccessKey.defaultProps = {\n onConfirm: () => {},\n};\n\nconst Label = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 16px;\n margin-bottom: 8px;\n`;\nconst Item = styled.div`\n margin-bottom: 24px;\n`;\nconst Bold = styled.div`\n font-size: 16px;\n font-weight: bold;\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { format } from 'timeago.js';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { formatLocale, formatToDatetime } from '../../libs/util';\n\nimport DelConfirm from '../delete-confirm';\nimport getClient from '../../libs/node';\n\nexport default function DeleteAccessKey(props) {\n const { t, locale } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { accessKeyId, time, remark, onDelete = () => {} } = props;\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteAccessKey({ input: { accessKeyId } });\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const descData = formatTime => ({\n key: `<b>${accessKeyId}</b>`,\n name: `<b>${remark}</b>`,\n time: formatToDatetime(formatTime),\n timeAge: format(new Date(formatTime), formatLocale(locale)),\n });\n\n const setting = {\n keyName: remark,\n title: t('setting.accessKey.title'),\n description: time\n ? `${t('setting.accessKey.description', descData(time))}`\n : `${t('setting.accessKey.descriptionNoTime', { key: `<b>${accessKeyId}</b>`, name: `<b>${remark}</b>` })}`,\n confirmPlaceholder: t('setting.accessKey.confirm_desc', { name: remark }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n time: PropTypes.string.isRequired,\n remark: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n};\n\nDeleteAccessKey.defaultProps = {\n onDelete: () => {},\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { RBAC_CONFIG, ROLES } from '@abtnode/constant';\n\nimport Confirm from '../confirm';\nimport getClient from '../../libs/node';\n\nexport default function UpdateAccessKey(props) {\n const { accessKeyId, remark, onUpdate, passport } = props;\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const client = getClient();\n\n const roles = RBAC_CONFIG.roles.filter(x => x.passport && x.name !== ROLES.OWNER);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n // eslint-disable-next-line no-shadow\n const { accessKeyId, remark, passport } = params;\n setLoading(true);\n await client.updateAccessKey({\n input: {\n accessKeyId,\n remark: remark.trim(),\n passport,\n },\n });\n onUpdate();\n setConfirmSetting(null);\n setLoading(false);\n };\n\n const setting = {\n title: `${t('common.update')} ${t('common.accessKey')}`,\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('setting.accessKey.accessKeyId')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"accessKeyId\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.accessKeyId}\n disabled\n />\n <TextField\n label={t('common.remark')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"remark\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n value={params.remark}\n onChange={e => {\n setParams({ ...params, remark: e.target.value, __disableConfirm: !e.target.value.trim() });\n if (!e.target.value.trim()) {\n setError(t('setting.accessKey.remarkInvalid'));\n } else {\n setError('');\n }\n }}\n />\n\n <FormControl style={{ width: '100%' }} variant=\"outlined\">\n <InputLabel>{t('common.passport')}</InputLabel>\n <Select\n data-cy=\"update-access-key-select-passport\"\n value={params.passport}\n onChange={e => {\n // eslint-disable-next-line no-shadow\n const passport = e.target.value;\n setError(null);\n setParams({\n ...params,\n passport,\n __disableConfirm: !params.remark || !passport,\n });\n }}\n fullWidth\n label={t('common.passport')}\n disabled={loading}>\n {roles.map(r => (\n <MenuItem key={r.name} value={r.name} data-cy={`update-access-key-passport-option-${r.name}`}>\n <span>{r.title || r.name}</span>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n color: 'primary',\n params: {\n accessKeyId,\n remark,\n passport,\n },\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"primary\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 16 }} />}\n {t('common.update')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n color={confirmSetting.color}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nUpdateAccessKey.propTypes = {\n accessKeyId: PropTypes.string.isRequired,\n remark: PropTypes.string,\n passport: PropTypes.string,\n onUpdate: PropTypes.func,\n};\n\nUpdateAccessKey.defaultProps = {\n onUpdate: () => {},\n remark: '',\n passport: '',\n};\n","import React, { useContext, useState } from 'react';\nimport styled from 'styled-components';\nimport { useAsyncRetry } from 'react-use';\n\nimport MaterialTable from 'material-table';\nimport Alert from '@material-ui/lab/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { RBAC_CONFIG } from '@abtnode/constant';\n\nimport { formatError, formatToDatetime } from '../../libs/util';\nimport { useNodeContext } from '../../contexts/node';\n\nimport ClickToCopy from '../click-to-copy';\nimport CreateAccessKey from '../access-key/create';\nimport ConfirmAccessKey from '../access-key/confirm';\nimport DeleteAccessKey from '../access-key/delete';\nimport UpdateAccessKey from '../access-key/update';\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\nimport usePersistentSort from '../../hooks/persistent-sort';\nimport Permission from '../permission';\nimport PassportTag from '../passport-tag';\n\nexport default function AccessKey() {\n const { t } = useContext(LocaleContext);\n const { api } = useNodeContext();\n const [confirmInfo, setConfirmInfo] = useState({});\n\n const state = useAsyncRetry(async () => {\n const response = await api.getAccessKeys();\n const { list } = response;\n return list;\n });\n\n const list = state.value || [];\n const { loading, error } = state;\n\n const { sortDirections, onSortChange } = usePersistentSort('access-key', ['', '', '', '']);\n\n const columns = [\n {\n title: t('setting.accessKey.remark'),\n field: 'remark',\n defaultSort: sortDirections[0],\n render: ({ remark }) => remark || 'N/A',\n },\n {\n title: t('setting.accessKey.accessKeyId'),\n field: 'accessKeyId',\n defaultSort: sortDirections[1],\n render: d => <ClickToCopy>{d.accessKeyId}</ClickToCopy>,\n },\n {\n title: t('common.passport'),\n field: 'passport',\n defaultSort: sortDirections[2],\n render: d => {\n const p = RBAC_CONFIG.roles.find(x => x.name === d.passport);\n return <PassportTag passport={{ title: p ? p.title : d.passport }} />;\n },\n },\n {\n title: t('common.created'),\n defaultSort: sortDirections[3],\n type: 'datetime',\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{formatToDatetime(d.createdAt)}</div>,\n },\n {\n title: t('setting.accessKey.lastUsed'),\n field: 'lastUsedAt',\n defaultSort: sortDirections[4],\n type: 'datetime',\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{d.lastUsedAt}</div>,\n },\n\n {\n title: t('common.actions'),\n sorting: false,\n align: 'center',\n render: item => (\n <>\n <UpdateAccessKey {...item} onUpdate={state.retry} />\n <DeleteAccessKey\n accessKeyId={item.accessKeyId}\n time={item.lastUsedAt}\n remark={item.remark || 'N/A'}\n onDelete={state.retry}\n />\n </>\n ),\n },\n ];\n\n if (!list.length && loading) {\n return (\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <Spinner />\n </div>\n );\n }\n if (!list.length && error) {\n return <Alert severity=\"error\">{formatError(error)}</Alert>;\n }\n\n return (\n <Div>\n <div className=\"table-header\">\n <div className=\"search\">\n <Permission permission=\"mutate_node\">\n <CreateAccessKey\n onCreate={data => {\n const { accessKeyId, accessKeySecret } = data;\n setConfirmInfo({\n show: true,\n accessKeyId,\n accessKeySecret,\n });\n }}\n />\n </Permission>\n {confirmInfo.show && (\n <ConfirmAccessKey\n onConfirm={() => {\n state.retry();\n setConfirmInfo({ show: false });\n }}\n {...confirmInfo}\n />\n )}\n </div>\n </div>\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: true,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n pageSize: 100,\n }}\n onOrderChange={onSortChange}\n localization={{\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={list}\n />\n </TableStyle>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .table-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n margin-top: 20px;\n font-size: 14px;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport DelConfirm from '../delete-confirm';\nimport getClient from '../../libs/node';\n\nexport default function DeleteAccessKey(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { item, onDelete = () => {} } = props;\n const { id, title } = item;\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteWebHook({ input: { id } });\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n keyName: id,\n title: t('setting.webhook.delTitle'),\n description: `${t('setting.webhook.description', { name: `<b>${title}</b>`, id: `<b>${id}</b>` })}`,\n confirmPlaceholder: t('setting.webhook.confirm_desc', { name: id }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n rounded\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n color=\"danger\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n\nDeleteAccessKey.propTypes = {\n item: PropTypes.object.isRequired,\n onDelete: PropTypes.func,\n};\n\nDeleteAccessKey.defaultProps = {\n onDelete: () => {},\n};\n","import React, { useContext, useState, useRef } from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport styled from 'styled-components';\nimport { useSnackbar } from 'notistack';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Alert from '@material-ui/lab/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport MaterialTable from 'material-table';\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\nimport Paper from '@material-ui/core/Paper';\nimport Popper from '@material-ui/core/Popper';\nimport Button from '@arcblock/ux/lib/Button';\nimport LinkIcon from '@material-ui/icons/Link';\nimport List from '@material-ui/core/MenuList';\nimport ListItem from '@material-ui/core/MenuItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport TextField from '@material-ui/core/TextField';\nimport AddIcon from '@material-ui/icons/Add';\nimport SendIcon from '@material-ui/icons/Send';\nimport { formatError, checkInputByType, formatToDatetime } from '../../libs/util';\n\nimport { useNodeContext } from '../../contexts/node';\nimport Confirm from '../confirm';\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\n\nimport DelButton from '../webhook/delete';\nimport Permission from '../permission';\n\nexport default function HookSetting() {\n const { api, prefix } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const { enqueueSnackbar } = useSnackbar();\n const buttonAnchorRef = useRef(null);\n\n const [defaultConfig, setDefaultConfig] = useState([]);\n const [open, setOpen] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const state = useAsyncRetry(async () => {\n const [{ webhooks }, { senders }] = await Promise.all([api.getWebHooks(), api.getWebhookSenders()]);\n\n setDefaultConfig(senders);\n return webhooks;\n });\n const list = state.value || [];\n const { loading, error } = state;\n\n const onToggleWebHook = () => {\n setOpen(preOpen => !preOpen);\n };\n\n const onClosePopper = e => {\n if (buttonAnchorRef.current && buttonAnchorRef.current.contains(e.target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const onConfirm = async data => {\n try {\n await api.createWebHook({ input: data });\n state.retry();\n } catch (err) {\n enqueueSnackbar(formatError(err), { autoHideDuration: 4000, variant: 'error' });\n console.error('create webhook error', err);\n }\n setConfirmSetting(null);\n };\n\n const onCancel = () => {\n setConfirmSetting(null);\n };\n\n const onSetWebHook = x => {\n const setting = {\n title: x.title,\n description: (params, setParams, setError) => {\n const setValue = data => {\n setParams({\n list: data,\n __disableConfirm: data.some(item => item.disable),\n });\n };\n\n const inputList = params.list || [];\n return (\n <Main>\n {inputList.map((item, index) => (\n <Form key={item.name}>\n <TextField\n label={item.description}\n autoComplete=\"off\"\n variant=\"outlined\"\n data-cy=\"webhook-input\"\n fullWidth\n autoFocus\n style={{ marginBottom: 16 }}\n value={item.value || item.defaultValue}\n onChange={e => {\n if (item.required) {\n item.disable = true;\n }\n\n const trimValue = e.target.value.trim();\n item.value = trimValue;\n inputList[index] = item;\n\n if (trimValue) {\n if (checkInputByType(item.type, trimValue)) {\n item.disable = false;\n setError('');\n } else {\n item.disable = true;\n setError(t('setting.webhook.requiredError', { type: item.type }));\n }\n } else {\n if (item.required) {\n item.disable = true;\n }\n setError('');\n }\n\n setValue([...inputList]);\n }}\n />\n </Form>\n ))}\n </Main>\n );\n },\n params: {\n list: x.params,\n __disableConfirm: true,\n },\n confirm: t('setting.webhook.add'),\n cancel: t('common.cancel'),\n onConfirm: data => {\n x.params = data.list;\n onConfirm(x);\n },\n onCancel,\n };\n\n setConfirmSetting(setting);\n setOpen(false);\n };\n\n const webhookIcon = d => {\n const isSlack = d.type === 'slack';\n return isSlack ? (\n <img src={`${prefix}/${d.type}.png`} alt=\"icon\" style={{ width: 20, height: 20 }} />\n ) : (\n <LinkIcon />\n );\n };\n\n const onSendTestNotification = async rowInfo => {\n const params = {\n webhookId: rowInfo.id,\n message: 'This is a test notification in order to test the integration',\n };\n await api.sendTestMessage({\n input: params,\n });\n };\n\n const columns = [\n {\n title: t('setting.webhook.columns.description'),\n render: d => {\n const desc = defaultConfig.find(item => item.name === d.name);\n return (\n <div style={{ display: 'flex', alignItems: 'center', whiteSpace: 'nowrap' }}>\n {webhookIcon(d)}\n <div style={{ marginLeft: 10 }}>\n <b>\n {'ID: '}\n {d.id}\n </b>\n <div>{desc ? desc.description : null}</div>\n </div>\n </div>\n );\n },\n },\n {\n title: t('setting.webhook.columns.params'),\n render: d => {\n const params = d.params.map(item => <div>{item.value}</div>);\n return <div style={{ display: 'flex', alignItems: 'center', whiteSpace: 'nowrap' }}>{params}</div>;\n },\n },\n {\n title: t('setting.webhook.columns.createdAt'),\n render: d => <div style={{ whiteSpace: 'nowrap' }}>{formatToDatetime(Number(d.createdAt))}</div>,\n },\n {\n title: t('common.actions'),\n width: '12%',\n align: 'center',\n render: d => {\n const info = defaultConfig.find(item => item.name === d.name) || {};\n return (\n <>\n <DelButton\n item={{ ...d, title: info.title }}\n onDelete={() => {\n state.retry();\n }}\n />\n <Button\n rounded\n size=\"small\"\n color=\"secondary\"\n onClick={() => {\n onSendTestNotification(d);\n }}>\n <SendIconInfo />\n {t('setting.webhook.test')}\n </Button>\n </>\n );\n },\n },\n ];\n\n if (!list.length && loading) {\n return (\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <Spinner />\n </div>\n );\n }\n if (!list.length && error) {\n return <Alert severity=\"error\">{formatError(error)}</Alert>;\n }\n\n return (\n <Main>\n <div className=\"button-addon\">\n <Permission permission=\"mutate_webhook\">\n <Button\n ref={buttonAnchorRef}\n variant=\"contained\"\n size=\"small\"\n color=\"primary\"\n data-cy=\"add-integration\"\n rounded\n onClick={onToggleWebHook}>\n <AddIcon />\n <span style={{ marginLeft: 5 }}>{t('setting.webhook.add')}</span>\n </Button>\n </Permission>\n\n {open && (\n <Popper open anchorEl={buttonAnchorRef.current} disablePortal placement=\"bottom-end\" style={{ zIndex: 11 }}>\n <Paper>\n <ClickAwayListener onClickAway={onClosePopper}>\n <List className=\"add-list\">\n {defaultConfig.map(x => (\n <ListItem\n data-cy={`add-${x.type}`}\n key={x.title}\n alignItems=\"center\"\n onClick={() => onSetWebHook(x)}>\n {webhookIcon(x)}\n <ListItemText\n style={{ marginLeft: 10 }}\n className=\"list-item\"\n primary={x.title}\n secondary={x.description}\n />\n </ListItem>\n ))}\n </List>\n </ClickAwayListener>\n </Paper>\n </Popper>\n )}\n </div>\n\n {confirmSetting && (\n <Confirm\n color=\"primary\"\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: false,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n pageSize: 100,\n }}\n localization={{\n body: {\n emptyDataSourceMessage: t('common.noData'),\n },\n }}\n data={list}\n />\n </TableStyle>\n </Main>\n );\n}\n\nconst Main = styled.div`\n .button-addon {\n text-align: right;\n }\n\n .add-list {\n width: 420px;\n max-width: calc(100vw - 10px);\n text-align: left;\n background: #fff;\n border-radius: 5px;\n }\n`;\n\nconst Form = styled.div`\n display: flex;\n`;\n\nconst SendIconInfo = styled(SendIcon)`\n font-size: 16px !important;\n margin-right: 3px;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport Typography from '@material-ui/core/Typography';\n\nfunction DangerItem({ title, description, children }) {\n return (\n <Div>\n <Typography component=\"div\" className=\"danger-item-info\">\n <Typography className=\"title\" component=\"h3\" variant=\"h6\" color=\"textPrimary\" gutterBottom>\n {title}\n </Typography>\n <Typography className=\"desc\" component=\"p\" variant=\"body1\" color=\"textSecondary\">\n {description}\n </Typography>\n </Typography>\n <Typography component=\"div\" className=\"danger-item-action\">\n {children}\n </Typography>\n </Div>\n );\n}\n\nDangerItem.propTypes = {\n children: PropTypes.node.isRequired,\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n};\n\nconst Div = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .danger-item-info {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n .title {\n word-break: break-word;\n }\n .desc {\n word-break: break-word;\n }\n }\n\n .danger-item-action {\n width: 160px;\n flex-shrink: 0;\n text-align: right;\n cursor: pointer;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n width: auto;\n margin-left: 10px;\n }\n }\n`;\n\nfunction DangerZone({ children, ...rest }) {\n return <Container {...rest}>{children}</Container>;\n}\n\nconst Container = styled.div`\n border: 1px solid #dedede;\n padding: 16px;\n`;\n\nDangerZone.propTypes = { children: PropTypes.node.isRequired };\n\nexport { DangerZone, DangerItem };\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport ConfirmDialog from '../../confirm';\nimport { DangerZone, DangerItem } from '../../danger-zone';\nimport { useNodeContext } from '../../../contexts/node';\n\nexport default function ConfirmUpgrade() {\n const { t } = useLocaleContext();\n const { info, api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (!info.nextVersion) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n await api.upgradeNodeVersion();\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('setting.form.upgrade.title', { version: info.nextVersion }),\n description: t('setting.form.upgrade.dialog'),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <DangerZone className=\"danger-zone\">\n <DangerItem\n title={t('setting.form.upgrade.title', { version: info.nextVersion })}\n description={t('setting.form.upgrade.description')}>\n <Button onClick={() => setConfirmSetting(setting)} color=\"primary\" rounded variant=\"contained\" size=\"large\">\n {loading ? <Spinner size={[16, 10]} style={{ marginRight: 3 }} /> : null}\n {t('setting.form.upgrade.confirm')}\n </Button>\n </DangerItem>\n </DangerZone>\n {confirmSetting && (\n <ConfirmDialog\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport IconButton from '@material-ui/core/IconButton';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport ConfirmDialog from '../../confirm';\nimport { useNodeContext } from '../../../contexts/node';\n\nexport default function UpgradeCheck() {\n const { t } = useLocaleContext();\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onDone = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('setting.form.upgrade.check'),\n description: t('setting.form.upgrade.latest'),\n confirm: t('common.confirm'),\n showCancel: false,\n color: 'primary',\n onConfirm: onDone,\n onCancel: onDone,\n };\n\n const onCheck = async () => {\n try {\n setLoading(true);\n const { version } = await api.checkNodeVersion();\n if (!version) {\n setConfirmSetting(setting);\n }\n } catch (err) {\n console.error(`Failed to check new version: ${err.message}`);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <>\n <IconButton color=\"primary\" aria-label=\"upload picture\" component=\"span\" onClick={onCheck}>\n {loading ? <Spinner size={[16, 10]} style={{ fontSize: 14 }} /> : <RefreshIcon style={{ fontSize: 16 }} />}\n </IconButton>\n {confirmSetting && (\n <ConfirmDialog\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n showCancel={confirmSetting.showCancel}\n color={confirmSetting.color}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport get from 'lodash/get';\n\nimport Box from '@material-ui/core/Box';\nimport Button from '@arcblock/ux/lib/Button';\nimport Logo from '@arcblock/ux/lib/Logo';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nimport { useNodeContext } from '../../contexts/node';\nimport UpgradeConfirm from '../node/upgrade/confirm';\nimport UpgradeCheck from '../node/upgrade/check';\nimport Permission from '../permission';\n\nexport default function About() {\n const history = useHistory();\n const { api, info: nodeInfo } = useNodeContext();\n const { t } = useLocaleContext();\n const extra = useAsyncRetry(async () => {\n const res = await api.getNodeEnv();\n return Object.assign({}, res.info || {});\n });\n\n const rows = [];\n\n rows.push(\n ...[\n { name: t('dashboard.nodeDid'), value: <DidAddress>{nodeInfo.did}</DidAddress> },\n { name: t('dashboard.ownerDid'), value: <DidAddress>{nodeInfo.nodeOwner.did}</DidAddress> },\n ]\n );\n\n if (extra.value) {\n rows.push(\n ...[\n { name: `${t('common.os')}`, value: extra.value.os },\n extra.value.docker ? { name: `${t('common.docker')}`, value: <Tag type=\"success\">Yes</Tag> } : null,\n extra.value.gitpod ? { name: `${t('common.gitpod')}`, value: <Tag type=\"success\">Yes</Tag> } : null,\n ].filter(Boolean)\n );\n }\n\n if (Array.isArray(get(extra, 'value.blockletEngines', null))) {\n extra.value.blockletEngines\n .filter(e => e.visible && e.available)\n .forEach(e => {\n rows.push({\n name: e.displayName,\n value: e.version,\n });\n });\n }\n\n return (\n <Permission permission=\"mutate_node\">\n {can => (\n <Box\n component={Div}\n my={6}\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n flexDirection=\"column\">\n <Box display=\"flex\" alignItems=\"center\">\n <Box width={50} height={50}>\n <Logo showText={false} style={{ width: '100%', height: '100%', transform: 'scale(1)' }} />\n </Box>\n <Box ml={2}>\n <h2 style={{ margin: 0 }}>{nodeInfo.name}</h2>\n <p style={{ margin: 0, color: '#888' }}>{nodeInfo.description}</p>\n </Box>\n </Box>\n\n <Box my={3}>{can && <UpgradeConfirm />}</Box>\n\n <InfoRow\n style={{ marginBottom: 4 }}\n valueComponent=\"div\"\n key=\"version\"\n nameWidth={150}\n name={t('common.version')}>\n {nodeInfo.version}\n {can && <UpgradeCheck />}\n </InfoRow>\n\n {rows.map(x => (\n <InfoRow valueComponent=\"div\" key={x.name} nameWidth={150} name={x.name}>\n {x.value}\n </InfoRow>\n ))}\n\n <Box mt={10} style={{ marginLeft: -8 }}>\n <Button\n className=\"eula-btn\"\n onClick={() => {\n history.push('/eula');\n }}>\n {t('common.goEULA')}\n </Button>\n </Box>\n </Box>\n )}\n </Permission>\n );\n}\n\nconst Div = styled.div`\n .eula-btn {\n text-decoration-line: underline;\n margin-top: 32px;\n margin-bottom: 32px;\n }\n\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\n max-width: 720px;\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport AddIcon from '@material-ui/icons/Public';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX } from '@blocklet/meta/lib/constants';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useRoutingContext } from '../../../../contexts/routing';\nimport { useNodeContext } from '../../../../contexts/node';\n\nimport Confirm from '../../../confirm';\nimport ConfigRoutingRule from './config-routing-rule';\nimport { validateSite, getInitialBlockletDid, validateDomain } from './utils';\n\nexport default function AddDomain({ blocklets, onActivate = () => {}, children }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const { info } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n // add an empty rule when the type is default\n const rule = {\n from: {\n pathPrefix: '/',\n },\n to: {\n type: params.type,\n },\n };\n const data = {\n domain: params.domain.trim() === info.ip ? '' : params.domain.trim(),\n };\n\n if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n // If the blocklet can not be served on dynamic path prefix, we need to update `rule.from.pathPrefix`\n const blocklet = blocklets.find(x => x.meta.did === params.did);\n const bInterface = get(blocklet, 'meta.interfaces', []).find(x => x.name === params.interfaceName);\n if (bInterface && bInterface.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX) {\n rule.from.pathPrefix = bInterface.prefix;\n }\n\n rule.to.port = params.port;\n rule.to.did = params.did;\n rule.to.interfaceName = params.interfaceName;\n data.rules = [rule];\n } else if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n rule.to.url = params.url;\n rule.to.redirectCode = params.redirectCode;\n data.rules = [rule];\n }\n\n await actions.addSite(data);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.add.title'),\n description: (params, setParams, setError) => {\n const setValue = value => {\n // eslint-disable-next-line no-underscore-dangle\n const __disableConfirm = value.__disableConfirm || !!validateSite(value, t);\n\n setParams({ ...value, __disableConfirm });\n };\n\n return (\n <Typography component=\"div\">\n <TextField\n label={t('router.domain.add.description')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n fullWidth\n autoFocus\n value={params.domain}\n style={{ marginBottom: 32 }}\n inputProps={{ 'data-cy': 'domain-name-input' }}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setValue({ ...params, domain: e.target.value, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n />\n <ConfigRoutingRule blocklets={blocklets} params={params} setParams={setValue} setError={setError} />\n </Typography>\n );\n },\n confirm: t('router.domain.add.confirm'),\n cancel: t('router.domain.add.cancel'),\n params: {\n domain: '',\n did: getInitialBlockletDid(blocklets),\n port: '',\n interfaceName: '',\n type: ROUTING_RULE_TYPES.BLOCKLET,\n redirectCode: 302,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n useEffect(() => {\n const { searchParams } = new URL(window.location.href);\n const fromDid = searchParams.get('fromDid');\n if (fromDid) {\n setConfirmSetting(setting);\n }\n }, []); // eslint-disable-line\n\n return (\n <>\n {typeof children === 'function' ? (\n children({ loading, open: onMenuItemClick })\n ) : (\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-add-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.add.title')}\n </MenuItem>\n )}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n\nAddDomain.propTypes = {\n blocklets: PropTypes.array,\n children: PropTypes.any,\n onActivate: PropTypes.func,\n};\n\nAddDomain.defaultProps = {\n onActivate: () => {},\n children: null,\n blocklets: [],\n};\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport DelConfirm from '../../../delete-confirm';\n\nexport default function DeleteDomain(props) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, name } = props;\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n await actions.deleteSite(id);\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.delete.title'),\n description: t('router.domain.delete.description', { name: `<b>${name}</b>` }),\n confirmPlaceholder: t('router.domain.delete.confirm_desc', { name }),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n keyName: name,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || props.onActivate();\n };\n\n return (\n <>\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\" data-cy=\"action-delete-domain\">\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.delete.title')}\n </MenuItem>\n {confirmSetting && (\n <DelConfirm\n keyName={confirmSetting.keyName}\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirmPlaceholder={confirmSetting.confirmPlaceholder}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/jsx-curly-newline */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable react/jsx-curly-spacing */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState } from 'react';\n\nimport EditIcon from '@material-ui/icons/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, isSpecialDomain } from '../../../../contexts/routing';\n\nimport Confirm from '../../../confirm';\n\nimport { validateDomain } from './utils';\n\nexport default function UpdateDomain({ id, name, onActivate }) {\n const { t } = useLocaleContext();\n const { actions } = useRoutingContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n\n if (isSpecialDomain(name)) {\n return null;\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async params => {\n setLoading(true);\n await actions.updateSite(id, { domain: params.domain.trim() });\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const setting = {\n title: t('router.domain.update.title'),\n description: (params, setParams, setError) => (\n <Typography component=\"div\">\n <TextField\n label={t('router.domain.update.label')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n fullWidth\n autoFocus\n value={params.domain}\n style={{ marginBottom: 32 }}\n helperText={t('router.domain.update.description')}\n onChange={e => {\n const domain = e.target.value.trim();\n const errMsg = validateDomain(domain, t);\n setParams({ ...params, domain: e.target.value, __disableConfirm: !!errMsg });\n if (errMsg) {\n setError(errMsg);\n } else {\n setError('');\n }\n }}\n />\n </Typography>\n ),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n params: {\n domain: name,\n __disableConfirm: true,\n },\n onConfirm,\n onCancel,\n };\n\n const onMenuItemClick = e => {\n e.stopPropagation();\n // eslint-disable-next-line no-unused-expressions\n setConfirmSetting(setting) || onActivate();\n };\n\n return (\n <>\n <MenuItem onClick={onMenuItemClick} className=\"rule-action\">\n {loading ? <Spinner size={[16, 10]} /> : <EditIcon style={{ fontSize: 18, marginRight: 5 }} />}\n {t('router.domain.update.title')}\n </MenuItem>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n color=\"primary\"\n />\n )}\n </>\n );\n}\n","/* eslint-disable react/destructuring-assignment */\n/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Menu from '@material-ui/core/Menu';\nimport IconMoreVert from '@material-ui/icons/MoreVert';\nimport IconButton from '@material-ui/core/IconButton';\n\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport AddDomain from './add-domain';\nimport DeleteDomain from './delete-domain';\nimport AddRule from './add-rule';\nimport DeleteRule from './delete-rule';\nimport UpdateRule from './update-rule';\nimport AddDomainAlias from './add-domain-alias';\nimport DeleteDomainAlias from './delete-domain-alias';\nimport UpdateDomainSecurity from './update-domain-security';\nimport UpdateDomain from './update-domain';\n\nexport default function RuleItemAction(props) {\n const [anchorEl, setAnchorEl] = useState(null);\n\n const onOpen = e => {\n e.stopPropagation();\n setAnchorEl(e.currentTarget);\n };\n\n const onClose = e => {\n if (e) {\n e.stopPropagation();\n }\n setAnchorEl(null);\n };\n\n if (props.isProtected || (props.parent && props.parent.isProtected)) {\n return null;\n }\n\n if (props.type === 'domainAlias') {\n return <DeleteDomainAlias key=\"delete-domain-alias\" {...props} onActivate={onClose} />;\n }\n\n const items = [];\n\n if (props.type === 'root') {\n items.push(<AddDomain key=\"add-domain\" {...props} onActivate={onClose} />);\n }\n\n if (props.type === 'domain') {\n items.push(\n <UpdateDomain key=\"update-domain\" {...props} onActivate={onClose} />,\n <AddRule key=\"add-rule\" {...props} onActivate={onClose} onRuleAdded={props.onRuleAdded} />,\n <AddDomainAlias key=\"add-domain-alias\" {...props} onActivate={onClose} />,\n <UpdateDomainSecurity key=\"update-domain-security\" {...props} onActivate={onClose} />,\n <DeleteDomain key=\"delete-domain\" {...props} onActivate={onClose} />\n );\n }\n\n if (props.type === 'rule') {\n items.push(\n <UpdateRule key=\"update-rule\" {...props} onActivate={onClose} />,\n <DeleteRule key=\"delete-rule\" {...props} onActivate={onClose} />\n );\n }\n\n if (props.type === ROUTING_RULE_TYPES.REDIRECT) {\n items.push(<DeleteDomain key=\"delete-domain\" {...props} onActivate={onClose} />);\n }\n\n if (props.type === 'dashboard_domain') {\n items.push(\n <AddRule key=\"add-rule\" {...props} onActivate={onClose} />,\n <UpdateDomainSecurity key=\"update-domain-security\" {...props} onActivate={onClose} />,\n <AddDomainAlias key=\"add-domain-alias\" {...props} onActivate={onClose} />\n );\n }\n\n if (items.length === 0) {\n return null;\n }\n\n const mouseDown = e => {\n e.stopPropagation();\n };\n\n return (\n <div>\n <IconButton onMouseDown={mouseDown} onClick={onOpen} data-cy=\"action-trigger\" rounded>\n <IconMoreVert />\n </IconButton>\n <Menu\n keepMounted\n onMouseDown={mouseDown}\n open={!!anchorEl}\n onClose={onClose}\n getContentAnchorEl={null}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>\n {items}\n </Menu>\n </div>\n );\n}\n\nRuleItemAction.propTypes = {\n blocklet: PropTypes.object,\n onRuleAdded: PropTypes.func,\n};\n\nRuleItemAction.defaultProps = {\n onRuleAdded: () => {},\n blocklet: {},\n};\n","/* eslint-disable no-script-url */\n/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport isUrl from 'is-url';\nimport styled from 'styled-components';\n\nimport OkIcon from '@material-ui/icons/CheckCircle';\nimport BadIcon from '@material-ui/icons/Error';\nimport NodeIcon from '@material-ui/icons/Storage';\nimport DomainIcon from '@material-ui/icons/Public';\nimport RuleIcon from '@material-ui/icons/SubdirectoryArrowRight';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport ExternalLink from '@material-ui/core/Link';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport Collapse from '@material-ui/core/Collapse';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { DASHBOARD, DOMAIN_FOR_DEFAULT_SITE } from '../../../contexts/routing';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport { useNodeContext } from '../../../contexts/node';\n\nimport RuleItemAction from './action';\nimport DomainStatus from './domain-status';\nimport BlockletStatus from '../../blocklet/status';\nimport BlockletInterface from '../../blocklet/interface';\nimport { useDomainStatusContext } from '../../../contexts/domain-status';\nimport Permission from '../../permission';\n\nconst RedirectRule = ({ domain, isHttps, toUrl, interfaces }) => {\n const scheme = isHttps ? 'https' : 'http';\n const { t } = useLocaleContext();\n let tmpToUrl = toUrl;\n if (!isUrl(tmpToUrl)) {\n tmpToUrl = `${scheme}://${domain}${toUrl}`;\n }\n\n const [{ url }] = interfaces;\n\n return (\n <>\n <Typography className=\"arrow-name-middle\">\n {domain !== DOMAIN_FOR_DEFAULT_SITE && (\n <ExternalLink className=\"arrow-name-middle\" href={url} target=\"_blank\">\n {t('common.redirect')}\n </ExternalLink>\n )}\n {domain === DOMAIN_FOR_DEFAULT_SITE && t('common.redirect')}\n </Typography>\n <span className=\"arrow-name-arrow\">⟶</span>\n <ExternalLink key={tmpToUrl} href={tmpToUrl} target=\"_blank\">\n {toUrl}\n </ExternalLink>\n </>\n );\n};\n\nRedirectRule.propTypes = {\n domain: PropTypes.string.isRequired,\n toUrl: PropTypes.string.isRequired,\n isHttps: PropTypes.bool,\n interfaces: PropTypes.array,\n};\n\nRedirectRule.defaultProps = {\n isHttps: false,\n interfaces: [],\n};\n\nconst NoneRule = ({ domain, interfaces }) => {\n const { t } = useLocaleContext();\n const [{ url }] = interfaces;\n\n return (\n <Typography className=\"arrow-name-middle\">\n {domain !== DOMAIN_FOR_DEFAULT_SITE && (\n <ExternalLink key={url} href={url} target=\"_blank\">\n {t('common.page404')}\n </ExternalLink>\n )}\n {domain === DOMAIN_FOR_DEFAULT_SITE && t('common.page404')}\n </Typography>\n );\n};\n\nNoneRule.propTypes = {\n domain: PropTypes.string,\n interfaces: PropTypes.string,\n};\n\nNoneRule.defaultProps = {\n domain: '',\n interfaces: [],\n};\n\nexport default function RuleItem(props) {\n const { t } = useLocaleContext();\n const { data } = useBlockletContext();\n const { info } = useNodeContext();\n const { status: domainsStatus } = useDomainStatusContext();\n\n const blocklets = data.map(x => ({\n meta: {\n did: x.meta.did,\n name: x.meta.title || x.meta.name,\n version: x.meta.version,\n interfaces: x.meta.interfaces,\n },\n port: x.port,\n ports: x.ports,\n status: x.status,\n }));\n\n const {\n type,\n name,\n title,\n items = [],\n depth,\n to,\n interfaces = [],\n id: ruleId,\n expand: initialExpand,\n isProtected,\n pathPrefix,\n parent,\n domainAliases,\n } = props;\n\n const [expand, setExpand] = useState(initialExpand);\n\n const icons = {\n root: NodeIcon,\n domain: DomainIcon,\n rule: RuleIcon,\n };\n\n const IconComponent = icons[type];\n const style = { paddingBottom: 8, paddingLeft: 8 };\n\n if (type === 'domain') {\n if (isProtected) {\n return null;\n }\n\n const DomainLink = ({ domain, primaryDomain, rules }) => {\n let url = `http://${domain}`;\n if (primaryDomain === DASHBOARD) {\n url = `${url}/${info.routing.adminPath.replace(/^\\/+/, '')}`;\n } else if (rules && rules.length && rules[0].pathPrefix) {\n url = `${url}/${rules[0].pathPrefix.replace(/^\\/+/, '')}`;\n }\n\n if (domain !== DASHBOARD) {\n return (\n <DomainElement href={url} target=\"_blank\" rel=\"noreferrer\" onClick={e => e.stopPropagation()}>\n {domain}\n </DomainElement>\n );\n }\n return domain;\n };\n\n DomainLink.propTypes = {\n domain: PropTypes.string.isRequired,\n primaryDomain: PropTypes.string.isRequired,\n rules: PropTypes.array.isRequired,\n };\n\n const onRuleAdded = () => {\n setExpand(true);\n };\n\n return [\n <ItemDiv alignItems=\"flex-start\" button key=\"parent\" disableGutters data-cy=\"rule-domain\">\n <ListItemIcon onClick={() => setExpand(d => !d)}>\n {items.length > 0 && (expand ? <ExpandMoreIcon /> : <ChevronRightIcon />)}\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText\n onClick={() => setExpand(d => !d)}\n className={`rule-name rule-name--depth${depth}`}\n style={{ flex: 1 }}\n secondary={items.length <= 0 ? <span className=\"site-secondary\">{t('router.empty')}</span> : ''}\n primary={\n <>\n <div className=\"site-header\">\n {name === DOMAIN_FOR_DEFAULT_SITE && t('router.defaultSite')}\n {name !== DOMAIN_FOR_DEFAULT_SITE && <DomainLink domain={name} primaryDomain={name} rules={items} />}\n {items.length && !expand ? <span style={{ marginLeft: 5 }}>{`(${items.length} URL)`}</span> : null}\n <span style={{ marginLeft: 12 }} />\n {type === 'domain' && name !== DOMAIN_FOR_DEFAULT_SITE && name !== DASHBOARD && (\n <DomainStatus key={name} type={type} name={name} />\n )}\n </div>\n {(domainAliases || [])\n .filter(item => !item.isProtected && item.value !== name)\n .map(item => {\n const domain = item.value || item;\n return (\n <div key={domain} className=\"site-alias\">\n <DomainLink domain={domain} primaryDomain={name} rules={items} />\n <DomainStatus key={`domain-status-${name}`} type={type} name={domain} />\n {domain !== DASHBOARD && domain !== window.location.hostname && (\n <RuleItemAction\n key={`action-${name}`}\n {...props}\n domainAlias={domain}\n type=\"domainAlias\"\n onRuleAdded={onRuleAdded}\n />\n )}\n </div>\n );\n })}\n </>\n }\n />\n\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction\n blocklets={blocklets}\n key={name}\n {...props}\n onRuleAdded={onRuleAdded}\n type={name === DASHBOARD ? 'dashboard_domain' : type}\n />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>,\n <Collapse key=\"rules\" in={expand}>\n {items.length > 0 && (\n <List key=\"children\" component=\"div\" className={`rule-list rule-list--depth${depth}`} disablePadding>\n {items.map(x => (\n <RuleItem key={x.id} {...x} parent={props} depth={depth + 1} />\n ))}\n </List>\n )}\n </Collapse>,\n ];\n }\n\n // We have no rules: just the root node with no children\n if (type === 'root') {\n return [\n <ItemDiv key=\"root\" disableGutters data-cy=\"rule-root\">\n <ListItemIcon>\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText primary={name} />\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction blocklets={blocklets} {...props} />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>,\n items.length > 0 && (\n <List key=\"children\" component=\"div\" className={`rule-list rule-list--depth${depth}`} disablePadding>\n {items.map(x => (\n <RuleItem expand={!isProtected} key={x.id} {...x} parent={props} depth={depth + 1} />\n ))}\n </List>\n ),\n ];\n }\n\n // Then we must render the leaf node\n let internalLink = `/blocklets/${to.did}/overview`;\n if (to.type === ROUTING_RULE_TYPES.DAEMON) {\n internalLink = '/';\n }\n\n const dashboard = {\n meta: { did: info.did, name: 'Blocklet Server Dashboard', version: info.version },\n status: 'running',\n port: info.port,\n };\n\n const blocklet = to.did === info.did ? dashboard : blocklets.find(x => x.meta.did === to.did);\n const isHealthy = (blocklet && blocklet.status === 'running') || to.type === ROUTING_RULE_TYPES.DAEMON;\n const healthyTip = isHealthy ? t('router.healthy.ok') : t('router.healthy.error');\n\n const domainStatus = domainsStatus[parent.name] || {};\n\n return (\n <ItemDiv className=\"hover-item\" divider key={name} disableGutters style={style} data-cy=\"rule-item\">\n <ListItemIcon className=\"arrow-icon\">\n <IconComponent style={{ fontSize: 22 }} />\n </ListItemIcon>\n <ListItemText\n primary={\n /* eslint-disable-next-line react/jsx-wrap-multilines */\n <Typography component=\"div\" className=\"arrow-name\">\n <Typography style={{ wordBreak: 'break-all' }} className=\"arrow-name-left\">\n {name}\n </Typography>\n <span className=\"arrow-name-arrow\">⟶</span>\n {(to.type === ROUTING_RULE_TYPES.DAEMON || to.type === ROUTING_RULE_TYPES.BLOCKLET) && (\n <>\n {parent.name !== DOMAIN_FOR_DEFAULT_SITE && isHealthy && (\n <BlockletInterface\n className=\"arrow-name-middle\"\n blocklet={{\n interfaces:\n to.type === ROUTING_RULE_TYPES.BLOCKLET\n ? interfaces.filter(x => x.name === to.interfaceName)\n : interfaces,\n ruleId,\n ...(blocklet || {}),\n }}\n />\n )}\n {parent.name === DOMAIN_FOR_DEFAULT_SITE && (\n <Typography component=\"span\" className=\"arrow-name-middle\">\n Blocklet\n </Typography>\n )}\n {!isHealthy && <span className=\"arrow-name-middle\">{t('common.unavailable')}</span>}\n <span className=\"arrow-name-arrow\">⟶</span>\n <Link to={internalLink} className=\"arrow-name-right\">\n <Tooltip title={healthyTip}>\n {isHealthy ? (\n <OkIcon style={{ color: '#44cdc6', fontSize: 20 }} />\n ) : (\n <BadIcon style={{ color: 'red', fontSize: 20 }} />\n )}\n </Tooltip>\n <span>{blocklet ? blocklet.meta.name : title}</span>\n {blocklet && (\n <span style={{ marginLeft: 8 }}>\n <BlockletStatus status={blocklet.status} />\n </span>\n )}\n </Link>\n </>\n )}\n {to.type === ROUTING_RULE_TYPES.REDIRECT && (\n <RedirectRule\n prefix={pathPrefix}\n domain={parent.name}\n toUrl={to.url}\n isHttps={domainStatus.isHttps}\n interfaces={interfaces}\n />\n )}\n {to.type === ROUTING_RULE_TYPES.NONE && <NoneRule interfaces={interfaces} domain={parent.name} />}\n </Typography>\n }\n />\n <Permission permission=\"mutate_router\">\n <ListItemSecondaryAction>\n <RuleItemAction blocklets={blocklets} {...props} did={to.did} />\n </ListItemSecondaryAction>\n </Permission>\n </ItemDiv>\n );\n}\n\nRuleItem.propTypes = {\n type: PropTypes.string.isRequired,\n to: PropTypes.object,\n name: PropTypes.string.isRequired,\n title: PropTypes.string,\n id: PropTypes.string,\n items: PropTypes.array,\n parent: PropTypes.object,\n depth: PropTypes.number,\n interfaces: PropTypes.array,\n expand: PropTypes.bool,\n isProtected: PropTypes.bool,\n pathPrefix: PropTypes.string,\n domainAliases: PropTypes.array,\n};\n\nRuleItem.defaultProps = {\n id: '',\n to: {},\n title: '',\n items: [],\n depth: 0,\n parent: {},\n interfaces: [],\n expand: true,\n isProtected: false,\n pathPrefix: '',\n domainAliases: [],\n};\n\nconst ItemDiv = styled(ListItem)`\n .MuiListItemText-root {\n padding-right: 48px;\n }\n .MuiListItemSecondaryAction-root {\n right: 0;\n }\n .site-header {\n display: unset !important;\n vertical-align: middle;\n .MuiSvgIcon-root {\n vertical-align: middle;\n }\n }\n`;\n\nconst DomainElement = styled('a')`\n color: #000;\n white-space: normal;\n word-break: break-all;\n :hover {\n color: rgba(0, 0, 0, 0.6);\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nimport Box from '@material-ui/core/Box';\nimport List from '@material-ui/core/List';\nimport AddIcon from '@material-ui/icons/Add';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useRoutingContext } from '../../contexts/routing';\nimport { useBlockletContext } from '../../contexts/blocklets';\nimport { DomainStatusProvider } from '../../contexts/domain-status';\n\nimport AddDomain from './rule/action/add-domain';\nimport RuleItem from './rule/item';\nimport Permission from '../permission';\n\nexport default function RouterPage() {\n const { sites, allDomains } = useRoutingContext();\n const { data: blocklets } = useBlockletContext();\n const { t } = useLocaleContext();\n\n const list = sites.map(x => {\n const items = x.items.filter(y => !y.isProtected);\n return { ...x, items };\n });\n\n return (\n <DomainStatusProvider domains={allDomains}>\n <Main>\n <Permission permission=\"mutate_router\">\n <Box textAlign=\"right\" mb={1}>\n <AddDomain blocklets={blocklets}>\n {({ open }) => (\n <Button\n style={{ marginLeft: 16 }}\n variant=\"contained\"\n rounded\n color=\"primary\"\n data-cy=\"add-domain-alias\"\n onClick={open}>\n <AddIcon style={{ fontSize: '1.3em', marginRight: 4 }} />\n {t('router.domain.add.title')}\n </Button>\n )}\n </AddDomain>\n </Box>\n </Permission>\n <List component=\"div\" disablePadding>\n {list.map(x => (\n <RuleItem {...x} depth={1} />\n ))}\n </List>\n </Main>\n </DomainStatusProvider>\n );\n}\n\nconst Main = styled.main`\n margin-top: ${props => props.theme.spacing(2)}px;\n min-height: 60vh;\n\n .MuiListItemIcon-root {\n min-width: ${props => props.theme.spacing(4)}px;\n }\n\n .site-header {\n display: flex;\n align-items: center;\n margin-left: ${props => props.theme.spacing(1)}px;\n font-size: 1.2rem;\n }\n\n .site-alias {\n display: flex;\n align-items: center;\n margin-left: ${props => props.theme.spacing(1)}px;\n }\n\n .site-secondary {\n margin-left: ${props => props.theme.spacing(1)}px;\n }\n\n .rule-list--depth1 {\n padding-left: ${props => props.theme.spacing(4)}px;\n }\n\n .rule-list--depth2 {\n padding-left: ${props => props.theme.spacing(5)}px;\n }\n\n .rule-action {\n margin-left: ${props => props.theme.spacing(2)}px;\n }\n\n .rule-name--depth2 span {\n font-weight: bold;\n }\n\n .arrow-name {\n display: flex;\n align-items: center;\n .arrow-name-left {\n width: 400px;\n flex-shrink: 0;\n text-align: left;\n }\n .arrow-name-middle {\n width: 150px;\n flex-shrink: 0;\n text-align: left;\n }\n .arrow-name-arrow {\n width: 40px;\n flex-shrink: 0;\n margin: auto 16px;\n font-size: 24px;\n color: #0000008a;\n }\n .arrow-name-right {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n\n span {\n margin: 0 8px;\n }\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n .rule-list--depth1,\n .rule-list--depth2 {\n padding-left: 0;\n }\n\n .MuiListItem-secondaryAction {\n padding-right: 0;\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.lg}px) {\n .arrow-icon {\n margin-top: 4px;\n align-self: flex-start;\n }\n\n .arrow-name {\n flex-direction: column;\n align-items: flex-start;\n .arrow-name-left {\n width: auto;\n }\n .arrow-name-middle {\n margin: 5px 0;\n }\n .arrow-name-arrow {\n display: none;\n }\n }\n }\n`;\n","/* eslint-disable react/jsx-curly-newline */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\nimport get from 'lodash/get';\nimport { useDropzone } from 'react-dropzone';\nimport { useForm, Controller } from 'react-hook-form';\nimport Box from '@material-ui/core/Box';\n\nimport AddIcon from '@material-ui/icons/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Radio from '@material-ui/core/Radio';\nimport RadioGroup from '@material-ui/core/RadioGroup';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useNodeContext } from '../../../../../contexts/node';\nimport { formatError } from '../../../../../libs/util';\n\nconst MAX_FILE_SIZE = 50 * 1024;\n\nconst readFile = file =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file);\n\n reader.onload = () => {\n resolve(reader.result);\n };\n\n reader.onerror = err => reject(err);\n });\n\nexport default function UpdateNginxCert({ certificate = {}, onRefresh, mode, ...restProps }) {\n const { t } = useLocaleContext();\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [keyFile, setKeyFile] = useState();\n const [pemFile, setPemFile] = useState();\n const [open, setOpen] = useState(false);\n const [error, setError] = useState('');\n const [certSource, setCertSource] = useState('upload');\n\n const { register, handleSubmit, errors, control, watch } = useForm({\n defaultValues: {\n name: certificate.name || certificate.domain,\n public: certificate.public || false,\n },\n });\n\n const domain = watch('domain', '');\n const name = watch('name', '');\n\n const onCancel = () => {\n setLoading(false);\n setOpen(false);\n };\n\n const submitUpload = async data => {\n if (mode === 'add') {\n const pem = (await readFile(pemFile)).replace(/\\r\\n/g, '\\n');\n const key = (await readFile(keyFile)).replace(/\\r\\n/g, '\\n');\n await api.addNginxHttpsCert({\n input: {\n name: data.name.trim(),\n public: data.public,\n certificate: pem.split('\\n').join('|'),\n privateKey: key.split('\\n').join('|'),\n },\n });\n } else {\n await api.updateNginxHttpsCert({\n input: {\n id: certificate.id,\n name: data.name.trim(),\n public: data.public,\n },\n });\n }\n };\n\n const submitLetsEncrypt = data => api.issueLetsEncryptCert({ input: { domain: data.domain } });\n\n const certSources = {\n upload: {\n name: t('router.cert.nginx.sourceTypes.upload'),\n value: 'upload',\n onSubmit: submitUpload,\n },\n lets_encrypt: {\n name: t('router.cert.nginx.sourceTypes.lets_encrypt'),\n value: 'lets_encrypt',\n onSubmit: submitLetsEncrypt,\n },\n };\n\n const onSubmit = async data => {\n setLoading(true);\n\n try {\n const source = certSources[certSource];\n if (!source) {\n throw new Error('Invaid certificate source');\n }\n\n await source.onSubmit(data);\n onRefresh();\n setOpen(false);\n } catch (err) {\n setError(formatError(err) || 'unknown error, may be you can check file permission');\n } finally {\n setLoading(false);\n }\n };\n\n const handleAdd = () => {\n setKeyFile(null);\n setPemFile(null);\n setOpen(true);\n setError('');\n };\n\n const handleChangeCertSource = e => {\n setCertSource(e.target.value);\n };\n\n const disableConfirmButton = () => {\n if (loading) {\n return true;\n }\n\n if (certSource === 'upload' && mode === 'update') {\n return !name;\n }\n\n if (certSource === 'upload' && mode === 'add') {\n return !name || !keyFile || !pemFile;\n }\n\n if (certSource === 'lets_encrypt' && !domain) {\n return true;\n }\n\n return false;\n };\n\n const Upload = () => {\n const onDropRejected = files => {\n if (files.length > 0) {\n setError(get(files[0], 'errors[0].message', t('router.cert.add.invalidFile')));\n }\n };\n\n const { getRootProps: getPemRootProps, getInputProps: getPemInputProps } = useDropzone({\n accept: ['.pem', '.crt'],\n multiple: false,\n maxSize: MAX_FILE_SIZE,\n onDropRejected,\n onDrop: acceptedFiles => {\n setPemFile(acceptedFiles[0]);\n },\n });\n\n const { getRootProps: getKeyRootProps, getInputProps: getKeyInputProps } = useDropzone({\n accept: ['.pem', '.key'],\n multiple: false,\n maxSize: MAX_FILE_SIZE,\n onDropRejected,\n onDrop: acceptedFiles => {\n setKeyFile(acceptedFiles[0]);\n },\n });\n\n return (\n <>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.name')}</div>\n <TextField\n fullWidth\n autoFocus\n error={!!errors.name}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"name\"\n className=\"form-item-value\"\n helperText={errors.name && errors.name.message}\n inputRef={register({\n validate: value => !!value.trim() || t('common.requiredErrorText', { name: t('router.cert.name') }),\n })}\n value={name}\n />\n </section>\n {mode === 'add' && (\n <>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.nginx.pem')}</div>\n <div className=\"form-item-value\">\n <div {...getPemRootProps({ className: 'dropzone' })}>\n <input {...getPemInputProps()} data-cy=\"pem-input\" />\n {pemFile && <Typography color=\"secondary\">{pemFile.name}</Typography>}\n {!pemFile && <Typography color=\"secondary\">{t('router.cert.nginx.empty')}</Typography>}\n <Typography component=\"small\" variant=\"body2\" color=\"textSecondary\">\n {t('router.cert.nginx.pemTip')}\n </Typography>\n </div>\n </div>\n </section>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.nginx.key')}</div>\n <div className=\"form-item-value\">\n <div {...getKeyRootProps({ className: 'dropzone' })}>\n <input {...getKeyInputProps()} data-cy=\"key-input\" />\n {keyFile && <Typography color=\"secondary\">{keyFile.name}</Typography>}\n {!keyFile && <Typography color=\"secondary\">{t('router.cert.nginx.empty')}</Typography>}\n <Typography component=\"small\" variant=\"body2\" color=\"textSecondary\">\n {t('router.cert.nginx.keyTip')}\n </Typography>\n </div>\n </div>\n </section>\n </>\n )}\n </>\n );\n };\n\n const LetsEncrypt = () => (\n <>\n <section className=\"form-item\">\n <Alert type=\"success\">{t('router.domainAlias.genLetsEncryptCert.dnsTip')}</Alert>\n </section>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('common.domain')}</div>\n <TextField\n fullWidth\n autoFocus\n error={!!errors.domain}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"domain\"\n className=\"form-item-value\"\n helperText={errors.domain && errors.domain.message}\n inputRef={register({\n validate: value => !!value.trim() || t('common.requiredErrorText', { name: t('common.domain') }),\n })}\n value={domain}\n />\n </section>\n </>\n );\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={handleAdd}\n className=\"rule-action\"\n rounded\n color=\"primary\"\n data-cy=\"add-cert\"\n {...restProps}>\n {loading ? <Spinner size={[16, 10]} /> : <AddIcon style={{ fontSize: 16 }} />}\n {t(mode === 'add' ? 'common.add' : 'common.update')}\n </Button>\n {open && (\n <Dialog\n title={t(mode === 'add' ? 'router.cert.nginx.titleAdd' : 'router.cert.nginx.title')}\n open\n onClose={onCancel}\n actions={\n <>\n <Button onClick={onCancel} color=\"default\" rounded size=\"small\" data-cy=\"cert-cancel\">\n {t('router.cert.nginx.cancel')}\n </Button>\n <Button\n onClick={handleSubmit(onSubmit)}\n color=\"secondary\"\n size=\"small\"\n disabled={disableConfirmButton()}\n variant=\"contained\"\n autoFocus\n data-cy=\"save-cert\"\n rounded>\n {t('router.cert.nginx.confirm')}\n {loading && <Spinner size={[16, 10]} />}\n </Button>\n </>\n }>\n <form className=\"form\" data-cy=\"cert-form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n <Box minWidth={{ sm: 480 }}>\n <DialogContentText component=\"div\">\n {mode === 'add' && (\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.source')}</div>\n <RadioGroup\n aria-label=\"cert-source\"\n name=\"certSource\"\n value={certSource}\n onChange={handleChangeCertSource}>\n {Object.values(certSources).map(source => (\n <FormControlLabel\n key={source.value}\n value={source.value}\n control={<Radio />}\n label={source.name}\n />\n ))}\n </RadioGroup>\n </section>\n )}\n {certSource === 'upload' && <Upload />}\n {certSource === 'lets_encrypt' && <LetsEncrypt />}\n <section className=\"form-item\" style={{ display: 'flex', alignItems: 'center' }}>\n <Controller\n control={control}\n name=\"public\"\n render={({ onChange, onBlur, value, name: tName }) => (\n <FormControlLabel\n control={\n <Checkbox\n onBlur={onBlur}\n onChange={e => onChange(e.target.checked)}\n checked={value}\n name={tName}\n />\n }\n label={t('router.cert.setPublic')}\n />\n )}\n />\n <Typography color=\"error\" component=\"span\" style={{ fontSize: '0.8em' }}>\n {t('router.cert.setPublicCertHelperText')}\n </Typography>\n </section>\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" style={{ marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </Box>\n </form>\n </Dialog>\n )}\n </>\n );\n}\n","/* eslint-disable react/prop-types */\nimport React, { useState } from 'react';\n\nimport ActionIcon from '@material-ui/icons/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Confirm from '../../../confirm';\nimport getClient from '../../../../libs/node';\nimport { useRoutingContext } from '../../../../contexts/routing';\n\nexport default function DeleteCert(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { id, onDelete = () => {}, ...restProps } = props;\n const { refresh: refreshRoutingContext } = useRoutingContext();\n\n const client = getClient();\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n try {\n await client.deleteNginxHttpsCert({ input: { id } });\n refreshRoutingContext();\n onDelete();\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: t('router.cert.delete.title'),\n description: t('router.cert.delete.description'),\n confirm: t('common.delConfirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={() => setConfirmSetting(setting)}\n size=\"small\"\n className=\"rule-action\"\n variant=\"text\"\n color=\"danger\"\n data-cy=\"action-delete-cert\"\n {...restProps}>\n {loading ? <Spinner size={[16, 10]} /> : <ActionIcon style={{ fontSize: 16 }} />}\n {t('common.delete')}\n </Button>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n}\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport get from 'lodash/get';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useTheme } from '@material-ui/core/styles';\nimport Button from '@arcblock/ux/lib/Button';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport DetailsIcon from '@material-ui/icons/Details';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\n\nimport { formatToDate, formatToDatetime } from '../../../../libs/util';\n\nexport default function DetailCert(props) {\n const { certificate = {}, ...restProps } = props;\n const { t } = useLocaleContext();\n const [open, setOpen] = useState(false);\n const theme = useTheme();\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const certBasicRows = [\n {\n id: 'matchedSites',\n name: t('router.cert.matchedSites'),\n value: (certificate.matchedSites || []).map(s => (\n <Typography component=\"div\" key={s.id} style={{ fontWeight: 'inherit', fontSize: '1.1rem' }}>\n {s.domain}\n </Typography>\n )),\n },\n {\n id: 'updatedAt',\n name: t('common.updatedAt'),\n value: formatToDatetime(certificate.updatedAt),\n },\n {\n id: 'createdAt',\n name: t('common.createdAt'),\n value: formatToDatetime(certificate.createdAt),\n },\n ];\n\n const certInfoRows = [\n {\n id: 'boundDomains',\n name: t('router.cert.boundDomains'),\n value: (\n <Typography component=\"span\" style={{ fontSize: '1.1rem' }}>\n {(get(certificate, 'sans') || []).join(', ')}\n </Typography>\n ),\n },\n {\n id: 'issuer',\n name: t('common.issuer'),\n value: get(certificate, 'meta.issuer.commonName', ''),\n },\n {\n id: 'fingerprint',\n name: t('common.fingerprint'),\n value: get(certificate, 'meta.fingerprint'),\n },\n {\n id: 'fingerprintAlg',\n name: t('router.cert.fingerprintAlg'),\n value: get(certificate, 'meta.fingerprintAlg'),\n },\n {\n id: 'validityPeriod',\n name: t('router.cert.validityPeriod'),\n value: moment.duration(get(certificate, 'meta.validityPeriod'), 'ms').humanize(),\n },\n { id: 'issuedOn', name: t('router.cert.issuedOn'), value: formatToDate(get(certificate, 'meta.validFrom')) },\n { id: 'expiryOn', name: t('router.cert.expiryOn'), value: formatToDate(get(certificate, 'meta.validTo')) },\n ];\n\n return (\n <>\n <Button\n edge=\"end\"\n onClick={() => setOpen(true)}\n size=\"small\"\n className=\"rule-action\"\n variant=\"text\"\n color=\"secondary\"\n data-cy=\"action-view-cert\"\n {...restProps}>\n <DetailsIcon style={{ fontSize: 16 }} />\n {t('common.detail')}\n </Button>\n <Dialog\n title={t('router.cert.detail.title')}\n aria-labelledby=\"certificate details\"\n fullWidth\n open={open}\n showCloseButton={false}\n actions={\n <>\n <Button autoFocus rounded variant=\"contained\" onClick={handleClose} color=\"secondary\">\n {t('common.close')}\n </Button>\n </>\n }>\n <DialogContentText key=\"cert-basic\" component=\"div\" style={{ margin: theme.spacing(2) }}>\n {certBasicRows.map(row => (\n <InfoRow key={row.id} nameWidth={200} valueComponent=\"div\" name={row.name}>\n {row.value}\n </InfoRow>\n ))}\n </DialogContentText>\n <Divider />\n <DialogContentText key=\"cer-info\" component=\"div\" style={{ margin: theme.spacing(2) }}>\n {certInfoRows.map(row => (\n <InfoRow key={row.id} nameWidth={200} valueComponent=\"div\" name={row.name}>\n {row.value}\n </InfoRow>\n ))}\n </DialogContentText>\n <Divider />\n </Dialog>\n </>\n );\n}\n\nDetailCert.propTypes = {\n certificate: PropTypes.object.isRequired,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Typography from '@material-ui/core/Typography';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function MatchedSites(props) {\n const { certificate, style, ...restProps } = props;\n const { t } = useLocaleContext();\n const [showMore, setShowMore] = useState(false);\n\n const sites = certificate.matchedSites || [];\n\n return (\n <Typography\n component=\"ul\"\n {...restProps}\n style={{\n ...style,\n listStyle: 'none',\n }}>\n {(showMore ? sites : sites.slice(0, 4)).map(s => (\n <Typography component=\"li\" key={s.id} style={{ fontSize: '1.1rem' }}>\n {s.domain}\n </Typography>\n ))}\n {sites.length > 4 && (\n <Button\n style={{ border: 'none', padding: '5px 0' }}\n variant=\"outlined\"\n color=\"primary\"\n className=\"button\"\n onClick={() => {\n setShowMore(!showMore);\n }}>\n {showMore ? t('common.collapseAll') : t('common.expandAll')}\n </Button>\n )}\n </Typography>\n );\n}\n\nMatchedSites.propTypes = {\n certificate: PropTypes.object.isRequired,\n style: PropTypes.object,\n};\nMatchedSites.defaultProps = {\n style: {},\n};\n","/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport get from 'lodash/get';\nimport { LocaleContext, useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport MaterialTable from 'material-table';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport InfoIcon from '@material-ui/icons/InfoOutlined';\n\nimport tableIcons from '../table-icons';\nimport TableStyle from '../table';\nimport getClient from '../../libs/node';\nimport UpdateNginxCert from './rule/action/update-cert/nginx';\nimport DeleteCert from './rule/action/delete-cert';\nimport DetailCert from './rule/action/detail-cert';\nimport MatchedSites from './rule/action/matched-sites';\nimport { formatToDate } from '../../libs/util';\nimport Permission from '../permission';\nimport Tag from '../tag';\n\nconst oneDayTimestamp = 1 * 24 * 60 * 60 * 1000;\n\nconst isExpired = expiresTime => {\n if (!expiresTime) return false;\n const currentTime = +new Date();\n const time = expiresTime - currentTime;\n\n return time <= 0;\n};\n\nconst ExpiresCell = ({ expiresTime }) => {\n const { t } = useContext(LocaleContext);\n\n if (!expiresTime) return null;\n\n const currentTime = +new Date();\n const time = expiresTime - currentTime;\n\n if (isExpired(expiresTime)) {\n return <span style={{ fontSize: '16px', color: 'red', whiteSpace: 'nowrap' }}>{formatToDate(expiresTime)}</span>;\n }\n\n return (\n <span style={{ color: time / oneDayTimestamp < 7 ? '#f90' : '#222', fontSize: '16px', whiteSpace: 'nowrap' }}>\n {formatToDate(expiresTime)}\n <span style={{ marginLeft: 6 }}>\n ({Math.ceil(time / oneDayTimestamp)}\n {t('router.cert.leftDays')})\n </span>\n </span>\n );\n};\nExpiresCell.propTypes = {\n expiresTime: PropTypes.number,\n};\n\nExpiresCell.defaultProps = {\n expiresTime: 0,\n};\n\n// eslint-disable-next-line react/prop-types\nconst TableCellInfoRow = ({ name, value, style = {}, icon, ...props }) => (\n <TableCellContainer style={{ display: 'flex', alignItems: 'center', ...style }} {...props}>\n <span>{name}:</span>\n <span>{value}</span>\n {icon && icon}\n </TableCellContainer>\n);\n\nconst TableCellContainer = styled.div`\n & > span {\n margin: 5px;\n }\n`;\n\nconst Status = ({ status, source, expiresTime }) => {\n const { t } = useLocaleContext();\n\n if (isExpired(expiresTime)) {\n return <Tag type=\"error\">{t('router.cert.expired')}</Tag>;\n }\n\n if (source === 'upload') {\n return <Tag type=\"success\">{t('common.normal')}</Tag>;\n }\n\n if (status === 'error') {\n return <Tag type=\"error\">{t('common.error')}</Tag>;\n }\n\n if (status === 'generated') {\n return <Tag type=\"success\">{t('common.normal')}</Tag>;\n }\n\n return '';\n};\n\nStatus.propTypes = {\n status: PropTypes.string,\n source: PropTypes.string,\n expiresTime: PropTypes.number.isRequired,\n};\n\nStatus.defaultProps = {\n status: '',\n source: '',\n};\n\nexport default function CertificateManager() {\n const { t } = useContext(LocaleContext);\n const client = getClient();\n\n const state = useAsyncRetry(async () => {\n // eslint-disable-next-line no-shadow\n const { certificates } = await client.getCertificates();\n return { certificates };\n });\n\n const onRefresh = () => {\n state.retry();\n };\n\n const columns = [\n {\n title: t('common.certificate'),\n render: row => (\n <>\n {row.name && (\n <TableCellInfoRow\n nowrap\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n name={t('common.name')}\n value={row.name}\n />\n )}\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n name={t('common.issuer')}\n value={get(row, 'meta.issuer.commonName', '')}\n />\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n icon={\n <Tooltip\n title={row.isPublic ? t('router.cert.publicCertHelperText') : t('router.cert.nonPublicCertHelperText')}>\n <InfoIcon style={{ fontSize: '18px' }} color=\"secondary\" />\n </Tooltip>\n }\n name={t('common.isPublic')}\n value={row.public ? t('common.yes') : t('common.no')}\n />\n <TableCellInfoRow\n style={{ fontSize: '16px', whiteSpace: 'nowrap' }}\n icon={\n <Tooltip\n title={\n row.isProtected\n ? t('router.cert.protectedCertHelperText')\n : t('router.cert.unprotectedCertHelperText')\n }>\n <InfoIcon style={{ fontSize: '18px' }} color=\"secondary\" />\n </Tooltip>\n }\n name={t('common.protected')}\n value={row.isProtected ? t('common.yes') : t('common.no')}\n />\n </>\n ),\n },\n {\n title: t('router.cert.boundDomains'),\n render: row => (\n <Typography noWrap component=\"ul\" style={{ listStyle: 'none' }}>\n {[...new Set([...(get(row, 'meta.sans') || []), row.domain])].map(s => (\n <Typography component=\"li\" key={s} style={{ fontSize: '1.1rem' }}>\n {s}\n </Typography>\n ))}\n </Typography>\n ),\n },\n {\n title: t('router.cert.source'),\n render: row => t(`router.cert.sourceTypes.${row.source}`),\n },\n {\n title: t('common.status'),\n render: row => <Status status={row.status} source={row.source} expiresTime={get(row, 'meta.validTo')} />,\n },\n {\n title: t('common.expires'),\n width: 120,\n render: row => <ExpiresCell expiresTime={get(row, 'meta.validTo')} />,\n },\n {\n title: t('router.cert.matchedSites'),\n render: row => <MatchedSites id={row.id} certificate={row} style={{ whiteSpace: 'nowrap' }} />,\n },\n {\n title: t('router.cert.action'),\n align: 'center',\n render: item => {\n const row = item;\n return (\n <Permission permission=\"mutate_router\">\n <>\n {!row.isProtected && (\n <>\n {row.source === 'upload' && (\n <div>\n <UpdateNginxCert mode=\"update\" certificate={row} onRefresh={onRefresh} />\n </div>\n )}\n <div>\n <DeleteCert id={row.id} onDelete={onRefresh} />\n </div>\n </>\n )}\n <div>\n <DetailCert id={row.id} certificate={row} />\n </div>\n </>\n </Permission>\n );\n },\n },\n ];\n\n if (!state.value && state.loading) {\n return <Spinner />;\n }\n\n return (\n <Div>\n <div className=\"table-header\">\n <Permission permission=\"mutate_router\">\n <UpdateNginxCert mode=\"add\" onRefresh={onRefresh} variant=\"contained\" />\n </Permission>\n </div>\n <TableStyle>\n <MaterialTable\n columns={columns}\n icons={{ ...tableIcons }}\n options={{\n sorting: false,\n emptyRowsWhenPaging: false,\n actionsColumnIndex: -1,\n tableLayout: 'auto',\n maxBodyHeight: '100%',\n search: false,\n pageSize: 1000,\n pageSizeOptions: [1000],\n headerStyle: { fontSize: 18 },\n }}\n localization={{\n body: {\n emptyDataSourceMessage: t('router.cert.table.nodata'),\n },\n }}\n data={state.value.certificates}\n />\n </TableStyle>\n </Div>\n );\n}\n\nconst Div = styled.div`\n .header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n margin-top: 20px;\n }\n\n margin-bottom: 24px;\n .table-cell {\n span {\n font-size: 18px;\n }\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n span {\n font-size: 15px;\n }\n }\n }\n .match-sites-cell,\n .expires-cell {\n min-width: 100px;\n }\n .actions {\n text-align: center;\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n .MuiButton-root {\n padding: 6px;\n }\n }\n }\n`;\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useContext } from 'react';\nimport styled from 'styled-components';\nimport { useParams, useHistory } from 'react-router-dom';\n\nimport Typography from '@material-ui/core/Typography';\n\nimport Tabs from '@arcblock/ux/lib/Tabs';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { NodeContext } from '../../contexts/node';\nimport BasicSettings from '../../components/settings/basic';\nimport AccessKeySettings from '../../components/settings/access-key';\nimport WebHookSetting from '../../components/settings/webhook';\nimport About from '../../components/settings/about';\nimport RouterSettings from '../../components/router/router-setting';\nimport CertSetting from '../../components/router/cert-setting';\n\nexport default function Settings() {\n const history = useHistory();\n const { node } = useContext(NodeContext);\n const { t } = useContext(LocaleContext);\n\n const { tab = 'basic' } = useParams();\n\n const onTabChange = newTab => {\n history.push(`/settings/${newTab}`);\n };\n\n const tabs = [\n { label: t('common.basic'), value: 'basic' },\n { label: t('common.accessKey'), value: 'accesskey' },\n { label: t('router.routerSetting'), value: 'router' },\n { label: t('router.certSetting'), value: 'cert' },\n { label: t('common.webhook'), value: 'integration' },\n { label: t('common.about'), value: 'about' },\n ];\n\n const renders = {\n basic: BasicSettings,\n accesskey: AccessKeySettings,\n integration: WebHookSetting,\n about: About,\n router: RouterSettings,\n cert: CertSetting,\n };\n\n const TabComponent = renders[tab] || renders.basic;\n\n return (\n <Main>\n <Typography component=\"h2\" variant=\"h4\" className=\"page-header\" color=\"textPrimary\">\n {t('common.setting')}\n </Typography>\n <>\n <Tabs tabs={tabs} current={tab} onChange={onTabChange} scrollButtons=\"auto\" />\n <div className=\"page-content\">\n <TabComponent node={node} />\n </div>\n </>\n </Main>\n );\n}\n\nconst Main = styled.main`\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .page-content {\n margin-top: 16px;\n }\n`;\n","import { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Alert from '@material-ui/lab/Alert';\nimport useTheme from '@material-ui/core/styles/useTheme';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { formatError } from '../libs/util';\nimport useMobileWidth from '../hooks/mobile-width';\n\nexport default function ConfirmDialog({\n title,\n description,\n showCancel,\n cancel,\n confirm,\n color,\n params: initialParams,\n onCancel,\n onConfirm,\n}) {\n const [params, setParams] = useState(initialParams);\n const [open, setOpen] = useState(true);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t: changeLocale } = useLocaleContext();\n const theme = useTheme();\n\n const onCallback = async cb => {\n if (typeof cb === 'function') {\n setLoading(true);\n try {\n await cb(params);\n setOpen(false);\n } catch (err) {\n setError(formatError(err));\n console.error(err);\n } finally {\n setLoading(false);\n }\n } else {\n setOpen(false);\n }\n };\n\n const t = typeof title === 'function' ? title() : title;\n const d = typeof description === 'function' ? description(params, setParams, setError) : description;\n\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('sm'));\n\n const handleClick = e => {\n e.stopPropagation();\n };\n const { minWidth } = useMobileWidth();\n\n return (\n <StyledDialog onClick={handleClick} fullScreen={isBreakpointsDownSm} open={open} style={{ minWidth }}>\n <DialogTitle>{t}</DialogTitle>\n <DialogContent style={{ minWidth }}>\n <DialogContentText component=\"div\">{d}</DialogContentText>\n {!!error && (\n <Alert severity=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </DialogContent>\n <DialogActions className=\"delete-actions\" style={{ padding: '8px 24px 24px' }}>\n {showCancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onCancel);\n }}\n color=\"default\"\n data-cy=\"cancel-confirm-dialog\"\n rounded\n size=\"small\">\n {cancel || changeLocale('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onConfirm);\n }}\n color={color}\n size=\"small\"\n // eslint-disable-next-line no-underscore-dangle\n disabled={params.__disableConfirm || loading}\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n autoFocus\n rounded>\n {loading && <Spinner size={[16, 10]} />}\n {confirm}\n </Button>\n </DialogActions>\n </StyledDialog>\n );\n}\n\nConfirmDialog.propTypes = {\n title: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n showCancel: PropTypes.bool,\n cancel: PropTypes.string,\n color: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nConfirmDialog.defaultProps = {\n onCancel: () => {},\n showCancel: true,\n cancel: '',\n confirm: 'Confirm',\n color: 'danger',\n params: {},\n};\n\nconst StyledDialog = styled(Dialog)`\n .delete-actions .Mui-disabled {\n color: rgba(0, 0, 0, 0.26) !important;\n box-shadow: none;\n background-color: rgba(0, 0, 0, 0.12) !important;\n }\n`;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport Copy from '@arcblock/ux/lib/ClickToCopy';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nexport default function ClickToCopy({ children, ...rest }) {\n const { t } = useContext(LocaleContext);\n return (\n <Copy tip={t('common.copyTip')} copiedTip={t('common.copiedTip')} {...rest}>\n {children}\n </Copy>\n );\n}\n\nClickToCopy.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","import Add from '@material-ui/icons/Add';\nimport Check from '@material-ui/icons/Check';\nimport Delete from '@material-ui/icons/Delete';\nimport Clear from '@material-ui/icons/Clear';\nimport Export from '@material-ui/icons/SaveAlt';\nimport Edit from '@material-ui/icons/Edit';\nimport Filter from '@material-ui/icons/Filter';\nimport FirstPage from '@material-ui/icons/FirstPage';\nimport LastPage from '@material-ui/icons/LastPage';\nimport NextPage from '@material-ui/icons/ChevronRight';\nimport PreviousPage from '@material-ui/icons/ChevronLeft';\nimport Search from '@material-ui/icons/Search';\nimport SortArrow from '@material-ui/icons/ArrowDropDown';\nimport ThirdStateCheck from '@material-ui/icons/Remove';\nimport ViewColumn from '@material-ui/icons/ViewColumn';\n\nexport default {\n Add,\n Check,\n Delete,\n Edit,\n Clear,\n DetailPanel: NextPage,\n Filter,\n FirstPage,\n LastPage,\n NextPage,\n PreviousPage,\n Search,\n ResetSearch: Clear,\n SortArrow,\n Export,\n ThirdStateCheck,\n ViewColumn,\n};\n","import styled from 'styled-components';\n\nconst TableStyle = styled.div`\n .MuiPaper-root {\n box-shadow: none !important;\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n .MuiToolbar-root {\n background: transparent;\n padding-left: 0;\n display: none;\n }\n\n .MuiTableHead-root th {\n min-width: 100px;\n background: transparent;\n }\n\n .MuiTable-root {\n overflow-y: hidden;\n }\n .MuiTableRow-root {\n border: none !important;\n }\n\n .MuiTableCell-root {\n padding-right: 16px;\n &:last-of-type {\n padding-right: 0;\n }\n }\n`;\n\nexport default TableStyle;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Dot from '../dot';\nimport Tag from '../tag';\nimport { isInProgress } from '../../libs/util';\n\nconst colors = {\n yellow: '#FFCF71',\n grey: '#888888',\n};\n\nexport default function BlockletStatus({ status, variant, ...rest }) {\n const { t } = useContext(LocaleContext);\n\n const map = {\n added: 'primary',\n waiting: 'warning',\n downloading: 'warning',\n downloaded: 'primary',\n installing: 'warning',\n installed: 'primary',\n starting: 'warning',\n running: 'success',\n stopping: 'warning',\n stopped: 'reverse',\n error: 'error',\n upgrading: 'warning',\n restarting: 'warning',\n corrupted: 'error',\n };\n\n const colorMap = {\n added: colors.grey,\n waiting: colors.yellow,\n downloading: colors.yellow,\n downloaded: colors.grey,\n installing: colors.yellow,\n installed: colors.grey,\n starting: colors.yellow,\n running: 'success',\n stopping: colors.yellow,\n stopped: colors.grey,\n error: 'error',\n upgrading: colors.yellow,\n restarting: colors.yellow,\n corrupted: 'error',\n };\n\n const inProgress = isInProgress(status);\n\n const statusTxt = t(`blocklet.status.${status}`);\n\n if (variant === 'dot') {\n return (\n <Tooltip title={t('blocklet.statusTip', { status: t(`blocklet.status.${status}`) })}>\n <Dot color={colorMap[status]} {...rest} />\n </Tooltip>\n );\n }\n\n return (\n <Tag type={map[status]} style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {inProgress && <Spinner size={[12, 6]} color=\"inherit\" style={{ marginRight: 5 }} />}\n {statusTxt}\n </Tag>\n );\n}\n\nBlockletStatus.propTypes = {\n status: PropTypes.string.isRequired,\n variant: PropTypes.oneOf(['dot', 'tag']),\n};\n\nBlockletStatus.defaultProps = {\n variant: 'tag',\n};\n","import styled from 'styled-components';\n\nconst color = {\n success: '#3ab39d',\n error: '#D0021B',\n};\n\nconst defaultSize = '10px';\n\nconst Dot = styled.div`\n display: inline-block;\n width: ${props => props.size || defaultSize};\n height: ${props => props.size || defaultSize};\n background: ${props => color[props.color] || props.color || color.success};\n border-radius: 100%;\n`;\n\nexport default Dot;\n","/* eslint-disable import/prefer-default-export */\nimport { ROUTING_RULE_TYPES, DEFAULT_IP_DNS_DOMAIN_SUFFIX } from '@abtnode/constant';\nimport { BLOCKLET_DYNAMIC_PATH_PREFIX } from '@blocklet/meta/lib/constants';\n\nconst validateRuleByServiceType = (params, localeContext) => {\n if (params.type === ROUTING_RULE_TYPES.REDIRECT) {\n if (!params.url) {\n return new Error(`${localeContext('router.validation.redirectUrlRequired')}`);\n }\n\n if (!params.redirectCode) {\n return new Error(`redirect ${localeContext('router.validation.redirectCodeRequired')}`);\n }\n } else if (params.type === ROUTING_RULE_TYPES.BLOCKLET) {\n if (!params.did) {\n return new Error(localeContext('router.validation.didRequired'));\n }\n }\n\n return null;\n};\n\nexport const validateDomain = (domain, localeContext) => {\n if (!domain) {\n return localeContext('router.domain.validate.emptyTip');\n }\n\n if (domain.endsWith(DEFAULT_IP_DNS_DOMAIN_SUFFIX)) {\n return localeContext('router.domain.validate.suffixTip', { suffix: DEFAULT_IP_DNS_DOMAIN_SUFFIX });\n }\n\n return null;\n};\n\n/**\n * form validator of add site(add domain)\n * @param {Object} params form params\n * @param {Function} localeContext error message\n */\nexport const validateSite = (params, localeContext) => {\n const validateResult = validateRuleByServiceType(params, localeContext);\n if (validateResult) {\n return validateResult;\n }\n\n const errMsg = validateDomain(params.domain, localeContext);\n if (errMsg) {\n return new Error(errMsg);\n }\n\n return null;\n};\n\n/**\n * form validator of add_rule and update_rule\n * @param {Object} params form params\n * @param {Function} localeContext error message\n */\nexport const validateRule = (params, localeContext) => {\n const validateResult = validateRuleByServiceType(params, localeContext);\n if (validateResult) {\n return validateResult;\n }\n\n if (!params.pathPrefix.length) {\n return new Error(localeContext('router.validation.pathPrefixCannotBeEmpty'));\n }\n\n if (params.pathPrefix.length > 150) {\n return new Error(localeContext('router.validation.pathPrefixTooLong', { length: 150 }));\n }\n\n return null;\n};\n\nexport const validatePathPrefix = ({ params, blocklets }) => {\n const blocklet = blocklets.find(item => item.meta.did === params.did);\n if (!blocklet) {\n return '';\n }\n\n const selected = blocklet.meta.interfaces.find(x => x.name === params.interfaceName);\n if (!selected) {\n return '';\n }\n\n if (selected.prefix !== BLOCKLET_DYNAMIC_PATH_PREFIX && params.pathPrefix !== selected.prefix) {\n return `This blocklet can only be mounted on path prefix ${selected.prefix}`;\n }\n\n return '';\n};\n\n/**\n * get initial blocklet did when add rule / update rule / add domain\n * @param {array} blocklets\n */\nexport const getInitialBlockletDid = blocklets => {\n if (blocklets.length === 0) {\n return '';\n }\n const { searchParams } = new URL(window.location.href);\n const fromDid = searchParams.get('fromDid');\n if (fromDid) {\n const blocklet = blocklets.find(x => x.meta.did === fromDid);\n if (blocklet) {\n return blocklet.meta.did;\n }\n }\n return blocklets[0].meta.did;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport OriTag from '@arcblock/ux/lib/Tag';\n\nexport default function Tag({ children, ...rest }) {\n return (\n <OriTag style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {children}\n </OriTag>\n );\n}\n\nTag.propTypes = {\n children: PropTypes.any.isRequired,\n};\n","/* eslint-disable react/no-danger */\n/* eslint-disable react/prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\n\nimport Alert from '@material-ui/lab/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ClickToCopy from './click-to-copy';\n\nimport Confirm from './confirm';\n\nexport default function CancelConfirm({\n title,\n description,\n confirmPlaceholder,\n cancel,\n confirm,\n params: initialParams,\n onCancel,\n onConfirm,\n keyName,\n}) {\n const { t } = useLocaleContext();\n\n const confirmSetting = {\n title: () => (\n <div>\n {title}\n {` (${keyName})`}\n </div>\n ),\n description: (params, setParams) => {\n const setValue = value => {\n // eslint-disable-next-line no-underscore-dangle\n setParams({ ...value, __disableConfirm: value.__disableConfirm });\n };\n\n return (\n <div>\n <Alert severity=\"warning\" style={{ width: '100%' }}>\n {t('common.notice')}\n </Alert>\n <div style={{ marginTop: 24, marginBottom: 24 }} dangerouslySetInnerHTML={{ __html: description }} />\n <div style={{ marginBottom: 24 }}>\n {t('common.click')}\n {':'}\n <ClickToCopy data-cy=\"click-copy\">{keyName}</ClickToCopy>\n </div>\n <Typography component=\"div\">\n <TextField\n label={confirmPlaceholder}\n autoComplete=\"off\"\n data-cy=\"delete-confirm-input\"\n variant=\"outlined\"\n fullWidth\n autoFocus\n value={params.inputVal}\n onChange={e => {\n setValue({ ...params, inputVal: e.target.value, __disableConfirm: keyName !== e.target.value });\n }}\n />\n </Typography>\n </div>\n );\n },\n confirm,\n cancel,\n onConfirm,\n onCancel,\n params: {\n inputVal: '',\n __disableConfirm: true,\n ...initialParams,\n },\n };\n\n return (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n );\n}\n\nCancelConfirm.propTypes = {\n title: PropTypes.any.isRequired,\n keyName: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n confirmPlaceholder: PropTypes.any.isRequired,\n cancel: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nCancelConfirm.defaultProps = {\n onCancel: () => {},\n cancel: '',\n confirm: 'Confirm',\n params: {},\n};\n","/* eslint-disable no-use-before-define */\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nexport default function usePersistentSort(name, initialDirections) {\n const [sortDirections, setSortDirections] = useLocalStorage(`ps_${name}`, initialDirections);\n\n const onSortChange = (columnIndex, directionValue) => {\n const newSortDirections = directionValue ? new Array(initialDirections.length).fill('') : [...initialDirections];\n\n if (columnIndex > -1) {\n newSortDirections[columnIndex] = directionValue;\n }\n\n setSortDirections(newSortDirections);\n };\n\n return {\n sortDirections, // 当前的排序\n onSortChange, // 给外部的回调,可以更新内部的 sort\n };\n}\n","import React, { useContext, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport getClient from '../libs/node';\nimport { useSubscription } from '../libs/ws';\nimport { shouldCheckDomainStatus } from '../libs/util';\n\nconst DomainStatusContext = React.createContext({});\nconst { Provider, Consumer } = DomainStatusContext;\n\nfunction DomainStatusProvider({ children, domains }) {\n const client = getClient();\n const [status, setStatus] = useState({});\n\n useSubscription('domain.status', data => {\n if (data) {\n setStatus(pre => ({ ...pre, [data.domain]: data }));\n }\n });\n\n const getDomainStatus = async () => {\n if (!Array.isArray(domains)) {\n return;\n }\n\n const tempDomains = domains.filter(domain => shouldCheckDomainStatus(domain));\n if (tempDomains.length > 0) {\n client.checkDomains({\n input: { domains },\n });\n }\n };\n\n useEffect(() => {\n getDomainStatus({ silent: true });\n }, [JSON.stringify(domains)]); // eslint-disable-line\n\n const value = {\n refresh: getDomainStatus,\n api: client,\n };\n\n value.status = status;\n\n return <Provider value={{ status: value }}>{children}</Provider>;\n}\n\nDomainStatusProvider.propTypes = {\n children: PropTypes.object.isRequired,\n domains: PropTypes.array.isRequired,\n};\n\nfunction useDomainStatusContext() {\n const { status } = useContext(DomainStatusContext);\n return status;\n}\n\nexport { DomainStatusContext, DomainStatusProvider, Consumer as DomainStatusConsumer, useDomainStatusContext };\n"],"sourceRoot":""}
|