1
0
mirror of https://github.com/oceanprotocol/react.git synced 2024-06-10 19:30:22 +02:00
react/src/providers/OceanProvider/OceanProvider.tsx

120 lines
3.4 KiB
TypeScript
Raw Normal View History

2020-05-11 13:47:21 +02:00
import React, { useContext, useState, useEffect, createContext } from 'react'
2020-04-27 10:34:22 +02:00
import { Ocean, Config, Account, Aquarius, Logger } from '@oceanprotocol/squid'
2020-04-27 16:29:34 +02:00
import Web3 from 'web3'
2020-04-25 02:28:16 +02:00
import Balance from '@oceanprotocol/squid/dist/node/models/Balance'
2020-04-27 10:34:22 +02:00
import { connectOcean } from './utils'
2020-05-11 17:38:45 +02:00
import { useWeb3, InjectedProviderStatus } from '../Web3Provider'
2020-06-05 16:01:22 +02:00
import OceanConnectionStatus from './OceanConnectionStatus'
2020-04-25 02:28:16 +02:00
interface OceanProviderValue {
2020-04-27 10:34:22 +02:00
aquarius: Aquarius
2020-04-25 02:28:16 +02:00
ocean: Ocean
2020-04-27 10:34:22 +02:00
account: Account
accountId: string
2020-04-25 02:28:16 +02:00
balance: Balance
2020-05-11 13:47:21 +02:00
balanceInOcean: string
2020-04-25 02:28:16 +02:00
status: OceanConnectionStatus
2020-04-27 14:37:26 +02:00
config: Config
2020-04-25 02:28:16 +02:00
}
const OceanContext = createContext(null)
function OceanProvider({
config,
children
}: {
config: Config
2020-05-07 13:42:29 +02:00
children: any
}): any {
2020-04-25 02:28:16 +02:00
const [ocean, setOcean] = useState<Ocean | undefined>()
2020-04-27 10:34:22 +02:00
const [aquarius, setAquarius] = useState<Aquarius | undefined>()
const [account, setAccount] = useState<Account | undefined>()
const [accountId, setAccountId] = useState<string | undefined>()
2020-04-25 02:28:16 +02:00
const [balance, setBalance] = useState<Balance | undefined>()
2020-05-11 13:47:21 +02:00
const [balanceInOcean, setBalanceInOcean] = useState<string | undefined>()
2020-04-25 02:28:16 +02:00
const [status, setStatus] = useState<OceanConnectionStatus>(
OceanConnectionStatus.NOT_CONNECTED
)
2020-05-11 17:43:02 +02:00
const { web3, ethProviderStatus } = useWeb3()
2020-04-25 02:28:16 +02:00
2020-04-27 14:58:37 +02:00
// -------------------------------------------------------------
// 1. On mount, connect to Aquarius instance right away
// -------------------------------------------------------------
2020-04-27 10:34:22 +02:00
useEffect(() => {
const aquarius = new Aquarius(config.aquariusUri, Logger)
setAquarius(aquarius)
}, [])
2020-04-27 14:58:37 +02:00
// -------------------------------------------------------------
// 2. Once `web3` becomes available, connect to the whole network
// -------------------------------------------------------------
2020-04-25 02:28:16 +02:00
useEffect(() => {
2020-05-11 17:43:02 +02:00
if (!web3 || ethProviderStatus !== InjectedProviderStatus.CONNECTED) return
2020-04-25 02:28:16 +02:00
async function init(): Promise<void> {
2020-04-27 10:34:22 +02:00
const { ocean, account, accountId, balance } = await connectOcean(
web3,
config
)
setOcean(ocean)
2020-04-25 02:28:16 +02:00
setStatus(OceanConnectionStatus.CONNECTED)
2020-04-27 10:34:22 +02:00
setAccount(account)
setAccountId(accountId)
2020-04-25 02:28:16 +02:00
setBalance(balance)
2020-05-11 13:47:21 +02:00
setBalanceInOcean(`${balance?.ocn}`)
2020-04-25 02:28:16 +02:00
}
try {
init()
} catch (error) {
console.error(error.message)
setStatus(OceanConnectionStatus.OCEAN_CONNECTION_ERROR)
throw error.message
}
}, [web3])
2020-04-27 14:58:37 +02:00
// -------------------------------------------------------------
// 3. Once `ocean` becomes available, spit out some info about it
// -------------------------------------------------------------
2020-04-25 02:28:16 +02:00
useEffect(() => {
async function debug(): Promise<void> {
if (!ocean) return
2020-04-27 16:29:34 +02:00
Logger.debug(
2020-04-25 02:28:16 +02:00
`Ocean instance initiated with:\n ${JSON.stringify(config, null, 2)}`
)
2020-04-27 16:29:34 +02:00
Logger.debug(await ocean.versions.get())
2020-04-25 02:28:16 +02:00
}
debug()
}, [ocean])
return (
<OceanContext.Provider
2020-04-27 10:34:22 +02:00
value={
{
ocean,
aquarius,
account,
accountId,
balance,
2020-05-11 13:47:21 +02:00
balanceInOcean,
2020-04-27 14:37:26 +02:00
status,
config
2020-04-27 10:34:22 +02:00
} as OceanProviderValue
}
2020-04-25 02:28:16 +02:00
>
{children}
</OceanContext.Provider>
)
}
2020-04-27 14:58:37 +02:00
// Helper hook to access the provider values
const useOcean = (): OceanProviderValue => useContext(OceanContext)
2020-04-25 02:28:16 +02:00
export {
OceanProvider,
useOcean,
OceanProviderValue,
Config
}
export default OceanProvider