From 338623df181d70568e2de19f15b3f2c3608fb3fa Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 5 Aug 2024 15:34:11 +0200 Subject: [PATCH] Add search to the token modal --- .../components/common/TokenSelectModal.tsx | 82 ++++++++++++------- packages/nextjs/package.json | 1 + yarn.lock | 14 +++- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/packages/nextjs/components/common/TokenSelectModal.tsx b/packages/nextjs/components/common/TokenSelectModal.tsx index 725731a7..8f180539 100644 --- a/packages/nextjs/components/common/TokenSelectModal.tsx +++ b/packages/nextjs/components/common/TokenSelectModal.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { Dispatch, SetStateAction } from "react"; +import React, { Dispatch, SetStateAction, useState } from "react"; +import VirtualList from "react-tiny-virtual-list"; import { XMarkIcon } from "@heroicons/react/24/outline"; import { type Token } from "~~/hooks/token"; @@ -9,35 +9,61 @@ type ModalProps = { setIsModalOpen: Dispatch>; }; export const TokenSelectModal: React.FC = ({ tokenOptions, setIsModalOpen, setToken }) => { + const [searchText, setSearchText] = useState(""); + const filteredTokenOptions = tokenOptions.filter(option => + option.symbol.toLowerCase().startsWith(searchText.toLowerCase()), + ); + return ( -
setIsModalOpen(false)}> -
-
- setIsModalOpen(false)} - /> +
+
+
+
+ setIsModalOpen(false)} + /> -
Select Token
+
Select Token
+ ) => setSearchText(e.target.value)} + className="w-full input input-bordered rounded-xl bg-base-200 disabled:bg-base-300 px-5 h-[52px] text-lg" + /> +
- {tokenOptions.map(token => ( - - ))} + { + const token = filteredTokenOptions[index]; + + return ( + + ); + }} + />
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 10308dc3..d4d9c3b6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -31,6 +31,7 @@ "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.2.0", "react-hot-toast": "^2.4.0", + "react-tiny-virtual-list": "^2.2.0", "use-debounce": "^8.0.4", "usehooks-ts": "^2.13.0", "viem": "2.17.4", diff --git a/yarn.lock b/yarn.lock index c40598e3..f153e7e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2336,6 +2336,7 @@ __metadata: react-copy-to-clipboard: ^5.1.0 react-dom: ^18.2.0 react-hot-toast: ^2.4.0 + react-tiny-virtual-list: ^2.2.0 tailwindcss: ^3.4.3 type-fest: ^4.6.0 typescript: 5.5.3 @@ -11813,7 +11814,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.8.1": +"prop-types@npm:^15.5.7, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -12093,6 +12094,17 @@ __metadata: languageName: node linkType: hard +"react-tiny-virtual-list@npm:^2.2.0": + version: 2.2.0 + resolution: "react-tiny-virtual-list@npm:2.2.0" + dependencies: + prop-types: ^15.5.7 + peerDependencies: + react: 15.x || 16.x + checksum: e89908ab643827f8cda2f3b8dcdb1406c800cfa830ad7a9e76a8f806a5fe07c1a5f33d136967ad177e9e786903667c4053449e1b0143bfb7d7b482f667f8372b + languageName: node + linkType: hard + "react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0"