import React from "react"; import { useTransactions, useTransactionsDispatch, checkTransactionStatus, ActionType, Transaction, Status } from "../providers/transactions"; import bs58 from "bs58"; import { assertUnreachable } from "../utils"; import { useCluster } from "../providers/cluster"; function TransactionsCard() { const { transactions, idCounter } = useTransactions(); const dispatch = useTransactionsDispatch(); const signatureInput = React.useRef(null); const [error, setError] = React.useState(""); const { url } = useCluster(); const onNew = (signature: string) => { if (signature.length === 0) return; try { const length = bs58.decode(signature).length; if (length > 64) { setError("Signature is too long"); return; } else if (length < 64) { setError("Signature is too short"); return; } } catch (err) { setError(`${err}`); return; } dispatch({ type: ActionType.InputSignature, signature }); checkTransactionStatus(dispatch, signature, url); const inputEl = signatureInput.current; if (inputEl) { inputEl.value = ""; } }; return (
{renderHeader()}
{transactions.map(transaction => renderTransactionRow(transaction))}
Status Signature Confirmations Slot Number
{idCounter + 1} New setError("")} onKeyDown={e => e.keyCode === 13 && onNew(e.currentTarget.value) } onSubmit={e => onNew(e.currentTarget.value)} ref={signatureInput} className={`form-control text-signature text-monospace ${ error ? "is-invalid" : "" }`} placeholder="input transaction signature" /> {error ?
{error}
: null}
- -
); } const renderHeader = () => { return (

Look Up Transaction(s)

); }; const renderTransactionRow = (transaction: Transaction) => { let statusText; let statusClass; switch (transaction.status) { case Status.CheckFailed: statusClass = "dark"; statusText = "Cluster Error"; break; case Status.Checking: statusClass = "info"; statusText = "Checking"; break; case Status.Success: statusClass = "success"; statusText = "Success"; break; case Status.Failure: statusClass = "danger"; statusText = "Failed"; break; case Status.Missing: statusClass = "warning"; statusText = "Not Found"; break; default: return assertUnreachable(transaction.status); } const slotText = `${transaction.slot || "-"}`; const confirmationsText = `${transaction.confirmations || "-"}`; return ( {transaction.id} {statusText} {transaction.signature} {confirmationsText} {slotText} ); }; export default TransactionsCard;