Skip to content
This repository was archived by the owner on Apr 4, 2022. It is now read-only.

[Explorer] Custom hook for getting explorer data for BlockExplorerLink component when it is not a gpv2 tx #930

Merged
merged 16 commits into from
Mar 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import RedirectToSearch from 'components/RedirectToSearch'
import Spinner from 'components/common/Spinner'
import { RedirectToNetwork, useNetworkId } from 'state/network'
import { Order } from 'api/operator'
import { useTxOrderExplorerLink } from 'hooks/useGetOrders'
import { TransactionsTableWithData } from 'apps/explorer/components/TransactionsTableWidget/TransactionsTableWithData'
import { TabItemInterface } from 'components/common/Tabs/Tabs'
import ExplorerTabs from '../common/ExplorerTabs/ExplorerTab'
Expand Down Expand Up @@ -43,6 +44,9 @@ export const TransactionsTableWidget: React.FC<Props> = ({ txHash }) => {
const networkId = useNetworkId() || undefined
const [redirectTo, setRedirectTo] = useState(false)
const txHashParams = { networkId, txHash }
const isZeroOrders = !!(orders && orders.length === 0)
const notGpv2ExplorerData = useTxOrderExplorerLink(txHash, isZeroOrders)

// Avoid redirecting until another network is searched again
useEffect(() => {
if (orders?.length || isTxLoading) return
Expand All @@ -58,7 +62,7 @@ export const TransactionsTableWidget: React.FC<Props> = ({ txHash }) => {
return <RedirectToNetwork networkId={errorTxPresentInNetworkId} />
}
if (redirectTo) {
return <RedirectToSearch from="tx" />
return <RedirectToSearch data={notGpv2ExplorerData} from="tx" />
}

if (!orders?.length) {
Expand Down
5 changes: 3 additions & 2 deletions src/components/RedirectToSearch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import { Redirect } from 'react-router-dom'

interface RedirectToSearchParams {
from: string
data?: unknown
}

const RedirectToSearch: React.FC<RedirectToSearchParams> = ({ from }) => {
const RedirectToSearch: React.FC<RedirectToSearchParams> = ({ from, data }) => {
const prefix = usePathPrefix() || ''
const prefixPath = prefix ? `/${prefix}` : ''
const suffix = usePathSuffix() || ''
Expand All @@ -15,7 +16,7 @@ const RedirectToSearch: React.FC<RedirectToSearchParams> = ({ from }) => {
const newPath =
pathMatchArray && pathMatchArray.length > 0 ? `${prefixPath}/search${pathMatchArray[1]}` : `${prefixPath}${suffix}`

return <Redirect push={false} to={{ pathname: newPath, state: { referrer: from } }} />
return <Redirect push={false} to={{ pathname: newPath, state: { referrer: from, data } }} />
}

export default RedirectToSearch
18 changes: 16 additions & 2 deletions src/components/orders/OrderNotFound/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import styled from 'styled-components'
import { Search } from 'apps/explorer/components/common/Search'
import SupportIcon from 'assets/img/support.png'
import { MEDIA } from 'const'
import { BlockExplorerLink } from 'components/common/BlockExplorerLink'

const Title = styled.h1`
margin: 0.55rem 0 2.5rem;
Expand Down Expand Up @@ -34,6 +35,13 @@ const SearchSection = styled.div`
background-color: ${({ theme }): string => theme.bg2};
`

const LinkData = styled.p`
font-size: 1.6rem;
@media ${MEDIA.mobile} {
line-height: 1.5;
}
`

const SearchContent = styled.div`
display: flex;
flex-flow: row;
Expand Down Expand Up @@ -72,14 +80,15 @@ const Support = styled.a`
`
interface LocationState {
referrer: string
data: unknown
}
export const OrderAddressNotFound: React.FC = (): JSX.Element => {
const { searchString } = useParams<{ searchString: string }>()
const location = useLocation<LocationState>()
const history = useHistory()
const { referrer } = location.state || { referrer: null }
const { referrer, data } = location.state || { referrer: null, data: null }
const wasRedirected = referrer ? true : false

const showLinkData = referrer === 'tx' && data
// used after refresh by remove referrer state if was redirected
useEffect(() => {
window.addEventListener('beforeunload', () => {
Expand Down Expand Up @@ -118,6 +127,11 @@ export const OrderAddressNotFound: React.FC = (): JSX.Element => {
</SearchContent>
</SearchSection>
</Content>
{showLinkData && (
<LinkData>
This is not a CowProtocol transaction. See it on <BlockExplorerLink {...(data as never)} />
</LinkData>
)}
</>
)
}
38 changes: 37 additions & 1 deletion src/hooks/useGetOrders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ import { useState, useEffect, useCallback } from 'react'

import { Network } from 'types'
import { useMultipleErc20 } from 'hooks/useErc20'
import { updateWeb3Provider } from 'api/web3'
import { web3 } from 'apps/explorer/api'
import { getAccountOrders, getTxOrders, Order } from 'api/operator'
import { GetTxOrdersParams, RawOrder } from 'api/operator/types'
import { useNetworkId } from 'state/network'
import { transformOrder } from 'utils'
import { ORDERS_QUERY_INTERVAL } from 'apps/explorer/const'
import { ORDERS_QUERY_INTERVAL, NETWORK_ID_SEARCH_LIST } from 'apps/explorer/const'
import { Props as ExplorerLinkProps } from 'components/common/BlockExplorerLink'
import {
GetOrderResult,
MultipleOrders,
Expand Down Expand Up @@ -149,6 +152,39 @@ export function useGetTxOrders(txHash: string): GetTxOrdersResult {
return { orders, error, isLoading: isLoading || areErc20Loading, errorTxPresentInNetworkId }
}

export function useTxOrderExplorerLink(
txHash: string,
isZeroOrders: boolean,
): ExplorerLinkProps | Record<string, unknown> | undefined {
const networkId = useNetworkId() || undefined
const [explorerLink, setExplorerLink] = useState<ExplorerLinkProps | Record<string, unknown> | undefined>()

useEffect(() => {
if (!networkId || !isZeroOrders) return

for (const network of NETWORK_ID_SEARCH_LIST) {
//update provider to find tx in network
updateWeb3Provider(web3, network)
web3.eth.getTransaction(txHash).then((tx) => {
if (tx) {
setExplorerLink({
type: 'tx',
networkId: network,
identifier: txHash,
showLogo: true,
label: network === Network.xDAI ? 'Blockscout' : 'Etherscan',
})
}
})
if (explorerLink) break
}
// reset provider
updateWeb3Provider(web3, networkId)
}, [explorerLink, isZeroOrders, networkId, txHash])

return explorerLink
}

export function useGetAccountOrders(
ownerAddress: string,
limit = 1000,
Expand Down