1
+ import { useState , useEffect } from 'react'
2
+ import {
3
+ Table ,
4
+ TableHead ,
5
+ TableBody ,
6
+ TableRow ,
7
+ TableCell ,
8
+ TextField ,
9
+ Select ,
10
+ MenuItem ,
11
+ Box
12
+ } from '@mui/material'
13
+ import { HermesClient } from '@pythnetwork/hermes-client'
14
+
15
+ interface PriceFeed {
16
+ id : string
17
+ name : string
18
+ assetType : string
19
+ }
20
+
21
+ export function PriceFeedTable ( ) {
22
+ const [ priceFeeds , setPriceFeeds ] = useState < PriceFeed [ ] > ( [ ] )
23
+ const [ searchTerm , setSearchTerm ] = useState ( "" )
24
+ const [ selectedAssetType , setSelectedAssetType ] = useState ( "All" )
25
+
26
+ useEffect ( ( ) => {
27
+ const fetchPriceFeeds = async ( ) => {
28
+ const hermesClient = new HermesClient ( "https://hermes.pyth.network" )
29
+ const feeds = await hermesClient . getPriceFeeds ( )
30
+ const transformedFeeds = feeds . map ( feed => ( {
31
+ id : feed . id ,
32
+ name : feed . attributes . display_symbol || '' ,
33
+ assetType : feed . attributes . asset_type || ''
34
+ } ) )
35
+ setPriceFeeds ( transformedFeeds )
36
+ }
37
+
38
+ fetchPriceFeeds ( )
39
+ } , [ ] )
40
+
41
+ const filteredData = priceFeeds . filter ( feed => {
42
+ const matchesSearch = feed . id . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
43
+ feed . name . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) )
44
+ const matchesAssetType = selectedAssetType === "All" || feed . assetType === selectedAssetType
45
+ return matchesSearch && matchesAssetType
46
+ } )
47
+
48
+ return (
49
+ < Box >
50
+ < Box sx = { { mb : 3 , display : 'flex' , gap : 2 } } >
51
+ < TextField
52
+ label = "Search price feeds"
53
+ variant = "outlined"
54
+ size = "small"
55
+ value = { searchTerm }
56
+ onChange = { ( e ) => setSearchTerm ( e . target . value ) }
57
+ sx = { { width : 300 } }
58
+ />
59
+ < Select
60
+ value = { selectedAssetType }
61
+ onChange = { ( e ) => setSelectedAssetType ( e . target . value ) }
62
+ size = "small"
63
+ sx = { { width : 200 } }
64
+ >
65
+ < MenuItem value = "All" > All Asset Types</ MenuItem >
66
+ { Array . from ( new Set ( priceFeeds . map ( feed => feed . assetType ) ) ) . map ( type => (
67
+ < MenuItem key = { type } value = { type } >
68
+ { type || 'Uncategorized' }
69
+ </ MenuItem >
70
+ ) ) }
71
+ </ Select >
72
+ </ Box >
73
+
74
+ < Table >
75
+ < TableHead >
76
+ < TableRow >
77
+ < TableCell > Ticker</ TableCell >
78
+ < TableCell > Asset Type</ TableCell >
79
+ < TableCell > Feed ID</ TableCell >
80
+ </ TableRow >
81
+ </ TableHead >
82
+ < TableBody >
83
+ { filteredData . map ( ( feed ) => (
84
+ < TableRow key = { feed . id } >
85
+ < TableCell > { feed . name } </ TableCell >
86
+ < TableCell > { feed . assetType } </ TableCell >
87
+ < TableCell > { feed . id } </ TableCell >
88
+ </ TableRow >
89
+ ) ) }
90
+ </ TableBody >
91
+ </ Table >
92
+ </ Box >
93
+ )
94
+ }
0 commit comments