import React, { useState, useCallback, useMemo } from "react"; import * as RadixDialog from "@radix-ui/react-dialog"; import { motion } from "framer-motion"; import { FaSearch } from "react-icons/fa"; import { FixedSizeList as List } from "react-window"; import { useChains } from "@/hooks/moon/useChain"; import { Input } from "@/components"; const MotionRadixContent = motion(RadixDialog.Content); export type ChainSelectionModalProps = { chainIdFilterList?: number[]; title?: string; onChange?: (e: any) => void; }; export const ChainSelectionModal: React.FC = ({ chainIdFilterList, title = "Select Network", onChange, }) => { const { selectedChain, switchChain, chains } = useChains(); const [isOpen, setIsOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const handleOpen = () => setIsOpen(true); const handleClose = () => setIsOpen(false); const sortedChains = useMemo(() => { return chains.sort((a, b) => { if (!a?.name || !b?.name) return 0; return a.name.localeCompare(b.name); }); }, [chains]); const filteredChains = useMemo(() => { return sortedChains.filter((chain) => { if (!chain.name) return false; return ( chain.name.toLowerCase().includes(searchTerm.toLowerCase()) && (!chainIdFilterList || chainIdFilterList.includes(chain.chain_id || -1)) ); }); }, [sortedChains, searchTerm, chainIdFilterList]); const handleChainSelect = (chainId: number) => { switchChain(chainId); handleClose(); const fakeEvent = { target: { value: chainId } }; onChange && onChange(fakeEvent); }; const Row = useCallback( ({ index, style }: { index: number; style: React.CSSProperties }) => { const chain = filteredChains[index]; return (
handleChainSelect(chain.chain_id!)} > {chain.name {chain.name}
); }, [filteredChains], ); return ( {title}
setSearchTerm(e.target.value)} className="flex-1 px-2 py-1 bg-gray-700 text-white rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{Row}
); }; export default ChainSelectionModal;