import type { FullStatusData } from '@lifi/sdk'
import { useLocation, useNavigate } from '@tanstack/react-router'
import { useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { ContractComponent } from '../../components/ContractComponent/ContractComponent.js'
import { PageContainer } from '../../components/PageContainer.js'
import { TransactionCard } from '../../components/TransactionCard/TransactionCard.js'
import { internalExplorerUrl } from '../../config/constants.js'
import { useExplorer } from '../../hooks/useExplorer.js'
import { useHeader } from '../../hooks/useHeader.js'
import { useTools } from '../../hooks/useTools.js'
import { useTransactionDetails } from '../../hooks/useTransactionDetails.js'
import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
import { useRouteExecutionStore } from '../../stores/routes/RouteExecutionStore.js'
import { getSourceTxHash } from '../../stores/routes/utils.js'
import { buildRouteFromTxHistory } from '../../utils/converters.js'
import { navigationRoutes } from '../../utils/navigationRoutes.js'
import { ReceiptsCard } from './ReceiptsCard.js'
import { TransactionDetailsSkeleton } from './TransactionDetailsSkeleton.js'
import { TransferIdCard } from './TransferIdCard.js'
export const TransactionDetailsPage: React.FC = () => {
const { t } = useTranslation()
const navigate = useNavigate()
const { mode, modeOptions, contractSecondaryComponent, explorerUrls } =
useWidgetConfig()
const { search }: any = useLocation()
const { tools } = useTools()
const { getTransactionLink } = useExplorer()
const storedRouteExecution = useRouteExecutionStore((store) =>
search?.routeId ? store.routes[search.routeId] : undefined
)
const { transaction, isLoading } = useTransactionDetails(
!storedRouteExecution && search?.transactionHash
)
const title =
mode === 'custom'
? t(`header.${modeOptions?.custom?.type ?? 'checkout'}Details`)
: t('header.transactionDetails')
useHeader(title)
const routeExecution = useMemo(() => {
if (storedRouteExecution) {
return storedRouteExecution
}
if (isLoading) {
return
}
if (transaction) {
return buildRouteFromTxHistory(transaction as FullStatusData, tools)
}
}, [isLoading, storedRouteExecution, tools, transaction])
useEffect(() => {
if (!isLoading && !routeExecution) {
navigate({ to: navigationRoutes.home })
}
}, [isLoading, navigate, routeExecution])
const explorerUrl = explorerUrls?.internal?.[0]
const url = typeof explorerUrl === 'string' ? explorerUrl : explorerUrl?.url
const sourceTxHash = getSourceTxHash(routeExecution?.route)
let supportId = sourceTxHash ?? routeExecution?.route.id ?? ''
const internalTxLink =
routeExecution?.route?.steps?.at(-1)?.execution?.internalTxLink
const externalTxLink =
routeExecution?.route?.steps?.at(-1)?.execution?.externalTxLink
const txLink =
(url
? internalTxLink?.replace(internalExplorerUrl, url)
: internalTxLink) ||
externalTxLink ||
getTransactionLink({ txHash: supportId })
if (process.env.NODE_ENV === 'development') {
supportId += `_${routeExecution?.route.id}`
}
const startedAt = new Date(
routeExecution?.route.steps[0].execution?.startedAt ?? 0
)
if (isLoading && !storedRouteExecution) {
return
}
if (!routeExecution?.route) {
return null
}
return (
{mode === 'custom' && contractSecondaryComponent ? (
{contractSecondaryComponent}
) : null}
{supportId ? (
) : null}
)
}