@ethersphere/bee-dashboard 0.7.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/README.md +27 -12
- package/build/asset-manifest.json +12 -12
- package/build/index.html +1 -1
- package/build/static/js/2.4ff98457.chunk.js +3 -0
- package/build/static/js/{2.8c0609fe.chunk.js.LICENSE.txt → 2.4ff98457.chunk.js.LICENSE.txt} +13 -0
- package/build/static/js/2.4ff98457.chunk.js.map +1 -0
- package/build/static/js/3.11a1627e.chunk.js +2 -0
- package/build/static/js/3.11a1627e.chunk.js.map +1 -0
- package/build/static/js/main.2ee7499d.chunk.js +2 -0
- package/build/static/js/main.2ee7499d.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.ffdbbcc1.js → runtime-main.6c2da3b6.js} +2 -2
- package/build/static/js/{runtime-main.ffdbbcc1.js.map → runtime-main.6c2da3b6.js.map} +1 -1
- package/lib/App.js +105277 -0
- package/package.json +69 -39
- package/serve.js +0 -0
- package/build/static/js/2.8c0609fe.chunk.js +0 -3
- package/build/static/js/2.8c0609fe.chunk.js.map +0 -1
- package/build/static/js/3.86164d1b.chunk.js +0 -2
- package/build/static/js/3.86164d1b.chunk.js.map +0 -1
- package/build/static/js/main.396e3ebb.chunk.js +0 -2
- package/build/static/js/main.396e3ebb.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["config.ts","components/ErrorBoundary.tsx","utils/index.ts","models/Token.ts","providers/Settings.tsx","providers/Bee.tsx","hooks/apiHooks.tsx","components/AlertVersion.tsx","assets/logo.svg","components/ExpandableList.tsx","components/ExpandableListItem.tsx","components/ExpandableListItemActions.tsx","components/ExpandableListItemKey.tsx","components/ClipboardCopy.tsx","components/QRCodeModal.tsx","components/EthereumAddress.tsx","components/CashoutModal.tsx","pages/accounting/PeerBalances.tsx","components/TroubleshootConnectionCard.tsx","hooks/accounting.ts","components/WithdrawDepositModal.tsx","containers/WithdrawModal.tsx","containers/DepositModal.tsx","pages/accounting/index.tsx","components/ExpandableListItemNote.tsx","components/ExpandableListItemInput.tsx","utils/local-storage.ts","utils/hash.ts","components/ExpandableListItemLink.tsx","components/History.tsx","utils/date.ts","pages/files/FileNavigation.tsx","pages/files/Download.tsx","components/Loading.tsx","utils/file.ts","utils/SwarmFile.ts","components/FitImage.tsx","components/StripedWrapper.tsx","pages/files/AssetIcon.tsx","pages/files/AssetPreview.tsx","pages/files/AssetSummary.tsx","components/SwarmButton.tsx","pages/files/DownloadActionBar.tsx","pages/files/Share.tsx","components/HistoryHeader.tsx","providers/File.tsx","providers/Stamps.tsx","pages/stamps/CreatePostageStampModal.tsx","pages/stamps/SelectPostageStampModal.tsx","components/Capacity.tsx","pages/stamps/PostageStamp.tsx","pages/files/StampPreview.tsx","pages/files/UploadActionBar.tsx","pages/files/Upload.tsx","pages/files/UploadArea.tsx","pages/files/UploadLander.tsx","utils/threshold.ts","components/TopologyStats.tsx","pages/info/index.tsx","pages/settings/index.tsx","components/ExpandableElement.tsx","pages/stamps/StampsTable.tsx","pages/stamps/index.tsx","components/TabsContainer.tsx","providers/Platform.tsx","components/CodeBlock.tsx","components/CodeBlockTabs.tsx","components/StatusIcon.tsx","pages/status/SetupSteps/DebugConnectionCheck.tsx","pages/status/SetupSteps/NodeConnectionCheck.tsx","pages/status/SetupSteps/VersionCheck.tsx","pages/status/SetupSteps/EthereumConnectionCheck.tsx","pages/status/SetupSteps/ChequebookDeployFund.tsx","routes.tsx","pages/status/SetupSteps/PeerConnection.tsx","pages/status/index.tsx","components/SideBarItem.tsx","components/SideBarStatus.tsx","components/SideBar.tsx","layout/Dashboard.tsx","theme.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["getProcessEnv","key","process","config","BEE_API_HOST","BEE_DEBUG_API_HOST","BLOCKCHAIN_EXPLORER_URL","BEE_DOCS_HOST","BEE_DISCORD_HOST","GITHUB_REPO_URL","this","sessionStorage","getItem","ErrorBoundary","props","state","error","errorInfo","console","message","children","Component","isInteger","value","BigNumber","isBigNumber","makeBigNumber","toString","TypeError","sleepMs","ms","a","Promise","resolve","setTimeout","POSSIBLE_DECIMALS","Token","amount","decimals","includes","BigInt","toFixed","dividedBy","pow","digits","toDecimal","t","multipliedBy","initialValues","apiUrl","apiDebugUrl","beeApi","beeDebugApi","setApiUrl","setDebugApiUrl","lockedApiSettings","Context","createContext","Consumer","Provider","beeApiUrl","beeDebugApiUrl","extLockedApiSettings","useState","setBeeApi","setBeeDebugApi","Boolean","useEffect","Bee","setItem","e","BeeDebug","startedInDevMode","window","location","search","status","all","version","blockchainConnection","debugApiConnection","apiConnection","topology","chequebook","latestPublishedVersion","undefined","latestUserVersion","latestUserVersionExact","isLatestBeeVersion","latestBeeVersionUrl","apiHealth","debugApiHealth","nodeAddresses","chequebookAddress","peers","chequebookBalance","peerBalances","peerCheques","settlements","latestBeeRelease","isLoading","isRefreshing","lastUpdate","start","stop","refresh","reject","getStatus","devMode","REACT_APP_DEV_MODE","semver","satisfies","engines","bee","includePrerelease","ethereum","connected","totalBalance","toBigNumber","isGreaterThan","Object","values","every","v","useContext","SettingsContext","setApiHealth","setDebugApiHealth","setNodeAddresses","setNodeTopology","setChequebookAddress","setPeers","setChequebookBalance","setPeerBalances","setPeerCheques","setSettlements","setLatestBeeRelease","isLoadingLatestBeeRelease","setLoading","setError","axios","get","then","res","data","catch","finally","useLatestBeeRelease","setIsLoading","setIsRefreshing","setLastUpdate","frequency","setFrequency","coerce","name","chequeBalanceWrapper","getChequebookBalance","availableBalance","peerBalanceWrapper","getAllBalances","balances","map","peer","balance","settlementsWrapper","getAllSettlements","totalReceived","totalSent","received","sent","promises","isConnected","getHealth","getNodeAddresses","getTopology","getPeers","getChequebookAddress","getLastCheques","allSettled","Date","now","interval","setInterval","clearInterval","html_url","freq","useStyles","makeStyles","theme","createStyles","root","width","marginBottom","spacing","VersionAlert","classes","open","setOpen","isExactlySupportedBeeVersion","SUPPORTED_BEE_VERSION_EXACT","Collapse","in","className","Alert","severity","action","IconButton","color","size","onClick","fontSize","AlertTitle","padding","margin","marginTop","rootLevel1","rootLevel2","header","backgroundColor","palette","background","paper","contentLevel0","contentLevel12","infoText","ExpandableList","label","level","defaultOpen","info","rootLevelClass","typographyVariant","contentLevelClass","ListItem","button","ListItemText","primary","Typography","variant","style","display","ExpandLess","ExpandMore","timeout","unmountOnExit","wordBreak","copyValue","cursor","borderRadius","main","ExpandableListItem","tooltip","Grid","container","direction","justifyContent","alignItems","Tooltip","title","placement","arrow","strokeWidth","marginRight","ExpandableListItemActions","Array","isArray","filter","x","i","borderLeft","headerOpen","content","keyMargin","ExpandableListItemKey","s","copied","setCopied","toggleOpen","tooltipClickHandler","tooltipCloseHandler","splitValues","nonPrefixLength","replace","length","lengthWithoutPrefix","match","split","hasPrefix","test","spanText","onClose","text","component","ClipboardCopy","enqueueSnackbar","useSnackbar","marginLeft","height","QRCodeModal","FilterCenterFocusSharp","Dialog","textAlign","DialogTitle","id","bgColor","fgColor","includeMargin","renderAs","EthereumAddress","address","hideBlockie","paddingTop","string","truncate","maxWidth","overflow","textOverflow","whiteSpace","href","transaction","target","rel","CheckoutModal","peerId","uncashedAmount","loadingCashout","setLoadingCashout","handleClose","Button","startIcon","substr","DialogContent","DialogContentText","overflowWrap","Container","CircularProgress","DialogActions","cashoutLastCheque","disabled","PeerBalances","accounting","isLoadingUncashed","totalUncashed","toFixedDecimal","total","icon","TroubleshootConnectionCard","item","align","Link","to","ROUTES","STATUS","useAccounting","setIsloadingUncashed","uncashedAmounts","setUncashedAmounts","gt","fn","maxRetries","delayMs","tries","results","makeRetriablePromise","getLastCashoutAction","promiseSettledResults","fulfilled","promise","rejected","reason","String","unwrapPromiseSettlements","forEach","plus","minus","sort","b","diff","toNumber","mergeAccounting","WithdrawDepositModal","successMessage","errorMessage","dialogMessage","min","max","setAmount","amountToken","setAmountToken","amountError","setAmountError","handleAction","toBigInt","transactionHash","stopPropagation","Input","autoFocus","type","placeholder","fullWidth","onChange","fromDecimal","isLessThan","Error","FormHelperText","WithdrawModal","withdrawTokens","DepositModal","depositTokens","Accounting","BeeContext","typography","ExpandableListItemNote","HISTORY_KEYS","unselectableLabel","userSelect","WebkitUserSelect","MozUserSelect","msUserSelect","onConfirm","confirmLabel","confirmLabelDisabled","expandedOnly","helperText","mapperFn","locked","inputValue","setInputValue","InputBase","hidden","shortenHash","hash","sliceLength","slice","putHistory","history","getHistorySafe","existingIndex","findIndex","splice","unshift","createdAt","localStorage","JSON","stringify","items","parsed","parse","isHistoryItem","determineHistoryName","indexDocument","openLinkIcon","ExpandableListItemLink","link","navigationType","allowClipboard","useHistory","displayValue","onNavigation","push","OpenInNewSharp","ArrowForward","History","localStorageKey","setItems","date","trim","flexGrow","leftTab","rightTab","FileNavigation","active","Tabs","event","newValue","DOWNLOAD","UPLOAD","Tab","Download","loading","referenceError","setReferenceError","identifier","manifestJs","ManifestJs","isManifest","getIndexDocumentPath","DOWNLOAD_HISTORY","HASH","Reflect","onSwarmIdentifier","Utils","isHexString","matches","extractSwarmHash","recognizeSwarmHash","Loading","indexHtmls","detectIndexHtml","files","exactMatch","find","path","prefix","startsWith","y","convertBeeFileToBrowserFile","file","byteLength","contentType","arrayBuffer","convertManifestToFiles","entries","webkitRelativePath","ArrayBuffer","getAssetNameFromFiles","SwarmFile","image","objectFit","FitImage","inlineStyles","maxHeight","alt","src","wrapper","StripedWrapper","AssetIcon","AssetPreview","assetName","previewComponent","setPreviewComponent","previewUri","setPreviewUri","blob","Blob","URL","createObjectURL","Web","bytes","getKind","reduce","Box","mb","bgcolor","p","getPrimaryText","mt","AssetSummary","position","stroke","transition","spinnerWrapper","left","top","transform","SwarmButton","iconType","React","createElement","classNames","join","currentTarget","blur","DownloadActionBar","onOpen","onDownload","onCancel","hasIndexDocument","Clear","Share","reference","params","downloading","setDownloading","setFiles","swarmEntries","setSwarmEntries","setIndexDocument","getHashes","keys","downloadFile","response","zip","JSZip","downloadData","generateAsync","saveAs","prepare","goBack","pressable","HistoryHeader","mr","ArrowBack","stamps","enrichStamp","postageBatch","depth","bucketDepth","usage","utilization","Math","usageText","ceil","setStamps","getAllPostageBatch","initialFormValues","field","buttonProgress","CreatePostageStampModal","onSubmit","actions","Number","parseInt","options","createPostageBatch","resetForm","setSubmitting","validate","errors","isLessThanOrEqualTo","submitForm","isValid","isSubmitting","TextField","required","dialog","default","select","border","option","hint","SelectPostageStampModal","onSelect","selectedStamp","setSelectedStamp","PaperProps","FormControl","Select","stampId","stamp","batchID","defaultValue","MenuItem","Check","Capacity","integerUsage","round","used","free","PostageStamp","shorten","StampPreview","UploadActionBar","canSelectStamp","hasSelectedStamp","onUpload","onBuy","onClearStamp","isUploading","showBuy","showSelect","showUpload","showChange","PlusSquare","Layers","RefreshCcw","Upload","isBuyingStamp","setBuyingStamp","isSelectingStamp","setSelectingStamp","setStamp","setUploading","FileContext","uploadFiles","UPLOAD_HISTORY","areaWrapper","dropzone","outline","zIndex","opacity","buttonWrapper","UploadArea","maximumSizeInBytes","strictWebsiteMode","setStrictWebsiteMode","setVersion","getDropzoneInputDomElement","document","querySelector","onUploadCollectionClick","element","setAttribute","click","dropzoneClass","swarmFiles","UPLOAD_IN_PROGRESS","filesLimit","maxFileSize","showPreviews","removeAttribute","FilePlus","FolderPlus","PlusCircle","UploadLander","OPTIMAL_POPULATION","GENERIC_ERROR","THRESHOLDS","connectedPeers","minimumValue","explanation","score","population","toLocaleString","pickThreshold","thresholds","maximumScore","last","TopologyStats","maximumTotalScore","sum","actualTotalScore","percentageText","Status","publicKey","pssPublicKey","overlay","underlay","addr","Settings","ExpandableElement","expandable","StampsTable","postageStamps","flex","flexWrap","Stamp","StampsContext","TabPanel","index","other","role","SimpleTabs","indexChanged","setValue","idx","Platforms","SupportedPlatforms","CodeBlock","language","showLineNumbers","code","macOS","Linux","platform","setPlatform","os","userAgent","navigator","iOS","Windows","Android","getOS","isSupportedPlatform","CodeBlockTabs","linux","mac","StatusIcon","isOk","NodeConnectionCheck","elevation","VersionCheck","EthereumConnectionCheck","ChequebookDeployFund","PeerConnection","NodeSetupWorkflow","BaseRouter","exact","ACCOUNTING","SETTINGS","STAMPS","Stamps","INFO","Info","StyledListItem","withStyles","paddingLeft","paddingRight","activeIcon","SideBarItem","iconStart","iconEnd","useLocation","isSelected","matchPath","pathname","selected","disableRipple","ListItemIcon","iconSmall","rootError","smallerText","navBarItems","Home","FileText","DollarSign","minHeight","paddingBottom","drawer","flexShrink","drawerPaper","logo","divider","textDecoration","SideBar","Drawer","anchor","Logo","List","Divider","Dashboard","createTheme","light","dark","orange","secondary","fontFamily","h1","fontWeight","h2","h3","body2","overrides","MuiListItem","MuiContainer","maxWidthXs","maxWidthSm","maxWidthMd","maxWidthLg","maxWidthXl","MuiButton","endIcon","outlined","outlinedSizeSmall","boxShadow","outlinedSizeLarge","containedSizeLarge","containedSizeSmall","contained","MuiTab","fontWeightMedium","textColorInherit","MuiTabs","borderBottom","indicator","MuiButtonBase","App","ThemeProvider","CssBaseline","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.2ee7499d.chunk.js","sourcesContent":["function getProcessEnv(key: string): string | undefined | false {\n return typeof process === 'object' && process.env[key]\n}\n\nclass Config {\n public readonly BEE_API_HOST: string\n public readonly BEE_DEBUG_API_HOST: string\n public readonly BLOCKCHAIN_EXPLORER_URL: string\n public readonly BEE_DOCS_HOST: string\n public readonly BEE_DISCORD_HOST: string\n public readonly GITHUB_REPO_URL: string\n\n constructor() {\n this.BEE_API_HOST =\n sessionStorage.getItem('api_host') || getProcessEnv('REACT_APP_BEE_HOST') || 'http://localhost:1633'\n this.BEE_DEBUG_API_HOST =\n sessionStorage.getItem('debug_api_host') || getProcessEnv('REACT_APP_BEE_DEBUG_HOST') || 'http://localhost:1635'\n this.BLOCKCHAIN_EXPLORER_URL =\n getProcessEnv('REACT_APP_BLOCKCHAIN_EXPLORER_URL') || 'https://blockscout.com/xdai/mainnet'\n this.BEE_DOCS_HOST = getProcessEnv('REACT_APP_BEE_DOCS_HOST') || 'https://docs.ethswarm.org/docs/'\n this.BEE_DISCORD_HOST = getProcessEnv('REACT_APP_BEE_DISCORD_HOST') || 'https://discord.gg/eKr9XPv7'\n this.GITHUB_REPO_URL =\n getProcessEnv('REACT_APP_BEE_GITHUB_REPO_URL') || 'https://api.github.com/repos/ethersphere/bee'\n }\n}\n\nexport const config = new Config()\n\nexport default config\n","import { Component, ErrorInfo, ReactElement } from 'react'\n\ninterface Props {\n children: ReactElement\n}\n\ninterface State {\n error: Error | null\n}\n\nexport default class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props)\n this.state = { error: null }\n }\n\n static getDerivedStateFromError(error: Error): { error: Error } {\n // Update state so the next render will show the fallback UI.\n return { error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // You can also log the error to an error reporting service\n console.error({ error, errorInfo }) // eslint-disable-line\n }\n\n render(): ReactElement {\n if (this.state.error) {\n // You can render any custom fallback UI\n return <h1>Something went wrong. Error: {this.state.error.message}</h1>\n }\n\n return this.props.children\n }\n}\n","import { BigNumber } from 'bignumber.js'\n\n/**\n * Test if value is an integer\n *\n * @param value Value to be tested if it is an integer\n *\n * @returns True if the passed in value is integer\n */\nexport function isInteger(value: unknown): value is BigNumber | bigint {\n return (BigNumber.isBigNumber(value) && value.isInteger()) || typeof value === 'bigint'\n}\n\n/**\n *Convert value into a BigNumber if not already\n *\n * @param value Value to be converted\n *\n * @throws {TypeError} if the value is not convertible to a BigNumber\n *\n * @returns BigNumber - but it may still be NaN or Infinite\n */\nexport function makeBigNumber(value: BigNumber | BigInt | number | string): BigNumber | never {\n if (BigNumber.isBigNumber(value)) return value\n\n if (typeof value === 'string') return new BigNumber(value)\n\n if (typeof value === 'bigint') return new BigNumber(value.toString())\n\n // FIXME: bee-js still returns some values as numbers and even outside of SAFE INTEGER bounds\n if (typeof value === 'number' /* && Number.isSafeInteger(value)*/) return new BigNumber(value)\n\n throw new TypeError(`Not a BigNumber or BigNumber convertible value. Type: ${typeof value} value: ${value}`)\n}\n\nexport type PromiseSettlements<T> = {\n fulfilled: PromiseFulfilledResult<T>[]\n rejected: PromiseRejectedResult[]\n}\n\nexport type UnwrappedPromiseSettlements<T> = {\n fulfilled: T[]\n rejected: string[]\n}\n\nexport async function sleepMs(ms: number): Promise<void> {\n await new Promise<void>(resolve =>\n setTimeout(() => {\n resolve()\n }, ms),\n )\n}\n\n/**\n * Maps the returned results of `Promise.allSettled` to an object\n * with `fulfilled` and `rejected` arrays for easy access.\n *\n * The results still need to be unwrapped to get the fulfilled values or rejection reasons.\n */\nexport function mapPromiseSettlements<T>(promises: PromiseSettledResult<T>[]): PromiseSettlements<T> {\n const fulfilled = promises.filter(promise => promise.status === 'fulfilled') as PromiseFulfilledResult<T>[]\n const rejected = promises.filter(promise => promise.status === 'rejected') as PromiseRejectedResult[]\n\n return { fulfilled, rejected }\n}\n\n/**\n * Maps the returned values of `Promise.allSettled` to an object\n * with `fulfilled` and `rejected` arrays for easy access.\n *\n * For rejected promises, the value is the stringified `reason`,\n * or `'Unknown error'` string when it is unavailable.\n */\nexport function unwrapPromiseSettlements<T>(\n promiseSettledResults: PromiseSettledResult<T>[],\n): UnwrappedPromiseSettlements<T> {\n const values = mapPromiseSettlements(promiseSettledResults)\n const fulfilled = values.fulfilled.map(x => x.value)\n const rejected = values.rejected.map(x => (x.reason ? String(x.reason) : 'Unknown error'))\n\n return { fulfilled, rejected }\n}\n\n/**\n * Wraps a `Promise<T>` or async function inside a new `Promise<T>`,\n * which retries the original function up to `maxRetries` times,\n * waiting `delayMs` milliseconds between failed attempts.\n *\n * If all attempts fail, then this `Promise<T>` also rejects.\n */\nexport function makeRetriablePromise<T>(fn: () => Promise<T>, maxRetries = 3, delayMs = 1000): Promise<T> {\n return new Promise(async (resolve, reject) => {\n for (let tries = 0; tries < maxRetries; tries++) {\n try {\n const results = await fn()\n resolve(results)\n\n return\n } catch (error) {\n if (tries < maxRetries - 1) {\n await sleepMs(delayMs)\n } else {\n reject(error)\n }\n }\n }\n })\n}\n\nexport function extractSwarmHash(string: string): string | null {\n const matches = string.match(/[a-fA-F0-9]{64,128}/)\n\n return (matches && matches[0]) || null\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 { Bee, BeeDebug } from '@ethersphere/bee-js'\nimport { createContext, ReactChild, ReactElement, useEffect, useState } from 'react'\nimport { config } from '../config'\n\ninterface ContextInterface {\n apiUrl: string\n apiDebugUrl: string\n beeApi: Bee | null\n beeDebugApi: BeeDebug | null\n setApiUrl: (url: string) => void\n setDebugApiUrl: (url: string) => void\n lockedApiSettings: boolean\n}\n\nconst initialValues: ContextInterface = {\n apiUrl: config.BEE_API_HOST,\n apiDebugUrl: config.BEE_DEBUG_API_HOST,\n beeApi: null,\n beeDebugApi: null,\n setApiUrl: () => {}, // eslint-disable-line\n setDebugApiUrl: () => {}, // eslint-disable-line\n lockedApiSettings: false,\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n beeApiUrl?: string\n beeDebugApiUrl?: string\n lockedApiSettings?: boolean\n}\n\nexport function Provider({\n children,\n beeApiUrl,\n beeDebugApiUrl,\n lockedApiSettings: extLockedApiSettings,\n}: Props): ReactElement {\n const [apiUrl, setApiUrl] = useState<string>(initialValues.apiUrl)\n const [apiDebugUrl, setDebugApiUrl] = useState<string>(initialValues.apiDebugUrl)\n const [beeApi, setBeeApi] = useState<Bee | null>(null)\n const [beeDebugApi, setBeeDebugApi] = useState<BeeDebug | null>(null)\n const [lockedApiSettings] = useState<boolean>(Boolean(extLockedApiSettings))\n\n useEffect(() => {\n try {\n setBeeApi(new Bee(apiUrl))\n sessionStorage.setItem('api_host', apiUrl)\n } catch (e) {\n setBeeApi(null)\n }\n }, [apiUrl])\n\n useEffect(() => {\n if (beeApiUrl) setApiUrl(beeApiUrl)\n }, [beeApiUrl])\n\n useEffect(() => {\n if (beeDebugApiUrl) setDebugApiUrl(beeDebugApiUrl)\n }, [beeDebugApiUrl])\n\n useEffect(() => {\n try {\n setBeeDebugApi(new BeeDebug(apiDebugUrl))\n sessionStorage.setItem('debug_api_host', apiDebugUrl)\n } catch (e) {\n setBeeDebugApi(null)\n }\n }, [apiDebugUrl])\n\n return (\n <Context.Provider\n value={{ apiUrl, apiDebugUrl, beeApi, beeDebugApi, setApiUrl, setDebugApiUrl, lockedApiSettings }}\n >\n {children}\n </Context.Provider>\n )\n}\n","import type {\n ChequebookAddressResponse,\n Health,\n LastChequesResponse,\n NodeAddresses,\n Peer,\n Topology,\n} from '@ethersphere/bee-js'\nimport { createContext, ReactChild, ReactElement, useContext, useEffect, useState } from 'react'\nimport semver from 'semver'\nimport { engines } from '../../package.json'\nimport { useLatestBeeRelease } from '../hooks/apiHooks'\nimport { Token } from '../models/Token'\nimport type { Balance, ChequebookBalance, Settlements } from '../types'\nimport { Context as SettingsContext } from './Settings'\n\ninterface Status {\n all: boolean\n version: boolean\n blockchainConnection: boolean\n debugApiConnection: boolean\n apiConnection: boolean\n topology: boolean\n chequebook: boolean\n}\n\ninterface ContextInterface {\n status: Status\n latestPublishedVersion?: string\n latestUserVersion?: string\n latestUserVersionExact?: string\n isLatestBeeVersion: boolean\n latestBeeVersionUrl: string\n error: Error | null\n apiHealth: boolean\n debugApiHealth: Health | null\n nodeAddresses: NodeAddresses | null\n topology: Topology | null\n chequebookAddress: ChequebookAddressResponse | null\n peers: Peer[] | null\n chequebookBalance: ChequebookBalance | null\n peerBalances: Balance[] | null\n peerCheques: LastChequesResponse | null\n settlements: Settlements | null\n latestBeeRelease: LatestBeeRelease | null\n isLoading: boolean\n isRefreshing: boolean\n lastUpdate: number | null\n start: (frequency?: number) => void\n stop: () => void\n refresh: () => Promise<void>\n}\n\nconst startedInDevMode = window.location.search.includes('devMode=1')\n\nconst initialValues: ContextInterface = {\n status: {\n all: false,\n version: false,\n blockchainConnection: false,\n debugApiConnection: false,\n apiConnection: false,\n topology: false,\n chequebook: false,\n },\n latestPublishedVersion: undefined,\n latestUserVersion: undefined,\n latestUserVersionExact: undefined,\n isLatestBeeVersion: false,\n latestBeeVersionUrl: 'https://github.com/ethersphere/bee/releases/latest',\n error: null,\n apiHealth: false,\n debugApiHealth: null,\n nodeAddresses: null,\n topology: null,\n chequebookAddress: null,\n peers: null,\n chequebookBalance: null,\n peerBalances: null,\n peerCheques: null,\n settlements: null,\n latestBeeRelease: null,\n isLoading: true,\n isRefreshing: false,\n lastUpdate: null,\n start: () => {}, // eslint-disable-line\n stop: () => {}, // eslint-disable-line\n refresh: () => Promise.reject(),\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction getStatus(\n debugApiHealth: Health | null,\n nodeAddresses: NodeAddresses | null,\n apiHealth: boolean,\n topology: Topology | null,\n chequebookAddress: ChequebookAddressResponse | null,\n chequebookBalance: ChequebookBalance | null,\n error: Error | null,\n): Status {\n // FIXME: `devMode` is a temporary workaround to be able to develop with only one node\n const devMode = startedInDevMode || Boolean(process.env.REACT_APP_DEV_MODE)\n const status = {\n version: Boolean(\n debugApiHealth &&\n semver.satisfies(debugApiHealth.version, engines.bee, {\n includePrerelease: true,\n }),\n ),\n blockchainConnection: Boolean(nodeAddresses?.ethereum),\n debugApiConnection: Boolean(debugApiHealth?.status === 'ok'),\n apiConnection: apiHealth,\n topology: Boolean(topology?.connected && topology?.connected > 0) || devMode,\n chequebook:\n (Boolean(chequebookAddress?.chequebookAddress) &&\n chequebookBalance !== null &&\n chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0)) ||\n devMode,\n }\n\n return { ...status, all: !error && Object.values(status).every(v => v) }\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const { beeApi, beeDebugApi } = useContext(SettingsContext)\n const [apiHealth, setApiHealth] = useState<boolean>(false)\n const [debugApiHealth, setDebugApiHealth] = useState<Health | null>(null)\n const [nodeAddresses, setNodeAddresses] = useState<NodeAddresses | null>(null)\n const [topology, setNodeTopology] = useState<Topology | null>(null)\n const [chequebookAddress, setChequebookAddress] = useState<ChequebookAddressResponse | null>(null)\n const [peers, setPeers] = useState<Peer[] | null>(null)\n const [chequebookBalance, setChequebookBalance] = useState<ChequebookBalance | null>(null)\n const [peerBalances, setPeerBalances] = useState<Balance[] | null>(null)\n const [peerCheques, setPeerCheques] = useState<LastChequesResponse | null>(null)\n const [settlements, setSettlements] = useState<Settlements | null>(null)\n const { latestBeeRelease } = useLatestBeeRelease()\n\n const [error, setError] = useState<Error | null>(initialValues.error)\n const [isLoading, setIsLoading] = useState<boolean>(initialValues.isLoading)\n const [isRefreshing, setIsRefreshing] = useState<boolean>(initialValues.isRefreshing)\n const [lastUpdate, setLastUpdate] = useState<number | null>(initialValues.lastUpdate)\n const [frequency, setFrequency] = useState<number | null>(30000)\n\n const latestPublishedVersion = semver.coerce(latestBeeRelease?.name)?.version\n const latestUserVersion = semver.coerce(debugApiHealth?.version)?.version\n const latestUserVersionExact = debugApiHealth?.version\n\n useEffect(() => {\n setIsLoading(true)\n\n setApiHealth(false)\n\n refresh()\n }, [beeApi]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n setIsLoading(true)\n\n setDebugApiHealth(null)\n setNodeAddresses(null)\n setNodeTopology(null)\n setPeers(null)\n setChequebookAddress(null)\n setChequebookBalance(null)\n setPeerBalances(null)\n setPeerCheques(null)\n setSettlements(null)\n\n refresh()\n }, [beeDebugApi]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const refresh = async () => {\n // Don't want to refresh when already refreshing\n if (isRefreshing) return\n\n // Not a valid bee api\n if (!beeApi || !beeDebugApi) {\n setIsLoading(false)\n\n return\n }\n\n try {\n setIsRefreshing(true)\n setError(null)\n\n // Wrap the chequebook balance call to return BZZ values as Token object\n const chequeBalanceWrapper = async () => {\n const { totalBalance, availableBalance } = await beeDebugApi.getChequebookBalance()\n\n return {\n totalBalance: new Token(totalBalance),\n availableBalance: new Token(availableBalance),\n }\n }\n\n // Wrap the balances call to return BZZ values as Token object\n const peerBalanceWrapper = async () => {\n const { balances } = await beeDebugApi.getAllBalances()\n\n return balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) }))\n }\n\n // Wrap the settlements call to return BZZ values as Token object\n const settlementsWrapper = async () => {\n const { totalReceived, settlements, totalSent } = await beeDebugApi.getAllSettlements()\n\n return {\n totalReceived: new Token(totalReceived),\n totalSent: new Token(totalSent),\n settlements: settlements.map(({ peer, received, sent }) => ({\n peer,\n received: new Token(received),\n sent: new Token(sent),\n })),\n }\n }\n\n const promises = [\n // API health\n beeApi\n .isConnected()\n .then(setApiHealth)\n .catch(() => setApiHealth(false)),\n\n // Debug API health\n beeDebugApi\n .getHealth()\n .then(setDebugApiHealth)\n .catch(() => setDebugApiHealth(null)),\n\n // Node Addresses\n beeDebugApi\n .getNodeAddresses()\n .then(setNodeAddresses)\n .catch(() => setNodeAddresses(null)),\n\n // Network Topology\n beeDebugApi\n .getTopology()\n .then(setNodeTopology)\n .catch(() => setNodeTopology(null)),\n\n // Peers\n beeDebugApi\n .getPeers()\n .then(setPeers)\n .catch(() => setPeers(null)),\n\n // Chequebook address\n beeDebugApi\n .getChequebookAddress()\n .then(setChequebookAddress)\n .catch(() => setChequebookAddress(null)),\n\n // Cheques\n beeDebugApi\n .getLastCheques()\n .then(setPeerCheques)\n .catch(() => setPeerCheques(null)),\n\n // Chequebook balance\n chequeBalanceWrapper()\n .then(setChequebookBalance)\n .catch(() => setChequebookBalance(null)),\n\n // Peer balances\n peerBalanceWrapper()\n .then(setPeerBalances)\n .catch(() => setPeerBalances(null)),\n\n // Settlements\n settlementsWrapper()\n .then(setSettlements)\n .catch(() => setSettlements(null)),\n ]\n\n await Promise.allSettled(promises)\n } catch (e) {\n setError(e as Error)\n } finally {\n setIsLoading(false)\n setIsRefreshing(false)\n setLastUpdate(Date.now())\n }\n }\n\n const start = (freq = 30000) => setFrequency(freq)\n const stop = () => setFrequency(null)\n\n // Start the update loop\n useEffect(() => {\n refresh()\n\n // Start autorefresh only if the frequency is set\n if (frequency) {\n const interval = setInterval(refresh, frequency)\n\n return () => clearInterval(interval)\n }\n }, [frequency, beeDebugApi, beeApi]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <Context.Provider\n value={{\n status: getStatus(\n debugApiHealth,\n nodeAddresses,\n apiHealth,\n topology,\n chequebookAddress,\n chequebookBalance,\n error,\n ),\n latestUserVersion,\n latestUserVersionExact,\n latestPublishedVersion,\n isLatestBeeVersion: Boolean(\n latestPublishedVersion &&\n latestUserVersion &&\n semver.satisfies(latestPublishedVersion, latestUserVersion, {\n includePrerelease: true,\n }),\n ),\n latestBeeVersionUrl: latestBeeRelease?.html_url || 'https://github.com/ethersphere/bee/releases/latest',\n error,\n apiHealth,\n debugApiHealth,\n nodeAddresses,\n topology,\n chequebookAddress,\n peers,\n chequebookBalance,\n peerBalances,\n peerCheques,\n settlements,\n latestBeeRelease,\n isLoading,\n isRefreshing,\n lastUpdate,\n start,\n stop,\n refresh,\n }}\n >\n {children}\n </Context.Provider>\n )\n}\n","import axios from 'axios'\nimport { useEffect, useState } from 'react'\nimport { config } from '../config'\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(`${config.GITHUB_REPO_URL}/releases/latest`)\n .then(res => {\n setLatestBeeRelease(res.data)\n })\n .catch((error: Error) => {\n setError(error)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [])\n\n return { latestBeeRelease, isLoadingLatestBeeRelease, error }\n}\n","import { ReactElement, useState, useContext } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Alert, AlertTitle } from '@material-ui/lab'\nimport Collapse from '@material-ui/core/Collapse'\nimport IconButton from '@material-ui/core/IconButton'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { Context } from '../providers/Bee'\nimport { SUPPORTED_BEE_VERSION_EXACT } from '@ethersphere/bee-js'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n marginBottom: theme.spacing(2),\n },\n }),\n)\n\nexport default function VersionAlert(): ReactElement | null {\n const classes = useStyles()\n const { isLoading, latestUserVersionExact } = useContext(Context)\n const [open, setOpen] = useState<boolean>(true)\n\n const isExactlySupportedBeeVersion = SUPPORTED_BEE_VERSION_EXACT === latestUserVersionExact\n\n if (isLoading || !latestUserVersionExact) return null\n\n return (\n <Collapse in={!isExactlySupportedBeeVersion && open}>\n <div className={classes.root}>\n <Alert\n severity=\"warning\"\n action={\n <IconButton\n aria-label=\"close\"\n color=\"inherit\"\n size=\"small\"\n onClick={() => {\n setOpen(false)\n }}\n >\n <CloseIcon fontSize=\"inherit\" />\n </IconButton>\n }\n >\n <AlertTitle>Warning</AlertTitle>\n Your Bee node version (<code>{latestUserVersionExact}</code>) does not exactly match the Bee version we tested\n the Bee Dashboard against (<code>{SUPPORTED_BEE_VERSION_EXACT}</code>). Please note that some functionality\n may not work properly.\n </Alert>\n </div>\n </Collapse>\n )\n}\n","export default __webpack_public_path__ + \"static/media/logo.3d1155fe.svg\";","import { ReactElement, ReactNode, useState } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Collapse, ListItem, ListItemText, Typography } from '@material-ui/core'\nimport { ExpandLess, ExpandMore } from '@material-ui/icons'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n padding: 0,\n margin: 0,\n marginTop: theme.spacing(4),\n '&:first-child': {\n marginTop: 0,\n },\n },\n rootLevel1: { marginTop: theme.spacing(1) },\n rootLevel2: { marginTop: theme.spacing(0.5) },\n header: {\n backgroundColor: theme.palette.background.paper,\n },\n contentLevel0: {\n marginTop: theme.spacing(1),\n },\n contentLevel12: {\n marginTop: theme.spacing(0.25),\n },\n infoText: {\n color: '#c9c9c9',\n },\n }),\n)\n\ninterface Props {\n children?: ReactNode\n label: ReactNode\n info?: ReactNode\n level?: 0 | 1 | 2\n defaultOpen?: boolean\n}\n\nexport default function ExpandableList({ children, label, level, defaultOpen, info }: Props): ReactElement | null {\n const classes = useStyles()\n const [open, setOpen] = useState<boolean>(Boolean(defaultOpen))\n\n const handleClick = () => {\n setOpen(!open)\n }\n\n let rootLevelClass = ''\n let typographyVariant: 'h1' | 'h2' | 'h3' = 'h1'\n let contentLevelClass = classes.contentLevel0\n\n if (level === 1) {\n rootLevelClass = classes.rootLevel1\n typographyVariant = 'h2'\n contentLevelClass = classes.contentLevel12\n } else if (level === 2) {\n rootLevelClass = classes.rootLevel2\n typographyVariant = 'h3'\n contentLevelClass = classes.contentLevel12\n }\n\n return (\n <div className={`${classes.root} ${rootLevelClass}`}>\n <ListItem button onClick={handleClick} className={classes.header}>\n <ListItemText primary={<Typography variant={typographyVariant}>{label}</Typography>} />\n <div style={{ display: 'flex' }}>\n {!open && (\n <Typography variant=\"body2\" className={classes.infoText}>\n {info}\n </Typography>\n )}\n {open ? <ExpandLess /> : <ExpandMore />}\n </div>\n </ListItem>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <div className={contentLevelClass}>{children}</div>\n </Collapse>\n </div>\n )\n}\n","import { ReactElement, ReactNode } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Typography, Grid, IconButton, Tooltip } from '@material-ui/core'\nimport { Info } from 'react-feather'\nimport ListItem from '@material-ui/core/ListItem'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n header: {\n backgroundColor: theme.palette.background.paper,\n marginBottom: theme.spacing(0.25),\n wordBreak: 'break-word',\n },\n copyValue: {\n cursor: 'pointer',\n padding: theme.spacing(1),\n borderRadius: 0,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n }),\n)\n\ninterface Props {\n label?: ReactNode\n value?: ReactNode\n tooltip?: string\n}\n\nexport default function ExpandableListItem({ label, value, tooltip }: Props): ReactElement | null {\n const classes = useStyles()\n\n return (\n <ListItem className={classes.header}>\n <Grid container direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n {label && <Typography variant=\"body1\">{label}</Typography>}\n {value && (\n <Typography variant=\"body2\">\n {value}\n {tooltip && (\n <Tooltip title={tooltip} placement=\"top\" arrow>\n <IconButton size=\"small\" className={classes.copyValue}>\n <Info strokeWidth={1} />\n </IconButton>\n </Tooltip>\n )}\n </Typography>\n )}\n </Grid>\n </ListItem>\n )\n}\n","import { Grid } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ReactElement, ReactNode } from 'react'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n action: {\n marginTop: theme.spacing(0.75),\n marginBottom: theme.spacing(1),\n marginRight: theme.spacing(1),\n },\n }),\n)\n\ninterface Props {\n children: ReactNode | ReactNode[]\n}\n\nexport default function ExpandableListItemActions({ children }: Props): ReactElement | null {\n const classes = useStyles()\n\n if (Array.isArray(children)) {\n return (\n <Grid container direction=\"row\">\n {children\n // Exclude falsy values to allow conditional rendering\n .filter(x => x)\n .map((a, i) => (\n <Grid key={i} className={classes.action}>\n {a}\n </Grid>\n ))}\n </Grid>\n )\n }\n\n return (\n <Grid container direction=\"row\">\n <Grid className={classes.action}>{children}</Grid>\n </Grid>\n )\n}\n","import { Grid, IconButton, ListItem, Tooltip, Typography } from '@material-ui/core'\nimport Collapse from '@material-ui/core/Collapse'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ReactElement, useState } from 'react'\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport { Eye, Minus } from 'react-feather'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n header: {\n backgroundColor: theme.palette.background.paper,\n marginBottom: theme.spacing(0.25),\n borderLeft: `${theme.spacing(0.25)}px solid rgba(0,0,0,0)`,\n wordBreak: 'break-word',\n },\n headerOpen: {\n borderLeft: `${theme.spacing(0.25)}px solid ${theme.palette.primary.main}`,\n },\n copyValue: {\n cursor: 'pointer',\n padding: theme.spacing(1),\n borderRadius: 0,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n content: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n keyMargin: {\n marginRight: theme.spacing(1),\n },\n }),\n)\n\ninterface Props {\n label: string\n value: string\n}\n\nconst lengthWithoutPrefix = (s: string) => s.replace(/^0x/i, '').length\n\nfunction isPrefixedHexString(s: unknown): boolean {\n return typeof s === 'string' && /^0x[0-9a-f]+$/i.test(s)\n}\n\nconst split = (s: string): string[] => {\n const nonPrefixLength = lengthWithoutPrefix(s)\n\n if (nonPrefixLength % 6 === 0) return s.match(/(0x|.{6})/gi) || []\n\n return s.match(/(0x|.{1,8})/gi) || []\n}\n\nexport default function ExpandableListItemKey({ label, value }: Props): ReactElement | null {\n const classes = useStyles()\n const [open, setOpen] = useState(false)\n const [copied, setCopied] = useState(false)\n const toggleOpen = () => setOpen(!open)\n\n const tooltipClickHandler = () => setCopied(true)\n const tooltipCloseHandler = () => setCopied(false)\n\n const splitValues = split(value)\n const hasPrefix = isPrefixedHexString(value)\n const spanText = `${hasPrefix ? `${splitValues[0]} ${splitValues[1]}` : splitValues[0]}[…]${\n splitValues[splitValues.length - 1]\n }`\n\n return (\n <ListItem className={`${classes.header} ${open ? classes.headerOpen : ''}`}>\n <Grid container direction=\"column\" justifyContent=\"space-between\" alignItems=\"stretch\">\n <Grid container direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n {label && <Typography variant=\"body1\">{label}</Typography>}\n <Typography variant=\"body2\">\n <div>\n {!open && (\n <span className={classes.copyValue}>\n <Tooltip title={copied ? 'Copied' : 'Copy'} placement=\"top\" arrow onClose={tooltipCloseHandler}>\n <CopyToClipboard text={value}>\n <span onClick={tooltipClickHandler}>{value ? spanText : ''}</span>\n </CopyToClipboard>\n </Tooltip>\n </span>\n )}\n <IconButton size=\"small\" className={classes.copyValue}>\n {open ? <Minus onClick={toggleOpen} strokeWidth={1} /> : <Eye onClick={toggleOpen} strokeWidth={1} />}\n </IconButton>\n </div>\n </Typography>\n </Grid>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <div className={classes.content}>\n <Tooltip title={copied ? 'Copied' : 'Copy'} placement=\"top\" arrow onClose={tooltipCloseHandler}>\n <CopyToClipboard text={value}>\n {/* This has to be wrapped in two spans otherwise either the tooltip or the highlighting does not work*/}\n <span onClick={tooltipClickHandler}>\n <span className={classes.copyValue}>\n {splitValues.map((s, i) => (\n <Typography variant=\"body2\" key={i} className={classes.keyMargin} component=\"span\">\n {s}\n </Typography>\n ))}\n </span>\n </span>\n </CopyToClipboard>\n </Tooltip>\n </div>\n </Collapse>\n </Grid>\n </ListItem>\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 { 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 { Typography } from '@material-ui/core/'\nimport { ReactElement } from 'react'\nimport Identicon from 'react-identicons'\nimport { config } from '../config'\nimport ClipboardCopy from './ClipboardCopy'\nimport QRCodeModal from './QRCodeModal'\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={`${config.BLOCKCHAIN_EXPLORER_URL}/${props.transaction ? 'tx' : 'address'}/${props.address}`}\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 { CircularProgress, Container } from '@material-ui/core'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogContentText from '@material-ui/core/DialogContentText'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport { useSnackbar } from 'notistack'\nimport { ReactElement, useState, useContext } from 'react'\nimport { Zap } from 'react-feather'\nimport { Context as SettingsContext } from '../providers/Settings'\nimport EthereumAddress from './EthereumAddress'\n\ninterface Props {\n peerId: string\n uncashedAmount: string\n}\n\nexport default function CheckoutModal({ peerId, uncashedAmount }: Props): ReactElement {\n const [open, setOpen] = useState<boolean>(false)\n const [loadingCashout, setLoadingCashout] = useState<boolean>(false)\n const { enqueueSnackbar } = useSnackbar()\n const { beeDebugApi } = useContext(SettingsContext)\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const handleCashout = () => {\n if (!beeDebugApi) return\n\n if (peerId) {\n setLoadingCashout(true)\n beeDebugApi\n .cashoutLastCheque(peerId)\n .then(res => {\n setOpen(false)\n enqueueSnackbar(\n <span>\n Successfully cashed out cheque. Transaction\n <EthereumAddress hideBlockie transaction address={res} />\n </span>,\n { variant: 'success' },\n )\n })\n .catch((e: Error) => {\n enqueueSnackbar(<span>Error: {e.message}</span>, { variant: 'error' })\n })\n .finally(() => {\n setLoadingCashout(false)\n })\n } else {\n enqueueSnackbar(<span>Peer Id invalid</span>, { variant: 'error' })\n }\n }\n\n return (\n <div>\n <Button variant=\"contained\" onClick={handleClickOpen} startIcon={<Zap size=\"1rem\" />}>\n Cash out peer {peerId.substr(0, 8)}[…]\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'\n\nimport ExpandableList from '../../components/ExpandableList'\nimport ExpandableListItem from '../../components/ExpandableListItem'\nimport ExpandableListItemActions from '../../components/ExpandableListItemActions'\nimport ExpandableListItemKey from '../../components/ExpandableListItemKey'\n\nimport CashoutModal from '../../components/CashoutModal'\nimport { Accounting } from '../../hooks/accounting'\nimport type { Token } from '../../models/Token'\n\ninterface Props {\n isLoadingUncashed: boolean\n totalUncashed: Token\n accounting: Accounting[] | null\n}\n\nexport default function PeerBalances({ accounting, isLoadingUncashed, totalUncashed }: Props): ReactElement | null {\n return (\n <ExpandableList\n label={`Peers (${accounting?.length || 0})`}\n info={`${totalUncashed.toFixedDecimal()} BZZ (uncashed)`}\n >\n <ExpandableListItem label=\"Uncashed Amount Total\" value={`${totalUncashed.toFixedDecimal()} BZZ`} />\n {accounting?.map(({ peer, balance, received, sent, uncashedAmount, total }) => (\n <ExpandableList\n key={peer}\n label={`Peer ${peer.substr(0, 8)}[…]`}\n level={1}\n info={`${uncashedAmount.toFixedDecimal()} BZZ (uncashed)`}\n >\n <ExpandableListItemKey label=\"Peer ID\" value={peer} />\n <ExpandableListItem label=\"Outstanding Balance\" value={`${balance.toFixedDecimal()} BZZ`} />\n <ExpandableListItem\n label=\"Settlements Sent / Received\"\n value={`-${sent.toFixedDecimal()} / ${received.toFixedDecimal()} BZZ`}\n />\n <ExpandableListItem label=\"Total\" value={`${total.toFixedDecimal()} BZZ`} />\n <ExpandableListItem\n label=\"Uncashed Amount\"\n value={isLoadingUncashed ? 'loading…' : `${uncashedAmount.toFixedDecimal()} BZZ`}\n />\n {uncashedAmount.toBigNumber.isGreaterThan('0') && (\n <ExpandableListItemActions>\n <CashoutModal uncashedAmount={uncashedAmount.toFixedDecimal()} peerId={peer} />\n </ExpandableListItemActions>\n )}\n </ExpandableList>\n ))}\n </ExpandableList>\n )\n}\n","import { Button, Grid, Link as MuiLink, Typography } from '@material-ui/core/'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport type { ReactElement } from 'react'\nimport { Activity } from 'react-feather'\nimport { Link } from 'react-router-dom'\nimport { config } from '../config'\nimport { ROUTES } from '../routes'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n height: '100%',\n },\n content: {\n maxWidth: 500,\n marginBottom: theme.spacing(4),\n '&:last-child': {\n marginBottom: 0,\n },\n },\n icon: {\n height: '1rem',\n },\n }),\n)\n\nexport default function TroubleshootConnectionCard(): ReactElement {\n const classes = useStyles()\n\n return (\n <Grid container direction=\"column\" justifyContent=\"center\" alignItems=\"center\" className={classes.root}>\n <Grid item className={classes.content}>\n <Typography variant=\"h1\" align=\"center\">\n Uh oh, it looks like your node is not connected.\n </Typography>\n </Grid>\n <Grid item className={classes.content}>\n <Typography align=\"center\">\n Please check your node status to fix the problem. You can also check out the{' '}\n <MuiLink href={config.BEE_DOCS_HOST} target=\"_blank\" rel=\"noreferrer\">\n Swarm Bee Docs\n </MuiLink>{' '}\n or ask for support on the{' '}\n <MuiLink href={config.BEE_DISCORD_HOST} target=\"_blank\" rel=\"noreferrer\">\n Ethereum Swarm Discord\n </MuiLink>\n .\n </Typography>\n </Grid>\n <Grid item className={classes.content}>\n <Typography align=\"center\">\n <Button\n component={Link}\n variant=\"contained\"\n startIcon={<Activity className={classes.icon} />}\n to={ROUTES.STATUS}\n >\n Check node status\n </Button>\n </Typography>\n </Grid>\n </Grid>\n )\n}\n","import { LastCashoutActionResponse, BeeDebug } from '@ethersphere/bee-js'\nimport { useEffect, useState } from 'react'\nimport { Token } from '../models/Token'\nimport { makeRetriablePromise, unwrapPromiseSettlements } from '../utils'\nimport { Balance, Settlements, Settlement } from '../types'\n\ninterface UseAccountingHook {\n isLoadingUncashed: boolean\n totalUncashed: 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)\n if (!uncashedAmounts) return Object.values(accounting).sort((a, b) => (a.peer < b.peer ? -1 : 1))\n\n uncashedAmounts?.forEach(({ peer, uncashedAmount }) => {\n accounting[peer].uncashedAmount = new Token(uncashedAmount)\n })\n\n // Return sorted by the uncashed amount first and then by the peer id\n return Object.values(accounting).sort((a, b) => {\n const diff = b.uncashedAmount.toBigNumber.minus(a.uncashedAmount.toBigNumber).toNumber()\n\n if (diff !== 0) return diff\n\n return a.peer < b.peer ? -1 : 1\n })\n}\n\nexport const useAccounting = (\n beeDebugApi: BeeDebug | null,\n settlements: Settlements | null,\n balances: Balance[] | null,\n): UseAccountingHook => {\n const [isLoadingUncashed, setIsloadingUncashed] = useState<boolean>(false)\n const [uncashedAmounts, setUncashedAmounts] = useState<LastCashoutActionResponse[] | undefined>(undefined)\n\n useEffect(() => {\n // We don't have any settlements loaded yet or we are already loading/have loaded the uncashed amounts\n if (isLoadingUncashed || !beeDebugApi || !settlements || uncashedAmounts) return\n\n setIsloadingUncashed(true)\n const promises = settlements.settlements\n .filter(({ received }) => received.toBigNumber.gt('0'))\n .map(({ peer }) => makeRetriablePromise(() => beeDebugApi.getLastCashoutAction(peer)))\n\n Promise.allSettled(promises).then(settlements => {\n const results = unwrapPromiseSettlements(settlements)\n setUncashedAmounts(results.fulfilled)\n setIsloadingUncashed(false)\n })\n }, [settlements, isLoadingUncashed, uncashedAmounts, beeDebugApi])\n\n const accounting = mergeAccounting(balances, settlements?.settlements, uncashedAmounts)\n\n let totalUncashed: Token = new Token('0')\n accounting?.forEach(\n ({ uncashedAmount }) => (totalUncashed = new Token(totalUncashed.toBigNumber.plus(uncashedAmount.toBigNumber))),\n )\n\n return {\n isLoadingUncashed,\n totalUncashed,\n accounting,\n }\n}\n","import { ReactElement, ReactNode, 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 icon?: ReactNode\n}\n\nexport default function WithdrawDepositModal({\n successMessage,\n errorMessage,\n dialogMessage,\n min,\n max,\n label,\n action,\n icon,\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 = (e: React.MouseEvent<HTMLButtonElement>) => {\n setOpen(true)\n e.stopPropagation()\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 as Error).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 as Error)\n }\n }\n\n return (\n <div>\n <Button variant=\"contained\" onClick={handleClickOpen} startIcon={icon}>\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 { BigNumber } from 'bignumber.js'\nimport { ReactElement, useContext } from 'react'\nimport { Upload } from 'react-feather'\nimport WithdrawDepositModal from '../components/WithdrawDepositModal'\nimport { Context as SettingsContext } from '../providers/Settings'\n\nexport default function WithdrawModal(): ReactElement {\n const { beeDebugApi } = useContext(SettingsContext)\n\n return (\n <WithdrawDepositModal\n successMessage=\"Successful withdrawal.\"\n errorMessage=\"Error with withdrawing.\"\n dialogMessage=\"Specify the amount of BZZ you would like to withdraw from your node.\"\n label=\"Withdraw\"\n icon={<Upload size=\"1rem\" />}\n min={new BigNumber(0)}\n action={(amount: bigint) => {\n if (!beeDebugApi) throw new Error('Bee Debug URL is not valid')\n\n return beeDebugApi.withdrawTokens(amount.toString())\n }}\n />\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { Download } from 'react-feather'\nimport { Context as SettingsContext } from '../providers/Settings'\n\nimport WithdrawDepositModal from '../components/WithdrawDepositModal'\nimport { BigNumber } from 'bignumber.js'\n\nexport default function DepositModal(): ReactElement {\n const { beeDebugApi } = useContext(SettingsContext)\n\n return (\n <WithdrawDepositModal\n successMessage=\"Successful deposit.\"\n errorMessage=\"Error with depositing\"\n dialogMessage=\"Specify the amount of BZZ you would like to deposit to your node.\"\n label=\"Deposit\"\n icon={<Download size=\"1rem\" />}\n min={new BigNumber(0)}\n action={(amount: bigint) => {\n if (!beeDebugApi) throw new Error('Bee Debug URL is not valid')\n\n return beeDebugApi.depositTokens(amount.toString())\n }}\n />\n )\n}\n","import { ReactElement, useContext } from 'react'\n\nimport PeerBalances from './PeerBalances'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context as BeeContext } from '../../providers/Bee'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { useAccounting } from '../../hooks/accounting'\nimport ExpandableList from '../../components/ExpandableList'\nimport ExpandableListItem from '../../components/ExpandableListItem'\nimport ExpandableListItemActions from '../../components/ExpandableListItemActions'\nimport ExpandableListItemKey from '../../components/ExpandableListItemKey'\nimport WithdrawModal from '../../containers/WithdrawModal'\nimport DepositModal from '../../containers/DepositModal'\n\nexport default function Accounting(): ReactElement {\n const { status, nodeAddresses, chequebookAddress, chequebookBalance, settlements, peerBalances } =\n useContext(BeeContext)\n const { beeDebugApi } = useContext(SettingsContext)\n\n const { accounting, totalUncashed, isLoadingUncashed } = useAccounting(beeDebugApi, settlements, peerBalances)\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <div>\n <ExpandableList label=\"Chequebook\" defaultOpen>\n <ExpandableListItem label=\"Total Balance\" value={`${chequebookBalance?.totalBalance.toFixedDecimal()} BZZ`} />\n <ExpandableListItem\n label=\"Available Uncommitted Balance\"\n value={`${chequebookBalance?.availableBalance.toFixedDecimal()} BZZ`}\n />\n <ExpandableListItem\n label=\"Total Cheques Amount Sent\"\n value={`${settlements?.totalSent.toFixedDecimal()} BZZ`}\n />\n <ExpandableListItem\n label=\"Total Cheques Amount Received\"\n value={`${settlements?.totalReceived.toFixedDecimal()} BZZ`}\n />\n <ExpandableListItemActions>\n <WithdrawModal />\n <DepositModal />\n </ExpandableListItemActions>\n </ExpandableList>\n <ExpandableList label=\"Blockchain\" defaultOpen>\n <ExpandableListItemKey label=\"Ethereum address\" value={nodeAddresses?.ethereum || ''} />\n <ExpandableListItemKey label=\"Chequebook contract address\" value={chequebookAddress?.chequebookAddress || ''} />\n </ExpandableList>\n <PeerBalances accounting={accounting} isLoadingUncashed={isLoadingUncashed} totalUncashed={totalUncashed} />\n </div>\n )\n}\n","import { ReactElement, ReactNode } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Typography } from '@material-ui/core'\nimport ListItem from '@material-ui/core/ListItem'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n header: {\n backgroundColor: '#F7F7F7',\n marginBottom: theme.spacing(0.25),\n },\n typography: {\n color: '#242424',\n },\n }),\n)\n\ninterface Props {\n children?: ReactNode | ReactNode[]\n}\n\nexport default function ExpandableListItemNote({ children }: Props): ReactElement | null {\n const classes = useStyles()\n\n return (\n <ListItem className={classes.header}>\n <Typography variant=\"body1\" className={classes.typography}>\n {children}\n </Typography>\n </ListItem>\n )\n}\n","import { Button, Grid, IconButton, InputBase, ListItem, Typography } from '@material-ui/core'\nimport Collapse from '@material-ui/core/Collapse'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ChangeEvent, ReactElement, useState } from 'react'\nimport { Check, Edit, Minus, RotateCcw } from 'react-feather'\nimport ExpandableListItemActions from './ExpandableListItemActions'\nimport ExpandableListItemNote from './ExpandableListItemNote'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n header: {\n backgroundColor: theme.palette.background.paper,\n marginBottom: theme.spacing(0.25),\n borderLeft: `${theme.spacing(0.25)}px solid rgba(0,0,0,0)`,\n wordBreak: 'break-word',\n },\n headerOpen: {\n borderLeft: `${theme.spacing(0.25)}px solid ${theme.palette.primary.main}`,\n },\n copyValue: {\n cursor: 'pointer',\n padding: theme.spacing(1),\n borderRadius: 0,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n content: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n keyMargin: {\n marginRight: theme.spacing(1),\n },\n unselectableLabel: {\n cursor: 'default',\n userSelect: 'none',\n // Many browsers don't support yet the general user-select css property\n WebkitUserSelect: 'none',\n MozUserSelect: 'none',\n msUserSelect: 'none',\n },\n }),\n)\n\ninterface Props {\n label: string\n value?: string\n placeholder?: string\n helperText?: string\n expandedOnly?: boolean\n confirmLabel?: string\n confirmLabelDisabled?: boolean\n onChange?: (value: string) => void\n onConfirm: (value: string) => void\n mapperFn?: (value: string) => string\n locked?: boolean\n}\n\nexport default function ExpandableListItemKey({\n label,\n value,\n onConfirm,\n onChange,\n confirmLabel,\n confirmLabelDisabled,\n expandedOnly,\n helperText,\n placeholder,\n mapperFn,\n locked,\n}: Props): ReactElement | null {\n const classes = useStyles()\n const [open, setOpen] = useState(Boolean(expandedOnly))\n const [inputValue, setInputValue] = useState<string>(value || '')\n const toggleOpen = () => setOpen(!open)\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (mapperFn) {\n e.target.value = mapperFn(e.target.value)\n }\n\n setInputValue(e.target.value)\n\n if (onChange) onChange(e.target.value)\n }\n\n return (\n <>\n <ListItem className={`${classes.header} ${open ? classes.headerOpen : ''}`}>\n <Grid container direction=\"column\" justifyContent=\"space-between\" alignItems=\"stretch\">\n <Grid container direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n {label && (\n <Typography variant=\"body1\" className={classes.unselectableLabel}>\n {label}\n </Typography>\n )}\n <Typography variant=\"body2\">\n <div>\n {!open && value}\n {!expandedOnly && !locked && (\n <IconButton size=\"small\" className={classes.copyValue}>\n {open ? (\n <Minus onClick={toggleOpen} strokeWidth={1} />\n ) : (\n <Edit onClick={toggleOpen} strokeWidth={1} />\n )}\n </IconButton>\n )}\n </div>\n </Typography>\n </Grid>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <InputBase\n value={inputValue}\n placeholder={placeholder}\n onChange={handleChange}\n fullWidth\n className={classes.content}\n autoFocus\n hidden={locked}\n />\n </Collapse>\n </Grid>\n </ListItem>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n {helperText && <ExpandableListItemNote>{helperText}</ExpandableListItemNote>}\n <ExpandableListItemActions>\n <Button\n variant=\"contained\"\n disabled={\n inputValue === value ||\n Boolean(confirmLabelDisabled) || // Disable if external validation is provided\n (inputValue === '' && value === undefined) // Disable if no initial value was not provided and the field is empty. The undefined check is improtant so that it is possible to submit with empty input in other cases\n }\n startIcon={<Check size=\"1rem\" />}\n onClick={() => onConfirm(inputValue)}\n >\n {confirmLabel || 'Save'}\n </Button>\n <Button\n variant=\"contained\"\n disabled={inputValue === value || inputValue === ''}\n startIcon={<RotateCcw size=\"1rem\" />}\n onClick={() => setInputValue(value || '')}\n >\n Cancel\n </Button>\n </ExpandableListItemActions>\n </Collapse>\n </>\n )\n}\n","import { shortenHash } from './hash'\n\nexport enum HISTORY_KEYS {\n UPLOAD_HISTORY = 'UPLOAD_HISTORY',\n DOWNLOAD_HISTORY = 'DOWNLOAD_HISTORY',\n}\n\nexport interface HistoryItem {\n createdAt: number\n name: string\n hash: string\n}\n\nexport function putHistory(key: string, hash: string, name: string): void {\n const history = getHistorySafe(key)\n\n const existingIndex = history.findIndex(x => x.hash === hash)\n\n if (existingIndex !== -1) {\n history.splice(existingIndex, 1)\n }\n\n history.unshift({\n createdAt: Date.now(),\n hash,\n name,\n })\n\n if (history.length > 10) {\n history.length = 10\n }\n localStorage.setItem(key, JSON.stringify(history))\n}\n\nexport function getHistorySafe(key: string): HistoryItem[] {\n const items = localStorage.getItem(key)\n\n if (!items) {\n return []\n }\n try {\n const parsed = JSON.parse(items)\n\n if (!Array.isArray(parsed) || !parsed.every(isHistoryItem)) {\n return []\n }\n\n return parsed\n } catch {\n return []\n }\n}\n\nfunction isHistoryItem(x: unknown): x is HistoryItem {\n if (typeof x !== 'object' || x === null) {\n return false\n }\n\n return 'createdAt' in x && 'hash' in x\n}\n\nexport function determineHistoryName(hash: string, indexDocument?: string | null): string {\n if (indexDocument === 'index.html') {\n return `Website ${shortenHash(hash, 4)}`\n } else if (indexDocument) {\n return indexDocument\n }\n\n return `Folder ${shortenHash(hash, 4)}`\n}\n","export function shortenHash(hash: string, sliceLength = 8): string {\n return `${hash.slice(0, sliceLength)}[…]${hash.slice(-sliceLength)}`\n}\n","import { Grid, IconButton, ListItem, Tooltip, Typography } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ArrowForward, OpenInNewSharp } from '@material-ui/icons'\nimport { ReactElement, useState } from 'react'\nimport CopyToClipboard from 'react-copy-to-clipboard'\nimport { useHistory } from 'react-router'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n header: {\n backgroundColor: theme.palette.background.paper,\n marginBottom: theme.spacing(0.25),\n borderLeft: `${theme.spacing(0.25)}px solid rgba(0,0,0,0)`,\n wordBreak: 'break-word',\n },\n headerOpen: {\n borderLeft: `${theme.spacing(0.25)}px solid ${theme.palette.primary.main}`,\n },\n openLinkIcon: {\n cursor: 'pointer',\n padding: theme.spacing(1),\n borderRadius: 0,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n content: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n keyMargin: {\n marginRight: theme.spacing(1),\n },\n copyValue: {\n cursor: 'pointer',\n padding: theme.spacing(1),\n borderRadius: 0,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n }),\n)\n\ninterface Props {\n label: string\n value: string\n link?: string\n navigationType?: 'NEW_WINDOW' | 'HISTORY_PUSH'\n allowClipboard?: boolean\n}\n\nexport default function ExpandableListItemLink({\n label,\n value,\n link,\n navigationType = 'NEW_WINDOW',\n allowClipboard = true,\n}: Props): ReactElement | null {\n const classes = useStyles()\n const [copied, setCopied] = useState(false)\n const history = useHistory()\n\n const tooltipClickHandler = () => setCopied(true)\n const tooltipCloseHandler = () => setCopied(false)\n\n const displayValue = value.length > 22 ? value.slice(0, 19) + '...' : value\n\n function onNavigation() {\n if (navigationType === 'NEW_WINDOW') {\n window.open(link || value)\n } else {\n history.push(link || value)\n }\n }\n\n return (\n <ListItem className={classes.header}>\n <Grid container direction=\"column\" justifyContent=\"space-between\" alignItems=\"stretch\">\n <Grid container direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n {label && <Typography variant=\"body1\">{label}</Typography>}\n <Typography variant=\"body2\">\n <div>\n {allowClipboard && (\n <span className={classes.copyValue}>\n <Tooltip title={copied ? 'Copied' : 'Copy'} placement=\"top\" arrow onClose={tooltipCloseHandler}>\n <CopyToClipboard text={value}>\n <span onClick={tooltipClickHandler}>{displayValue}</span>\n </CopyToClipboard>\n </Tooltip>\n </span>\n )}\n {!allowClipboard && <span onClick={onNavigation}>{displayValue}</span>}\n <IconButton size=\"small\" className={classes.openLinkIcon}>\n {navigationType === 'NEW_WINDOW' && <OpenInNewSharp onClick={onNavigation} strokeWidth={1} />}\n {navigationType === 'HISTORY_PUSH' && <ArrowForward onClick={onNavigation} strokeWidth={1} />}\n </IconButton>\n </div>\n </Typography>\n </Grid>\n </Grid>\n </ListItem>\n )\n}\n","import { ReactElement, useEffect, useState } from 'react'\nimport { getPrettyDateString } from '../utils/date'\nimport { getHistorySafe, HistoryItem, HISTORY_KEYS } from '../utils/local-storage'\nimport ExpandableList from './ExpandableList'\nimport ExpandableListItemLink from './ExpandableListItemLink'\n\ninterface Props {\n title: string\n localStorageKey: HISTORY_KEYS\n}\n\nexport function History({ title, localStorageKey }: Props): ReactElement | null {\n const [items, setItems] = useState<HistoryItem[]>([])\n\n useEffect(() => {\n setItems(getHistorySafe(localStorageKey))\n }, [localStorageKey])\n\n if (!items.length) {\n return null\n }\n\n return (\n <ExpandableList label={title} defaultOpen>\n {items.map((x, i) => (\n <ExpandableListItemLink\n label={getPrettyDateString(new Date(x.createdAt))}\n value={x.name}\n link={'/files/hash/' + x.hash}\n key={i}\n navigationType=\"HISTORY_PUSH\"\n allowClipboard={false}\n />\n ))}\n </ExpandableList>\n )\n}\n","export function getPrettyDateString(date: Date): string {\n const string = date.toString()\n\n return string.split('GMT')[0].trim()\n}\n","import { createStyles, makeStyles, Tab, Tabs, Theme } from '@material-ui/core'\nimport { ReactElement } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { ROUTES } from '../../routes'\n\ninterface Props {\n active: 'UPLOAD' | 'DOWNLOAD'\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexGrow: 1,\n marginBottom: theme.spacing(4),\n },\n leftTab: {\n marginRight: theme.spacing(0.5),\n },\n rightTab: {\n marginLeft: theme.spacing(0.5),\n },\n }),\n)\n\nexport function FileNavigation({ active }: Props): ReactElement {\n const classes = useStyles()\n const history = useHistory()\n\n function onChange(event: React.ChangeEvent<Record<string, never>>, newValue: number) {\n history.push(newValue === 1 ? ROUTES.DOWNLOAD : ROUTES.UPLOAD)\n }\n\n return (\n <div className={classes.root}>\n <Tabs value={active === 'UPLOAD' ? 0 : 1} onChange={onChange} variant=\"fullWidth\">\n <Tab className={classes.leftTab} key=\"UPLOAD\" label=\"Upload\" />\n <Tab className={classes.rightTab} key=\"DOWNLOAD\" label=\"Download\" />\n </Tabs>\n </div>\n )\n}\n","import { Utils } from '@ethersphere/bee-js'\nimport { ManifestJs } from '@ethersphere/manifest-js'\nimport { useSnackbar } from 'notistack'\nimport { ReactElement, useContext, useState } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport ExpandableListItemInput from '../../components/ExpandableListItemInput'\nimport { History } from '../../components/History'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { ROUTES } from '../../routes'\nimport { extractSwarmHash } from '../../utils'\nimport { determineHistoryName, HISTORY_KEYS, putHistory } from '../../utils/local-storage'\nimport { FileNavigation } from './FileNavigation'\n\nexport function Download(): ReactElement {\n const [loading, setLoading] = useState(false)\n const { beeApi } = useContext(SettingsContext)\n const [referenceError, setReferenceError] = useState<string | undefined>(undefined)\n\n const { enqueueSnackbar } = useSnackbar()\n const history = useHistory()\n\n const validateChange = (value: string) => {\n if (Utils.isHexString(value, 64) || Utils.isHexString(value, 128) || !value.trim().length) {\n setReferenceError(undefined)\n } else {\n setReferenceError('Incorrect format of swarm hash. Expected 64 or 128 hexstring characters.')\n }\n }\n\n async function onSwarmIdentifier(identifier: string) {\n if (!beeApi) {\n return\n }\n\n try {\n const manifestJs = new ManifestJs(beeApi)\n const isManifest = await manifestJs.isManifest(identifier)\n\n if (!isManifest) {\n throw Error('The specified hash does not contain valid content.')\n }\n const indexDocument = await manifestJs.getIndexDocumentPath(identifier)\n putHistory(HISTORY_KEYS.DOWNLOAD_HISTORY, identifier, determineHistoryName(identifier, indexDocument))\n history.push(ROUTES.HASH.replace(':hash', identifier))\n } catch (error: unknown) {\n let message = typeof error === 'object' && error !== null && Reflect.get(error, 'message')\n\n if (message.includes('path address not found')) {\n message = 'The specified hash does not have an index document set.'\n }\n\n if (message.includes('Not Found: Not Found')) {\n message = 'The specified hash was not found.'\n }\n enqueueSnackbar(<span>Error: {message || 'Unknown'}</span>, { variant: 'error' })\n } finally {\n setLoading(false)\n }\n }\n\n function recognizeSwarmHash(value: string) {\n if (value.length < 64) {\n return value\n }\n\n const hash = extractSwarmHash(value)\n\n if (hash) {\n return hash\n }\n\n return value\n }\n\n return (\n <>\n <FileNavigation active=\"DOWNLOAD\" />\n <ExpandableListItemInput\n label=\"Swarm Hash\"\n onConfirm={value => onSwarmIdentifier(value)}\n onChange={validateChange}\n helperText={referenceError}\n confirmLabel={'Search'}\n confirmLabelDisabled={Boolean(referenceError) || loading}\n placeholder=\"e.g. 31fb0362b1a42536134c86bc58b97ac0244e5c6630beec3e27c2d1cecb38c605\"\n expandedOnly\n mapperFn={value => recognizeSwarmHash(value)}\n />\n <History title=\"Download History\" localStorageKey={HISTORY_KEYS.DOWNLOAD_HISTORY} />\n </>\n )\n}\n","import { CircularProgress, Grid } from '@material-ui/core'\nimport { ReactElement } from 'react'\n\nexport function Loading(): ReactElement {\n return (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <CircularProgress />\n </Grid>\n )\n}\n","import { FileData } from '@ethersphere/bee-js'\nimport { SwarmFile } from './SwarmFile'\n\nconst indexHtmls = ['index.html', 'index.htm']\n\nexport function detectIndexHtml(files: SwarmFile[]): string | false {\n if (!files.length) {\n return false\n }\n\n const exactMatch = files.find(x => indexHtmls.includes(x.path))\n\n if (exactMatch) {\n return exactMatch.name\n }\n\n const prefix = files[0].path.split('/')[0] + '/'\n\n const allStartWithSamePrefix = files.every(x => x.path.startsWith(prefix))\n\n if (allStartWithSamePrefix) {\n const match = files.find(x => indexHtmls.map(y => prefix + y).includes(x.path))\n\n if (match) {\n return match.name\n }\n }\n\n return false\n}\n\nexport function getHumanReadableFileSize(bytes: number): string {\n if (bytes >= 1e6) {\n return (bytes / 1e6).toFixed(2) + ' MB'\n }\n\n if (bytes >= 1e3) {\n return (bytes / 1e3).toFixed(2) + ' kB'\n }\n\n return bytes + ' bytes'\n}\n\nexport function convertBeeFileToBrowserFile(file: FileData<ArrayBuffer>): Partial<File> {\n return {\n name: file.name,\n size: file.data.byteLength,\n type: file.contentType,\n arrayBuffer: () => new Promise(resolve => resolve(file.data)),\n }\n}\n\nexport function convertManifestToFiles(files: Record<string, string>): SwarmFile[] {\n return Object.entries(files).map(\n x =>\n ({\n name: x[0],\n path: x[0],\n type: 'n/a',\n size: 0,\n webkitRelativePath: x[0],\n arrayBuffer: () => new Promise(resolve => resolve(new ArrayBuffer(0))),\n } as SwarmFile),\n )\n}\n\nexport function getAssetNameFromFiles(files: SwarmFile[]): string {\n if (files.length === 1) {\n return files[0].name\n }\n\n return files[0].path.split('/')[0]\n}\n","export class SwarmFile {\n public name: string\n public path: string\n public type: string\n public size: number\n public webkitRelativePath: string\n public arrayBuffer: () => Promise<ArrayBuffer>\n private data: Promise<ArrayBuffer>\n\n constructor(file: File) {\n const path = Reflect.get(file, 'path') || file.webkitRelativePath || file.name\n this.path = path.startsWith('/') ? path.slice(1) : path\n this.webkitRelativePath = this.path\n this.name = file.name\n this.type = file.type\n this.size = file.size\n this.data = file.arrayBuffer()\n this.arrayBuffer = async () => {\n const data = await this.data\n\n return data\n }\n }\n}\n","import { createStyles, makeStyles } from '@material-ui/core'\nimport { ReactElement } from 'react'\n\nconst useStyles = makeStyles(() =>\n createStyles({\n image: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n }),\n)\n\ninterface Props {\n alt: string\n src: string | undefined\n maxHeight?: string\n maxWidth?: string\n}\n\nexport function FitImage(props: Props): ReactElement {\n const classes = useStyles()\n\n const inlineStyles: Record<string, string> = {}\n\n props.maxHeight && (inlineStyles.maxHeight = props.maxHeight)\n props.maxWidth && (inlineStyles.maxWidth = props.maxWidth)\n\n return <img className={classes.image} alt={props.alt} src={props.src} style={inlineStyles} />\n}\n","import { createStyles, makeStyles } from '@material-ui/core'\nimport { ReactElement } from 'react'\n\ninterface Props {\n children: ReactElement | ReactElement[]\n}\n\nconst useStyles = makeStyles(() =>\n createStyles({\n wrapper: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '175px',\n height: '175px',\n background: `repeating-linear-gradient(\n 45deg,\n #efefef,\n #efefef 4px,\n #ffffff 4px,\n #ffffff 8px\n )`,\n },\n }),\n)\n\nexport function StripedWrapper({ children }: Props): ReactElement {\n const classes = useStyles()\n\n return <div className={classes.wrapper}>{children}</div>\n}\n","import { ReactElement } from 'react'\nimport { StripedWrapper } from '../../components/StripedWrapper'\n\ninterface Props {\n icon: ReactElement\n}\n\nexport function AssetIcon({ icon }: Props): ReactElement {\n return <StripedWrapper>{icon}</StripedWrapper>\n}\n","import { Box, Grid, Typography } from '@material-ui/core'\nimport { Web } from '@material-ui/icons'\nimport { ReactElement, useEffect, useState } from 'react'\nimport { File, Folder } from 'react-feather'\nimport { FitImage } from '../../components/FitImage'\nimport { detectIndexHtml, getAssetNameFromFiles, getHumanReadableFileSize } from '../../utils/file'\nimport { SwarmFile } from '../../utils/SwarmFile'\nimport { AssetIcon } from './AssetIcon'\n\ninterface Props {\n assetName?: string\n files: SwarmFile[]\n}\n\n// TODO: add optional prop for indexDocument when it is already known (e.g. downloading a manifest)\n\nexport function AssetPreview({ assetName, files }: Props): ReactElement {\n const [previewComponent, setPreviewComponent] = useState<ReactElement | undefined>(undefined)\n const [previewUri, setPreviewUri] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n if (files.length === 1) {\n // single image\n if (files[0].type.startsWith('image/')) {\n files[0].arrayBuffer().then(value => {\n const blob = new Blob([value])\n setPreviewUri(URL.createObjectURL(blob))\n })\n // single non-image\n } else {\n setPreviewUri(undefined)\n setPreviewComponent(<AssetIcon icon={<File />} />)\n }\n // collection\n } else if (detectIndexHtml(files)) {\n setPreviewUri(undefined)\n setPreviewComponent(<AssetIcon icon={<Web />} />)\n } else {\n setPreviewUri(undefined)\n setPreviewComponent(<AssetIcon icon={<Folder />} />)\n }\n }, [files])\n\n const getPrimaryText = () => {\n const name = getAssetNameFromFiles(files)\n\n if (files.length === 1) {\n return 'Filename: ' + (assetName || name)\n }\n\n return 'Folder name: ' + (assetName || name)\n }\n\n const getKind = () => {\n if (files.length === 1) {\n return files[0].type\n }\n\n if (detectIndexHtml(files)) {\n return 'Website'\n }\n\n return 'Folder'\n }\n\n const isFolder = () => ['Folder', 'Website'].includes(getKind())\n\n const getSize = () => {\n const bytes = files.reduce((total, item) => total + item.size, 0)\n\n return getHumanReadableFileSize(bytes)\n }\n\n const size = getSize()\n\n return (\n <Box mb={4}>\n <Box bgcolor=\"background.paper\">\n <Grid container direction=\"row\">\n {previewComponent ? (\n previewComponent\n ) : (\n <FitImage maxWidth=\"250px\" maxHeight=\"175px\" alt=\"Upload Preview\" src={previewUri} />\n )}\n <Box p={2}>\n <Typography>{getPrimaryText()}</Typography>\n <Typography>Kind: {getKind()}</Typography>\n {size !== '0 bytes' && <Typography>Size: {size}</Typography>}\n </Box>\n </Grid>\n </Box>\n {isFolder() && (\n <Box mt={0.25} p={2} bgcolor=\"background.paper\">\n <Grid container justifyContent=\"space-between\" alignItems=\"center\" direction=\"row\">\n <Typography variant=\"subtitle2\">Folder content</Typography>\n <Typography variant=\"subtitle2\">{files.length} items</Typography>\n </Grid>\n </Box>\n )}\n </Box>\n )\n}\n","import { Box, Typography } from '@material-ui/core'\nimport { ReactElement } from 'react'\nimport ExpandableListItemKey from '../../components/ExpandableListItemKey'\nimport ExpandableListItemLink from '../../components/ExpandableListItemLink'\n\ninterface Props {\n hash: string\n}\n\nexport function AssetSummary({ hash }: Props): ReactElement {\n return (\n <>\n <Box mb={4}>\n <ExpandableListItemKey label=\"Swarm hash\" value={hash} />\n <ExpandableListItemLink label=\"Share on Swarm Gateway\" value={`https://gateway.ethswarm.org/access/${hash}`} />\n </Box>\n <Typography>\n The Swarm Gateway is graciously provided by the Swarm Foundation. This service is under development and provided\n for testing purposes only. Learn more at{' '}\n <a href=\"https://gateway.ethswarm.org/\">https://gateway.ethswarm.org/</a>.\n </Typography>\n </>\n )\n}\n","import { Button, CircularProgress, createStyles, makeStyles } from '@material-ui/core'\nimport React, { ReactElement } from 'react'\nimport { IconProps } from 'react-feather'\n\ninterface Props {\n onClick: () => void\n iconType: React.ComponentType<IconProps>\n children: string\n className?: string\n disabled?: boolean\n loading?: boolean\n}\n\nconst useStyles = makeStyles(() =>\n createStyles({\n button: {\n position: 'relative',\n whiteSpace: 'nowrap',\n '&:hover, &:focus': {\n '& svg': {\n stroke: '#fff',\n transition: '0.1s',\n },\n },\n },\n spinnerWrapper: {\n position: 'absolute',\n left: '50%',\n top: '50%',\n width: '40px',\n height: '40px',\n transform: 'translate(-50%, -50%)',\n },\n }),\n)\n\nexport function SwarmButton({ children, onClick, iconType, className, disabled, loading }: Props): ReactElement {\n const classes = useStyles()\n\n const icon = React.createElement(iconType, {\n size: '1.25rem',\n color: disabled ? 'rgba(0, 0, 0, 0.26)' : '#dd7700',\n })\n\n const classNames = className ? [className, classes.button].join(' ') : classes.button\n\n return (\n <Button\n className={classNames}\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n onClick()\n event.currentTarget.blur()\n }}\n variant=\"contained\"\n startIcon={icon}\n disabled={disabled}\n >\n {children}\n {loading && (\n <div className={classes.spinnerWrapper}>\n <CircularProgress />\n </div>\n )}\n </Button>\n )\n}\n","import { Button } from '@material-ui/core'\nimport { Clear } from '@material-ui/icons'\nimport { ReactElement } from 'react'\nimport { Download, Link } from 'react-feather'\nimport ExpandableListItemActions from '../../components/ExpandableListItemActions'\nimport { SwarmButton } from '../../components/SwarmButton'\n\ninterface Props {\n onOpen: () => void\n onDownload: () => void\n onCancel: () => void\n hasIndexDocument: boolean\n loading: boolean\n}\n\nexport function DownloadActionBar({ onOpen, onDownload, onCancel, hasIndexDocument, loading }: Props): ReactElement {\n return (\n <ExpandableListItemActions>\n {hasIndexDocument && (\n <SwarmButton onClick={onOpen} iconType={Link} disabled={loading}>\n View Website\n </SwarmButton>\n )}\n <SwarmButton onClick={onDownload} iconType={Download} disabled={loading} loading={loading}>\n Download\n </SwarmButton>\n <Button onClick={onCancel} variant=\"contained\" startIcon={<Clear />} disabled={loading}>\n Close\n </Button>\n </ExpandableListItemActions>\n )\n}\n","import { ManifestJs } from '@ethersphere/manifest-js'\nimport { Box } from '@material-ui/core'\nimport { saveAs } from 'file-saver'\nimport JSZip from 'jszip'\nimport { ReactElement, useContext, useEffect, useState } from 'react'\nimport { RouteComponentProps, useHistory } from 'react-router-dom'\nimport { Loading } from '../../components/Loading'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { ROUTES } from '../../routes'\nimport { convertBeeFileToBrowserFile, convertManifestToFiles } from '../../utils/file'\nimport { shortenHash } from '../../utils/hash'\nimport { determineHistoryName, HISTORY_KEYS, putHistory } from '../../utils/local-storage'\nimport { SwarmFile } from '../../utils/SwarmFile'\nimport { AssetPreview } from './AssetPreview'\nimport { AssetSummary } from './AssetSummary'\nimport { DownloadActionBar } from './DownloadActionBar'\n\ninterface MatchParams {\n hash: string\n}\n\nexport function Share(props: RouteComponentProps<MatchParams>): ReactElement {\n const { apiUrl, beeApi } = useContext(SettingsContext)\n const reference = props.match.params.hash\n const history = useHistory()\n\n const [loading, setLoading] = useState(true)\n const [downloading, setDownloading] = useState(false)\n const [files, setFiles] = useState<SwarmFile[]>([])\n const [swarmEntries, setSwarmEntries] = useState<Record<string, string>>({})\n const [indexDocument, setIndexDocument] = useState<string | null>(null)\n\n async function prepare() {\n if (!beeApi) {\n return\n }\n\n const manifestJs = new ManifestJs(beeApi)\n const isManifest = await manifestJs.isManifest(reference)\n\n if (!isManifest) {\n throw Error('The specified hash does not contain valid content.')\n }\n const entries = await manifestJs.getHashes(reference)\n setSwarmEntries(entries)\n const indexDocument = await manifestJs.getIndexDocumentPath(reference)\n setIndexDocument(indexDocument)\n\n if (Object.keys(entries).length === 1) {\n const response = await beeApi.downloadFile(reference)\n setFiles([new SwarmFile(convertBeeFileToBrowserFile(response) as File)])\n } else {\n setFiles(convertManifestToFiles(entries))\n }\n }\n\n function onOpen() {\n window.open(`${apiUrl}/bzz/${reference}/`, '_blank')\n }\n\n function onClose() {\n // POP means there is no history - nowhere to go back yet\n if (history.action === 'POP') {\n history.push(ROUTES.UPLOAD)\n } else {\n history.goBack()\n }\n }\n\n useEffect(() => {\n setLoading(true)\n prepare().then(() => {\n setLoading(false)\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reference])\n\n async function onDownload() {\n if (!beeApi) {\n return\n }\n putHistory(HISTORY_KEYS.DOWNLOAD_HISTORY, reference, determineHistoryName(reference, indexDocument))\n setDownloading(true)\n\n if (Object.keys(swarmEntries).length === 1) {\n window.open(`${apiUrl}/bzz/${reference}/`, '_blank')\n } else {\n const zip = new JSZip()\n for (const [path, hash] of Object.entries(swarmEntries)) {\n zip.file(path, await beeApi.downloadData(hash))\n }\n const content = await zip.generateAsync({ type: 'blob' })\n saveAs(content, reference + '.zip')\n }\n setDownloading(false)\n }\n\n const assetName = shortenHash(reference)\n\n if (loading) {\n return <Loading />\n }\n\n return (\n <>\n <Box mb={4}>\n <AssetPreview files={files} assetName={assetName} />\n </Box>\n <Box mb={4}>\n <AssetSummary hash={reference} />\n </Box>\n <DownloadActionBar\n onOpen={onOpen}\n onCancel={onClose}\n onDownload={onDownload}\n hasIndexDocument={Boolean(indexDocument && files.length > 1)}\n loading={downloading}\n />\n </>\n )\n}\n","import { Box, createStyles, Grid, makeStyles, Typography } from '@material-ui/core'\nimport { ArrowBack } from '@material-ui/icons'\nimport { ReactElement } from 'react'\nimport { useHistory } from 'react-router-dom'\n\ninterface Props {\n children: string\n}\n\nconst useStyles = makeStyles(() =>\n createStyles({\n pressable: {\n cursor: 'pointer',\n },\n icon: {\n color: '#242424',\n },\n }),\n)\n\nexport function HistoryHeader({ children }: Props): ReactElement {\n const classes = useStyles()\n const history = useHistory()\n\n function goBack() {\n history.goBack()\n }\n\n return (\n <Box mb={4}>\n <Grid container direction=\"row\">\n <Box mr={2}>\n <div className={classes.pressable} onClick={goBack}>\n <ArrowBack className={classes.icon} />\n </div>\n </Box>\n <Typography variant=\"h1\">{children}</Typography>\n </Grid>\n </Box>\n )\n}\n","import { createContext, ReactChild, ReactElement, useState } from 'react'\nimport { SwarmFile } from '../utils/SwarmFile'\n\ninterface ContextInterface {\n files: SwarmFile[]\n setFiles: (files: SwarmFile[]) => void\n}\n\nconst initialValues: ContextInterface = {\n files: [],\n setFiles: () => {}, // eslint-disable-line\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const [files, setFiles] = useState<SwarmFile[]>(initialValues.files)\n\n return <Context.Provider value={{ files, setFiles }}>{children}</Context.Provider>\n}\n","import { PostageBatch } from '@ethersphere/bee-js'\nimport { createContext, ReactChild, ReactElement, useContext, useEffect, useState } from 'react'\nimport { Context as SettingsContext } from './Settings'\n\nexport interface EnrichedPostageBatch extends PostageBatch {\n usage: number\n usageText: string\n}\n\ninterface ContextInterface {\n stamps: EnrichedPostageBatch[] | null\n error: Error | null\n isLoading: boolean\n lastUpdate: number | null\n start: (frequency?: number) => void\n stop: () => void\n refresh: () => Promise<void>\n}\n\nconst initialValues: ContextInterface = {\n stamps: null,\n error: null,\n isLoading: false,\n lastUpdate: null,\n start: () => {}, // eslint-disable-line\n stop: () => {}, // eslint-disable-line\n refresh: () => Promise.reject(),\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction enrichStamp(postageBatch: PostageBatch): EnrichedPostageBatch {\n const { depth, bucketDepth, utilization } = postageBatch\n\n const usage = utilization / Math.pow(2, depth - bucketDepth)\n const usageText = `${Math.ceil(usage * 100)}%`\n\n return {\n ...postageBatch,\n usage,\n usageText,\n }\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const { beeDebugApi } = useContext(SettingsContext)\n const [stamps, setStamps] = useState<EnrichedPostageBatch[] | null>(initialValues.stamps)\n const [error, setError] = useState<Error | null>(initialValues.error)\n const [isLoading, setIsLoading] = useState<boolean>(initialValues.isLoading)\n const [lastUpdate, setLastUpdate] = useState<number | null>(initialValues.lastUpdate)\n const [frequency, setFrequency] = useState<number | null>(null)\n\n const refresh = async () => {\n // Don't want to refresh when already refreshing\n if (isLoading) return\n\n if (!beeDebugApi) return\n\n try {\n setIsLoading(true)\n const stamps = await beeDebugApi.getAllPostageBatch()\n\n setStamps(stamps.map(enrichStamp))\n setLastUpdate(Date.now())\n } catch (e) {\n setError(e as Error)\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]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <Context.Provider value={{ stamps, error, isLoading, lastUpdate, start, stop, refresh }}>\n {children}\n </Context.Provider>\n )\n}\n","import Button from '@material-ui/core/Button'\nimport CircularProgress from '@material-ui/core/CircularProgress'\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 { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport BigNumber from 'bignumber.js'\nimport { Field, Form, Formik, FormikHelpers } from 'formik'\nimport { TextField } from 'formik-material-ui'\nimport { useSnackbar } from 'notistack'\nimport React, { ReactElement, useContext } from 'react'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { Context } from '../../providers/Stamps'\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 onClose: () => void\n}\n\nexport function CreatePostageStampModal({ onClose }: Props): ReactElement {\n const classes = useStyles()\n const { refresh } = useContext(Context)\n const { beeDebugApi } = useContext(SettingsContext)\n const { enqueueSnackbar } = useSnackbar()\n\n return (\n <Formik\n initialValues={initialFormValues}\n onSubmit={async (values: FormValues, actions: FormikHelpers<FormValues>) => {\n try {\n // This is really just a typeguard, the validation pretty much guarantees these will have the right values\n if (!values.depth || !values.amount) return\n\n if (!beeDebugApi) 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 beeDebugApi.createPostageBatch(amount.toString(), depth, options)\n actions.resetForm()\n await refresh()\n onClose()\n } catch (e) {\n enqueueSnackbar(`Error: ${(e as Error).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 <Dialog open={true} onClose={onClose} aria-labelledby=\"form-dialog-title\">\n <DialogTitle id=\"form-dialog-title\">Buy new postage stamp</DialogTitle>\n <DialogContent>\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={onClose} variant=\"contained\">\n Cancel\n </Button>\n <div className={classes.wrapper}>\n <Button\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 <DialogContent>\n <DialogContentText>\n Please refer to the official Bee documentation to understand these values.\n </DialogContentText>\n </DialogContent>\n </Dialog>\n </Form>\n )}\n </Formik>\n )\n}\n","import { createStyles, FormControl, makeStyles, MenuItem, Select, Theme } from '@material-ui/core'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport { Check, Clear } from '@material-ui/icons'\nimport React, { ReactElement, useState } from 'react'\nimport ExpandableListItemActions from '../../components/ExpandableListItemActions'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\n\ninterface Props {\n stamps: EnrichedPostageBatch[]\n onSelect: (stamp: EnrichedPostageBatch) => void\n onClose: () => void\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n dialog: {\n background: theme.palette.background.default,\n borderRadius: 0,\n width: '100%',\n maxWidth: '890px',\n },\n title: {\n color: '#606060',\n textAlign: 'center',\n },\n select: {\n background: theme.palette.background.paper,\n borderRadius: 0,\n border: 0,\n },\n option: {\n height: '52px',\n },\n hint: {\n marginBottom: '16px',\n },\n }),\n)\n\nexport function SelectPostageStampModal({ stamps, onSelect, onClose }: Props): ReactElement {\n const [selectedStamp, setSelectedStamp] = useState<EnrichedPostageBatch | null>(null)\n\n const classes = useStyles()\n\n function onChange(stampId: string) {\n const stamp = stamps.find(x => x.batchID === stampId)\n\n if (stamp) {\n setSelectedStamp(stamp)\n }\n }\n\n function onFinish() {\n if (selectedStamp) {\n onSelect(selectedStamp)\n onClose()\n }\n }\n\n return (\n <Dialog\n open={true}\n onClose={onClose}\n aria-labelledby=\"form-dialog-title\"\n fullWidth\n PaperProps={{ className: classes.dialog }}\n >\n <DialogTitle id=\"form-dialog-title\" className={classes.title}>\n Select postage stamp\n </DialogTitle>\n <DialogContent>\n <FormControl fullWidth>\n <Select\n onChange={event => onChange(event.target.value as string)}\n fullWidth\n variant=\"outlined\"\n className={classes.select}\n defaultValue=\"\"\n >\n {stamps.map(x => (\n <MenuItem key={x.batchID} value={x.batchID} className={classes.option}>\n {x.batchID.slice(0, 8)}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </DialogContent>\n <DialogContent>\n <ExpandableListItemActions>\n <Button disabled={!selectedStamp} onClick={onFinish} variant=\"contained\" startIcon={<Check />}>\n Select\n </Button>\n <Button onClick={onClose} variant=\"contained\" startIcon={<Clear />}>\n Cancel\n </Button>\n </ExpandableListItemActions>\n </DialogContent>\n </Dialog>\n )\n}\n","import { ReactElement } from 'react'\n\ninterface Props {\n width: string\n usage: number\n}\n\nexport function Capacity({ width, usage }: Props): ReactElement {\n const integerUsage = Math.round(usage * 100)\n const used = integerUsage + '%'\n const free = 100 - 2 - integerUsage + '%'\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', height: '100%', width }}>\n <div style={{ display: 'flex', height: '4px', width: '100%' }}>\n <div style={{ width: used, background: '#dd7200' }} />\n <div style={{ width: '2%' }} />\n <div style={{ width: free, background: '#c9c9c9' }} />\n </div>\n </div>\n )\n}\n","import { Box, Grid, Typography } from '@material-ui/core'\nimport { ReactElement } from 'react'\nimport { Capacity } from '../../components/Capacity'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\n\ninterface Props {\n stamp: EnrichedPostageBatch\n shorten?: boolean\n}\n\nexport function PostageStamp({ stamp, shorten }: Props): ReactElement {\n return (\n <Box p={2} width=\"100%\">\n <Grid container justifyContent=\"space-between\" alignItems=\"center\" direction=\"row\">\n <Typography variant=\"subtitle2\">{shorten ? stamp.batchID.slice(0, 8) : stamp.batchID}</Typography>\n <Capacity width=\"100px\" usage={stamp.usage} />\n </Grid>\n </Box>\n )\n}\n","import { Box, Typography } from '@material-ui/core'\nimport { ReactElement } from 'react'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\nimport { PostageStamp } from '../stamps/PostageStamp'\n\ninterface Props {\n stamp: EnrichedPostageBatch\n}\n\nexport function StampPreview({ stamp }: Props): ReactElement {\n return (\n <Box mb={4}>\n <Box mb={0.25} p={2} bgcolor=\"background.paper\">\n <Typography variant=\"subtitle2\">Associated postage stamp:</Typography>\n </Box>\n <Box bgcolor=\"background.paper\">\n <PostageStamp stamp={stamp} shorten={true} />\n </Box>\n </Box>\n )\n}\n","import { Button, Typography } from '@material-ui/core'\nimport { Clear } from '@material-ui/icons'\nimport { ReactElement } from 'react'\nimport { Check, Layers, PlusSquare, RefreshCcw } from 'react-feather'\nimport ExpandableListItemActions from '../../components/ExpandableListItemActions'\nimport { SwarmButton } from '../../components/SwarmButton'\n\ninterface Props {\n canSelectStamp: boolean\n hasSelectedStamp: boolean\n onUpload: () => void\n onBuy: () => void\n onSelect: () => void\n onCancel: () => void\n onClearStamp: () => void\n isUploading: boolean\n}\n\nexport function UploadActionBar({\n canSelectStamp,\n hasSelectedStamp,\n onUpload,\n onBuy,\n onSelect,\n onCancel,\n onClearStamp,\n isUploading,\n}: Props): ReactElement {\n const showBuy = !hasSelectedStamp\n const showSelect = canSelectStamp && !hasSelectedStamp\n const showUpload = hasSelectedStamp\n const showChange = canSelectStamp && hasSelectedStamp\n\n return (\n <>\n <ExpandableListItemActions>\n {showBuy ? (\n <SwarmButton onClick={onBuy} iconType={PlusSquare}>\n Buy New Postage Stamp\n </SwarmButton>\n ) : null}\n {showSelect ? (\n <SwarmButton onClick={onSelect} iconType={Layers}>\n Use Existing Postage Stamp\n </SwarmButton>\n ) : null}\n {showUpload ? (\n <SwarmButton onClick={onUpload} iconType={Check} disabled={isUploading} loading={isUploading}>\n Upload To Your Node\n </SwarmButton>\n ) : null}\n {showChange ? (\n <SwarmButton onClick={onClearStamp} iconType={RefreshCcw} disabled={isUploading}>\n Change Postage Stamp\n </SwarmButton>\n ) : null}\n <Button onClick={onCancel} variant=\"contained\" startIcon={<Clear />}>\n Cancel\n </Button>\n </ExpandableListItemActions>\n {showSelect ? (\n <Typography>\n You need a postage stamp to upload. Please refer to the official Bee documentation to understand how postage\n stamps work.\n </Typography>\n ) : null}\n </>\n )\n}\n","import { useSnackbar } from 'notistack'\nimport { ReactElement, useContext, useEffect, useState } from 'react'\nimport { useHistory } from 'react-router-dom'\nimport { HistoryHeader } from '../../components/HistoryHeader'\nimport { Context as FileContext } from '../../providers/File'\nimport { Context as SettingsContext } from '../../providers/Settings'\nimport { Context, EnrichedPostageBatch } from '../../providers/Stamps'\nimport { ROUTES } from '../../routes'\nimport { detectIndexHtml, getAssetNameFromFiles } from '../../utils/file'\nimport { HISTORY_KEYS, putHistory } from '../../utils/local-storage'\nimport { CreatePostageStampModal } from '../stamps/CreatePostageStampModal'\nimport { SelectPostageStampModal } from '../stamps/SelectPostageStampModal'\nimport { AssetPreview } from './AssetPreview'\nimport { StampPreview } from './StampPreview'\nimport { UploadActionBar } from './UploadActionBar'\n\nexport function Upload(): ReactElement {\n const [isBuyingStamp, setBuyingStamp] = useState(false)\n const [isSelectingStamp, setSelectingStamp] = useState(false)\n const [stamp, setStamp] = useState<EnrichedPostageBatch | null>(null)\n const [isUploading, setUploading] = useState(false)\n\n const { stamps, refresh } = useContext(Context)\n const { beeApi } = useContext(SettingsContext)\n const { files, setFiles } = useContext(FileContext)\n const { enqueueSnackbar } = useSnackbar()\n const history = useHistory()\n\n if (!files.length) {\n setFiles([])\n history.replace(ROUTES.UPLOAD)\n }\n\n useEffect(() => {\n refresh()\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const uploadFiles = () => {\n if (!beeApi || !files.length || !stamp) {\n return\n }\n\n const indexDocument = files.length === 1 ? files[0].name : detectIndexHtml(files) || undefined\n\n setUploading(true)\n\n beeApi\n .uploadFiles(stamp.batchID, files as unknown as File[], { indexDocument })\n .then(hash => {\n putHistory(HISTORY_KEYS.UPLOAD_HISTORY, hash.reference, getAssetNameFromFiles(files))\n history.replace(ROUTES.HASH.replace(':hash', hash.reference))\n })\n .catch(e => {\n enqueueSnackbar(`Error uploading: ${e.message}`, { variant: 'error' })\n setUploading(false)\n })\n }\n\n const reset = () => {\n setFiles([])\n setStamp(null)\n setUploading(false)\n }\n\n return (\n <>\n <HistoryHeader>Upload</HistoryHeader>\n {files.length && <AssetPreview files={files} />}\n {stamp !== null ? <StampPreview stamp={stamp} /> : null}\n {files.length && (\n <UploadActionBar\n canSelectStamp={stamps !== null && stamps.length > 0}\n hasSelectedStamp={stamp !== null}\n onCancel={reset}\n onBuy={() => setBuyingStamp(true)}\n onSelect={() => setSelectingStamp(true)}\n onUpload={uploadFiles}\n onClearStamp={() => setStamp(null)}\n isUploading={isUploading}\n />\n )}\n {isBuyingStamp ? <CreatePostageStampModal onClose={() => setBuyingStamp(false)} /> : null}\n {stamps && isSelectingStamp ? (\n <SelectPostageStampModal\n stamps={stamps}\n onClose={() => setSelectingStamp(false)}\n onSelect={stamp => setStamp(stamp)}\n />\n ) : null}\n </>\n )\n}\n","import { createStyles, makeStyles, Theme, Typography } from '@material-ui/core'\nimport { DropzoneArea } from 'material-ui-dropzone'\nimport { useSnackbar } from 'notistack'\nimport { ReactElement, useContext, useState } from 'react'\nimport { FilePlus, FolderPlus, PlusCircle } from 'react-feather'\nimport { useHistory } from 'react-router-dom'\nimport { SwarmButton } from '../../components/SwarmButton'\nimport { Context } from '../../providers/File'\nimport { ROUTES } from '../../routes'\nimport { detectIndexHtml } from '../../utils/file'\nimport { SwarmFile } from '../../utils/SwarmFile'\n\ninterface Props {\n maximumSizeInBytes: number\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n areaWrapper: { position: 'relative', marginBottom: theme.spacing(2) },\n dropzone: {\n background: theme.palette.background.default,\n outline: 'none',\n color: 'transparent',\n zIndex: 1,\n '& svg': {\n opacity: 0,\n },\n },\n buttonWrapper: {\n top: '0',\n left: '0',\n position: 'absolute',\n display: 'flex',\n width: '100%',\n height: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n button: {\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n zIndex: 2,\n },\n }),\n)\n\nexport function UploadArea({ maximumSizeInBytes }: Props): ReactElement {\n const { setFiles } = useContext(Context)\n const classes = useStyles()\n const history = useHistory()\n const { enqueueSnackbar } = useSnackbar()\n const [strictWebsiteMode, setStrictWebsiteMode] = useState(false)\n const [version, setVersion] = useState(0)\n\n const getDropzoneInputDomElement = () => document.querySelector('.MuiDropzoneArea-root input') as HTMLInputElement\n\n const onUploadCollectionClick = () => {\n const element = getDropzoneInputDomElement()\n\n if (element) {\n element.setAttribute('directory', '')\n element.setAttribute('webkitdirectory', '')\n element.setAttribute('mozdirectory', '')\n element.click()\n }\n }\n\n const onUploadWebsiteClick = () => {\n onUploadCollectionClick()\n setStrictWebsiteMode(true)\n }\n\n const onUploadFolderClick = () => {\n onUploadCollectionClick()\n setStrictWebsiteMode(false)\n }\n\n const onUploadFileClick = () => {\n const element = getDropzoneInputDomElement()\n\n if (element) {\n element.removeAttribute('directory')\n element.removeAttribute('webkitdirectory')\n element.removeAttribute('mozdirectory')\n element.click()\n }\n }\n\n const resetComponentOnAddingInvalidContent = () => {\n setTimeout(() => {\n setVersion(x => x + 1)\n setFiles([])\n }, 0)\n }\n\n const handleChange = (files?: File[]) => {\n if (files) {\n const swarmFiles = files.map(x => new SwarmFile(x))\n const indexDocument = files.length === 1 ? files[0].name : detectIndexHtml(swarmFiles) || undefined\n\n if (files.length && strictWebsiteMode && !indexDocument) {\n enqueueSnackbar('To upload a website, there must be an index.html or index.htm in the root of the folder.', {\n variant: 'error',\n })\n resetComponentOnAddingInvalidContent()\n\n return\n }\n\n setFiles(swarmFiles)\n\n if (files.length) {\n history.push(ROUTES.UPLOAD_IN_PROGRESS)\n }\n }\n }\n\n return (\n <>\n <div className={classes.areaWrapper}>\n <DropzoneArea\n key={version}\n dropzoneClass={classes.dropzone}\n onChange={handleChange}\n filesLimit={1e9}\n maxFileSize={maximumSizeInBytes}\n showPreviews={false}\n />\n <div className={classes.buttonWrapper}>\n <SwarmButton className={classes.button} onClick={onUploadFileClick} iconType={FilePlus}>\n Add File\n </SwarmButton>\n <SwarmButton className={classes.button} onClick={onUploadFolderClick} iconType={FolderPlus}>\n Add Folder\n </SwarmButton>\n <SwarmButton className={classes.button} onClick={onUploadWebsiteClick} iconType={PlusCircle}>\n Add Website\n </SwarmButton>\n </div>\n </div>\n <Typography>\n You can click the buttons above or simply drag and drop to add a file or folder. To upload a website to Swarm,\n make sure that your folder contains an “index.html” file.\n </Typography>\n </>\n )\n}\n","import { ReactElement } from 'react'\nimport { History } from '../../components/History'\nimport { HISTORY_KEYS } from '../../utils/local-storage'\nimport { FileNavigation } from './FileNavigation'\nimport { UploadArea } from './UploadArea'\n\nconst MAX_FILE_SIZE = 1_000_000_000 // 1 gigabyte\n\nexport function UploadLander(): ReactElement {\n return (\n <>\n <FileNavigation active=\"UPLOAD\" />\n <UploadArea maximumSizeInBytes={MAX_FILE_SIZE} />\n <History title=\"Upload History\" localStorageKey={HISTORY_KEYS.UPLOAD_HISTORY} />\n </>\n )\n}\n","const OPTIMAL_CONNECTED_PEERS = 200\nconst OPTIMAL_POPULATION = 100000\nconst OPTIMAL_DEPTH = 12\n\ninterface Threshold {\n minimumValue: number\n explanation: string\n score: number\n}\n\ntype Thresholds = {\n connectedPeers: Threshold[]\n population: Threshold[]\n depth: Threshold[]\n}\n\ntype ThresholdValue = {\n score: number\n maximumScore: number\n explanation: string\n}\n\nexport type ThresholdValues = {\n connectedPeers: ThresholdValue\n population: ThresholdValue\n depth: ThresholdValue\n}\n\nconst GENERIC_ERROR = 'There may be issues with your Bee node or connection.'\n\nconst THRESHOLDS: Thresholds = {\n connectedPeers: [\n {\n minimumValue: OPTIMAL_CONNECTED_PEERS,\n explanation: `Perfect! ${OPTIMAL_CONNECTED_PEERS} or more connected peers indicate a healthy topology.`,\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Your Bee node is connected to peers, but this number should ideally be above ${OPTIMAL_CONNECTED_PEERS}. If you have only started your Bee node, this number may increase quickly.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has not connected to any peers. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n population: [\n {\n minimumValue: OPTIMAL_POPULATION,\n explanation:\n 'Perfect! Your Bee node seems to have a realistic value for the network size, which means everything is working well on your end.',\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Population is usually above ${OPTIMAL_POPULATION.toLocaleString()}. If the number does not increase within a few hours, there may be issues with your Bee node.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has no information on the network population. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n depth: [\n {\n minimumValue: OPTIMAL_DEPTH,\n explanation: 'Perfect! Your Bee node has the highest available depth.',\n score: 2,\n },\n {\n minimumValue: 1,\n explanation: `Your Bee node is supposed to reach a depth of ${OPTIMAL_DEPTH} eventually. Stagnation or decrease in this number may indicate problems with your Bee node.`,\n score: 1,\n },\n {\n minimumValue: 0,\n explanation: 'Your Bee node has not started building its topology yet. ' + GENERIC_ERROR,\n score: 0,\n },\n ],\n}\n\nexport function pickThreshold(key: keyof Thresholds, value: number): ThresholdValue {\n const thresholds = THRESHOLDS[key]\n const maximumScore = thresholds[0].score\n for (const item of thresholds) {\n if (value >= item.minimumValue) {\n return {\n score: item.score,\n maximumScore,\n explanation: item.explanation,\n }\n }\n }\n const last = thresholds[thresholds.length - 1]\n\n return {\n score: last.score,\n maximumScore,\n explanation: last.explanation,\n }\n}\n","import type { Topology } from '@ethersphere/bee-js'\nimport type { ReactElement } from 'react'\nimport { pickThreshold, ThresholdValues } from '../utils/threshold'\nimport ExpandableListItem from './ExpandableListItem'\n\ninterface Props {\n topology: Topology | null\n}\n\nconst TopologyStats = (props: Props): ReactElement => {\n const thresholds: ThresholdValues = {\n connectedPeers: pickThreshold('connectedPeers', props.topology?.connected || 0),\n population: pickThreshold('population', props.topology?.population || 0),\n depth: pickThreshold('depth', props.topology?.depth || 0),\n }\n\n const maximumTotalScore = Object.values(thresholds).reduce((sum, item) => sum + item.maximumScore, 0)\n const actualTotalScore = Object.values(thresholds).reduce((sum, item) => sum + item.score, 0)\n const percentageText = Math.round((actualTotalScore / maximumTotalScore) * 100) + '%'\n\n return (\n <>\n <ExpandableListItem label=\"Overall Health Indicator\" value={percentageText} />\n <ExpandableListItem\n label=\"Connected Peers\"\n value={props.topology?.connected.toString()}\n tooltip={thresholds.connectedPeers.explanation}\n />\n <ExpandableListItem\n label=\"Population\"\n value={props.topology?.population.toString()}\n tooltip={thresholds.population.explanation}\n />\n <ExpandableListItem\n label=\"Depth\"\n value={props.topology?.depth.toString()}\n tooltip={thresholds.depth.explanation}\n />\n </>\n )\n}\n\nexport default TopologyStats\n","import { ReactElement, useContext } from 'react'\nimport { Button } from '@material-ui/core'\n\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context as BeeContext } from '../../providers/Bee'\nimport ExpandableList from '../../components/ExpandableList'\nimport ExpandableListItem from '../../components/ExpandableListItem'\nimport ExpandableListItemKey from '../../components/ExpandableListItemKey'\nimport TopologyStats from '../../components/TopologyStats'\n\nexport default function Status(): ReactElement {\n const {\n status,\n latestUserVersion,\n isLatestBeeVersion,\n latestBeeVersionUrl,\n topology,\n nodeAddresses,\n chequebookAddress,\n } = useContext(BeeContext)\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <div>\n <ExpandableList label=\"Bee Node\" defaultOpen>\n <ExpandableListItem\n label=\"Agent\"\n value={\n <div>\n <a href=\"https://github.com/ethersphere/bee\" rel=\"noreferrer\" target=\"_blank\">\n Bee\n </a>\n {` ${latestUserVersion || '-'} `}\n <Button size=\"small\" variant=\"outlined\" href={latestBeeVersionUrl} target=\"_blank\">\n {isLatestBeeVersion ? 'latest' : 'update'}\n </Button>\n </div>\n }\n />\n <ExpandableListItemKey label=\"Public key\" value={nodeAddresses?.publicKey || ''} />\n <ExpandableListItemKey label=\"PSS public key\" value={nodeAddresses?.pssPublicKey || ''} />\n <ExpandableListItemKey label=\"Overlay address (Peer ID)\" value={nodeAddresses?.overlay || ''} />\n\n <ExpandableList level={1} label=\"Underlay addresses\">\n {nodeAddresses?.underlay.map(addr => (\n <ExpandableListItem key={addr} value={addr} />\n ))}\n </ExpandableList>\n </ExpandableList>\n <ExpandableList label=\"Blockchain\" defaultOpen>\n <ExpandableListItemKey label=\"Ethereum address\" value={nodeAddresses?.ethereum || ''} />\n <ExpandableListItemKey label=\"Chequebook contract address\" value={chequebookAddress?.chequebookAddress || ''} />\n </ExpandableList>\n <ExpandableList label=\"Connectivity\" defaultOpen>\n <TopologyStats topology={topology} />\n </ExpandableList>\n </div>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport ExpandableList from '../../components/ExpandableList'\nimport ExpandableListItemInput from '../../components/ExpandableListItemInput'\nimport { Context as SettingsContext } from '../../providers/Settings'\n\nexport default function Settings(): ReactElement {\n const { apiUrl, apiDebugUrl, setApiUrl, setDebugApiUrl, lockedApiSettings } = useContext(SettingsContext)\n\n return (\n <ExpandableList label=\"API Settings\" defaultOpen>\n <ExpandableListItemInput label=\"Bee API\" value={apiUrl} onConfirm={setApiUrl} locked={lockedApiSettings} />\n <ExpandableListItemInput\n label=\"Bee Debug API\"\n value={apiDebugUrl}\n onConfirm={setDebugApiUrl}\n locked={lockedApiSettings}\n />\n </ExpandableList>\n )\n}\n","import { Collapse, ListItem } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ExpandLess, ExpandMore } from '@material-ui/icons'\nimport { ReactElement, ReactNode, useState } from 'react'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n padding: 0,\n margin: 0,\n marginTop: theme.spacing(4),\n '&:first-child': {\n marginTop: 0,\n },\n },\n rootLevel1: { marginTop: theme.spacing(1) },\n rootLevel2: { marginTop: theme.spacing(0.5) },\n header: {\n backgroundColor: theme.palette.background.paper,\n },\n contentLevel0: {\n marginTop: theme.spacing(1),\n },\n contentLevel12: {\n marginTop: theme.spacing(0.25),\n },\n infoText: {\n color: '#c9c9c9',\n },\n }),\n)\n\ninterface Props {\n children: ReactNode\n expandable: ReactNode\n defaultOpen?: boolean\n}\n\nexport default function ExpandableElement({ children, expandable, defaultOpen }: Props): ReactElement | null {\n const classes = useStyles()\n const [open, setOpen] = useState<boolean>(Boolean(defaultOpen))\n\n const handleClick = () => {\n setOpen(!open)\n }\n\n return (\n <div className={`${classes.root} ${classes.rootLevel2}`}>\n <ListItem button onClick={handleClick} className={classes.header}>\n {children}\n {open ? <ExpandLess /> : <ExpandMore />}\n </ListItem>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <div className={classes.contentLevel12}>{expandable}</div>\n </Collapse>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport ExpandableElement from '../../components/ExpandableElement'\nimport ExpandableList from '../../components/ExpandableList'\nimport ExpandableListItemKey from '../../components/ExpandableListItemKey'\nimport { EnrichedPostageBatch } from '../../providers/Stamps'\nimport { PostageStamp } from './PostageStamp'\n\ninterface Props {\n postageStamps: EnrichedPostageBatch[] | null\n}\n\nfunction StampsTable({ postageStamps }: Props): ReactElement | null {\n if (postageStamps === null) return null\n\n return (\n <ExpandableList label=\"Postage Stamps\" defaultOpen>\n {postageStamps.map(stamp => (\n <ExpandableElement\n key={stamp.batchID}\n expandable={<ExpandableListItemKey label=\"Batch ID\" value={stamp.batchID} />}\n >\n <PostageStamp stamp={stamp} shorten={true} />\n </ExpandableElement>\n ))}\n </ExpandableList>\n )\n}\n\nexport default StampsTable\n","import { CircularProgress, Container } from '@material-ui/core'\nimport { createStyles, makeStyles } from '@material-ui/core/styles'\nimport { ReactElement, useContext, useEffect, useState } from 'react'\nimport { PlusSquare } from 'react-feather'\nimport { SwarmButton } from '../../components/SwarmButton'\nimport TroubleshootConnectionCard from '../../components/TroubleshootConnectionCard'\nimport { Context as BeeContext } from '../../providers/Bee'\nimport { Context as StampsContext } from '../../providers/Stamps'\nimport { CreatePostageStampModal } from './CreatePostageStampModal'\nimport StampsTable from './StampsTable'\n\nconst useStyles = makeStyles(() =>\n createStyles({\n root: {\n width: '100%',\n display: 'grid',\n },\n actions: {\n display: 'flex',\n width: '100%',\n flex: '0 1 auto',\n flexWrap: 'wrap',\n alignItems: 'center',\n },\n }),\n)\n\nexport default function Stamp(): ReactElement {\n const classes = useStyles()\n\n const [isBuyingStamp, setBuyingStamp] = useState(false)\n\n const { stamps, isLoading, error, start, stop } = useContext(StampsContext)\n const { status } = useContext(BeeContext)\n\n useEffect(() => {\n if (!status.all) return\n start()\n\n return () => stop()\n }, [status]) // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!status.all) return <TroubleshootConnectionCard />\n\n return (\n <div className={classes.root}>\n {error && (\n <Container style={{ textAlign: 'center', padding: '50px' }}>\n Error loading postage stamps details: {error.message}\n </Container>\n )}\n {!error && (\n <>\n <div className={classes.actions}>\n {isBuyingStamp ? <CreatePostageStampModal onClose={() => setBuyingStamp(false)} /> : null}\n\n <SwarmButton onClick={() => setBuyingStamp(true)} iconType={PlusSquare}>\n Buy New Postage Stamp\n </SwarmButton>\n <div style={{ height: '5px' }}>{isLoading && <CircularProgress />}</div>\n </div>\n <StampsTable postageStamps={stamps} />\n </>\n )}\n </div>\n )\n}\n","import React, { ReactElement, ReactNode } from 'react'\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles'\nimport { Tab, Tabs } from '@material-ui/core'\n\ninterface TabPanelProps {\n children?: ReactNode\n index: number\n value: number\n}\n\nfunction TabPanel(props: TabPanelProps) {\n const { children, value, index, ...other } = props\n\n return (\n <div role=\"tabpanel\" hidden={value !== index} {...other}>\n {value === index && children}\n </div>\n )\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexGrow: 1,\n },\n content: {\n marginTop: theme.spacing(2),\n },\n }),\n)\n\ninterface TabsValues {\n component: ReactNode\n label: ReactNode\n}\n\ninterface Props {\n values: TabsValues[]\n index?: number\n indexChanged?: (index: number) => void\n}\n\nexport default function SimpleTabs({ values, index, indexChanged }: Props): ReactElement {\n const classes = useStyles()\n const [value, setValue] = React.useState<number>(index || 0)\n\n const handleChange = (event: React.ChangeEvent<Record<string, never>>, newValue: number) => {\n if (indexChanged) indexChanged(newValue)\n else setValue(newValue)\n }\n\n const v = index !== undefined ? index : value\n\n return (\n <div className={classes.root}>\n <Tabs value={v} onChange={handleChange} variant=\"fullWidth\">\n {values.map(({ label }, idx) => (\n <Tab key={idx} label={label} />\n ))}\n </Tabs>\n <div className={classes.content}>\n {values.map(({ component }, idx) => (\n <TabPanel key={idx} value={v} index={idx}>\n {component}\n </TabPanel>\n ))}\n </div>\n </div>\n )\n}\n","import { createContext, ReactChild, ReactElement, useState, useEffect } from 'react'\n\n// These need to be numeric values as they are used as indexes in the TabsContainer\nexport enum Platforms {\n macOS = 0,\n Linux,\n Windows,\n iOS,\n Android,\n}\n\nexport enum SupportedPlatforms {\n macOS = Platforms.macOS,\n Linux = Platforms.Linux,\n}\n\ninterface ContextInterface {\n platform: SupportedPlatforms\n setPlatform: (platform: SupportedPlatforms) => void\n}\n\nconst initialValues: ContextInterface = {\n platform: SupportedPlatforms.macOS,\n setPlatform: () => {}, // eslint-disable-line\n}\n\nexport const Context = createContext<ContextInterface>(initialValues)\nexport const Consumer = Context.Consumer\n\ninterface Props {\n children: ReactChild\n}\n\nfunction isSupportedPlatform(platform: unknown): platform is SupportedPlatforms {\n return Object.keys(SupportedPlatforms).includes(platform as string)\n}\n\nfunction getOS(): Platforms | null {\n const userAgent = window.navigator.userAgent\n const platform = window.navigator.platform\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']\n const iosPlatforms = ['iPhone', 'iPad', 'iPod']\n\n if (macosPlatforms.includes(platform)) return Platforms.macOS\n\n if (iosPlatforms.includes(platform)) return Platforms.iOS\n\n if (windowsPlatforms.includes(platform)) return Platforms.Windows\n\n if (/Android/.test(userAgent)) return Platforms.Android\n\n if (/Linux/.test(platform)) return Platforms.Linux\n\n return null\n}\n\nexport function Provider({ children }: Props): ReactElement {\n const [platform, setPlatform] = useState<SupportedPlatforms>(SupportedPlatforms.Linux)\n\n // This is in useEffect as it really just needs to run once and not on each re-render\n useEffect(() => {\n const os = getOS()\n\n setPlatform(isSupportedPlatform(os) ? os : SupportedPlatforms.Linux)\n }, [])\n\n return <Context.Provider value={{ platform, setPlatform }}>{children}</Context.Provider>\n}\n","import type { ReactElement } from 'react'\nimport SyntaxHighlighter from 'react-syntax-highlighter'\n\ninterface Props {\n code: string\n language: string\n showLineNumbers?: boolean\n}\n\nconst CodeBlock = (props: Props): ReactElement => {\n return (\n <div style={{ textAlign: 'left' }}>\n <SyntaxHighlighter language={props.language} showLineNumbers={props.showLineNumbers}>\n {props.code}\n </SyntaxHighlighter>\n </div>\n )\n}\n\nexport default CodeBlock\n","import { ReactElement, useContext } from 'react'\nimport TabsContainer from './TabsContainer'\nimport CodeBlock from './CodeBlock'\nimport { Context } from '../providers/Platform'\n\ninterface Props {\n linux: string\n mac: string\n showLineNumbers?: boolean\n}\n\nexport default function CodeBlockTabs(props: Props): ReactElement {\n const { platform, setPlatform } = useContext(Context)\n\n return (\n <TabsContainer\n index={platform}\n indexChanged={setPlatform}\n values={[\n {\n label: 'Linux',\n component: <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.linux} />,\n },\n {\n label: 'macOS',\n component: <CodeBlock showLineNumbers={props.showLineNumbers} language=\"bash\" code={props.mac} />,\n },\n ]}\n />\n )\n}\n","import type { ReactElement } from 'react'\nimport { CircularProgress } from '@material-ui/core'\n\ninterface Props {\n isOk: boolean\n isLoading?: boolean\n size?: number | string\n className?: string\n}\n\nexport default function StatusIcon({ isOk, size, className, isLoading }: Props): ReactElement {\n const s = size || '1rem'\n\n if (isLoading) return <CircularProgress size={s} className={className} />\n\n return (\n <span\n className={className}\n style={{\n backgroundColor: isOk ? '#1de600' : '#ff3a52',\n height: s,\n width: s,\n borderRadius: '50%',\n display: 'inline-block',\n }}\n />\n )\n}\n","import MuiAlert from '@material-ui/lab/Alert'\nimport { ReactElement, useContext } from 'react'\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItem from '../../../components/ExpandableListItem'\nimport ExpandableListItemInput from '../../../components/ExpandableListItemInput'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\nimport { Context as SettingsContext } from '../../../providers/Settings'\n\nexport default function NodeConnectionCheck(): ReactElement | null {\n const { status, isLoading } = useContext(Context)\n const { setDebugApiUrl, apiDebugUrl } = useContext(SettingsContext)\n const isOk = status.debugApiConnection\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Connection to Bee Debug API\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk\n ? 'The connection to the Bee nodes debug API has been successful'\n : 'We cannot connect to your nodes debug API. Please check the following to troubleshoot your issue.'}\n </ExpandableListItemNote>\n <ExpandableListItemInput label=\"Bee Debug API\" value={apiDebugUrl} onConfirm={setDebugApiUrl} />\n\n {!isOk && (\n <ExpandableList level={1} label=\"Troubleshoot\">\n <ExpandableListItem\n label={\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 to\n 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 remotely,\n make sure your firewall settings are set to only allow specific trusted IP addresses and block all\n other ports. A simple google search for "what is my ip" will show you your computers public\n 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 the\n 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 }\n />\n </ExpandableList>\n )}\n </ExpandableList>\n )\n}\n","import { ReactElement, useContext } from 'react'\n\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\nimport { Context as SettingsContext } from '../../../providers/Settings'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItem from '../../../components/ExpandableListItem'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport ExpandableListItemInput from '../../../components/ExpandableListItemInput'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\n\nexport default function NodeConnectionCheck(): ReactElement | null {\n const { setApiUrl, apiUrl } = useContext(SettingsContext)\n const { status, isLoading } = useContext(Context)\n const isOk = status.apiConnection\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Connection to Bee API\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk\n ? 'The connection to the Bee nodes API has been successful'\n : 'Could not connect to your Bee nodes API. Please check the troubleshoot below on how you may resolve it.'}\n </ExpandableListItemNote>\n <ExpandableListItemInput label=\"Bee API\" value={apiUrl} onConfirm={setApiUrl} />\n {!isOk && (\n <ExpandableList level={1} label=\"Troubleshoot\">\n <ExpandableListItem\n label={\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 }\n />\n </ExpandableList>\n )}\n </ExpandableList>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport CodeBlockTabs from '../../../components/CodeBlockTabs'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItem from '../../../components/ExpandableListItem'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\n\nexport default function VersionCheck(): ReactElement | null {\n const { status, isLoading, latestUserVersion, latestPublishedVersion, latestBeeVersionUrl } = useContext(Context)\n const isOk = status.version\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Bee Version\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk ? (\n 'You are running the latest version of Bee.'\n ) : (\n <>\n Your Bee version is out of date. Please update to the{' '}\n <a href={latestBeeVersionUrl} rel=\"noreferrer\" target=\"_blank\">\n latest\n </a>{' '}\n before continuing. Rerun the installation script below to upgrade. For more information please see the{' '}\n <a href=\"https://docs.ethswarm.org/docs/installation/manual#upgrading-bee\" rel=\"noreferrer\" target=\"_blank\">\n Docs\n </a>\n .\n <CodeBlockTabs\n showLineNumbers\n linux={`bee version\\nwget https://github.com/ethersphere/bee/releases/download/${latestPublishedVersion}/bee_${latestPublishedVersion}_amd64.deb\\nsudo dpkg -i bee_${latestPublishedVersion}_amd64.deb`}\n mac={`bee version\\nbrew tap ethersphere/tap\\nbrew install swarm-bee\\nbrew services start swarm-bee`}\n />\n </>\n )}\n </ExpandableListItemNote>\n <ExpandableListItem label=\"Your Version\" value={latestUserVersion || '-'} />\n <ExpandableListItem label=\"Latest Version\" value={latestPublishedVersion || '-'} />\n </ExpandableList>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItemKey from '../../../components/ExpandableListItemKey'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\n\nexport default function EthereumConnectionCheck(): ReactElement | null {\n const { status, isLoading, nodeAddresses } = useContext(Context)\n const isOk = status.blockchainConnection\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Connection to Blockchain\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk ? (\n 'Your node is connected to the xDai blockchain'\n ) : (\n <>\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\n the <strong>swap-endpoint</strong> in your configuration file.\n </>\n )}\n </ExpandableListItemNote>\n {nodeAddresses?.ethereum && <ExpandableListItemKey label=\"Ethereum Address\" value={nodeAddresses?.ethereum} />}\n </ExpandableList>\n )\n}\n","import { useContext } from 'react'\nimport DepositModal from '../../../containers/DepositModal'\nimport type { ReactElement } from 'react'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItemKey from '../../../components/ExpandableListItemKey'\nimport ExpandableListItemActions from '../../../components/ExpandableListItemActions'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\n\nconst ChequebookDeployFund = (): ReactElement | null => {\n const { status, isLoading, chequebookAddress } = useContext(Context)\n const isOk = status.chequebook\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Chequebook Deployment & Funding\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk ? (\n 'Your chequebook is deployed and funded'\n ) : (\n <>\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 (e.g. <a href=\"https://bzz.exchange/\">bzz.exchange</a>) and bridge it to\n the xDai network through the <a href=\"https://omni.xdaichain.com/bridge\">omni bridge</a>. To pay the\n transaction fees, you will also need xDAI token. You can purchase DAI on the network and bridge it to xDai\n 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 </>\n )}\n </ExpandableListItemNote>\n {chequebookAddress && (\n <>\n <ExpandableListItemKey label=\"Chequebook Address\" value={chequebookAddress.chequebookAddress} />\n <ExpandableListItemActions>\n <DepositModal />\n </ExpandableListItemActions>\n </>\n )}\n </ExpandableList>\n )\n}\n\nexport default ChequebookDeployFund\n","import type { ReactElement } from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport Accounting from './pages/accounting'\nimport { Download } from './pages/files/Download'\nimport { Share } from './pages/files/Share'\nimport { Upload } from './pages/files/Upload'\nimport { UploadLander } from './pages/files/UploadLander'\nimport Info from './pages/info'\nimport Settings from './pages/settings'\nimport Stamps from './pages/stamps'\nimport Status from './pages/status'\n\nexport enum ROUTES {\n INFO = '/',\n FILES = '/files',\n UPLOAD = '/files/upload',\n UPLOAD_IN_PROGRESS = '/files/upload/workflow',\n DOWNLOAD = '/files/download',\n HASH = '/files/hash/:hash',\n ACCOUNTING = '/accounting',\n SETTINGS = '/settings',\n STAMPS = '/stamps',\n STATUS = '/status',\n}\n\nconst BaseRouter = (): ReactElement => (\n <Switch>\n <Route exact path={ROUTES.UPLOAD_IN_PROGRESS} component={Upload} />\n <Route exact path={ROUTES.UPLOAD} component={UploadLander} />\n <Route exact path={ROUTES.DOWNLOAD} component={Download} />\n <Route exact path={ROUTES.HASH} component={Share} />\n <Route exact path={ROUTES.ACCOUNTING} component={Accounting} />\n <Route exact path={ROUTES.SETTINGS} component={Settings} />\n <Route exact path={ROUTES.STAMPS} component={Stamps} />\n <Route exact path={ROUTES.STATUS} component={Status} />\n <Route path={ROUTES.INFO} component={Info} />\n </Switch>\n)\n\nexport default BaseRouter\n","import { ReactElement, useContext } from 'react'\nimport ExpandableList from '../../../components/ExpandableList'\nimport ExpandableListItemNote from '../../../components/ExpandableListItemNote'\nimport TopologyStats from '../../../components/TopologyStats'\nimport StatusIcon from '../../../components/StatusIcon'\nimport { Context } from '../../../providers/Bee'\n\nexport default function PeerConnection(): ReactElement | null {\n const { status, isLoading, topology } = useContext(Context)\n const isOk = status.topology\n\n return (\n <ExpandableList\n label={\n <>\n <StatusIcon isOk={isOk} isLoading={isLoading} /> Connection to Peers\n </>\n }\n >\n <ExpandableListItemNote>\n {isOk\n ? 'You are connected to other Bee nodes'\n : 'Your node is not connected to any peers. Please wait a bit if you just started the node, otherwise review your configuration file.'}\n </ExpandableListItemNote>\n\n <TopologyStats topology={topology} />\n </ExpandableList>\n )\n}\n","import type { ReactElement } from 'react'\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'\n\nexport default function NodeSetupWorkflow(): ReactElement {\n return (\n <div>\n <DebugConnectionCheck />\n <VersionCheck />\n <EthereumConnectionCheck />\n <ChequebookDeployFund />\n <NodeConnectionCheck />\n <PeerConnection />\n </div>\n )\n}\n","import type { ReactElement, ReactNode } from 'react'\nimport { useLocation, matchPath } from 'react-router-dom'\n\nimport { createStyles, Theme, makeStyles, withStyles } from '@material-ui/core/styles'\nimport { ListItemText, ListItemIcon, ListItem } from '@material-ui/core'\n\nconst StyledListItem = withStyles((theme: Theme) => ({\n root: {\n paddingLeft: theme.spacing(4),\n paddingRight: theme.spacing(4),\n borderLeft: '4px solid rgba(0,0,0,0)',\n '&.Mui-selected, &.Mui-selected:hover': {\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n },\n },\n button: {\n '&:hover': {\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: '#2c2c2c',\n color: '#f9f9f9',\n },\n },\n },\n}))(ListItem)\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n icon: {\n color: 'inherit',\n },\n activeIcon: {\n color: theme.palette.primary.main,\n },\n }),\n)\n\ninterface Props {\n iconStart?: ReactNode\n iconEnd?: ReactNode\n path?: string\n label: ReactNode\n}\n\nexport default function SideBarItem({ iconStart, iconEnd, path, label }: Props): ReactElement {\n const classes = useStyles()\n const location = useLocation()\n const isSelected = Boolean(matchPath(location.pathname, { path, exact: true }))\n\n return (\n <StyledListItem button selected={isSelected} disableRipple>\n <ListItemIcon className={isSelected ? classes.activeIcon : classes.icon}>{iconStart}</ListItemIcon>\n <ListItemText primary={label} />\n <ListItemIcon className={isSelected ? classes.activeIcon : classes.icon}>{iconEnd}</ListItemIcon>\n </StyledListItem>\n )\n}\n","import { ReactElement, useContext } from 'react'\nimport { useLocation, matchPath } from 'react-router-dom'\nimport { ArrowRight } from 'react-feather'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\nimport { ListItemText, ListItemIcon, ListItem, Typography } from '@material-ui/core'\nimport { Context } from '../providers/Bee'\nimport StatusIcon from './StatusIcon'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n icon: {\n color: 'inherit',\n },\n iconSmall: {\n height: theme.spacing(2),\n },\n\n root: {\n height: theme.spacing(4),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(4),\n color: '#f9f9f9',\n borderLeft: '0px solid rgba(0,0,0,0)',\n '&.Mui-selected, &.Mui-selected:hover': {\n borderLeft: `0px solid ${theme.palette.primary.main}`,\n backgroundColor: '#2c2c2c',\n },\n },\n rootError: {\n backgroundColor: 'rgba(255, 58, 82, 0.25)',\n },\n button: {\n '&:hover': {\n backgroundColor: '#2c2c2c',\n color: 'white',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: '#2c2c2c',\n color: 'white',\n },\n },\n },\n smallerText: {\n fontSize: '0.9rem',\n },\n }),\n)\n\ninterface Props {\n path?: string\n}\n\nexport default function SideBarItem({ path }: Props): ReactElement {\n const { status, isLoading } = useContext(Context)\n const classes = useStyles()\n const location = useLocation()\n const isSelected = Boolean(matchPath(location.pathname, { path, exact: true }))\n\n return (\n <ListItem\n button\n classes={{ root: `${classes.root} ${status.all ? '' : classes.rootError}`, button: classes.button }}\n selected={isSelected}\n disableRipple\n >\n <ListItemIcon style={{ marginLeft: '30px' }}>\n <StatusIcon isOk={status.all} isLoading={isLoading} />\n </ListItemIcon>\n <ListItemText\n primary={<Typography className={classes.smallerText}>{`Node ${status.all ? 'OK' : 'Error'}`}</Typography>}\n />\n <ListItemIcon className={classes.icon}>\n {status.all ? null : <ArrowRight className={classes.iconSmall} />}\n </ListItemIcon>\n </ListItem>\n )\n}\n","import { Divider, Drawer, Grid, Link as MUILink, List } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\nimport { OpenInNewSharp } from '@material-ui/icons'\nimport type { ReactElement } from 'react'\nimport { BookOpen, DollarSign, FileText, Home, Layers, Settings } from 'react-feather'\nimport { Link } from 'react-router-dom'\nimport Logo from '../assets/logo.svg'\nimport { config } from '../config'\nimport { ROUTES } from '../routes'\nimport SideBarItem from './SideBarItem'\nimport SideBarStatus from './SideBarStatus'\n\nconst navBarItems = [\n {\n label: 'Info',\n path: ROUTES.INFO,\n icon: Home,\n },\n {\n label: 'Files',\n path: ROUTES.UPLOAD,\n icon: FileText,\n },\n {\n label: 'Stamps',\n path: ROUTES.STAMPS,\n icon: Layers,\n },\n {\n label: 'Accounting',\n path: ROUTES.ACCOUNTING,\n icon: DollarSign,\n },\n {\n label: 'Settings',\n path: ROUTES.SETTINGS,\n icon: Settings,\n },\n]\n\nconst drawerWidth = 300\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexWrap: 'nowrap',\n minHeight: '100vh',\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8),\n },\n drawer: {\n width: drawerWidth,\n flexShrink: 0,\n },\n drawerPaper: {\n width: drawerWidth,\n backgroundColor: '#212121',\n },\n logo: {\n marginLeft: theme.spacing(8),\n marginRight: theme.spacing(8),\n },\n icon: {\n height: theme.spacing(4),\n },\n iconSmall: {\n height: theme.spacing(2),\n },\n divider: {\n backgroundColor: '#2c2c2c',\n marginLeft: theme.spacing(4),\n marginRight: theme.spacing(4),\n },\n link: {\n color: '#9f9f9f',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n textDecoration: 'none',\n },\n },\n },\n }),\n)\n\nexport default function SideBar(): ReactElement {\n const classes = useStyles()\n\n return (\n <Drawer className={classes.drawer} variant=\"permanent\" anchor=\"left\" classes={{ paper: classes.drawerPaper }}>\n <Grid container direction=\"column\" justifyContent=\"space-between\" className={classes.root}>\n <Grid className={classes.logo}>\n <Link to={ROUTES.INFO}>\n <img alt=\"swarm\" src={Logo} />\n </Link>\n </Grid>\n <Grid>\n <List>\n {navBarItems.map(p => (\n <Link to={p.path} key={p.path} className={classes.link}>\n <SideBarItem\n key={p.path}\n iconStart={<p.icon className={classes.icon} />}\n path={p.path}\n label={p.label}\n />\n </Link>\n ))}\n </List>\n <Divider className={classes.divider} />\n <List>\n <MUILink href={config.BEE_DOCS_HOST} target=\"_blank\" className={classes.link}>\n <SideBarItem\n iconStart={<BookOpen className={classes.icon} />}\n iconEnd={<OpenInNewSharp className={classes.iconSmall} />}\n label={<span>Docs</span>}\n />\n </MUILink>\n </List>\n </Grid>\n <Grid>\n <Link to={ROUTES.STATUS} className={classes.link}>\n <SideBarStatus path={ROUTES.STATUS} />\n </Link>\n </Grid>\n </Grid>\n </Drawer>\n )\n}\n","import { useContext, ReactElement } from 'react'\nimport ErrorBoundary from '../components/ErrorBoundary'\nimport AlertVersion from '../components/AlertVersion'\nimport { Container, CircularProgress } from '@material-ui/core'\n\nimport { createStyles, Theme, makeStyles } from '@material-ui/core/styles'\n\nimport SideBar from '../components/SideBar'\n\nimport { Context } from '../providers/Bee'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n content: {\n backgroundColor: theme.palette.background.default,\n minHeight: '100vh',\n },\n }),\n)\n\ninterface Props {\n children?: ReactElement\n}\n\nconst Dashboard = (props: Props): ReactElement => {\n const classes = useStyles()\n\n const { isLoading } = useContext(Context)\n\n return (\n <div style={{ display: 'flex' }}>\n <SideBar />\n <Container className={classes.content}>\n <ErrorBoundary>\n <>\n <AlertVersion />\n {isLoading ? (\n <div style={{ textAlign: 'center', width: '100%' }}>\n <CircularProgress />\n </div>\n ) : (\n props.children\n )}\n </>\n </ErrorBoundary>\n </Container>\n </div>\n )\n}\n\nexport default Dashboard\n","import { createTheme, 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 MuiListItem: {\n button: {\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n },\n },\n },\n },\n MuiContainer: {\n root: { padding: theme.spacing(8) },\n maxWidthXs: { padding: theme.spacing(8) },\n maxWidthSm: { padding: theme.spacing(8) },\n maxWidthMd: { padding: theme.spacing(8) },\n maxWidthLg: { padding: theme.spacing(8) },\n maxWidthXl: { padding: theme.spacing(8) },\n },\n MuiButton: {\n startIcon: { marginLeft: theme.spacing(1) },\n endIcon: { marginRight: theme.spacing(1) },\n outlined: {\n border: 'none',\n borderRadius: theme.spacing(10),\n color: theme.palette.primary.main,\n backgroundColor: '#fcf2e8',\n },\n outlinedSizeSmall: {\n padding: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n },\n },\n },\n outlinedSizeLarge: {\n padding: theme.spacing(4),\n borderRadius: 0,\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n },\n },\n },\n containedSizeLarge: {\n padding: theme.spacing(4),\n borderRadius: 0,\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n },\n },\n },\n containedSizeSmall: {\n padding: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n borderRadius: 0,\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n },\n },\n },\n contained: {\n padding: theme.spacing(2),\n backgroundColor: 'white',\n boxShadow: 'none',\n borderRadius: 0,\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n // https://github.com/mui-org/material-ui/issues/22543\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n boxShadow: 'none',\n },\n },\n '&:focus': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n },\n '&:active': {\n backgroundColor: theme.palette.primary.main,\n color: 'white',\n },\n '&:disabled': {\n backgroundColor: 'white',\n },\n },\n },\n MuiTab: {\n root: {\n backgroundColor: theme.palette.background.paper,\n '&:hover': {\n backgroundColor: '#fcf2e8',\n color: theme.palette.primary.main,\n opacity: 1,\n },\n '&$selected': {\n fontWeight: theme.typography.fontWeightMedium,\n },\n },\n textColorInherit: {\n opacity: 0.5,\n },\n },\n MuiTabs: {\n root: {\n borderBottom: 'none',\n },\n indicator: {\n backgroundColor: 'transparent',\n },\n },\n})\n\nconst propsOverrides = {\n MuiTab: {\n disableRipple: true,\n },\n MuiButtonBase: {\n disableRipple: true,\n },\n}\n\nexport const theme = createTheme({\n palette: {\n type: 'light',\n background: {\n default: '#efefef',\n },\n primary: {\n light: '#fcf2e8',\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 h1: {\n fontSize: '1.3rem',\n fontWeight: 500,\n },\n h2: {\n fontSize: '1rem',\n fontWeight: 500,\n },\n h3: {\n fontSize: '0.8rem',\n fontWeight: 500,\n },\n body2: {\n fontFamily: '\"IBM Plex Mono\", monospace',\n fontWeight: 500,\n fontSize: '1rem',\n },\n },\n})\n\ntheme.overrides = componentsOverrides(theme)\ntheme.props = propsOverrides\n","import CssBaseline from '@material-ui/core/CssBaseline'\nimport { ThemeProvider } from '@material-ui/core/styles'\nimport { SnackbarProvider } from 'notistack'\nimport React, { ReactElement } from 'react'\nimport { BrowserRouter as Router } from 'react-router-dom'\nimport './App.css'\nimport Dashboard from './layout/Dashboard'\nimport { Provider as BeeProvider } from './providers/Bee'\nimport { Provider as FileProvider } from './providers/File'\nimport { Provider as PlatformProvider } from './providers/Platform'\nimport { Provider as SettingsProvider } from './providers/Settings'\nimport { Provider as StampsProvider } from './providers/Stamps'\nimport BaseRouter from './routes'\nimport { theme } from './theme'\n\ninterface Props {\n beeApiUrl?: string\n beeDebugApiUrl?: string\n lockedApiSettings?: boolean\n}\n\nconst App = ({ beeApiUrl, beeDebugApiUrl, lockedApiSettings }: Props): ReactElement => (\n <div className=\"App\">\n <ThemeProvider theme={theme}>\n <SettingsProvider beeApiUrl={beeApiUrl} beeDebugApiUrl={beeDebugApiUrl} lockedApiSettings={lockedApiSettings}>\n <BeeProvider>\n <StampsProvider>\n <FileProvider>\n <PlatformProvider>\n <SnackbarProvider>\n <Router>\n <>\n <CssBaseline />\n <Dashboard>\n <BaseRouter />\n </Dashboard>\n </>\n </Router>\n </SnackbarProvider>\n </PlatformProvider>\n </FileProvider>\n </StampsProvider>\n </BeeProvider>\n </SettingsProvider>\n </ThemeProvider>\n </div>\n)\n\nexport default App\n","import { ReportHandler } from 'web-vitals'\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler): void => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root'),\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}
|