diff --git a/app/market/[chainId]/[marketid]/components/PositionStats.tsx b/app/market/[chainId]/[marketid]/components/PositionStats.tsx index cb9bd2f0..2956441a 100644 --- a/app/market/[chainId]/[marketid]/components/PositionStats.tsx +++ b/app/market/[chainId]/[marketid]/components/PositionStats.tsx @@ -1,8 +1,8 @@ import { useState } from 'react'; import { Card } from '@nextui-org/card'; import { Switch } from '@nextui-org/switch'; -import { FiUser } from "react-icons/fi"; -import { HiOutlineGlobeAsiaAustralia } from "react-icons/hi2"; +import { FiUser } from 'react-icons/fi'; +import { HiOutlineGlobeAsiaAustralia } from 'react-icons/hi2'; import { Spinner } from '@/components/common/Spinner'; import { TokenIcon } from '@/components/TokenIcon'; import { formatBalance, formatReadable } from '@/utils/balance'; @@ -13,18 +13,27 @@ type PositionStatsProps = { userPosition: MarketPosition | null; positionLoading: boolean; cardStyle: string; -} +}; function ThumbIcon({ isSelected, className }: { isSelected: boolean; className?: string }) { - return isSelected ? : ; + return isSelected ? ( + + ) : ( + + ); } -export function PositionStats({ market, userPosition, positionLoading, cardStyle }: PositionStatsProps) { +export function PositionStats({ + market, + userPosition, + positionLoading, + cardStyle, +}: PositionStatsProps) { // Default to user view if they have a position, otherwise global const [viewMode, setViewMode] = useState<'global' | 'user'>(userPosition ? 'user' : 'global'); const toggleView = () => { - setViewMode(prev => prev === 'global' ? 'user' : 'global'); + setViewMode((prev) => (prev === 'global' ? 'user' : 'global')); }; const renderStats = () => { @@ -122,7 +131,7 @@ export function PositionStats({ market, userPosition, positionLoading, cardStyle formatBalance( BigInt(market.state.supplyAssets || 0), market.loanAsset.decimals, - ).toString() + ).toString(), )}{' '} {market.loanAsset.symbol} @@ -143,7 +152,7 @@ export function PositionStats({ market, userPosition, positionLoading, cardStyle formatBalance( BigInt(market.state.borrowAssets || 0), market.loanAsset.decimals, - ).toString() + ).toString(), )}{' '} {market.loanAsset.symbol} @@ -164,7 +173,7 @@ export function PositionStats({ market, userPosition, positionLoading, cardStyle formatBalance( BigInt(market.state.collateralAssets || 0), market.collateralAsset.decimals, - ).toString() + ).toString(), )}{' '} {market.collateralAsset.symbol} @@ -184,15 +193,13 @@ export function PositionStats({ market, userPosition, positionLoading, cardStyle color="primary" classNames={{ wrapper: 'mx-0', - thumbIcon: 'p-0 mr-0' + thumbIcon: 'p-0 mr-0', }} onChange={toggleView} thumbIcon={ThumbIcon} /> -
- {renderStats()} -
+
{renderStats()}
); -} \ No newline at end of file +} diff --git a/app/market/[chainId]/[marketid]/content.tsx b/app/market/[chainId]/[marketid]/content.tsx index 3751ee8d..d04c38f1 100644 --- a/app/market/[chainId]/[marketid]/content.tsx +++ b/app/market/[chainId]/[marketid]/content.tsx @@ -81,11 +81,12 @@ function MarketContent() { }); const { address } = useAccount(); - - const { - position: userPosition, - loading: positionLoading, - } = useUserPositions(address, network, marketid as string); + + const { position: userPosition, loading: positionLoading } = useUserPositions( + address, + network, + marketid as string, + ); // 6. All memoized values and callbacks const formattedOraclePrice = useMemo(() => { @@ -143,7 +144,7 @@ function MarketContent() { // 8. Derived values that depend on market data const cardStyle = 'bg-surface rounded shadow-sm p-4'; - + return ( <>
@@ -172,18 +173,18 @@ function MarketContent() { {showSupplyModal && ( - setShowSupplyModal(false)} + setShowSupplyModal(false)} position={userPosition} isMarketPage /> )} {showBorrowModal && ( - setShowBorrowModal(false)} + setShowBorrowModal(false)} oraclePrice={oraclePrice} /> )} @@ -196,18 +197,20 @@ function MarketContent() { Basic Info -
- {networkImg && ( - {network.toString()} - )} - {getNetworkName(network)} -
+ +
+ {networkImg && ( + {network.toString()} + )} + {getNetworkName(network)} +
+
diff --git a/app/markets/components/markets.tsx b/app/markets/components/markets.tsx index 27cf1436..d8e72a41 100644 --- a/app/markets/components/markets.tsx +++ b/app/markets/components/markets.tsx @@ -1,10 +1,10 @@ 'use client'; import { useCallback, useEffect, useState, useRef } from 'react'; import { useDisclosure } from '@nextui-org/react'; +import { ReloadIcon } from '@radix-ui/react-icons'; import { Chain } from '@rainbow-me/rainbowkit'; import storage from 'local-storage-fallback'; import { useRouter, useSearchParams } from 'next/navigation'; -import { FaSync } from 'react-icons/fa'; import { FiSettings } from 'react-icons/fi'; import { Button } from '@/components/common'; import Header from '@/components/layout/header/Header'; @@ -442,7 +442,7 @@ export default function Markets() { className="text-secondary" onClick={handleRefresh} > - + Refresh diff --git a/app/positions/components/PositionsSummaryTable.tsx b/app/positions/components/PositionsSummaryTable.tsx index 4afcd514..96ce0ef8 100644 --- a/app/positions/components/PositionsSummaryTable.tsx +++ b/app/positions/components/PositionsSummaryTable.tsx @@ -1,10 +1,11 @@ import React, { useMemo, useState, useEffect } from 'react'; import { Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, Tooltip } from '@nextui-org/react'; import { ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons'; +import { ReloadIcon } from '@radix-ui/react-icons'; import { motion, AnimatePresence } from 'framer-motion'; import Image from 'next/image'; import { BsQuestionCircle } from 'react-icons/bs'; -import { IoRefreshOutline, IoChevronDownOutline } from 'react-icons/io5'; +import { IoChevronDownOutline } from 'react-icons/io5'; import { PiHandCoins } from 'react-icons/pi'; import { PulseLoader } from 'react-spinners'; import { useAccount } from 'wagmi'; @@ -147,9 +148,10 @@ export function PositionsSummaryTable({ variant="light" size="sm" onClick={handleManualRefresh} + disabled={isRefetching} className="font-zen text-secondary opacity-80 transition-all duration-200 ease-in-out hover:opacity-100" > - + Refresh
diff --git a/app/positions/components/RebalanceModal.tsx b/app/positions/components/RebalanceModal.tsx index a61d9f28..d4f0c301 100644 --- a/app/positions/components/RebalanceModal.tsx +++ b/app/positions/components/RebalanceModal.tsx @@ -1,9 +1,10 @@ import React, { useState, useMemo, useCallback } from 'react'; import { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter } from '@nextui-org/react'; -import { GrRefresh } from 'react-icons/gr'; +import { ReloadIcon } from '@radix-ui/react-icons'; import { parseUnits, formatUnits } from 'viem'; import { Button } from '@/components/common'; import { Spinner } from '@/components/common/Spinner'; +import { useLocalStorage } from '@/hooks/useLocalStorage'; import { useMarketNetwork } from '@/hooks/useMarketNetwork'; import { useMarkets } from '@/hooks/useMarkets'; import { usePagination } from '@/hooks/usePagination'; @@ -39,6 +40,7 @@ export function RebalanceModal({ const [amount, setAmount] = useState('0'); const [showProcessModal, setShowProcessModal] = useState(false); const toast = useStyledToast(); + const [usePermit2Setting] = useLocalStorage('usePermit2', true); const { markets: allMarkets } = useMarkets(); const { @@ -46,9 +48,9 @@ export function RebalanceModal({ addRebalanceAction, removeRebalanceAction, executeRebalance, - isConfirming, + isProcessing, currentStep, - } = useRebalance(groupedPosition, refetch); + } = useRebalance(groupedPosition); const fromPagination = usePagination(); const toPagination = usePagination(); @@ -258,12 +260,16 @@ export function RebalanceModal({ setShowProcessModal(true); try { await executeRebalance(); + // Explicitly refetch AFTER successful execution + refetch(() => { + toast.info('Data refreshed', 'Position data updated after rebalance.'); + }); } catch (error) { console.error('Error during rebalance:', error); } finally { setShowProcessModal(false); } - }, [executeRebalance, needSwitchChain, switchToNetwork, toast]); + }, [executeRebalance, needSwitchChain, switchToNetwork, toast, refetch]); const handleManualRefresh = () => { refetch(() => { @@ -295,7 +301,7 @@ export function RebalanceModal({ onClick={handleManualRefresh} isDisabled={isRefetching} > - + Refresh @@ -372,8 +378,8 @@ export function RebalanceModal({