ipfs/src/components/Status.tsx

48 lines
1.2 KiB
TypeScript
Raw Permalink Normal View History

2021-09-12 16:41:30 +02:00
import React, { useState, useEffect, ReactElement, useCallback } from 'react'
2019-10-20 01:40:55 +02:00
import { pingUrl } from '../utils'
import { ipfsGateway, ipfsNodeUri } from '../../site.config'
import styles from './Status.module.css'
2020-07-08 01:30:27 +02:00
export default function Status({ type }: { type: string }): ReactElement {
2019-10-20 01:40:55 +02:00
const [isOnline, setIsOnline] = useState(false)
const [isLoading, setIsLoading] = useState(true)
2021-09-12 16:41:30 +02:00
const ping = useCallback(async () => {
2019-10-20 01:40:55 +02:00
const url =
type === 'gateway'
? `${ipfsGateway}/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme`
2021-09-14 15:44:12 +02:00
: `${ipfsNodeUri}/api/v0/version`
const method = type === 'gateway' ? 'get' : 'post'
const ping = await pingUrl(url, method)
2019-10-20 01:40:55 +02:00
setIsLoading(false)
2021-09-12 16:41:30 +02:00
setIsOnline(ping)
}, [type])
2019-10-20 01:40:55 +02:00
useEffect(() => {
ping()
const timer = setInterval(() => {
ping()
}, 10000) // run every 10 sec.
return () => {
clearInterval(timer)
setIsOnline(false)
setIsLoading(false)
}
2021-09-12 16:41:30 +02:00
}, [ping])
2019-10-20 01:40:55 +02:00
const classes = isLoading
? styles.loading
: isOnline
? styles.online
: styles.status
return (
<span
className={classes}
title={isLoading ? 'Checking...' : isOnline ? 'Online' : 'Offline'}
/>
)
}