2020-04-25 02:28:16 +02:00
|
|
|
import React, {
|
|
|
|
ReactNode,
|
|
|
|
useContext,
|
|
|
|
useState,
|
|
|
|
useEffect,
|
2020-04-25 15:38:21 +02:00
|
|
|
createContext
|
2020-04-25 02:28:16 +02:00
|
|
|
} from 'react'
|
2020-04-27 10:34:22 +02:00
|
|
|
import { Ocean, Config, Account, Aquarius, Logger } from '@oceanprotocol/squid'
|
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-04-25 02:28:16 +02:00
|
|
|
|
|
|
|
enum OceanConnectionStatus {
|
|
|
|
OCEAN_CONNECTION_ERROR = -1,
|
|
|
|
NOT_CONNECTED = 0,
|
|
|
|
CONNECTED = 1
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
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
|
|
|
|
children: ReactNode
|
|
|
|
}): ReactNode {
|
|
|
|
// TODO: handle web3
|
|
|
|
const { web3 } = useWeb3()
|
|
|
|
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>()
|
|
|
|
const [status, setStatus] = useState<OceanConnectionStatus>(
|
|
|
|
OceanConnectionStatus.NOT_CONNECTED
|
|
|
|
)
|
|
|
|
|
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(() => {
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
console.debug(
|
|
|
|
`Ocean instance initiated with:\n ${JSON.stringify(config, null, 2)}`
|
|
|
|
)
|
|
|
|
console.debug(await ocean.versions.get())
|
|
|
|
}
|
|
|
|
debug()
|
|
|
|
}, [ocean])
|
|
|
|
|
|
|
|
return (
|
|
|
|
<OceanContext.Provider
|
2020-04-27 10:34:22 +02:00
|
|
|
value={
|
|
|
|
{
|
|
|
|
ocean,
|
|
|
|
aquarius,
|
|
|
|
account,
|
|
|
|
accountId,
|
|
|
|
balance,
|
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,
|
|
|
|
OceanConnectionStatus,
|
|
|
|
Config
|
|
|
|
}
|
|
|
|
export default OceanProvider
|