1
- import { useEffect , useState } from "react" ;
1
+ import { ChangeEvent , useCallback , useEffect , useMemo , useState } from "react" ;
2
2
import { StyledTd } from "./Table" ;
3
3
import { Spinner } from "./Spinner" ;
4
4
const fetchLazerPriceIdMetadata = async ( ) => {
@@ -57,6 +57,66 @@ const useLazerPriceIdState = () => {
57
57
return state ;
58
58
} ;
59
59
60
+ const LoadedLazerPriceIdTable = ( {
61
+ priceFeeds,
62
+ } : {
63
+ priceFeeds : LazerPriceIdMetadata [ ] ;
64
+ } ) => {
65
+ const [ search , setSearch ] = useState ( "" ) ;
66
+
67
+ const updateSearch = useCallback ( ( event : ChangeEvent < HTMLInputElement > ) => {
68
+ setSearch ( event . target . value ) ;
69
+ } , [ ] ) ;
70
+
71
+ const filteredFeeds = useMemo ( ( ) => {
72
+ return priceFeeds . filter ( ( feed ) => {
73
+ const searchLower = search . toLowerCase ( ) ;
74
+ return (
75
+ feed . symbol . toLowerCase ( ) . includes ( searchLower ) ||
76
+ feed . name . toLowerCase ( ) . includes ( searchLower ) ||
77
+ feed . description . toLowerCase ( ) . includes ( searchLower ) ||
78
+ feed . pyth_lazer_id . toString ( ) . includes ( searchLower )
79
+ ) ;
80
+ } ) ;
81
+ } , [ priceFeeds , search ] ) ;
82
+
83
+ return (
84
+ < div >
85
+ < input
86
+ type = "text"
87
+ placeholder = "Search by symbol, name, description, or pyth lazer id..."
88
+ value = { search }
89
+ onChange = { updateSearch }
90
+ className = "w-full p-2 mb-4 border border-gray-300 rounded-md"
91
+ />
92
+ < table >
93
+ < thead >
94
+ < tr >
95
+ < th > Asset Type</ th >
96
+ < th > Description</ th >
97
+ < th > Name</ th >
98
+ < th > Symbol</ th >
99
+ < th > Pyth Lazer Id</ th >
100
+ < th > Exponent</ th >
101
+ </ tr >
102
+ </ thead >
103
+ < tbody >
104
+ { filteredFeeds . map ( ( priceFeed ) => (
105
+ < tr key = { priceFeed . symbol } >
106
+ < StyledTd > { priceFeed . asset_type } </ StyledTd >
107
+ < StyledTd > { priceFeed . description } </ StyledTd >
108
+ < StyledTd > { priceFeed . name } </ StyledTd >
109
+ < StyledTd > { priceFeed . symbol } </ StyledTd >
110
+ < StyledTd > { priceFeed . pyth_lazer_id } </ StyledTd >
111
+ < StyledTd > { priceFeed . exponent } </ StyledTd >
112
+ </ tr >
113
+ ) ) }
114
+ </ tbody >
115
+ </ table >
116
+ </ div >
117
+ ) ;
118
+ } ;
119
+
60
120
export function LazerPriceIdTable ( ) {
61
121
const lazerPriceIdState = useLazerPriceIdState ( ) ;
62
122
@@ -67,30 +127,7 @@ export function LazerPriceIdTable() {
67
127
return < Spinner /> ;
68
128
case LazerPriceIdStateType . Loaded :
69
129
return (
70
- < table >
71
- < thead >
72
- < tr >
73
- < th > Asset Type</ th >
74
- < th > Description</ th >
75
- < th > Name</ th >
76
- < th > Symbol</ th >
77
- < th > Pyth Lazer Id</ th >
78
- < th > Exponent</ th >
79
- </ tr >
80
- </ thead >
81
- < tbody >
82
- { lazerPriceIdState . priceFeeds . map ( ( priceFeed ) => (
83
- < tr key = { priceFeed . symbol } >
84
- < StyledTd > { priceFeed . asset_type } </ StyledTd >
85
- < StyledTd > { priceFeed . description } </ StyledTd >
86
- < StyledTd > { priceFeed . name } </ StyledTd >
87
- < StyledTd > { priceFeed . symbol } </ StyledTd >
88
- < StyledTd > { priceFeed . pyth_lazer_id } </ StyledTd >
89
- < StyledTd > { priceFeed . exponent } </ StyledTd >
90
- </ tr >
91
- ) ) }
92
- </ tbody >
93
- </ table >
130
+ < LoadedLazerPriceIdTable priceFeeds = { lazerPriceIdState . priceFeeds } />
94
131
) ;
95
132
case LazerPriceIdStateType . Error :
96
133
return < div > Error</ div > ;
0 commit comments