@@ -52,8 +100,8 @@ export function TransactionDetailsPage({ signature: raw }: Props) {
) : (
<>
-
-
+
+
>
)}
@@ -61,19 +109,14 @@ export function TransactionDetailsPage({ signature: raw }: Props) {
);
}
-function StatusCard({ signature }: Props) {
+function StatusCard({
+ signature,
+ autoRefresh,
+}: SignatureProps & AutoRefreshProps) {
const fetchStatus = useFetchTransactionStatus();
const status = useTransactionStatus(signature);
- const fetchDetails = useFetchTransactionDetails();
const details = useTransactionDetails(signature);
const { firstAvailableBlock, status: clusterStatus } = useCluster();
- const refresh = React.useCallback(
- (signature: string) => {
- fetchStatus(signature);
- fetchDetails(signature);
- },
- [fetchStatus, fetchDetails]
- );
// Fetch transaction on load
React.useEffect(() => {
@@ -82,7 +125,25 @@ function StatusCard({ signature }: Props) {
}
}, [signature, clusterStatus]); // eslint-disable-line react-hooks/exhaustive-deps
- if (!status || status.status === FetchStatus.Fetching) {
+ // Effect to set and clear interval for auto-refresh
+ React.useEffect(() => {
+ if (autoRefresh === AutoRefresh.Active) {
+ let intervalHandle: NodeJS.Timeout = setInterval(
+ () => fetchStatus(signature),
+ AUTO_REFRESH_INTERVAL
+ );
+
+ return () => {
+ clearInterval(intervalHandle);
+ };
+ }
+ }, [autoRefresh, fetchStatus, signature]);
+
+ if (
+ !status ||
+ (status.status === FetchStatus.Fetching &&
+ autoRefresh === AutoRefresh.Inactive)
+ ) {
return
;
} else if (status.status === FetchStatus.FetchFailed) {
return (
@@ -102,6 +163,7 @@ function StatusCard({ signature }: Props) {
}
const { info } = status.data;
+
const renderResult = () => {
let statusClass = "success";
let statusText = "Success";
@@ -134,13 +196,17 @@ function StatusCard({ signature }: Props) {
Overview
-
+ {autoRefresh === AutoRefresh.Active ? (
+
+ ) : (
+
+ )}
@@ -211,13 +277,16 @@ function StatusCard({ signature }: Props) {
);
}
-function AccountsCard({ signature }: Props) {
+function AccountsCard({
+ signature,
+ autoRefresh,
+}: SignatureProps & AutoRefreshProps) {
const { url } = useCluster();
const details = useTransactionDetails(signature);
- const fetchStatus = useFetchTransactionStatus();
const fetchDetails = useFetchTransactionDetails();
- const refreshStatus = () => fetchStatus(signature);
+ const fetchStatus = useFetchTransactionStatus();
const refreshDetails = () => fetchDetails(signature);
+ const refreshStatus = () => fetchStatus(signature);
const transaction = details?.data?.transaction?.transaction;
const message = transaction?.message;
const status = useTransactionStatus(signature);
@@ -231,14 +300,18 @@ function AccountsCard({ signature }: Props) {
if (!status?.data?.info) {
return null;
- } else if (!details) {
+ } else if (autoRefresh === AutoRefresh.BailedOut) {
return (
);
- } else if (details.status === FetchStatus.Fetching) {
+ } else if (autoRefresh === AutoRefresh.Active) {
+ return (
+
+ );
+ } else if (!details || details.status === FetchStatus.Fetching) {
return ;
} else if (details.status === FetchStatus.FetchFailed) {
return ;
@@ -317,7 +390,7 @@ function AccountsCard({ signature }: Props) {
);
}
-function InstructionsSection({ signature }: Props) {
+function InstructionsSection({ signature }: SignatureProps) {
const status = useTransactionStatus(signature);
const details = useTransactionDetails(signature);
const fetchDetails = useFetchTransactionDetails();
diff --git a/explorer/src/providers/transactions/index.tsx b/explorer/src/providers/transactions/index.tsx
index 7782e2772b..d4d66f3e94 100644
--- a/explorer/src/providers/transactions/index.tsx
+++ b/explorer/src/providers/transactions/index.tsx
@@ -131,7 +131,7 @@ export function useTransactions() {
}
export function useTransactionStatus(
- signature: TransactionSignature
+ signature: TransactionSignature | undefined
): Cache.CacheEntry | undefined {
const context = React.useContext(StateContext);
@@ -141,6 +141,10 @@ export function useTransactionStatus(
);
}
+ if (signature === undefined) {
+ return undefined;
+ }
+
return context.entries[signature];
}