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"; import Copyable from "./Copyable"; 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, dispatch, url) )}
Status Signature Confirmations Slot Number Details
{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, dispatch: any, url: string ) => { 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); } let slotText = "-"; if (transaction.slot !== undefined) { slotText = `${transaction.slot}`; } let confirmationsText = "-"; if (transaction.confirmations !== undefined) { confirmationsText = `${transaction.confirmations}`; } const renderDetails = () => { let onClick, icon; if (transaction.confirmations === "max") { icon = "more-horizontal"; onClick = () => dispatch({ type: ActionType.Select, signature: transaction.signature }); } else { icon = "refresh-cw"; onClick = () => { checkTransactionStatus(dispatch, transaction.signature, url); }; } return ( ); }; return ( {transaction.id} {statusText} {transaction.signature} {confirmationsText} {slotText} {renderDetails()} ); }; export default TransactionsCard;