import type { FullStatusData } from '@lifi/sdk'
import { Box, Typography } from '@mui/material'
import { useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { useLocation } from 'react-router-dom'
import { ContractComponent } from '../../components/ContractComponent/ContractComponent.js'
import { PageContainer } from '../../components/PageContainer.js'
import { getStepList } from '../../components/Step/StepList.js'
import { TransactionDetails } from '../../components/TransactionDetails.js'
import { internalExplorerUrl } from '../../config/constants.js'
import { useExplorer } from '../../hooks/useExplorer.js'
import { useHeader } from '../../hooks/useHeader.js'
import { useNavigateBack } from '../../hooks/useNavigateBack.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 { HiddenUI } from '../../types/widget.js'
import { buildRouteFromTxHistory } from '../../utils/converters.js'
import { navigationRoutes } from '../../utils/navigationRoutes.js'
import { ContactSupportButton } from './ContactSupportButton.js'
import { TransactionDetailsSkeleton } from './TransactionDetailsSkeleton.js'
import { TransferIdCard } from './TransferIdCard.js'
export const TransactionDetailsPage: React.FC = () => {
const { t, i18n } = useTranslation()
const { navigate } = useNavigateBack()
const {
subvariant,
subvariantOptions,
contractSecondaryComponent,
explorerUrls,
hiddenUI,
} = useWidgetConfig()
const { state }: any = useLocation()
const { tools } = useTools()
const { getTransactionLink } = useExplorer()
const storedRouteExecution = useRouteExecutionStore(
(store) => store.routes[state?.routeId]
)
const { transaction, isLoading } = useTransactionDetails(
!storedRouteExecution && state?.transactionHash
)
const title =
subvariant === 'custom'
? t(`header.${subvariantOptions?.custom ?? 'checkout'}Details`)
: t('header.transactionDetails')
useHeader(title)
const routeExecution = useMemo(() => {
if (storedRouteExecution) {
return storedRouteExecution
}
if (isLoading) {
return
}
if (transaction) {
const routeExecution = buildRouteFromTxHistory(
transaction as FullStatusData,
tools
)
return routeExecution
}
}, [isLoading, storedRouteExecution, tools, transaction])
useEffect(() => {
if (!isLoading && !routeExecution) {
navigate(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?.process[0].startedAt ?? 0) *
(storedRouteExecution ? 1 : 1000) // local and BE routes have different ms handling
)
return isLoading && !storedRouteExecution ? (
) : (
{startedAt.toLocaleString(i18n.language, {
dateStyle: 'long',
})}
{startedAt.toLocaleString(i18n.language, {
timeStyle: 'short',
})}
{getStepList(routeExecution?.route, subvariant)}
{subvariant === 'custom' && contractSecondaryComponent ? (
{contractSecondaryComponent}
) : null}
{routeExecution?.route ? (
) : null}
{!hiddenUI?.includes(HiddenUI.ContactSupport) ? (
) : null}
)
}