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}. {/* */} copyToClipboard(transactionId)} /> {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;