@abtnode/webapp 1.7.12 → 1.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["hooks/mobile-width.js","components/confirm.js","components/click-to-copy.js","components/table-icons.js","components/table.js","contexts/domain-status.js","components/tag.js","components/router/rule/action/utils/index.js","components/blocklet/status.js","components/delete-confirm.js","components/dot.js","components/did-address.js","hooks/url-evaluation.js","components/router/rule/action/config-routing-rule.js","../../mocks/lib/jspdf.js","assets/logo.svg","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/add-cert.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/node/basic-setting.js","components/settings/basic.js","components/webhook/delete.js","components/settings/webhook.js","components/danger-zone.js","components/node/upgrade/confirm.js","components/node/upgrade/check.js","components/node/register.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","components/settings/gateway.js","pages/settings/index.js"],"names":["useMobileWidth","theme","useTheme","minWidth","useMediaQuery","breakpoints","down","values","sm","ConfirmDialog","title","description","showCancel","cancel","confirm","color","initialParams","params","onCancel","onConfirm","useState","setParams","open","setOpen","loading","setLoading","error","setError","changeLocale","useLocaleContext","t","onCallback","cb","a","formatError","console","d","isBreakpointsDownSm","StyledDialog","onClick","e","stopPropagation","fullScreen","style","DialogTitle","DialogContent","DialogContentText","component","Alert","severity","width","marginTop","DialogActions","className","padding","data-cy","size","disabled","__disableConfirm","variant","autoFocus","defaultProps","styled","Dialog","ClickToCopy","children","rest","useContext","LocaleContext","tip","copiedTip","Add","Check","Delete","Edit","Clear","DetailPanel","NextPage","Filter","FirstPage","LastPage","PreviousPage","Search","ResetSearch","SortArrow","Export","ThirdStateCheck","ViewColumn","TableStyle","div","DomainStatusContext","React","createContext","Provider","Consumer","DomainStatusProvider","domainList","domains","client","getClient","domainListStr","JSON","stringify","status","setStatus","useMemo","filter","domain","shouldCheckDomainStatus","useSubscription","EVENTS","DOMAIN_STATUS","data","pre","useDomainsAccessibility","domainsAccessibility","recommendedDomain","domainsStatus","merged","Object","keys","forEach","key","value","getDomainStatus","length","checkDomains","input","useEffect","refresh","updateStatus","api","recommendedDomainStatus","useDomainStatusContext","Wrapped","validateRuleByServiceType","localeContext","type","ROUTING_RULE_TYPES","REDIRECT","url","Error","redirectCode","BLOCKLET","did","validateDomain","endsWith","DEFAULT_IP_DOMAIN_SUFFIX","suffix","validateSite","validateResult","errMsg","validateRule","pathPrefix","validatePathPrefix","blocklets","curBlocklet","blocklet","exist","find","x","mountPoint","meta","group","item","selected","interfaces","prefix","BLOCKLET_DYNAMIC_PATH_PREFIX","getInitialBlockletDid","fromDid","URL","window","location","href","searchParams","get","colors","BlockletStatus","source","colorMap","added","waiting","downloading","downloaded","installing","installed","starting","running","stopping","stopped","upgrading","restarting","corrupted","deleting","inProgress","isInProgress","statusTxt","marginRight","CancelConfirm","confirmPlaceholder","keyName","confirmSetting","marginBottom","dangerouslySetInnerHTML","__html","label","autoComplete","fullWidth","inputVal","onChange","target","success","Dot","props","WrappedDidAddress","link","avatarProps","prepend","display","mr","to","CACHE","useUrlEvaluation","urls","disableCache","urlsState","setUrlsState","recommendedUrlState","evaluateURLs","checkAccessible","results","map","sort","b","score","evaluate","recommendedUrl","useBlockletUrlEvaluation","siteMap","useRoutingContext","locale","getBlockletUrls","getBlockletUrlParams","joinURL","getAccessUrl","origin","WELLKNOWN_PING_PREFIX","urlDomainMapping","reduce","acc","cur","i","ConfigRoutingRule","serviceTypes","redirectCodesMap","302","301","sortedBlocklets","sortBy","name","getParamsOnBlockletChange","webInterface","BLOCKLET_INTERFACE_TYPE_WEB","getWebInterface","port","ports","internal","getParamsFromInterface","interfaceName","select","SelectProps","version","marginLeft","code","helperText","trim","NONE","module","exports","Certificate","certificate","anchorEl","setAnchorEl","node","useNodeContext","handlePopoverClose","Boolean","aria-owns","undefined","onMouseEnter","event","currentTarget","onMouseLeave","fontSize","cursor","id","pointerEvents","anchorOrigin","vertical","horizontal","transformOrigin","onClose","disableRestoreFocus","src","alt","maxHeight","maxWidth","fontWeight","formatToDate","validFrom","validTo","DomainStatus","filters","domainIcon","httpsIcon","isHttps","matchedCert","checkIsWildcardDomain","dns","resolved","ip","items","propTypes","PropTypes","string","isRequired","array","AddDomainAlias","onActivate","actions","setConfirmSetting","DOMAIN_FOR_DEFAULT_SITE","addDomainAlias","force","onEnter","setting","inputProps","onKeyPress","preventDefault","control","checked","onMenuItemClick","AddRule","onRuleAdded","err","rule","from","addRule","disable","UpdateDomainSecurity","corsAllowedOrigins","isSpecialDomain","text","BLOCKLET_SITE_GROUP_SUFFIX","updateSite","split","Array","isArray","join","onAdd","issuing","setIssuing","certState","useAsyncRetry","findCertificateByDomain","cert","handleIssueComplete","includes","CERT_ERROR","CERT_ISSUED","retry","issueLetsEncryptCert","AddCert","DeleteDomainAlias","onDelete","hostname","deleteDomainAlias","edge","UpdateRule","parent","updateRule","replace","DeleteRule","siteId","deleteRule","withStyles","root","height","margin","spacing","switchBase","transform","palette","common","white","backgroundColor","opacity","border","thumb","track","borderRadius","grey","transition","transitions","create","focusVisible","classes","Switch","focusVisibleClassName","disableRipple","RouterPrompt","confirmPrompt","setConfirmPrompt","onPromptDialogCancel","onPromptDialogConfirm","env","apiPrefix","history","push","pathname","substring","reload","Div","message","args","settings","Form","Container","initDefaultValues","info","registerUrl","webWalletUrl","diskAlertThreshold","BasicSetting","onSaved","submit","useForm","defaultValues","register","handleSubmit","errors","formState","reset","warning","setWarning","autoUpgrade","setAutoUpgrade","enableWelcomePage","setEnableWelcomePage","setCurrent","w","isDirty","onSubmit","updateNodeInfo","result","sleep","noValidate","Typography","permission","hasPermission","TextField","placeholder","inputRef","validate","onFocus","min","max","FormControlLabel","BasicSettings","setMessage","silent","content","Box","mb","DeleteAccessKey","deleteWebHook","HookSetting","enqueueSnackbar","useSnackbar","buttonAnchorRef","useRef","defaultConfig","setDefaultConfig","state","Promise","all","getWebHooks","getWebhookSenders","webhooks","senders","list","createWebHook","autoHideDuration","onSetWebHook","inputList","Main","index","defaultValue","required","trimValue","checkInputByType","some","webhookIcon","onSendTestNotification","rowInfo","webhookId","sendTestMessage","columns","render","desc","alignItems","whiteSpace","formatToDatetime","Number","createdAt","align","SendIconInfo","textAlign","ref","preOpen","Popper","current","disablePortal","placement","zIndex","Paper","ClickAwayListener","onClickAway","contains","ListItemText","primary","secondary","icons","tableIcons","options","sorting","emptyRowsWhenPaging","actionsColumnIndex","tableLayout","maxBodyHeight","pageSize","localization","body","emptyDataSourceMessage","SendIcon","DangerItem","gutterBottom","DangerZone","ConfirmUpgrade","nextVersion","upgradeNodeVersion","UpgradeCheck","onDone","onCheck","checkNodeVersion","IconButton","aria-label","RegisterNode","launchWindow","endpoint","getEndPoint","registerInfo","setRegisterInfo","inSafari","isSafari","localStorage","getItem","nodeInfo","isAdded","buttonText","buttonDisabled","f","addEventListener","action","Toast","removeEventListener","registerBtn","encodeURIComponent","contentWindow","postMessage","onLoad","About","useHistory","extra","getNodeEnv","res","assign","rows","nodeOwner","routing","provider","os","docker","gitpod","blockletEngines","visible","available","displayName","can","Logo","ml","valueComponent","nameWidth","mt","AddDomain","bInterface","rules","addSite","setValue","MenuItem","DeleteDomain","deleteSite","UpdateDomain","RuleItemAction","isProtected","mouseDown","onMouseDown","rounded","Menu","keepMounted","getContentAnchorEl","RedirectRule","toUrl","scheme","tmpToUrl","isUrl","NoneRule","RuleItem","useBlockletContext","getDisplayName","depth","initialExpand","expand","domainAliases","setExpand","IconComponent","NodeIcon","DomainIcon","RuleIcon","DomainLink","primaryDomain","DASHBOARD","adminPath","DomainElement","rel","ItemDiv","button","disableGutters","ListItemIcon","flex","ListItemSecondaryAction","Collapse","in","List","disablePadding","internalLink","DAEMON","dashboard","isHealthy","healthyTip","domainStatus","divider","paddingBottom","paddingLeft","wordBreak","Tooltip","ListItem","RouterPage","sites","allDomains","y","main","md","lg","readFile","file","resolve","reject","reader","FileReader","readAsText","onload","onerror","UpdateNginxCert","onRefresh","mode","restProps","keyFile","setKeyFile","pemFile","setPemFile","certSource","setCertSource","useWatch","submitUpload","pem","addCertificate","privateKey","updateCertificate","certSources","upload","lets_encrypt","onDropRejected","files","useDropzone","accept","multiple","maxSize","onDrop","acceptedFiles","getPemRootProps","getRootProps","getPemInputProps","getInputProps","getKeyRootProps","getKeyInputProps","RadioGroup","Radio","DeleteCert","refreshRoutingContext","deleteCertificate","DetailCert","certBasicRows","matchedSites","s","updatedAt","certInfoRows","moment","duration","humanize","aria-labelledby","showCloseButton","row","Divider","MatchedSites","showMore","setShowMore","listStyle","slice","isExpired","expiresTime","Date","ExpiresCell","time","Math","ceil","TableCellInfoRow","icon","TableCellContainer","Status","filterCerts","certificates","blockletUrls","isCertificateMatch","CertificateManager","blockletDID","useQuery","getCertificates","getBlocklet","filtered","nowrap","noWrap","Set","search","pageSizeOptions","headerStyle","LimitRateSlider","boxShadow","valueLabel","left","rail","Slider","Gateway","limit","requestLimit","enabled","rate","GATEWAY_REQ_LIMIT","ipHeader","watch","reqLimitEnabled","reqLimitRate","updateGateway","_","newValue","valueLabelDisplay","step","FormHelperText","Settings","NodeContext","useParams","tab","tabs","renders","basic","integration","WebHookSetting","about","router","RouterSettings","gateway","CertSetting","TabComponent","newTab","scrollButtons"],"mappings":"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","file":"static/js/18.ad3de96d.chunk.js","sourcesContent":["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 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 {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 &.show-pagination {\n .MuiTablePagination-toolbar {\n display: flex;\n }\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, useState, useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { EVENTS } from '@abtnode/constant';\nimport getClient from '../libs/node';\nimport { useSubscription } from '../libs/ws';\nimport { shouldCheckDomainStatus } from '../libs/util';\nimport { useDomainsAccessibility } from '../hooks/url-evaluation';\n\nconst DomainStatusContext = React.createContext({});\nconst { Provider, Consumer } = DomainStatusContext;\n\nfunction DomainStatusProvider({ children, domains: domainList }) {\n const client = getClient();\n const domainListStr = JSON.stringify(domainList);\n const [status, setStatus] = useState({});\n const domains = useMemo(() => domainList.filter(domain => shouldCheckDomainStatus(domain)), [domainListStr]); // eslint-disable-line\n\n useSubscription(EVENTS.DOMAIN_STATUS, data => {\n if (data) {\n setStatus(pre => ({ ...pre, [data.domain]: { ...pre[data.domain], ...data } }));\n }\n });\n\n const { domainsAccessibility, recommendedDomain } = useDomainsAccessibility(domains);\n // 合并 domain 自身的状态 + 可访问性状态\n const domainsStatus = useMemo(() => {\n const merged = { ...status };\n Object.keys(domainsAccessibility).forEach(key => {\n const value = merged[key] || {};\n merged[key] = { ...value, ...domainsAccessibility[key] };\n });\n return merged;\n }, [status, domainsAccessibility]);\n\n const getDomainStatus = async () => {\n if (domains.length > 0) {\n client.checkDomains({\n input: { domains },\n });\n }\n };\n\n const updateStatus = domain => {\n if (domain) {\n client.checkDomains({\n input: { domains: [domain] },\n });\n }\n };\n\n useEffect(() => {\n getDomainStatus();\n }, [domains]); // eslint-disable-line\n\n const value = {\n refresh: getDomainStatus,\n updateStatus,\n api: client,\n status: domainsStatus,\n recommendedDomain,\n recommendedDomainStatus: domainsStatus[recommendedDomain],\n };\n\n return <Provider value={value}>{children}</Provider>;\n}\n\nDomainStatusProvider.propTypes = {\n children: PropTypes.any.isRequired,\n domains: PropTypes.array.isRequired,\n};\n\nfunction useDomainStatusContext() {\n const { status, recommendedDomainStatus, updateStatus } = useContext(DomainStatusContext);\n return { status, recommendedDomainStatus, updateStatus };\n}\n\nexport { DomainStatusContext, DomainStatusProvider, Consumer as DomainStatusConsumer, useDomainStatusContext };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nexport default function Wrapped({ children, style, ...rest }) {\n return (\n <Tag style={style} {...rest}>\n {children}\n </Tag>\n );\n}\n\nWrapped.propTypes = {\n children: PropTypes.any.isRequired,\n style: PropTypes.object,\n};\n\nWrapped.defaultProps = {\n style: {},\n};\n","/* eslint-disable import/prefer-default-export */\nimport { ROUTING_RULE_TYPES, DEFAULT_IP_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_DOMAIN_SUFFIX)) {\n return localeContext('router.domain.validate.suffixTip', { suffix: DEFAULT_IP_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, blocklet: curBlocklet }) => {\n // validate children\n if (curBlocklet) {\n let exist = (curBlocklet.children || []).find(x => x.mountPoint === params.pathPrefix);\n if (curBlocklet.meta.group !== 'gateway' && params.pathPrefix === '/') {\n exist = '/';\n }\n\n if (exist) {\n return `The mount point ${params.pathPrefix} already exist, please use another mount point`;\n }\n }\n\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.type === 'web');\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, { 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, source, ...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 deleting: 'warning',\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 deleting: colors.yellow,\n };\n\n const inProgress = isInProgress(status);\n\n const statusTxt = t(`blocklet.status.${source === 'custom' && status === 'installed' ? 'created' : status}`);\n\n if (variant === 'dot') {\n return (\n <Tooltip title={t('blocklet.statusTip', { status: statusTxt })}>\n <Dot color={colorMap[status]} {...rest} />\n </Tooltip>\n );\n }\n\n return (\n <Tag type={map[status]} {...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 source: PropTypes.string,\n};\n\nBlockletStatus.defaultProps = {\n variant: 'tag',\n source: '',\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","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","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Box from '@material-ui/core/Box';\nimport { Link } from 'react-router-dom';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport DidAvatar from '@arcblock/did-connect/lib/Avatar';\n\nfunction WrappedDidAddress({ did, link, avatarProps, ...rest }) {\n return (\n <DidAddress\n prepend={\n <Box display=\"flex\" mr={1}>\n <DidAvatar did={did} size={18} {...avatarProps} />\n </Box>\n }\n {...rest}>\n {link ? <Link to={link}>{did}</Link> : did}\n </DidAddress>\n );\n}\n\nWrappedDidAddress.propTypes = {\n did: PropTypes.string.isRequired,\n link: PropTypes.string,\n avatarProps: PropTypes.object,\n};\n\nWrappedDidAddress.defaultProps = {\n link: '',\n avatarProps: {},\n};\n\nexport default WrappedDidAddress;\n","import { useState, useEffect, useMemo, useContext } from 'react';\n// import useAsync from 'react-use/lib/useAsync';\nimport joinURL from 'url-join';\nimport { WELLKNOWN_PING_PREFIX } from '@abtnode/constant';\nimport { getAccessUrl } from '@abtnode/ux/src/util';\nimport { evaluateURLs } from '@abtnode/util/lib/url-evaluation';\nimport checkAccessible from '@abtnode/util/lib/url-evaluation/check-accessible-browser';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, getBlockletUrls } from '../contexts/routing';\nimport { getBlockletUrlParams } from '../libs/util';\n\nconst CACHE = {};\n\nexport function useUrlEvaluation(urls, disableCache = false) {\n const [urlsState, setUrlsState] = useState([]);\n const [loading, setLoading] = useState(true);\n const recommendedUrlState = useMemo(() => {\n if (!loading && urlsState.length) {\n return urlsState[0];\n }\n return null;\n }, [urlsState, loading]);\n\n useEffect(() => {\n if (urls?.length > 0) {\n const evaluate = async () => {\n let results;\n setLoading(true);\n if (disableCache) {\n results = await evaluateURLs(urls, { checkAccessible });\n results.forEach(item => {\n CACHE[item.url] = item;\n });\n } else {\n const misses = await evaluateURLs(\n urls.filter(url => !CACHE[url]),\n { checkAccessible }\n );\n misses.forEach(item => {\n CACHE[item.url] = item;\n });\n results = urls.map(url => CACHE[url]).sort((a, b) => b.score - a.score);\n }\n setUrlsState(results);\n setLoading(false);\n };\n evaluate();\n }\n }, [urls, disableCache]);\n\n return {\n urlsState,\n loading,\n recommendedUrlState,\n recommendedUrl: recommendedUrlState?.url,\n };\n}\n\n/**\n * 主要对 blocklet 访问 urls 进行评估\n * @param {object} blocklet\n */\nexport function useBlockletUrlEvaluation(blocklet) {\n const { siteMap } = useRoutingContext();\n const { locale } = useContext(LocaleContext);\n const urls = useMemo(\n () => getBlockletUrls({ did: blocklet.meta.did, siteMap, params: getBlockletUrlParams(blocklet, locale) }),\n [blocklet, locale, siteMap]\n );\n const { loading, recommendedUrlState, recommendedUrl } = useUrlEvaluation(urls);\n return { urls, loading, recommendedUrlState, recommendedUrl };\n}\n\n/**\n * 主要对 blocklet domains 对应的 urls 进行评估, 配合 DomainStatusProvider 使用\n * @param {string[]} domains\n */\nexport function useDomainsAccessibility(domains) {\n // domain 对应的访问 url\n const urls = useMemo(\n () => domains.map(item => joinURL(new URL(getAccessUrl(item)).origin, WELLKNOWN_PING_PREFIX)),\n [domains]\n );\n // url -> domain mapping\n const urlDomainMapping = useMemo(\n () => domains.reduce((acc, cur, i) => ({ ...acc, [urls[i]]: cur }), {}),\n [domains, urls]\n );\n const { urlsState, loading, recommendedUrl } = useUrlEvaluation(urls);\n // domain <=> url state\n const result = useMemo(() => {\n if (loading) {\n return {\n domainsAccessibility: domains.reduce((acc, cur) => ({ ...acc, [cur]: { loading: true } }), {}),\n recommendedDomain: null,\n };\n }\n const domainsAccessibility = urlsState.reduce((acc, cur) => {\n const domain = urlDomainMapping[cur.url];\n acc[domain] = { ...cur, domain };\n return acc;\n }, {});\n return {\n domainsAccessibility,\n recommendedDomain: urlDomainMapping[recommendedUrl],\n };\n }, [domains, urlDomainMapping, urlsState, loading, recommendedUrl]);\n return result;\n}\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","module.exports = {};\n","module.exports = __webpack_public_path__ + \"static/media/logo.3f75f557.svg\";","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: 'bold' }}>\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 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';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\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(), !!params.force);\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: 8 }}\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 <FormControlLabel\n control={\n <Checkbox\n checked={params.force}\n onChange={e => {\n setParams({ ...params, force: e.target.checked });\n }}\n name=\"checkedB\"\n color=\"primary\"\n />\n }\n label={t('router.domainAlias.add.forceTip')}\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 setError(null);\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, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport CircularProgress from '@material-ui/core/CircularProgress';\n\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { EVENTS } from '@abtnode/constant';\n\nimport Confirm from '../../../confirm';\nimport { useNodeContext } from '../../../../contexts/node';\nimport getClient from '../../../../libs/node';\nimport { useSubscription } from '../../../../libs/ws';\nimport { useDomainStatusContext } from '../../../../contexts/domain-status';\nimport { shouldCheckDomainStatus } from '../../../../libs/util';\n\nconst isCertInProgress = status => ['waiting', 'creating', 'renewaling'].includes(status);\n\nfunction Add(props) {\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { domain, onAdd, children } = props;\n const { api } = useNodeContext();\n const [issuing, setIssuing] = useState(false);\n const { updateStatus } = useDomainStatusContext();\n const client = getClient();\n\n const certState = useAsyncRetry(async () => {\n const { cert } = await client.findCertificateByDomain({ input: { domain } });\n return cert;\n });\n\n const handleIssueComplete = cert => {\n if (cert.domain === domain) {\n setIssuing(false);\n }\n };\n\n useEffect(() => {\n if (!certState.loading && isCertInProgress(certState.value?.status)) {\n setIssuing(true);\n }\n }, [certState]);\n\n useSubscription(EVENTS.CERT_ERROR, handleIssueComplete);\n useSubscription(EVENTS.CERT_ISSUED, cert => {\n certState.retry();\n updateStatus(cert.domain);\n\n handleIssueComplete(cert);\n });\n\n if (certState.loading) {\n return ''; // 如果正在加载证书的状态,则不渲染任何元素\n }\n\n if (certState.value?.status === 'normal') {\n return ''; // 如果证书已经生成,则不渲染任何元素\n }\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n try {\n await api.issueLetsEncryptCert({ input: { domain } });\n onAdd();\n setIssuing(true);\n } catch (error) {\n console.error(error);\n setIssuing(false);\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: t('router.cert.genLetsEncryptCert.title'),\n description: (\n <div>\n <Alert type=\"success\">{t('router.cert.genLetsEncryptCert.dnsTip')}</Alert>\n {t('router.cert.genLetsEncryptCert.description')}\n </div>\n ),\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 {issuing ? (\n <Tooltip title={t('router.cert.issuing')}>\n <CircularProgress size={12} />\n </Tooltip>\n ) : (\n children({ loading, open: onClick })\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 );\n}\n\nAdd.propTypes = {\n domain: PropTypes.string.isRequired,\n onAdd: PropTypes.func,\n children: PropTypes.any,\n};\n\nAdd.defaultProps = {\n onAdd: () => {},\n children: null,\n};\n\nexport default function AddCert(props) {\n const { status: domainsStatus } = useDomainStatusContext();\n\n const { domain } = props;\n if (!shouldCheckDomainStatus(domain) || domainsStatus[domain]?.isHttps) {\n return '';\n }\n\n return <Add {...props} />;\n}\n\nAddCert.propTypes = {\n domain: PropTypes.string.isRequired,\n onAdd: PropTypes.func,\n children: PropTypes.any,\n};\n\nAddCert.defaultProps = {\n onAdd: () => {},\n children: null,\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, domain, onDelete, children } = props;\n const { actions } = useRoutingContext();\n\n if (domain === window.location.hostname) {\n return '';\n }\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, domain);\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 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 domain: 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","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nexport default function Form({ children, ...props }) {\n return (\n <Container>\n <form {...props}>{children}</form>\n </Container>\n );\n}\n\nForm.propTypes = {\n children: PropTypes.any.isRequired,\n};\n\nconst Container = styled.div`\n width: 100%;\n\n form {\n width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n\n .form-submit {\n margin-top: 32px;\n margin-right: 32px;\n width: 180px;\n }\n\n .form-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-item {\n margin-top: 16px;\n margin-right: 0;\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';\nimport Form from './form';\n\nconst initDefaultValues = info => ({\n name: info.name,\n description: info.description,\n registerUrl: info.registerUrl,\n webWalletUrl: info.webWalletUrl,\n diskAlertThreshold: info.diskAlertThreshold,\n});\n\nexport default function BasicSetting({ 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 registerUrl: data.registerUrl.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 {...rest}>\n <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.registerUrl')}\n placeholder={t('setting.form.registerUrlPlaceholder')}\n disabled={loading || !hasPermission}\n error={errors.registerUrl && !!errors.registerUrl.message}\n inputRef={register({})}\n inputProps={{ name: 'registerUrl', onFocus: () => setCurrent('registerUrl') }}\n helperText={errors.registerUrl ? errors.registerUrl.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=\"form-actions\">\n <Permission permission=\"mutate_node\">\n <Button\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\nBasicSetting.propTypes = {\n onSaved: PropTypes.func.isRequired,\n disabled: PropTypes.bool,\n title: PropTypes.string.isRequired,\n submit: PropTypes.string.isRequired,\n};\n\nBasicSetting.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 .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","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 BasicSetting from '../node/basic-setting';\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 <BasicSetting 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 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 edge=\"end\" onClick={() => setConfirmSetting(setting)} size=\"small\" className=\"rule-action\" 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 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 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\" 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, { useRef, useEffect, useState, useMemo } from 'react';\n// import { Link } from 'react-router-dom';\n\nimport styled from 'styled-components';\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Toast from '@abtnode/ux/lib/toast';\n\nimport { DangerZone, DangerItem } from '../danger-zone';\nimport { useNodeContext } from '../../contexts/node';\nimport { getEndPoint, isSafari } from '../../libs/util';\n\nexport default function RegisterNode() {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const launchWindow = useRef(null);\n const endpoint = getEndPoint(info);\n const [loading, setLoading] = useState(true);\n const [registerInfo, setRegisterInfo] = useState({});\n const { createdAt, did, description, name } = info;\n let { registerUrl } = info;\n\n const inSafari = isSafari();\n\n if (localStorage.getItem('__registerUrl')) {\n registerUrl = localStorage.getItem('__registerUrl');\n }\n\n const nodeInfo = {\n did,\n name,\n createdAt,\n description,\n url: endpoint,\n };\n\n const isAdded = useMemo(() => {\n return registerInfo.type !== 'notAdded';\n }, [registerInfo]);\n\n const buttonText = useMemo(() => {\n if (loading) return t('setting.form.register.detecting');\n if (registerInfo.type === 'update') return t('setting.form.register.update');\n if (isAdded) return t('setting.form.register.added');\n return t('setting.form.register.btn');\n }, [loading, registerInfo]); // eslint-disable-line\n\n const buttonDisabled = useMemo(() => {\n if (registerInfo.type === 'update') return false;\n if (isAdded) return true;\n return false;\n }, [registerInfo]); // eslint-disable-line\n\n const sendRegister = () => {\n launchWindow.current.contentWindow.postMessage({ ...nodeInfo, action: 'registerNode' }, '*');\n };\n const sendQuery = () => {\n launchWindow.current.contentWindow.postMessage({ ...nodeInfo, action: 'queryRegisterInfo' }, '*');\n };\n const onLoad = () => {\n setLoading(false);\n sendQuery();\n };\n\n useEffect(() => {\n let f;\n window.addEventListener(\n 'message',\n (f = event => {\n const { data } = event;\n if (data?.action === 'registerNode') {\n setRegisterInfo(data);\n if (data.type === 'addSucceed') {\n Toast.success(t('setting.form.register.addSucceed'));\n }\n if (data.type === 'updateSucceed') {\n Toast.success(t('setting.form.register.updateSucceed'));\n }\n }\n })\n );\n return () => {\n window.removeEventListener('message', f);\n };\n }, []); // eslint-disable-line\n\n const registerBtn = inSafari ? (\n <Button\n color=\"primary\"\n component=\"a\"\n href={`${registerUrl}?register-server=${encodeURIComponent(JSON.stringify(nodeInfo))}`}\n target=\"_blank\"\n variant=\"contained\"\n size=\"large\">\n {t('setting.form.register.btn')}\n </Button>\n ) : (\n <Button\n disabled={buttonDisabled}\n loading={loading}\n onClick={sendRegister}\n color=\"primary\"\n variant=\"contained\"\n size=\"large\">\n {buttonText}\n </Button>\n );\n\n return (\n <Div>\n <DangerZone className=\"danger-zone\">\n <DangerItem\n title={isAdded ? t('setting.form.register.titleAdded') : t('setting.form.register.title')}\n description={\n isAdded\n ? t('setting.form.register.descriptionOnAdded', { url: registerUrl })\n : t('setting.form.register.description', { url: registerUrl })\n }>\n {registerBtn}\n </DangerItem>\n </DangerZone>\n {!inSafari && (\n <iframe ref={launchWindow} src={registerUrl} title=\"register\" style={{ display: 'none' }} onLoad={onLoad} />\n )}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\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 { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport Logo from '../../assets/logo.svg';\n\nimport DidAddress from '../did-address';\nimport { useNodeContext } from '../../contexts/node';\nimport UpgradeConfirm from '../node/upgrade/confirm';\nimport UpgradeCheck from '../node/upgrade/check';\nimport RegisterNode from '../node/register';\nimport Permission from '../permission';\n\nexport default function About() {\n const history = useHistory();\n const { api, info } = 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 { name: t('dashboard.nodeDid'), value: <DidAddress did={info.did} /> },\n info.nodeOwner ? { name: t('dashboard.ownerDid'), value: <DidAddress did={info.nodeOwner.did} /> } : null,\n { name: t('dashboard.routingEngine'), value: info.routing.provider }\n );\n\n if (extra.value) {\n rows.push(\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 );\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 <Container>\n <Permission permission=\"mutate_node\">\n {can => (\n <>\n <Box display=\"flex\" alignItems=\"center\" style={{ marginBottom: 24 }}>\n <Box width={50} height={50}>\n <img src={Logo} height={50} alt=\"\" />\n </Box>\n <Box ml={2}>\n <h2 style={{ margin: 0 }}>{info.name}</h2>\n <p style={{ margin: 0, color: '#888' }}>{info.description}</p>\n </Box>\n </Box>\n\n <InfoRow\n style={{ marginBottom: 4 }}\n valueComponent=\"div\"\n key=\"version\"\n nameWidth={150}\n name={t('common.version')}>\n {info.version}\n {can && <UpgradeCheck />}\n </InfoRow>\n\n {rows.filter(Boolean).map(x => (\n <InfoRow valueComponent=\"div\" key={x.name} nameWidth={150} name={x.name}>\n {x.value}\n </InfoRow>\n ))}\n\n {can && (\n <div style={{ maxWidth: 720 }}>\n <UpgradeConfirm />\n </div>\n )}\n </>\n )}\n </Permission>\n <Permission permission=\"mutate_blocklet\">\n {!!info.registerUrl && (\n <div style={{ maxWidth: 720 }}>\n <RegisterNode />\n </div>\n )}\n </Permission>\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 </Container>\n );\n}\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 32px;\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 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 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 Box from '@material-ui/core/Box';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport { ROUTING_RULE_TYPES } from '@abtnode/constant';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getAccessUrl } from '@abtnode/ux/src/util';\nimport { DASHBOARD, DOMAIN_FOR_DEFAULT_SITE } from '../../../contexts/routing';\nimport { useBlockletContext } from '../../../contexts/blocklets';\nimport { useNodeContext } from '../../../contexts/node';\nimport { useDomainStatusContext } from '../../../contexts/domain-status';\n\nimport RuleItemAction from './action';\nimport DomainStatus from './domain-status';\nimport BlockletStatus from '../../blocklet/status';\nimport Permission from '../../permission';\nimport AddCert from './action/add-cert';\nimport DeleteDomainAlias from './action/delete-domain-alias';\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: getDisplayName(x, true),\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 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 <>\n <DomainStatus key={name} type={type} name={name} />\n <span style={{ marginLeft: 12 }} />\n <AddCert domain={name}>\n {({ open }) => (\n <Button size=\"small\" onClick={e => open(e)}>\n {t('router.cert.genLetsEncryptCert.title')}\n </Button>\n )}\n </AddCert>\n </>\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 <span style={{ marginLeft: 12 }} />\n <DomainStatus key={`domain-status-${name}`} type={type} name={domain} />\n <AddCert domain={domain}>\n {({ open }) => (\n <Button size=\"small\" onClick={e => open(e)}>\n {t('router.cert.genLetsEncryptCert.title')}\n </Button>\n )}\n </AddCert>\n <DeleteDomainAlias key=\"delete-domain-alias\" id={props.id} domain={domain} />\n {domain !== DASHBOARD && domain !== window.location.hostname && (\n <RuleItemAction\n key={`action-${name}`}\n {...props}\n domain={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 <Box className=\"arrow-name-middle\">\n <ExternalLink href={getAccessUrl(parent.name, pathPrefix)} target=\"_blank\">\n {t('common.open')}\n </ExternalLink>\n </Box>\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 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 { Controller, useForm, useWatch } 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 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 { handleSubmit, errors, control } = useForm({\n defaultValues: {\n name: certificate.name || certificate.domain,\n },\n });\n\n const name = useWatch({ control, name: 'name' });\n const domain = useWatch({ control, name: 'domain' });\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 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.addCertificate({\n input: {\n name: data.name.trim(),\n certificate: pem.split('\\n').join('|'),\n privateKey: key.split('\\n').join('|'),\n },\n });\n } else {\n await api.updateCertificate({\n input: {\n id: certificate.id,\n name: data.name.trim(),\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 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 <Button edge=\"end\" onClick={handleAdd} className=\"rule-action\" color=\"primary\" data-cy=\"add-cert\" {...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\" 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 {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' && (\n <>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('router.cert.name')}</div>\n <Controller\n name=\"name\"\n control={control}\n rules={{\n validate: value =>\n !!value.trim() || t('common.requiredErrorText', { name: t('router.cert.name') }),\n }}\n render={({ value, onChange }) => (\n <TextField\n fullWidth\n autoFocus\n defaultValue={value}\n onChange={onChange}\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 />\n )}\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 {certSource === 'lets_encrypt' && (\n <>\n <section className=\"form-item\">\n <Alert type=\"success\">{t('router.cert.genLetsEncryptCert.dnsTip')}</Alert>\n </section>\n <section className=\"form-item\">\n <div className=\"form-item-label\">{t('common.domain')}</div>\n <Controller\n name=\"domain\"\n control={control}\n rules={{\n validate: value =>\n !!value.trim() || t('common.requiredErrorText', { name: t('common.domain') }),\n }}\n render={({ value, onChange }) => (\n <TextField\n fullWidth\n autoFocus\n defaultValue={value}\n error={!!errors.domain}\n autoComplete=\"off\"\n variant=\"outlined\"\n className=\"form-item-value\"\n helperText={errors.domain && errors.domain.message}\n onChange={onChange}\n />\n )}\n />\n </section>\n </>\n )}\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 useTheme from '@material-ui/core/styles/useTheme';\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 theme = useTheme();\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.deleteCertificate({ 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 data-cy=\"action-delete-cert\"\n style={{ color: theme.palette.error.main }}\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 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', margin: '4px 0' }}>\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';\n\nimport { LocaleContext, useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport MaterialTable from 'material-table';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport InfoIcon from '@material-ui/icons/InfoOutlined';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\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 { formatError, formatToDate, isCertificateMatch } 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\n// 过滤 blocklet 对应的 certificates (#3898)\nconst filterCerts = (certificates, blocklet) => {\n if (!blocklet) {\n return certificates;\n }\n const blockletUrls = blocklet.interfaces.map(item => item.url);\n return certificates.filter(certificate => isCertificateMatch(blockletUrls, certificate.matchedSites));\n};\n\nexport default function CertificateManager() {\n const { t } = useContext(LocaleContext);\n const client = getClient();\n const { api } = useNodeContext();\n const query = useQuery();\n const blockletDID = query.get('did');\n\n const state = useAsyncRetry(async () => {\n // eslint-disable-next-line no-shadow\n const { certificates } = await client.getCertificates();\n let blocklet = null;\n if (blockletDID) {\n const { blocklet: b } = await api.getBlocklet({ input: { did: blockletDID } });\n blocklet = b;\n }\n const filtered = filterCerts(certificates, blocklet);\n return { certificates: filtered };\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={\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\n component=\"li\"\n key={s}\n title={s}\n style={{ fontSize: '1.1rem', minWidth: 200, whiteSpace: 'initial', wordBreak: 'break-all' }}>\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 => (\n <MatchedSites\n id={row.id}\n certificate={row}\n style={{ minWidth: 200, whiteSpace: 'initial', wordBreak: 'break-all' }}\n />\n ),\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.error) {\n return <Alert type=\"error\">{formatError(state.error)}</Alert>;\n }\n\n if (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","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { useForm, Controller } from 'react-hook-form';\n\nimport Toast from '@abtnode/ux/lib/toast';\nimport { GATEWAY_REQ_LIMIT } from '@abtnode/constant';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Slider from '@material-ui/core/Slider';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport SwitchControl from '../switch-control';\nimport Permission from '../permission';\n\nimport { useNodeContext } from '../../contexts/node';\n\nimport getClient from '../../libs/node';\nimport { formatError, sleep } from '../../libs/util';\nimport Form from '../node/form';\n\nconst LimitRateSlider = withStyles(theme => {\n return {\n root: {\n color: theme.palette.primary.main,\n height: 8,\n },\n thumb: {\n height: 24,\n width: 24,\n backgroundColor: '#fff',\n border: '2px solid currentColor',\n marginTop: -8,\n '&:focus, &:hover, &$active': {\n boxShadow: 'inherit',\n },\n },\n valueLabel: {\n left: 'calc(-50% + 4px)',\n },\n track: {\n height: 8,\n borderRadius: 4,\n },\n rail: {\n height: 8,\n borderRadius: 4,\n },\n };\n})(Slider);\n\nexport default function Gateway() {\n const {\n info: { routing },\n } = useNodeContext();\n const { t } = useLocaleContext();\n const [loading, setLoading] = useState(false);\n\n const limit = routing.requestLimit || {};\n if (typeof limit.enabled !== 'boolean') {\n limit.enabled = false;\n }\n\n if (typeof limit.rate !== 'number') {\n limit.rate = GATEWAY_REQ_LIMIT.min;\n }\n\n if (!limit.ipHeader) {\n limit.ipHeader = '';\n }\n\n const { handleSubmit, control, watch } = useForm({\n defaultValues: {\n requestLimit: limit,\n },\n });\n\n const reqLimitEnabled = watch('requestLimit.enabled');\n const reqLimitRate = watch('requestLimit.rate');\n\n const onSubmit = async data => {\n try {\n setLoading(true);\n await getClient().updateGateway({ input: data });\n await sleep(1000);\n Toast.success(t('common.saveSuccess'));\n } catch (err) {\n Toast.error(formatError(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Div>\n <Form className=\"form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n <Controller\n name=\"requestLimit.enabled\"\n control={control}\n render={({ value, onChange }) => (\n <FormControlLabel\n className=\"form-item\"\n control={<SwitchControl checked={value} onChange={e => onChange(e.target.checked)} />}\n label={\n <Typography className=\"toggle-req-limit\">\n <span>{t('router.gateway.reqLimit.statusAction')}</span>\n <span>\n <Tag type={reqLimitEnabled ? 'primary' : 'error'}>\n {t(`router.gateway.reqLimit.status.${reqLimitEnabled}`)}\n </Tag>\n </span>\n </Typography>\n }\n />\n )}\n />\n {reqLimitEnabled && (\n <>\n <div className=\"form-item\">\n <Typography id=\"request-limit-rate-label\" gutterBottom>\n {t('router.gateway.reqLimit.rate', { rate: reqLimitRate })}\n </Typography>\n <Controller\n name=\"requestLimit.rate\"\n control={control}\n render={({ value, onChange }) => (\n <LimitRateSlider\n onChange={(_, newValue) => onChange(newValue)}\n defaultValue={value}\n valueLabelDisplay=\"auto\"\n step={1}\n min={GATEWAY_REQ_LIMIT.min}\n max={GATEWAY_REQ_LIMIT.max}\n />\n )}\n />\n </div>\n <Controller\n name=\"requestLimit.ipHeader\"\n control={control}\n render={({ value, onChange }) => (\n <>\n <TextField\n variant=\"outlined\"\n className=\"form-item\"\n label={t('router.gateway.reqLimit.ipHeaderLabel')}\n margin=\"normal\"\n value={value}\n onChange={onChange}\n />\n <FormHelperText id=\"req-limit-ip_header-desc\">\n {t('router.gateway.reqLimit.ipHeaderDesc')}\n </FormHelperText>\n </>\n )}\n />\n </>\n )}\n <div className=\"form-actions\">\n <Permission permission=\"mutate_node\">\n <Button\n disabled={loading}\n onClick={handleSubmit(onSubmit)}\n color=\"primary\"\n variant=\"contained\"\n data-cy=\"submit-btn\"\n className=\"form-submit\">\n {t('common.save')} {loading && <Spinner size={[16, 10]} />}\n </Button>\n </Permission>\n </div>\n </Form>\n </Div>\n );\n}\n\nconst Div = styled.div`\n display: flex;\n align-items: flex-start;\n width: 100%;\n max-width: 720px;\n\n .toggle-req-limit {\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","/* 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 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';\nimport Gateway from '../../components/settings/gateway';\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('router.routerSetting'), value: 'router' },\n { label: t('router.certSetting'), value: 'cert' },\n { label: t('common.gateway'), value: 'gateway' },\n { label: t('common.webhook'), value: 'integration' },\n { label: t('common.about'), value: 'about' },\n ];\n\n const renders = {\n basic: BasicSettings,\n integration: WebHookSetting,\n about: About,\n router: RouterSettings,\n gateway: Gateway,\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"],"sourceRoot":""}