"use client"; import { DropdownCaretDown } from "@pythnetwork/component-library/DropdownCaretDown"; import { Virtualizer, ListLayout, } from "@pythnetwork/component-library/Virtualizer"; import { Button } from "@pythnetwork/component-library/unstyled/Button"; import { Dialog } from "@pythnetwork/component-library/unstyled/Dialog"; import { ListBox, ListBoxItem, } from "@pythnetwork/component-library/unstyled/ListBox"; import { Popover } from "@pythnetwork/component-library/unstyled/Popover"; import { SearchField } from "@pythnetwork/component-library/unstyled/SearchField"; import { Select } from "@pythnetwork/component-library/unstyled/Select"; import { Input } from "@pythnetwork/component-library/unstyled/TextField"; import { type ReactNode, useMemo, useState } from "react"; import { useCollator, useFilter } from "react-aria"; import styles from "./price-feed-select.module.scss"; import { usePriceFeeds } from "../../hooks/use-price-feeds"; import { AssetClassTag } from "../AssetClassTag"; import { PriceFeedTag } from "../PriceFeedTag"; type Props = { children: ReactNode; }; export const PriceFeedSelect = ({ children }: Props) => { const feeds = usePriceFeeds(); const collator = useCollator(); const filter = useFilter({ sensitivity: "base", usage: "search" }); const [search, setSearch] = useState(""); const filteredFeeds = useMemo( () => search === "" ? feeds.entries() : feeds .entries() .filter( ([, { displaySymbol, assetClass, key }]) => filter.contains(displaySymbol, search) || filter.contains(assetClass, search) || filter.contains(key, search), ), [feeds, search, filter], ); const sortedFeeds = useMemo( () => // eslint-disable-next-line unicorn/no-useless-spread [ ...filteredFeeds.map(([symbol, { displaySymbol }]) => ({ id: symbol, displaySymbol, })), ].toSorted((a, b) => collator.compare(a.displaySymbol, b.displaySymbol)), [filteredFeeds, collator], ); return ( {({ id, displaySymbol }) => ( )} ); };