diff --git a/src/providers/Bee.tsx b/src/providers/Bee.tsx
index 89ff3a5..4327834 100644
--- a/src/providers/Bee.tsx
+++ b/src/providers/Bee.tsx
@@ -1,9 +1,9 @@
import type { ChequebookBalance, Balance, Settlements } from '../types'
-import { createContext, ReactChild, ReactElement, useEffect, useState } from 'react'
-import { beeApi, beeDebugApi } from '../services/bee'
+import { createContext, ReactChild, ReactElement, useEffect, useState, useContext } from 'react'
import { Token } from '../models/Token'
import semver from 'semver'
import { engines } from '../../package.json'
+import { Context as SettingsContext } from './Settings'
import type {
NodeAddresses,
@@ -125,6 +125,7 @@ function getStatus(
}
export function Provider({ children }: Props): ReactElement {
+ const { beeApi, beeDebugApi } = useContext(SettingsContext)
const [apiHealth, setApiHealth] = useState
(false)
const [debugApiHealth, setDebugApiHealth] = useState(null)
const [nodeAddresses, setNodeAddresses] = useState(null)
@@ -147,47 +148,143 @@ export function Provider({ children }: Props): ReactElement {
const latestUserVersion = semver.coerce(debugApiHealth?.version)?.version
const latestUserVersionExact = debugApiHealth?.version
+ useEffect(() => {
+ setIsLoading(true)
+
+ setApiHealth(false)
+
+ refresh()
+ }, [beeApi])
+
+ useEffect(() => {
+ setIsLoading(true)
+
+ setDebugApiHealth(null)
+ setNodeAddresses(null)
+ setNodeTopology(null)
+ setPeers(null)
+ setChequebookAddress(null)
+ setChequebookBalance(null)
+ setPeerBalances(null)
+ setPeerCheques(null)
+ setSettlements(null)
+
+ refresh()
+ }, [beeDebugApi])
+
const refresh = async () => {
// Don't want to refresh when already refreshing
if (isRefreshing) return
+ // Not a valid bee api
+ if (!beeApi || !beeDebugApi) {
+ setIsLoading(false)
+
+ return
+ }
+
try {
setIsRefreshing(true)
+ setError(null)
- setApiHealth(await beeApi.status.health())
- setDebugApiHealth(await beeDebugApi.status.nodeHealth())
- setNodeAddresses(await beeDebugApi.connectivity.addresses())
- setNodeTopology(await beeDebugApi.connectivity.topology())
- setChequebookAddress(await beeDebugApi.chequebook.address())
- setPeers(await beeDebugApi.connectivity.listPeers())
+ // Wrap the chequebook balance call to return BZZ values as Token object
+ const chequeBalanceWrapper = async () => {
+ const { totalBalance, availableBalance } = await beeDebugApi.getChequebookBalance()
- const { totalBalance, availableBalance } = await beeDebugApi.chequebook.balance()
- setChequebookBalance({
- totalBalance: new Token(totalBalance),
- availableBalance: new Token(availableBalance),
- })
+ return {
+ totalBalance: new Token(totalBalance),
+ availableBalance: new Token(availableBalance),
+ }
+ }
- const { balances } = await beeDebugApi.balance.balances()
- setPeerBalances(balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) })))
+ // Wrap the balances call to return BZZ values as Token object
+ const peerBalanceWrapper = async () => {
+ const { balances } = await beeDebugApi.getAllBalances()
- setPeerCheques(await beeDebugApi.chequebook.getLastCheques())
- const { totalReceived, settlements, totalSent } = await beeDebugApi.settlements.getSettlements()
- setSettlements({
- totalReceived: new Token(totalReceived),
- totalSent: new Token(totalSent),
- settlements: settlements.map(({ peer, received, sent }) => ({
- peer,
- received: new Token(received),
- sent: new Token(sent),
- })),
- })
+ return balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) }))
+ }
- setLastUpdate(Date.now())
+ // Wrap the settlements call to return BZZ values as Token object
+ const settlementsWrapper = async () => {
+ const { totalReceived, settlements, totalSent } = await beeDebugApi.getAllSettlements()
+
+ return {
+ totalReceived: new Token(totalReceived),
+ totalSent: new Token(totalSent),
+ settlements: settlements.map(({ peer, received, sent }) => ({
+ peer,
+ received: new Token(received),
+ sent: new Token(sent),
+ })),
+ }
+ }
+
+ const promises = [
+ // API health
+ beeApi
+ .isConnected()
+ .then(setApiHealth)
+ .catch(() => setApiHealth(false)),
+
+ // Debug API health
+ beeDebugApi
+ .getHealth()
+ .then(setDebugApiHealth)
+ .catch(() => setDebugApiHealth(null)),
+
+ // Node Addresses
+ beeDebugApi
+ .getNodeAddresses()
+ .then(setNodeAddresses)
+ .catch(() => setNodeAddresses(null)),
+
+ // Network Topology
+ beeDebugApi
+ .getTopology()
+ .then(setNodeTopology)
+ .catch(() => setNodeTopology(null)),
+
+ // Peers
+ beeDebugApi
+ .getPeers()
+ .then(setPeers)
+ .catch(() => setPeers(null)),
+
+ // Chequebook address
+ beeDebugApi
+ .getChequebookAddress()
+ .then(setChequebookAddress)
+ .catch(() => setChequebookAddress(null)),
+
+ // Cheques
+ beeDebugApi
+ .getLastCheques()
+ .then(setPeerCheques)
+ .catch(() => setPeerCheques(null)),
+
+ // Chequebook balance
+ chequeBalanceWrapper()
+ .then(setChequebookBalance)
+ .catch(() => setChequebookBalance(null)),
+
+ // Peer balances
+ peerBalanceWrapper()
+ .then(setPeerBalances)
+ .catch(() => setPeerBalances(null)),
+
+ // Settlements
+ settlementsWrapper()
+ .then(setSettlements)
+ .catch(() => setSettlements(null)),
+ ]
+
+ await Promise.allSettled(promises)
} catch (e) {
setError(e)
} finally {
setIsLoading(false)
setIsRefreshing(false)
+ setLastUpdate(Date.now())
}
}
@@ -204,7 +301,7 @@ export function Provider({ children }: Props): ReactElement {
return () => clearInterval(interval)
}
- }, [frequency])
+ }, [frequency, beeDebugApi, beeApi])
return (
void
+ setDebugApiUrl: (url: string) => void
+}
+
+const initialValues: ContextInterface = {
+ apiUrl: sessionStorage.getItem('api_host') || process.env.REACT_APP_BEE_HOST || 'http://localhost:1633',
+ apiDebugUrl:
+ sessionStorage.getItem('debug_api_host') || process.env.REACT_APP_BEE_DEBUG_HOST || 'http://localhost:1635',
+ beeApi: null,
+ beeDebugApi: null,
+ setApiUrl: (url: string) => {}, // eslint-disable-line
+ setDebugApiUrl: (url: string) => {}, // eslint-disable-line
+}
+
+export const Context = createContext(initialValues)
+export const Consumer = Context.Consumer
+
+interface Props {
+ children: ReactChild
+}
+
+export function Provider({ children }: Props): ReactElement {
+ const [apiUrl, setApiUrl] = useState(initialValues.apiUrl)
+ const [apiDebugUrl, setDebugApiUrl] = useState(initialValues.apiDebugUrl)
+ const [beeApi, setBeeApi] = useState(null)
+ const [beeDebugApi, setBeeDebugApi] = useState(null)
+
+ useEffect(() => {
+ try {
+ setBeeApi(new Bee(apiUrl))
+ sessionStorage.setItem('api_host', apiUrl)
+ } catch (e) {
+ setBeeApi(null)
+ }
+ }, [apiUrl])
+
+ useEffect(() => {
+ try {
+ setBeeDebugApi(new BeeDebug(apiDebugUrl))
+ sessionStorage.setItem('debug_api_host', apiDebugUrl)
+ } catch (e) {
+ setBeeDebugApi(null)
+ }
+ }, [apiDebugUrl])
+
+ return (
+
+ {children}
+
+ )
+}
diff --git a/src/providers/Stamps.tsx b/src/providers/Stamps.tsx
index e0b4baf..51296e1 100644
--- a/src/providers/Stamps.tsx
+++ b/src/providers/Stamps.tsx
@@ -1,6 +1,6 @@
import { PostageBatch } from '@ethersphere/bee-js'
-import { createContext, ReactChild, ReactElement, useEffect, useState } from 'react'
-import { beeApi } from '../services/bee'
+import { createContext, ReactChild, ReactElement, useEffect, useState, useContext } from 'react'
+import { Context as SettingsContext } from './Settings'
export interface EnrichedPostageBatch extends PostageBatch {
usage: number
@@ -48,6 +48,7 @@ function enrichStamp(postageBatch: PostageBatch): EnrichedPostageBatch {
}
export function Provider({ children }: Props): ReactElement {
+ const { beeApi } = useContext(SettingsContext)
const [stamps, setStamps] = useState(initialValues.stamps)
const [error, setError] = useState(initialValues.error)
const [isLoading, setIsLoading] = useState(initialValues.isLoading)
@@ -58,9 +59,11 @@ export function Provider({ children }: Props): ReactElement {
// Don't want to refresh when already refreshing
if (isLoading) return
+ if (!beeApi) return
+
try {
setIsLoading(true)
- const stamps = await beeApi.stamps.getPostageStamps()
+ const stamps = await beeApi.getAllPostageBatch()
setStamps(stamps.map(enrichStamp))
setLastUpdate(Date.now())
diff --git a/src/services/bee.tsx b/src/services/bee.tsx
deleted file mode 100644
index 0fa87fc..0000000
--- a/src/services/bee.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import {
- Address,
- AllSettlements,
- BalanceResponse,
- Bee,
- BeeDebug,
- ChequebookAddressResponse,
- ChequebookBalanceResponse,
- Data,
- FileData,
- Health,
- LastCashoutActionResponse,
- LastChequesForPeerResponse,
- LastChequesResponse,
- NodeAddresses,
- Peer,
- PingResponse,
- PostageBatch,
- PostageBatchOptions,
- Reference,
- Topology,
-} from '@ethersphere/bee-js'
-import { apiHost, debugApiHost } from '../constants'
-
-const beeJSClient = () => new Bee(apiHost)
-
-const beeJSDebugClient = () => new BeeDebug(debugApiHost)
-
-export const beeApi = {
- status: {
- health(): Promise {
- return beeJSClient().isConnected()
- },
- },
- files: {
- uploadFile(postageBatchId: Address, file: File): Promise {
- return beeJSClient().uploadFile(postageBatchId, file)
- },
- downloadFile(hash: string | Reference): Promise> {
- return beeJSClient().downloadFile(hash)
- },
- },
- stamps: {
- getPostageStamps(): Promise {
- return beeJSClient().getAllPostageBatch()
- },
- buyPostageStamp(amount: bigint, depth: number, options: PostageBatchOptions = {}): Promise {
- return beeJSClient().createPostageBatch(amount.toString(), depth, options)
- },
- },
-}
-
-export const beeDebugApi = {
- status: {
- nodeHealth(): Promise {
- return beeJSDebugClient().getHealth()
- },
- },
- connectivity: {
- addresses(): Promise {
- return beeJSDebugClient().getNodeAddresses()
- },
- listPeers(): Promise {
- return beeJSDebugClient().getPeers()
- },
- topology(): Promise {
- return beeJSDebugClient().getTopology()
- },
- ping(peerId: string): Promise {
- return beeJSDebugClient().pingPeer(peerId)
- },
- },
- balance: {
- balances(): Promise {
- return beeJSDebugClient().getAllBalances()
- },
- },
- chequebook: {
- address(): Promise {
- return beeJSDebugClient().getChequebookAddress()
- },
- balance(): Promise {
- return beeJSDebugClient().getChequebookBalance()
- },
- getLastCheques(): Promise {
- return beeJSDebugClient().getLastCheques()
- },
- peerCashout(peerId: string): Promise {
- return beeJSDebugClient().cashoutLastCheque(peerId)
- },
- getPeerLastCashout(peerId: string): Promise {
- return beeJSDebugClient().getLastCashoutAction(peerId)
- },
- getPeerLastCheques(peerId: string): Promise {
- return beeJSDebugClient().getLastChequesForPeer(peerId)
- },
- withdraw(amount: bigint): Promise {
- return beeJSDebugClient().withdrawTokens(amount.toString())
- },
- deposit(amount: bigint): Promise {
- return beeJSDebugClient().depositTokens(amount.toString())
- },
- },
- settlements: {
- getSettlements(): Promise {
- return beeJSDebugClient().getAllSettlements()
- },
- },
-}