diff --git a/apps/dashboard/src/components/contract-components/contract-publish-form/NetworkDropdown.tsx b/apps/dashboard/src/@/components/blocks/NetworkSelectors.tsx similarity index 50% rename from apps/dashboard/src/components/contract-components/contract-publish-form/NetworkDropdown.tsx rename to apps/dashboard/src/@/components/blocks/NetworkSelectors.tsx index 8abd5afb002..d8740d69d23 100644 --- a/apps/dashboard/src/components/contract-components/contract-publish-form/NetworkDropdown.tsx +++ b/apps/dashboard/src/@/components/blocks/NetworkSelectors.tsx @@ -1,97 +1,15 @@ +"use client"; + import { MultiSelect } from "@/components/blocks/multi-select"; +import { SelectWithSearch } from "@/components/blocks/select-with-search"; import { Badge } from "@/components/ui/badge"; -import { Select } from "chakra-react-select"; -import type { SizeProp } from "chakra-react-select"; import { useCallback, useMemo } from "react"; -import { useFormContext } from "react-hook-form"; import { useAllChainsData } from "../../../hooks/chains/allChains"; -interface NetworkDropdownProps { - useCleanChainName?: boolean; - isDisabled?: boolean; - onSingleChange: (networksEnabled: number) => void; - value: number | undefined; - size?: SizeProp; -} - function cleanChainName(chainName: string) { return chainName.replace("Mainnet", ""); } -export const NetworkDropdown: React.FC = ({ - useCleanChainName = true, - onSingleChange, - value, - size = "md", -}) => { - const form = useFormContext(); - const { allChains } = useAllChainsData(); - - const options = useMemo(() => { - return allChains.map((chain) => { - return { - label: useCleanChainName - ? cleanChainName(chain.name) - : `${chain.name} (${chain.chainId})`, - value: chain.chainId, - }; - }); - }, [allChains, useCleanChainName]); - - const defaultValues = useMemo(() => { - const networksEnabled = form?.watch( - "networksForDeployment.networksEnabled", - ); - - if (networksEnabled) { - return options.filter(({ value: val }) => - form.watch("networksForDeployment.networksEnabled")?.includes(val), - ); - } - return options; - }, [form, options]); - - return ( -
- setSearchValue(e.target.value)} + className="!h-auto rounded-b-none border-0 border-border border-b py-3 pl-10 focus-visible:ring-0 focus-visible:ring-offset-0" + /> + +
+ + + {/* List */} +
+ {optionsToShow.length === 0 && ( +
+ No results found +
+ )} + + {optionsToShow.map((option, i) => { + const isSelected = value === option.value; + return ( + + ); + })} +
+
+ + + + ); + }, +); + +SelectWithSearch.displayName = "SelectWithSearch"; diff --git a/apps/dashboard/src/components/contract-components/contract-publish-form/custom-factory.tsx b/apps/dashboard/src/components/contract-components/contract-publish-form/custom-factory.tsx index 06f54be0ac6..5277b7a0b7f 100644 --- a/apps/dashboard/src/components/contract-components/contract-publish-form/custom-factory.tsx +++ b/apps/dashboard/src/components/contract-components/contract-publish-form/custom-factory.tsx @@ -1,3 +1,4 @@ +import { SingleNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { Box, Flex, @@ -15,7 +16,6 @@ import { Controller, useFieldArray, useFormContext } from "react-hook-form"; import { FiTrash } from "react-icons/fi"; import { Button, Heading, Text } from "tw-components"; import { useCustomFactoryAbi } from "../hooks"; -import { NetworkDropdown } from "./NetworkDropdown"; import { AbiSelector } from "./abi-selector"; interface CustomFactoryProps { @@ -76,19 +76,20 @@ export const CustomFactory: React.FC = ({ {fields.map((field, index) => (
- + ( - { - _field.onChange(value); - }} - value={_field.value} - /> - )} + render={({ field: _field }) => { + return ( + { + _field.onChange(value); + }} + /> + ); + }} /> diff --git a/apps/dashboard/src/components/contract-components/contract-publish-form/networks-fieldset.tsx b/apps/dashboard/src/components/contract-components/contract-publish-form/networks-fieldset.tsx index 058438abd81..e59319e46c3 100644 --- a/apps/dashboard/src/components/contract-components/contract-publish-form/networks-fieldset.tsx +++ b/apps/dashboard/src/components/contract-components/contract-publish-form/networks-fieldset.tsx @@ -1,7 +1,7 @@ +import { MultiNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { Flex, FormControl, Select } from "@chakra-ui/react"; import { useFormContext } from "react-hook-form"; import { Heading, Text } from "tw-components"; -import { MultiNetworkSelector } from "./NetworkDropdown"; interface NetworksFieldsetProps { fromStandard?: boolean; diff --git a/apps/dashboard/src/components/engine/contract-subscription/add-contract-subscription-button.tsx b/apps/dashboard/src/components/engine/contract-subscription/add-contract-subscription-button.tsx index 1b7e97f98e1..1d59100a8ba 100644 --- a/apps/dashboard/src/components/engine/contract-subscription/add-contract-subscription-button.tsx +++ b/apps/dashboard/src/components/engine/contract-subscription/add-contract-subscription-button.tsx @@ -1,5 +1,6 @@ "use client"; +import { SingleNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { useThirdwebClient } from "@/constants/thirdweb.client"; import { type AddContractSubscriptionInput, @@ -26,7 +27,6 @@ import { type UseDisclosureReturn, useDisclosure, } from "@chakra-ui/react"; -import { NetworkDropdown } from "components/contract-components/contract-publish-form/NetworkDropdown"; import { useTrack } from "hooks/analytics/useTrack"; import { useTxNotifications } from "hooks/useTxNotifications"; import { useV5DashboardChain } from "lib/v5-adapter"; @@ -191,9 +191,9 @@ const ModalBodyInputContract = ({ Chain - form.setValue("chainId", val)} + form.setValue("chainId", val)} /> diff --git a/apps/dashboard/src/components/engine/relayer/add-relayer-button.tsx b/apps/dashboard/src/components/engine/relayer/add-relayer-button.tsx index 90baf38248d..9c271865f57 100644 --- a/apps/dashboard/src/components/engine/relayer/add-relayer-button.tsx +++ b/apps/dashboard/src/components/engine/relayer/add-relayer-button.tsx @@ -1,3 +1,4 @@ +import { SingleNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { type CreateRelayerInput, useEngineBackendWallets, @@ -20,7 +21,6 @@ import { type UseDisclosureReturn, useDisclosure, } from "@chakra-ui/react"; -import { NetworkDropdown } from "components/contract-components/contract-publish-form/NetworkDropdown"; import { useTrack } from "hooks/analytics/useTrack"; import { useAllChainsData } from "hooks/chains/allChains"; import { useTxNotifications } from "hooks/useTxNotifications"; @@ -136,9 +136,9 @@ const AddModal = ({ Chain - form.setValue("chainId", val)} + form.setValue("chainId", val)} /> diff --git a/apps/dashboard/src/components/engine/relayer/relayers-table.tsx b/apps/dashboard/src/components/engine/relayer/relayers-table.tsx index daeebd36dd2..be0dd23e2c0 100644 --- a/apps/dashboard/src/components/engine/relayer/relayers-table.tsx +++ b/apps/dashboard/src/components/engine/relayer/relayers-table.tsx @@ -1,3 +1,4 @@ +import { SingleNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { type EngineRelayer, type UpdateRelayerInput, @@ -22,7 +23,6 @@ import { useDisclosure, } from "@chakra-ui/react"; import { createColumnHelper } from "@tanstack/react-table"; -import { NetworkDropdown } from "components/contract-components/contract-publish-form/NetworkDropdown"; import { ChainIcon } from "components/icons/ChainIcon"; import { TWTable } from "components/shared/TWTable"; import { useTrack } from "hooks/analytics/useTrack"; @@ -271,9 +271,9 @@ const EditModal = ({
Chain - form.setValue("chainId", val)} + form.setValue("chainId", val)} /> diff --git a/apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx b/apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx index e84e5140386..790ad366ecb 100644 --- a/apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx +++ b/apps/dashboard/src/components/smart-wallets/SponsorshipPolicies/index.tsx @@ -1,5 +1,6 @@ "use client"; +import { MultiNetworkSelector } from "@/components/blocks/NetworkSelectors"; import { Spinner } from "@/components/ui/Spinner/Spinner"; import { type ApiKeyService, @@ -38,7 +39,6 @@ import { import { joinWithComma, toArrFromList } from "utils/string"; import { validStrList } from "utils/validations"; import { z } from "zod"; -import { MultiNetworkSelector } from "../../contract-components/contract-publish-form/NetworkDropdown"; type AccountAbstractionSettingsPageProps = { apiKeyServices: ApiKeyService[];