import React, { useState, useEffect, useCallback } from 'react'; import { motion } from 'framer-motion'; import { HiCheckCircle, HiExclamationTriangle, HiArrowTopRightOnSquare, } from 'react-icons/hi2'; import { Button } from '../../../ui/Button'; import Typography from '../../../ui/Typography'; import { CopyField } from '../../../ui/CopyField'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '../../../ui/dialog'; import { useInscriptionState, useResetInscriptionState, } from '../../../../stores/blockTesterStore'; interface LoadingStateProps { message: string; } /** * Loading state component for inscription process */ const LoadingState: React.FC = ({ message }) => (
{message} This may take a few moments...
); interface SuccessStateProps { inscriptionResult: { topicId: string; hashLink: string; transactionId?: string; } | null; onOpenExplorer: () => void; } /** * Success state component for successful inscription */ const SuccessState: React.FC = ({ inscriptionResult, onOpenExplorer, }) => (
{inscriptionResult && (
{inscriptionResult.transactionId && ( )}
)}
); interface ErrorStateProps { errorMessage: string; } /** * Error state component for inscription failures */ const ErrorState: React.FC = ({ errorMessage }) => (
Inscription Failed
{errorMessage}
); /** * Modal for displaying inscription status and results */ const InscriptionStatusModal: React.FC = () => { const { inscriptionStatus, inscriptionResult, inscriptionError } = useInscriptionState(); const resetInscriptionState = useResetInscriptionState(); const [isOpen, setIsOpen] = useState(false); useEffect(() => { if ( inscriptionStatus === 'validating' || inscriptionStatus === 'submitting' ) { setIsOpen(true); } else if (inscriptionStatus === 'success' && inscriptionResult) { setIsOpen(true); } else if ( inscriptionStatus === 'error' && inscriptionError && inscriptionError.trim() ) { setIsOpen(true); } }, [inscriptionStatus, inscriptionError, inscriptionResult]); const handleClose = useCallback(() => { setIsOpen(false); setTimeout(() => { resetInscriptionState(); }, 150); }, [resetInscriptionState]); const handleOpenHashExplorer = useCallback(() => { if (inscriptionResult?.topicId) { const explorerUrl = `https://hashscan.io/testnet/topic/${inscriptionResult.topicId}`; window.open(explorerUrl, '_blank'); } }, [inscriptionResult]); const isProcessing = inscriptionStatus === 'validating' || inscriptionStatus === 'submitting'; const isSuccess = inscriptionStatus === 'success'; return ( {isSuccess ? 'Inscription Complete' : isProcessing ? 'Inscribing Block' : 'Inscription Failed'} {!isSuccess && ( {isProcessing ? 'Please wait while your block is being inscribed' : 'An error occurred during inscription'} )}
{inscriptionStatus === 'validating' && ( )} {inscriptionStatus === 'submitting' && ( )} {inscriptionStatus === 'success' && ( )} {inscriptionStatus === 'error' && ( )}
{!isProcessing && ( )}
); }; export default InscriptionStatusModal;