import React, { useState, useEffect, useMemo } from "react"; import { useParams, useLocation, useHistory } from "react-router-dom"; import queryString from "query-string"; import Blockies from "react-blockies"; import StandardFrame from "./StandardFrame"; import StandardSubtitle from "./StandardSubtitle"; import Copy from "./components/Copy"; import ContentFrame from "./ContentFrame"; import UndefinedPageControl from "./search/UndefinedPageControl"; import ResultHeader from "./search/ResultHeader"; import PendingResults from "./search/PendingResults"; import TransactionItem from "./search/TransactionItem"; import { SearchController } from "./search/search"; import { useFeeToggler } from "./search/useFeeToggler"; import { ethers } from "ethers"; type BlockParams = { address: string; direction?: string; }; type PageParams = { p?: number; }; const AddressTransactions: React.FC = () => { const params = useParams(); const location = useLocation(); const history = useHistory(); const qs = queryString.parse(location.search); let hash: string | undefined; if (qs.h) { hash = qs.h as string; } // Normalize to checksummed address const checksummedAddress = useMemo( () => ethers.utils.getAddress(params.address), [params.address] ); if (params.address !== checksummedAddress) { console.log("NORMALIZE"); history.replace( `/address/${checksummedAddress}${ params.direction ? "/" + params.direction : "" }${location.search}` ); } const [controller, setController] = useState(); useEffect(() => { const readFirstPage = async () => { const _controller = await SearchController.firstPage(checksummedAddress); setController(_controller); }; const readMiddlePage = async (next: boolean) => { const _controller = await SearchController.middlePage( checksummedAddress, hash!, next ); setController(_controller); }; const readLastPage = async () => { const _controller = await SearchController.lastPage(checksummedAddress); setController(_controller); }; const prevPage = async () => { const _controller = await controller!.prevPage(hash!); setController(_controller); }; const nextPage = async () => { const _controller = await controller!.nextPage(hash!); setController(_controller); }; // Page load from scratch if (params.direction === "first" || params.direction === undefined) { if (!controller?.isFirst || controller.address !== checksummedAddress) { readFirstPage(); } } else if (params.direction === "prev") { if (controller && controller.address === checksummedAddress) { prevPage(); } else { readMiddlePage(false); } } else if (params.direction === "next") { if (controller && controller.address === checksummedAddress) { nextPage(); } else { readMiddlePage(true); } } else if (params.direction === "last") { if (!controller?.isLast || controller.address !== checksummedAddress) { readLastPage(); } } }, [checksummedAddress, params.direction, hash, controller]); const page = useMemo(() => controller?.getPage(), [controller]); document.title = `Address ${params.address} | Otterscan`; const [feeDisplay, feeDisplayToggler] = useFeeToggler(); return (
Address {params.address}
{page === undefined ? ( <>Waiting for search results... ) : ( <>{page.length} transactions on this page )}
{controller ? ( <> {controller.getPage().map((tx) => ( ))}
{page !== undefined && ( <>{page.length} transactions on this page )}
) : ( )}
); }; export default React.memo(AddressTransactions);