import {
Box,
Button,
Container,
Grid,
GridItem,
HStack,
Icon,
Image,
Spinner,
Text,
Tooltip,
VStack,
keyframes,
useColorMode,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { MdContentCopy, MdOutlineErrorOutline } from "react-icons/md";
import Pagination from "../Pagination";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { Link, useLocation, useNavigate } from "react-router-dom";
import ToastBox from "../ToastBox";
import { formatRelativeDate, formatUTCToDDMMYYHHMMSS } from "../../Constants/Constants";
import {
useGetTransAllQuery,
useGetTransCountQuery,
} from "../../Services/api.service";
import rbtLogoOutline from "../../assets/images/rubix-filled.svg";
import rbtLogoDark from "../../assets/images/RBTLogo.svg";
import { HiOutlineRefresh } from "react-icons/hi";
import FullScreenLoaader from "../FullScreenLoaader/FullScreenLoaader";
// Define the keyframes
export const rotate = keyframes`
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
`;
const LatestTransactions = () => {
const toast = useToast();
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
window.scrollTo({ top: 0, behavior: "smooth" }); // Scroll to top smoothly when params change
}, [location]);
const { colorMode } = useColorMode();
const [isRotating, setIsRotating] = useState(false);
const [currentPage, setCurrentPage] = useState(1); // Tracks the current page
const [pageSize, setPageSize] = useState(10); // Number of items per page
const [totalItems, setTotalItems] = useState(null); // Total items in the dataset
const [lastRefreshedTime, setLastRefreshedTime] = useState(new Date()); // Store the last refresh time
const [relativeRefreshTime, setRelativeRefreshTime] = useState("Just now");
const {
data: transCount,
isLoading: isTransCountLoading,
refetch: transCountRefetch,
errors: transCountErrors,
} = useGetTransCountQuery();
// Fetch transactions based on the current page and page size
const {
data: transAll,
isLoading: isTransAllLoading,
refetch: transAllRefetch,
} = useGetTransAllQuery({
pageNumber: currentPage,
pageSize: pageSize,
});
// Set interval to refetch data every 30 seconds
// useEffect(() => {
// const intervalId = setInterval(() => {
// transCountRefetch(); // Refetch transaction count
// transAllRefetch(); // Refetch transactions
// }, 30000); // 30000 ms = 30 seconds
// return () => clearInterval(intervalId); // Clear interval on component unmount
// }, [transCountRefetch, transAllRefetch]);
useEffect(() => {
setTotalItems(transCount?.data?.transactionCount);
}, [transCount]);
// function copyToClipboard(text) {
// navigator.clipboard
// .writeText(text)
// .then(() => {
// toast({
// render: () => (
//
// ),
// });
// })
// .catch((err) => {
// console.error("Failed to copy text: ", err);
// });
// }
function copyToClipboard(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard
.writeText(text)
.then(() => {
toast({
render: () => (
),
});
})
.catch((err) => {
console.error("Failed to copy text: ", err);
});
} else {
// Fallback method for unsupported browsers
const textArea = document.createElement("textarea");
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand("copy");
toast({
render: () => (
),
});
} catch (err) {
console.error("Fallback: Failed to copy text: ", err);
}
document.body.removeChild(textArea);
}
}
const handleRefreshClick = () => {
setIsRotating(true); // Start rotation
transAllRefetch();
setTimeout(() => {
setIsRotating(false); // Stop rotation after 500ms
}, 500);
setLastRefreshedTime(new Date()); // Set the new refresh time
setRelativeRefreshTime("Just now"); // Reset relative time to "Just now"
};
useEffect(() => {
// Update relative time every minute
const intervalId = setInterval(() => {
updateRelativeTime();
}, 60000); // 60 seconds = 60000ms
return () => clearInterval(intervalId); // Cleanup the interval on unmount
}, [lastRefreshedTime]);
const updateRelativeTime = () => {
const now = new Date();
const timeDiff = Math.floor((now - lastRefreshedTime) / 60000); // Difference in minutes
if (timeDiff < 1) {
setRelativeRefreshTime("Just now");
} else if (timeDiff === 1) {
setRelativeRefreshTime("1 minute ago");
} else {
setRelativeRefreshTime(`${timeDiff} minutes ago`);
}
};
return (
isTransCountLoading? :
Sr. no
Transactions
Last refresh {relativeRefreshTime}
{transAll?.data?.items?.map(
(
{
transactionId,
smartContract,
sender,
receiver,
contract,
timestamp,
amount,
transactionType,
subNetworkId,
executor,
deployer,
creator,
pledgeAmount,
scTokenHash
},
index
) => (
{index + 1}.
{/* */}
navigate(`/transaction/${transactionId}`)}
>
{transactionId}
copyToClipboard(transactionId)}
/>
{sender&&
Sender:
navigate(`/did-info/${sender}`)}
>
{sender}
copyToClipboard(sender)} />
}
{receiver&&
Receiver:
navigate(`/did-info/${receiver}`)}
>
{receiver}
copyToClipboard(receiver)}
/>
}
{creator&&
Creator:
navigate(`/did-info/${creator}`)}
>
{creator}
copyToClipboard(creator)}
/>
}
{executor&&
Executor:
navigate(`/did-info/${executor}`)}
>
{executor}
copyToClipboard(executor)}
/>
}
{deployer&&
Deployer:
navigate(`/did-info/${deployer}`)}
>
{deployer}
copyToClipboard(deployer)}
/>
}
{scTokenHash && (
Smart contract ID :
{scTokenHash}
)}
Date and Time Stamp :
{formatUTCToDDMMYYHHMMSS(timestamp)}
{amount&&
Amount:
{amount}
}
{pledgeAmount&&
Pledge Amount:
{pledgeAmount}
}
{/* */}
Transaction type :
{transactionType}
{subNetworkId === "MainNet" ? "Main net" : "Subnet ID"}:
{subNetworkId === "MainNet" ?{subNetworkId}:
{subNetworkId}
}
{/* */}
)
)}
);
};
export default LatestTransactions;