import ContentCopyIcon from '@mui/icons-material/ContentCopyRounded'; import { Box, IconButton, Typography } from '@mui/material'; import { useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useLocation } from 'react-router-dom'; import { Card, CardTitle } from '../../components/Card'; import { ContractComponent } from '../../components/ContractComponent'; import { Insurance } from '../../components/Insurance'; import { PageContainer } from '../../components/PageContainer'; import { getStepList } from '../../components/Step'; import { useNavigateBack, useTools, useTransactionDetails } from '../../hooks'; import { useWidgetConfig } from '../../providers'; import { getSourceTxHash, useRouteExecutionStore } from '../../stores'; import { formatTokenAmount, navigationRoutes } from '../../utils'; import { buildRouteFromTxHistory } from '../../utils/converters'; import { ContactSupportButton } from './ContactSupportButton'; import { TransactionDetailsSkeleton } from './TransactionDetailsSkeleton'; export const TransactionDetailsPage: React.FC = () => { const { t, i18n } = useTranslation(); const { navigate } = useNavigateBack(); const { subvariant, contractComponent, contractSecondaryComponent } = useWidgetConfig(); const { state }: any = useLocation(); const { tools } = useTools(); const storedRouteExecution = useRouteExecutionStore( (store) => store.routes[state?.routeId], ); const { transaction, isLoading } = useTransactionDetails( state?.transactionHash, ); const routeExecution = useMemo(() => { if (storedRouteExecution) { return storedRouteExecution; } if (isLoading) { return; } if (transaction) { const routeExecution = buildRouteFromTxHistory(transaction, tools); return routeExecution; } }, [isLoading, storedRouteExecution, tools, transaction]); useEffect(() => { if (!isLoading && !routeExecution) { navigate(navigationRoutes.home); } }, [isLoading, navigate, routeExecution]); const copySupportId = async () => { await navigator.clipboard.writeText(supportId); }; const sourceTxHash = getSourceTxHash(routeExecution?.route); const insuranceCoverageId = sourceTxHash ?? routeExecution?.route.fromAddress; let supportId = sourceTxHash ?? routeExecution?.route.id ?? ''; 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 ? ( ) : ( {new Intl.DateTimeFormat(i18n.language, { dateStyle: 'long', }).format(startedAt)} {new Intl.DateTimeFormat(i18n.language, { timeStyle: 'short', }).format(startedAt)} {getStepList(routeExecution?.route, subvariant)} {subvariant === 'nft' ? ( {contractSecondaryComponent || contractComponent} ) : null} {routeExecution?.route?.insurance?.state === 'INSURED' ? ( ) : null} {t('main.supportId')} {supportId} ); };