From b055c16bdf8e12fc3a00f268256d40629663e9ee Mon Sep 17 00:00:00 2001 From: Schrammel Date: Fri, 5 May 2023 16:41:49 -0300 Subject: [PATCH] fix(orders): cancel previous --- .../components/positions/UserPositions.tsx | 89 ++++++++++++++++--- 1 file changed, 79 insertions(+), 10 deletions(-) diff --git a/frontend/app/[asset]/components/positions/UserPositions.tsx b/frontend/app/[asset]/components/positions/UserPositions.tsx index 272f478..edf0fdd 100644 --- a/frontend/app/[asset]/components/positions/UserPositions.tsx +++ b/frontend/app/[asset]/components/positions/UserPositions.tsx @@ -3,8 +3,9 @@ import { DefaultToastTransactionMeta } from '@pcnv/txs-react/dist/toasts/ToastsV import { Spinner } from '@tradex/icons' import { Modal, Skeleton, cx } from '@tradex/interface' import { useTranslation } from '@tradex/languages' +import { optimism, optimismGoerli } from '@wagmi/core/chains' import { TRACKING_CODE, calculatePriceImpact } from 'app/[asset]/constants/perps-config' -import { useRouteMarket } from 'app/[asset]/lib/market/useMarket' +import { useMarketSettings, useRouteMarket } from 'app/[asset]/lib/market/useMarket' import { useMarketPrice } from 'app/[asset]/lib/price/price' import { MarketKey } from 'app/[asset]/lib/price/pyth' import { useIsHydrated } from 'app/providers/IsHydratedProvider' @@ -21,7 +22,7 @@ import { parsePositionDetails } from 'perps-hooks/parsers' import React, { useEffect, useMemo, useState } from 'react' import { useInterval } from 'usehooks-ts' import { toBigNumber } from 'utils/toBigNumber' -import { deepEqual, useAccount } from 'wagmi' +import { deepEqual, useAccount, useNetwork, useSwitchNetwork } from 'wagmi' type Position = { id: bigint @@ -89,6 +90,7 @@ export function UserPositions() { const isHydrated = useIsHydrated() const marketDataPosition = useMarketDataPositionDetails({ + chainId: optimism.id, args: market && address && [market.address, address], select: parsePositionDetails, enabled: !!market && !!address, @@ -130,10 +132,12 @@ export function UserPositions() { if (!hasPosition) { return ( -
- - {t('you have no positions yet')} - +
+ + + {t('you have no positions yet')} + +
) } @@ -174,10 +178,53 @@ export function UserPositions() {
) } + +const CancelPrevius = ({ market, children }) => { + const account = useAccount() + const [pending, setPending] = useState(false) + const prepareCancel = usePrepareMarketCancelOffchainDelayedOrder({ + address: market?.address, + chainId: optimism.id, + args: account.address && [account.address], + enabled: !!account.address, + }) + + const cancel = useMarketCancelOffchainDelayedOrder({ + ...prepareCancel.config, + onSuccess: () => { + prepareCancel.refetch() + setPending(false) + }, + }) + + if (prepareCancel.isLoading) { + return + } + if (prepareCancel.isError) { + return children + } + + return ( +
+ Review your operation + Previous order failed + +
+ ) +} function SideNAsset(side: string, asset: string) { return ( - {side}{' '} + {side} {asset} ) @@ -206,6 +253,7 @@ const ConfirmClosePosition = ({ ) const prepareClose = usePrepareMarketSubmitOffchainDelayedOrderWithTracking({ address: market?.address, + chainId: optimism.id, args: [closePositionsizeDelta, priceImpact, TRACKING_CODE], }) const closePosition = useMarketSubmitOffchainDelayedOrderWithTracking({ @@ -233,11 +281,28 @@ const ConfirmClosePosition = ({ const cancel = useMarketCancelOffchainDelayedOrder({ ...prepareCancel.config, }) + const network = useNetwork() + + const { switchNetwork } = useSwitchNetwork() + if (network.chain?.id !== optimism.id && network.chain?.id !== optimismGoerli.id) + return ( +
+ Review your operation + Previous order failed + +
+ ) + if (reason === 'previous order exists') { return (
Review your operation - Previous order failed, cancel it + Previous order failed {prepareCancel.isSuccess && (