import { useState, useEffect } from 'react' import { NodeAddresses, ChequebookAddressResponse, LastChequesResponse, Health, Peer, Topology, LastChequesForPeerResponse, } from '@ethersphere/bee-js' import { beeDebugApi, beeApi } from '../services/bee' import axios from 'axios' import { Token } from '../models/Token' export interface HealthHook { health: boolean isLoadingHealth: boolean error: Error | null } export const useApiHealth = (): HealthHook => { const [health, setHealth] = useState(false) const [isLoadingHealth, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeApi.status .health() .then(res => { setHealth(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { health, isLoadingHealth, error } } export interface DebugHealthHook { nodeHealth: Health | null isLoadingNodeHealth: boolean error: Error | null } export const useDebugApiHealth = (): DebugHealthHook => { const [nodeHealth, setNodeHealth] = useState(null) const [isLoadingNodeHealth, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.status .nodeHealth() .then(res => { setNodeHealth(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { nodeHealth, isLoadingNodeHealth, error } } export interface NodeAddressesHook { nodeAddresses: NodeAddresses | null isLoadingNodeAddresses: boolean error: Error | null } export const useApiNodeAddresses = (): NodeAddressesHook => { const [nodeAddresses, setNodeAddresses] = useState(null) const [isLoadingNodeAddresses, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.connectivity .addresses() .then(res => { setNodeAddresses(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { nodeAddresses, isLoadingNodeAddresses, error } } export interface NodeTopologyHook { topology: Topology | null isLoading: boolean error: Error | null } export const useApiNodeTopology = (): NodeTopologyHook => { const [topology, setNodeTopology] = useState(null) const [isLoading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.connectivity .topology() .then(res => { setNodeTopology(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { topology, isLoading, error } } export interface ChequebookAddressHook { chequebookAddress: ChequebookAddressResponse | null isLoadingChequebookAddress: boolean error: Error | null } export const useApiChequebookAddress = (): ChequebookAddressHook => { const [chequebookAddress, setChequebookAddress] = useState(null) const [isLoadingChequebookAddress, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.chequebook .address() .then(res => { setChequebookAddress(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { chequebookAddress, isLoadingChequebookAddress, error } } export interface NodePeersHook { peers: Peer[] | null isLoading: boolean error: Error | null } export const useApiNodePeers = (): NodePeersHook => { const [peers, setPeers] = useState(null) const [isLoading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.connectivity .listPeers() .then(res => { setPeers(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { peers, isLoading, error } } export interface ChequebookBalance { totalBalance: Token availableBalance: Token } export interface ChequebookBalanceHook { chequebookBalance: ChequebookBalance | null isLoadingChequebookBalance: boolean error: Error | null } export const useApiChequebookBalance = (): ChequebookBalanceHook => { const [chequebookBalance, setChequebookBalance] = useState(null) const [isLoadingChequebookBalance, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.chequebook .balance() .then(({ totalBalance, availableBalance }) => { const balance = { totalBalance: new Token(totalBalance), availableBalance: new Token(availableBalance), } setChequebookBalance(balance) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { chequebookBalance, isLoadingChequebookBalance, error } } export interface Balance { peer: string balance: Token } export interface PeerBalanceHook { peerBalances: Balance[] | null isLoadingPeerBalances: boolean error: Error | null } export const useApiPeerBalances = (): PeerBalanceHook => { const [peerBalances, setPeerBalances] = useState(null) const [isLoadingPeerBalances, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.balance .balances() .then(res => { // for some reason sometimes these are numbers and not BigInts const balances = res.balances.map(({ peer, balance }) => ({ peer, balance: new Token(balance) })) setPeerBalances(balances) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { peerBalances, isLoadingPeerBalances, error } } export interface PeerChequesHook { peerCheques: LastChequesResponse | null isLoadingPeerCheques: boolean error: Error | null } export const useApiPeerCheques = (): PeerChequesHook => { const [peerCheques, setPeerCheques] = useState(null) const [isLoadingPeerCheques, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.chequebook .getLastCheques() .then(res => { setPeerCheques(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { peerCheques, isLoadingPeerCheques, error } } export interface PeerLastChequesHook { peerCheque: LastChequesForPeerResponse | null isLoadingPeerCheque: boolean error: Error | null } export const useApiPeerLastCheque = (peerId: string): PeerLastChequesHook => { const [peerCheque, setPeerCheque] = useState(null) const [isLoadingPeerCheque, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.chequebook .getPeerLastCheques(peerId) .then(res => { setPeerCheque(res) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, [peerId]) return { peerCheque, isLoadingPeerCheque, error } } export interface Settlement { peer: string received: Token sent: Token } export interface Settlements { totalReceived: Token totalSent: Token settlements: Settlement[] } export interface SettlementsHook { settlements: Settlements | null isLoadingSettlements: boolean error: Error | null } export const useApiSettlements = (): SettlementsHook => { const [settlements, setSettlements] = useState(null) const [isLoadingSettlements, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.settlements .getSettlements() .then(({ totalReceived, settlements, totalSent }) => { const set = { totalReceived: new Token(totalReceived), totalSent: new Token(totalSent), settlements: settlements.map(({ peer, received, sent }) => ({ peer, received: new Token(received), sent: new Token(sent), })), } setSettlements(set) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { settlements, isLoadingSettlements, error } } export interface LastCashout { peer: string uncashedAmount: Token } export interface PeerLastCashoutHook { peerCashout: LastCashout | null isLoadingPeerCashout: boolean error: Error | null } export const useApiPeerLastCashout = (peerId: string): PeerLastCashoutHook => { const [peerCashout, setPeerCashout] = useState(null) const [isLoadingPeerCashout, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) beeDebugApi.chequebook .getPeerLastCashout(peerId) .then(({ peer, uncashedAmount }) => { setPeerCashout({ peer, uncashedAmount: new Token(uncashedAmount.toString()) }) }) .catch(error => { setError(error) }) .finally(() => { setLoading(false) }) }, [peerId]) return { peerCashout, isLoadingPeerCashout, error } } export interface LatestBeeReleaseHook { latestBeeRelease: LatestBeeRelease | null isLoadingLatestBeeRelease: boolean error: Error | null } export const useLatestBeeRelease = (): LatestBeeReleaseHook => { const [latestBeeRelease, setLatestBeeRelease] = useState(null) const [isLoadingLatestBeeRelease, setLoading] = useState(false) const [error, setError] = useState(null) useEffect(() => { axios .get(`${process.env.REACT_APP_BEE_GITHUB_REPO_URL}/releases/latest`) .then(res => { setLatestBeeRelease(res.data) }) .catch((error: Error) => { setError(error) }) .finally(() => { setLoading(false) }) }, []) return { latestBeeRelease, isLoadingLatestBeeRelease, error } }