Skip to content

Commit f2aa8e1

Browse files
committed
initial commit
1 parent db5bad4 commit f2aa8e1

File tree

4 files changed

+1026
-51
lines changed

4 files changed

+1026
-51
lines changed

components/PriceFeedTable.tsx

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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

Comments
 (0)