UX.SOL

Component

Transaction Lifecycle

Shows wallet approval, submission, processing, confirmation, failure, and timeout states backed by an actual transaction signature and Solana RPC.

Preview

Sends a real 1-lamport devnet self-transfer. The wallet pays only the network fee.

Transaction progress

Status updates come from your wallet and Solana RPC.

Ready
  1. Wallet approval

    Review and approve the request in your wallet.

  2. Submitted

    The signed transaction has a network signature.

  3. Processing

    The cluster has observed the transaction.

  4. Confirmation

    The requested commitment has been reached.

Ready

No wallet request or transaction signature yet.

Installation

terminal
$npx shadcn@latest add https://uxdotsol.xyz/r/transaction-lifecycle.json

Usage

transaction-lifecycle.tsx
"use client";
 
import { useState } from "react";
import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import { SystemProgram, Transaction } from "@solana/web3.js";
import { TransactionLifecycle } from "@/components/uxdotsol/components/transaction-lifecycle";
 
export function SelfTransferProgress() {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();
const [signature, setSignature] = useState<string | null>(null);
const [submissionState, setSubmissionState] = useState<
"idle" | "awaiting-wallet" | "failed"
>("idle");
const [error, setError] = useState<Error | null>(null);
 
async function submit() {
if (!publicKey) return;
setSubmissionState("awaiting-wallet");
setError(null);
 
try {
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: publicKey,
lamports: 1,
}),
);
setSignature(await sendTransaction(transaction, connection));
setSubmissionState("idle");
} catch (cause) {
setError(cause instanceof Error ? cause : new Error(String(cause)));
setSubmissionState("failed");
}
}
 
return (
<TransactionLifecycle
client={connection}
signature={signature}
submissionState={submissionState}
submissionError={error}
cluster="devnet"
onRetry={() => void submit()}
/>
);
}

Props / Arguments

NameTypeDefaultDescription
signature / clientstring | null / TransactionStatusClient | nullundefined / undefinedReal transaction signature and Solana RPC client used after submission.
submissionState / submissionErrorTransactionSubmissionState / Error | string | null'idle' / undefinedParent-controlled wallet and broadcast state before a signature exists.
commitment / pollIntervalMs / timeoutMs / subscribeCommitment / number / number / boolean'confirmed' / 2000 / 90000 / trueRPC tracking policy forwarded to useTransactionStatus.
cluster / explorer / explorerUrlstring'mainnet-beta' / 'solscan' / undefinedCluster and explorer link configuration.
onRetry / onReset() => void / () => voidundefined / undefinedRetries pre-signature submission or resets the parent flow. Signature retries only recheck RPC status.
onStatusChange(value: TransactionLifecycleValue) => voidundefinedReports meaningful lifecycle transitions to parent orchestration or analytics.
title / description / retryLabel / resetLabelstringtransaction guidanceCustomizable accessible labels and lifecycle guidance.
showReset / classNameboolean / stringtrue / ''Controls the terminal reset action and outer classes.

Types

NameTypeDefaultDescription
TransactionLifecycleStatesubmission and RPC status union-Complete state vocabulary from wallet approval through finalization or failure.
TransactionLifecycleValueTransactionStatusValue with lifecycle status-Normalized callback payload including signature, confirmation, error, and terminal flags.