@ethersphere/bee-dashboard 0.7.0 → 0.11.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["pages/info/StatusCard.tsx","components/QRCodeModal.tsx","components/ClipboardCopy.tsx","components/EthereumAddress.tsx","components/EthereumAddressCard.tsx","components/TroubleshootConnectionCard.tsx","utils/index.ts","models/Token.ts","providers/Settings.tsx","providers/Bee.tsx","hooks/apiHooks.tsx","pages/info/index.tsx","components/ConnectToHost.tsx","components/TabsContainer.tsx","providers/Platform.tsx","components/CodeBlock.tsx","components/CodeBlockTabs.tsx","pages/status/SetupSteps/DebugConnectionCheck.tsx","pages/status/SetupSteps/NodeConnectionCheck.tsx","pages/status/SetupSteps/VersionCheck.tsx","pages/status/SetupSteps/EthereumConnectionCheck.tsx","components/WithdrawDepositModal.tsx","containers/DepositModal.tsx","pages/status/SetupSteps/ChequebookDeployFund.tsx","pages/status/SetupSteps/PeerConnection.tsx","pages/status/index.tsx","pages/files/Download.tsx","components/AlertUploadSize.tsx","components/PeerDetail.tsx","providers/Stamps.tsx","pages/stamps/CreatePostageStampModal.tsx","pages/files/SelectStamp.tsx","pages/files/Upload.tsx","pages/files/index.tsx","pages/peers/PeerTable.tsx","utils/threshold.ts","components/Title.tsx","components/StatCard.tsx","components/TopologyStats.tsx","pages/peers/index.tsx","containers/WithdrawModal.tsx","pages/accounting/AccountCard.tsx","components/CashoutModal.tsx","pages/accounting/BalancesTable.tsx","hooks/accounting.ts","pages/accounting/index.tsx","pages/settings/index.tsx","pages/stamps/StampsTable.tsx","routes.tsx","pages/stamps/index.tsx","components/ErrorBoundary.tsx","components/AlertVersion.tsx","components/SideBarItem.tsx","components/SideBarStatus.tsx","assets/logo.svg","components/SideBar.tsx","layout/Dashboard.tsx","theme.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["useStyles","makeStyles","createStyles","root","display","flex","flexDirection","status","color","backgroundColor","StatusCard","userBeeVersion","nodeAddresses","nodeTopology","isLatestBeeVersion","latestUrl","classes","useState","underlayAddressesVisible","setUnderlayAddresessVisible","Card","CardContent","className","style","marginBottom","marginRight","population","to","ROUTES","PEERS","connected","Typography","component","variant","gutterBottom","href","rel","target","Chip","marginLeft","size","label","Button","publicKey","pssPublicKey","overlay","onClick","padding","marginTop","ArrowDropUp","fontSize","ArrowRight","underlay","map","item","QRCodeModal","props","open","setOpen","IconButton","FilterCenterFocusSharp","Dialog","onClose","textAlign","DialogTitle","id","value","bgColor","fgColor","level","includeMargin","renderAs","ClipboardCopy","enqueueSnackbar","useSnackbar","text","height","EthereumAddress","address","hideBlockie","paddingTop","string","truncate","maxWidth","overflow","textOverflow","whiteSpace","process","transaction","alignItems","justifyContent","flexWrap","details","content","EthereumAddressCard","ethereum","chequebookAddress","flexGrow","title","TroubleshootConnectionCard","STATUS","isInteger","BigNumber","isBigNumber","makeBigNumber","toString","TypeError","sleepMs","ms","a","Promise","resolve","setTimeout","POSSIBLE_DECIMALS","Token","amount","decimals","includes","this","BigInt","toFixed","dividedBy","pow","digits","toDecimal","t","multipliedBy","initialValues","apiUrl","sessionStorage","getItem","apiDebugUrl","beeApi","beeDebugApi","setApiUrl","setDebugApiUrl","Context","createContext","Consumer","Provider","children","setBeeApi","setBeeDebugApi","useEffect","Bee","setItem","e","BeeDebug","all","version","blockchainConnection","debugApiConnection","apiConnection","topology","chequebook","latestPublishedVersion","undefined","latestUserVersion","latestUserVersionExact","latestBeeVersionUrl","error","apiHealth","debugApiHealth","peers","chequebookBalance","peerBalances","peerCheques","settlements","latestBeeRelease","isLoading","isRefreshing","lastUpdate","start","stop","refresh","reject","getStatus","Boolean","semver","satisfies","engines","bee","includePrerelease","totalBalance","toBigNumber","isGreaterThan","Object","values","every","v","useContext","SettingsContext","setApiHealth","setDebugApiHealth","setNodeAddresses","setNodeTopology","setChequebookAddress","setPeers","setChequebookBalance","setPeerBalances","setPeerCheques","setSettlements","setLatestBeeRelease","isLoadingLatestBeeRelease","setLoading","setError","axios","get","then","res","data","catch","finally","useLatestBeeRelease","setIsLoading","setIsRefreshing","setLastUpdate","frequency","setFrequency","coerce","name","chequeBalanceWrapper","getChequebookBalance","availableBalance","peerBalanceWrapper","getAllBalances","balances","peer","balance","settlementsWrapper","getAllSettlements","totalReceived","totalSent","received","sent","promises","isConnected","getHealth","getNodeAddresses","getTopology","getPeers","getChequebookAddress","getLastCheques","allSettled","Date","now","interval","setInterval","clearInterval","html_url","freq","theme","width","rowGap","spacing","Status","BeeContext","isOk","ConnectToHost","hostInputVisible","toggleHostInputVisibility","host","setHost","TextField","defaultValue","defaultHost","onChange","minWidth","TabPanel","index","other","role","hidden","Box","p","SimpleTabs","indexChanged","React","setValue","Tabs","event","newValue","idx","Tab","Platforms","SupportedPlatforms","CodeBlock","language","showLineNumbers","code","macOS","Linux","platform","setPlatform","os","userAgent","window","navigator","iOS","Windows","test","Android","getOS","keys","isSupportedPlatform","CodeBlockTabs","linux","mac","NodeConnectionCheck","changeDebugApiUrl","console","log","margin","Accordion","AccordionSummary","expandIcon","ExpandMoreSharp","AccordionDetails","elevation","severity","VersionCheck","userVersion","latestVersion","EthereumConnectionCheck","WithdrawDepositModal","successMessage","errorMessage","dialogMessage","min","max","action","setAmount","amountToken","setAmountToken","amountError","setAmountError","handleClose","handleAction","toBigInt","transactionHash","message","DialogContent","DialogContentText","Input","autoFocus","type","placeholder","fullWidth","fromDecimal","isLessThan","Error","FormHelperText","DialogActions","DepositModal","depositTokens","ChequebookDeployFund","PeerConnection","button","actionsContainer","NodeSetupWorkflow","activeStep","setActiveStep","steps","handleNext","prevActiveStep","handleBack","Paper","Stepper","nonLinear","orientation","Step","StepLabel","length","StepIconComponent","Autorenew","cursor","CheckCircle","StepButton","disabled","ExpandLessSharp","StepContent","input","iconButton","divider","Files","referenceInput","setReferenceInput","referenceError","setReferenceError","InputBase","inputProps","Utils","Hex","isHexString","Search","UploadSizeAlert","aboveLimit","file","Collapse","in","Alert","AlertTitle","truncStringPortion","str","firstCharCount","endCharCount","substring","PeerDetail","peerId","characterLength","fontFamily","stamps","enrichStamp","postageBatch","depth","bucketDepth","usage","utilization","Math","usageText","ceil","setStamps","getAllPostageBatch","initialFormValues","wrapper","position","field","buttonProgress","top","left","FormDialog","handleClickOpen","onSubmit","actions","Number","parseInt","options","createPostageBatch","resetForm","setSubmitting","validate","errors","isLessThanOrEqualTo","submitForm","isValid","isSubmitting","CircularProgress","required","SimpleMenu","selectedStamp","setSelected","anchorEl","setAnchorEl","currentTarget","Menu","keepMounted","stamp","MenuItem","selected","batchID","ListItemIcon","dropzoneKey","setDropzoneKey","setFile","uploadReference","setUploadReference","isUploadingFile","setIsUploadingFile","setSelectedStamp","reduce","prev","curr","files","filesLimit","maxFileSize","avatar","Avatar","deleteIcon","onDelete","uploadFile","hash","Container","table","getPingState","peerLatency","loading","rtt","PeerTable","setPeerLatency","TableContainer","Table","TableHead","TableRow","TableCell","align","TableBody","scope","Tooltip","prevPeerLatency","pingPeer","OPTIMAL_POPULATION","GENERIC_ERROR","THRESHOLDS","connectedPeers","minimumValue","explanation","score","toLocaleString","pickThreshold","key","thresholds","maximumScore","last","Title","tooltip","Grid","container","direction","justify","Info","StatCard","statistic","Skeleton","animation","Indicator","maximumTotalScore","sum","actualTotalScore","percentageText","round","Metrics","xs","sm","md","lg","xl","TopologyStats","Peers","WithdrawModal","withdrawTokens","buttons","columnGap","gridContainer","chequebookActions","AccountCard","totalreceived","totalsent","toFixedDecimal","CheckoutModal","uncashedAmount","loadingCashout","setLoadingCashout","overflowWrap","cashoutLastCheque","BalancesTable","accounting","isLoadingUncashed","total","isPositive","useAccounting","setIsloadingUncashed","uncashedAmounts","setUncashedAmounts","filter","gt","fn","maxRetries","delayMs","tries","results","makeRetriablePromise","getLastCashoutAction","promiseSettledResults","fulfilled","promise","rejected","x","reason","String","unwrapPromiseSettlements","forEach","plus","minus","sort","b","toNumber","mergeAccounting","Accounting","Settings","debugHost","setDebugHost","touched","helperText","InputLabelProps","shrink","StampsTable","postageStamps","beeContext","BaseRouter","exact","path","INFO","FILES","ACCOUNTING","SETTINGS","STAMPS","Stamps","ErrorBoundary","state","errorInfo","Component","VersionAlert","isExactlySupportedBeeVersion","SUPPORTED_BEE_VERSION_EXACT","StyledListItem","withStyles","paddingLeft","paddingRight","borderLeft","palette","primary","main","ListItem","icon","activeIcon","SideBarItem","iconStart","iconEnd","location","useLocation","isSelected","matchPath","pathname","disableRipple","ListItemText","iconSmall","rootError","smallerText","borderRadius","navBarItems","Home","FileText","Layers","DollarSign","Share2","minHeight","paddingBottom","logo","link","textDecoration","SideBar","Drawer","alt","src","Logo","List","Divider","OpenInNewSharp","background","default","Dashboard","createMuiTheme","light","orange","A200","dark","secondary","typography","join","overrides","MuiDrawer","paper","MuiTab","fontWeight","fontWeightRegular","opacity","fontWeightMedium","MuiTabs","borderBottom","indicator","App","ThemeProvider","CssBaseline","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.396e3ebb.chunk.js","sourcesContent":["import { ReactElement, useState } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Card, CardContent, Typography, Chip, Button } from '@material-ui/core/'\nimport { ArrowRight, ArrowDropUp } from '@material-ui/icons/'\nimport { NodeAddresses, Topology } from '@ethersphere/bee-js'\nimport { ROUTES } from '../../routes'\n\nconst useStyles = makeStyles(() =>\n createStyles({\n root: {\n display: 'flex',\n flex: '1 1 auto',\n flexDirection: 'column',\n },\n status: {\n color: '#2145a0',\n backgroundColor: '#e1effe',\n },\n }),\n)\n\ninterface Props {\n nodeAddresses: NodeAddresses | null\n nodeTopology: Topology | null\n userBeeVersion?: string\n isLatestBeeVersion: boolean\n isOk: boolean\n latestUrl: string\n}\n\nfunction StatusCard({\n userBeeVersion,\n nodeAddresses,\n nodeTopology,\n isLatestBeeVersion,\n latestUrl,\n}: Props): ReactElement | null {\n const classes = useStyles()\n\n const [underlayAddressesVisible, setUnderlayAddresessVisible] = useState<boolean>(false)\n\n return (\n <Card>\n <CardContent className={classes.root}>\n <>\n <div style={{ marginBottom: '20px' }}>\n <span style={{ marginRight: '20px' }}>Discovered Nodes: {nodeTopology?.population}</span>\n <span style={{ marginRight: '20px' }}>\n <span>Connected Peers: </span>\n <Link to={ROUTES.PEERS}>{nodeTopology?.connected}</Link>\n </span>\n </div>\n <div>\n <Typography component=\"div\" variant=\"subtitle2\" gutterBottom>\n <span>AGENT: </span>\n <a href=\"https://github.com/ethersphere/bee\" rel=\"noreferrer\" target=\"_blank\">\n Bee\n </a>{' '}\n <span>{userBeeVersion || '-'}</span>\n {isLatestBeeVersion ? (\n <Chip\n style={{ marginLeft: '7px', color: '#2145a0' }}\n size=\"small\"\n label=\"latest\"\n className={classes.status}\n />\n ) : (\n <Button size=\"small\" variant=\"outlined\" href={latestUrl}>\n update\n </Button>\n )}\n </Typography>\n <Typography component=\"div\" variant=\"subtitle2\" gutterBottom>\n <span>PUBLIC KEY: </span>\n <span>{nodeAddresses?.publicKey ? nodeAddresses.publicKey : '-'}</span>\n </Typography>\n <Typography component=\"div\" variant=\"subtitle2\" gutterBottom>\n <span>PSS PUBLIC KEY: </span>\n <span>{nodeAddresses?.pssPublicKey ? nodeAddresses.pssPublicKey : '-'}</span>\n </Typography>\n <Typography component=\"div\" variant=\"subtitle2\" gutterBottom>\n <span>OVERLAY ADDRESS (PEER ID): </span>\n <span>{nodeAddresses?.overlay ? nodeAddresses.overlay : '-'}</span>\n </Typography>\n <Typography component=\"div\" variant=\"subtitle2\" gutterBottom>\n <Typography component=\"div\" onClick={() => setUnderlayAddresessVisible(!underlayAddressesVisible)}>\n <Button color=\"primary\" style={{ padding: 0, marginTop: '6px' }}>\n {underlayAddressesVisible ? (\n <ArrowDropUp style={{ fontSize: '12px' }} />\n ) : (\n <ArrowRight style={{ fontSize: '12px' }} />\n )}\n <span>Underlay Addresses</span>\n </Button>\n </Typography>\n {underlayAddressesVisible && (\n <div>\n {nodeAddresses?.underlay.map(item => (\n <li key={item}>{item}</li>\n ))}\n </div>\n )}\n </Typography>\n </div>\n </>\n </CardContent>\n </Card>\n )\n}\n\nexport default StatusCard\n","import { ReactElement, useState } from 'react'\nimport QRCode from 'qrcode.react'\nimport { IconButton, Dialog, DialogTitle } from '@material-ui/core'\nimport { FilterCenterFocusSharp } from '@material-ui/icons'\n\ninterface Props {\n value: string\n label: string\n}\n\nexport default function QRCodeModal(props: Props): ReactElement {\n const [open, setOpen] = useState(false)\n\n const handleOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n return (\n <div>\n <IconButton color=\"primary\" size=\"small\" onClick={handleOpen}>\n <FilterCenterFocusSharp />\n </IconButton>\n <Dialog onClose={handleClose} aria-labelledby=\"simple-dialog-title\" open={open}>\n <div style={{ padding: '30px', textAlign: 'center' }}>\n <DialogTitle id=\"simple-dialog-title\">{props.label}</DialogTitle>\n <QRCode\n value={props.value}\n size={150}\n bgColor={'#ffffff'}\n fgColor={'#000000'}\n level={'L'}\n includeMargin={false}\n renderAs={'svg'}\n />\n </div>\n </Dialog>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport IconButton from '@material-ui/core/IconButton'\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport { Clipboard } from 'react-feather'\nimport { useSnackbar } from 'notistack'\n\ninterface Props {\n value: string\n}\n\nexport default function ClipboardCopy({ value }: Props): ReactElement {\n const { enqueueSnackbar } = useSnackbar()\n const handleCopy = () => enqueueSnackbar(`Copied: ${value}`, { variant: 'success' })\n\n return (\n <div style={{ marginRight: '3px', marginLeft: '3px' }}>\n <IconButton color=\"primary\" size=\"small\" onClick={handleCopy}>\n <CopyToClipboard text={value}>\n <Clipboard style={{ height: '20px' }} />\n </CopyToClipboard>\n </IconButton>\n </div>\n )\n}\n","import { Typography } from '@material-ui/core/'\nimport QRCodeModal from './QRCodeModal'\nimport ClipboardCopy from './ClipboardCopy'\n\nimport Identicon from 'react-identicons'\nimport { ReactElement } from 'react'\n\ninterface Props {\n address: string | undefined\n hideBlockie?: boolean\n transaction?: boolean\n truncate?: boolean\n}\n\nexport default function EthereumAddress(props: Props): ReactElement {\n return (\n <Typography component=\"div\" variant=\"subtitle1\">\n {props.address ? (\n <div style={{ display: 'flex' }}>\n {props.hideBlockie ? null : (\n <div style={{ paddingTop: '5px', marginRight: '10px' }}>\n <Identicon size={20} string={props.address} />\n </div>\n )}\n <div>\n <a\n style={\n props.truncate\n ? {\n marginRight: '7px',\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'block',\n }\n : { marginRight: '7px' }\n }\n href={`${process.env.REACT_APP_BLOCKCHAIN_EXPLORER_URL}/${props.transaction ? 'tx' : 'address'}/${\n props.address\n }`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {props.address}\n </a>\n </div>\n <QRCodeModal value={props.address} label={'Ethereum Address'} />\n <ClipboardCopy value={props.address} />\n </div>\n ) : (\n '-'\n )}\n </Typography>\n )\n}\n","import { ReactElement } from 'react'\n\nimport { createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Card, CardContent, Typography } from '@material-ui/core/'\n\nimport EthereumAddress from '../components/EthereumAddress'\n\nimport type { ChequebookAddressResponse, NodeAddresses } from '@ethersphere/bee-js'\n\nconst useStyles = makeStyles(() =>\n createStyles({\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n flexWrap: 'wrap',\n },\n details: {\n display: 'flex',\n flexDirection: 'column',\n },\n content: {\n flex: '1 0 auto',\n },\n }),\n)\n\ninterface Props {\n nodeAddresses: NodeAddresses | null\n chequebookAddress: ChequebookAddressResponse | null\n}\n\nfunction EthereumAddressCard(props: Props): ReactElement {\n const classes = useStyles()\n\n return (\n <Card className={classes.root}>\n <div className={classes.details}>\n <CardContent className={classes.content}>\n <Typography variant=\"subtitle1\" gutterBottom>\n Ethereum Address\n </Typography>\n <EthereumAddress address={props.nodeAddresses?.ethereum} />\n </CardContent>\n </div>\n\n <div className={classes.details}>\n <CardContent className={classes.content}>\n <Typography variant=\"subtitle1\" gutterBottom>\n Chequebook Contract Address\n </Typography>\n <EthereumAddress address={props.chequebookAddress?.chequebookAddress} />\n </CardContent>\n </div>\n </Card>\n )\n}\n\nexport default EthereumAddressCard\n","import type { ReactElement } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Card, CardContent, Typography } from '@material-ui/core/'\nimport { ROUTES } from '../routes'\n\nconst useStyles = makeStyles({\n root: {\n flexGrow: 1,\n marginTop: '20px',\n },\n title: {\n textAlign: 'center',\n fontSize: 26,\n },\n})\n\nexport default function TroubleshootConnectionCard(): ReactElement {\n const classes = useStyles()\n\n return (\n <Card className={classes.root}>\n <CardContent>\n <Typography className={classes.title} gutterBottom>\n Looks like your node is not connected\n </Typography>\n <div style={{ marginBottom: '20px', textAlign: 'center' }}>\n <strong>\n <Link to={ROUTES.STATUS}>Click to run status checks</Link> on your nodes connection or check out the{' '}\n <a href={process.env.REACT_APP_BEE_DOCS_HOST} target=\"_blank\" rel=\"noreferrer\">\n Swarm Bee Docs\n </a>\n </strong>\n </div>\n\n <div style={{ marginBottom: '20px', textAlign: 'center' }}>\n <p style={{ marginTop: '50px' }}>\n Still not working? Drop us a message on the Ethereum Swarm{' '}\n <a href={process.env.REACT_APP_BEE_DISCORD_HOST} target=\"_blank\" rel=\"noreferrer\">\n Discord\n </a>\n </p>\n </div>\n </CardContent>\n </Card>\n )\n}\n","import { BigNumber } from 'bignumber.js'\n\n/**\n * Test if value is an integer\n *\n * @param value Value to be tested if it is an integer\n *\n * @returns True if the passed in value is integer\n */\nexport function isInteger(value: unknown): value is BigNumber | bigint {\n return (BigNumber.isBigNumber(value) && value.isInteger()) || typeof value === 'bigint'\n}\n\n/**\n *Convert value into a BigNumber if not already\n *\n * @param value Value to be converted\n *\n * @throws {TypeError} if the value is not convertible to a BigNumber\n *\n * @returns BigNumber - but it may still be NaN or Infinite\n */\nexport function makeBigNumber(value: BigNumber | BigInt | number | string): BigNumber | never {\n if (BigNumber.isBigNumber(value)) return value\n\n if (typeof value === 'string') return new BigNumber(value)\n\n if (typeof value === 'bigint') return new BigNumber(value.toString())\n\n // FIXME: bee-js still returns some values as numbers and even outside of SAFE INTEGER bounds\n if (typeof value === 'number' /* && Number.isSafeInteger(value)*/) return new BigNumber(value)\n\n throw new TypeError(`Not a BigNumber or BigNumber convertible value. Type: ${typeof value} value: ${value}`)\n}\n\nexport type PromiseSettlements<T> = {\n fulfilled: PromiseFulfilledResult<T>[]\n rejected: PromiseRejectedResult[]\n}\n\nexport type UnwrappedPromiseSettlements<T> = {\n fulfilled: T[]\n rejected: string[]\n}\n\nexport async function sleepMs(ms: number): Promise<void> {\n await new Promise<void>(resolve =>\n setTimeout(() => {\n resolve()\n }, ms),\n )\n}\n\n/**\n * Maps the returned results of `Promise.allSettled` to an object\n * with `fulfilled` and `rejected` arrays for easy access.\n *\n * The results still need to be unwrapped to get the fulfilled values or rejection reasons.\n */\nexport function mapPromiseSettlements<T>(promises: PromiseSettledResult<T>[]): PromiseSettlements<T> {\n const fulfilled = promises.filter(promise => promise.status === 'fulfilled') as PromiseFulfilledResult<T>[]\n const rejected = promises.filter(promise => promise.status === 'rejected') as PromiseRejectedResult[]\n\n return { fulfilled, rejected }\n}\n\n/**\n * Maps the returned values of `Promise.allSettled` to an object\n * with `fulfilled` and `rejected` arrays for easy access.\n *\n * For rejected promises, the value is the stringified `reason`,\n * or `'Unknown error'` string when it is unavailable.\n */\nexport function unwrapPromiseSettlements<T>(\n promiseSettledResults: PromiseSettledResult<T>[],\n): UnwrappedPromiseSettlements<T> {\n const values = mapPromiseSettlements(promiseSettledResults)\n const fulfilled = values.fulfilled.map(x => x.value)\n const rejected = values.rejected.map(x => (x.reason ? String(x.reason) : 'Unknown error'))\n\n return { fulfilled, rejected }\n}\n\n/**\n * Wraps a `Promise<T>` or async function inside a new `Promise<T>`,\n * which retries the original function up to `maxRetries` times,\n * waiting `delayMs` milliseconds between failed attempts.\n *\n * If all attempts fail, then this `Promise<T>` also rejects.\n */\nexport function makeRetriablePromise<T>(fn: () => Promise<T>, maxRetries = 3, delayMs = 1000): Promise<T> {\n return new Promise(async (resolve, reject) => {\n for (let tries = 0; tries < maxRetries; tries++) {\n try {\n const results = await fn()\n resolve(results)\n\n return\n } catch (error) {\n if (tries < maxRetries - 1) {\n await sleepMs(delayMs)\n } else {\n reject(error)\n }\n }\n }\n })\n}\n","import { BigNumber } from 'bignumber.js'\nimport { isInteger, makeBigNumber } from '../utils'\n\nconst POSSIBLE_DECIMALS = [18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\ntype digits = typeof POSSIBLE_DECIMALS[number]\n\nconst BZZ_DECIMALS = 16\n\nexport class Token {\n private amount: BigNumber // Represented in the base units, so it is always an integer value\n private readonly decimals: digits\n\n constructor(amount: BigNumber | string | BigInt, decimals: digits = BZZ_DECIMALS) {\n const a = makeBigNumber(amount)\n\n if (!isInteger(a) || !POSSIBLE_DECIMALS.includes(decimals)) throw new TypeError('Not a valid token values')\n\n this.amount = a\n this.decimals = decimals\n }\n\n /**\n * Construct new Token from a digit representation\n *\n * @param amount Amount of a token in the digits (1 token = 10^decimals)\n * @param decimals Number of decimals for the token (must be integer)\n *\n * @throws {TypeError} If the decimals is not an integer or the amount after conversion is not an integer\n *\n * @returns new Token\n */\n static fromDecimal(amount: BigNumber | string | BigInt, decimals: digits = BZZ_DECIMALS): Token | never {\n const a = makeBigNumber(amount)\n\n // No need to do any validation here, it is done when the new token is created\n const t = a.multipliedBy(new BigNumber(10).pow(decimals))\n\n return new Token(t, decimals)\n }\n\n get toBigInt(): BigInt {\n return BigInt(this.amount.toFixed(0))\n }\n\n get toString(): string {\n return this.amount.toFixed(0)\n }\n\n get toBigNumber(): BigNumber {\n return new BigNumber(this.amount)\n }\n\n get toDecimal(): BigNumber {\n return this.amount.dividedBy(new BigNumber(10).pow(this.decimals))\n }\n\n toFixedDecimal(digits = 7): string {\n return this.toDecimal.toFixed(digits)\n }\n}\n","import { createContext, ReactChild, ReactElement, useState, useEffect } from 'react'\nimport { Bee, BeeDebug } from '@ethersphere/bee-js'\n\ninterface ContextInterface {\n apiUrl: string\n apiDebugUrl: string\n beeApi: Bee | null\n beeDebugApi: BeeDebug | null\n setApiUrl: (url: string) => void\n setDebugApiUrl: (url: string) => void\n}\n\nconst initialValues: ContextInterface = {\n apiUrl: sessionStorage.getItem('api_host') || process.env.REACT_APP_BEE_HOST || 'http://localhost:1633',\n apiDebugUrl:\n sessionStorage.getItem('debug_api_host') || process.env.REACT_APP_BEE_DEBUG_HOST || 'http://localhost:1635',\n beeApi: null,\n beeDebugApi: null,\n setApiUrl: () => {}, // eslint-disable-line\n setDebugApiUrl: () => {}, // eslint-disable-line\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const [apiUrl, setApiUrl] = useState<string>(initialValues.apiUrl)\n const [apiDebugUrl, setDebugApiUrl] = useState<string>(initialValues.apiDebugUrl)\n const [beeApi, setBeeApi] = useState<Bee | null>(null)\n const [beeDebugApi, setBeeDebugApi] = useState<BeeDebug | null>(null)\n\n useEffect(() => {\n try {\n setBeeApi(new Bee(apiUrl))\n sessionStorage.setItem('api_host', apiUrl)\n } catch (e) {\n setBeeApi(null)\n }\n }, [apiUrl])\n\n useEffect(() => {\n try {\n setBeeDebugApi(new BeeDebug(apiDebugUrl))\n sessionStorage.setItem('debug_api_host', apiDebugUrl)\n } catch (e) {\n setBeeDebugApi(null)\n }\n }, [apiDebugUrl])\n\n return (\n <Context.Provider value={{ apiUrl, apiDebugUrl, beeApi, beeDebugApi, setApiUrl, setDebugApiUrl }}>\n {children}\n </Context.Provider>\n )\n}\n","import type { ChequebookBalance, Balance, Settlements } from '../types'\nimport { createContext, ReactChild, ReactElement, useEffect, useState, useContext } from 'react'\nimport { Token } from '../models/Token'\nimport semver from 'semver'\nimport { engines } from '../../package.json'\nimport { Context as SettingsContext } from './Settings'\n\nimport type {\n NodeAddresses,\n ChequebookAddressResponse,\n LastChequesResponse,\n Health,\n Peer,\n Topology,\n} from '@ethersphere/bee-js'\nimport { useLatestBeeRelease } from '../hooks/apiHooks'\n\ninterface Status {\n all: boolean\n version: boolean\n blockchainConnection: boolean\n debugApiConnection: boolean\n apiConnection: boolean\n topology: boolean\n chequebook: boolean\n}\n\ninterface ContextInterface {\n status: Status\n latestPublishedVersion?: string\n latestUserVersion?: string\n latestUserVersionExact?: string\n isLatestBeeVersion: boolean\n latestBeeVersionUrl: string\n error: Error | null\n apiHealth: boolean\n debugApiHealth: Health | null\n nodeAddresses: NodeAddresses | null\n topology: Topology | null\n chequebookAddress: ChequebookAddressResponse | null\n peers: Peer[] | null\n chequebookBalance: ChequebookBalance | null\n peerBalances: Balance[] | null\n peerCheques: LastChequesResponse | null\n settlements: Settlements | null\n latestBeeRelease: LatestBeeRelease | null\n isLoading: boolean\n isRefreshing: boolean\n lastUpdate: number | null\n start: (frequency?: number) => void\n stop: () => void\n refresh: () => Promise<void>\n}\n\nconst initialValues: ContextInterface = {\n status: {\n all: false,\n version: false,\n blockchainConnection: false,\n debugApiConnection: false,\n apiConnection: false,\n topology: false,\n chequebook: false,\n },\n latestPublishedVersion: undefined,\n latestUserVersion: undefined,\n latestUserVersionExact: undefined,\n isLatestBeeVersion: false,\n latestBeeVersionUrl: 'https://github.com/ethersphere/bee/releases/latest',\n error: null,\n apiHealth: false,\n debugApiHealth: null,\n nodeAddresses: null,\n topology: null,\n chequebookAddress: null,\n peers: null,\n chequebookBalance: null,\n peerBalances: null,\n peerCheques: null,\n settlements: null,\n latestBeeRelease: null,\n isLoading: true,\n isRefreshing: false,\n lastUpdate: null,\n start: () => {}, // eslint-disable-line\n stop: () => {}, // eslint-disable-line\n refresh: () => Promise.reject(),\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction getStatus(\n debugApiHealth: Health | null,\n nodeAddresses: NodeAddresses | null,\n apiHealth: boolean,\n topology: Topology | null,\n chequebookAddress: ChequebookAddressResponse | null,\n chequebookBalance: ChequebookBalance | null,\n error: Error | null,\n): Status {\n const status = {\n version: Boolean(\n debugApiHealth &&\n semver.satisfies(debugApiHealth.version, engines.bee, {\n includePrerelease: true,\n }),\n ),\n blockchainConnection: Boolean(nodeAddresses?.ethereum),\n debugApiConnection: Boolean(debugApiHealth?.status === 'ok'),\n apiConnection: apiHealth,\n topology: Boolean(topology?.connected && topology?.connected > 0),\n chequebook:\n Boolean(chequebookAddress?.chequebookAddress) &&\n chequebookBalance !== null &&\n chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0),\n }\n\n return { ...status, all: !error && Object.values(status).every(v => v) }\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const { beeApi, beeDebugApi } = useContext(SettingsContext)\n const [apiHealth, setApiHealth] = useState<boolean>(false)\n const [debugApiHealth, setDebugApiHealth] = useState<Health | null>(null)\n const [nodeAddresses, setNodeAddresses] = useState<NodeAddresses | null>(null)\n const [topology, setNodeTopology] = useState<Topology | null>(null)\n const [chequebookAddress, setChequebookAddress] = useState<ChequebookAddressResponse | null>(null)\n const [peers, setPeers] = useState<Peer[] | null>(null)\n const [chequebookBalance, setChequebookBalance] = useState<ChequebookBalance | null>(null)\n const [peerBalances, setPeerBalances] = useState<Balance[] | null>(null)\n const [peerCheques, setPeerCheques] = useState<LastChequesResponse | null>(null)\n const [settlements, setSettlements] = useState<Settlements | null>(null)\n const { latestBeeRelease } = useLatestBeeRelease()\n\n const [error, setError] = useState<Error | null>(initialValues.error)\n const [isLoading, setIsLoading] = useState<boolean>(initialValues.isLoading)\n const [isRefreshing, setIsRefreshing] = useState<boolean>(initialValues.isRefreshing)\n const [lastUpdate, setLastUpdate] = useState<number | null>(initialValues.lastUpdate)\n const [frequency, setFrequency] = useState<number | null>(30000)\n\n const latestPublishedVersion = semver.coerce(latestBeeRelease?.name)?.version\n const latestUserVersion = semver.coerce(debugApiHealth?.version)?.version\n const latestUserVersionExact = debugApiHealth?.version\n\n useEffect(() => {\n setIsLoading(true)\n\n setApiHealth(false)\n\n refresh()\n }, [beeApi])\n\n useEffect(() => {\n setIsLoading(true)\n\n setDebugApiHealth(null)\n setNodeAddresses(null)\n setNodeTopology(null)\n setPeers(null)\n setChequebookAddress(null)\n setChequebookBalance(null)\n setPeerBalances(null)\n setPeerCheques(null)\n setSettlements(null)\n\n refresh()\n }, [beeDebugApi])\n\n const refresh = async () => {\n // Don't want to refresh when already refreshing\n if (isRefreshing) return\n\n // Not a valid bee api\n if (!beeApi || !beeDebugApi) {\n setIsLoading(false)\n\n return\n }\n\n try {\n setIsRefreshing(true)\n setError(null)\n\n // Wrap the chequebook balance call to return BZZ values as Token object\n const chequeBalanceWrapper = async () => {\n const { totalBalance, availableBalance } = await beeDebugApi.getChequebookBalance()\n\n return {\n totalBalance: new Token(totalBalance),\n availableBalance: new Token(availableBalance),\n }\n }\n\n // Wrap the balances call to return BZZ values as Token object\n const peerBalanceWrapper = async () => {\n const { balances } = await beeDebugApi.getAllBalances()\n\n return balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) }))\n }\n\n // Wrap the settlements call to return BZZ values as Token object\n const settlementsWrapper = async () => {\n const { totalReceived, settlements, totalSent } = await beeDebugApi.getAllSettlements()\n\n return {\n totalReceived: new Token(totalReceived),\n totalSent: new Token(totalSent),\n settlements: settlements.map(({ peer, received, sent }) => ({\n peer,\n received: new Token(received),\n sent: new Token(sent),\n })),\n }\n }\n\n const promises = [\n // API health\n beeApi\n .isConnected()\n .then(setApiHealth)\n .catch(() => setApiHealth(false)),\n\n // Debug API health\n beeDebugApi\n .getHealth()\n .then(setDebugApiHealth)\n .catch(() => setDebugApiHealth(null)),\n\n // Node Addresses\n beeDebugApi\n .getNodeAddresses()\n .then(setNodeAddresses)\n .catch(() => setNodeAddresses(null)),\n\n // Network Topology\n beeDebugApi\n .getTopology()\n .then(setNodeTopology)\n .catch(() => setNodeTopology(null)),\n\n // Peers\n beeDebugApi\n .getPeers()\n .then(setPeers)\n .catch(() => setPeers(null)),\n\n // Chequebook address\n beeDebugApi\n .getChequebookAddress()\n .then(setChequebookAddress)\n .catch(() => setChequebookAddress(null)),\n\n // Cheques\n beeDebugApi\n .getLastCheques()\n .then(setPeerCheques)\n .catch(() => setPeerCheques(null)),\n\n // Chequebook balance\n chequeBalanceWrapper()\n .then(setChequebookBalance)\n .catch(() => setChequebookBalance(null)),\n\n // Peer balances\n peerBalanceWrapper()\n .then(setPeerBalances)\n .catch(() => setPeerBalances(null)),\n\n // Settlements\n settlementsWrapper()\n .then(setSettlements)\n .catch(() => setSettlements(null)),\n ]\n\n await Promise.allSettled(promises)\n } catch (e) {\n setError(e)\n } finally {\n setIsLoading(false)\n setIsRefreshing(false)\n setLastUpdate(Date.now())\n }\n }\n\n const start = (freq = 30000) => setFrequency(freq)\n const stop = () => setFrequency(null)\n\n // Start the update loop\n useEffect(() => {\n refresh()\n\n // Start autorefresh only if the frequency is set\n if (frequency) {\n const interval = setInterval(refresh, frequency)\n\n return () => clearInterval(interval)\n }\n }, [frequency, beeDebugApi, beeApi])\n\n return (\n <Context.Provider\n value={{\n status: getStatus(\n debugApiHealth,\n nodeAddresses,\n apiHealth,\n topology,\n chequebookAddress,\n chequebookBalance,\n error,\n ),\n latestUserVersion,\n latestUserVersionExact,\n latestPublishedVersion,\n isLatestBeeVersion: Boolean(\n latestPublishedVersion &&\n latestUserVersion &&\n semver.satisfies(latestPublishedVersion, latestUserVersion, {\n includePrerelease: true,\n }),\n ),\n latestBeeVersionUrl: latestBeeRelease?.html_url || 'https://github.com/ethersphere/bee/releases/latest',\n error,\n apiHealth,\n debugApiHealth,\n nodeAddresses,\n topology,\n chequebookAddress,\n peers,\n chequebookBalance,\n peerBalances,\n peerCheques,\n settlements,\n latestBeeRelease,\n isLoading,\n isRefreshing,\n lastUpdate,\n start,\n stop,\n refresh,\n }}\n >\n {children}\n </Context.Provider>\n )\n}\n","import { useState, useEffect } from 'react'\nimport axios from 'axios'\n\nexport interface LatestBeeReleaseHook {\n latestBeeRelease: LatestBeeRelease | null\n isLoadingLatestBeeRelease: boolean\n error: Error | null\n}\n\nexport const useLatestBeeRelease = (): LatestBeeReleaseHook => {\n const [latestBeeRelease, setLatestBeeRelease] = useState<LatestBeeRelease | null>(null)\n const [isLoadingLatestBeeRelease, setLoading] = useState<boolean>(false)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n axios\n .get(`${process.env.REACT_APP_BEE_GITHUB_REPO_URL}/releases/latest`)\n .then(res => {\n setLatestBeeRelease(res.data)\n })\n .catch((error: Error) => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { latestBeeRelease, isLoadingLatestBeeRelease, error }\n}\n","import { ReactElement, useContext } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\n\nimport StatusCard from './StatusCard'\nimport EthereumAddressCard from '../../components/EthereumAddressCard'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context as BeeContext } from '../../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n display: 'grid',\n rowGap: theme.spacing(3),\n },\n }),\n)\n\nexport default function Status(): ReactElement {\n const classes = useStyles()\n\n const {\n status,\n latestUserVersion,\n isLatestBeeVersion,\n latestBeeVersionUrl,\n topology,\n nodeAddresses,\n chequebookAddress,\n } = useContext(BeeContext)\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <div className={classes.root}>\n <StatusCard\n userBeeVersion={latestUserVersion}\n isLatestBeeVersion={isLatestBeeVersion}\n isOk={status.all}\n nodeTopology={topology}\n latestUrl={latestBeeVersionUrl}\n nodeAddresses={nodeAddresses}\n />\n {nodeAddresses && chequebookAddress && (\n <EthereumAddressCard nodeAddresses={nodeAddresses} chequebookAddress={chequebookAddress} />\n )}\n </div>\n )\n}\n","import React, { ReactElement, useState } from 'react'\nimport { TextField, Button } from '@material-ui/core'\n\ninterface Props {\n defaultHost?: string\n setHost: (host: string) => void\n}\n\nexport default function ConnectToHost(props: Props): ReactElement {\n const [hostInputVisible, toggleHostInputVisibility] = useState(false)\n const [host, setHost] = useState('')\n\n const handleNewHostConnection = () => {\n if (host) {\n props.setHost(host)\n toggleHostInputVisibility(!hostInputVisible)\n }\n }\n\n return (\n <div>\n {hostInputVisible ? (\n <div style={{ display: 'flex' }}>\n <TextField\n defaultValue={props.defaultHost}\n label=\"Enter host\"\n variant=\"outlined\"\n size=\"small\"\n onChange={e => setHost(e.target.value)}\n style={{ marginRight: '15px', minWidth: '300px' }}\n />\n <Button onClick={() => handleNewHostConnection()} size=\"small\" variant=\"outlined\">\n Connect\n </Button>\n <Button\n style={{ marginLeft: '7px' }}\n onClick={() => toggleHostInputVisibility(!hostInputVisible)}\n size=\"small\"\n >\n Cancel\n </Button>\n </div>\n ) : (\n <Button onClick={() => toggleHostInputVisibility(!hostInputVisible)} size=\"small\" variant=\"outlined\">\n Change host\n </Button>\n )}\n </div>\n )\n}\n","import React, { ReactElement, ReactNode } from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Tabs from '@material-ui/core/Tabs'\nimport Tab from '@material-ui/core/Tab'\nimport Typography from '@material-ui/core/Typography'\nimport Box from '@material-ui/core/Box'\n\ninterface TabPanelProps {\n children?: ReactNode\n index: number\n value: number\n}\n\nfunction TabPanel(props: TabPanelProps) {\n const { children, value, index, ...other } = props\n\n return (\n <div role=\"tabpanel\" hidden={value !== index} {...other}>\n {value === index && (\n <Box p={3}>\n <Typography>{children}</Typography>\n </Box>\n )}\n </div>\n )\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n },\n}))\n\ninterface TabsValues {\n component: ReactNode\n label: string\n}\n\ninterface Props {\n values: TabsValues[]\n index?: number\n indexChanged?: (index: number) => void\n}\n\nexport default function SimpleTabs({ values, index, indexChanged }: Props): ReactElement {\n const classes = useStyles()\n const [value, setValue] = React.useState<number>(index || 0)\n\n const handleChange = (event: React.ChangeEvent<Record<string, never>>, newValue: number) => {\n if (indexChanged) indexChanged(newValue)\n else setValue(newValue)\n }\n\n const v = index !== undefined ? index : value\n\n return (\n <div className={classes.root}>\n <Tabs value={v} onChange={handleChange}>\n {values.map(({ label }, idx) => (\n <Tab key={idx} label={label} />\n ))}\n </Tabs>\n {values.map(({ component }, idx) => (\n <TabPanel key={idx} value={v} index={idx}>\n {component}\n </TabPanel>\n ))}\n </div>\n )\n}\n","import { createContext, ReactChild, ReactElement, useState, useEffect } from 'react'\n\n// These need to be numeric values as they are used as indexes in the TabsContainer\nexport enum Platforms {\n macOS = 0,\n Linux,\n Windows,\n iOS,\n Android,\n}\n\nexport enum SupportedPlatforms {\n macOS = Platforms.macOS,\n Linux = Platforms.Linux,\n}\n\ninterface ContextInterface {\n platform: SupportedPlatforms\n setPlatform: (platform: SupportedPlatforms) => void\n}\n\nconst initialValues: ContextInterface = {\n platform: SupportedPlatforms.macOS,\n setPlatform: () => {}, // eslint-disable-line\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction isSupportedPlatform(platform: unknown): platform is SupportedPlatforms {\n return Object.keys(SupportedPlatforms).includes(platform as string)\n}\n\nfunction getOS(): Platforms | null {\n const userAgent = window.navigator.userAgent\n const platform = window.navigator.platform\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']\n const iosPlatforms = ['iPhone', 'iPad', 'iPod']\n\n if (macosPlatforms.includes(platform)) return Platforms.macOS\n\n if (iosPlatforms.includes(platform)) return Platforms.iOS\n\n if (windowsPlatforms.includes(platform)) return Platforms.Windows\n\n if (/Android/.test(userAgent)) return Platforms.Android\n\n if (/Linux/.test(platform)) return Platforms.Linux\n\n return null\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const [platform, setPlatform] = useState<SupportedPlatforms>(SupportedPlatforms.Linux)\n\n // This is in useEffect as it really just needs to run once and not on each re-render\n useEffect(() => {\n const os = getOS()\n\n setPlatform(isSupportedPlatform(os) ? os : SupportedPlatforms.Linux)\n }, [])\n\n return <Context.Provider value={{ platform, setPlatform }}>{children}</Context.Provider>\n}\n","import type { ReactElement } from 'react'\nimport SyntaxHighlighter from 'react-syntax-highlighter'\n\ninterface Props {\n code: string\n language: string\n showLineNumbers?: boolean\n}\n\nconst CodeBlock = (props: Props): ReactElement => {\n return (\n <div style={{ textAlign: 'left' }}>\n <SyntaxHighlighter language={props.language} showLineNumbers={props.showLineNumbers}>\n {props.code}\n </SyntaxHighlighter>\n </div>\n )\n}\n\nexport default CodeBlock\n","import { ReactElement, useContext } from 'react'\nimport TabsContainer from './TabsContainer'\nimport CodeBlock from './CodeBlock'\nimport { Context } from '../providers/Platform'\n\ninterface Props {\n linux: string\n mac: string\n showLineNumbers?: boolean\n}\n\nexport default function CodeBlockTabs(props: Props): ReactElement {\n const { platform, setPlatform } = useContext(Context)\n\n return (\n <TabsContainer\n index={platform}\n indexChanged={setPlatform}\n values={[\n {\n label: 'Linux',\n component: <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.linux} />,\n },\n {\n label: 'macOS',\n component: <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.mac} />,\n },\n ]}\n />\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { Typography, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core/'\nimport MuiAlert from '@material-ui/lab/Alert'\nimport { ExpandMoreSharp } from '@material-ui/icons/'\n\nimport ConnectToHost from '../../../components/ConnectToHost'\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\nimport { Context as SettingsContext } from '../../../providers/Settings'\n\ntype Props = StatusHookCommon\n\nexport default function NodeConnectionCheck({ isOk }: Props): ReactElement | null {\n const { setDebugApiUrl, apiDebugUrl } = useContext(SettingsContext)\n\n const changeDebugApiUrl = (\n <div style={{ display: 'flex', marginTop: '25px', marginBottom: '25px' }}>\n <span style={{ marginRight: '15px' }}>\n Debug API (<Typography variant=\"button\">{apiDebugUrl}</Typography>)\n </span>\n <ConnectToHost\n setHost={(host: string) => {\n console.log(host) // eslint-disable-line\n setDebugApiUrl(host)\n }}\n defaultHost={apiDebugUrl}\n />\n </div>\n )\n\n if (isOk) {\n return changeDebugApiUrl\n }\n\n return (\n <div>\n {changeDebugApiUrl}\n\n <div>\n <Typography component=\"div\" variant=\"body2\" gutterBottom style={{ margin: '15px' }}>\n We cannot connect to your nodes debug API at <Typography variant=\"button\">{apiDebugUrl}</Typography>. Please\n check the following to troubleshoot your issue.\n <Accordion style={{ marginTop: '20px' }}>\n <AccordionSummary expandIcon={<ExpandMoreSharp />} aria-controls=\"panel1a-content\" id=\"panel1a-header\">\n <Typography>Troubleshoot</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography component=\"div\">\n <ol>\n <li>Check the status of your node by running the below command to see if your node is running.</li>\n <CodeBlockTabs showLineNumbers linux={`sudo systemctl status bee`} mac={`brew services list`} />\n <li>\n If your node is running, check your firewall settings to make sure that port 1635 (or your custom\n specified port) is bound to localhost. If your node is not running try executing the below command\n to start your bee node\n </li>\n <MuiAlert\n style={{ marginTop: '10px', marginBottom: '10px' }}\n elevation={6}\n variant=\"filled\"\n severity=\"error\"\n >\n Your debug node API should never be completely open to the internet. If you want to connect\n remotely, make sure your firewall settings are set to only allow specific trusted IP addresses and\n block all other ports. A simple google search for &quot;what is my ip&quot; will show you your\n computers public IP address to allow.\n </MuiAlert>\n <CodeBlockTabs\n showLineNumbers\n linux={`sudo systemctl start bee`}\n mac={`brew services start swarm-bee`}\n />\n <li>Run the commands to validate your node is running and see the log output.</li>\n <CodeBlockTabs\n showLineNumbers\n linux={`sudo systemctl status bee \\njournalctl --lines=100 --follow --unit bee`}\n mac={`brew services list \\ntail -f /usr/local/var/log/swarm-bee/bee.log`}\n />\n <li>\n Lastly, check your nodes configuration settings to validate the debug API is enabled and the Cross\n Origin Resource Sharing (CORS) setting is configured to allow your host. Config parameter{' '}\n <strong>debug-api-enable</strong> must be set to <strong>true</strong> and{' '}\n <strong>cors-allowed-origins</strong> must be set to your host domain or IP (you can also use the\n wildcard <code>{\"cors-allowed-origins: ['*']\"}</code>). If edits are made to the configuration run\n the restart command below for changes to take effect.\n </li>\n <CodeBlockTabs\n showLineNumbers\n linux={`sudo vi /etc/bee/bee.yaml\\nsudo systemctl restart bee`}\n mac={`sudo vi /usr/local/etc/swarm-bee/bee.yaml \\nbrew services restart swarm-bee`}\n />\n </ol>\n </Typography>\n </AccordionDetails>\n </Accordion>\n </Typography>\n </div>\n </div>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { Typography, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core/'\nimport { ExpandMoreSharp } from '@material-ui/icons/'\n\nimport ConnectToHost from '../../../components/ConnectToHost'\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\nimport { Context as SettingsContext } from '../../../providers/Settings'\n\ntype Props = StatusHookCommon\n\nexport default function NodeConnectionCheck({ isOk }: Props): ReactElement | null {\n const { setApiUrl, apiUrl } = useContext(SettingsContext)\n\n return (\n <div>\n <div style={{ display: 'flex', marginBottom: '25px' }}>\n <span style={{ marginRight: '15px' }}>\n Node API (<Typography variant=\"button\">{apiUrl}</Typography>)\n </span>\n <ConnectToHost setHost={setApiUrl} defaultHost={apiUrl} />\n </div>\n <div>\n {!isOk && (\n <Typography component=\"div\" variant=\"body2\" gutterBottom style={{ margin: '15px' }}>\n We cannot connect to your nodes API at <Typography variant=\"button\">{apiUrl}</Typography>. Please check the\n following to troubleshoot your issue.\n <Accordion style={{ marginTop: '20px' }}>\n <AccordionSummary expandIcon={<ExpandMoreSharp />} aria-controls=\"panel1a-content\" id=\"panel1a-header\">\n <Typography>Troubleshoot</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography component=\"div\">\n <ol>\n <li>Check the status of your node by running the below command to see if your node is running.</li>\n <CodeBlockTabs showLineNumbers linux={`sudo systemctl status bee`} mac={`brew services list`} />\n <li>\n If your node is running, check your firewall settings to make sure that port 1633 (or your custom\n specified port) is exposed to the internet. If your node is not running try executing the below\n command to start your bee node\n </li>\n <CodeBlockTabs\n showLineNumbers\n linux={`sudo systemctl start bee`}\n mac={`brew services start swarm-bee`}\n />\n <li>Run the commands to validate your node is running and see the log output.</li>\n <CodeBlockTabs\n showLineNumbers\n linux={`sudo systemctl status bee \\njournalctl --lines=100 --follow --unit bee`}\n mac={`brew services list \\ntail -f /usr/local/var/log/swarm-bee/bee.log`}\n />\n </ol>\n </Typography>\n </AccordionDetails>\n </Accordion>\n </Typography>\n )}\n </div>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport { Typography } from '@material-ui/core/'\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\n\ntype Props = StatusNodeVersionHook\n\nexport default function VersionCheck({ isOk, userVersion, latestVersion, latestUrl }: Props): ReactElement | null {\n const version = (\n <div style={{ display: 'flex' }}>\n <div style={{ marginRight: '30px' }}>\n <p>\n <span>User Version</span>\n </p>\n <Typography component=\"h5\" variant=\"h5\">\n <span>{userVersion}</span>\n </Typography>\n </div>\n <div>\n <p>\n <span>Latest Version</span>\n </p>\n <Typography component=\"h5\" variant=\"h5\">\n <span>{latestVersion}</span>\n </Typography>\n </div>\n </div>\n )\n\n // Running latest bee version\n if (isOk) {\n return (\n <>\n <span>You are running the latest version of Bee</span>\n {version}\n </>\n )\n }\n\n // Old version or not connected to bee debug API\n return (\n <>\n <span>\n Your Bee version is out of date. Please update to the{' '}\n <a href={latestUrl} rel=\"noreferrer\" target=\"_blank\">\n latest\n </a>{' '}\n before continuing. Rerun the installation script below to upgrade. Reference the docs for help with updating.{' '}\n <a href=\"https://docs.ethswarm.org/docs/installation/manual#upgrading-bee\" rel=\"noreferrer\" target=\"_blank\">\n Docs\n </a>\n </span>\n <CodeBlockTabs\n showLineNumbers\n linux={`bee version\\nwget https://github.com/ethersphere/bee/releases/download/${latestVersion}/bee_${latestVersion}_amd64.deb\\nsudo dpkg -i bee_${latestVersion}_amd64.deb`}\n mac={`bee version\\nbrew tap ethersphere/tap\\nbrew install swarm-bee\\nbrew services start swarm-bee`}\n />\n {version}\n </>\n )\n}\n","import type { ReactElement } from 'react'\nimport { Typography } from '@material-ui/core/'\nimport EthereumAddress from '../../../components/EthereumAddress'\n\ntype Props = StatusEthereumConnectionHook\n\nexport default function EthereumConnectionCheck({ isOk, nodeAddresses }: Props): ReactElement | null {\n if (isOk) {\n return (\n <div>\n <Typography variant=\"subtitle1\" gutterBottom>\n Node Address\n </Typography>\n <EthereumAddress address={nodeAddresses?.ethereum} />\n </div>\n )\n }\n\n return (\n <p>\n Your Bee node must have access to the xDai blockchain, so that it can interact and deploy your chequebook\n contract. You can run{' '}\n <a href=\"https://www.xdaichain.com/\" rel=\"noreferrer\" target=\"_blank\">\n your own xDai node\n </a>\n , or use a provider instead - we recommend{' '}\n <a href=\"https://getblock.io/\" rel=\"noreferrer\" target=\"_blank\">\n Getblock\n </a>\n . By default, Bee expects a local node at http://localhost:8545. To use a provider instead, simply change the{' '}\n <strong>swap-endpoint</strong> in your configuration file.\n </p>\n )\n}\n","import { ReactElement, useState } from 'react'\nimport Button from '@material-ui/core/Button'\nimport Input from '@material-ui/core/Input'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogContentText from '@material-ui/core/DialogContentText'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport FormHelperText from '@material-ui/core/FormHelperText'\nimport { Token } from '../models/Token'\nimport type { BigNumber } from 'bignumber.js'\nimport { useSnackbar } from 'notistack'\n\ninterface Props {\n successMessage: string\n errorMessage: string\n dialogMessage: string\n label: string\n max?: BigNumber\n min?: BigNumber\n action: (amount: bigint) => Promise<string>\n}\n\nexport default function WithdrawDepositModal({\n successMessage,\n errorMessage,\n dialogMessage,\n min,\n max,\n label,\n action,\n}: Props): ReactElement {\n const [open, setOpen] = useState(false)\n const [amount, setAmount] = useState('')\n const [amountToken, setAmountToken] = useState<Token | null>(null)\n const [amountError, setAmountError] = useState<Error | null>(null)\n const { enqueueSnackbar } = useSnackbar()\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const handleAction = async () => {\n if (amountToken === null) return\n\n try {\n const transactionHash = await action(amountToken.toBigInt as bigint)\n setOpen(false)\n enqueueSnackbar(`${successMessage} Transaction ${transactionHash}`, { variant: 'success' })\n } catch (e) {\n enqueueSnackbar(`${errorMessage} Error: ${e.message}`, { variant: 'error' })\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n const value = e.target.value\n setAmount(value)\n setAmountError(null)\n try {\n const t = Token.fromDecimal(value)\n setAmountToken(t)\n\n if (min && t.toDecimal.isLessThan(min)) setAmountError(new Error(`Needs to be more than ${min}`))\n\n if (max && t.toDecimal.isGreaterThan(max)) setAmountError(new Error(`Needs to be less than ${max}`))\n } catch (e) {\n setAmountError(e)\n }\n }\n\n return (\n <div>\n <Button variant=\"outlined\" color=\"primary\" onClick={handleClickOpen}>\n {label}\n </Button>\n <Dialog open={open} onClose={handleClose} aria-labelledby=\"form-dialog-title\">\n <DialogTitle id=\"form-dialog-title\">{label}</DialogTitle>\n <DialogContent>\n <DialogContentText>{dialogMessage}</DialogContentText>\n <Input\n autoFocus\n margin=\"dense\"\n id=\"name\"\n type=\"text\"\n placeholder=\"Amount\"\n fullWidth\n value={amount}\n onChange={handleChange}\n />\n {amountError && (\n <FormHelperText error>\n Please provide valid BZZ amount (max 16 decimals). Error: {amountError.message}\n </FormHelperText>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n <Button onClick={handleAction} color=\"primary\">\n {label}\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { Context as SettingsContext } from '../providers/Settings'\n\nimport WithdrawDepositModal from '../components/WithdrawDepositModal'\nimport { BigNumber } from 'bignumber.js'\n\nexport default function DepositModal(): ReactElement {\n const { beeDebugApi } = useContext(SettingsContext)\n\n return (\n <WithdrawDepositModal\n successMessage=\"Successful deposit.\"\n errorMessage=\"Error with depositing\"\n dialogMessage=\"Specify the amount of BZZ you would like to withdraw from your node.\"\n label=\"Deposit\"\n min={new BigNumber(0)}\n action={(amount: bigint) => {\n if (!beeDebugApi) throw new Error('Bee Debug URL is not valid')\n\n return beeDebugApi.depositTokens(amount.toString())\n }}\n />\n )\n}\n","import { Typography } from '@material-ui/core/'\nimport EthereumAddress from '../../../components/EthereumAddress'\nimport DepositModal from '../../../containers/DepositModal'\nimport type { ReactElement } from 'react'\n\ninterface Props extends StatusHookCommon {\n chequebookAddress?: string\n}\n\nconst ChequebookDeployFund = ({ chequebookAddress, isOk }: Props): ReactElement | null => {\n return (\n <div>\n <p style={{ marginBottom: '20px', display: 'flex' }}>{chequebookAddress && <DepositModal />}</p>\n <div style={{ marginBottom: '10px' }}>\n {!isOk && (\n <div>\n <span>\n Your chequebook is either not deployed or funded. To run the node you will need xDAI and xBZZ on the xDai\n network. You may need to aquire BZZ through (e.g. <a href=\"https://bzz.exchange/\">bzz.exchange</a>) and\n bridge it to the xDai network through the <a href=\"https://omni.xdaichain.com/bridge\">omni bridge</a>. To\n pay the transaction fees, you will also need xDAI token. You can purchase DAI on the network and bridge it\n to xDai network through the <a href=\"https://bridge.xdaichain.com/\">xDai Bridge</a>. See the{' '}\n <a href=\"https://www.xdaichain.com/#xdai-stable-chain\">official xDai website</a> for more information.\n </span>\n </div>\n )}\n </div>\n <Typography variant=\"subtitle1\" gutterBottom>\n Chequebook Address\n </Typography>\n <EthereumAddress address={chequebookAddress} />\n </div>\n )\n}\n\nexport default ChequebookDeployFund\n","import type { ReactElement } from 'react'\nimport { Typography } from '@material-ui/core/'\n\ntype Props = StatusTopologyHook\n\nexport default function PeerConnection({ isOk, topology }: Props): ReactElement | null {\n const peers = (\n <div style={{ display: 'flex', marginTop: '15px' }}>\n <div style={{ marginRight: '30px' }}>\n <Typography component=\"div\" variant=\"subtitle1\" gutterBottom color=\"textSecondary\">\n <span>Connected Peers</span>\n </Typography>\n <Typography component=\"h2\" variant=\"h5\">\n {topology?.connected ? topology.connected : '-'}\n </Typography>\n </div>\n <div>\n <Typography component=\"div\" variant=\"subtitle1\" gutterBottom color=\"textSecondary\">\n <span>Discovered Nodes</span>\n </Typography>\n <Typography component=\"h2\" variant=\"h5\">\n {topology?.population ? topology.population : '-'}\n </Typography>\n </div>\n </div>\n )\n\n if (isOk) {\n return (\n <>\n <span>You are connected to peers!</span>\n {peers}\n </>\n )\n }\n\n return (\n <>\n <span>Your node is not connected to any peers</span>\n {peers}\n </>\n )\n}\n","import { ReactElement, useState, useContext } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Typography, Paper, Button, Step, StepLabel, StepContent, Stepper, StepButton } from '@material-ui/core/'\nimport { CheckCircle, Error, ExpandLessSharp, ExpandMoreSharp, Autorenew } from '@material-ui/icons/'\n\nimport DebugConnectionCheck from './SetupSteps/DebugConnectionCheck'\nimport NodeConnectionCheck from './SetupSteps/NodeConnectionCheck'\nimport VersionCheck from './SetupSteps/VersionCheck'\nimport EthereumConnectionCheck from './SetupSteps/EthereumConnectionCheck'\nimport ChequebookDeployFund from './SetupSteps/ChequebookDeployFund'\nimport PeerConnection from './SetupSteps/PeerConnection'\nimport { Context } from '../../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: theme.spacing(2),\n width: '100%',\n },\n button: {\n marginTop: theme.spacing(1),\n marginRight: theme.spacing(1),\n },\n actionsContainer: {\n margin: theme.spacing(2),\n },\n }),\n)\n\ninterface Step {\n label: string\n isOk: boolean\n component: ReactElement\n}\n\nexport default function NodeSetupWorkflow(): ReactElement {\n const classes = useStyles()\n const [activeStep, setActiveStep] = useState(-1)\n\n const {\n status,\n isLoading,\n latestUserVersion,\n latestPublishedVersion,\n isLatestBeeVersion,\n latestBeeVersionUrl,\n topology,\n nodeAddresses,\n chequebookAddress,\n } = useContext(Context)\n\n const steps: Step[] = [\n {\n label: 'Connected to Node DebugAPI',\n isOk: status.debugApiConnection,\n component: <DebugConnectionCheck isOk={status.debugApiConnection} />,\n },\n {\n label: 'Running latest Bee version',\n isOk: status.version,\n component: (\n <VersionCheck\n isOk={status.version}\n isLatestBeeVersion={isLatestBeeVersion}\n userVersion={latestUserVersion}\n latestVersion={latestPublishedVersion}\n latestUrl={latestBeeVersionUrl}\n />\n ),\n },\n {\n label: 'Connected to xDai Blockchain',\n isOk: status.blockchainConnection,\n component: <EthereumConnectionCheck isOk={status.blockchainConnection} nodeAddresses={nodeAddresses} />,\n },\n {\n label: 'Deployed and Funded Chequebook',\n isOk: status.chequebook,\n component: (\n <ChequebookDeployFund chequebookAddress={chequebookAddress?.chequebookAddress} isOk={status.chequebook} />\n ),\n },\n {\n label: 'Connected to Node API',\n isOk: status.apiConnection,\n component: <NodeConnectionCheck isOk={status.apiConnection} />,\n },\n {\n label: 'Connected to Peers',\n isOk: status.topology,\n component: <PeerConnection isOk={status.topology} topology={topology} />,\n },\n ]\n\n const handleNext = () => {\n setActiveStep(prevActiveStep => prevActiveStep + 1)\n }\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1)\n }\n\n return (\n <Paper className={classes.root}>\n <Typography variant=\"h5\" gutterBottom>\n Node Setup\n </Typography>\n <Stepper nonLinear activeStep={activeStep} orientation=\"vertical\">\n {steps.map(({ label, isOk, component }, index) => (\n <Step key={label}>\n <StepLabel\n onClick={() => setActiveStep(index === activeStep ? steps.length : index)}\n StepIconComponent={() => {\n if (isLoading) return <Autorenew style={{ height: '25px', cursor: 'pointer' }} />\n\n if (isOk) return <CheckCircle style={{ color: '#32c48d', height: '25px', cursor: 'pointer' }} />\n\n return <Error style={{ color: '#c9201f', height: '25px', cursor: 'pointer' }} />\n }}\n >\n <StepButton\n disabled={isLoading}\n onClick={() => setActiveStep(index === activeStep ? steps.length : index)}\n style={{ justifyContent: 'space-between' }}\n >\n <div style={{ display: 'flex' }}>\n <div style={{ marginTop: '5px' }}>{label}</div>\n <div style={{ marginLeft: '12px' }}>\n {index === activeStep ? <ExpandLessSharp /> : <ExpandMoreSharp />}\n </div>\n </div>\n </StepButton>\n </StepLabel>\n <StepContent>\n <Typography component=\"div\">{component}</Typography>\n <div className={classes.actionsContainer}>\n <div>\n <Button disabled={activeStep === 0} onClick={handleBack} className={classes.button}>\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" onClick={handleNext} className={classes.button}>\n {index < steps.length - 1 ? 'Next' : 'Finish'}\n </Button>\n </div>\n </div>\n </StepContent>\n </Step>\n ))}\n </Stepper>\n </Paper>\n )\n}\n","import { ReactElement, useState, useContext } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Paper, InputBase, IconButton, FormHelperText } from '@material-ui/core'\nimport { Search } from '@material-ui/icons'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { Utils } from '@ethersphere/bee-js'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: theme.spacing(0.25),\n display: 'flex',\n alignItems: 'center',\n },\n input: {\n marginLeft: theme.spacing(1),\n flex: 1,\n },\n iconButton: {\n padding: 10,\n },\n divider: {\n height: 28,\n margin: 4,\n },\n }),\n)\n\nexport default function Files(): ReactElement {\n const classes = useStyles()\n const { apiUrl } = useContext(SettingsContext)\n\n const [referenceInput, setReferenceInput] = useState('')\n const [referenceError, setReferenceError] = useState<Error | null>(null)\n\n const handleReferenceChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setReferenceInput(e.target.value)\n\n if (Utils.Hex.isHexString(e.target.value, 64) || Utils.Hex.isHexString(e.target.value, 128)) setReferenceError(null)\n else setReferenceError(new Error('Incorrect format of swarm hash'))\n }\n\n return (\n <>\n <Paper className={classes.root}>\n <InputBase\n className={classes.input}\n placeholder=\"Enter swarm reference e.g. 0773a91efd6547c754fc1d95fb1c62c7d1b47f959c2caa685dfec8736da95c1c\"\n inputProps={{ 'aria-label': 'retrieve file from swarm' }}\n value={referenceInput}\n onChange={handleReferenceChange}\n />\n <IconButton\n href={`${apiUrl}/bzz/${referenceInput}`}\n target=\"_blank\"\n disabled={referenceError !== null || !referenceInput}\n className={classes.iconButton}\n aria-label=\"download\"\n >\n <Search />\n </IconButton>\n </Paper>\n {referenceError && <FormHelperText error>{referenceError.message}</FormHelperText>}\n </>\n )\n}\n","import Collapse from '@material-ui/core/Collapse'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { Alert, AlertTitle } from '@material-ui/lab'\nimport { ReactElement } from 'react'\n\nconst LIMIT = 100_000_000 // 100 megabytes\n\ninterface Props {\n file: File\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n }),\n)\n\nexport default function UploadSizeAlert(props: Props): ReactElement | null {\n const classes = useStyles()\n\n const aboveLimit = props.file.size >= LIMIT\n\n return (\n <Collapse in={aboveLimit}>\n <div className={classes.root}>\n <Alert severity=\"warning\">\n <AlertTitle>Warning</AlertTitle>\n The file you are trying to upload is above the recommended size. The chunks may not be synchronised properly\n over the network.\n </Alert>\n </div>\n </Collapse>\n )\n}\n","import type { ReactElement } from 'react'\nimport { Typography } from '@material-ui/core'\n\nfunction truncStringPortion(str: string, firstCharCount = 10, endCharCount = 10) {\n return `${str.substring(0, firstCharCount)}...${str.substring(str.length - endCharCount, str.length)}`\n}\n\ninterface Props {\n peerId: string\n characterLength?: number\n}\n\nexport default function PeerDetail({ peerId, characterLength }: Props): ReactElement {\n return (\n <Typography\n variant=\"button\"\n style={{\n fontFamily: 'monospace, monospace',\n }}\n >\n {truncStringPortion(peerId, characterLength, characterLength)}\n </Typography>\n )\n}\n","import { PostageBatch } from '@ethersphere/bee-js'\nimport { createContext, ReactChild, ReactElement, useEffect, useState, useContext } from 'react'\nimport { Context as SettingsContext } from './Settings'\n\nexport interface EnrichedPostageBatch extends PostageBatch {\n usage: number\n usageText: string\n}\n\ninterface ContextInterface {\n stamps: EnrichedPostageBatch[] | null\n error: Error | null\n isLoading: boolean\n lastUpdate: number | null\n start: (frequency?: number) => void\n stop: () => void\n refresh: () => Promise<void>\n}\n\nconst initialValues: ContextInterface = {\n stamps: null,\n error: null,\n isLoading: false,\n lastUpdate: null,\n start: () => {}, // eslint-disable-line\n stop: () => {}, // eslint-disable-line\n refresh: () => Promise.reject(),\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction enrichStamp(postageBatch: PostageBatch): EnrichedPostageBatch {\n const { depth, bucketDepth, utilization } = postageBatch\n\n const usage = utilization / Math.pow(2, depth - bucketDepth)\n const usageText = `${Math.ceil(usage * 100)}%`\n\n return {\n ...postageBatch,\n usage,\n usageText,\n }\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const { beeApi } = useContext(SettingsContext)\n const [stamps, setStamps] = useState<EnrichedPostageBatch[] | null>(initialValues.stamps)\n const [error, setError] = useState<Error | null>(initialValues.error)\n const [isLoading, setIsLoading] = useState<boolean>(initialValues.isLoading)\n const [lastUpdate, setLastUpdate] = useState<number | null>(initialValues.lastUpdate)\n const [frequency, setFrequency] = useState<number | null>(null)\n\n const refresh = async () => {\n // Don't want to refresh when already refreshing\n if (isLoading) return\n\n if (!beeApi) return\n\n try {\n setIsLoading(true)\n const stamps = await beeApi.getAllPostageBatch()\n\n setStamps(stamps.map(enrichStamp))\n setLastUpdate(Date.now())\n } catch (e) {\n setError(e)\n } finally {\n setIsLoading(false)\n }\n }\n\n const start = (freq = 30000) => setFrequency(freq)\n const stop = () => setFrequency(null)\n\n // Start the update loop\n useEffect(() => {\n refresh()\n\n // Start autorefresh only if the frequency is set\n if (frequency) {\n const interval = setInterval(refresh, frequency)\n\n return () => clearInterval(interval)\n }\n }, [frequency])\n\n return (\n <Context.Provider value={{ stamps, error, isLoading, lastUpdate, start, stop, refresh }}>\n {children}\n </Context.Provider>\n )\n}\n","import React, { ReactElement, useContext } from 'react'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogContentText from '@material-ui/core/DialogContentText'\nimport CircularProgress from '@material-ui/core/CircularProgress'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport BigNumber from 'bignumber.js'\nimport { FormikHelpers, Form, Field, Formik } from 'formik'\nimport { TextField } from 'formik-material-ui'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { Context } from '../../providers/Stamps'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { useSnackbar } from 'notistack'\n\ninterface FormValues {\n depth?: string\n amount?: string\n label?: string\n}\ntype FormErrors = Partial<FormValues>\nconst initialFormValues: FormValues = {\n depth: '',\n amount: '',\n label: '',\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n wrapper: {\n margin: theme.spacing(1),\n position: 'relative',\n },\n field: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n buttonProgress: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginBottom: -12,\n },\n }),\n)\n\ninterface Props {\n label?: string\n}\n\nexport default function FormDialog({ label }: Props): ReactElement {\n const classes = useStyles()\n const [open, setOpen] = React.useState(false)\n const { refresh } = useContext(Context)\n const { beeApi } = useContext(SettingsContext)\n const handleClickOpen = () => setOpen(true)\n const handleClose = () => setOpen(false)\n const { enqueueSnackbar } = useSnackbar()\n\n return (\n <Formik\n initialValues={initialFormValues}\n onSubmit={async (values: FormValues, actions: FormikHelpers<FormValues>) => {\n try {\n // This is really just a typeguard, the validation pretty much guarantees these will have the right values\n if (!values.depth || !values.amount) return\n\n if (!beeApi) return\n\n const amount = BigInt(values.amount)\n const depth = Number.parseInt(values.depth)\n const options = values.label ? { label: values.label } : undefined\n await beeApi.createPostageBatch(amount.toString(), depth, options)\n actions.resetForm()\n await refresh()\n handleClose()\n } catch (e) {\n enqueueSnackbar(`Error: ${e.message}`, { variant: 'error' })\n actions.setSubmitting(false)\n }\n }}\n validate={(values: FormValues) => {\n const errors: FormErrors = {}\n\n // Depth\n if (!values.depth) errors.depth = 'Required field'\n else {\n const depth = new BigNumber(values.depth)\n\n if (!depth.isInteger()) errors.depth = 'Depth must be an integer'\n else if (depth.isLessThan(16)) errors.depth = 'Minimal depth is 16'\n else if (depth.isGreaterThan(255)) errors.depth = 'Depth has to be at most 255'\n }\n\n // Amount\n if (!values.amount) errors.amount = 'Required field'\n else {\n const amount = new BigNumber(values.amount)\n\n if (!amount.isInteger()) errors.amount = 'Amount must be an integer'\n else if (amount.isLessThanOrEqualTo(0)) errors.amount = 'Amount must be greater than 0'\n }\n\n // Label\n if (values.label && !/^[0-9a-z]*$/i.test(values.label)) errors.label = 'Label must be an alphanumeric string'\n\n return errors\n }}\n >\n {({ submitForm, isValid, isSubmitting, values }) => (\n <Form>\n <Button variant=\"outlined\" color=\"primary\" onClick={handleClickOpen}>\n {label || 'Buy Postage Stamp'}\n {isSubmitting && <CircularProgress size={24} className={classes.buttonProgress} />}\n </Button>\n <Dialog open={open} onClose={handleClose} aria-labelledby=\"form-dialog-title\">\n <DialogTitle id=\"form-dialog-title\">Purchase new postage stamp</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Provide the depth, amount and optionally the label of the postage stamp. Please refer to the{' '}\n <a href=\"https://docs.ethswarm.org/docs/access-the-swarm/keep-your-data-alive\" target=\"blank\">\n official bee docs\n </a>{' '}\n to understand these values.\n </DialogContentText>\n <Field\n component={TextField}\n required\n name=\"depth\"\n autoFocus\n label=\"Depth\"\n fullWidth\n className={classes.field}\n />\n <Field component={TextField} required name=\"amount\" label=\"Amount\" fullWidth className={classes.field} />\n <Field component={TextField} name=\"label\" label=\"Label\" fullWidth className={classes.field} />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n <div className={classes.wrapper}>\n <Button\n color=\"primary\"\n disabled={isSubmitting || !isValid || !values.amount || !values.depth}\n type=\"submit\"\n variant=\"contained\"\n onClick={submitForm}\n >\n Create\n {isSubmitting && <CircularProgress size={24} className={classes.buttonProgress} />}\n </Button>\n </div>\n </DialogActions>\n </Dialog>\n </Form>\n )}\n </Formik>\n )\n}\n","import Button from '@material-ui/core/Button'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport Menu from '@material-ui/core/Menu'\nimport MenuItem from '@material-ui/core/MenuItem'\nimport React, { ReactElement } from 'react'\nimport PeerDetailDrawer from '../../components/PeerDetail'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\n\ninterface Props {\n stamps: EnrichedPostageBatch[] | null\n selectedStamp: EnrichedPostageBatch | null\n setSelected: (stamp: EnrichedPostageBatch) => void\n}\n\nexport default function SimpleMenu({ stamps, selectedStamp, setSelected }: Props): ReactElement | null {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null)\n\n if (!stamps) return null\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleClose = () => setAnchorEl(null)\n\n return (\n <div>\n <Button aria-controls=\"simple-menu\" aria-haspopup=\"true\" onClick={handleClick}>\n Change\n </Button>\n <Menu id=\"simple-menu\" anchorEl={anchorEl} keepMounted open={Boolean(anchorEl)} onClose={handleClose}>\n {stamps.map(stamp => (\n <MenuItem\n key={stamp.batchID}\n onClick={() => {\n setSelected(stamp)\n handleClose()\n }}\n selected={stamp.batchID === selectedStamp?.batchID}\n >\n <ListItemIcon>{stamp.usageText}</ListItemIcon>\n <PeerDetailDrawer peerId={stamp.batchID} />\n </MenuItem>\n ))}\n </Menu>\n </div>\n )\n}\n","import { Button, CircularProgress, Container } from '@material-ui/core'\nimport Avatar from '@material-ui/core/Avatar'\nimport Chip from '@material-ui/core/Chip'\nimport { DropzoneArea } from 'material-ui-dropzone'\nimport { useSnackbar } from 'notistack'\nimport { ReactElement, useContext, useEffect, useState } from 'react'\nimport UploadSizeAlert from '../../components/AlertUploadSize'\nimport ClipboardCopy from '../../components/ClipboardCopy'\nimport PeerDetailDrawer from '../../components/PeerDetail'\nimport { Context, EnrichedPostageBatch } from '../../providers/Stamps'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport CreatePostageStamp from '../stamps/CreatePostageStampModal'\nimport SelectStamp from './SelectStamp'\n\nconst MAX_FILE_SIZE = 1_000_000_000 // 1 gigabyte\n\nexport default function Files(): ReactElement {\n const [dropzoneKey, setDropzoneKey] = useState(0)\n const [file, setFile] = useState<File | null>(null)\n const [uploadReference, setUploadReference] = useState('')\n const [isUploadingFile, setIsUploadingFile] = useState(false)\n\n const [selectedStamp, setSelectedStamp] = useState<EnrichedPostageBatch | null>(null)\n\n const { isLoading, error, stamps } = useContext(Context)\n const { beeApi } = useContext(SettingsContext)\n const { enqueueSnackbar } = useSnackbar()\n\n // Choose a postage stamp that has the lowest usage\n useEffect(() => {\n if (!selectedStamp && stamps && stamps.length > 0) {\n const stamp = stamps.reduce((prev, curr) => {\n if (curr.usage < prev.usage) return curr\n\n return prev\n }, stamps[0])\n\n setSelectedStamp(stamp)\n }\n }, [isLoading, error, stamps, selectedStamp])\n\n const uploadFile = () => {\n if (file === null || selectedStamp === null) return\n\n if (!beeApi) return\n\n setIsUploadingFile(true)\n beeApi\n .uploadFile(selectedStamp.batchID, file)\n .then(hash => {\n window.setTimeout(() => {\n setFile(null)\n setUploadReference(hash)\n setDropzoneKey(dropzoneKey + 1)\n }, 0)\n })\n .catch(e => enqueueSnackbar(`Error uploading: ${e.message}`, { variant: 'error' }))\n .finally(() => {\n setIsUploadingFile(false)\n })\n }\n\n const handleChange = (files?: File[]) => {\n if (files) {\n setFile(files[0])\n }\n }\n\n return (\n <div>\n <div>\n <DropzoneArea\n key={'dropzone-' + dropzoneKey}\n onChange={handleChange}\n filesLimit={1}\n maxFileSize={MAX_FILE_SIZE}\n />\n <div style={{ marginTop: '15px' }}>\n {selectedStamp && (\n <div style={{ display: 'flex' }}>\n <small>\n with Postage Stamp{' '}\n <Chip\n avatar={<Avatar>{selectedStamp.usageText}</Avatar>}\n label={<PeerDetailDrawer peerId={selectedStamp.batchID} characterLength={6} />}\n deleteIcon={<ClipboardCopy value={selectedStamp.batchID} />}\n onDelete={() => {} /* eslint-disable-line*/}\n variant=\"outlined\"\n />\n </small>\n <SelectStamp stamps={stamps} selectedStamp={selectedStamp} setSelected={setSelectedStamp} />\n </div>\n )}\n {!selectedStamp && <CreatePostageStamp />}\n <Button disabled={!file && isUploadingFile && !selectedStamp} onClick={() => uploadFile()}>\n Upload\n </Button>\n {file && <UploadSizeAlert file={file} />}\n {isUploadingFile && (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )}\n {uploadReference && (\n <div style={{ marginBottom: '15px', display: 'flex' }}>\n <span>{uploadReference}</span>\n <ClipboardCopy value={uploadReference} />\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { ReactElement, useContext } from 'react'\n\nimport { Container } from '@material-ui/core'\n\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context } from '../../providers/Bee'\nimport Download from './Download'\nimport Upload from './Upload'\nimport TabsContainer from '../../components/TabsContainer'\n\nexport default function Files(): ReactElement {\n const { status } = useContext(Context)\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <Container maxWidth=\"sm\">\n <TabsContainer\n values={[\n {\n label: 'download',\n component: <Download />,\n },\n {\n label: 'upload',\n component: <Upload />,\n },\n ]}\n />\n </Container>\n )\n}\n","import { ReactElement, useState, useContext } from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport {\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableRow,\n TableHead,\n Button,\n Paper,\n Tooltip,\n CircularProgress,\n} from '@material-ui/core'\nimport { Autorenew } from '@material-ui/icons'\n\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport type { Peer } from '@ethersphere/bee-js'\n\nconst useStyles = makeStyles({\n table: {\n minWidth: 650,\n },\n})\n\ninterface Props {\n peers: Peer[] | null\n}\n\ninterface PeerLatency {\n rtt: string\n loading: boolean\n}\n\nfunction getPingState(peerLatency: Record<string, PeerLatency>, peer: Peer): ReactElement {\n if (peerLatency[peer.address]?.loading) return <CircularProgress size={20} />\n\n if (peerLatency[peer.address]?.rtt) return <span>{peerLatency[peer.address]?.rtt}</span>\n\n return <Autorenew />\n}\n\nfunction PeerTable(props: Props): ReactElement {\n const classes = useStyles()\n const { beeDebugApi } = useContext(SettingsContext)\n\n const [peerLatency, setPeerLatency] = useState<Record<string, PeerLatency>>({})\n\n const pingPeer = (peerId: string) => {\n setPeerLatency(prevPeerLatency => ({ ...prevPeerLatency, [peerId]: { rtt: '', loading: true } }))\n beeDebugApi\n ?.pingPeer(peerId)\n .then(res => {\n setPeerLatency(prevPeerLatency => ({ ...prevPeerLatency, [peerId]: { rtt: res.rtt, loading: false } }))\n })\n .catch(() => {\n setPeerLatency(prevPeerLatency => ({ ...prevPeerLatency, [peerId]: { rtt: 'error', loading: false } }))\n })\n }\n\n return (\n <div>\n <TableContainer component={Paper}>\n <Table className={classes.table}>\n <TableHead>\n <TableRow>\n <TableCell>Index</TableCell>\n <TableCell>Peer Id</TableCell>\n <TableCell align=\"right\">Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {props.peers?.map((peer: Peer, idx: number) => (\n <TableRow key={peer.address}>\n <TableCell component=\"th\" scope=\"row\">\n {idx + 1}\n </TableCell>\n <TableCell>{peer.address}</TableCell>\n <TableCell align=\"right\">\n <Tooltip title=\"Ping node\">\n <Button color=\"primary\" onClick={() => pingPeer(peer.address)}>\n {getPingState(peerLatency, peer)}\n </Button>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n\nexport default PeerTable\n","const OPTIMAL_CONNECTED_PEERS = 200\nconst OPTIMAL_POPULATION = 100_000\nconst OPTIMAL_DEPTH = 12\n\ninterface Threshold {\n minimumValue: number\n explanation: string\n score: number\n}\n\ntype Thresholds = {\n connectedPeers: Threshold[]\n population: Threshold[]\n depth: Threshold[]\n}\n\ntype ThresholdValue = {\n score: number\n maximumScore: number\n explanation: string\n}\n\nexport type ThresholdValues = {\n connectedPeers: ThresholdValue\n population: ThresholdValue\n depth: ThresholdValue\n}\n\nconst GENERIC_ERROR = 'There may be issues with your Bee node or connection.'\n\nconst THRESHOLDS: Thresholds = {\n connectedPeers: [\n {\n minimumValue: OPTIMAL_CONNECTED_PEERS,\n explanation: `Perfect! ${OPTIMAL_CONNECTED_PEERS} or more connected peers indicate a healthy topology.`,\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Your Bee node is connected to peers, but this number should ideally be above ${OPTIMAL_CONNECTED_PEERS}. If you have only started your Bee node, this number may increase quickly.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has not connected to any peers. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n population: [\n {\n minimumValue: OPTIMAL_POPULATION,\n explanation:\n 'Perfect! Your Bee node seems to have a realistic value for the network size, which means everything is working well on your end.',\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Population is usually above ${OPTIMAL_POPULATION.toLocaleString()}. If the number does not increase within a few hours, there may be issues with your Bee node.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has no information on the network population. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n depth: [\n {\n minimumValue: OPTIMAL_DEPTH,\n explanation: 'Perfect! Your Bee node has the highest available depth.',\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Your Bee node is supposed to reach a depth of ${OPTIMAL_DEPTH} eventually. Stagnation or decrease in this number may indicate problems with your Bee node.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has not started building its topology yet. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n}\n\nexport function pickThreshold(key: keyof Thresholds, value: number): ThresholdValue {\n const thresholds = THRESHOLDS[key]\n const maximumScore = thresholds[0].score\n for (const item of thresholds) {\n if (value >= item.minimumValue) {\n return {\n score: item.score,\n maximumScore,\n explanation: item.explanation,\n }\n }\n }\n const last = thresholds[thresholds.length - 1]\n\n return {\n score: last.score,\n maximumScore,\n explanation: last.explanation,\n }\n}\n","import { Grid, Tooltip, Typography } from '@material-ui/core/'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Info } from '@material-ui/icons'\nimport type { ReactElement } from 'react'\n\ninterface TitleProps {\n label: string\n tooltip?: string\n}\n\nconst useStyles = makeStyles({\n title: {\n fontSize: 16,\n },\n})\n\nexport function Title({ label, tooltip }: TitleProps): ReactElement {\n const classes = useStyles()\n\n if (!tooltip) {\n return (\n <Typography className={classes.title} color=\"textSecondary\" gutterBottom>\n {label}\n </Typography>\n )\n }\n\n // span is needed as Tooltip expects a non-functional element!\n return (\n <Tooltip title={tooltip}>\n <span>\n <Grid container direction=\"row\" justify=\"space-between\">\n <Typography className={classes.title} color=\"textSecondary\" gutterBottom>\n {label}\n </Typography>\n <Info />\n </Grid>\n </span>\n </Tooltip>\n )\n}\n","import { Card, CardContent, Typography } from '@material-ui/core/'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Skeleton } from '@material-ui/lab'\nimport type { ReactElement } from 'react'\nimport { Title } from './Title'\n\nconst useStyles = makeStyles({\n root: {\n minWidth: 275,\n },\n})\n\ninterface Props {\n label: string\n statistic?: string\n loading?: boolean\n tooltip?: string\n}\n\nexport default function StatCard({ loading, label, statistic, tooltip }: Props): ReactElement {\n const classes = useStyles()\n\n return (\n <Card className={classes.root}>\n <CardContent>\n {loading && (\n <>\n <Skeleton width={180} height={25} animation=\"wave\" />\n <Skeleton width={180} height={35} animation=\"wave\" />\n </>\n )}\n {!loading && (\n <>\n <Title label={label} tooltip={tooltip} />\n <Typography variant=\"h5\" component=\"h2\">\n {statistic}\n </Typography>\n </>\n )}\n </CardContent>\n </Card>\n )\n}\n","import type { Topology } from '@ethersphere/bee-js'\nimport { Grid } from '@material-ui/core/'\nimport type { ReactElement } from 'react'\nimport { pickThreshold, ThresholdValues } from '../utils/threshold'\nimport StatCard from './StatCard'\n\ninterface RootProps {\n topology: Topology | null\n}\n\ninterface Props extends RootProps {\n thresholds: ThresholdValues\n}\n\nconst TopologyStats = (props: RootProps): ReactElement => {\n const thresholds: ThresholdValues = {\n connectedPeers: pickThreshold('connectedPeers', props.topology?.connected || 0),\n population: pickThreshold('population', props.topology?.population || 0),\n depth: pickThreshold('depth', props.topology?.depth || 0),\n }\n\n return (\n <>\n <Indicator {...props} thresholds={thresholds} />\n <Metrics {...props} thresholds={thresholds} />\n </>\n )\n}\n\nconst Indicator = ({ thresholds }: Props): ReactElement => {\n const maximumTotalScore = Object.values(thresholds).reduce((sum, item) => sum + item.maximumScore, 0)\n const actualTotalScore = Object.values(thresholds).reduce((sum, item) => sum + item.score, 0)\n const percentageText = Math.round((actualTotalScore / maximumTotalScore) * 100) + '%'\n\n return (\n <div style={{ marginBottom: '20px' }}>\n <StatCard label=\"Overall Health Indicator\" statistic={percentageText} />\n </div>\n )\n}\n\nconst Metrics = ({ topology, thresholds }: Props): ReactElement => (\n <Grid style={{ marginBottom: '20px', flexGrow: 1 }}>\n <Grid container spacing={3}>\n <Grid key={1} item xs={12} sm={12} md={6} lg={4} xl={4}>\n <StatCard\n label=\"Connected Peers\"\n statistic={topology?.connected.toString()}\n tooltip={thresholds.connectedPeers.explanation}\n />\n </Grid>\n <Grid key={2} item xs={12} sm={12} md={6} lg={4} xl={4}>\n <StatCard\n label=\"Population\"\n statistic={topology?.population.toString()}\n tooltip={thresholds.population.explanation}\n />\n </Grid>\n <Grid key={3} item xs={12} sm={12} md={6} lg={4} xl={4}>\n <StatCard label=\"Depth\" statistic={topology?.depth.toString()} tooltip={thresholds.depth.explanation} />\n </Grid>\n </Grid>\n </Grid>\n)\n\nexport default TopologyStats\n","import PeerTable from './PeerTable'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\n\nimport { Context } from '../../providers/Bee'\nimport TopologyStats from '../../components/TopologyStats'\nimport { ReactElement, useContext } from 'react'\n\nexport default function Peers(): ReactElement {\n const { topology, peers, status } = useContext(Context)\n\n if (!status.all) {\n return <TroubleshootConnectionCard />\n }\n\n return (\n <>\n <TopologyStats topology={topology} />\n <PeerTable peers={peers} />\n </>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { Context as SettingsContext } from '../providers/Settings'\n\nimport WithdrawDepositModal from '../components/WithdrawDepositModal'\nimport { BigNumber } from 'bignumber.js'\n\nexport default function WithdrawModal(): ReactElement {\n const { beeDebugApi } = useContext(SettingsContext)\n\n return (\n <WithdrawDepositModal\n successMessage=\"Successful withdrawl.\"\n errorMessage=\"Error with withdrawing.\"\n dialogMessage=\"Specify the amount of BZZ you would like to withdraw from your node.\"\n label=\"Withdraw\"\n min={new BigNumber(0)}\n action={(amount: bigint) => {\n if (!beeDebugApi) throw new Error('Bee Debug URL is not valid')\n\n return beeDebugApi.withdrawTokens(amount.toString())\n }}\n />\n )\n}\n","import { ReactElement } from 'react'\n\nimport { createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Card, CardContent, Typography, Theme } from '@material-ui/core/'\nimport WithdrawModal from '../../containers/WithdrawModal'\nimport DepositModal from '../../containers/DepositModal'\n\nimport type { ChequebookAddressResponse } from '@ethersphere/bee-js'\nimport { Token } from '../../models/Token'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n display: 'flex',\n },\n buttons: {\n display: 'flex',\n columnGap: theme.spacing(1),\n },\n gridContainer: {\n display: 'flex',\n width: '100%',\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(1),\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(1),\n flex: '0 1 auto',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n chequebookActions: {\n justifyContent: 'space-between',\n display: 'flex',\n marginBottom: theme.spacing(1),\n },\n }),\n)\n\ninterface ChequebookBalance {\n totalBalance: Token\n availableBalance: Token\n}\n\ninterface Props {\n chequebookAddress: ChequebookAddressResponse | null\n chequebookBalance: ChequebookBalance | null\n totalsent?: Token\n totalreceived?: Token\n}\n\nfunction AccountCard({ totalreceived, totalsent, chequebookBalance }: Props): ReactElement {\n const classes = useStyles()\n\n return (\n <div>\n <div className={classes.chequebookActions}>\n <Typography component=\"h2\" variant=\"h6\">\n Chequebook\n </Typography>\n <div className={classes.buttons}>\n <WithdrawModal />\n <DepositModal />\n </div>\n </div>\n\n <Card className={classes.root}>\n <CardContent className={classes.gridContainer}>\n <div>\n <Typography component=\"h2\" variant=\"h6\" color=\"primary\" gutterBottom>\n Total Balance\n </Typography>\n <Typography variant=\"h5\">{chequebookBalance?.totalBalance.toFixedDecimal()} BZZ</Typography>\n </div>\n <div>\n <Typography component=\"h2\" variant=\"h6\" color=\"primary\" gutterBottom>\n Available Uncommitted Balance\n </Typography>\n <Typography variant=\"h5\">{chequebookBalance?.availableBalance.toFixedDecimal()} BZZ</Typography>\n </div>\n <div>\n <Typography component=\"h2\" variant=\"h6\" color=\"primary\" gutterBottom>\n Total Sent / Received\n </Typography>\n <Typography variant=\"h5\">\n {totalsent?.toFixedDecimal()} / {totalreceived?.toFixedDecimal()} BZZ\n </Typography>\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport default AccountCard\n","import { CircularProgress, Container } from '@material-ui/core'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogContentText from '@material-ui/core/DialogContentText'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport { useSnackbar } from 'notistack'\nimport { ReactElement, useState, useContext } from 'react'\nimport { Context as SettingsContext } from '../providers/Settings'\nimport EthereumAddress from './EthereumAddress'\n\ninterface Props {\n peerId: string\n uncashedAmount: string\n}\n\nexport default function CheckoutModal({ peerId, uncashedAmount }: Props): ReactElement {\n const [open, setOpen] = useState<boolean>(false)\n const [loadingCashout, setLoadingCashout] = useState<boolean>(false)\n const { enqueueSnackbar } = useSnackbar()\n const { beeDebugApi } = useContext(SettingsContext)\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const handleCashout = () => {\n if (!beeDebugApi) return\n\n if (peerId) {\n setLoadingCashout(true)\n beeDebugApi\n .cashoutLastCheque(peerId)\n .then(res => {\n setOpen(false)\n enqueueSnackbar(\n <span>\n Successfully cashed out cheque. Transaction\n <EthereumAddress hideBlockie transaction address={res} />\n </span>,\n { variant: 'success' },\n )\n })\n .catch((e: Error) => {\n enqueueSnackbar(<span>Error: {e.message}</span>, { variant: 'error' })\n })\n .finally(() => {\n setLoadingCashout(false)\n })\n } else {\n enqueueSnackbar(<span>Peer Id invalid</span>, { variant: 'error' })\n }\n }\n\n return (\n <div>\n <Button variant=\"contained\" color=\"primary\" onClick={handleClickOpen} style={{ marginLeft: '7px' }}>\n Cashout\n </Button>\n <Dialog open={open} onClose={handleClose} aria-labelledby=\"form-dialog-title\">\n <DialogTitle id=\"form-dialog-title\">Cashout Cheque</DialogTitle>\n <DialogContent>\n <DialogContentText style={{ marginTop: '20px', overflowWrap: 'break-word' }}>\n {loadingCashout && (\n <>\n <span>\n Cashing out <strong>{uncashedAmount}</strong> from Peer <strong>{peerId}</strong>. Please wait...\n </span>\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n </>\n )}\n {!loadingCashout && (\n <span>\n Are you sure you want to cashout <strong>{uncashedAmount} BZZ</strong> from Peer{' '}\n <strong>{peerId}</strong>?\n </span>\n )}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n <Button onClick={handleCashout} color=\"primary\" disabled={loadingCashout}>\n Yes Cashout\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Table, TableBody, TableCell, TableContainer, TableRow, TableHead, Paper } from '@material-ui/core'\n\nimport ClipboardCopy from '../../components/ClipboardCopy'\nimport CashoutModal from '../../components/CashoutModal'\nimport PeerDetailDrawer from '../../components/PeerDetail'\nimport { Accounting } from '../../hooks/accounting'\n\nconst useStyles = makeStyles({\n table: {\n minWidth: 650,\n },\n values: {\n textAlign: 'right',\n fontFamily: 'monospace, monospace',\n },\n})\ninterface Props {\n isLoadingUncashed: boolean\n accounting: Accounting[] | null\n}\n\nfunction BalancesTable({ accounting, isLoadingUncashed }: Props): ReactElement | null {\n if (accounting === null) return null\n const classes = useStyles()\n\n return (\n <TableContainer component={Paper}>\n <Table className={classes.table} size=\"small\" aria-label=\"Balances Table\">\n <TableHead>\n <TableRow>\n <TableCell>Peer</TableCell>\n <TableCell align=\"right\">Outstanding Balance</TableCell>\n <TableCell align=\"right\">Settlements Sent / Received</TableCell>\n <TableCell align=\"right\">Total</TableCell>\n <TableCell align=\"right\">Uncashed Amount</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {accounting.map(({ peer, balance, received, sent, uncashedAmount, total }) => (\n <TableRow key={peer}>\n <TableCell>\n <div style={{ display: 'flex' }}>\n <small>\n <PeerDetailDrawer peerId={peer} />\n </small>\n <ClipboardCopy value={peer} />\n </div>\n </TableCell>\n <TableCell className={classes.values}>\n <span\n style={{\n color: balance.toBigNumber.isPositive() ? '#32c48d' : '#c9201f',\n }}\n >\n {balance.toFixedDecimal()}\n </span>{' '}\n BZZ\n </TableCell>\n <TableCell className={classes.values}>\n -{sent.toFixedDecimal()} / {received.toFixedDecimal()} BZZ\n </TableCell>\n <TableCell className={classes.values}>\n <span\n style={{\n color: total.toBigNumber.isPositive() ? '#32c48d' : '#c9201f',\n }}\n >\n {total.toFixedDecimal()}\n </span>{' '}\n BZZ\n </TableCell>\n <TableCell className={classes.values}>\n {isLoadingUncashed && 'loading...'}\n {!isLoadingUncashed && (\n <>{uncashedAmount.toBigNumber.isGreaterThan('0') ? uncashedAmount.toFixedDecimal() : '0'} BZZ</>\n )}\n </TableCell>\n <TableCell className={classes.values}>\n {uncashedAmount.toBigNumber.isGreaterThan('0') && (\n <CashoutModal uncashedAmount={uncashedAmount.toFixedDecimal()} peerId={peer} />\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n )\n}\n\nexport default BalancesTable\n","import { LastCashoutActionResponse, BeeDebug } from '@ethersphere/bee-js'\nimport { useEffect, useState } from 'react'\nimport { Token } from '../models/Token'\nimport { makeRetriablePromise, unwrapPromiseSettlements } from '../utils'\nimport { Balance, Settlements, Settlement } from '../types'\n\ninterface UseAccountingHook {\n isLoadingUncashed: boolean\n accounting: Accounting[] | null\n}\n\nexport interface Accounting {\n peer: string\n uncashedAmount: Token\n balance: Token\n received: Token\n sent: Token\n total: Token\n}\n\n/**\n * Merges the balances, settlements and uncashedAmounts arrays into single array which is sorted by uncashed amounts (if any)\n *\n * @param balances Balances for all peers\n * @param settlements Settlements for all peers which has some settlement\n * @param uncashedAmounts Array of getPeerLastCashout responses which is needed to calculate uncashed amount\n *\n * @returns\n */\nfunction mergeAccounting(\n balances: Balance[] | null,\n settlements?: Settlement[],\n uncashedAmounts?: LastCashoutActionResponse[],\n): Accounting[] | null {\n // Settlements or balances are still loading or there is an error -> return null\n if (!balances || !settlements) return null\n\n const accounting: Record<string, Accounting> = {}\n\n balances.forEach(\n // Some peers may not have settlement but all have balance (therefore initialize sent, received and uncashed to 0)\n ({ peer, balance }) =>\n (accounting[peer] = {\n peer,\n balance,\n sent: new Token('0'),\n received: new Token('0'),\n uncashedAmount: new Token('0'),\n total: balance,\n }),\n )\n\n settlements.forEach(\n ({ peer, sent, received }) =>\n (accounting[peer] = {\n ...accounting[peer],\n sent,\n received,\n total: new Token(accounting[peer].balance.toBigNumber.plus(received.toBigNumber).minus(sent.toBigNumber)),\n }),\n )\n\n // If there are no cheques (and hence last cashout actions), we don't need to sort and can return values right away\n if (!uncashedAmounts) return Object.values(accounting)\n\n uncashedAmounts?.forEach(({ peer, uncashedAmount }) => {\n accounting[peer].uncashedAmount = new Token(uncashedAmount)\n })\n\n return Object.values(accounting).sort((a, b) =>\n b.uncashedAmount.toBigNumber.minus(a.uncashedAmount.toBigNumber).toNumber(),\n )\n}\n\nexport const useAccounting = (\n beeDebugApi: BeeDebug | null,\n settlements: Settlements | null,\n balances: Balance[] | null,\n): UseAccountingHook => {\n const [isLoadingUncashed, setIsloadingUncashed] = useState<boolean>(false)\n const [uncashedAmounts, setUncashedAmounts] = useState<LastCashoutActionResponse[] | undefined>(undefined)\n\n useEffect(() => {\n // We don't have any settlements loaded yet or we are already loading/have loaded the uncashed amounts\n if (isLoadingUncashed || !beeDebugApi || !settlements || uncashedAmounts) return\n\n setIsloadingUncashed(true)\n const promises = settlements.settlements\n .filter(({ received }) => received.toBigNumber.gt('0'))\n .map(({ peer }) => makeRetriablePromise(() => beeDebugApi.getLastCashoutAction(peer)))\n\n Promise.allSettled(promises).then(settlements => {\n const results = unwrapPromiseSettlements(settlements)\n setUncashedAmounts(results.fulfilled)\n setIsloadingUncashed(false)\n })\n }, [settlements, isLoadingUncashed, uncashedAmounts])\n\n const accounting = mergeAccounting(balances, settlements?.settlements, uncashedAmounts)\n\n return {\n isLoadingUncashed,\n accounting,\n }\n}\n","import { ReactElement, useContext } from 'react'\nimport { Theme, createStyles, makeStyles } from '@material-ui/core/styles'\n\nimport AccountCard from '../accounting/AccountCard'\nimport BalancesTable from './BalancesTable'\nimport EthereumAddressCard from '../../components/EthereumAddressCard'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context as BeeContext } from '../../providers/Bee'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { useAccounting } from '../../hooks/accounting'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n display: 'grid',\n rowGap: theme.spacing(3),\n },\n }),\n)\n\nexport default function Accounting(): ReactElement {\n const classes = useStyles()\n\n const { status, nodeAddresses, chequebookAddress, chequebookBalance, settlements, peerBalances } =\n useContext(BeeContext)\n const { beeDebugApi } = useContext(SettingsContext)\n\n const { accounting, isLoadingUncashed } = useAccounting(beeDebugApi, settlements, peerBalances)\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <div className={classes.root}>\n <AccountCard\n chequebookAddress={chequebookAddress}\n chequebookBalance={chequebookBalance}\n totalsent={settlements?.totalSent}\n totalreceived={settlements?.totalReceived}\n />\n <EthereumAddressCard nodeAddresses={nodeAddresses} chequebookAddress={chequebookAddress} />\n <BalancesTable accounting={accounting} isLoadingUncashed={isLoadingUncashed} />\n </div>\n )\n}\n","import React, { ReactElement, useState, useContext } from 'react'\nimport { Paper, Container, TextField, Typography, Button } from '@material-ui/core'\nimport { Context as SettingsContext } from '../../providers/Settings'\n\nexport default function Settings(): ReactElement {\n const { apiUrl, apiDebugUrl, setApiUrl, setDebugApiUrl } = useContext(SettingsContext)\n const [host, setHost] = useState(apiUrl)\n const [debugHost, setDebugHost] = useState(apiDebugUrl)\n\n const submit = () => {\n if (host !== apiUrl) setApiUrl(host)\n\n if (debugHost !== apiDebugUrl) setDebugApiUrl(debugHost)\n }\n\n const touched = host !== apiUrl || debugHost !== apiDebugUrl\n\n return (\n <div>\n <Container>\n <Typography variant=\"h4\" gutterBottom>\n Settings\n </Typography>\n <Paper>\n <TextField\n label=\"API Endpoint\"\n style={{ margin: 0 }}\n placeholder=\"ex: 127.0.0.0.1:1633\"\n helperText=\"Enter node host override / port\"\n fullWidth\n defaultValue={apiUrl}\n margin=\"normal\"\n InputLabelProps={{\n shrink: true,\n }}\n onChange={e => {\n setHost(e.target.value)\n }}\n variant=\"filled\"\n />\n </Paper>\n <Paper style={{ marginTop: '20px' }}>\n <TextField\n label=\"Debug API Endpoint\"\n style={{ margin: 0 }}\n placeholder=\"ex: 127.0.0.0.1:1635\"\n helperText=\"Enter node debug host override / port\"\n fullWidth\n defaultValue={apiDebugUrl}\n onChange={e => {\n setDebugHost(e.target.value)\n }}\n margin=\"normal\"\n InputLabelProps={{\n shrink: true,\n }}\n variant=\"filled\"\n />\n </Paper>\n {touched ? (\n <div style={{ marginTop: '20px' }}>\n <Button variant=\"outlined\" color=\"primary\" onClick={submit}>\n Save\n </Button>\n </div>\n ) : null}\n </Container>\n </div>\n )\n}\n","import { Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport type { ReactElement } from 'react'\nimport ClipboardCopy from '../../components/ClipboardCopy'\nimport PeerDetailDrawer from '../../components/PeerDetail'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\n\nconst useStyles = makeStyles({\n table: {\n minWidth: 650,\n },\n values: {\n textAlign: 'right',\n fontFamily: 'monospace, monospace',\n },\n})\ninterface Props {\n postageStamps: EnrichedPostageBatch[] | null\n}\n\nfunction StampsTable({ postageStamps }: Props): ReactElement | null {\n if (postageStamps === null) return null\n const classes = useStyles()\n\n return (\n <TableContainer component={Paper}>\n <Table className={classes.table} size=\"small\" aria-label=\"Balances Table\">\n <TableHead>\n <TableRow>\n <TableCell>Batch ID</TableCell>\n <TableCell align=\"right\">Usage</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {postageStamps.map(({ batchID, usageText }) => (\n <TableRow key={batchID}>\n <TableCell>\n <div style={{ display: 'flex' }}>\n <small>\n <PeerDetailDrawer peerId={batchID} />\n </small>\n <ClipboardCopy value={batchID} />\n </div>\n </TableCell>\n <TableCell className={classes.values}>{usageText}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n )\n}\n\nexport default StampsTable\n","import type { ReactElement } from 'react'\nimport { Switch } from 'react-router-dom'\n\nimport { Route } from 'react-router-dom'\n\nimport Info from './pages/info'\nimport Status from './pages/status'\nimport Files from './pages/files'\nimport Peers from './pages/peers'\nimport Accounting from './pages/accounting'\nimport Settings from './pages/settings'\nimport Stamps from './pages/stamps'\n\nexport enum ROUTES {\n INFO = '/',\n FILES = '/files',\n PEERS = '/peers',\n ACCOUNTING = '/accounting',\n SETTINGS = '/settings',\n STAMPS = '/stamps',\n STATUS = '/status',\n}\n\nconst BaseRouter = (): ReactElement => (\n <Switch>\n <Route exact path={ROUTES.INFO} component={Info} />\n <Route exact path={ROUTES.FILES} component={Files} />\n <Route exact path={ROUTES.PEERS} component={Peers} />\n <Route exact path={ROUTES.ACCOUNTING} component={Accounting} />\n <Route exact path={ROUTES.SETTINGS} component={Settings} />\n <Route exact path={ROUTES.STAMPS} component={Stamps} />\n <Route exact path={ROUTES.STATUS} component={Status} />\n </Switch>\n)\n\nexport default BaseRouter\n","import { ReactElement, useContext, useEffect } from 'react'\nimport { Theme, createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Container, CircularProgress } from '@material-ui/core'\n\nimport StampsTable from './StampsTable'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport CreatePostageStampModal from './CreatePostageStampModal'\n\nimport { Context } from '../../providers/Stamps'\nimport { Context as BeeContext } from '../../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n display: 'grid',\n rowGap: theme.spacing(2),\n },\n actions: {\n display: 'flex',\n width: '100%',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(1),\n flex: '0 1 auto',\n flexWrap: 'wrap',\n alignItems: 'center',\n },\n }),\n)\n\nexport default function Accounting(): ReactElement {\n const classes = useStyles()\n\n const beeContext = useContext(BeeContext)\n const { stamps, isLoading, error, start, stop } = useContext(Context)\n useEffect(() => {\n start()\n\n return () => stop()\n }, [])\n\n if (beeContext.isLoading) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (!beeContext.status.all) return <TroubleshootConnectionCard />\n\n return (\n <div className={classes.root}>\n {error && (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n Error loading postage stamps details: {error.message}\n </Container>\n )}\n {!error && (\n <>\n <div className={classes.actions}>\n <CreatePostageStampModal />\n <div style={{ height: '5px' }}>{isLoading && <CircularProgress />}</div>\n </div>\n <StampsTable postageStamps={stamps} />\n </>\n )}\n </div>\n )\n}\n","import { Component, ErrorInfo, ReactElement } from 'react'\n\ninterface Props {\n children: ReactElement\n}\n\ninterface State {\n error: Error | null\n}\n\nexport default class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props)\n this.state = { error: null }\n }\n\n static getDerivedStateFromError(error: Error): { error: Error } {\n // Update state so the next render will show the fallback UI.\n return { error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // You can also log the error to an error reporting service\n console.error({ error, errorInfo }) // eslint-disable-line\n }\n\n render(): ReactElement {\n if (this.state.error) {\n // You can render any custom fallback UI\n return <h1>Something went wrong. Error: {this.state.error.message}</h1>\n }\n\n return this.props.children\n }\n}\n","import { ReactElement, useState, useContext } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Alert, AlertTitle } from '@material-ui/lab'\nimport Collapse from '@material-ui/core/Collapse'\nimport IconButton from '@material-ui/core/IconButton'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { Context } from '../providers/Bee'\nimport { SUPPORTED_BEE_VERSION_EXACT } from '@ethersphere/bee-js'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n marginBottom: theme.spacing(2),\n },\n }),\n)\n\nexport default function VersionAlert(): ReactElement | null {\n const classes = useStyles()\n const { isLoading, latestUserVersionExact } = useContext(Context)\n const [open, setOpen] = useState<boolean>(true)\n\n const isExactlySupportedBeeVersion = SUPPORTED_BEE_VERSION_EXACT === latestUserVersionExact\n\n if (isLoading || !latestUserVersionExact) return null\n\n return (\n <Collapse in={!isExactlySupportedBeeVersion && open}>\n <div className={classes.root}>\n <Alert\n severity=\"warning\"\n action={\n <IconButton\n aria-label=\"close\"\n color=\"inherit\"\n size=\"small\"\n onClick={() => {\n setOpen(false)\n }}\n >\n <CloseIcon fontSize=\"inherit\" />\n </IconButton>\n }\n >\n <AlertTitle>Warning</AlertTitle>\n Your Bee node version (<code>{latestUserVersionExact}</code>) does not exactly match the Bee version we tested\n the Bee Dashboard against (<code>{SUPPORTED_BEE_VERSION_EXACT}</code>). Please note that some functionality\n may not work properly.\n </Alert>\n </div>\n </Collapse>\n )\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport { useLocation, matchPath } from 'react-router-dom'\n\nimport { createStyles, Theme, makeStyles, withStyles } from '@material-ui/core/styles'\nimport { ListItemText, ListItemIcon, ListItem } from '@material-ui/core'\n\nconst StyledListItem = withStyles((theme: Theme) => ({\n root: {\n paddingLeft: theme.spacing(4),\n paddingRight: theme.spacing(4),\n borderLeft: '4px solid rgba(0,0,0,0)',\n '&.Mui-selected, &.Mui-selected:hover': {\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n },\n },\n button: {\n '&:hover': {\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n },\n },\n },\n}))(ListItem)\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n icon: {\n color: 'inherit',\n },\n activeIcon: {\n color: theme.palette.primary.main,\n },\n }),\n)\n\ninterface Props {\n iconStart?: ReactNode\n iconEnd?: ReactNode\n path?: string\n label: ReactNode\n}\n\nexport default function SideBarItem({ iconStart, iconEnd, path, label }: Props): ReactElement {\n const classes = useStyles()\n const location = useLocation()\n const isSelected = Boolean(matchPath(location.pathname, { path, exact: true }))\n\n return (\n <StyledListItem button selected={isSelected} disableRipple>\n <ListItemIcon className={isSelected ? classes.activeIcon : classes.icon}>{iconStart}</ListItemIcon>\n <ListItemText primary={label} />\n <ListItemIcon className={isSelected ? classes.activeIcon : classes.icon}>{iconEnd}</ListItemIcon>\n </StyledListItem>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { useLocation, matchPath } from 'react-router-dom'\nimport { ArrowRight } from 'react-feather'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\nimport { ListItemText, ListItemIcon, ListItem, Typography } from '@material-ui/core'\nimport { Context } from '../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n icon: {\n color: 'inherit',\n },\n iconSmall: {\n height: theme.spacing(2),\n },\n\n root: {\n height: theme.spacing(4),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(4),\n color: '#f9f9f9',\n borderLeft: '0px solid rgba(0,0,0,0)',\n '&.Mui-selected, &.Mui-selected:hover': {\n borderLeft: `0px solid ${theme.palette.primary.main}`,\n backgroundColor: '#2c2c2c',\n },\n },\n rootError: {\n backgroundColor: 'rgba(255, 58, 82, 0.25)',\n },\n button: {\n '&:hover': {\n backgroundColor: '#2c2c2c',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: '#2c2c2c',\n },\n },\n },\n smallerText: {\n fontSize: '0.9rem',\n },\n }),\n)\n\ninterface Props {\n path?: string\n}\n\nexport default function SideBarItem({ path }: Props): ReactElement {\n const { status } = useContext(Context)\n const classes = useStyles()\n const location = useLocation()\n const isSelected = Boolean(matchPath(location.pathname, { path, exact: true }))\n\n return (\n <ListItem\n button\n classes={{ root: `${classes.root} ${status.all ? '' : classes.rootError}`, button: classes.button }}\n selected={isSelected}\n disableRipple\n >\n <ListItemIcon>\n <span\n style={{\n backgroundColor: status.all ? '#1de600' : '#ff3a52',\n height: '14px',\n width: '14px',\n borderRadius: '50%',\n display: 'inline-block',\n marginLeft: 30,\n }}\n />\n </ListItemIcon>\n <ListItemText\n primary={<Typography className={classes.smallerText}>{`Node ${status.all ? 'OK' : 'Error'}`}</Typography>}\n />\n <ListItemIcon className={classes.icon}>\n {status.all ? null : <ArrowRight className={classes.iconSmall} />}\n </ListItemIcon>\n </ListItem>\n )\n}\n","export default __webpack_public_path__ + \"static/media/logo.3d1155fe.svg\";","import type { ReactElement } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\nimport { OpenInNewSharp } from '@material-ui/icons'\nimport { Divider, List, Drawer, Grid, Link as MUILink } from '@material-ui/core'\nimport { Home, FileText, DollarSign, Share2, Settings, Layers, BookOpen } from 'react-feather'\nimport { ROUTES } from '../routes'\nimport SideBarItem from './SideBarItem'\nimport SideBarStatus from './SideBarStatus'\n\nimport Logo from '../assets/logo.svg'\n\nconst navBarItems = [\n {\n label: 'Info',\n path: ROUTES.INFO,\n icon: Home,\n },\n {\n label: 'Files',\n path: ROUTES.FILES,\n icon: FileText,\n },\n {\n label: 'Stamps',\n path: ROUTES.STAMPS,\n icon: Layers,\n },\n {\n label: 'Accounting',\n path: ROUTES.ACCOUNTING,\n icon: DollarSign,\n },\n {\n label: 'Peers',\n path: ROUTES.PEERS,\n icon: Share2,\n },\n {\n label: 'Settings',\n path: ROUTES.SETTINGS,\n icon: Settings,\n },\n]\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexWrap: 'nowrap',\n minHeight: '100vh',\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8),\n },\n logo: {\n marginLeft: theme.spacing(8),\n marginRight: theme.spacing(8),\n },\n icon: {\n height: theme.spacing(4),\n },\n iconSmall: {\n height: theme.spacing(2),\n },\n divider: {\n backgroundColor: '#2c2c2c',\n marginLeft: theme.spacing(4),\n marginRight: theme.spacing(4),\n },\n link: {\n color: '#9f9f9f',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n textDecoration: 'none',\n },\n },\n },\n }),\n)\n\nexport default function SideBar(): ReactElement {\n const classes = useStyles()\n\n return (\n <Drawer variant=\"permanent\">\n <Grid container direction=\"column\" justifyContent=\"space-between\" className={classes.root}>\n <Grid className={classes.logo}>\n <Link to={ROUTES.INFO}>\n <img alt=\"swarm\" src={Logo} />\n </Link>\n </Grid>\n <Grid>\n <List>\n {navBarItems.map(p => (\n <Link to={p.path} key={p.path} className={classes.link}>\n <SideBarItem\n key={p.path}\n iconStart={<p.icon className={classes.icon} />}\n path={p.path}\n label={p.label}\n />\n </Link>\n ))}\n </List>\n <Divider className={classes.divider} />\n <List>\n <MUILink href={process.env.REACT_APP_BEE_DOCS_HOST} target=\"_blank\" className={classes.link}>\n <SideBarItem\n iconStart={<BookOpen className={classes.icon} />}\n iconEnd={<OpenInNewSharp className={classes.iconSmall} />}\n label={<span>Docs</span>}\n />\n </MUILink>\n </List>\n </Grid>\n <Grid>\n <Link to={ROUTES.STATUS} className={classes.link}>\n <SideBarStatus path={ROUTES.STATUS} />\n </Link>\n </Grid>\n </Grid>\n </Drawer>\n )\n}\n","import { useContext, ReactElement } from 'react'\nimport ErrorBoundary from '../components/ErrorBoundary'\nimport AlertVersion from '../components/AlertVersion'\nimport { Container, CircularProgress } from '@material-ui/core'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\n\nimport SideBar from '../components/SideBar'\n\nimport { Context } from '../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n content: {\n marginLeft: 300,\n flexGrow: 1,\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(3),\n paddingBottom: '65px',\n },\n }),\n)\n\ninterface Props {\n children?: ReactElement\n}\n\nconst Dashboard = (props: Props): ReactElement => {\n const classes = useStyles()\n\n const { isLoading } = useContext(Context)\n\n return (\n <div>\n <SideBar />\n <ErrorBoundary>\n <main className={classes.content}>\n <AlertVersion />\n {isLoading ? (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n ) : (\n props.children\n )}\n </main>\n </ErrorBoundary>\n </div>\n )\n}\n\nexport default Dashboard\n","import { createMuiTheme, Theme } from '@material-ui/core/styles'\nimport { orange } from '@material-ui/core/colors'\n\ndeclare module '@material-ui/core/styles/createPalette' {\n interface TypeBackground {\n appBar: string\n }\n}\n\n// Overwriting default components styles\nconst componentsOverrides = (theme: Theme) => ({\n MuiDrawer: {\n paper: {\n width: 300,\n backgroundColor: '#212121',\n },\n },\n MuiTab: {\n root: {\n backgroundColor: 'transparent',\n fontWeight: theme.typography.fontWeightRegular,\n marginRight: theme.spacing(4),\n fontFamily: [\n '-apple-system',\n 'BlinkMacSystemFont',\n '\"Segoe UI\"',\n 'Roboto',\n '\"Helvetica Neue\"',\n 'Arial',\n 'sans-serif',\n '\"Apple Color Emoji\"',\n '\"Segoe UI Emoji\"',\n '\"Segoe UI Symbol\"',\n ].join(','),\n '&:hover': {\n color: theme.palette.secondary,\n opacity: 1,\n },\n '&$selected': {\n color: theme.palette.secondary,\n fontWeight: theme.typography.fontWeightMedium,\n },\n '&:focus': {\n color: theme.palette.secondary,\n },\n },\n },\n MuiTabs: {\n root: {\n borderBottom: 'none',\n },\n indicator: {\n backgroundColor: theme.palette.primary.main,\n },\n },\n})\n\nconst propsOverrides = {\n MuiTab: {\n disableRipple: true,\n },\n}\n\nexport const theme = createMuiTheme({\n palette: {\n type: 'light',\n background: {\n default: '#fafafa',\n },\n primary: {\n light: orange.A200,\n main: '#dd7700',\n dark: orange[800],\n },\n secondary: {\n main: '#333333',\n },\n },\n typography: {\n fontFamily: ['Work Sans', 'Montserrat', 'Nunito', 'Roboto', '\"Helvetica Neue\"', 'Arial', 'sans-serif'].join(','),\n },\n})\n\ntheme.overrides = componentsOverrides(theme)\ntheme.props = propsOverrides\n","import { ReactElement } from 'react'\nimport { BrowserRouter as Router } from 'react-router-dom'\nimport './App.css'\n\nimport { ThemeProvider } from '@material-ui/core/styles'\nimport CssBaseline from '@material-ui/core/CssBaseline'\nimport { SnackbarProvider } from 'notistack'\n\nimport BaseRouter from './routes'\nimport Dashboard from './layout/Dashboard'\nimport { theme } from './theme'\nimport { Provider as StampsProvider } from './providers/Stamps'\nimport { Provider as PlatformProvider } from './providers/Platform'\nimport { Provider as BeeProvider } from './providers/Bee'\nimport { Provider as SettingsProvider } from './providers/Settings'\n\nconst App = (): ReactElement => (\n <div className=\"App\">\n <ThemeProvider theme={theme}>\n <SettingsProvider>\n <BeeProvider>\n <StampsProvider>\n <PlatformProvider>\n <SnackbarProvider>\n <Router>\n <>\n <CssBaseline />\n <Dashboard>\n <BaseRouter />\n </Dashboard>\n </>\n </Router>\n </SnackbarProvider>\n </PlatformProvider>\n </StampsProvider>\n </BeeProvider>\n </SettingsProvider>\n </ThemeProvider>\n </div>\n)\n\nexport default App\n","import { ReportHandler } from 'web-vitals'\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler): void => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root'),\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}