From 726863e05371b2705aef4033280ed8976d6c3eeb Mon Sep 17 00:00:00 2001 From: saml33 Date: Sat, 28 Oct 2023 22:49:46 +1100 Subject: [PATCH] add countdown to refetch and refetch button --- components/shared/CircularProgress.tsx | 49 ++++++++++++++++ components/swap/MarketSwapForm.tsx | 8 ++- components/swap/SwapReviewRouteInfo.tsx | 76 ++++++++++++++++++++++--- components/swap/WalletSwapForm.tsx | 8 ++- components/swap/useQuoteRoutes.ts | 4 ++ 5 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 components/shared/CircularProgress.tsx diff --git a/components/shared/CircularProgress.tsx b/components/shared/CircularProgress.tsx new file mode 100644 index 00000000..04e39119 --- /dev/null +++ b/components/shared/CircularProgress.tsx @@ -0,0 +1,49 @@ +type CircularProgressProps = { + className?: string + size: number + progress: number + trackWidth: number + indicatorWidth: number +} + +const CircularProgress = ({ + className, + indicatorWidth, + progress, + size, + trackWidth, +}: CircularProgressProps) => { + const center = size / 2, + radius = + center - (trackWidth > indicatorWidth ? trackWidth : indicatorWidth), + dashArray = 2 * Math.PI * radius, + dashOffset = dashArray * ((100 - progress) / 100) + + return ( + <> +
+ + + + +
+ + ) +} + +export default CircularProgress diff --git a/components/swap/MarketSwapForm.tsx b/components/swap/MarketSwapForm.tsx index 53bfcab1..8d039362 100644 --- a/components/swap/MarketSwapForm.tsx +++ b/components/swap/MarketSwapForm.tsx @@ -81,7 +81,11 @@ const MarketSwapForm = ({ const { mangoAccount } = useMangoAccount() const quoteAmount = swapMode === 'ExactIn' ? amountInFormValue : amountOutFormValue - const { bestRoute } = useQuoteRoutes({ + const { + bestRoute, + isFetching: fetchingRoute, + refetch: refetchRoute, + } = useQuoteRoutes({ inputMint: inputBank?.mint.toString(), outputMint: outputBank?.mint.toString(), amount: quoteAmount, @@ -296,8 +300,10 @@ const MarketSwapForm = ({ <> setShowConfirm(false)} onSuccess={onSuccess} + refetchRoute={refetchRoute} routes={bestRoute ? [bestRoute] : undefined} selectedRoute={selectedRoute} setSelectedRoute={setSelectedRoute} diff --git a/components/swap/SwapReviewRouteInfo.tsx b/components/swap/SwapReviewRouteInfo.tsx index fc553ea5..8a76a68d 100644 --- a/components/swap/SwapReviewRouteInfo.tsx +++ b/components/swap/SwapReviewRouteInfo.tsx @@ -27,6 +27,7 @@ import { ArrowsRightLeftIcon, ArrowRightIcon, ChevronDownIcon, + ArrowPathIcon, } from '@heroicons/react/20/solid' import { useTranslation } from 'next-i18next' import { formatNumericValue } from '../../utils/numbers' @@ -54,14 +55,28 @@ import { TransactionErrors, parseTxForKnownErrors, } from '@blockworks-foundation/mango-v4' +import CircularProgress from '@components/shared/CircularProgress' +import { + QueryObserverResult, + RefetchOptions, + RefetchQueryFilters, +} from '@tanstack/react-query' const set = mangoStore.getState().set type JupiterRouteInfoProps = { amountIn: Decimal + loadingRoute: boolean isWalletSwap?: boolean onClose: () => void onSuccess?: () => void + refetchRoute: + | (( + options?: (RefetchOptions & RefetchQueryFilters) | undefined, + ) => Promise< + QueryObserverResult<{ bestRoute: JupiterV6RouteInfo | null }, Error> + >) + | undefined routes: JupiterV6RouteInfo[] | undefined selectedRoute: JupiterV6RouteInfo | undefined | null setSelectedRoute: Dispatch< @@ -217,9 +232,11 @@ const successSound = new Howl({ const SwapReviewRouteInfo = ({ amountIn, + loadingRoute, isWalletSwap, onClose, onSuccess, + refetchRoute, routes, selectedRoute, setSelectedRoute, @@ -243,6 +260,22 @@ const SwapReviewRouteInfo = ({ ) const focusRef = useRef(null) + const [refetchRoutePercentage, setRefetchRoutePercentage] = useState(0) + + useEffect(() => { + let currentPercentage = 0 + const countdownInterval = setInterval(() => { + if (currentPercentage < 100) { + currentPercentage += 5 // 5% increment per second + setRefetchRoutePercentage(currentPercentage) + } + }, 1000) + + return () => { + clearInterval(countdownInterval) + } + }, [selectedRoute]) + const amountOut = useMemo(() => { if (!selectedRoute?.outAmount || !outputTokenInfo) return return new Decimal(selectedRoute.outAmount.toString()).div( @@ -489,15 +522,40 @@ const SwapReviewRouteInfo = ({ >
- - - -
+
+ + + +
+ + {refetchRoute ? ( + refetchRoute()} + size="small" + ref={focusRef} + > + + + ) : null} +
+
+
diff --git a/components/swap/WalletSwapForm.tsx b/components/swap/WalletSwapForm.tsx index 1214b087..33dcd3d6 100644 --- a/components/swap/WalletSwapForm.tsx +++ b/components/swap/WalletSwapForm.tsx @@ -63,7 +63,11 @@ const WalletSwapForm = ({ setShowTokenSelect }: WalletSwapFormProps) => { const { connected, publicKey } = useWallet() const quoteAmount = swapMode === 'ExactIn' ? amountInFormValue : amountOutFormValue - const { bestRoute } = useQuoteRoutes({ + const { + bestRoute, + isFetching: fetchingRoute, + refetch: refetchRoute, + } = useQuoteRoutes({ inputMint: inputBank?.mint.toString(), outputMint: outputBank?.mint.toString(), amount: quoteAmount, @@ -298,8 +302,10 @@ const WalletSwapForm = ({ setShowTokenSelect }: WalletSwapFormProps) => { <> setShowConfirm(false)} + refetchRoute={refetchRoute} routes={bestRoute ? [bestRoute] : undefined} selectedRoute={selectedRoute} setSelectedRoute={setSelectedRoute} diff --git a/components/swap/useQuoteRoutes.ts b/components/swap/useQuoteRoutes.ts index ccab8426..e4a87dd2 100644 --- a/components/swap/useQuoteRoutes.ts +++ b/components/swap/useQuoteRoutes.ts @@ -256,14 +256,18 @@ const useQuoteRoutes = ({ routes: [], bestRoute: undefined, }), + isFetching: res.isFetching, isLoading: res.isLoading, isInitialLoading: res.isInitialLoading, + refetch: res.refetch, } : { routes: [], bestRoute: undefined, + isFetching: false, isLoading: false, isInitialLoading: false, + refetch: undefined, } }