Skip to content

Commit 7c18d69

Browse files
authored
chore(lazer) Add search (#789)
* chore(lazer) Add search * requested changes
1 parent f7c8a61 commit 7c18d69

File tree

1 file changed

+62
-25
lines changed

1 file changed

+62
-25
lines changed

components/LazerPriceIdTable.tsx

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from "react";
1+
import { ChangeEvent, useCallback, useEffect, useMemo, useState } from "react";
22
import { StyledTd } from "./Table";
33
import { Spinner } from "./Spinner";
44
const 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+
60120
export 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

Comments
 (0)