From c56ac7cf742b177da4514267505795e6faa95322 Mon Sep 17 00:00:00 2001 From: Esteban Abaroa Date: Thu, 8 Jun 2023 23:27:34 +0000 Subject: [PATCH] fix state strings new api --- src/hooks/useFeedStateString.js | 121 ++++++++++++++++-------------- src/hooks/useStateString.js | 127 +++++++++++++++++--------------- 2 files changed, 134 insertions(+), 114 deletions(-) diff --git a/src/hooks/useFeedStateString.js b/src/hooks/useFeedStateString.js index 62860894..18411c9a 100644 --- a/src/hooks/useFeedStateString.js +++ b/src/hooks/useFeedStateString.js @@ -1,64 +1,77 @@ import { useMemo } from "react" const useFeedStateString = (subplebbits) => { - return useMemo(() => { - const getClientUrls = (regex) => { - const clientUrls = new Set() - for (const clientType in subplebbits.clients) { - for (const clientUrl in subplebbits.clients[clientType]) { - const client = subplebbits.clients[clientType][clientUrl] - if (client.state.match(regex)) { - clientUrls.add(clientUrl) - } + return useMemo(() => { + const getClientHost = (clientUrl) => { + try { + clientUrl = new URL(clientUrl).hostname || clientUrl + } + catch (e) {} + return clientUrl } - } - return [...clientUrls] - } - - if (!subplebbits) { - return undefined; - } - - const states = {} - for (const subplebbit of subplebbits) { - states[subplebbit?.updatingState] = (states[subplebbit?.updatingState] || 0) + 1 - } - - // e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io - let stateString = '' - if (states['resolving-address']) { - stateString += `resolving ${states['resolving-address']} addresses` - const clientUrls = getClientUrls(/address/) - if (clientUrls.length) { - stateString += ` from ${clientUrls.join(', ')}` - } - } - if (states['fetching-ipns'] || states['fetching-ipfs']) { - if (stateString) { - stateString += ', ' - } - stateString += `fetching ` - if (states['fetching-ipns']) { - stateString += `${states['fetching-ipns']} IPNS` - } - if (states['fetching-ipfs']) { - if (states['fetching-ipns']) { - stateString += ', ' + const getClientUrls = (regex) => { + const clientUrls = new Set() + const addClientUrl = (client, clientUrl) => client?.state?.match?.(regex) && clientUrls.add(getClientHost(clientUrl)) + for (const subplebbit of subplebbits) { + for (const clientUrl in subplebbit?.clients?.ipfsGateways) { + addClientUrl(subplebbit.clients.ipfsGateways[clientUrl], clientUrl) + } + for (const clientUrl in subplebbit?.clients?.ipfsClients) { + addClientUrl(subplebbit.clients.ipfsClients[clientUrl], clientUrl) + } + for (const chainTicker in subplebbit?.clients?.chainProviders) { + for (const clientUrl in subplebbit.clients.chainProviders[chainTicker]) { + addClientUrl(subplebbit.clients.chainProviders[chainTicker][clientUrl], clientUrl) + } + } + } + return [...clientUrls] } - stateString += `${states['fetching-ipfs']} IPNS` - } - const clientUrls = getClientUrls(/ipfs|ipns/) - if (clientUrls.length) { - stateString += ` from ${clientUrls.join(', ')}` - } - } - // capitalize first letter - stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1) + if (!subplebbits) { + return undefined; + } - // if string is empty, return undefined instead - return stateString || undefined - }, [subplebbits]) + const states = {} + for (const subplebbit of subplebbits) { + states[subplebbit?.updatingState] = (states[subplebbit?.updatingState] || 0) + 1 + } + + // e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io + let stateString = '' + if (states['resolving-address']) { + stateString += `resolving ${states['resolving-address']} addresses` + const clientUrls = getClientUrls(/address/) + if (clientUrls.length) { + stateString += ` from ${clientUrls.join(', ')}` + } + } + if (states['fetching-ipns'] || states['fetching-ipfs']) { + if (stateString) { + stateString += ', ' + } + stateString += `fetching ` + if (states['fetching-ipns']) { + stateString += `${states['fetching-ipns']} IPNS` + } + if (states['fetching-ipfs']) { + if (states['fetching-ipns']) { + stateString += ', ' + } + stateString += `${states['fetching-ipfs']} IPNS` + } + const clientUrls = getClientUrls(/ipfs|ipns/) + if (clientUrls.length) { + stateString += ` from ${clientUrls.join(', ')}` + } + } + + // capitalize first letter + stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1) + + // if string is empty, return undefined instead + return stateString || undefined + }, [subplebbits]) } export default useFeedStateString \ No newline at end of file diff --git a/src/hooks/useStateString.js b/src/hooks/useStateString.js index 31a74278..57bd2b17 100644 --- a/src/hooks/useStateString.js +++ b/src/hooks/useStateString.js @@ -1,76 +1,83 @@ import { useMemo } from 'react' const useStateString = (commentOrSubplebbit) => { - return useMemo(() => { - if (!commentOrSubplebbit?.clients) { - return - } - const clients = commentOrSubplebbit?.clients - - const states = {} - for (const clientType in clients) { - for (const clientUrl in clients[clientType]) { - const state = clients[clientType][clientUrl].state - if (state === 'stopped') { - continue + return useMemo(() => { + if (!commentOrSubplebbit?.clients) { + return } - if (!states[state]) { - states[state] = [] + 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) + } } - states[state].push(clientUrl) - } - } - const getClientHost = (clientUrl) => { - try { - return new URL(clientUrl).hostname || clientUrl - } - catch (e) { - return clientUrl - } - } + const getClientHost = (clientUrl) => { + try { + clientUrl = new URL(clientUrl).hostname || clientUrl + } + catch (e) {} + return clientUrl + } - let stateString = '' - for (const state in states) { - const clientUrls = states[state] - const clientHosts = clientUrls.map(clientUrl => getClientHost(clientUrl)) + let stateString = '' + for (const state in states) { + const clientUrls = states[state] + const clientHosts = clientUrls.map(clientUrl => getClientHost(clientUrl)) - // if there are no valid hosts, skip this state - if (clientHosts.length === 0) { - continue - } + // if there are no valid hosts, skip this state + if (clientHosts.length === 0) { + continue + } - // separate 2 different states using ', ' - if (stateString) { - stateString += ', ' - } + // separate 2 different states using ', ' + if (stateString) { + stateString += ', ' + } - // 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(', ')}` - } + // 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(', ')}` + } - // 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') - } - } + // 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') + } + } - // capitalize first letter - if (stateString) { - stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1) - } + // capitalize first letter + if (stateString) { + stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1) + } - // if string is empty, return undefined instead - return stateString === '' ? undefined : stateString - }, [commentOrSubplebbit]) + // if string is empty, return undefined instead + return stateString === '' ? undefined : stateString + }, [commentOrSubplebbit]) } export default useStateString \ No newline at end of file