Files
5chan/src/hooks/useStateString.js
T

83 lines
2.9 KiB
JavaScript
Raw Normal View History

import { useMemo } from 'react'
2023-05-15 04:44:33 +00:00
const useStateString = (commentOrSubplebbit) => {
2023-06-08 23:27:34 +00:00
return useMemo(() => {
if (!commentOrSubplebbit?.clients) {
return
}
2023-06-08 23:27:34 +00:00
const clients = commentOrSubplebbit?.clients
const states = {}
const addState = (state, clientUrl) => {
if (!state || state === 'stopped') {
return
}
if (!states[state]) {
states[state] = []
}
states[state].push(clientUrl)
}
for (const clientUrl in clients?.ipfsGateways) {
addState(clients.ipfsGateways[clientUrl]?.state, clientUrl)
}
for (const clientUrl in clients?.ipfsClients) {
addState(clients.ipfsClients[clientUrl]?.state, clientUrl)
}
for (const chainTicker in clients?.chainProviders) {
for (const clientUrl in clients.chainProviders[chainTicker]) {
addState(clients.chainProviders[chainTicker][clientUrl]?.state, clientUrl)
}
}
2023-06-08 23:27:34 +00:00
const getClientHost = (clientUrl) => {
try {
clientUrl = new URL(clientUrl).hostname || clientUrl
}
catch (e) {}
return clientUrl
}
2023-05-10 23:13:24 +00:00
2023-06-08 23:27:34 +00:00
let stateString = ''
for (const state in states) {
const clientUrls = states[state]
const clientHosts = clientUrls.map(clientUrl => getClientHost(clientUrl))
2023-05-09 21:20:30 +02:00
2023-06-08 23:27:34 +00:00
// if there are no valid hosts, skip this state
if (clientHosts.length === 0) {
continue
}
2023-06-08 23:27:34 +00:00
// separate 2 different states using ', '
if (stateString) {
stateString += ', '
}
2023-06-08 23:27:34 +00:00
// e.g. 'fetching IPFS from cloudflare-ipfs.com, ipfs.io'
const formattedState = state.replaceAll('-', ' ').replace('ipfs', 'IPFS').replace('ipns', 'IPNS')
stateString += `${formattedState} from ${clientHosts.join(', ')}`
}
2023-06-08 23:27:34 +00:00
// fallback to comment or subplebbit state when possible
if (!stateString) {
if (commentOrSubplebbit?.publishingState !== 'stopped') {
stateString = commentOrSubplebbit.publishingState
}
else if (commentOrSubplebbit?.updatingState !== 'stopped') {
stateString = commentOrSubplebbit.updatingState
}
if (stateString) {
stateString = stateString.replaceAll('-', ' ').replace('ipfs', 'IPFS').replace('ipns', 'IPNS')
}
}
2023-05-15 04:44:33 +00:00
2023-06-08 23:27:34 +00:00
// capitalize first letter
if (stateString) {
stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1)
}
2023-06-08 23:27:34 +00:00
// if string is empty, return undefined instead
return stateString === '' ? undefined : stateString
}, [commentOrSubplebbit])
}
export default useStateString