From cf8a4be53ca6ef6cc1713cca6a4a6221cd2e5942 Mon Sep 17 00:00:00 2001 From: thal0x Date: Thu, 9 Nov 2023 12:07:55 -0600 Subject: [PATCH] display dynamic time estimate on tx history page --- src/components/HistoryDialog/HistoryList.tsx | 14 +++----- .../TransactionDialogContent.tsx | 25 ++------------- src/utils/hooks.ts | 32 ++++++++++++++++++- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/components/HistoryDialog/HistoryList.tsx b/src/components/HistoryDialog/HistoryList.tsx index 6542373d..7095fabf 100644 --- a/src/components/HistoryDialog/HistoryList.tsx +++ b/src/components/HistoryDialog/HistoryList.tsx @@ -12,9 +12,9 @@ import * as Accordion from "@radix-ui/react-accordion"; import { clsx } from "clsx"; import { ComponentPropsWithoutRef, forwardRef, Fragment, useMemo } from "react"; -import { useChains } from "@/api/queries"; import { disclosure } from "@/context/disclosures"; import { removeTxHistory, TxHistoryItem } from "@/context/tx-history"; +import { useFinalityTimeEstimate } from "@/utils/hooks"; import { AssetValue } from "../AssetValue"; import { ChainSymbol } from "../ChainSymbol"; @@ -61,13 +61,7 @@ export const Item = forwardRef( function Item(props, ref) { const { id, data, className, ...rest } = props; - const { chains = [] } = useChains(); - - const isSourceEvm = useMemo(() => { - const [sourceChainID] = data.route.chainIDs; - const chain = chains.find(({ chainID }) => chainID === sourceChainID); - return chain?.chainType === "evm"; - }, [chains, data.route.chainIDs]); + const estimatedFinalityTime = useFinalityTimeEstimate(data.route); return ( ( Completion Time - ~{isSourceEvm ? 30 : 2} minutes + {estimatedFinalityTime === "" + ? "2 minutes" + : estimatedFinalityTime} diff --git a/src/components/TransactionDialog/TransactionDialogContent.tsx b/src/components/TransactionDialog/TransactionDialogContent.tsx index 8ef546e9..748031dd 100644 --- a/src/components/TransactionDialog/TransactionDialogContent.tsx +++ b/src/components/TransactionDialog/TransactionDialogContent.tsx @@ -2,11 +2,10 @@ import { useManager } from "@cosmos-kit/react"; import { ArrowLeftIcon, CheckCircleIcon } from "@heroicons/react/20/solid"; import { RouteResponse } from "@skip-router/core"; import { clsx } from "clsx"; -import { FC, Fragment, useMemo, useState } from "react"; +import { FC, Fragment, useState } from "react"; import { useAccount } from "wagmi"; import { Chain, useChains } from "@/api/queries"; -import { getFinalityTime } from "@/constants/finality"; import { useSettingsStore } from "@/context/settings"; import { useToast } from "@/context/toast"; import { @@ -17,6 +16,7 @@ import { } from "@/context/tx-history"; import Toast from "@/elements/Toast"; import { useSkipClient } from "@/solve"; +import { useFinalityTimeEstimate } from "@/utils/hooks"; import { enableChains, getAddressForCosmosChain, @@ -243,26 +243,7 @@ const TransactionDialogContent: FC = ({ } }; - const estimatedFinalityTime = useMemo(() => { - for (const operation of route.operations) { - if ("axelarTransfer" in operation) { - const sourceChain = chains.find( - ({ chainID }) => chainID === operation.axelarTransfer.fromChainID, - ); - if (sourceChain?.chainType === "evm") { - return getFinalityTime(sourceChain.chainID); - } - - const destinationChain = chains.find( - ({ chainID }) => chainID === operation.axelarTransfer.toChainID, - ); - if (destinationChain?.chainType === "evm") { - return getFinalityTime(destinationChain.chainID); - } - } - } - return ""; - }, [chains, route.operations]); + const estimatedFinalityTime = useFinalityTimeEstimate(route); if (txComplete) { return ( diff --git a/src/utils/hooks.ts b/src/utils/hooks.ts index e3eff7ca..0dcd68a1 100644 --- a/src/utils/hooks.ts +++ b/src/utils/hooks.ts @@ -1,4 +1,8 @@ -import { useEffect, useLayoutEffect, useRef } from "react"; +import { RouteResponse } from "@skip-router/core"; +import { useEffect, useLayoutEffect, useMemo, useRef } from "react"; + +import { useChains } from "@/api/queries"; +import { getFinalityTime } from "@/constants/finality"; export const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect; @@ -24,3 +28,29 @@ export function useInterval(callback: () => void, delay: number | null) { return () => clearInterval(id); }, [delay]); } + +export function useFinalityTimeEstimate(route: RouteResponse) { + const { chains = [] } = useChains(); + + return useMemo(() => { + for (const operation of route.operations) { + if ("axelarTransfer" in operation) { + const sourceChain = chains.find( + ({ chainID }) => chainID === operation.axelarTransfer.fromChainID, + ); + if (sourceChain?.chainType === "evm") { + return getFinalityTime(sourceChain.chainID); + } + + const destinationChain = chains.find( + ({ chainID }) => chainID === operation.axelarTransfer.toChainID, + ); + if (destinationChain?.chainType === "evm") { + return getFinalityTime(destinationChain.chainID); + } + } + } + + return ""; + }, [chains, route.operations]); +}