Skip to content

Commit cc31b44

Browse files
authored
Supported Networks: “Subgraph Studio” => “Hosted” + add provider tooltip (#1012)
* Update dependencies * Supported Networks: “Subgraph Studio” => “Hosted” + add provider tooltip + refactoring
1 parent ceda510 commit cc31b44

File tree

7 files changed

+442
-416
lines changed

7 files changed

+442
-416
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
},
2222
"devDependencies": {
2323
"@edgeandnode/eslint-config": "^2.0.3",
24-
"@types/node": "^22.16.2",
24+
"@types/node": "^22.16.4",
2525
"eslint": "^8.57.1",
2626
"eslint-plugin-mdx": "^3.6.2",
2727
"prettier": "^3.6.2",

pnpm-lock.yaml

Lines changed: 352 additions & 352 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@
1919
"dependencies": {
2020
"@docsearch/react": "^3.9.0",
2121
"@edgeandnode/common": "^7.0.4",
22-
"@edgeandnode/gds": "^6.7.0",
23-
"@edgeandnode/go": "^10.3.0",
22+
"@edgeandnode/gds": "^6.7.1",
23+
"@edgeandnode/go": "^10.3.1",
2424
"@emotion/react": "^11.14.0",
2525
"@graphprotocol/contracts": "^7.3.0",
2626
"@pinax/graph-networks-registry": "^0.7.1",
2727
"@react-hookz/web": "^25.1.1",
2828
"@readme/httpsnippet": "^11.0.0",
29-
"@readme/openapi-parser": "^4.1.0",
29+
"@readme/openapi-parser": "^4.1.1",
3030
"fetch-har": "^11.1.1",
3131
"hast": "^1.0.0",
3232
"hast-util-whitespace": "^3.0.0",
3333
"lodash": "^4.17.21",
3434
"mdast-util-mdx-jsx": "^3.2.0",
3535
"mdast-util-to-hast": "^13.2.0",
3636
"mixpanel-browser": "^2.66.0",
37-
"motion": "^12.23.1",
37+
"motion": "^12.23.6",
3838
"next": "^14.2.30",
3939
"next-seo": "^6.8.0",
4040
"next-sitemap": "^4.2.3",
@@ -55,7 +55,7 @@
5555
"@types/lodash": "^4.17.20",
5656
"@types/mdast": "^4.0.4",
5757
"@types/mixpanel-browser": "^2.60.0",
58-
"@types/node": "^22.16.2",
58+
"@types/node": "^22.16.4",
5959
"@types/react": "^18.3.23",
6060
"@types/react-dom": "^18.3.7",
6161
"@types/vfile": "^4.0.0",

website/src/pages/en/index.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,19 @@
7575
},
7676
"tableLegend": {
7777
"subgraphs": {
78-
"basic": "Subgraph Studio (No issuance)",
78+
"basic": "Hosted (No issuance)",
7979
"full": "The Graph Network (Issuance)"
8080
},
8181
"substreams": {
8282
"basic": "Base",
83-
"full": "Extended (EVM Only)"
83+
"full": "Extended (EVM only)"
8484
},
8585
"firehose": {
8686
"basic": "Base",
87-
"full": "Extended (EVM Only)"
87+
"full": "Extended (EVM only)"
8888
},
8989
"tokenApi": {
90-
"supported": "All endpoints supported"
90+
"full": "All endpoints supported"
9191
},
9292
"icons": {
9393
"checkmark": "Checkmark",

website/src/supportedNetworks/NetworkDetailsPage.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@ import {
1111
nonEvmNoTokenAPICards,
1212
nonEvmWithTokenAPICards,
1313
} from './ResourceCards'
14-
import { getIconVariant, type SupportedNetwork } from './utils'
14+
import { type SupportedNetwork } from './utils'
1515

1616
export default function NetworkDetailsPage({ network }: { network: SupportedNetwork }) {
1717
const { t } = useI18n()
1818
const cards = (() => {
1919
if (network.evm) {
20-
if (network.subgraphs && !network.substreams) {
20+
if (network.subgraphsSupportLevel !== 'none' && network.substreamsSupportLevel === 'none') {
2121
return evmSubgraphsOnlyCards
22-
} else if (network.tokenApi) {
22+
} else if (network.tokenApiSupportLevel !== 'none') {
2323
return evmWithTokenAPICards
2424
} else {
2525
return evmNoTokenAPICards
2626
}
2727
} else {
28-
if (network.tokenApi) {
28+
if (network.tokenApiSupportLevel !== 'none') {
2929
return nonEvmWithTokenAPICards
3030
} else {
3131
return nonEvmNoTokenAPICards
@@ -36,7 +36,7 @@ export default function NetworkDetailsPage({ network }: { network: SupportedNetw
3636
return (
3737
<div className="col-[container]">
3838
<div className="mb-5 mt-12 flex flex-col gap-3">
39-
<NetworkIcon network={network} variant={getIconVariant(network.id)} size={10} />
39+
<NetworkIcon network={network} variant={network.iconVariant} size={10} />
4040
<h2 className="leading-tight mt-0 text-24 text-white">{network.fullName}</h2>
4141
</div>
4242

website/src/supportedNetworks/NetworksTable.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ExperimentalSearch,
1010
ExperimentalToggleChip,
1111
Text,
12+
Tooltip,
1213
useDebounce,
1314
} from '@edgeandnode/gds'
1415
import { Check, Checks, EyeClosed } from '@edgeandnode/gds/icons'
@@ -17,7 +18,7 @@ import { NetworkIcon } from '@edgeandnode/go'
1718
import { Callout, Table } from '@/components'
1819
import { useI18n } from '@/i18n'
1920

20-
import { getIconVariant, type SupportedNetwork } from './utils'
21+
import { type SupportedNetwork } from './utils'
2122

2223
export function NetworksTable({ networks }: { networks: SupportedNetwork[] }) {
2324
const { t } = useI18n()
@@ -109,7 +110,7 @@ export function NetworksTable({ networks }: { networks: SupportedNetwork[] }) {
109110
<span className="text-c10 mb-2 block text-white">Token API</span>
110111
<div className="flex gap-2">
111112
{checkmark}
112-
<span className="text-14">{t('index.supportedNetworks.tableLegend.tokenApi.supported')}</span>
113+
<span className="text-14">{t('index.supportedNetworks.tableLegend.tokenApi.full')}</span>
113114
</div>
114115
</div>
115116
</div>
@@ -182,7 +183,7 @@ export function NetworksTable({ networks }: { networks: SupportedNetwork[] }) {
182183
<div className="static flex items-center justify-between gap-2">
183184
<ButtonOrLink href={`/supported-networks/${network.id}`} className="static outline-none">
184185
<div className="flex items-center gap-3">
185-
<NetworkIcon network={network} variant={getIconVariant(network.id)} size={5} />
186+
<NetworkIcon network={network} variant={network.iconVariant} size={5} />
186187
<div className="flex flex-col">
187188
<span className="text-body-xsmall leading-5 text-white">{network.shortName}</span>
188189
<span className="text-body-xsmall leading-5 text-space-500">{network.id}</span>
@@ -196,11 +197,13 @@ export function NetworksTable({ networks }: { networks: SupportedNetwork[] }) {
196197
</div>
197198
</td>
198199
<td align="center">
199-
{network.subgraphsSupportLevel === 'full'
200-
? checkmarks
201-
: network.subgraphsSupportLevel === 'basic'
202-
? checkmark
203-
: null}
200+
{network.subgraphsSupportLevel === 'full' ? (
201+
checkmarks
202+
) : network.subgraphsSupportLevel === 'basic' ? (
203+
<Tooltip content={network.subgraphsProvider}>
204+
<span className="z-10">{checkmark}</span>
205+
</Tooltip>
206+
) : null}
204207
</td>
205208
<td align="center">
206209
{network.substreamsSupportLevel === 'full'
@@ -216,7 +219,7 @@ export function NetworksTable({ networks }: { networks: SupportedNetwork[] }) {
216219
? checkmark
217220
: null}
218221
</td>
219-
<td align="center">{network.tokenApi ? checkmark : null}</td>
222+
<td align="center">{network.tokenApiSupportLevel === 'full' ? checkmark : null}</td>
220223
</tr>
221224
))}
222225
</tbody>

website/src/supportedNetworks/utils.ts

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type Network, NetworksRegistry } from '@pinax/graph-networks-registry'
22

33
// Networks that should use the "mono" icon variant (TODO: add this feature to web3icons?)
4-
export const MONO_ICON_NETWORKS = [
4+
const MONO_ICON_NETWORKS = [
55
'arweave-mainnet',
66
'autonomys-taurus',
77
'expchain-testnet',
@@ -25,60 +25,83 @@ export const MONO_ICON_NETWORKS = [
2525
'zksync-era-sepolia',
2626
]
2727

28-
export const getIconVariant = (networkId: string): 'mono' | 'branded' => {
29-
return MONO_ICON_NETWORKS.includes(networkId) ? 'mono' : 'branded'
30-
}
31-
32-
// Support level for services
33-
export const getSubgraphsSupportLevel = (network: Network) => {
34-
const hasSubgraphs = Boolean(network.services.subgraphs?.length || network.services.sps?.length)
35-
if (!hasSubgraphs) return 'none'
36-
if (network.issuanceRewards) return 'full'
37-
return 'basic'
38-
}
39-
export const getSubstreamsSupportLevel = (network: Network) => {
40-
const substreamCount = network.services.substreams?.length || 0
41-
if (substreamCount === 0) return 'none'
42-
if (substreamCount >= 2) return 'full'
43-
return 'basic'
44-
}
45-
export const getFirehoseSupportLevel = (network: Network) => {
46-
const firehoseCount = network.services.firehose?.length || 0
47-
if (firehoseCount === 0) return 'none'
48-
if (firehoseCount >= 2) return 'full'
49-
return 'basic'
50-
}
51-
5228
export async function getSupportedNetworks() {
5329
const registry = await NetworksRegistry.fromLatestVersion()
5430
return registry.networks
5531
.flatMap((network) => {
56-
const evm = network.caip2Id.startsWith('eip155:')
57-
const subgraphs = Boolean(network.services.subgraphs?.length)
58-
const substreams = Boolean(network.services.substreams?.length)
59-
const firehose = Boolean(network.services.firehose?.length)
60-
const tokenApi = Boolean(network.services.tokenApi?.length)
61-
if (!subgraphs && !substreams && !firehose && !tokenApi) {
32+
const [subgraphsSupportLevel, subgraphsProvider] = getSubgraphsSupportLevelAndProvider(network)
33+
const substreamsSupportLevel = getSubstreamsSupportLevel(network)
34+
const firehoseSupportLevel = getFirehoseSupportLevel(network)
35+
const tokenApiSupportLevel = getTokenApiSupportLevel(network)
36+
if (
37+
subgraphsSupportLevel === 'none' &&
38+
substreamsSupportLevel === 'none' &&
39+
firehoseSupportLevel === 'none' &&
40+
tokenApiSupportLevel === 'none'
41+
) {
6242
return []
6343
}
6444
return [
6545
{
6646
...network,
67-
evm,
68-
subgraphs,
69-
substreams,
70-
firehose,
71-
tokenApi,
72-
rawNetwork: network,
73-
subgraphsSupportLevel: getSubgraphsSupportLevel(network),
74-
substreamsSupportLevel: getSubstreamsSupportLevel(network),
75-
firehoseSupportLevel: getFirehoseSupportLevel(network),
47+
evm: isEvm(network),
48+
iconVariant: getIconVariant(network),
49+
subgraphsSupportLevel,
50+
subgraphsProvider,
51+
substreamsSupportLevel,
52+
firehoseSupportLevel,
53+
tokenApiSupportLevel,
7654
},
7755
]
7856
})
7957
.sort((a, b) => a.fullName.localeCompare(b.fullName))
8058
}
8159

60+
function isEvm(network: Network) {
61+
return network.caip2Id.startsWith('eip155:')
62+
}
63+
64+
function getIconVariant(network: Network): 'mono' | 'branded' {
65+
return MONO_ICON_NETWORKS.includes(network.id) ? 'mono' : 'branded'
66+
}
67+
68+
function getSubgraphsSupportLevelAndProvider(network: Network): ['none' | 'basic' | 'full', string | null] {
69+
const providers = [...new Set([...(network.services.subgraphs || []), ...(network.services.sps || [])])]
70+
if (providers.length > 0) {
71+
let provider = providers[0]!
72+
if (providers.some((provider) => /^((https?:)?\/\/)?api\.studio\.thegraph\.com\//.test(provider))) {
73+
provider = 'Subgraph Studio'
74+
} else if (providers.some((provider) => /^((https?:)?\/\/)?(www\.)?streamingfast\.io\//.test(provider))) {
75+
provider = 'StreamingFast'
76+
}
77+
if (network.issuanceRewards) {
78+
return ['full', provider]
79+
}
80+
return ['basic', provider]
81+
}
82+
return ['none', null]
83+
}
84+
85+
function getSubstreamsSupportLevel(network: Network): 'none' | 'basic' | 'full' {
86+
const providerCount = network.services.substreams?.length || 0
87+
if (providerCount >= 2) return 'full'
88+
if (providerCount === 1) return 'basic'
89+
return 'none'
90+
}
91+
92+
function getFirehoseSupportLevel(network: Network): 'none' | 'basic' | 'full' {
93+
const providerCount = network.services.firehose?.length || 0
94+
if (providerCount >= 2) return 'full'
95+
if (providerCount === 1) return 'basic'
96+
return 'none'
97+
}
98+
99+
function getTokenApiSupportLevel(network: Network): 'none' | 'full' {
100+
const providerCount = network.services.tokenApi?.length || 0
101+
if (providerCount >= 1) return 'full'
102+
return 'none'
103+
}
104+
82105
export type SupportedNetwork = Awaited<ReturnType<typeof getSupportedNetworks>>[number]
83106

84107
export async function getSupportedNetworksStaticProps() {

0 commit comments

Comments
 (0)