import { useState, useEffect } from "react"; import { Box, Button, Center, Modal, ModalBody, ModalCloseButton, ModalContent, ModalHeader, ModalOverlay, SimpleGrid, Spinner, useDisclosure, } from "@chakra-ui/react"; import axios from "axios"; import DappsSearch from "./DappsSearch"; import DappTile from "./DappTile"; import { SafeDappInfo } from "../../../../types"; interface SupportedDappsParams { networkId: number; initIFrame: (_inputAppUrl?: string | undefined) => Promise; setInputAppUrl: (value: string | undefined) => void; } function SupportedDapps({ networkId, initIFrame, setInputAppUrl, }: SupportedDappsParams) { const { isOpen: isSafeAppsOpen, onOpen: openSafeAapps, onClose: closeSafeApps, } = useDisclosure(); const [safeDapps, setSafeDapps] = useState<{ [networkId: number]: SafeDappInfo[]; }>({}); const [searchSafeDapp, setSearchSafeDapp] = useState(); const [filteredSafeDapps, setFilteredSafeDapps] = useState(); useEffect(() => { const fetchSafeDapps = async (networkId: number) => { const response = await axios.get( `https://safe-client.safe.global/v1/chains/${networkId}/safe-apps` ); setSafeDapps((dapps) => ({ ...dapps, [networkId]: response.data.filter((d) => ![29, 11].includes(d.id)), // Filter out Transaction Builder and WalletConnect })); }; if (isSafeAppsOpen && !safeDapps[networkId]) { fetchSafeDapps(networkId); } }, [isSafeAppsOpen, safeDapps, networkId]); useEffect(() => { if (safeDapps[networkId]) { setFilteredSafeDapps( safeDapps[networkId].filter((dapp) => { if (!searchSafeDapp) return true; return ( dapp.name .toLowerCase() .indexOf(searchSafeDapp.toLocaleLowerCase()) !== -1 || dapp.url .toLowerCase() .indexOf(searchSafeDapp.toLocaleLowerCase()) !== -1 ); }) ); } else { setFilteredSafeDapps(undefined); } }, [safeDapps, networkId, searchSafeDapp]); return ( <> Select a dapp {(!safeDapps || !safeDapps[networkId]) && (
)} {safeDapps && safeDapps[networkId] && ( )} {filteredSafeDapps && filteredSafeDapps.map((dapp, i) => ( ))}
); } export default SupportedDapps;