2021-03-17 11:44:26 +01:00
|
|
|
import React, {
|
|
|
|
useContext,
|
|
|
|
useState,
|
|
|
|
createContext,
|
|
|
|
ReactElement,
|
|
|
|
useCallback,
|
|
|
|
ReactNode,
|
|
|
|
useEffect
|
|
|
|
} from 'react'
|
2021-07-26 15:53:21 +02:00
|
|
|
import { Ocean, Logger, Account, ConfigHelperConfig } from '@oceanprotocol/lib'
|
2021-03-17 11:44:26 +01:00
|
|
|
import { useWeb3 } from './Web3'
|
2021-10-13 18:48:59 +02:00
|
|
|
import { getDevelopmentConfig, getOceanConfig } from '@utils/ocean'
|
2021-05-31 14:27:04 +02:00
|
|
|
import { useAsset } from './Asset'
|
2021-03-17 11:44:26 +01:00
|
|
|
|
|
|
|
interface OceanProviderValue {
|
|
|
|
ocean: Ocean
|
|
|
|
account: Account
|
2021-06-09 13:16:55 +02:00
|
|
|
config: ConfigHelperConfig
|
|
|
|
connect: (config: ConfigHelperConfig) => Promise<void>
|
2021-03-17 11:44:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const OceanContext = createContext({} as OceanProviderValue)
|
|
|
|
|
2021-05-28 14:47:47 +02:00
|
|
|
function OceanProvider({ children }: { children: ReactNode }): ReactElement {
|
2021-05-31 14:27:04 +02:00
|
|
|
const { web3, accountId } = useWeb3()
|
|
|
|
const { ddo } = useAsset()
|
2021-05-28 14:47:47 +02:00
|
|
|
|
2021-03-17 11:44:26 +01:00
|
|
|
const [ocean, setOcean] = useState<Ocean>()
|
|
|
|
const [account, setAccount] = useState<Account>()
|
2021-06-09 13:16:55 +02:00
|
|
|
const [config, setConfig] = useState<ConfigHelperConfig>()
|
2021-05-28 14:47:47 +02:00
|
|
|
|
|
|
|
// -----------------------------------
|
2021-05-31 14:27:04 +02:00
|
|
|
// Helper: Create Ocean instance
|
2021-03-17 11:44:26 +01:00
|
|
|
// -----------------------------------
|
|
|
|
const connect = useCallback(
|
2021-06-09 13:16:55 +02:00
|
|
|
async (config: ConfigHelperConfig) => {
|
2021-07-23 14:46:25 +02:00
|
|
|
if (!web3) return
|
2021-05-28 14:47:47 +02:00
|
|
|
|
2021-06-09 13:16:55 +02:00
|
|
|
const newConfig: ConfigHelperConfig = {
|
2021-05-31 14:27:04 +02:00
|
|
|
...config,
|
|
|
|
web3Provider: web3
|
|
|
|
}
|
2021-05-28 14:47:47 +02:00
|
|
|
|
2021-05-31 14:27:04 +02:00
|
|
|
try {
|
|
|
|
Logger.log('[ocean] Connecting Ocean...', newConfig)
|
|
|
|
const newOcean = await Ocean.getInstance(newConfig)
|
2021-05-28 14:47:47 +02:00
|
|
|
setOcean(newOcean)
|
2021-06-04 15:50:24 +02:00
|
|
|
setConfig(newConfig)
|
2021-05-28 14:47:47 +02:00
|
|
|
Logger.log('[ocean] Ocean instance created.', newOcean)
|
2021-03-17 11:44:26 +01:00
|
|
|
} catch (error) {
|
|
|
|
Logger.error('[ocean] Error: ', error.message)
|
|
|
|
}
|
|
|
|
},
|
2021-07-23 14:46:25 +02:00
|
|
|
[web3]
|
2021-03-17 11:44:26 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// -----------------------------------
|
2021-07-30 15:52:12 +02:00
|
|
|
// Initial asset details connection
|
2021-03-17 11:44:26 +01:00
|
|
|
// -----------------------------------
|
|
|
|
useEffect(() => {
|
2021-07-07 08:45:20 +02:00
|
|
|
if (!ddo?.chainId) return
|
2021-05-31 14:27:04 +02:00
|
|
|
|
2021-05-28 14:47:47 +02:00
|
|
|
const config = {
|
2021-07-07 08:45:20 +02:00
|
|
|
...getOceanConfig(ddo?.chainId),
|
2021-05-28 14:47:47 +02:00
|
|
|
|
|
|
|
// add local dev values
|
2021-07-07 08:45:20 +02:00
|
|
|
...(ddo?.chainId === 8996 && {
|
2021-05-28 14:47:47 +02:00
|
|
|
...getDevelopmentConfig()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-03-17 11:44:26 +01:00
|
|
|
async function init() {
|
2021-05-28 14:47:47 +02:00
|
|
|
await connect(config)
|
2021-03-17 11:44:26 +01:00
|
|
|
}
|
|
|
|
init()
|
2021-06-11 15:35:28 +02:00
|
|
|
}, [connect, ddo])
|
2021-03-17 11:44:26 +01:00
|
|
|
|
|
|
|
// -----------------------------------
|
|
|
|
// Get user info, handle account change from web3
|
|
|
|
// -----------------------------------
|
2021-05-31 14:27:04 +02:00
|
|
|
useEffect(() => {
|
|
|
|
if (!ocean || !accountId || !web3) return
|
2021-03-17 11:44:26 +01:00
|
|
|
|
2021-05-31 14:27:04 +02:00
|
|
|
async function getInfo() {
|
|
|
|
const account = (await ocean.accounts.list())[0]
|
|
|
|
Logger.log('[ocean] Account: ', account)
|
|
|
|
setAccount(account)
|
|
|
|
}
|
|
|
|
getInfo()
|
|
|
|
}, [ocean, accountId, web3])
|
2021-03-17 11:44:26 +01:00
|
|
|
|
|
|
|
return (
|
|
|
|
<OceanContext.Provider
|
|
|
|
value={
|
|
|
|
{
|
|
|
|
ocean,
|
|
|
|
account,
|
2021-06-04 15:50:24 +02:00
|
|
|
connect,
|
|
|
|
config
|
2021-05-28 14:47:47 +02:00
|
|
|
// refreshBalance
|
2021-03-17 11:44:26 +01:00
|
|
|
} as OceanProviderValue
|
|
|
|
}
|
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</OceanContext.Provider>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper hook to access the provider values
|
|
|
|
const useOcean = (): OceanProviderValue => useContext(OceanContext)
|
|
|
|
|
2021-10-27 12:27:14 +02:00
|
|
|
export { OceanProvider, useOcean, OceanContext }
|
2021-03-17 11:44:26 +01:00
|
|
|
export default OceanProvider
|