import React, { useMemo } from "react"; import { Box, HStack, Text, VStack, Spinner } from "native-base"; import BasicStyledModal from "../../../core/web3/modals/BasicStyledModal"; import { ExplorerLink } from "../../../core"; import { truncateMiddle } from "../../../utils/string"; import type { BridgeTransaction } from "./types"; import { capitalizeChain } from "./utils"; interface MPBTransactionDetailsModalProps { open: boolean; onClose: () => void; transaction: BridgeTransaction; transactionHistory?: BridgeTransaction[]; } const iconBoxStyles = { w: "8", h: "8", borderRadius: "50%", alignItems: "center", justifyContent: "center", borderWidth: "2px", shadow: "md" }; const textColorMap = { completed: "gray.900", bridging: "blue.500", pending: "gray.400", failed: "red.500" }; const iconConfigMap = { completed: { bg: "blue.500", borderColor: "blue.300", content: "✓", spinner: false }, bridging: { bg: "blue.500", borderColor: "blue.300", content: null, spinner: true }, pending: { bg: "gray.200", borderColor: "gray.300", content: "○", spinner: false }, failed: { bg: "red.500", borderColor: "red.300", content: "✕", spinner: false }, default: { bg: "gray.200", borderColor: "gray.300", content: "○", spinner: false } }; type StepStatus = "completed" | "pending" | "bridging" | "failed"; const PROGRESS_BY_STATUS: Record = { completed: { sourceGateway: "completed", destGateway: "completed", executed: "completed" }, pending: { sourceGateway: "completed", destGateway: "bridging", executed: "pending" }, bridging: { sourceGateway: "completed", destGateway: "bridging", executed: "pending" }, failed: { sourceGateway: "completed", destGateway: "failed", executed: "failed" } }; const DEFAULT_PROGRESS: { sourceGateway: StepStatus; destGateway: StepStatus; executed: StepStatus } = { sourceGateway: "pending", destGateway: "pending", executed: "pending" }; const StepIndicator = ({ status, text, isLast = false }: { status: StepStatus; text: string; isLast?: boolean }) => { const config = iconConfigMap[status] || iconConfigMap.default; const getIcon = () => ( {config.spinner ? ( ) : ( {config.content} )} ); return ( {getIcon()} {text} {!isLast && ( )} ); }; const MPBTransactionDetailsContent = ({ transaction, transactionHistory }: { transaction: BridgeTransaction; transactionHistory?: BridgeTransaction[]; }) => { const { amount, bridgeProvider, date, transactionHash, sourceChain, targetChain } = transaction; const sourceChainLabel = capitalizeChain(sourceChain || "source"); const targetChainLabel = capitalizeChain(targetChain || "destination"); const historyTx = useMemo(() => { return transactionHistory?.find(tx => tx.transactionHash === transactionHash || tx.id === transactionHash); }, [transactionHistory, transactionHash]); const status = historyTx?.status || transaction.status; const txDate = date ? new Date(date).toLocaleDateString() + " " + new Date(date).toLocaleTimeString() : "Unknown"; const progress = PROGRESS_BY_STATUS[status] ?? DEFAULT_PROGRESS; return ( Bridged via {bridgeProvider?.toUpperCase()} +{amount} G$ {txDate} Progress Source Transaction ); }; export const MPBTransactionDetailsModal = ({ open, onClose, transaction, transactionHistory }: MPBTransactionDetailsModalProps) => { return ( } withOverlay="dark" withCloseButton /> ); };