@abtnode/webapp 1.8.10 → 1.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blocklet.js +1 -1
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +9 -9
- package/build/index.html +1 -1
- package/build/static/js/7004.3bf96415.chunk.js +2 -0
- package/build/static/js/7004.3bf96415.chunk.js.map +1 -0
- package/build/static/js/7840.d5ba5ce0.chunk.js +2 -0
- package/build/static/js/7840.d5ba5ce0.chunk.js.map +1 -0
- package/build/static/js/976.b5206735.chunk.js +2 -0
- package/build/static/js/976.b5206735.chunk.js.map +1 -0
- package/build/static/js/main.a05bf626.js +3 -0
- package/build/static/js/{main.28eb3231.js.LICENSE.txt → main.a05bf626.js.LICENSE.txt} +0 -0
- package/build/static/js/main.a05bf626.js.map +1 -0
- package/package.json +1 -1
- package/build/static/js/7004.547d6bfe.chunk.js +0 -2
- package/build/static/js/7004.547d6bfe.chunk.js.map +0 -1
- package/build/static/js/7840.b09df4f5.chunk.js +0 -2
- package/build/static/js/7840.b09df4f5.chunk.js.map +0 -1
- package/build/static/js/976.3cb108f4.chunk.js +0 -2
- package/build/static/js/976.3cb108f4.chunk.js.map +0 -1
- package/build/static/js/main.28eb3231.js +0 -3
- package/build/static/js/main.28eb3231.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/js/7840.d5ba5ce0.chunk.js","mappings":"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","sources":["components/click-to-copy.js","hooks/mobile-width.js","components/confirm.js","components/delete-confirm.js","contexts/domain-status.js","hooks/url-evaluation.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"],"sourcesContent":["import { 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 { useTheme } from '@mui/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('md'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\n\nimport Dialog from '@mui/material/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Alert from '@mui/material/Alert';\nimport useTheme from '@mui/material/styles/useTheme';\nimport useMediaQuery from '@mui/material/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('md'));\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=\"inherit\"\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: 'error',\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","/* eslint-disable react/no-unstable-nested-components */\n/* eslint-disable react/no-danger */\n/* eslint-disable react/prop-types */\nimport PropTypes from 'prop-types';\n\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\n\nimport Alert from '@mui/material/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')}:<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 { createContext, 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 = 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, recommendedDomain, updateStatus } = useContext(DomainStatusContext);\n return { status, recommendedDomainStatus, recommendedDomain, updateStatus };\n}\n\nexport { DomainStatusContext, DomainStatusProvider, Consumer as DomainStatusConsumer, useDomainStatusContext };\n","import { useState, useEffect, useMemo, useRef, useContext } from 'react';\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 defaultCheckAccessible from '@abtnode/util/lib/url-evaluation/check-accessible-browser';\nimport memoize from 'lodash/memoize';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, getBlockletUrls } from '../contexts/routing';\nimport { getBlockletUrlParams } from '../libs/util';\n\n// 如果同一个页面中存在多个部分同时对同一个 url 检测 url 可访问性, 避免造成重复请求\nconst ping = memoize(url => defaultCheckAccessible(joinURL(new URL(url).origin, WELLKNOWN_PING_PREFIX)));\n\n// url <-> evaluation cache\nconst CACHE = {};\n\nexport function useUrlEvaluation({ urls, checkAccessible = defaultCheckAccessible, disableCache = false }) {\n // 基于 CACHE 初始化该 hook 的状态\n // FIXME: 最好解决源头的 material-table 渲染 BlockletInterface 时的 re-mount 问题 (#4897)\n const initialCachedRef = useRef(urls.filter(url => CACHE[url]).map(url => CACHE[url]));\n const allCached = initialCachedRef.current.length === urls.length;\n const [urlsState, setUrlsState] = useState(allCached ? initialCachedRef.current : []);\n const [loading, setLoading] = useState(!allCached);\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 && !allCached) {\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [urls, disableCache, allCached]);\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 if (!blocklet) {\n return [];\n }\n // getBlockletUrlParams 的调用是必须的, 会根据 blocklet 状态决定是否添加 \"__start__\" 参数, 以保证 blocklet 启动按钮可以正确的跳转到启动页面\n return getBlockletUrls({ did: blocklet.meta.did, siteMap, params: getBlockletUrlParams(blocklet, locale) });\n }, [blocklet, locale, siteMap]);\n const { loading, recommendedUrlState, recommendedUrl } = useUrlEvaluation({ urls, checkAccessible: ping });\n return { urls, loading, recommendedUrlState, recommendedUrl };\n}\n\n/**\n * 主要对 blocklet domains 对应的 urls 进行评估, 配合 DomainStatusProvider 使用\n * @param {string[]} domains\n */\nexport function useDomainsAccessibility(domains) {\n // 获取 blocklet domain 对应的访问 url\n const urls = useMemo(() => domains.map(item => getAccessUrl(item)), [domains]);\n const { urlsState, loading, recommendedUrl } = useUrlEvaluation({ urls, checkAccessible: ping });\n let result;\n if (loading) {\n result = {\n domainsAccessibility: domains.reduce((acc, cur) => ({ ...acc, [cur]: { loading: true } }), {}),\n recommendedDomain: null,\n };\n } else {\n const domainsAccessibility = urlsState.reduce((acc, cur) => {\n // 检测对象是 domain, 但检测可访问性用的是 domain 对应的 ping url, 所以需要取 hostname 作为结果\n const domain = new URL(cur.url).hostname;\n acc[domain] = { ...cur, domain };\n return acc;\n }, {});\n // 从排好优先级的 urls 中选择第一个可访问的 url 作为 recommendedDomain (对于自定义域名, 可能存在评分最高但不可访问的情况) (#5195)\n const accessibleUrl = urlsState.find(item => item.accessible)?.url || recommendedUrl;\n result = {\n domainsAccessibility,\n recommendedDomain: accessibleUrl ? new URL(accessibleUrl).hostname : null,\n };\n }\n return result;\n}\n","import styled from '@emotion/styled';\nimport IOSSwitch from '@arcblock/ux/lib/Switch';\n\n/**\n * 该组件的对 UX 中 iOS 风格的 Switch 组件包装, 统一布局\n * 具体参考: https://github.com/ArcBlock/blocklet-server/issues/4809\n *\n * - label 在左, 切换器在右\n * - 整体宽度控制, 宽屏下 max-width 为 300px 避免 label 与 switch 相隔太远, 窄屏下 100% 宽度\n */\nfunction SwitchControl({ labelProps, className, style, ...rest }) {\n const _labelProps = {\n ...labelProps,\n labelPlacement: labelProps?.labelPlacement || 'start',\n };\n return (\n <Root className={className} style={style}>\n <IOSSwitch labelProps={_labelProps} {...rest} />\n </Root>\n );\n}\n\nSwitchControl.propTypes = IOSSwitch.propTypes;\nSwitchControl.defaultProps = IOSSwitch.defaultProps;\n\nconst Root = styled.div`\n max-width: 300px;\n > label {\n display: flex;\n justify-content: space-between;\n width: 100%;\n margin-left: 0;\n margin-right: 0;\n }\n ${({ theme }) => theme.breakpoints.down('sm')} {\n max-width: 100%;\n }\n`;\n\nexport default SwitchControl;\n","import { useState } from 'react';\nimport styled from '@emotion/styled';\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\nfunction Prompt() {\n return null;\n}\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 PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\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 { useState, useEffect } from 'react';\nimport styled from '@emotion/styled';\nimport PropTypes from 'prop-types';\nimport { useForm } from 'react-hook-form';\n\nimport TextField from '@mui/material/TextField';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@mui/material/Typography';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\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\n <SwitchControl\n checked={autoUpgrade}\n onChange={() => setAutoUpgrade(!autoUpgrade)}\n name=\"autoUpgrade\"\n disabled={!hasPermission}\n labelProps={{\n label: (\n <Typography>\n <span>{t('setting.form.upgrade.switchLabel')}</span>\n </Typography>\n ),\n }}\n style={{ marginTop: 20 }}\n />\n\n <SwitchControl\n checked={enableWelcomePage}\n onChange={() => setEnableWelcomePage(!enableWelcomePage)}\n name=\"enableWelcomePage\"\n disabled={!hasPermission}\n labelProps={{\n label: (\n <Typography>\n <span>{t('setting.form.welcome.switchLabel')}</span>\n </Typography>\n ),\n }}\n style={{ marginTop: 16 }}\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","import { useEffect } from 'react';\nimport styled from '@emotion/styled';\nimport Box from '@mui/material/Box';\nimport Toast from '@abtnode/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 { 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 Toast.success(t('setting.saveSuccess'));\n };\n\n return (\n <Div>\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 { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ActionIcon from '@mui/icons-material/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=\"error\">\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","/* eslint-disable react/no-unstable-nested-components */\nimport { useContext, useState } from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport styled from '@emotion/styled';\nimport { useSnackbar } from 'notistack';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Alert from '@mui/material/Alert';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport RelativeTime from '@arcblock/ux/lib/RelativeTime';\n\nimport Datatable from '@arcblock/ux/lib/Datatable';\nimport Button from '@arcblock/ux/lib/Button';\nimport LinkIcon from '@mui/icons-material/Link';\nimport TextField from '@mui/material/TextField';\nimport SendIcon from '@mui/icons-material/Send';\nimport { formatError, checkInputByType } from '../../libs/util';\n\nimport { useNodeContext } from '../../contexts/node';\nimport Confirm from '../confirm';\n\nimport DelButton from '../webhook/delete';\n\nexport default function HookSetting() {\n const { api, prefix } = useNodeContext();\n const { t, locale } = useContext(LocaleContext);\n const { enqueueSnackbar } = useSnackbar();\n\n const [defaultConfig, setDefaultConfig] = useState([]);\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 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 margin=\"dense\"\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 };\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 label: t('setting.webhook.columns.description'),\n name: 'id',\n verticalKeyAlign: 'center',\n options: {\n sort: false,\n customBodyRenderLite: rawIndex => {\n const d = list[rawIndex];\n\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 {\n label: t('setting.webhook.columns.params'),\n name: 'params',\n options: {\n sort: false,\n customBodyRenderLite: rawIndex => {\n const d = list[rawIndex];\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 {\n label: t('setting.webhook.columns.createdAt'),\n name: 'createdAt',\n options: {\n customBodyRenderLite: rawIndex => {\n const d = list[rawIndex];\n return <RelativeTime value={Number(d.createdAt)} locale={locale} />;\n },\n },\n },\n {\n label: t('common.actions'),\n align: 'center',\n verticalKeyAlign: 'center',\n options: {\n sort: false,\n customBodyRenderLite: rawIndex => {\n const d = list[rawIndex];\n\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\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 const customButtons = defaultConfig.map(x => {\n return {\n icon: webhookIcon(x),\n title: `${t('common.add')} ${x.title}`,\n onClick: () => {\n onSetWebHook(x);\n },\n };\n });\n\n return (\n <Main>\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 <Datatable\n columns={columns}\n data={list}\n locale={locale}\n customButtons={customButtons}\n verticalKeyWidth={100}\n options={{\n download: false,\n filter: false,\n print: false,\n }}\n />\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 styled from '@emotion/styled';\nimport PropTypes from 'prop-types';\nimport Typography from '@mui/material/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 { 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 { useState } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport IconButton from '@mui/material/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} size=\"large\">\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 { useRef, useEffect, useState, useMemo } from 'react';\nimport styled from '@emotion/styled';\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, isChrome } 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(false);\n const timeoutRef = useRef(null);\n const [registerInfo, setRegisterInfo] = useState({});\n const { createdAt, did, description, name } = info;\n const isPostMessage = useMemo(() => isChrome(), []);\n let { registerUrl } = info;\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 && 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 return !!isAdded;\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 clearTimeout(timeoutRef.current);\n setLoading(false);\n if (isPostMessage) {\n sendQuery();\n }\n };\n\n const checkHealth = () => {\n setLoading(true);\n timeoutRef.current = setTimeout(() => {\n Toast.error(t('setting.form.register.timeout'));\n setLoading(false);\n }, 1000 * 6);\n };\n\n useEffect(() => {\n let f;\n window.addEventListener(\n 'message',\n (f = event => {\n const { data } = event;\n if (data === 'launcher init') {\n onLoad();\n } else 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 if (isPostMessage) {\n checkHealth();\n }\n\n return () => {\n window.removeEventListener('message', f);\n clearTimeout(timeoutRef.current);\n };\n }, []); // eslint-disable-line\n\n const registerBtn = isPostMessage ? (\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 <Button\n color=\"primary\"\n loading={loading}\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\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 {isPostMessage && <iframe ref={launchWindow} src={registerUrl} title=\"register\" style={{ display: 'none' }} />}\n </Div>\n );\n}\n\nconst Div = styled.div`\n .danger-zone {\n margin-top: 1vw;\n width: 100%;\n }\n`;\n","import { useNavigate } from 'react-router-dom';\nimport styled from '@emotion/styled';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport get from 'lodash/get';\n\nimport Box from '@mui/material/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 navigate = useNavigate();\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 navigate('/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 { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport get from 'lodash/get';\n\nimport AddIcon from '@mui/icons-material/Public';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport MenuItem from '@mui/material/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 // eslint-disable-next-line react/no-unstable-nested-components\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={{ marginTop: 16, 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 { useState } from 'react';\n\nimport ActionIcon from '@mui/icons-material/Delete';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@mui/material/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 { useState } from 'react';\n\nimport EditIcon from '@mui/icons-material/Edit';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport MenuItem from '@mui/material/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 // eslint-disable-next-line react/no-unstable-nested-components\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 margin=\"dense\"\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 { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Menu from '@mui/material/Menu';\nimport IconMoreVert from '@mui/icons-material/MoreVert';\nimport IconButton from '@mui/material/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\" size=\"large\">\n <IconMoreVert />\n </IconButton>\n <Menu\n keepMounted\n onMouseDown={mouseDown}\n open={!!anchorEl}\n onClose={onClose}\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-inner-declarations */\n/* eslint-disable react/no-unstable-nested-components */\n/* eslint-disable no-script-url */\n/* eslint-disable react/jsx-wrap-multilines */\nimport { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport isUrl from 'is-url';\nimport styled from '@emotion/styled';\n\nimport OkIcon from '@mui/icons-material/CheckCircle';\nimport BadIcon from '@mui/icons-material/Error';\nimport NodeIcon from '@mui/icons-material/Storage';\nimport DomainIcon from '@mui/icons-material/Public';\nimport RuleIcon from '@mui/icons-material/SubdirectoryArrowRight';\nimport Typography from '@mui/material/Typography';\nimport Tooltip from '@mui/material/Tooltip';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport ExternalLink from '@mui/material/Link';\nimport ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';\nimport Collapse from '@mui/material/Collapse';\nimport Box from '@mui/material/Box';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport ChevronRightIcon from '@mui/icons-material/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\nfunction 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\" underline=\"hover\">\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\" underline=\"hover\">\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\nfunction 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\" underline=\"hover\">\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 function 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\" underline=\"hover\">\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 styled from '@emotion/styled';\n\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport AddIcon from '@mui/icons-material/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} key={x.id} />\n ))}\n </List>\n </Main>\n </DomainStatusProvider>\n );\n}\n\nconst Main = styled.main`\n margin-top: ${props => props.theme.spacing(2)};\n min-height: 60vh;\n\n .MuiListItemIcon-root {\n min-width: ${props => props.theme.spacing(4)};\n }\n\n .site-header {\n display: flex;\n align-items: center;\n margin-left: ${props => props.theme.spacing(1)};\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)};\n }\n\n .site-secondary {\n margin-left: ${props => props.theme.spacing(1)};\n }\n\n .rule-list--depth1 {\n padding-left: ${props => props.theme.spacing(4)};\n }\n\n .rule-list--depth2 {\n padding-left: ${props => props.theme.spacing(5)};\n }\n\n .rule-action {\n margin-left: ${props => props.theme.spacing(2)};\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 { useState } from 'react';\nimport get from 'lodash/get';\nimport { useDropzone } from 'react-dropzone';\nimport { Controller, useForm, useWatch } from 'react-hook-form';\nimport Box from '@mui/material/Box';\n\nimport AddIcon from '@mui/icons-material/Add';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@mui/material/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 return certSource === 'lets_encrypt' && !domain;\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=\"inherit\" 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 data-cy=\"certificate-name-textfield\"\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 { useState } from 'react';\n\nimport ActionIcon from '@mui/icons-material/Delete';\nimport useTheme from '@mui/material/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 { 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 '@mui/styles';\nimport Button from '@arcblock/ux/lib/Button';\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport DetailsIcon from '@mui/icons-material/Details';\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/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 <Button autoFocus variant=\"contained\" onClick={handleClose} color=\"secondary\">\n {t('common.close')}\n </Button>\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 { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Typography from '@mui/material/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/no-unstable-nested-components */\n/* eslint-disable react/jsx-one-expression-per-line */\n/* eslint-disable react/jsx-wrap-multilines */\nimport { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\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';\nimport Datatable from '@arcblock/ux/lib/Datatable';\nimport RelativeTime from '@arcblock/ux/lib/RelativeTime';\n\nimport Typography from '@mui/material/Typography';\nimport Tooltip from '@mui/material/Tooltip';\nimport InfoIcon from '@mui/icons-material/InfoOutlined';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\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\nfunction 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\nfunction TableCellInfoRow({ name, value, style = {}, icon, ...props }) {\n return (\n <TableCellContainer style={{ display: 'flex', alignItems: 'center', ...style }} {...props}>\n <span>{name}:</span>\n <span>{value}</span>\n {icon && icon}\n </TableCellContainer>\n );\n}\n\nconst TableCellContainer = styled.div`\n & > span {\n margin: 5px;\n }\n`;\n\nfunction 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, locale } = 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 cerData = state.value?.certificates;\n\n const columns = [\n {\n label: t('common.certificate'),\n name: '',\n verticalKeyAlign: 'center',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return (\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 },\n {\n label: t('router.cert.boundDomains'),\n name: '',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return (\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 },\n {\n label: t('router.cert.source'),\n name: '',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return t(`router.cert.sourceTypes.${row.source}`);\n },\n },\n },\n {\n label: t('common.status'),\n name: '',\n width: 100,\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return <Status status={row.status} source={row.source} expiresTime={get(row, 'meta.validTo')} />;\n },\n },\n },\n {\n label: t('common.expires'),\n name: '',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return <RelativeTime value={get(row, 'meta.validTo')} locale={locale} />;\n },\n },\n },\n {\n label: t('router.cert.matchedSites'),\n name: '',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\n return (\n <MatchedSites\n id={row.id}\n certificate={row}\n style={{ minWidth: 200, whiteSpace: 'initial', wordBreak: 'break-all' }}\n />\n );\n },\n },\n },\n {\n label: t('router.cert.action'),\n name: '',\n align: 'center',\n options: {\n sort: false,\n filter: false,\n customBodyRenderLite: rawIndex => {\n const row = cerData[rawIndex];\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\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 <Datatable\n title={\n <Permission permission=\"mutate_router\">\n <UpdateNginxCert mode=\"add\" onRefresh={onRefresh} variant=\"contained\" />\n </Permission>\n }\n locale={locale}\n data={state.value.certificates}\n columns={columns}\n verticalKeyWidth={100}\n options={{\n search: false,\n download: false,\n filter: false,\n print: false,\n }}\n />\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 { useState } from 'react';\nimport styled from '@emotion/styled';\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';\n\nimport Slider from '@mui/material/Slider';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport { withStyles } from '@mui/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 '&: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 <Permission permission=\"mutate_node\">\n {hasPermission => (\n <Form className=\"form\" noValidate autoComplete=\"off\" onSubmit={handleSubmit(onSubmit)}>\n <Controller\n name=\"requestLimit.enabled\"\n control={control}\n render={({ value, onChange }) => (\n <SwitchControl\n checked={value}\n disabled={!hasPermission}\n onChange={e => onChange(e.target.checked)}\n labelProps={{\n label: (\n <Typography>\n <span>{t('router.gateway.reqLimit.switchLabel')}</span>\n </Typography>\n ),\n }}\n style={{ marginTop: 16 }}\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 disabled={!hasPermission}\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 disabled={loading || !hasPermission}\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 {hasPermission && (\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 )}\n </div>\n </Form>\n )}\n </Permission>\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","/* eslint-disable react/jsx-one-expression-per-line */\nimport { useContext } from 'react';\nimport styled from '@emotion/styled';\nimport { useParams, useNavigate } from 'react-router-dom';\n\nimport Typography from '@mui/material/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 navigate = useNavigate();\n const { node } = useContext(NodeContext);\n const { t } = useContext(LocaleContext);\n\n const { tab = 'basic' } = useParams();\n\n const onTabChange = newTab => {\n navigate(`/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"],"names":["ClickToCopy","children","rest","t","useContext","LocaleContext","tip","copiedTip","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","onCallback","cb","formatError","console","d","isBreakpointsDownSm","useMobileWidth","StyledDialog","onClick","e","stopPropagation","fullScreen","style","DialogTitle","DialogContent","DialogContentText","component","Alert","severity","width","marginTop","DialogActions","className","padding","Button","size","disabled","__disableConfirm","variant","autoFocus","Spinner","defaultProps","styled","Dialog","CancelConfirm","confirmPlaceholder","keyName","confirmSetting","marginBottom","dangerouslySetInnerHTML","__html","label","autoComplete","fullWidth","value","inputVal","onChange","target","DomainStatusContext","createContext","Provider","Consumer","DomainStatusProvider","domainList","domains","client","getClient","domainListStr","JSON","stringify","status","setStatus","useMemo","filter","domain","shouldCheckDomainStatus","useSubscription","EVENTS","data","pre","useDomainsAccessibility","domainsAccessibility","recommendedDomain","domainsStatus","merged","Object","keys","forEach","key","getDomainStatus","length","checkDomains","input","useEffect","refresh","updateStatus","api","recommendedDomainStatus","useDomainStatusContext","ping","memoize","url","defaultCheckAccessible","joinURL","URL","origin","WELLKNOWN_PING_PREFIX","CACHE","useUrlEvaluation","urls","checkAccessible","disableCache","initialCachedRef","useRef","map","allCached","current","urlsState","setUrlsState","recommendedUrlState","evaluate","evaluateURLs","results","item","sort","a","b","score","recommendedUrl","useBlockletUrlEvaluation","blocklet","siteMap","useRoutingContext","locale","getBlockletUrls","did","meta","getBlockletUrlParams","result","getAccessUrl","reduce","acc","cur","hostname","accessibleUrl","find","accessible","SwitchControl","labelProps","_labelProps","labelPlacement","Root","IOSSwitch","Prompt","RouterPrompt","confirmPrompt","setConfirmPrompt","onPromptDialogCancel","onPromptDialogConfirm","location","prefix","window","env","apiPrefix","history","pathname","endsWith","substring","reload","Div","message","args","settings","props","Form","Container","initDefaultValues","info","name","registerUrl","webWalletUrl","diskAlertThreshold","BasicSetting","onSaved","submit","node","useNodeContext","useForm","defaultValues","register","handleSubmit","errors","formState","reset","warning","setWarning","autoUpgrade","setAutoUpgrade","enableWelcomePage","setEnableWelcomePage","setCurrent","w","isDirty","onSubmit","updateNodeInfo","trim","sleep","noValidate","Typography","permission","hasPermission","TextField","placeholder","inputRef","validate","inputProps","onFocus","helperText","margin","type","min","max","checked","BasicSettings","silent","Box","mb","Toast","DeleteAccessKey","setConfirmSetting","onDelete","id","deleteWebHook","setting","edge","fontSize","HookSetting","enqueueSnackbar","useSnackbar","defaultConfig","setDefaultConfig","state","useAsyncRetry","Promise","all","getWebHooks","getWebhookSenders","webhooks","senders","list","createWebHook","retry","autoHideDuration","onSetWebHook","x","inputList","Main","index","defaultValue","required","disable","trimValue","checkInputByType","some","webhookIcon","src","alt","height","Link","onSendTestNotification","rowInfo","webhookId","sendTestMessage","columns","verticalKeyAlign","options","customBodyRenderLite","rawIndex","desc","display","alignItems","whiteSpace","marginLeft","RelativeTime","Number","createdAt","align","SendIconInfo","textAlign","customButtons","icon","Datatable","verticalKeyWidth","download","print","SendIcon","DangerItem","gutterBottom","DangerZone","ConfirmUpgrade","nextVersion","upgradeNodeVersion","version","marginRight","UpgradeCheck","onDone","onCheck","checkNodeVersion","IconButton","Refresh","RegisterNode","launchWindow","endpoint","getEndPoint","timeoutRef","registerInfo","setRegisterInfo","isPostMessage","isChrome","localStorage","getItem","nodeInfo","isAdded","buttonText","buttonDisabled","onLoad","clearTimeout","contentWindow","postMessage","action","f","addEventListener","event","setTimeout","removeEventListener","registerBtn","href","encodeURIComponent","ref","About","navigate","useNavigate","extra","getNodeEnv","res","assign","rows","push","nodeOwner","routing","provider","os","docker","Tag","gitpod","Array","isArray","get","blockletEngines","visible","available","displayName","can","Logo","ml","InfoRow","valueComponent","nameWidth","Boolean","maxWidth","mt","AddDomain","blocklets","onActivate","actions","rule","from","pathPrefix","to","ip","ROUTING_RULE_TYPES","bInterface","interfaceName","BLOCKLET_DYNAMIC_PATH_PREFIX","port","rules","redirectCode","addSite","setValue","validateSite","errMsg","validateDomain","getInitialBlockletDid","onMenuItemClick","searchParams","MenuItem","DeleteDomain","isSpecialDomain","deleteSite","UpdateDomain","updateSite","Edit","RuleItemAction","anchorEl","setAnchorEl","onClose","isProtected","parent","items","onRuleAdded","mouseDown","onMouseDown","currentTarget","Menu","keepMounted","anchorOrigin","vertical","horizontal","RedirectRule","isHttps","toUrl","interfaces","scheme","tmpToUrl","isUrl","DOMAIN_FOR_DEFAULT_SITE","underline","NoneRule","RuleItem","useBlockletContext","getDisplayName","ports","depth","initialExpand","expand","domainAliases","setExpand","IconComponent","root","NodeIcon","DomainIcon","RuleIcon","DomainLink","primaryDomain","DASHBOARD","adminPath","replace","DomainElement","rel","ItemDiv","button","disableGutters","ListItemIcon","ExpandMore","ChevronRight","ListItemText","flex","secondary","primary","ListItemSecondaryAction","Collapse","in","List","disablePadding","internalLink","dashboard","isHealthy","healthyTip","domainStatus","divider","paddingBottom","paddingLeft","wordBreak","Tooltip","ListItem","RouterPage","sites","allDomains","y","Add","spacing","md","lg","readFile","file","resolve","reject","reader","FileReader","readAsText","onload","onerror","err","UpdateNginxCert","certificate","onRefresh","mode","restProps","keyFile","setKeyFile","pemFile","setPemFile","certSource","setCertSource","control","useWatch","submitUpload","pem","addCertificate","split","join","privateKey","updateCertificate","certSources","upload","lets_encrypt","issueLetsEncryptCert","source","Error","onDropRejected","files","useDropzone","accept","multiple","maxSize","onDrop","acceptedFiles","getPemRootProps","getRootProps","getPemInputProps","getInputProps","getKeyRootProps","getKeyInputProps","RadioGroup","FormControlLabel","Radio","render","DeleteCert","refreshRoutingContext","deleteCertificate","palette","main","DetailCert","certBasicRows","matchedSites","s","fontWeight","formatToDatetime","updatedAt","certInfoRows","moment","humanize","formatToDate","Details","showCloseButton","row","Divider","MatchedSites","showMore","setShowMore","listStyle","slice","border","isExpired","expiresTime","Date","TableCellInfoRow","TableCellContainer","Status","filterCerts","certificates","blockletUrls","isCertificateMatch","CertificateManager","blockletDID","useQuery","getCertificates","getBlocklet","filtered","cerData","nowrap","noWrap","Set","search","LimitRateSlider","withStyles","thumb","backgroundColor","boxShadow","valueLabel","left","track","borderRadius","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","cert","CertSetting","TabComponent","Tabs","newTab","scrollButtons"],"sourceRoot":""}
|