ipfs/src/hooks/use-ipfs-api.tsx

60 lines
1.3 KiB
TypeScript
Raw Normal View History

2019-10-18 11:32:36 +02:00
import { useEffect, useState } from 'react'
import ipfsClient from 'ipfs-http-client'
import { parseHTML } from '../utils'
2019-10-18 11:32:36 +02:00
let ipfs: any = null
let ipfsVersion = ''
export interface IpfsConfig {
protocol: string
host: string
port: string
}
export default function useIpfsApi(config: IpfsConfig) {
const [isIpfsReady, setIpfsReady] = useState(Boolean(ipfs))
const [ipfsError, setIpfsError] = useState('')
2019-10-18 15:31:24 +02:00
useEffect(() => {
async function initIpfs() {
if (ipfs !== null) return
// eslint-disable-next-line
ipfs = await ipfsClient(config)
try {
const version = await ipfs.version()
ipfsVersion = version.version
} catch (error) {
2019-10-18 19:12:49 +02:00
let { message } = error
if (!error.status) {
const htmlData = parseHTML(error)
message = htmlData.item(0)
message = message.textContent
}
setIpfsError(`IPFS connection error: ${message}`)
setIpfsReady(false)
2019-10-18 15:31:24 +02:00
return
}
setIpfsReady(Boolean(await ipfs.id()))
2019-10-18 11:32:36 +02:00
}
initIpfs()
}, [config])
useEffect(() => {
// just like componentWillUnmount()
return function cleanup() {
if (ipfs) {
setIpfsReady(false)
ipfs = null
ipfsVersion = ''
setIpfsError('')
}
}
}, [])
return { ipfs, ipfsVersion, isIpfsReady, ipfsError }
}