1- import { useEffect , useState } from "react" ;
1+ import { ChangeEvent , useCallback , useEffect , useMemo , useState } from "react" ;
22import { StyledTd } from "./Table" ;
33import { Spinner } from "./Spinner" ;
44const fetchLazerPriceIdMetadata = async ( ) => {
@@ -57,6 +57,66 @@ const useLazerPriceIdState = () => {
5757 return state ;
5858} ;
5959
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+
60120export function LazerPriceIdTable ( ) {
61121 const lazerPriceIdState = useLazerPriceIdState ( ) ;
62122
@@ -67,30 +127,7 @@ export function LazerPriceIdTable() {
67127 return < Spinner /> ;
68128 case LazerPriceIdStateType . Loaded :
69129 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 } />
94131 ) ;
95132 case LazerPriceIdStateType . Error :
96133 return < div > Error</ div > ;
0 commit comments