Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 29 additions & 17 deletions src/features/feeds/components/FeedList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import button from "@chainlink/design-system/button.module.css"
import { updateTableOfContents } from "~/components/TableOfContents/tocStore.ts"
import alertIcon from "../../../components/Alert/Assets/alert-icon.svg"
import { ChainSelector } from "~/components/ChainSelector/ChainSelector.tsx"
import { isFeedVisible } from "../utils/feedVisibility.ts"

export type DataFeedType =
| "default"
Expand Down Expand Up @@ -475,24 +476,35 @@ export const FeedList = ({
const networkTypes = { mainnet: false, testnet: false }

// Filter networks by feed type
const filteredNetworks = chainMetadata.processedData.networks.filter((network) => {
if (isDeprecating) {
let foundDeprecated = false
network.metadata?.forEach((feed: any) => {
if (feed.feedCategory === "deprecating") {
foundDeprecated = true
}
})
return foundDeprecated
}

if (isStreams) return network.tags?.includes("streams")
if (isSmartData) return network.tags?.includes("smartData")
if (isRates) return network.tags?.includes("rates")
if (isUSGovernmentMacroeconomicData) return network.tags?.includes("usGovernmentMacroeconomicData")
const filteredNetworks = chainMetadata.processedData.networks
.filter((network) => {
if (isDeprecating) {
let foundDeprecated = false
network.metadata?.forEach((feed: any) => {
if (feed.feedCategory === "deprecating") {
foundDeprecated = true
}
})
// A deprecating network is relevant only if it still has at least one non-hidden deprecating feed
if (!foundDeprecated) return false
const hasVisible = network.metadata?.some(
(feed: any) => feed.feedCategory === "deprecating" && feed.feedCategory !== "hidden" && !feed.docs?.hidden
)
return !!hasVisible
}

return true
})
if (isStreams) return network.tags?.includes("streams")
if (isSmartData) return network.tags?.includes("smartData")
if (isRates) return network.tags?.includes("rates")
if (isUSGovernmentMacroeconomicData) return network.tags?.includes("usGovernmentMacroeconomicData")

return true
})
.filter((network) => {
// Ensure the network has at least one visible feed for the current dataFeedType
const feeds = network.metadata || []
return feeds.some((feed: any) => isFeedVisible(feed, dataFeedType, ecosystem))
})

// Check available network types
filteredNetworks.forEach((network) => {
Expand Down
72 changes: 72 additions & 0 deletions src/features/feeds/utils/feedVisibility.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { DataFeedType } from "../components/FeedList.tsx"

/**
* Determines if a feed should be visible based on:
* - Hidden flags (feedCategory === "hidden" or docs.hidden)
* - Data feed type filtering (streams, smartdata, rates, etc.)
* - Ecosystem filtering (deprecating)
*
* This logic is shared between table filtering and network availability checks.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function isFeedVisible(feed: any, dataFeedType: DataFeedType, ecosystem = ""): boolean {
// Universal hidden exclusions
if (feed.feedCategory === "hidden" || feed.docs?.hidden) return false

const isDeprecating = ecosystem === "deprecating"
const isStreams =
dataFeedType === "streamsCrypto" ||
dataFeedType === "streamsRwa" ||
dataFeedType === "streamsNav" ||
dataFeedType === "streamsExRate" ||
dataFeedType === "streamsBacked"
const isSmartData = dataFeedType === "smartdata"
const isRates = dataFeedType === "rates"
const isUSGovernmentMacroeconomicData = dataFeedType === "usGovernmentMacroeconomicData"

// Deprecating ecosystem: only show feeds with deprecating category
if (isDeprecating && feed.feedCategory !== "deprecating") return false

// Streams filtering by sub-type
if (isStreams) {
if (dataFeedType === "streamsCrypto")
return feed.contractType === "verifier" && ["Crypto", "Crypto-DEX"].includes(feed.docs?.feedType)
if (dataFeedType === "streamsRwa")
return feed.contractType === "verifier" && ["Equities", "Forex"].includes(feed.docs?.feedType)
if (dataFeedType === "streamsNav")
return feed.contractType === "verifier" && feed.docs?.feedType === "Net Asset Value"
if (dataFeedType === "streamsExRate")
return feed.contractType === "verifier" && feed.docs?.productTypeCode === "ExRate"
if (dataFeedType === "streamsBacked")
return feed.contractType === "verifier" && feed.docs?.feedType === "Tokenized Equities"
return false
}

// SmartData filtering
if (isSmartData) {
if (feed.docs?.deliveryChannelCode === "DS") return false
return (
feed.docs?.isMVR === true ||
feed.docs?.productType === "Proof of Reserve" ||
feed.docs?.productType === "NAVLink" ||
feed.docs?.productType === "SmartAUM"
)
}

// US Government Macroeconomic Data
if (isUSGovernmentMacroeconomicData) return feed.docs?.productTypeCode === "RefMacro"

// Rates
if (isRates) return feed.docs?.productType === "Rates"

// Default data feeds: exclude MVR, verifier, and SmartData product types
return (
!feed.docs?.porType &&
feed.contractType !== "verifier" &&
feed.docs?.productType !== "Proof of Reserve" &&
feed.docs?.productType !== "NAVLink" &&
feed.docs?.productType !== "SmartAUM" &&
feed.docs?.productTypeCode !== "RefMacro" &&
!feed.docs?.isMVR
)
}
Loading