feat: detect bee mode and enable/disable status checks accordingly (#318)
This commit is contained in:
@@ -17,6 +17,7 @@ export default function Status(): ReactElement {
|
|||||||
topology,
|
topology,
|
||||||
nodeAddresses,
|
nodeAddresses,
|
||||||
chequebookAddress,
|
chequebookAddress,
|
||||||
|
nodeInfo,
|
||||||
} = useContext(BeeContext)
|
} = useContext(BeeContext)
|
||||||
|
|
||||||
if (!status.all) return <TroubleshootConnectionCard />
|
if (!status.all) return <TroubleshootConnectionCard />
|
||||||
@@ -24,6 +25,7 @@ export default function Status(): ReactElement {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<ExpandableList label="Bee Node" defaultOpen>
|
<ExpandableList label="Bee Node" defaultOpen>
|
||||||
|
<ExpandableListItem label="Mode" value={nodeInfo?.beeMode} />
|
||||||
<ExpandableListItem
|
<ExpandableListItem
|
||||||
label="Agent"
|
label="Agent"
|
||||||
value={
|
value={
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ import { Context } from '../../../providers/Bee'
|
|||||||
|
|
||||||
const ChequebookDeployFund = (): ReactElement | null => {
|
const ChequebookDeployFund = (): ReactElement | null => {
|
||||||
const { status, isLoading, chequebookAddress } = useContext(Context)
|
const { status, isLoading, chequebookAddress } = useContext(Context)
|
||||||
const isOk = status.chequebook
|
const { isOk, isEnabled } = status.chequebook
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import { Context as SettingsContext } from '../../../providers/Settings'
|
|||||||
export default function NodeConnectionCheck(): ReactElement | null {
|
export default function NodeConnectionCheck(): ReactElement | null {
|
||||||
const { status, isLoading } = useContext(Context)
|
const { status, isLoading } = useContext(Context)
|
||||||
const { setDebugApiUrl, apiDebugUrl } = useContext(SettingsContext)
|
const { setDebugApiUrl, apiDebugUrl } = useContext(SettingsContext)
|
||||||
const isOk = status.debugApiConnection
|
const { isOk, isEnabled } = status.debugApiConnection
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import { Context } from '../../../providers/Bee'
|
|||||||
|
|
||||||
export default function EthereumConnectionCheck(): ReactElement | null {
|
export default function EthereumConnectionCheck(): ReactElement | null {
|
||||||
const { status, isLoading, nodeAddresses } = useContext(Context)
|
const { status, isLoading, nodeAddresses } = useContext(Context)
|
||||||
const isOk = status.blockchainConnection
|
const { isOk, isEnabled } = status.blockchainConnection
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import { Context } from '../../../providers/Bee'
|
|||||||
export default function NodeConnectionCheck(): ReactElement | null {
|
export default function NodeConnectionCheck(): ReactElement | null {
|
||||||
const { setApiUrl, apiUrl } = useContext(SettingsContext)
|
const { setApiUrl, apiUrl } = useContext(SettingsContext)
|
||||||
const { status, isLoading } = useContext(Context)
|
const { status, isLoading } = useContext(Context)
|
||||||
const isOk = status.apiConnection
|
const { isEnabled, isOk } = status.apiConnection
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import { Context } from '../../../providers/Bee'
|
|||||||
|
|
||||||
export default function PeerConnection(): ReactElement | null {
|
export default function PeerConnection(): ReactElement | null {
|
||||||
const { status, isLoading, topology } = useContext(Context)
|
const { status, isLoading, topology } = useContext(Context)
|
||||||
const isOk = status.topology
|
const { isEnabled, isOk } = status.topology
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ import { Context } from '../../../providers/Bee'
|
|||||||
|
|
||||||
export default function VersionCheck(): ReactElement | null {
|
export default function VersionCheck(): ReactElement | null {
|
||||||
const { status, isLoading, latestUserVersion, latestPublishedVersion, latestBeeVersionUrl } = useContext(Context)
|
const { status, isLoading, latestUserVersion, latestPublishedVersion, latestBeeVersionUrl } = useContext(Context)
|
||||||
const isOk = status.version
|
const { isEnabled, isOk } = status.version
|
||||||
|
|
||||||
|
if (!isEnabled) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ExpandableList
|
<ExpandableList
|
||||||
|
|||||||
+53
-31
@@ -1,12 +1,13 @@
|
|||||||
import type {
|
import {
|
||||||
ChainState,
|
ChainState,
|
||||||
ChequebookAddressResponse,
|
ChequebookAddressResponse,
|
||||||
Health,
|
Health,
|
||||||
LastChequesResponse,
|
LastChequesResponse,
|
||||||
NodeAddresses,
|
NodeAddresses,
|
||||||
NodesInfo,
|
NodeInfo,
|
||||||
Peer,
|
Peer,
|
||||||
Topology,
|
Topology,
|
||||||
|
BeeModes,
|
||||||
} from '@ethersphere/bee-js'
|
} from '@ethersphere/bee-js'
|
||||||
import { createContext, ReactChild, ReactElement, useContext, useEffect, useState } from 'react'
|
import { createContext, ReactChild, ReactElement, useContext, useEffect, useState } from 'react'
|
||||||
import semver from 'semver'
|
import semver from 'semver'
|
||||||
@@ -16,14 +17,19 @@ import { Token } from '../models/Token'
|
|||||||
import type { Balance, ChequebookBalance, Settlements } from '../types'
|
import type { Balance, ChequebookBalance, Settlements } from '../types'
|
||||||
import { Context as SettingsContext } from './Settings'
|
import { Context as SettingsContext } from './Settings'
|
||||||
|
|
||||||
|
interface StatusItem {
|
||||||
|
isEnabled: boolean
|
||||||
|
isOk: boolean
|
||||||
|
}
|
||||||
|
|
||||||
interface Status {
|
interface Status {
|
||||||
all: boolean
|
all: boolean
|
||||||
version: boolean
|
version: StatusItem
|
||||||
blockchainConnection: boolean
|
blockchainConnection: StatusItem
|
||||||
debugApiConnection: boolean
|
debugApiConnection: StatusItem
|
||||||
apiConnection: boolean
|
apiConnection: StatusItem
|
||||||
topology: boolean
|
topology: StatusItem
|
||||||
chequebook: boolean
|
chequebook: StatusItem
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ContextInterface {
|
interface ContextInterface {
|
||||||
@@ -37,7 +43,7 @@ interface ContextInterface {
|
|||||||
apiHealth: boolean
|
apiHealth: boolean
|
||||||
debugApiHealth: Health | null
|
debugApiHealth: Health | null
|
||||||
nodeAddresses: NodeAddresses | null
|
nodeAddresses: NodeAddresses | null
|
||||||
nodeInfo: NodesInfo | null
|
nodeInfo: NodeInfo | null
|
||||||
topology: Topology | null
|
topology: Topology | null
|
||||||
chequebookAddress: ChequebookAddressResponse | null
|
chequebookAddress: ChequebookAddressResponse | null
|
||||||
peers: Peer[] | null
|
peers: Peer[] | null
|
||||||
@@ -55,17 +61,15 @@ interface ContextInterface {
|
|||||||
refresh: () => Promise<void>
|
refresh: () => Promise<void>
|
||||||
}
|
}
|
||||||
|
|
||||||
const startedInDevMode = window.location.search.includes('devMode=1')
|
|
||||||
|
|
||||||
const initialValues: ContextInterface = {
|
const initialValues: ContextInterface = {
|
||||||
status: {
|
status: {
|
||||||
all: false,
|
all: false,
|
||||||
version: false,
|
version: { isEnabled: false, isOk: false },
|
||||||
blockchainConnection: false,
|
blockchainConnection: { isEnabled: false, isOk: false },
|
||||||
debugApiConnection: false,
|
debugApiConnection: { isEnabled: false, isOk: false },
|
||||||
apiConnection: false,
|
apiConnection: { isEnabled: false, isOk: false },
|
||||||
topology: false,
|
topology: { isEnabled: false, isOk: false },
|
||||||
chequebook: false,
|
chequebook: { isEnabled: false, isOk: false },
|
||||||
},
|
},
|
||||||
latestPublishedVersion: undefined,
|
latestPublishedVersion: undefined,
|
||||||
latestUserVersion: undefined,
|
latestUserVersion: undefined,
|
||||||
@@ -104,34 +108,52 @@ interface Props {
|
|||||||
function getStatus(
|
function getStatus(
|
||||||
debugApiHealth: Health | null,
|
debugApiHealth: Health | null,
|
||||||
nodeAddresses: NodeAddresses | null,
|
nodeAddresses: NodeAddresses | null,
|
||||||
nodeInfo: NodesInfo | null,
|
nodeInfo: NodeInfo | null,
|
||||||
apiHealth: boolean,
|
apiHealth: boolean,
|
||||||
topology: Topology | null,
|
topology: Topology | null,
|
||||||
chequebookAddress: ChequebookAddressResponse | null,
|
chequebookAddress: ChequebookAddressResponse | null,
|
||||||
chequebookBalance: ChequebookBalance | null,
|
chequebookBalance: ChequebookBalance | null,
|
||||||
error: Error | null,
|
error: Error | null,
|
||||||
): Status {
|
): Status {
|
||||||
// FIXME: `devMode` is a temporary workaround to be able to develop with only one node
|
|
||||||
const devMode = startedInDevMode || Boolean(process.env.REACT_APP_DEV_MODE) || nodeInfo?.beeMode === 'dev'
|
|
||||||
const status = {
|
const status = {
|
||||||
version: Boolean(
|
version: {
|
||||||
|
isEnabled: true,
|
||||||
|
isOk: Boolean(
|
||||||
debugApiHealth &&
|
debugApiHealth &&
|
||||||
semver.satisfies(debugApiHealth.version, engines.bee, {
|
semver.satisfies(debugApiHealth.version, engines.bee, {
|
||||||
includePrerelease: true,
|
includePrerelease: true,
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
blockchainConnection: Boolean(nodeAddresses?.ethereum),
|
},
|
||||||
debugApiConnection: Boolean(debugApiHealth?.status === 'ok'),
|
blockchainConnection: {
|
||||||
apiConnection: apiHealth,
|
isEnabled: true,
|
||||||
topology: Boolean(topology?.connected && topology?.connected > 0) || devMode,
|
isOk: Boolean(nodeAddresses?.ethereum),
|
||||||
chequebook:
|
},
|
||||||
(Boolean(chequebookAddress?.chequebookAddress) &&
|
debugApiConnection: {
|
||||||
|
isEnabled: true,
|
||||||
|
isOk: Boolean(debugApiHealth?.status === 'ok'),
|
||||||
|
},
|
||||||
|
apiConnection: {
|
||||||
|
isEnabled: true,
|
||||||
|
isOk: apiHealth,
|
||||||
|
},
|
||||||
|
topology: {
|
||||||
|
isEnabled: Boolean(nodeInfo && [BeeModes.FULL, BeeModes.LIGHT, BeeModes.ULTRA_LIGHT].includes(nodeInfo.beeMode)),
|
||||||
|
isOk: Boolean(topology?.connected && topology?.connected > 0),
|
||||||
|
},
|
||||||
|
chequebook: {
|
||||||
|
isEnabled: Boolean(nodeInfo && [BeeModes.FULL, BeeModes.LIGHT].includes(nodeInfo.beeMode)),
|
||||||
|
isOk:
|
||||||
|
Boolean(chequebookAddress?.chequebookAddress) &&
|
||||||
chequebookBalance !== null &&
|
chequebookBalance !== null &&
|
||||||
chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0)) ||
|
chequebookBalance?.totalBalance.toBigNumber.isGreaterThan(0),
|
||||||
devMode,
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return { ...status, all: !error && Object.values(status).every(v => v) }
|
return {
|
||||||
|
...status,
|
||||||
|
all: !error && Object.values(status).every(({ isEnabled, isOk }) => !isEnabled || (isEnabled && isOk)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Provider({ children }: Props): ReactElement {
|
export function Provider({ children }: Props): ReactElement {
|
||||||
@@ -139,7 +161,7 @@ export function Provider({ children }: Props): ReactElement {
|
|||||||
const [apiHealth, setApiHealth] = useState<boolean>(false)
|
const [apiHealth, setApiHealth] = useState<boolean>(false)
|
||||||
const [debugApiHealth, setDebugApiHealth] = useState<Health | null>(null)
|
const [debugApiHealth, setDebugApiHealth] = useState<Health | null>(null)
|
||||||
const [nodeAddresses, setNodeAddresses] = useState<NodeAddresses | null>(null)
|
const [nodeAddresses, setNodeAddresses] = useState<NodeAddresses | null>(null)
|
||||||
const [nodeInfo, setNodeInfo] = useState<NodesInfo | null>(null)
|
const [nodeInfo, setNodeInfo] = useState<NodeInfo | null>(null)
|
||||||
const [topology, setNodeTopology] = useState<Topology | null>(null)
|
const [topology, setNodeTopology] = useState<Topology | null>(null)
|
||||||
const [chequebookAddress, setChequebookAddress] = useState<ChequebookAddressResponse | null>(null)
|
const [chequebookAddress, setChequebookAddress] = useState<ChequebookAddressResponse | null>(null)
|
||||||
const [peers, setPeers] = useState<Peer[] | null>(null)
|
const [peers, setPeers] = useState<Peer[] | null>(null)
|
||||||
|
|||||||
Reference in New Issue
Block a user