@ethersphere/bee-dashboard 0.5.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +30 -11
- package/build/asset-manifest.json +13 -13
- package/build/index.html +1 -1
- package/build/static/js/2.552553af.chunk.js +3 -0
- package/build/static/js/{2.6ba4776b.chunk.js.LICENSE.txt → 2.552553af.chunk.js.LICENSE.txt} +5 -3
- package/build/static/js/2.552553af.chunk.js.map +1 -0
- package/build/static/js/3.bed31167.chunk.js +2 -0
- package/build/static/js/3.bed31167.chunk.js.map +1 -0
- package/build/static/js/main.64e0d8b1.chunk.js +2 -0
- package/build/static/js/main.64e0d8b1.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.e585a8a5.js → runtime-main.acc32346.js} +2 -2
- package/build/static/js/runtime-main.acc32346.js.map +1 -0
- package/build/static/media/logo.3d1155fe.svg +11 -0
- package/package.json +53 -50
- package/build/static/js/2.6ba4776b.chunk.js +0 -3
- package/build/static/js/2.6ba4776b.chunk.js.map +0 -1
- package/build/static/js/3.0c27d1d4.chunk.js +0 -2
- package/build/static/js/3.0c27d1d4.chunk.js.map +0 -1
- package/build/static/js/main.e959d365.chunk.js +0 -2
- package/build/static/js/main.e959d365.chunk.js.map +0 -1
- package/build/static/js/runtime-main.e585a8a5.js.map +0 -1
- package/build/static/media/swarm-logo-orange.f09e1111.svg +0 -35
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["routes/AppRoute.tsx","components/ErrorBoundary.tsx","constants.ts","services/bee.tsx","utils/index.ts","models/Token.ts","hooks/apiHooks.tsx","hooks/status.ts","components/AlertVersion.tsx","assets/swarm-logo-orange.svg","components/SideBar.tsx","components/NavBar.tsx","layout/Dashboard.tsx","components/ConnectToHost.tsx","components/CodeBlock.tsx","components/CodeBlockTabs.tsx","pages/status/SetupSteps/DebugConnectionCheck.tsx","pages/status/SetupSteps/NodeConnectionCheck.tsx","pages/status/SetupSteps/VersionCheck.tsx","components/QRCodeModal.tsx","components/ClipboardCopy.tsx","components/EthereumAddress.tsx","pages/status/SetupSteps/EthereumConnectionCheck.tsx","components/WDModal.tsx","containers/DepositModal.tsx","pages/status/SetupSteps/ChequebookDeployFund.tsx","pages/status/SetupSteps/PeerConnection.tsx","pages/status/NodeSetupWorkflow.tsx","pages/status/StatusCard.tsx","components/EthereumAddressCard.tsx","pages/status/index.tsx","components/TroubleshootConnectionCard.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","components/TabsContainer.tsx","pages/files/index.tsx","pages/peers/PeerTable.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","components/LastUpdate.tsx","pages/stamps/index.tsx","routes/routes.tsx","theme.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["AppRoute","Component","component","Layout","layout","exact","path","render","props","ErrorBoundary","state","error","errorInfo","console","this","message","children","apiHost","sessionStorage","getItem","process","debugApiHost","beeJSClient","Bee","beeJSDebugClient","BeeDebug","beeApi","health","isConnected","uploadFile","postageBatchId","file","downloadFile","hash","getPostageStamps","getAllPostageBatch","buyPostageStamp","amount","depth","options","createPostageBatch","toString","beeDebugApi","status","nodeHealth","getHealth","connectivity","addresses","getNodeAddresses","listPeers","getPeers","topology","getTopology","ping","peerId","pingPeer","balance","balances","getAllBalances","chequebook","address","getChequebookAddress","getChequebookBalance","getLastCheques","peerCashout","cashoutLastCheque","getPeerLastCashout","getLastCashoutAction","getPeerLastCheques","getLastChequesForPeer","withdraw","withdrawTokens","deposit","depositTokens","settlements","getSettlements","getAllSettlements","isInteger","value","BigNumber","isBigNumber","makeBigNumber","TypeError","POSSIBLE_DECIMALS","Token","decimals","a","includes","BigInt","toFixed","dividedBy","pow","digits","toDecimal","t","multipliedBy","useApiHealth","useState","setHealth","isLoadingHealth","setLoading","setError","useEffect","then","res","catch","finally","useDebugApiHealth","setNodeHealth","isLoadingNodeHealth","useApiNodeAddresses","nodeAddresses","setNodeAddresses","isLoadingNodeAddresses","useApiNodeTopology","setNodeTopology","isLoading","useApiChequebookAddress","chequebookAddress","setChequebookAddress","isLoadingChequebookAddress","useApiChequebookBalance","chequebookBalance","setChequebookBalance","isLoadingChequebookBalance","totalBalance","availableBalance","useStatusNodeVersion","latestBeeRelease","setLatestBeeRelease","isLoadingLatestBeeRelease","axios","get","data","useLatestBeeRelease","latestVersion","semver","coerce","name","version","latestUserVersion","isLatestBeeVersion","Boolean","satisfies","includePrerelease","isOk","engines","bee","userVersion","latestUrl","html_url","useStyles","makeStyles","theme","createStyles","root","width","marginBottom","spacing","VersionAlert","classes","open","setOpen","isExactlySupportedBeeVersion","SUPPORTED_BEE_VERSION_EXACT","Collapse","in","className","Alert","severity","action","IconButton","aria-label","color","size","onClick","fontSize","AlertTitle","drawerWidth","navBarItems","label","id","icon","Activity","FileText","Layers","DollarSign","Share2","Settings","display","appBar","marginLeft","logo","padding","marginTop","drawer","flexShrink","drawerPaper","activeSideBar","activeSideBarItem","borderLeft","backgroundColor","toolbar","mixins","SideBar","Drawer","variant","paper","anchor","style","textAlign","to","alt","src","themeMode","SwarmLogoOrange","maxHeight","alignItems","List","map","item","textDecoration","ListItem","button","selected","location","pathname","ListItemIcon","height","ListItemText","primary","Divider","href","target","OpenInNewSharp","position","bottom","marginRight","borderRadius","darkMode","toggleDarkMode","Toolbar","float","localStorage","setItem","window","reload","switchTheme","content","flexGrow","palette","background","default","paddingBottom","Dashboard","toggleThemeMode","String","matchMedia","matches","addEventListener","e","removeEventListener","ConnectToHost","hostInputVisible","toggleHostInputVisibility","connectingToHost","setConnectingToHost","host","setHost","TextField","defaultValue","defaultHost","onChange","minWidth","Button","hostName","Container","CircularProgress","CodeBlock","language","showLineNumbers","code","a11yProps","index","CodeBlockTabs","React","setValue","TabPanel","other","role","hidden","aria-labelledby","Box","Typography","os","userAgent","navigator","platform","test","getOS","AntTabs","withStyles","borderBottom","indicator","Tabs","AntTab","textTransform","fontWeight","typography","fontWeightRegular","fontFamily","join","opacity","fontWeightMedium","Tab","disableRipple","event","newValue","linux","mac","NodeConnectionCheck","changeDebugApiUrl","gutterBottom","margin","Accordion","AccordionSummary","expandIcon","ExpandMoreSharp","aria-controls","AccordionDetails","elevation","VersionCheck","rel","QRCodeModal","FilterCenterFocusSharp","Dialog","onClose","DialogTitle","bgColor","fgColor","level","includeMargin","renderAs","ClipboardCopy","enqueueSnackbar","useSnackbar","text","EthereumAddress","hideBlockie","paddingTop","string","truncate","maxWidth","overflow","textOverflow","whiteSpace","transaction","EthereumConnectionCheck","ethereum","WithdrawModal","successMessage","errorMessage","dialogMessage","min","max","setAmount","amountToken","setAmountToken","amountError","setAmountError","handleClose","handleAction","toBigInt","transactionHash","DialogContent","DialogContentText","Input","autoFocus","type","placeholder","fullWidth","fromDecimal","isLessThan","Error","isGreaterThan","FormHelperText","DialogActions","DepositModal","ChequebookDeployFund","toBigNumber","PeerConnection","peers","connected","population","actionsContainer","NodeSetupWorkflow","nodeVersion","ethereumConnection","debugApiConnection","apiConnection","activeStep","setActiveStep","steps","ethereumAddress","length","every","step","i","handleNext","prevActiveStep","handleBack","Paper","Sync","Stepper","nonLinear","orientation","Step","StepLabel","disabled","StepIconComponent","Autorenew","cursor","CheckCircle","StepButton","justifyContent","ExpandLessSharp","StepContent","flex","flexDirection","StatusCard","userBeeVersion","nodeTopology","underlayAddressesVisible","setUnderlayAddresessVisible","Card","CardContent","Chip","publicKey","pssPublicKey","overlay","ArrowDropUp","ArrowRight","underlay","flexWrap","details","EthereumAddressCard","Skeleton","animation","rowGap","Status","useStatusEthereumConnection","useStatusDebugConnection","useStatusConnection","useStatusTopology","useStatusChequebook","checks","c","title","TroubleshootConnectionCard","input","iconButton","divider","Files","referenceInput","setReferenceInput","referenceError","setReferenceError","InputBase","inputProps","Utils","Hex","isHexString","Search","UploadSizeAlert","aboveLimit","truncStringPortion","str","firstCharCount","endCharCount","substring","PeerDetail","characterLength","initialValues","stamps","lastUpdate","start","stop","refresh","Promise","reject","Context","createContext","Consumer","enrichStamp","postageBatch","bucketDepth","usage","utilization","Math","usageText","ceil","Provider","setStamps","setIsLoading","setLastUpdate","frequency","setFrequency","Date","now","interval","setInterval","clearInterval","freq","initialFormValues","wrapper","field","buttonProgress","top","left","FormDialog","useContext","handleClickOpen","onSubmit","values","actions","Number","parseInt","undefined","resetForm","setSubmitting","validate","errors","isLessThanOrEqualTo","submitForm","isValid","isSubmitting","required","SimpleMenu","selectedStamp","setSelected","anchorEl","setAnchorEl","aria-haspopup","currentTarget","Menu","keepMounted","stamp","MenuItem","batchID","dropzoneKey","setDropzoneKey","setFile","uploadReference","setUploadReference","isUploadingFile","setIsUploadingFile","setSelectedStamp","reduce","prev","curr","files","filesLimit","maxFileSize","avatar","Avatar","deleteIcon","onDelete","setTimeout","p","SimpleTabs","table","PeerTable","rtt","loading","peerLatency","setPeerLatency","TableContainer","Table","TableHead","TableRow","TableCell","align","TableBody","peer","idx","scope","Tooltip","find","filter","pos","StatCard","statistic","TopologyStats","Grid","container","xs","sm","md","lg","xl","Peers","debugHealth","setPeers","useApiNodePeers","buttons","columnGap","gridContainer","chequebookActions","AccountCard","totalreceived","totalsent","toFixedDecimal","uncashedAmount","loadingCashout","setLoadingCashout","overflowWrap","BalancesTable","accounting","isLoadingUncashed","received","sent","total","isPositive","useAccounting","setSettlements","isLoadingSettlements","totalReceived","totalSent","set","useApiSettlements","peerBalances","setPeerBalances","isLoadingPeerBalances","useApiPeerBalances","err","setErr","setIsloadingUncashed","uncashedAmounts","setUncashedAmounts","promises","gt","all","forEach","plus","minus","Object","sort","b","toNumber","mergeAccounting","Accounting","refreshVisibility","toggleRefreshVisibility","debugHost","setDebugHost","helperText","InputLabelProps","shrink","StampsTable","postageStamps","LastUpdate","date","duration","setDuration","BaseRouter","Stamps","componentsOverrides","MuiTab","secondary","MuiTabs","main","propsOverrides","lightTheme","createMuiTheme","light","orange","A200","dark","darkTheme","overrides","App","ThemeProvider","CssBaseline","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.e959d365.chunk.js","sourcesContent":["import type { JSXElementConstructor, ReactElement } from 'react'\nimport { Route, RouteComponentProps } from 'react-router-dom'\n\ninterface Props {\n component: JSXElementConstructor<RouteComponentProps>\n layout: JSXElementConstructor<RouteComponentProps>\n exact?: boolean\n path: string\n}\n\nconst AppRoute = ({ component: Component, layout: Layout, exact, path }: Props): ReactElement => (\n <Route\n exact={exact}\n path={path}\n render={props => (\n <Layout {...props}>\n <Component {...props} />\n </Layout>\n )}\n />\n)\n\nexport default AppRoute\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","// These values can for now be constants because their change in the app reloads the page\nexport const apiHost = sessionStorage.getItem('api_host') || process.env.REACT_APP_BEE_HOST || 'http://localhost:1633'\nexport const debugApiHost =\n sessionStorage.getItem('debug_api_host') || process.env.REACT_APP_BEE_DEBUG_HOST || 'http://localhost:1635'\n","import {\n Address,\n AllSettlements,\n BalanceResponse,\n Bee,\n BeeDebug,\n ChequebookAddressResponse,\n ChequebookBalanceResponse,\n Data,\n FileData,\n Health,\n LastCashoutActionResponse,\n LastChequesForPeerResponse,\n LastChequesResponse,\n NodeAddresses,\n Peer,\n PingResponse,\n PostageBatch,\n PostageBatchOptions,\n Reference,\n Topology,\n} from '@ethersphere/bee-js'\nimport { apiHost, debugApiHost } from '../constants'\n\nconst beeJSClient = () => new Bee(apiHost)\n\nconst beeJSDebugClient = () => new BeeDebug(debugApiHost)\n\nexport const beeApi = {\n status: {\n health(): Promise<boolean> {\n return beeJSClient().isConnected()\n },\n },\n files: {\n uploadFile(postageBatchId: Address, file: File): Promise<Reference> {\n return beeJSClient().uploadFile(postageBatchId, file)\n },\n downloadFile(hash: string | Reference): Promise<FileData<Data>> {\n return beeJSClient().downloadFile(hash)\n },\n },\n stamps: {\n getPostageStamps(): Promise<PostageBatch[]> {\n return beeJSClient().getAllPostageBatch()\n },\n buyPostageStamp(amount: bigint, depth: number, options: PostageBatchOptions = {}): Promise<Address> {\n return beeJSClient().createPostageBatch(amount.toString(), depth, options)\n },\n },\n}\n\nexport const beeDebugApi = {\n status: {\n nodeHealth(): Promise<Health> {\n return beeJSDebugClient().getHealth()\n },\n },\n connectivity: {\n addresses(): Promise<NodeAddresses> {\n return beeJSDebugClient().getNodeAddresses()\n },\n listPeers(): Promise<Peer[]> {\n return beeJSDebugClient().getPeers()\n },\n topology(): Promise<Topology> {\n return beeJSDebugClient().getTopology()\n },\n ping(peerId: string): Promise<PingResponse> {\n return beeJSDebugClient().pingPeer(peerId)\n },\n },\n balance: {\n balances(): Promise<BalanceResponse> {\n return beeJSDebugClient().getAllBalances()\n },\n },\n chequebook: {\n address(): Promise<ChequebookAddressResponse> {\n return beeJSDebugClient().getChequebookAddress()\n },\n balance(): Promise<ChequebookBalanceResponse> {\n return beeJSDebugClient().getChequebookBalance()\n },\n getLastCheques(): Promise<LastChequesResponse> {\n return beeJSDebugClient().getLastCheques()\n },\n peerCashout(peerId: string): Promise<string> {\n return beeJSDebugClient().cashoutLastCheque(peerId)\n },\n getPeerLastCashout(peerId: string): Promise<LastCashoutActionResponse> {\n return beeJSDebugClient().getLastCashoutAction(peerId)\n },\n getPeerLastCheques(peerId: string): Promise<LastChequesForPeerResponse> {\n return beeJSDebugClient().getLastChequesForPeer(peerId)\n },\n withdraw(amount: bigint): Promise<string> {\n return beeJSDebugClient().withdrawTokens(amount.toString())\n },\n deposit(amount: bigint): Promise<string> {\n return beeJSDebugClient().depositTokens(amount.toString())\n },\n },\n settlements: {\n getSettlements(): Promise<AllSettlements> {\n return beeJSDebugClient().getAllSettlements()\n },\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","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 { useState, useEffect } from 'react'\n\nimport {\n NodeAddresses,\n ChequebookAddressResponse,\n LastChequesResponse,\n Health,\n Peer,\n Topology,\n LastChequesForPeerResponse,\n} from '@ethersphere/bee-js'\n\nimport { beeDebugApi, beeApi } from '../services/bee'\nimport axios from 'axios'\nimport { Token } from '../models/Token'\n\nexport interface HealthHook {\n health: boolean\n isLoadingHealth: boolean\n error: Error | null\n}\nexport const useApiHealth = (): HealthHook => {\n const [health, setHealth] = useState<boolean>(false)\n const [isLoadingHealth, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeApi.status\n .health()\n .then(res => {\n setHealth(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { health, isLoadingHealth, error }\n}\n\nexport interface DebugHealthHook {\n nodeHealth: Health | null\n isLoadingNodeHealth: boolean\n error: Error | null\n}\n\nexport const useDebugApiHealth = (): DebugHealthHook => {\n const [nodeHealth, setNodeHealth] = useState<Health | null>(null)\n const [isLoadingNodeHealth, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.status\n .nodeHealth()\n .then(res => {\n setNodeHealth(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { nodeHealth, isLoadingNodeHealth, error }\n}\n\nexport interface NodeAddressesHook {\n nodeAddresses: NodeAddresses | null\n isLoadingNodeAddresses: boolean\n error: Error | null\n}\n\nexport const useApiNodeAddresses = (): NodeAddressesHook => {\n const [nodeAddresses, setNodeAddresses] = useState<NodeAddresses | null>(null)\n const [isLoadingNodeAddresses, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.connectivity\n .addresses()\n .then(res => {\n setNodeAddresses(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { nodeAddresses, isLoadingNodeAddresses, error }\n}\n\nexport interface NodeTopologyHook {\n topology: Topology | null\n isLoading: boolean\n error: Error | null\n}\n\nexport const useApiNodeTopology = (): NodeTopologyHook => {\n const [topology, setNodeTopology] = useState<Topology | null>(null)\n const [isLoading, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.connectivity\n .topology()\n .then(res => {\n setNodeTopology(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { topology, isLoading, error }\n}\nexport interface ChequebookAddressHook {\n chequebookAddress: ChequebookAddressResponse | null\n isLoadingChequebookAddress: boolean\n error: Error | null\n}\n\nexport const useApiChequebookAddress = (): ChequebookAddressHook => {\n const [chequebookAddress, setChequebookAddress] = useState<ChequebookAddressResponse | null>(null)\n const [isLoadingChequebookAddress, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.chequebook\n .address()\n .then(res => {\n setChequebookAddress(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { chequebookAddress, isLoadingChequebookAddress, error }\n}\n\nexport interface NodePeersHook {\n peers: Peer[] | null\n isLoading: boolean\n error: Error | null\n}\n\nexport const useApiNodePeers = (): NodePeersHook => {\n const [peers, setPeers] = useState<Peer[] | null>(null)\n const [isLoading, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.connectivity\n .listPeers()\n .then(res => {\n setPeers(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { peers, isLoading, error }\n}\n\nexport interface ChequebookBalance {\n totalBalance: Token\n availableBalance: Token\n}\n\nexport interface ChequebookBalanceHook {\n chequebookBalance: ChequebookBalance | null\n isLoadingChequebookBalance: boolean\n error: Error | null\n}\n\nexport const useApiChequebookBalance = (): ChequebookBalanceHook => {\n const [chequebookBalance, setChequebookBalance] = useState<ChequebookBalance | null>(null)\n const [isLoadingChequebookBalance, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.chequebook\n .balance()\n .then(({ totalBalance, availableBalance }) => {\n const balance = {\n totalBalance: new Token(totalBalance),\n availableBalance: new Token(availableBalance),\n }\n setChequebookBalance(balance)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { chequebookBalance, isLoadingChequebookBalance, error }\n}\n\nexport interface Balance {\n peer: string\n balance: Token\n}\n\nexport interface PeerBalanceHook {\n peerBalances: Balance[] | null\n isLoadingPeerBalances: boolean\n error: Error | null\n}\n\nexport const useApiPeerBalances = (): PeerBalanceHook => {\n const [peerBalances, setPeerBalances] = useState<Balance[] | null>(null)\n const [isLoadingPeerBalances, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.balance\n .balances()\n .then(res => {\n // for some reason sometimes these are numbers and not BigInts\n const balances = res.balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) }))\n setPeerBalances(balances)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { peerBalances, isLoadingPeerBalances, error }\n}\n\nexport interface PeerChequesHook {\n peerCheques: LastChequesResponse | null\n isLoadingPeerCheques: boolean\n error: Error | null\n}\n\nexport const useApiPeerCheques = (): PeerChequesHook => {\n const [peerCheques, setPeerCheques] = useState<LastChequesResponse | null>(null)\n const [isLoadingPeerCheques, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.chequebook\n .getLastCheques()\n .then(res => {\n setPeerCheques(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { peerCheques, isLoadingPeerCheques, error }\n}\n\nexport interface PeerLastChequesHook {\n peerCheque: LastChequesForPeerResponse | null\n isLoadingPeerCheque: boolean\n error: Error | null\n}\n\nexport const useApiPeerLastCheque = (peerId: string): PeerLastChequesHook => {\n const [peerCheque, setPeerCheque] = useState<LastChequesForPeerResponse | null>(null)\n const [isLoadingPeerCheque, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.chequebook\n .getPeerLastCheques(peerId)\n .then(res => {\n setPeerCheque(res)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [peerId])\n\n return { peerCheque, isLoadingPeerCheque, error }\n}\n\nexport interface Settlement {\n peer: string\n received: Token\n sent: Token\n}\n\nexport interface Settlements {\n totalReceived: Token\n totalSent: Token\n settlements: Settlement[]\n}\n\nexport interface SettlementsHook {\n settlements: Settlements | null\n isLoadingSettlements: boolean\n error: Error | null\n}\n\nexport const useApiSettlements = (): SettlementsHook => {\n const [settlements, setSettlements] = useState<Settlements | null>(null)\n const [isLoadingSettlements, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.settlements\n .getSettlements()\n .then(({ totalReceived, settlements, totalSent }) => {\n const set = {\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 setSettlements(set)\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { settlements, isLoadingSettlements, error }\n}\n\nexport interface LastCashout {\n peer: string\n uncashedAmount: Token\n}\n\nexport interface PeerLastCashoutHook {\n peerCashout: LastCashout | null\n isLoadingPeerCashout: boolean\n error: Error | null\n}\n\nexport const useApiPeerLastCashout = (peerId: string): PeerLastCashoutHook => {\n const [peerCashout, setPeerCashout] = useState<LastCashout | null>(null)\n const [isLoadingPeerCashout, setLoading] = useState<boolean>(true)\n const [error, setError] = useState<Error | null>(null)\n\n useEffect(() => {\n setLoading(true)\n beeDebugApi.chequebook\n .getPeerLastCashout(peerId)\n .then(({ peer, uncashedAmount }) => {\n setPeerCashout({ peer, uncashedAmount: new Token(uncashedAmount.toString()) })\n })\n .catch(error => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [peerId])\n\n return { peerCashout, isLoadingPeerCashout, error }\n}\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 { ChequebookAddressResponse } from '@ethersphere/bee-js'\nimport {\n ChequebookBalance,\n useApiChequebookAddress,\n useApiChequebookBalance,\n useApiHealth,\n useApiNodeAddresses,\n useApiNodeTopology,\n useDebugApiHealth,\n useLatestBeeRelease,\n} from './apiHooks'\nimport semver from 'semver'\nimport { engines } from '../../package.json'\n\nexport interface StatusChequebookHook extends StatusHookCommon {\n chequebookBalance: ChequebookBalance | null\n chequebookAddress: ChequebookAddressResponse | null\n}\n\nexport const useStatusNodeVersion = (): StatusNodeVersionHook => {\n const { latestBeeRelease, isLoadingLatestBeeRelease } = useLatestBeeRelease()\n const { nodeHealth, isLoadingNodeHealth } = useDebugApiHealth()\n\n const latestVersion = semver.coerce(latestBeeRelease?.name)?.version\n const latestUserVersion = semver.coerce(nodeHealth?.version)?.version\n\n const isLatestBeeVersion = Boolean(\n latestVersion &&\n latestUserVersion &&\n semver.satisfies(latestVersion, latestUserVersion, {\n includePrerelease: true,\n }),\n )\n\n return {\n isLoading: isLoadingNodeHealth || isLoadingLatestBeeRelease,\n isOk: Boolean(\n nodeHealth &&\n semver.satisfies(nodeHealth.version, engines.bee, {\n includePrerelease: true,\n }),\n ),\n userVersion: nodeHealth?.version,\n latestVersion,\n latestUrl: latestBeeRelease?.html_url || 'https://github.com/ethersphere/bee/releases/latest',\n isLatestBeeVersion,\n }\n}\n\nexport const useStatusEthereumConnection = (): StatusEthereumConnectionHook => {\n const { isLoadingNodeAddresses, nodeAddresses } = useApiNodeAddresses()\n\n return {\n isLoading: isLoadingNodeAddresses,\n isOk: Boolean(nodeAddresses?.ethereum),\n nodeAddresses,\n }\n}\n\nexport const useStatusDebugConnection = (): StatusHookCommon => {\n const { isLoadingNodeHealth, nodeHealth } = useDebugApiHealth()\n\n return {\n isLoading: isLoadingNodeHealth,\n isOk: Boolean(nodeHealth?.status === 'ok'),\n }\n}\n\nexport const useStatusConnection = (): StatusHookCommon => {\n const { isLoadingHealth, health } = useApiHealth()\n\n return {\n isLoading: isLoadingHealth,\n isOk: health,\n }\n}\n\nexport const useStatusTopology = (): StatusTopologyHook => {\n const { topology, isLoading } = useApiNodeTopology()\n\n return {\n isLoading,\n isOk: Boolean(topology?.connected && topology?.connected > 0),\n topology,\n }\n}\n\nexport const useStatusChequebook = (): StatusChequebookHook => {\n const { chequebookAddress, isLoadingChequebookAddress } = useApiChequebookAddress()\n const { chequebookBalance, isLoadingChequebookBalance } = useApiChequebookBalance()\n\n return {\n isLoading: isLoadingChequebookAddress || isLoadingChequebookBalance,\n isOk:\n Boolean(chequebookAddress?.chequebookAddress) &&\n chequebookBalance !== null &&\n chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0),\n chequebookBalance,\n chequebookAddress,\n }\n}\n","import { ReactElement, useState } 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 { useStatusNodeVersion } from '../hooks/status'\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, userVersion } = useStatusNodeVersion()\n const [open, setOpen] = useState<boolean>(true)\n\n const isExactlySupportedBeeVersion = SUPPORTED_BEE_VERSION_EXACT === userVersion\n\n if (isLoading || !userVersion) 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>{userVersion}</code>) does not exactly match the Bee version we tested the Bee\n Dashboard against (<code>{SUPPORTED_BEE_VERSION_EXACT}</code>). Please note that some functionality may not\n work properly.\n </Alert>\n </div>\n </Collapse>\n )\n}\n","export default __webpack_public_path__ + \"static/media/swarm-logo-orange.f09e1111.svg\";","import { ReactElement } from 'react'\nimport { Link, RouteComponentProps } from 'react-router-dom'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\nimport { ListItemText, ListItemIcon, ListItem, Divider, List, Drawer, Link as MUILink } from '@material-ui/core'\nimport { OpenInNewSharp } from '@material-ui/icons'\nimport { Activity, FileText, DollarSign, Share2, Settings, Layers } from 'react-feather'\n\nimport SwarmLogoOrange from '../assets/swarm-logo-orange.svg'\nimport { Health } from '@ethersphere/bee-js'\n\nconst drawerWidth = 240\n\nconst navBarItems = [\n {\n label: 'Status',\n id: 'status',\n path: '/',\n icon: Activity,\n },\n {\n label: 'Files',\n id: 'files',\n path: '/files/',\n icon: FileText,\n },\n {\n label: 'Stamps',\n id: 'stamps',\n path: '/stamps/',\n icon: Layers,\n },\n {\n label: 'Accounting',\n id: 'accounting',\n path: '/accounting/',\n icon: DollarSign,\n },\n {\n label: 'Peers',\n id: 'peers',\n path: '/peers/',\n icon: Share2,\n },\n {\n label: 'Settings',\n id: 'settings',\n path: '/settings/',\n icon: Settings,\n },\n]\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n display: 'flex',\n },\n appBar: {\n width: `calc(100% - ${drawerWidth}px)`,\n marginLeft: drawerWidth,\n },\n logo: {\n padding: 1,\n marginTop: 20,\n },\n drawer: {\n width: drawerWidth,\n flexShrink: 0,\n },\n drawerPaper: {\n width: drawerWidth,\n },\n activeSideBar: {\n color: '#dd7700',\n },\n activeSideBarItem: {\n borderLeft: '4px solid #dd7700',\n backgroundColor: 'inherit !important',\n },\n toolbar: theme.mixins.toolbar,\n }),\n)\n\ninterface Props extends RouteComponentProps {\n themeMode: string\n health: boolean\n nodeHealth: Health | null\n}\n\nexport default function SideBar(props: Props): ReactElement {\n const classes = useStyles()\n\n return (\n <div className={classes.root}>\n <Drawer\n className={classes.drawer}\n variant=\"permanent\"\n classes={{\n paper: classes.drawerPaper,\n }}\n anchor=\"left\"\n >\n <div className={classes.toolbar} style={{ textAlign: 'left', marginLeft: 20 }}>\n <Link to=\"/\">\n <img\n alt=\"swarm\"\n className={classes.logo}\n src={props.themeMode === 'light' ? SwarmLogoOrange : SwarmLogoOrange}\n style={{ maxHeight: '30px', alignItems: 'center' }}\n />\n </Link>\n </div>\n <List>\n {navBarItems.map(item => (\n <Link to={item.path} key={item.id} style={{ color: 'inherit', textDecoration: 'none' }}>\n <ListItem\n button\n selected={props.location.pathname === item.path}\n className={props.location.pathname === item.path ? classes.activeSideBarItem : ''}\n >\n <ListItemIcon className={props.location.pathname === item.path ? classes.activeSideBar : ''}>\n <item.icon style={{ height: '20px' }} />\n </ListItemIcon>\n <ListItemText\n primary={item.label}\n className={props.location.pathname === item.path ? classes.activeSideBar : ''}\n />\n </ListItem>\n </Link>\n ))}\n </List>\n <Divider />\n <List>\n <MUILink href={process.env.REACT_APP_BEE_DOCS_HOST} target=\"_blank\" style={{ textDecoration: 'none' }}>\n <ListItem button>\n <ListItemText primary={'Docs'} />\n <OpenInNewSharp fontSize=\"small\" />\n </ListItem>\n </MUILink>\n </List>\n <div style={{ position: 'fixed', bottom: 0, width: 'inherit', padding: '10px' }}>\n <ListItem>\n <div style={{ marginRight: '30px' }}>\n <div\n style={{\n backgroundColor: props.health ? '#32c48d' : '#c9201f',\n marginRight: '7px',\n height: '10px',\n width: '10px',\n borderRadius: '50%',\n display: 'inline-block',\n }}\n />\n <span>API</span>\n </div>\n <div>\n <div\n style={{\n backgroundColor: props.nodeHealth?.status === 'ok' ? '#32c48d' : '#c9201f',\n marginRight: '7px',\n height: '10px',\n width: '10px',\n borderRadius: '50%',\n display: 'inline-block',\n }}\n />\n <span>Debug API</span>\n </div>\n </ListItem>\n </div>\n </Drawer>\n </div>\n )\n}\n","import { useState, ReactElement } from 'react'\n\nimport { createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Toolbar, IconButton } from '@material-ui/core/'\n\nimport { Sun, Moon } from 'react-feather'\n\nconst drawerWidth = 240\n\nconst useStyles = makeStyles(() =>\n createStyles({\n appBar: {\n width: `calc(100% - ${drawerWidth}px)`,\n marginLeft: drawerWidth,\n },\n }),\n)\ninterface Props {\n themeMode: string\n}\n\nexport default function SideBar(props: Props): ReactElement {\n const [darkMode, toggleDarkMode] = useState(false)\n\n const switchTheme = () => {\n const theme = localStorage.getItem('theme')\n\n if (theme) {\n localStorage.setItem('theme', theme === 'light' ? 'dark' : 'light')\n } else {\n localStorage.setItem('theme', darkMode ? 'dark' : 'light')\n }\n\n toggleDarkMode(!darkMode)\n window.location.reload()\n }\n\n const classes = useStyles()\n\n return (\n <div>\n <div style={{ display: 'fixed' }} className={classes.appBar}>\n <Toolbar style={{ display: 'flex' }}>\n <div style={{ width: '100%' }}>\n <div style={{ float: 'right' }}>\n <IconButton style={{ marginRight: '10px' }} aria-label=\"dark-mode\" onClick={() => switchTheme()}>\n {props.themeMode === 'dark' ? <Moon /> : <Sun />}\n </IconButton>\n </div>\n </div>\n </Toolbar>\n </div>\n </div>\n )\n}\n","import { useState, useEffect, ReactElement } from 'react'\nimport ErrorBoundary from '../components/ErrorBoundary'\nimport AlertVersion from '../components/AlertVersion'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\n\nimport SideBar from '../components/SideBar'\nimport NavBar from '../components/NavBar'\n\nimport { useApiHealth, useDebugApiHealth } from '../hooks/apiHooks'\nimport { RouteComponentProps } from 'react-router'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n content: {\n marginLeft: '240px',\n flexGrow: 1,\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(3),\n paddingBottom: '65px',\n },\n }),\n)\n\ninterface Props extends RouteComponentProps {\n children?: ReactElement\n}\n\nconst Dashboard = (props: Props): ReactElement => {\n const classes = useStyles()\n\n const [themeMode, toggleThemeMode] = useState('light')\n\n // FIXME: handle errrors and loading\n const { health } = useApiHealth()\n const { nodeHealth } = useDebugApiHealth()\n\n useEffect(() => {\n const theme = localStorage.getItem('theme')\n\n if (theme) {\n toggleThemeMode(String(localStorage.getItem('theme')))\n } else if (window?.matchMedia('(prefers-color-scheme: dark)')?.matches) {\n toggleThemeMode('dark')\n }\n\n window?.matchMedia('(prefers-color-scheme: dark)')?.addEventListener('change', e => {\n toggleThemeMode(e?.matches ? 'dark' : 'light')\n })\n\n return () =>\n window?.matchMedia('(prefers-color-scheme: dark)')?.removeEventListener('change', e => {\n toggleThemeMode(e?.matches ? 'dark' : 'light')\n })\n }, [])\n\n return (\n <div>\n <SideBar {...props} themeMode={themeMode} health={health} nodeHealth={nodeHealth} />\n <NavBar themeMode={themeMode} />\n <ErrorBoundary>\n <main className={classes.content}>\n <AlertVersion />\n {props.children}\n </main>\n </ErrorBoundary>\n </div>\n )\n}\n\nexport default Dashboard\n","import React, { ReactElement, useState } from 'react'\nimport { TextField, Button, CircularProgress, Container } from '@material-ui/core'\n\ninterface Props {\n defaultHost?: string\n hostName: string\n}\n\nexport default function ConnectToHost(props: Props): ReactElement {\n const [hostInputVisible, toggleHostInputVisibility] = useState(false)\n const [connectingToHost, setConnectingToHost] = useState(false)\n const [host, setHost] = useState('')\n\n const handleNewHostConnection = () => {\n if (host) {\n setConnectingToHost(true)\n sessionStorage.setItem(props.hostName, host)\n toggleHostInputVisibility(!hostInputVisible)\n window.location.reload()\n }\n }\n\n return (\n <div>\n {\n // FIXME: this should be broken up\n /* eslint-disable no-nested-ternary */\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 ) : connectingToHost ? (\n <Container style={{ textAlign: 'center', padding: '0px' }}>\n <CircularProgress size={20} />\n </Container>\n ) : (\n <Button onClick={() => toggleHostInputVisibility(!hostInputVisible)} size=\"small\" variant=\"outlined\">\n Change host\n </Button>\n )\n /* eslint-enable no-nested-ternary */\n }\n </div>\n )\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 React, { ReactElement, useEffect } from 'react'\nimport { withStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Tabs, Tab, Box, Typography } from '@material-ui/core'\nimport CodeBlock from './CodeBlock'\n\ninterface TabPanelProps {\n children?: React.ReactNode\n index: number\n value: number\n}\n\ninterface Props {\n linux: string\n mac: string\n showLineNumbers?: boolean\n}\n\nfunction a11yProps(index: number) {\n return {\n id: `simple-tab-${index}`,\n 'aria-controls': `simple-tabpanel-${index}`,\n }\n}\n\nfunction getOS() {\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 'macOS'\n\n if (iosPlatforms.includes(platform)) return 'iOS'\n\n if (windowsPlatforms.includes(platform)) return 'windows'\n\n if (/Android/.test(userAgent)) return 'android'\n\n if (/Linux/.test(platform)) return 'linux'\n\n return null\n}\n\nexport default function CodeBlockTabs(props: Props): ReactElement {\n const [value, setValue] = React.useState(0)\n\n const handleChange = (event: React.ChangeEvent<unknown>, newValue: number) => {\n setValue(newValue)\n }\n\n useEffect(() => {\n const os = getOS()\n\n if (os === 'windows') {\n setValue(0)\n } else if (os === 'linux') {\n setValue(0)\n } else if (os === 'macOS') {\n setValue(1)\n }\n }, [])\n\n function TabPanel(props: TabPanelProps) {\n const { children, value, index, ...other } = props\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`simple-tabpanel-${index}`}\n aria-labelledby={`simple-tab-${index}`}\n {...other}\n >\n {value === index && (\n <Box style={{ marginTop: '-12px' }}>\n <Typography component=\"div\">{children}</Typography>\n </Box>\n )}\n </div>\n )\n }\n\n const AntTabs = withStyles({\n root: {\n borderBottom: '1px solid #e8e8e8',\n },\n indicator: {\n backgroundColor: '#3f51b5',\n },\n })(Tabs)\n\n interface StyledTabProps {\n label: string\n }\n\n const AntTab = withStyles((theme: Theme) =>\n createStyles({\n root: {\n textTransform: 'none',\n minWidth: 72,\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: '#3f51b5',\n opacity: 1,\n },\n '&$selected': {\n color: '#3f51b5',\n fontWeight: theme.typography.fontWeightMedium,\n },\n '&:focus': {\n color: '#3f51b5',\n },\n },\n selected: {},\n }),\n )((props: StyledTabProps) => <Tab disableRipple {...props} />)\n\n return (\n <div>\n <AntTabs style={{ marginTop: '12px' }} value={value} onChange={handleChange} aria-label=\"ant example\">\n <AntTab label=\"Linux\" {...a11yProps(0)} />\n <AntTab label=\"MacOS\" {...a11yProps(1)} />\n </AntTabs>\n <TabPanel value={value} index={0}>\n <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.linux} />\n </TabPanel>\n <TabPanel value={value} index={1}>\n <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.mac} />\n </TabPanel>\n </div>\n )\n}\n","import type { ReactElement } 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 { debugApiHost } from '../../../constants'\n\ntype Props = StatusHookCommon\n\nexport default function NodeConnectionCheck({ isLoading, isOk }: Props): ReactElement | null {\n if (isLoading) return null\n\n const changeDebugApiUrl = (\n <div style={{ display: 'flex', marginTop: '25px', marginBottom: '25px' }}>\n <span style={{ marginRight: '15px' }}>\n Debug API (<Typography variant=\"button\">{debugApiHost}</Typography>)\n </span>\n <ConnectToHost hostName={'debug_api_host'} defaultHost={debugApiHost} />\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\">{debugApiHost}</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 "what is my ip" 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 React, { ReactElement } 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 { apiHost } from '../../../constants'\n\ntype Props = StatusHookCommon\n\nexport default function NodeConnectionCheck({ isLoading, isOk }: Props): ReactElement | null {\n if (isLoading) return null\n\n return (\n <div>\n <div style={{ display: 'flex', marginBottom: '25px' }}>\n <span style={{ marginRight: '15px' }}>\n Node API (<Typography variant=\"button\">{apiHost}</Typography>)\n </span>\n <ConnectToHost hostName=\"api_host\" defaultHost={apiHost} />\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\">{apiHost}</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({\n isLoading,\n isOk,\n userVersion,\n latestVersion,\n latestUrl,\n}: Props): ReactElement | null {\n if (isLoading) return null\n\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 { 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 type { ReactElement } from 'react'\nimport { Typography } from '@material-ui/core/'\nimport EthereumAddress from '../../../components/EthereumAddress'\n\ntype Props = StatusEthereumConnectionHook\n\nexport default function EthereumConnectionCheck({ isLoading, isOk, nodeAddresses }: Props): ReactElement | null {\n if (isLoading) return null\n\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 WithdrawModal({\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 type { ReactElement } from 'react'\nimport { beeDebugApi } from '../services/bee'\n\nimport WDModal from '../components/WDModal'\nimport { BigNumber } from 'bignumber.js'\n\nexport default function DepositModal(): ReactElement {\n return (\n <WDModal\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={beeDebugApi.chequebook.deposit}\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'\nimport type { StatusChequebookHook } from '../../../hooks/status'\n\ninterface Props extends StatusChequebookHook {\n ethereumAddress?: string\n}\n\nconst ChequebookDeployFund = ({ isLoading, chequebookAddress, chequebookBalance }: Props): ReactElement | null => {\n if (isLoading) return null\n\n return (\n <div>\n <p style={{ marginBottom: '20px', display: 'flex' }}>\n {chequebookAddress?.chequebookAddress && <DepositModal />}\n </p>\n <div style={{ marginBottom: '10px' }}>\n {!(chequebookAddress?.chequebookAddress && chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0)) && (\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?.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({ isLoading, isOk, topology }: Props): ReactElement | null {\n if (isLoading) return null\n\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, useEffect, useState } 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, Sync, 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 { StatusChequebookHook } from '../../hooks/status'\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 isLoading: boolean\n component: ReactElement\n}\n\ninterface Props {\n nodeVersion: StatusNodeVersionHook\n ethereumConnection: StatusEthereumConnectionHook\n debugApiConnection: StatusHookCommon\n apiConnection: StatusHookCommon\n topology: StatusTopologyHook\n chequebook: StatusChequebookHook\n}\n\nexport default function NodeSetupWorkflow({\n nodeVersion,\n ethereumConnection,\n debugApiConnection,\n apiConnection,\n topology,\n chequebook,\n}: Props): ReactElement {\n const classes = useStyles()\n const [activeStep, setActiveStep] = useState(-1)\n\n const steps: Step[] = [\n {\n label: 'Connected to Node DebugAPI',\n isOk: debugApiConnection.isOk,\n isLoading: debugApiConnection.isLoading,\n component: <DebugConnectionCheck {...debugApiConnection} />,\n },\n {\n label: 'Running latest Bee version',\n isOk: nodeVersion.isOk,\n isLoading: nodeVersion.isLoading,\n component: <VersionCheck {...nodeVersion} />,\n },\n {\n label: 'Connected to Ethereum Blockchain',\n isOk: ethereumConnection.isOk,\n isLoading: ethereumConnection.isLoading,\n component: <EthereumConnectionCheck {...ethereumConnection} />,\n },\n {\n label: 'Deployed and Funded Chequebook',\n isOk: chequebook.isOk,\n isLoading: chequebook.isLoading,\n component: <ChequebookDeployFund ethereumAddress={ethereumConnection.nodeAddresses?.ethereum} {...chequebook} />,\n },\n {\n label: 'Connected to Node API',\n isOk: apiConnection.isOk,\n isLoading: apiConnection.isLoading,\n component: <NodeConnectionCheck {...apiConnection} />,\n },\n {\n label: 'Connected to Peers',\n isOk: topology.isOk,\n isLoading: topology.isLoading,\n component: <PeerConnection {...topology} />,\n },\n ]\n\n useEffect(() => {\n // If the user already changed the active step we don't want to overwrite it\n if (activeStep >= 0 && activeStep < steps.length) return\n\n // If any step is not fully loaded yet return\n if (!steps.every(step => !step.isLoading)) return\n\n // Select first step that is not OK\n // This is deliberately a for loop (and not forEach) so that we can terminate the useEffect from within the cycle\n for (let i = 0; i < steps.length; ++i) {\n if (!steps[i].isOk) {\n setActiveStep(i)\n\n return\n }\n }\n }, [steps])\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 <span style={{ marginLeft: '25px' }}>\n <Button variant=\"outlined\" size=\"small\" onClick={() => window.location.reload()}>\n <Sync />\n <span style={{ marginLeft: '7px' }}>Refresh Checks</span>\n </Button>\n </span>\n </Typography>\n <Stepper nonLinear activeStep={activeStep} orientation=\"vertical\">\n {steps.map(({ label, isOk, component, isLoading }, index) => (\n <Step key={label}>\n <StepLabel\n disabled={isLoading}\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 } 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 { CheckCircle, Error, ArrowRight, ArrowDropUp } from '@material-ui/icons/'\nimport { NodeAddresses, Topology } from '@ethersphere/bee-js'\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 isOk,\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 <Typography component=\"h5\" variant=\"h5\" style={{ display: 'flex', justifyContent: 'space-between' }}>\n {isOk && (\n <div>\n <CheckCircle style={{ color: '#32c48d', marginRight: '7px' }} />\n <span>Your Bee node is running as expected</span>\n </div>\n )}\n {!isOk && (\n <div>\n <Error style={{ color: '#c9201f', marginRight: '7px' }} />\n <span>Could not connect to Bee Node</span>\n </div>\n )}\n </Typography>\n {isOk && (\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=\"/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 )}\n </CardContent>\n </Card>\n )\n}\n\nexport default StatusCard\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'\nimport { Skeleton } from '@material-ui/lab'\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 isLoadingNodeAddresses: boolean\n chequebookAddress: ChequebookAddressResponse | null\n isLoadingChequebookAddress: boolean\n}\n\nfunction EthereumAddressCard(props: Props): ReactElement {\n const classes = useStyles()\n\n return (\n <Card className={classes.root}>\n {props.isLoadingNodeAddresses ? (\n <div style={{ padding: '16px' }}>\n <Skeleton width={300} height={30} animation=\"wave\" />\n <Skeleton width={300} height={50} animation=\"wave\" />\n </div>\n ) : (\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 {props.isLoadingChequebookAddress ? (\n <div style={{ padding: '16px' }}>\n <Skeleton width={300} height={30} animation=\"wave\" />\n <Skeleton width={300} height={50} animation=\"wave\" />\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 )}\n </Card>\n )\n}\n\nexport default EthereumAddressCard\n","import { ReactElement } from 'react'\nimport { Container, CircularProgress } from '@material-ui/core'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\n\nimport NodeSetupWorkflow from './NodeSetupWorkflow'\nimport StatusCard from './StatusCard'\nimport EthereumAddressCard from '../../components/EthereumAddressCard'\nimport {\n useStatusEthereumConnection,\n useStatusNodeVersion,\n useStatusDebugConnection,\n useStatusConnection,\n useStatusTopology,\n useStatusChequebook,\n} from '../../hooks/status'\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 nodeVersion = useStatusNodeVersion()\n const ethereumConnection = useStatusEthereumConnection()\n const debugApiConnection = useStatusDebugConnection()\n const apiConnection = useStatusConnection()\n const topology = useStatusTopology()\n const chequebook = useStatusChequebook()\n\n const checks = [nodeVersion, ethereumConnection, debugApiConnection, apiConnection, topology, chequebook]\n\n // If any check data are still loading\n if (!checks.every(c => !c.isLoading)) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n return (\n <div className={classes.root}>\n <StatusCard\n userBeeVersion={nodeVersion.userVersion}\n isLatestBeeVersion={nodeVersion.isLatestBeeVersion}\n isOk={checks.every(c => c.isOk)}\n nodeTopology={topology.topology}\n latestUrl={nodeVersion.latestUrl}\n nodeAddresses={ethereumConnection.nodeAddresses}\n />\n {ethereumConnection.nodeAddresses && chequebook.chequebookAddress && (\n <EthereumAddressCard\n nodeAddresses={ethereumConnection.nodeAddresses}\n isLoadingNodeAddresses={ethereumConnection.isLoading}\n chequebookAddress={chequebook.chequebookAddress}\n isLoadingChequebookAddress={chequebook.isLoading}\n />\n )}\n <NodeSetupWorkflow\n nodeVersion={nodeVersion}\n ethereumConnection={ethereumConnection}\n debugApiConnection={debugApiConnection}\n apiConnection={apiConnection}\n topology={topology}\n chequebook={chequebook}\n />\n </div>\n )\n}\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/'\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=\"/\">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 { ReactElement, useState } 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 { apiHost } from '../../constants'\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\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={`${apiHost}/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 } from 'react'\nimport { beeApi } from '../services/bee'\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 [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 try {\n setIsLoading(true)\n const stamps = await beeApi.stamps.getPostageStamps()\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 { beeApi } from '../../services/bee'\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 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 const amount = BigInt(values.amount)\n const depth = Number.parseInt(values.depth)\n const options = values.label ? { label: values.label } : undefined\n await beeApi.stamps.buyPostageStamp(amount, 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 { beeApi } from '../../services/bee'\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 { 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 setIsUploadingFile(true)\n beeApi.files\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 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\n role=\"tabpanel\"\n hidden={value !== index}\n id={`simple-tabpanel-${index}`}\n aria-labelledby={`simple-tab-${index}`}\n {...other}\n >\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}\n\nexport default function SimpleTabs({ values }: Props): ReactElement {\n const classes = useStyles()\n const [value, setValue] = React.useState<number>(0)\n\n const handleChange = (event: React.ChangeEvent<Record<string, never>>, newValue: number) => {\n setValue(newValue)\n }\n\n return (\n <div className={classes.root}>\n <Tabs value={value} onChange={handleChange} aria-label=\"simple tabs example\">\n {values.map(({ label }, index) => (\n <Tab key={index} label={label} />\n ))}\n </Tabs>\n {values.map(({ component }, index) => (\n <TabPanel key={index} value={value} index={index}>\n {component}\n </TabPanel>\n ))}\n </div>\n )\n}\n","import { ReactElement } from 'react'\n\nimport { Container, CircularProgress } from '@material-ui/core'\n\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { useApiHealth, useDebugApiHealth } from '../../hooks/apiHooks'\nimport Download from './Download'\nimport Upload from './Upload'\nimport TabsContainer from '../../components/TabsContainer'\n\nexport default function Files(): ReactElement {\n const { health, isLoadingHealth } = useApiHealth()\n const { nodeHealth, isLoadingNodeHealth } = useDebugApiHealth()\n\n if (isLoadingHealth || isLoadingNodeHealth) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (!health || nodeHealth?.status !== 'ok') 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 React, { ReactElement, useState } 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 Container,\n CircularProgress,\n} from '@material-ui/core'\nimport { Autorenew } from '@material-ui/icons'\n\nimport { beeDebugApi } from '../../services/bee'\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 isLoading: boolean\n error: Error | null\n}\n\nfunction PeerTable(props: Props): ReactElement {\n const classes = useStyles()\n\n const [peerLatency, setPeerLatency] = useState([{ peerId: '', rtt: '', loading: false }])\n\n const PingPeer = (peerId: string) => {\n setPeerLatency([...peerLatency, { peerId: peerId, rtt: '', loading: true }])\n beeDebugApi.connectivity\n .ping(peerId)\n .then(res => {\n setPeerLatency([...peerLatency, { peerId: peerId, rtt: res.rtt, loading: false }])\n })\n .catch(() => {\n setPeerLatency([...peerLatency, { peerId: peerId, rtt: 'error', loading: false }])\n })\n }\n\n if (props.isLoading) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (props.error || props.peers === null) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <p>Failed to load peers</p>\n </Container>\n )\n }\n\n return (\n <div>\n <TableContainer component={Paper}>\n <Table className={classes.table} aria-label=\"simple 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 {\n // FIXME: this should be broken up\n /* eslint-disable no-nested-ternary */\n peerLatency.find(item => item.peerId === peer.address) ? (\n peerLatency.filter(item => item.peerId === peer.address)[0].loading ? (\n <CircularProgress size={20} />\n ) : (\n peerLatency.filter(item => item.peerId === peer.address)[0].rtt\n )\n ) : (\n <Autorenew />\n )\n /* eslint-enable no-nested-ternary */\n }\n </Button>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n\nexport default PeerTable\n","import type { ReactElement } from 'react'\n\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Card, CardContent, Typography } from '@material-ui/core/'\nimport { Skeleton } from '@material-ui/lab'\n\nconst useStyles = makeStyles({\n root: {\n minWidth: 275,\n },\n title: {\n fontSize: 16,\n },\n pos: {\n marginBottom: 12,\n },\n})\n\ninterface Props {\n label: string\n statistic?: string\n loading?: boolean\n}\n\nexport default function StatCard({ loading, label, statistic }: 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 <Typography className={classes.title} color=\"textSecondary\" gutterBottom>\n {label}\n </Typography>\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 StatCard from './StatCard'\n\ninterface Props {\n isLoading: boolean\n topology: Topology | null\n error: Error | null // FIXME: should display error\n}\n\nconst TopologyStats = ({ isLoading, topology }: 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 label=\"Connected Peers\" statistic={topology?.connected.toString()} loading={isLoading} />\n </Grid>\n <Grid key={2} item xs={12} sm={12} md={6} lg={4} xl={4}>\n <StatCard label=\"Population\" statistic={topology?.population.toString()} loading={isLoading} />\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()} loading={isLoading} />\n </Grid>\n </Grid>\n </Grid>\n)\n\nexport default TopologyStats\n","import { Container, CircularProgress } from '@material-ui/core/'\nimport PeerTable from './PeerTable'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\n\nimport { useApiNodeTopology, useApiNodePeers, useDebugApiHealth } from '../../hooks/apiHooks'\nimport TopologyStats from '../../components/TopologyStats'\nimport { ReactElement } from 'react'\n\nexport default function Peers(): ReactElement {\n const topology = useApiNodeTopology()\n const debugHealth = useDebugApiHealth()\n const peers = useApiNodePeers()\n\n if (debugHealth.isLoadingNodeHealth) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (debugHealth.error) {\n return <TroubleshootConnectionCard />\n }\n\n return (\n <>\n <TopologyStats {...topology} />\n <PeerTable {...peers} />\n </>\n )\n}\n","import type { ReactElement } from 'react'\nimport { beeDebugApi } from '../services/bee'\n\nimport WDModal from '../components/WDModal'\nimport { BigNumber } from 'bignumber.js'\n\nexport default function WithdrawModal(): ReactElement {\n return (\n <WDModal\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={beeDebugApi.chequebook.withdraw}\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 { Skeleton } from '@material-ui/lab'\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 isLoading: boolean\n}\n\nfunction AccountCard({ totalreceived, totalsent, chequebookBalance, isLoading }: 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 {!isLoading && (\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 )}\n {isLoading && (\n <div className={classes.gridContainer}>\n <Skeleton width={180} height={110} animation=\"wave\" />\n <Skeleton width={180} height={110} animation=\"wave\" />\n <Skeleton width={180} height={110} animation=\"wave\" />\n </div>\n )}\n </Card>\n </div>\n )\n}\n\nexport default AccountCard\n","import { ReactElement, useState } 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 DialogTitle from '@material-ui/core/DialogTitle'\nimport { Container, CircularProgress } from '@material-ui/core'\nimport { useSnackbar } from 'notistack'\n\nimport { beeDebugApi } from '../services/bee'\n\nimport EthereumAddress from './EthereumAddress'\n\ninterface Props {\n peerId: string\n uncashedAmount: string\n}\n\nexport default function DepositModal({ peerId, uncashedAmount }: Props): ReactElement {\n const [open, setOpen] = useState<boolean>(false)\n const [loadingCashout, setLoadingCashout] = useState<boolean>(false)\n const { enqueueSnackbar } = useSnackbar()\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const handleCashout = () => {\n if (peerId) {\n setLoadingCashout(true)\n beeDebugApi.chequebook\n .peerCashout(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 } from '@ethersphere/bee-js'\nimport { useEffect, useState } from 'react'\nimport { Token } from '../models/Token'\nimport { beeDebugApi } from '../services/bee'\nimport { Balance, Settlement, useApiPeerBalances, useApiSettlements } from './apiHooks'\n\ninterface UseAccountingHook {\n isLoading: boolean\n isLoadingUncashed: boolean\n error: Error | null\n totalsent: Token\n totalreceived: Token\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 = (): UseAccountingHook => {\n const settlements = useApiSettlements()\n const balances = useApiPeerBalances()\n\n const [err, setErr] = useState<Error | null>(null)\n const [isLoadingUncashed, setIsloadingUncashed] = useState<boolean>(false)\n const [uncashedAmounts, setUncashedAmounts] = useState<LastCashoutActionResponse[] | undefined>(undefined)\n\n const error = balances.error || settlements.error || err\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 || !settlements.settlements || uncashedAmounts || error) return\n\n setIsloadingUncashed(true)\n const promises = settlements.settlements.settlements\n .filter(({ received }) => received.toBigNumber.gt('0'))\n .map(({ peer }) => beeDebugApi.chequebook.getPeerLastCashout(peer))\n\n Promise.all(promises)\n .then(setUncashedAmounts)\n .catch(setErr)\n .finally(() => setIsloadingUncashed(false))\n }, [settlements, isLoadingUncashed, uncashedAmounts, error])\n\n const accounting = mergeAccounting(balances.peerBalances, settlements.settlements?.settlements, uncashedAmounts)\n\n return {\n isLoading: settlements.isLoadingSettlements || balances.isLoadingPeerBalances,\n isLoadingUncashed,\n error,\n accounting,\n totalsent: settlements.settlements?.totalSent || new Token('0'),\n totalreceived: settlements.settlements?.totalReceived || new Token('0'),\n }\n}\n","import type { ReactElement } from 'react'\nimport { Theme, createStyles, makeStyles } from '@material-ui/core/styles'\nimport { Container, CircularProgress } from '@material-ui/core'\n\nimport AccountCard from '../accounting/AccountCard'\nimport BalancesTable from './BalancesTable'\nimport EthereumAddressCard from '../../components/EthereumAddressCard'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\n\nimport {\n useApiNodeAddresses,\n useApiChequebookAddress,\n useApiChequebookBalance,\n useApiHealth,\n useDebugApiHealth,\n} from '../../hooks/apiHooks'\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 { chequebookAddress, isLoadingChequebookAddress } = useApiChequebookAddress()\n const { chequebookBalance, isLoadingChequebookBalance } = useApiChequebookBalance()\n const { nodeAddresses, isLoadingNodeAddresses } = useApiNodeAddresses()\n const { health, isLoadingHealth } = useApiHealth()\n const { nodeHealth, isLoadingNodeHealth } = useDebugApiHealth()\n const { isLoading, totalsent, totalreceived, accounting, isLoadingUncashed, error } = useAccounting()\n\n if (isLoadingHealth || isLoadingNodeHealth) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (nodeHealth?.status !== 'ok' || !health) return <TroubleshootConnectionCard />\n\n return (\n <div className={classes.root}>\n <AccountCard\n chequebookAddress={chequebookAddress}\n isLoading={isLoadingChequebookAddress || isLoading || isLoadingChequebookBalance}\n chequebookBalance={chequebookBalance}\n totalsent={totalsent}\n totalreceived={totalreceived}\n />\n <EthereumAddressCard\n nodeAddresses={nodeAddresses}\n isLoadingNodeAddresses={isLoadingNodeAddresses}\n chequebookAddress={chequebookAddress}\n isLoadingChequebookAddress={isLoadingChequebookAddress}\n />\n {error && (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n Error loading accounting details: {error.message}\n </Container>\n )}\n {!error && <BalancesTable accounting={accounting} isLoadingUncashed={isLoadingUncashed} />}\n </div>\n )\n}\n","import React, { ReactElement, useState } from 'react'\nimport { Paper, Container, TextField, Typography, Button } from '@material-ui/core'\n\nexport default function Settings(): ReactElement {\n const [refreshVisibility, toggleRefreshVisibility] = useState(false)\n const [host, setHost] = useState('')\n const [debugHost, setDebugHost] = useState('')\n\n const handleNewHostConnection = () => {\n if (host) {\n sessionStorage.setItem('api_host', host)\n }\n\n if (debugHost) {\n sessionStorage.setItem('debug_api_host', debugHost)\n }\n\n if (host || debugHost) {\n toggleRefreshVisibility(!refreshVisibility)\n window.location.reload()\n }\n }\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={\n sessionStorage.getItem('api_host') ? sessionStorage.getItem('api_host') : process.env.REACT_APP_BEE_HOST\n }\n margin=\"normal\"\n InputLabelProps={{\n shrink: true,\n }}\n onChange={e => {\n setHost(e.target.value)\n toggleRefreshVisibility(true)\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={\n sessionStorage.getItem('debug_api_host')\n ? sessionStorage.getItem('debug_api_host')\n : process.env.REACT_APP_BEE_DEBUG_HOST\n }\n onChange={e => {\n setDebugHost(e.target.value)\n toggleRefreshVisibility(true)\n }}\n margin=\"normal\"\n InputLabelProps={{\n shrink: true,\n }}\n variant=\"filled\"\n />\n </Paper>\n {refreshVisibility ? (\n <div style={{ marginTop: '20px' }}>\n <Button variant=\"outlined\" color=\"primary\" onClick={() => handleNewHostConnection()}>\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 { ReactElement, useEffect, useState } from 'react'\n\ninterface Props {\n date: number | null\n}\n\nexport default function LastUpdate({ date }: Props): ReactElement {\n const [duration, setDuration] = useState<string>('never')\n\n const refresh = () => {\n if (!date) setDuration('never')\n else setDuration(`${((Date.now() - date) / 1000).toFixed()} seconds ago`)\n }\n\n useEffect(() => {\n refresh()\n const i = setInterval(refresh, 1000)\n\n return () => clearInterval(i)\n }, [date])\n\n return <span>Last Update: {duration}</span>\n}\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'\nimport LastUpdate from '../../components/LastUpdate'\n\nimport { useApiHealth, useDebugApiHealth } from '../../hooks/apiHooks'\nimport { Context } from '../../providers/Stamps'\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 { health, isLoadingHealth } = useApiHealth()\n const { nodeHealth, isLoadingNodeHealth } = useDebugApiHealth()\n const { stamps, isLoading, error, lastUpdate, start, stop } = useContext(Context)\n useEffect(() => {\n start()\n\n return () => stop()\n }, [])\n\n if (isLoadingHealth || isLoadingNodeHealth) {\n return (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n <CircularProgress />\n </Container>\n )\n }\n\n if (nodeHealth?.status !== 'ok' || !health) 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 <LastUpdate date={lastUpdate} />\n <div style={{ height: '5px' }}>{isLoading && <CircularProgress />}</div>\n </div>\n <StampsTable postageStamps={stamps} />\n </>\n )}\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport { Switch } from 'react-router-dom'\n\nimport AppRoute from './AppRoute'\n\n// layouts\nimport Dashboard from '../layout/Dashboard'\n\n// pages\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\nconst BaseRouter = (): ReactElement => (\n <Switch>\n <AppRoute exact path=\"/\" layout={Dashboard} component={Status} />\n <AppRoute exact path=\"/files/\" layout={Dashboard} component={Files} />\n <AppRoute exact path=\"/peers/\" layout={Dashboard} component={Peers} />\n <AppRoute exact path=\"/accounting/\" layout={Dashboard} component={Accounting} />\n <AppRoute exact path=\"/settings/\" layout={Dashboard} component={Settings} />\n <AppRoute exact path=\"/stamps/\" layout={Dashboard} component={Stamps} />\n </Switch>\n)\n\nexport default BaseRouter\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 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 lightTheme = 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\nexport const darkTheme = createMuiTheme({\n palette: {\n type: 'dark',\n background: {\n default: '#0d1117',\n paper: '#161b22',\n },\n primary: {\n light: orange.A200,\n main: '#dd7700',\n dark: orange[800],\n },\n secondary: {\n main: '#1f2937',\n },\n },\n typography: {\n fontFamily: ['Work Sans', 'Montserrat', 'Nunito', 'Roboto', '\"Helvetica Neue\"', 'Arial', 'sans-serif'].join(','),\n },\n})\n\ndarkTheme.overrides = componentsOverrides(darkTheme)\ndarkTheme.props = propsOverrides\nlightTheme.overrides = componentsOverrides(lightTheme)\nlightTheme.props = propsOverrides\n","import { ReactElement, useEffect, useState } from 'react'\nimport { BrowserRouter as Router } from 'react-router-dom'\nimport './App.css'\n\nimport { ThemeProvider } from '@material-ui/styles'\nimport CssBaseline from '@material-ui/core/CssBaseline'\nimport { SnackbarProvider } from 'notistack'\n\nimport BaseRouter from './routes/routes'\nimport { lightTheme, darkTheme } from './theme'\nimport { Provider as StampsProvider } from './providers/Stamps'\n\nconst App = (): ReactElement => {\n const [themeMode, toggleThemeMode] = useState('light')\n\n useEffect(() => {\n const theme = localStorage.getItem('theme')\n\n if (theme) {\n toggleThemeMode(String(localStorage.getItem('theme')))\n } else if (window?.matchMedia('(prefers-color-scheme: dark)')?.matches) {\n toggleThemeMode('dark')\n }\n\n window?.matchMedia('(prefers-color-scheme: dark)')?.addEventListener('change', e => {\n toggleThemeMode(e?.matches ? 'dark' : 'light')\n })\n\n return () =>\n window?.matchMedia('(prefers-color-scheme: dark)')?.removeEventListener('change', e => {\n toggleThemeMode(e?.matches ? 'dark' : 'light')\n })\n }, [])\n\n return (\n <div className=\"App\">\n <ThemeProvider theme={themeMode === 'light' ? lightTheme : darkTheme}>\n <StampsProvider>\n <SnackbarProvider>\n <>\n <CssBaseline />\n <Router>\n <BaseRouter />\n </Router>\n </>\n </SnackbarProvider>\n </StampsProvider>\n </ThemeProvider>\n </div>\n )\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":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrBiB,EAAG,GAGAZ,EAAkB,GAQtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU8B,QAGnC,IAAIC,EAASH,EAAiB5B,GAAY,CACzCK,EAAGL,EACHgC,GAAG,EACHF,QAAS,IAUV,OANAhB,EAAQd,GAAUW,KAAKoB,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAG/DK,EAAOC,GAAI,EAGJD,EAAOD,QAKfJ,EAAoBO,EAAI,SAAuBhC,GAC9C,IAAIiC,EAAW,GAKXC,EAAqBvB,EAAgBX,GACzC,GAA0B,IAAvBkC,EAGF,GAAGA,EACFD,EAASrB,KAAKsB,EAAmB,QAC3B,CAEN,IAAIC,EAAU,IAAIC,SAAQ,SAASC,EAASC,GAC3CJ,EAAqBvB,EAAgBX,GAAW,CAACqC,EAASC,MAE3DL,EAASrB,KAAKsB,EAAmB,GAAKC,GAGtC,IACII,EADAC,EAASC,SAASC,cAAc,UAGpCF,EAAOG,QAAU,QACjBH,EAAOI,QAAU,IACbnB,EAAoBoB,IACvBL,EAAOM,aAAa,QAASrB,EAAoBoB,IAElDL,EAAOO,IA1DV,SAAwB/C,GACvB,OAAOyB,EAAoBuB,EAAI,cAAgB,GAAGhD,IAAUA,GAAW,IAAM,CAAC,EAAI,YAAYA,GAAW,YAyD1FiD,CAAejD,GAG5B,IAAIkD,EAAQ,IAAIC,MAChBZ,EAAmB,SAAUa,GAE5BZ,EAAOa,QAAUb,EAAOc,OAAS,KACjCC,aAAaX,GACb,IAAIY,EAAQ7C,EAAgBX,GAC5B,GAAa,IAAVwD,EAAa,CACf,GAAGA,EAAO,CACT,IAAIC,EAAYL,IAAyB,SAAfA,EAAMM,KAAkB,UAAYN,EAAMM,MAChEC,EAAUP,GAASA,EAAMQ,QAAUR,EAAMQ,OAAOb,IACpDG,EAAMW,QAAU,iBAAmB7D,EAAU,cAAgByD,EAAY,KAAOE,EAAU,IAC1FT,EAAMY,KAAO,iBACbZ,EAAMQ,KAAOD,EACbP,EAAMa,QAAUJ,EAChBH,EAAM,GAAGN,GAEVvC,EAAgBX,QAAWgE,IAG7B,IAAIpB,EAAUqB,YAAW,WACxB1B,EAAiB,CAAEmB,KAAM,UAAWE,OAAQpB,MAC1C,MACHA,EAAOa,QAAUb,EAAOc,OAASf,EACjCE,SAASyB,KAAKC,YAAY3B,GAG5B,OAAOJ,QAAQgC,IAAInC,IAIpBR,EAAoB4C,EAAIxD,EAGxBY,EAAoB6C,EAAI3C,EAGxBF,EAAoB8C,EAAI,SAAS1C,EAASiC,EAAMU,GAC3C/C,EAAoBgD,EAAE5C,EAASiC,IAClCvD,OAAOmE,eAAe7C,EAASiC,EAAM,CAAEa,YAAY,EAAMC,IAAKJ,KAKhE/C,EAAoBoD,EAAI,SAAShD,GACX,qBAAXiD,QAA0BA,OAAOC,aAC1CxE,OAAOmE,eAAe7C,EAASiD,OAAOC,YAAa,CAAEC,MAAO,WAE7DzE,OAAOmE,eAAe7C,EAAS,aAAc,CAAEmD,OAAO,KAQvDvD,EAAoBwD,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQvD,EAAoBuD,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAK7E,OAAO8E,OAAO,MAGvB,GAFA5D,EAAoBoD,EAAEO,GACtB7E,OAAOmE,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOvD,EAAoB8C,EAAEa,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIR3D,EAAoB+D,EAAI,SAAS1D,GAChC,IAAI0C,EAAS1C,GAAUA,EAAOqD,WAC7B,WAAwB,OAAOrD,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAL,EAAoB8C,EAAEC,EAAQ,IAAKA,GAC5BA,GAIR/C,EAAoBgD,EAAI,SAASgB,EAAQC,GAAY,OAAOnF,OAAOC,UAAUC,eAAeC,KAAK+E,EAAQC,IAGzGjE,EAAoBuB,EAAI,KAGxBvB,EAAoBkE,GAAK,SAASC,GAA2B,MAApBC,QAAQ3C,MAAM0C,GAAYA,GAEnE,IAAIE,EAAaC,KAAK,0CAA4CA,KAAK,2CAA6C,GAChHC,EAAmBF,EAAWlF,KAAK2E,KAAKO,GAC5CA,EAAWlF,KAAOf,EAClBiG,EAAaA,EAAWG,QACxB,IAAI,IAAI7F,EAAI,EAAGA,EAAI0F,EAAWxF,OAAQF,IAAKP,EAAqBiG,EAAW1F,IAC3E,IAAIU,EAAsBkF,EAI1B9E,I","file":"static/js/runtime-main.e585a8a5.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"3\":\"0c27d1d4\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp@ethersphere/bee-dashboard\"] = this[\"webpackJsonp@ethersphere/bee-dashboard\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
|